2
0

ssl.c 1.3 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435384363843738438384393844038441384423844338444384453844638447384483844938450384513845238453384543845538456384573845838459384603846138462384633846438465384663846738468384693847038471384723847338474384753847638477384783847938480384813848238483384843848538486384873848838489384903849138492384933849438495384963849738498384993850038501385023850338504385053850638507385083850938510385113851238513385143851538516385173851838519385203852138522385233852438525385263852738528385293853038531385323853338534385353853638537385383853938540385413854238543385443854538546385473854838549385503855138552385533855438555385563855738558385593856038561385623856338564385653856638567385683856938570385713857238573385743857538576385773857838579385803858138582385833858438585385863858738588385893859038591385923859338594385953859638597385983859938600386013860238603386043860538606386073860838609386103861138612386133861438615386163861738618386193862038621386223862338624386253862638627386283862938630386313863238633386343863538636386373863838639386403864138642386433864438645386463864738648386493865038651386523865338654386553865638657386583865938660386613866238663386643866538666386673866838669386703867138672386733867438675386763867738678386793868038681386823868338684386853868638687386883868938690386913869238693386943869538696386973869838699387003870138702387033870438705387063870738708387093871038711387123871338714387153871638717387183871938720387213872238723387243872538726387273872838729387303873138732387333873438735387363873738738387393874038741387423874338744387453874638747387483874938750387513875238753387543875538756387573875838759387603876138762387633876438765387663876738768387693877038771387723877338774387753877638777387783877938780387813878238783387843878538786387873878838789387903879138792387933879438795387963879738798387993880038801388023880338804388053880638807388083880938810388113881238813388143881538816388173881838819388203882138822388233882438825388263882738828388293883038831388323883338834388353883638837388383883938840388413884238843388443884538846388473884838849388503885138852388533885438855388563885738858388593886038861388623886338864388653886638867388683886938870388713887238873388743887538876388773887838879388803888138882388833888438885388863888738888388893889038891388923889338894388953889638897388983889938900389013890238903389043890538906389073890838909389103891138912389133891438915389163891738918389193892038921389223892338924389253892638927389283892938930389313893238933389343893538936389373893838939389403894138942389433894438945389463894738948389493895038951389523895338954389553895638957389583895938960389613896238963389643896538966389673896838969389703897138972389733897438975389763897738978389793898038981389823898338984389853898638987389883898938990389913899238993389943899538996389973899838999390003900139002390033900439005390063900739008390093901039011390123901339014390153901639017390183901939020390213902239023390243902539026390273902839029390303903139032390333903439035390363903739038390393904039041390423904339044390453904639047390483904939050390513905239053390543905539056390573905839059390603906139062390633906439065390663906739068390693907039071390723907339074390753907639077390783907939080390813908239083390843908539086390873908839089390903909139092390933909439095390963909739098390993910039101391023910339104391053910639107391083910939110391113911239113391143911539116391173911839119391203912139122391233912439125391263912739128391293913039131391323913339134391353913639137391383913939140391413914239143391443914539146391473914839149391503915139152391533915439155391563915739158391593916039161391623916339164391653916639167391683916939170391713917239173391743917539176391773917839179391803918139182391833918439185391863918739188391893919039191391923919339194391953919639197391983919939200392013920239203392043920539206392073920839209392103921139212392133921439215392163921739218392193922039221392223922339224392253922639227392283922939230392313923239233392343923539236392373923839239392403924139242392433924439245392463924739248392493925039251392523925339254392553925639257392583925939260392613926239263392643926539266392673926839269392703927139272392733927439275392763927739278392793928039281392823928339284392853928639287392883928939290392913929239293392943929539296392973929839299393003930139302393033930439305393063930739308393093931039311393123931339314393153931639317393183931939320393213932239323393243932539326393273932839329393303933139332393333933439335393363933739338393393934039341393423934339344393453934639347393483934939350393513935239353393543935539356393573935839359393603936139362393633936439365393663936739368393693937039371393723937339374393753937639377393783937939380393813938239383393843938539386393873938839389393903939139392393933939439395393963939739398393993940039401394023940339404394053940639407394083940939410394113941239413394143941539416394173941839419394203942139422394233942439425394263942739428394293943039431394323943339434394353943639437394383943939440394413944239443394443944539446394473944839449394503945139452394533945439455394563945739458394593946039461394623946339464394653946639467394683946939470394713947239473394743947539476394773947839479394803948139482394833948439485394863948739488394893949039491394923949339494394953949639497394983949939500395013950239503395043950539506395073950839509395103951139512395133951439515395163951739518395193952039521395223952339524395253952639527395283952939530395313953239533395343953539536395373953839539395403954139542395433954439545395463954739548395493955039551395523955339554395553955639557395583955939560395613956239563395643956539566395673956839569395703957139572395733957439575395763957739578395793958039581395823958339584395853958639587395883958939590395913959239593395943959539596395973959839599396003960139602396033960439605396063960739608396093961039611396123961339614396153961639617396183961939620396213962239623396243962539626396273962839629396303963139632396333963439635396363963739638396393964039641396423964339644396453964639647396483964939650396513965239653396543965539656396573965839659396603966139662396633966439665396663966739668396693967039671396723967339674396753967639677396783967939680396813968239683396843968539686396873968839689396903969139692396933969439695396963969739698396993970039701397023970339704397053970639707397083970939710397113971239713397143971539716397173971839719397203972139722397233972439725397263972739728397293973039731397323973339734397353973639737397383973939740397413974239743397443974539746397473974839749397503975139752397533975439755397563975739758397593976039761397623976339764397653976639767397683976939770397713977239773397743977539776397773977839779397803978139782397833978439785397863978739788397893979039791397923979339794397953979639797397983979939800398013980239803398043980539806398073980839809398103981139812398133981439815398163981739818398193982039821398223982339824398253982639827398283982939830398313983239833398343983539836398373983839839398403984139842398433984439845398463984739848398493985039851398523985339854398553985639857398583985939860398613986239863398643986539866398673986839869398703987139872398733987439875398763987739878398793988039881398823988339884398853988639887398883988939890398913989239893398943989539896398973989839899399003990139902399033990439905399063990739908399093991039911399123991339914399153991639917399183991939920399213992239923399243992539926399273992839929399303993139932399333993439935399363993739938399393994039941399423994339944399453994639947399483994939950399513995239953399543995539956399573995839959399603996139962399633996439965399663996739968399693997039971399723997339974399753997639977399783997939980399813998239983399843998539986399873998839989399903999139992399933999439995399963999739998399994000040001400024000340004400054000640007400084000940010400114001240013400144001540016400174001840019400204002140022400234002440025400264002740028400294003040031400324003340034400354003640037400384003940040400414004240043400444004540046400474004840049400504005140052400534005440055400564005740058400594006040061400624006340064400654006640067400684006940070400714007240073400744007540076400774007840079400804008140082400834008440085400864008740088400894009040091400924009340094400954009640097400984009940100401014010240103401044010540106401074010840109401104011140112401134011440115401164011740118401194012040121401224012340124401254012640127401284012940130401314013240133401344013540136401374013840139401404014140142401434014440145401464014740148401494015040151401524015340154401554015640157401584015940160401614016240163401644016540166401674016840169401704017140172401734017440175401764017740178401794018040181401824018340184401854018640187401884018940190401914019240193401944019540196401974019840199402004020140202402034020440205402064020740208402094021040211402124021340214402154021640217402184021940220402214022240223402244022540226402274022840229402304023140232402334023440235402364023740238402394024040241402424024340244402454024640247402484024940250402514025240253402544025540256402574025840259402604026140262402634026440265402664026740268402694027040271402724027340274402754027640277402784027940280402814028240283402844028540286402874028840289402904029140292402934029440295402964029740298402994030040301403024030340304403054030640307403084030940310403114031240313403144031540316403174031840319403204032140322403234032440325403264032740328403294033040331403324033340334403354033640337403384033940340403414034240343403444034540346403474034840349403504035140352403534035440355403564035740358403594036040361403624036340364403654036640367403684036940370403714037240373403744037540376403774037840379403804038140382403834038440385403864038740388403894039040391403924039340394403954039640397403984039940400404014040240403404044040540406404074040840409404104041140412404134041440415404164041740418404194042040421404224042340424404254042640427404284042940430404314043240433404344043540436404374043840439404404044140442404434044440445404464044740448404494045040451404524045340454404554045640457404584045940460404614046240463404644046540466404674046840469404704047140472404734047440475404764047740478404794048040481404824048340484404854048640487404884048940490404914049240493404944049540496404974049840499405004050140502405034050440505405064050740508405094051040511405124051340514405154051640517405184051940520405214052240523405244052540526405274052840529405304053140532405334053440535405364053740538405394054040541405424054340544405454054640547405484054940550405514055240553405544055540556405574055840559405604056140562405634056440565405664056740568405694057040571405724057340574405754057640577405784057940580405814058240583405844058540586405874058840589405904059140592405934059440595405964059740598405994060040601406024060340604406054060640607406084060940610406114061240613406144061540616406174061840619406204062140622406234062440625406264062740628406294063040631406324063340634406354063640637406384063940640406414064240643406444064540646406474064840649406504065140652406534065440655406564065740658406594066040661406624066340664406654066640667406684066940670406714067240673406744067540676406774067840679406804068140682406834068440685406864068740688406894069040691406924069340694406954069640697406984069940700407014070240703407044070540706407074070840709407104071140712407134071440715407164071740718407194072040721407224072340724407254072640727407284072940730407314073240733407344073540736407374073840739407404074140742407434074440745407464074740748407494075040751407524075340754407554075640757407584075940760407614076240763407644076540766407674076840769407704077140772407734077440775407764077740778407794078040781407824078340784407854078640787407884078940790407914079240793407944079540796407974079840799408004080140802408034080440805408064080740808408094081040811408124081340814408154081640817408184081940820408214082240823408244082540826408274082840829408304083140832408334083440835408364083740838408394084040841408424084340844408454084640847408484084940850408514085240853408544085540856408574085840859408604086140862408634086440865408664086740868408694087040871408724087340874408754087640877408784087940880408814088240883408844088540886408874088840889408904089140892408934089440895408964089740898408994090040901409024090340904409054090640907409084090940910409114091240913409144091540916409174091840919409204092140922409234092440925409264092740928409294093040931409324093340934409354093640937409384093940940409414094240943409444094540946409474094840949409504095140952409534095440955409564095740958409594096040961409624096340964409654096640967409684096940970409714097240973409744097540976409774097840979409804098140982409834098440985409864098740988409894099040991409924099340994409954099640997409984099941000410014100241003410044100541006410074100841009410104101141012410134101441015410164101741018410194102041021410224102341024410254102641027410284102941030410314103241033410344103541036410374103841039410404104141042410434104441045410464104741048410494105041051410524105341054410554105641057410584105941060410614106241063410644106541066410674106841069410704107141072410734107441075410764107741078410794108041081410824108341084410854108641087410884108941090410914109241093410944109541096410974109841099411004110141102411034110441105411064110741108411094111041111411124111341114411154111641117411184111941120411214112241123411244112541126411274112841129411304113141132411334113441135411364113741138411394114041141411424114341144411454114641147411484114941150411514115241153411544115541156411574115841159411604116141162411634116441165411664116741168411694117041171411724117341174411754117641177411784117941180411814118241183411844118541186411874118841189411904119141192411934119441195411964119741198411994120041201412024120341204412054120641207412084120941210412114121241213412144121541216412174121841219412204122141222412234122441225412264122741228412294123041231412324123341234412354123641237412384123941240412414124241243412444124541246412474124841249412504125141252412534125441255412564125741258412594126041261412624126341264412654126641267412684126941270412714127241273412744127541276412774127841279412804128141282412834128441285412864128741288412894129041291412924129341294412954129641297412984129941300413014130241303413044130541306413074130841309413104131141312413134131441315413164131741318413194132041321413224132341324413254132641327413284132941330413314133241333413344133541336413374133841339413404134141342413434134441345413464134741348413494135041351413524135341354413554135641357413584135941360413614136241363413644136541366413674136841369413704137141372413734137441375413764137741378413794138041381413824138341384413854138641387413884138941390413914139241393413944139541396413974139841399414004140141402414034140441405414064140741408414094141041411414124141341414414154141641417414184141941420414214142241423414244142541426414274142841429414304143141432414334143441435414364143741438414394144041441414424144341444414454144641447414484144941450414514145241453414544145541456414574145841459414604146141462414634146441465414664146741468414694147041471414724147341474414754147641477414784147941480414814148241483414844148541486414874148841489414904149141492414934149441495414964149741498414994150041501415024150341504415054150641507415084150941510415114151241513415144151541516415174151841519415204152141522415234152441525415264152741528415294153041531415324153341534415354153641537415384153941540415414154241543415444154541546415474154841549415504155141552415534155441555415564155741558415594156041561415624156341564415654156641567415684156941570415714157241573415744157541576415774157841579415804158141582415834158441585415864158741588415894159041591415924159341594415954159641597415984159941600416014160241603416044160541606416074160841609416104161141612416134161441615416164161741618416194162041621416224162341624416254162641627416284162941630416314163241633416344163541636416374163841639416404164141642416434164441645416464164741648416494165041651416524165341654416554165641657416584165941660416614166241663416644166541666416674166841669416704167141672416734167441675416764167741678416794168041681416824168341684416854168641687416884168941690416914169241693416944169541696416974169841699417004170141702417034170441705417064170741708417094171041711417124171341714417154171641717417184171941720417214172241723417244172541726417274172841729417304173141732417334173441735417364173741738417394174041741417424174341744417454174641747417484174941750417514175241753417544175541756417574175841759417604176141762417634176441765417664176741768417694177041771417724177341774417754177641777417784177941780417814178241783417844178541786417874178841789417904179141792417934179441795417964179741798417994180041801418024180341804418054180641807418084180941810418114181241813418144181541816418174181841819418204182141822418234182441825418264182741828418294183041831418324183341834418354183641837418384183941840418414184241843418444184541846418474184841849418504185141852418534185441855418564185741858418594186041861418624186341864418654186641867418684186941870418714187241873418744187541876418774187841879418804188141882418834188441885418864188741888418894189041891418924189341894418954189641897418984189941900419014190241903419044190541906419074190841909419104191141912419134191441915419164191741918419194192041921419224192341924419254192641927419284192941930419314193241933419344193541936419374193841939419404194141942419434194441945419464194741948419494195041951419524195341954419554195641957419584195941960419614196241963419644196541966419674196841969419704197141972419734197441975419764197741978419794198041981419824198341984419854198641987419884198941990419914199241993419944199541996419974199841999420004200142002420034200442005420064200742008420094201042011420124201342014420154201642017420184201942020420214202242023420244202542026420274202842029420304203142032420334203442035420364203742038420394204042041420424204342044420454204642047420484204942050420514205242053420544205542056420574205842059420604206142062420634206442065420664206742068420694207042071420724207342074420754207642077420784207942080420814208242083420844208542086420874208842089420904209142092420934209442095420964209742098420994210042101421024210342104421054210642107421084210942110421114211242113421144211542116421174211842119421204212142122421234212442125421264212742128421294213042131421324213342134421354213642137421384213942140421414214242143421444214542146421474214842149421504215142152421534215442155421564215742158421594216042161421624216342164421654216642167421684216942170421714217242173421744217542176421774217842179421804218142182421834218442185421864218742188421894219042191421924219342194421954219642197421984219942200422014220242203422044220542206422074220842209422104221142212422134221442215422164221742218422194222042221422224222342224422254222642227422284222942230422314223242233422344223542236422374223842239422404224142242422434224442245422464224742248422494225042251422524225342254422554225642257422584225942260422614226242263422644226542266422674226842269422704227142272422734227442275422764227742278422794228042281422824228342284422854228642287422884228942290422914229242293422944229542296422974229842299423004230142302423034230442305423064230742308423094231042311423124231342314423154231642317423184231942320423214232242323423244232542326423274232842329423304233142332423334233442335423364233742338423394234042341423424234342344423454234642347423484234942350423514235242353423544235542356423574235842359423604236142362423634236442365423664236742368423694237042371423724237342374423754237642377423784237942380423814238242383423844238542386423874238842389423904239142392423934239442395423964239742398423994240042401424024240342404424054240642407424084240942410424114241242413424144241542416424174241842419424204242142422424234242442425424264242742428424294243042431424324243342434424354243642437424384243942440424414244242443424444244542446424474244842449424504245142452424534245442455424564245742458424594246042461424624246342464424654246642467424684246942470424714247242473424744247542476424774247842479424804248142482424834248442485424864248742488424894249042491424924249342494424954249642497424984249942500425014250242503425044250542506425074250842509425104251142512425134251442515425164251742518425194252042521425224252342524425254252642527425284252942530425314253242533425344253542536425374253842539425404254142542425434254442545425464254742548425494255042551425524255342554425554255642557425584255942560425614256242563425644256542566425674256842569425704257142572425734257442575425764257742578425794258042581425824258342584425854258642587425884258942590425914259242593425944259542596425974259842599426004260142602426034260442605426064260742608426094261042611426124261342614426154261642617426184261942620426214262242623426244262542626426274262842629426304263142632426334263442635426364263742638426394264042641426424264342644426454264642647426484264942650426514265242653426544265542656426574265842659426604266142662426634266442665426664266742668426694267042671426724267342674426754267642677426784267942680426814268242683426844268542686426874268842689426904269142692426934269442695426964269742698426994270042701427024270342704427054270642707427084270942710427114271242713427144271542716427174271842719427204272142722427234272442725427264272742728427294273042731427324273342734427354273642737427384273942740427414274242743427444274542746427474274842749427504275142752427534275442755427564275742758427594276042761427624276342764427654276642767427684276942770427714277242773427744277542776427774277842779427804278142782427834278442785427864278742788427894279042791427924279342794427954279642797427984279942800428014280242803428044280542806428074280842809428104281142812428134281442815428164281742818428194282042821428224282342824428254282642827428284282942830428314283242833428344283542836428374283842839428404284142842428434284442845428464284742848428494285042851428524285342854428554285642857428584285942860428614286242863428644286542866428674286842869428704287142872428734287442875428764287742878428794288042881428824288342884428854288642887428884288942890428914289242893428944289542896428974289842899429004290142902429034290442905429064290742908429094291042911429124291342914429154291642917429184291942920429214292242923429244292542926429274292842929429304293142932429334293442935429364293742938429394294042941429424294342944429454294642947429484294942950429514295242953429544295542956429574295842959429604296142962429634296442965429664296742968429694297042971429724297342974429754297642977429784297942980429814298242983429844298542986429874298842989429904299142992429934299442995429964299742998429994300043001430024300343004430054300643007430084300943010430114301243013430144301543016430174301843019430204302143022430234302443025430264302743028430294303043031430324303343034430354303643037430384303943040430414304243043430444304543046430474304843049430504305143052430534305443055430564305743058430594306043061430624306343064430654306643067430684306943070430714307243073430744307543076430774307843079430804308143082430834308443085430864308743088430894309043091430924309343094430954309643097430984309943100431014310243103431044310543106431074310843109431104311143112431134311443115431164311743118431194312043121431224312343124431254312643127431284312943130431314313243133431344313543136431374313843139431404314143142431434314443145431464314743148431494315043151431524315343154431554315643157431584315943160431614316243163431644316543166431674316843169431704317143172431734317443175431764317743178431794318043181431824318343184431854318643187431884318943190431914319243193431944319543196431974319843199432004320143202432034320443205432064320743208432094321043211432124321343214432154321643217432184321943220432214322243223432244322543226432274322843229432304323143232432334323443235432364323743238432394324043241432424324343244432454324643247432484324943250432514325243253432544325543256432574325843259432604326143262432634326443265432664326743268432694327043271432724327343274432754327643277432784327943280432814328243283432844328543286432874328843289432904329143292432934329443295432964329743298432994330043301433024330343304433054330643307433084330943310433114331243313433144331543316433174331843319433204332143322433234332443325433264332743328433294333043331433324333343334433354333643337433384333943340433414334243343433444334543346433474334843349433504335143352433534335443355433564335743358433594336043361433624336343364433654336643367433684336943370433714337243373433744337543376433774337843379433804338143382433834338443385433864338743388433894339043391433924339343394433954339643397433984339943400434014340243403434044340543406434074340843409434104341143412434134341443415434164341743418434194342043421434224342343424434254342643427434284342943430434314343243433434344343543436434374343843439434404344143442434434344443445434464344743448434494345043451434524345343454434554345643457434584345943460434614346243463434644346543466434674346843469434704347143472434734347443475434764347743478434794348043481434824348343484434854348643487434884348943490434914349243493434944349543496434974349843499435004350143502435034350443505435064350743508435094351043511435124351343514435154351643517435184351943520435214352243523435244352543526435274352843529435304353143532435334353443535435364353743538435394354043541435424354343544435454354643547435484354943550435514355243553435544355543556435574355843559435604356143562435634356443565435664356743568435694357043571435724357343574435754357643577435784357943580435814358243583435844358543586435874358843589435904359143592435934359443595435964359743598435994360043601436024360343604436054360643607436084360943610436114361243613436144361543616436174361843619436204362143622436234362443625436264362743628436294363043631436324363343634436354363643637436384363943640436414364243643436444364543646436474364843649436504365143652436534365443655436564365743658436594366043661436624366343664436654366643667436684366943670436714367243673436744367543676436774367843679436804368143682436834368443685436864368743688436894369043691436924369343694436954369643697436984369943700437014370243703437044370543706437074370843709437104371143712437134371443715437164371743718437194372043721437224372343724437254372643727437284372943730437314373243733437344373543736437374373843739437404374143742437434374443745437464374743748437494375043751437524375343754437554375643757437584375943760437614376243763437644376543766437674376843769437704377143772437734377443775437764377743778437794378043781437824378343784437854378643787437884378943790437914379243793437944379543796437974379843799438004380143802438034380443805438064380743808438094381043811438124381343814438154381643817438184381943820438214382243823438244382543826438274382843829438304383143832438334383443835438364383743838438394384043841438424384343844438454384643847438484384943850438514385243853438544385543856438574385843859438604386143862438634386443865438664386743868438694387043871438724387343874438754387643877438784387943880438814388243883438844388543886438874388843889438904389143892438934389443895438964389743898438994390043901439024390343904439054390643907439084390943910439114391243913439144391543916439174391843919439204392143922439234392443925439264392743928439294393043931439324393343934439354393643937439384393943940439414394243943439444394543946439474394843949439504395143952439534395443955439564395743958439594396043961439624396343964439654396643967439684396943970439714397243973439744397543976439774397843979439804398143982439834398443985439864398743988439894399043991439924399343994439954399643997439984399944000440014400244003440044400544006440074400844009440104401144012440134401444015440164401744018440194402044021440224402344024440254402644027440284402944030440314403244033440344403544036440374403844039440404404144042440434404444045440464404744048440494405044051440524405344054440554405644057440584405944060440614406244063440644406544066440674406844069440704407144072440734407444075440764407744078440794408044081440824408344084440854408644087440884408944090440914409244093440944409544096440974409844099441004410144102441034410444105441064410744108441094411044111441124411344114441154411644117441184411944120441214412244123441244412544126441274412844129441304413144132441334413444135441364413744138441394414044141441424414344144441454414644147441484414944150441514415244153441544415544156441574415844159441604416144162441634416444165441664416744168441694417044171441724417344174441754417644177441784417944180441814418244183441844418544186441874418844189441904419144192441934419444195441964419744198441994420044201442024420344204442054420644207442084420944210442114421244213442144421544216442174421844219442204422144222442234422444225442264422744228442294423044231442324423344234442354423644237442384423944240442414424244243442444424544246442474424844249442504425144252442534425444255442564425744258442594426044261442624426344264442654426644267442684426944270442714427244273442744427544276442774427844279442804428144282442834428444285442864428744288442894429044291442924429344294442954429644297442984429944300443014430244303443044430544306443074430844309443104431144312443134431444315443164431744318443194432044321443224432344324443254432644327443284432944330443314433244333443344433544336443374433844339443404434144342443434434444345443464434744348443494435044351443524435344354443554435644357443584435944360443614436244363443644436544366443674436844369443704437144372443734437444375443764437744378443794438044381443824438344384443854438644387443884438944390443914439244393443944439544396443974439844399444004440144402444034440444405444064440744408444094441044411444124441344414444154441644417444184441944420444214442244423444244442544426444274442844429444304443144432444334443444435444364443744438444394444044441444424444344444444454444644447444484444944450444514445244453444544445544456444574445844459444604446144462444634446444465444664446744468444694447044471444724447344474444754447644477444784447944480444814448244483444844448544486444874448844489444904449144492444934449444495444964449744498444994450044501445024450344504445054450644507445084450944510445114451244513445144451544516445174451844519445204452144522445234452444525445264452744528445294453044531445324453344534445354453644537445384453944540445414454244543445444454544546445474454844549445504455144552445534455444555445564455744558445594456044561445624456344564445654456644567445684456944570445714457244573445744457544576445774457844579445804458144582445834458444585445864458744588445894459044591445924459344594445954459644597445984459944600446014460244603446044460544606446074460844609446104461144612446134461444615446164461744618446194462044621446224462344624446254462644627446284462944630446314463244633446344463544636446374463844639446404464144642446434464444645446464464744648446494465044651446524465344654446554465644657446584465944660446614466244663446644466544666446674466844669446704467144672446734467444675446764467744678446794468044681446824468344684446854468644687446884468944690446914469244693446944469544696446974469844699447004470144702447034470444705447064470744708447094471044711447124471344714447154471644717447184471944720447214472244723447244472544726447274472844729447304473144732447334473444735447364473744738447394474044741447424474344744447454474644747447484474944750447514475244753447544475544756447574475844759447604476144762447634476444765447664476744768447694477044771447724477344774447754477644777447784477944780447814478244783447844478544786447874478844789447904479144792447934479444795447964479744798447994480044801448024480344804448054480644807448084480944810448114481244813448144481544816448174481844819448204482144822448234482444825448264482744828448294483044831448324483344834448354483644837448384483944840448414484244843448444484544846448474484844849448504485144852448534485444855448564485744858448594486044861448624486344864448654486644867448684486944870448714487244873448744487544876448774487844879448804488144882448834488444885448864488744888448894489044891448924489344894448954489644897448984489944900449014490244903449044490544906449074490844909449104491144912449134491444915449164491744918449194492044921449224492344924449254492644927449284492944930449314493244933449344493544936449374493844939449404494144942449434494444945449464494744948449494495044951449524495344954449554495644957449584495944960449614496244963449644496544966449674496844969449704497144972449734497444975449764497744978449794498044981449824498344984449854498644987449884498944990449914499244993449944499544996449974499844999450004500145002450034500445005450064500745008450094501045011450124501345014450154501645017450184501945020450214502245023450244502545026450274502845029450304503145032450334503445035450364503745038450394504045041450424504345044450454504645047450484504945050450514505245053450544505545056450574505845059450604506145062450634506445065450664506745068450694507045071450724507345074450754507645077450784507945080450814508245083450844508545086450874508845089450904509145092450934509445095450964509745098450994510045101451024510345104451054510645107451084510945110451114511245113451144511545116451174511845119451204512145122451234512445125451264512745128451294513045131451324513345134451354513645137451384513945140451414514245143451444514545146451474514845149451504515145152451534515445155451564515745158451594516045161451624516345164451654516645167451684516945170451714517245173451744517545176451774517845179451804518145182451834518445185451864518745188451894519045191451924519345194451954519645197451984519945200452014520245203452044520545206452074520845209452104521145212452134521445215452164521745218452194522045221452224522345224452254522645227452284522945230452314523245233452344523545236452374523845239452404524145242452434524445245452464524745248452494525045251452524525345254452554525645257452584525945260452614526245263452644526545266452674526845269452704527145272452734527445275452764527745278452794528045281452824528345284452854528645287452884528945290452914529245293452944529545296452974529845299453004530145302453034530445305453064530745308453094531045311453124531345314453154531645317453184531945320453214532245323453244532545326453274532845329453304533145332453334533445335453364533745338453394534045341453424534345344453454534645347453484534945350453514535245353453544535545356453574535845359453604536145362453634536445365453664536745368453694537045371453724537345374453754537645377453784537945380453814538245383453844538545386453874538845389453904539145392453934539445395453964539745398453994540045401454024540345404454054540645407454084540945410454114541245413454144541545416454174541845419454204542145422454234542445425454264542745428454294543045431454324543345434454354543645437454384543945440454414544245443454444544545446454474544845449454504545145452454534545445455454564545745458454594546045461454624546345464454654546645467454684546945470454714547245473454744547545476454774547845479454804548145482454834548445485454864548745488454894549045491454924549345494454954549645497454984549945500455014550245503455044550545506455074550845509455104551145512455134551445515455164551745518455194552045521455224552345524455254552645527455284552945530455314553245533455344553545536455374553845539455404554145542455434554445545455464554745548455494555045551455524555345554455554555645557455584555945560455614556245563455644556545566455674556845569455704557145572455734557445575455764557745578455794558045581455824558345584455854558645587455884558945590455914559245593455944559545596455974559845599456004560145602456034560445605456064560745608456094561045611456124561345614456154561645617456184561945620456214562245623456244562545626456274562845629456304563145632456334563445635456364563745638456394564045641456424564345644456454564645647456484564945650456514565245653456544565545656456574565845659456604566145662456634566445665456664566745668456694567045671456724567345674456754567645677456784567945680456814568245683456844568545686456874568845689456904569145692456934569445695456964569745698456994570045701457024570345704457054570645707457084570945710457114571245713457144571545716457174571845719457204572145722457234572445725457264572745728457294573045731457324573345734457354573645737457384573945740457414574245743457444574545746457474574845749457504575145752457534575445755457564575745758457594576045761457624576345764457654576645767457684576945770457714577245773457744577545776457774577845779457804578145782457834578445785457864578745788457894579045791457924579345794457954579645797457984579945800458014580245803458044580545806458074580845809458104581145812458134581445815458164581745818458194582045821458224582345824458254582645827458284582945830458314583245833458344583545836458374583845839458404584145842458434584445845458464584745848458494585045851458524585345854458554585645857458584585945860458614586245863458644586545866458674586845869458704587145872458734587445875458764587745878458794588045881458824588345884458854588645887458884588945890458914589245893458944589545896458974589845899459004590145902459034590445905459064590745908459094591045911459124591345914459154591645917459184591945920459214592245923459244592545926459274592845929459304593145932459334593445935459364593745938459394594045941459424594345944459454594645947459484594945950459514595245953459544595545956459574595845959459604596145962459634596445965459664596745968459694597045971459724597345974459754597645977459784597945980459814598245983459844598545986459874598845989459904599145992459934599445995459964599745998459994600046001460024600346004460054600646007460084600946010460114601246013460144601546016460174601846019460204602146022460234602446025460264602746028460294603046031460324603346034460354603646037460384603946040460414604246043460444604546046460474604846049460504605146052460534605446055460564605746058460594606046061460624606346064460654606646067460684606946070460714607246073460744607546076460774607846079460804608146082460834608446085460864608746088460894609046091460924609346094460954609646097460984609946100461014610246103461044610546106461074610846109461104611146112461134611446115461164611746118461194612046121461224612346124461254612646127461284612946130461314613246133461344613546136461374613846139461404614146142461434614446145461464614746148461494615046151461524615346154461554615646157461584615946160461614616246163461644616546166461674616846169461704617146172461734617446175461764617746178461794618046181461824618346184461854618646187461884618946190461914619246193461944619546196461974619846199462004620146202462034620446205462064620746208462094621046211462124621346214462154621646217462184621946220462214622246223462244622546226462274622846229462304623146232462334623446235462364623746238462394624046241462424624346244462454624646247462484624946250462514625246253462544625546256462574625846259462604626146262462634626446265462664626746268462694627046271462724627346274462754627646277462784627946280462814628246283462844628546286462874628846289462904629146292462934629446295462964629746298462994630046301463024630346304463054630646307463084630946310463114631246313463144631546316463174631846319463204632146322463234632446325463264632746328463294633046331463324633346334463354633646337463384633946340463414634246343463444634546346463474634846349463504635146352463534635446355463564635746358463594636046361463624636346364463654636646367463684636946370463714637246373463744637546376463774637846379463804638146382463834638446385463864638746388463894639046391463924639346394463954639646397463984639946400464014640246403464044640546406464074640846409464104641146412464134641446415464164641746418464194642046421464224642346424464254642646427464284642946430464314643246433464344643546436464374643846439464404644146442464434644446445464464644746448464494645046451464524645346454464554645646457464584645946460464614646246463464644646546466464674646846469464704647146472464734647446475464764647746478464794648046481464824648346484464854648646487464884648946490464914649246493464944649546496464974649846499465004650146502465034650446505465064650746508465094651046511465124651346514465154651646517465184651946520465214652246523465244652546526465274652846529465304653146532465334653446535465364653746538465394654046541465424654346544465454654646547465484654946550465514655246553465544655546556465574655846559465604656146562465634656446565465664656746568465694657046571465724657346574465754657646577465784657946580465814658246583465844658546586465874658846589465904659146592465934659446595465964659746598465994660046601466024660346604466054660646607466084660946610466114661246613466144661546616466174661846619466204662146622466234662446625466264662746628466294663046631466324663346634466354663646637466384663946640466414664246643466444664546646466474664846649466504665146652466534665446655466564665746658466594666046661466624666346664466654666646667466684666946670466714667246673466744667546676466774667846679466804668146682466834668446685466864668746688466894669046691466924669346694466954669646697466984669946700467014670246703467044670546706467074670846709467104671146712467134671446715467164671746718467194672046721467224672346724467254672646727467284672946730467314673246733467344673546736467374673846739467404674146742467434674446745467464674746748467494675046751467524675346754467554675646757467584675946760467614676246763467644676546766467674676846769467704677146772467734677446775467764677746778467794678046781467824678346784467854678646787467884678946790467914679246793467944679546796467974679846799468004680146802468034680446805468064680746808468094681046811468124681346814468154681646817468184681946820468214682246823468244682546826468274682846829468304683146832468334683446835468364683746838468394684046841468424684346844468454684646847468484684946850468514685246853468544685546856468574685846859468604686146862468634686446865468664686746868468694687046871468724687346874468754687646877468784687946880468814688246883468844688546886468874688846889468904689146892468934689446895468964689746898468994690046901469024690346904469054690646907469084690946910469114691246913469144691546916469174691846919469204692146922469234692446925469264692746928469294693046931469324693346934469354693646937469384693946940469414694246943469444694546946469474694846949469504695146952469534695446955469564695746958469594696046961469624696346964469654696646967469684696946970469714697246973469744697546976469774697846979469804698146982469834698446985469864698746988469894699046991469924699346994469954699646997469984699947000470014700247003470044700547006470074700847009470104701147012470134701447015470164701747018470194702047021470224702347024470254702647027470284702947030470314703247033470344703547036470374703847039470404704147042470434704447045470464704747048470494705047051470524705347054470554705647057470584705947060470614706247063470644706547066470674706847069470704707147072470734707447075470764707747078470794708047081470824708347084470854708647087470884708947090470914709247093470944709547096470974709847099471004710147102471034710447105471064710747108471094711047111471124711347114471154711647117471184711947120471214712247123471244712547126471274712847129471304713147132471334713447135471364713747138471394714047141471424714347144471454714647147471484714947150471514715247153471544715547156471574715847159471604716147162471634716447165471664716747168471694717047171471724717347174471754717647177471784717947180471814718247183471844718547186471874718847189471904719147192471934719447195471964719747198471994720047201472024720347204472054720647207472084720947210472114721247213472144721547216472174721847219472204722147222472234722447225472264722747228472294723047231472324723347234472354723647237472384723947240472414724247243472444724547246472474724847249472504725147252472534725447255472564725747258472594726047261472624726347264472654726647267472684726947270472714727247273472744727547276472774727847279472804728147282472834728447285472864728747288472894729047291472924729347294472954729647297472984729947300473014730247303473044730547306473074730847309473104731147312473134731447315473164731747318473194732047321473224732347324473254732647327473284732947330473314733247333473344733547336473374733847339473404734147342473434734447345473464734747348473494735047351473524735347354473554735647357473584735947360473614736247363473644736547366473674736847369473704737147372473734737447375473764737747378473794738047381473824738347384473854738647387473884738947390473914739247393473944739547396473974739847399474004740147402474034740447405474064740747408474094741047411474124741347414474154741647417474184741947420474214742247423474244742547426474274742847429474304743147432474334743447435474364743747438474394744047441474424744347444474454744647447474484744947450474514745247453474544745547456474574745847459474604746147462474634746447465474664746747468474694747047471474724747347474474754747647477474784747947480474814748247483474844748547486474874748847489474904749147492474934749447495474964749747498474994750047501475024750347504475054750647507475084750947510475114751247513475144751547516475174751847519475204752147522475234752447525475264752747528475294753047531475324753347534475354753647537475384753947540475414754247543475444754547546475474754847549475504755147552475534755447555475564755747558475594756047561475624756347564475654756647567475684756947570475714757247573475744757547576475774757847579475804758147582475834758447585475864758747588475894759047591475924759347594475954759647597475984759947600476014760247603476044760547606476074760847609476104761147612476134761447615476164761747618476194762047621476224762347624476254762647627476284762947630476314763247633476344763547636476374763847639476404764147642476434764447645476464764747648476494765047651476524765347654476554765647657476584765947660476614766247663476644766547666476674766847669476704767147672476734767447675476764767747678476794768047681476824768347684476854768647687476884768947690476914769247693476944769547696476974769847699477004770147702477034770447705477064770747708477094771047711477124771347714477154771647717477184771947720477214772247723477244772547726477274772847729477304773147732477334773447735477364773747738477394774047741477424774347744477454774647747477484774947750477514775247753477544775547756477574775847759477604776147762477634776447765477664776747768477694777047771477724777347774477754777647777477784777947780477814778247783477844778547786477874778847789477904779147792477934779447795477964779747798477994780047801478024780347804478054780647807478084780947810478114781247813478144781547816478174781847819478204782147822478234782447825478264782747828478294783047831478324783347834478354783647837478384783947840478414784247843478444784547846478474784847849478504785147852478534785447855478564785747858478594786047861478624786347864478654786647867478684786947870478714787247873478744787547876478774787847879478804788147882478834788447885478864788747888478894789047891478924789347894478954789647897478984789947900479014790247903479044790547906479074790847909479104791147912479134791447915479164791747918479194792047921479224792347924479254792647927479284792947930479314793247933479344793547936479374793847939479404794147942479434794447945479464794747948479494795047951479524795347954479554795647957479584795947960479614796247963479644796547966479674796847969479704797147972479734797447975479764797747978479794798047981479824798347984479854798647987479884798947990479914799247993479944799547996479974799847999480004800148002480034800448005480064800748008480094801048011480124801348014480154801648017480184801948020480214802248023480244802548026480274802848029480304803148032480334803448035480364803748038480394804048041480424804348044480454804648047480484804948050480514805248053480544805548056480574805848059480604806148062480634806448065480664806748068480694807048071480724807348074480754807648077480784807948080480814808248083480844808548086480874808848089480904809148092480934809448095480964809748098480994810048101481024810348104481054810648107481084810948110481114811248113481144811548116481174811848119481204812148122481234812448125481264812748128481294813048131481324813348134481354813648137481384813948140481414814248143481444814548146481474814848149481504815148152481534815448155481564815748158481594816048161481624816348164481654816648167481684816948170481714817248173481744817548176481774817848179481804818148182481834818448185481864818748188481894819048191481924819348194481954819648197481984819948200482014820248203482044820548206482074820848209482104821148212482134821448215482164821748218482194822048221482224822348224482254822648227482284822948230482314823248233482344823548236482374823848239482404824148242482434824448245482464824748248482494825048251482524825348254482554825648257482584825948260482614826248263482644826548266482674826848269482704827148272482734827448275482764827748278482794828048281482824828348284482854828648287482884828948290482914829248293482944829548296482974829848299483004830148302483034830448305483064830748308483094831048311483124831348314483154831648317483184831948320483214832248323483244832548326483274832848329483304833148332483334833448335483364833748338483394834048341483424834348344483454834648347483484834948350483514835248353483544835548356483574835848359483604836148362483634836448365483664836748368483694837048371483724837348374483754837648377483784837948380483814838248383483844838548386483874838848389483904839148392483934839448395483964839748398483994840048401484024840348404484054840648407484084840948410484114841248413484144841548416484174841848419484204842148422484234842448425484264842748428484294843048431484324843348434484354843648437484384843948440484414844248443484444844548446484474844848449484504845148452484534845448455484564845748458484594846048461484624846348464484654846648467484684846948470484714847248473484744847548476484774847848479484804848148482484834848448485484864848748488484894849048491484924849348494484954849648497484984849948500485014850248503485044850548506485074850848509485104851148512485134851448515485164851748518485194852048521485224852348524485254852648527485284852948530485314853248533485344853548536485374853848539485404854148542485434854448545485464854748548485494855048551485524855348554485554855648557485584855948560485614856248563485644856548566485674856848569485704857148572
  1. /* ssl.c
  2. *
  3. * Copyright (C) 2006-2020 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. #if defined(OPENSSL_EXTRA) && !defined(_WIN32)
  26. /* turn on GNU extensions for XVASPRINTF with wolfSSL_BIO_printf */
  27. #undef _GNU_SOURCE
  28. #define _GNU_SOURCE
  29. #endif
  30. #if !defined(WOLFCRYPT_ONLY) || defined(OPENSSL_EXTRA) || \
  31. defined(OPENSSL_EXTRA_X509_SMALL)
  32. #ifdef HAVE_ERRNO_H
  33. #include <errno.h>
  34. #endif
  35. #include <wolfssl/internal.h>
  36. #include <wolfssl/error-ssl.h>
  37. #include <wolfssl/wolfcrypt/coding.h>
  38. #ifdef NO_INLINE
  39. #include <wolfssl/wolfcrypt/misc.h>
  40. #else
  41. #define WOLFSSL_MISC_INCLUDED
  42. #include <wolfcrypt/src/misc.c>
  43. #endif
  44. #if !defined(WOLFSSL_ALLOW_NO_SUITES) && !defined(WOLFCRYPT_ONLY)
  45. #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(WOLFSSL_STATIC_RSA) \
  46. && !defined(WOLFSSL_STATIC_DH) && !defined(WOLFSSL_STATIC_PSK) \
  47. && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  48. #error "No cipher suites defined because DH disabled, ECC disabled, and no static suites defined. Please see top of README"
  49. #endif
  50. #ifdef WOLFSSL_CERT_GEN
  51. /* need access to Cert struct for creating certificate */
  52. #include <wolfssl/wolfcrypt/asn_public.h>
  53. #endif
  54. #endif
  55. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  56. defined(HAVE_WEBSERVER) || defined(WOLFSSL_KEY_GEN)
  57. #include <wolfssl/openssl/evp.h>
  58. /* openssl headers end, wolfssl internal headers next */
  59. #endif
  60. #include <wolfssl/wolfcrypt/wc_encrypt.h>
  61. #ifndef NO_RSA
  62. #include <wolfssl/wolfcrypt/rsa.h>
  63. #endif
  64. #ifdef OPENSSL_EXTRA
  65. /* openssl headers begin */
  66. #include <wolfssl/openssl/aes.h>
  67. #include <wolfssl/openssl/hmac.h>
  68. #include <wolfssl/openssl/crypto.h>
  69. #include <wolfssl/openssl/des.h>
  70. #include <wolfssl/openssl/bn.h>
  71. #include <wolfssl/openssl/buffer.h>
  72. #include <wolfssl/openssl/dh.h>
  73. #include <wolfssl/openssl/rsa.h>
  74. #include <wolfssl/openssl/pem.h>
  75. #include <wolfssl/openssl/ec.h>
  76. #include <wolfssl/openssl/ec25519.h>
  77. #include <wolfssl/openssl/ed25519.h>
  78. #include <wolfssl/openssl/ec448.h>
  79. #include <wolfssl/openssl/ed448.h>
  80. #include <wolfssl/openssl/ecdsa.h>
  81. #include <wolfssl/openssl/ecdh.h>
  82. #include <wolfssl/openssl/err.h>
  83. #include <wolfssl/openssl/opensslv.h>
  84. #include <wolfssl/openssl/rc4.h>
  85. #include <wolfssl/openssl/stack.h>
  86. #include <wolfssl/openssl/x509_vfy.h>
  87. /* openssl headers end, wolfssl internal headers next */
  88. #include <wolfssl/wolfcrypt/hmac.h>
  89. #include <wolfssl/wolfcrypt/random.h>
  90. #include <wolfssl/wolfcrypt/des3.h>
  91. #include <wolfssl/wolfcrypt/ecc.h>
  92. #include <wolfssl/wolfcrypt/md4.h>
  93. #include <wolfssl/wolfcrypt/md5.h>
  94. #include <wolfssl/wolfcrypt/arc4.h>
  95. #include <wolfssl/wolfcrypt/idea.h>
  96. #include <wolfssl/wolfcrypt/curve25519.h>
  97. #include <wolfssl/wolfcrypt/ed25519.h>
  98. #include <wolfssl/wolfcrypt/curve448.h>
  99. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL)
  100. #include <wolfssl/openssl/ocsp.h>
  101. #endif /* WITH_STUNNEL */
  102. #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)
  103. #include <wolfssl/wolfcrypt/sha512.h>
  104. #endif
  105. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  106. && !defined(WC_NO_RNG)
  107. #include <wolfssl/wolfcrypt/srp.h>
  108. #endif
  109. #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
  110. #include <wolfssl/wolfcrypt/pkcs7.h>
  111. #endif
  112. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  113. #include <wolfssl/openssl/pkcs7.h>
  114. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  115. #endif
  116. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  117. #include <wolfssl/openssl/x509v3.h>
  118. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi);
  119. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi);
  120. int oid2nid(word32 oid, int grp);
  121. #endif
  122. #if defined(WOLFSSL_QT)
  123. #include <wolfssl/wolfcrypt/sha.h>
  124. #endif
  125. #ifdef NO_ASN
  126. #include <wolfssl/wolfcrypt/dh.h>
  127. #endif
  128. #endif /* !WOLFCRYPT_ONLY || OPENSSL_EXTRA */
  129. #define WOLFSSL_EVP_INCLUDED
  130. #include "wolfcrypt/src/evp.c"
  131. #ifdef OPENSSL_EXTRA
  132. /* Global pointer to constant BN on */
  133. static WOLFSSL_BIGNUM* bn_one = NULL;
  134. #endif
  135. #ifndef WOLFCRYPT_ONLY
  136. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  137. const WOLF_EC_NIST_NAME kNistCurves[] = {
  138. {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1},
  139. {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1},
  140. {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1},
  141. {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2},
  142. {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1},
  143. {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2},
  144. {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1},
  145. {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2},
  146. {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1},
  147. {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1},
  148. {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1},
  149. {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1},
  150. {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1},
  151. {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1},
  152. {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1},
  153. {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1},
  154. {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1},
  155. {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1},
  156. {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1},
  157. {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1},
  158. {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1},
  159. {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1},
  160. {0, NULL, 0},
  161. };
  162. #endif
  163. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  164. /* for root ca verification */
  165. int tsip_tls_RootCertVerify(const byte *cert, word32 cert_len,
  166. word32 key_n_start, word32 key_n_len,
  167. word32 key_e_start, word32 key_e_len,
  168. word32 cm_row);
  169. byte tsip_rootCAverified( );
  170. #endif
  171. #ifdef WOLFSSL_SESSION_EXPORT
  172. #ifdef WOLFSSL_DTLS
  173. int wolfSSL_dtls_import(WOLFSSL* ssl, unsigned char* buf, unsigned int sz)
  174. {
  175. WOLFSSL_ENTER("wolfSSL_session_import");
  176. if (ssl == NULL || buf == NULL) {
  177. return BAD_FUNC_ARG;
  178. }
  179. /* sanity checks on buffer and protocol are done in internal function */
  180. return wolfSSL_dtls_import_internal(ssl, buf, sz);
  181. }
  182. /* Sets the function to call for serializing the session. This function is
  183. * called right after the handshake is completed. */
  184. int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func)
  185. {
  186. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export");
  187. /* purposefully allow func to be NULL */
  188. if (ctx == NULL) {
  189. return BAD_FUNC_ARG;
  190. }
  191. ctx->dtls_export = func;
  192. return WOLFSSL_SUCCESS;
  193. }
  194. /* Sets the function in WOLFSSL struct to call for serializing the session. This
  195. * function is called right after the handshake is completed. */
  196. int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func)
  197. {
  198. WOLFSSL_ENTER("wolfSSL_dtls_set_export");
  199. /* purposefully allow func to be NULL */
  200. if (ssl == NULL) {
  201. return BAD_FUNC_ARG;
  202. }
  203. ssl->dtls_export = func;
  204. return WOLFSSL_SUCCESS;
  205. }
  206. /* This function allows for directly serializing a session rather than using
  207. * callbacks. It has less overhead by removing a temporary buffer and gives
  208. * control over when the session gets serialized. When using callbacks the
  209. * session is always serialized immediately after the handshake is finished.
  210. *
  211. * buf is the argument to contain the serialized session
  212. * sz is the size of the buffer passed in
  213. * ssl is the WOLFSSL struct to serialize
  214. * returns the size of serialized session on success, 0 on no action, and
  215. * negative value on error */
  216. int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz)
  217. {
  218. WOLFSSL_ENTER("wolfSSL_dtls_export");
  219. if (ssl == NULL || sz == NULL) {
  220. return BAD_FUNC_ARG;
  221. }
  222. if (buf == NULL) {
  223. *sz = MAX_EXPORT_BUFFER;
  224. return 0;
  225. }
  226. /* if not DTLS do nothing */
  227. if (!ssl->options.dtls) {
  228. WOLFSSL_MSG("Currently only DTLS export is supported");
  229. return 0;
  230. }
  231. /* copy over keys, options, and dtls state struct */
  232. return wolfSSL_dtls_export_internal(ssl, buf, *sz);
  233. }
  234. /* This function is similar to wolfSSL_dtls_export but only exports the portion
  235. * of the WOLFSSL structure related to the state of the connection, i.e. peer
  236. * sequence number, epoch, AEAD state etc.
  237. *
  238. * buf is the argument to contain the serialized state, if null then set "sz" to
  239. * buffer size required
  240. * sz is the size of the buffer passed in
  241. * ssl is the WOLFSSL struct to serialize
  242. * returns the size of serialized session on success, 0 on no action, and
  243. * negative value on error */
  244. int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf,
  245. unsigned int* sz)
  246. {
  247. WOLFSSL_ENTER("wolfSSL_dtls_export_state_only");
  248. if (ssl == NULL || sz == NULL) {
  249. return BAD_FUNC_ARG;
  250. }
  251. if (buf == NULL) {
  252. *sz = MAX_EXPORT_STATE_BUFFER;
  253. return 0;
  254. }
  255. /* if not DTLS do nothing */
  256. if (!ssl->options.dtls) {
  257. WOLFSSL_MSG("Currently only DTLS export state is supported");
  258. return 0;
  259. }
  260. /* copy over keys, options, and dtls state struct */
  261. return wolfSSL_dtls_export_state_internal(ssl, buf, *sz);
  262. }
  263. /* returns 0 on success */
  264. int wolfSSL_send_session(WOLFSSL* ssl)
  265. {
  266. int ret;
  267. byte* buf;
  268. word16 bufSz = MAX_EXPORT_BUFFER;
  269. WOLFSSL_ENTER("wolfSSL_send_session");
  270. if (ssl == NULL) {
  271. return BAD_FUNC_ARG;
  272. }
  273. buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  274. if (buf == NULL) {
  275. return MEMORY_E;
  276. }
  277. /* if not DTLS do nothing */
  278. if (!ssl->options.dtls) {
  279. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  280. WOLFSSL_MSG("Currently only DTLS export is supported");
  281. return 0;
  282. }
  283. /* copy over keys, options, and dtls state struct */
  284. ret = wolfSSL_dtls_export_internal(ssl, buf, bufSz);
  285. if (ret < 0) {
  286. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  287. return ret;
  288. }
  289. /* if no error ret has size of buffer */
  290. ret = ssl->dtls_export(ssl, buf, ret, NULL);
  291. if (ret != WOLFSSL_SUCCESS) {
  292. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  293. return ret;
  294. }
  295. XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  296. return 0;
  297. }
  298. #endif /* WOLFSSL_DTLS */
  299. #endif /* WOLFSSL_SESSION_EXPORT */
  300. /* prevent multiple mutex initializations */
  301. static volatile WOLFSSL_GLOBAL int initRefCount = 0;
  302. static WOLFSSL_GLOBAL wolfSSL_Mutex count_mutex; /* init ref count mutex */
  303. /* Create a new WOLFSSL_CTX struct and return the pointer to created struct.
  304. WOLFSSL_METHOD pointer passed in is given to ctx to manage.
  305. This function frees the passed in WOLFSSL_METHOD struct on failure and on
  306. success is freed when ctx is freed.
  307. */
  308. WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
  309. {
  310. WOLFSSL_CTX* ctx = NULL;
  311. WOLFSSL_ENTER("wolfSSL_CTX_new_ex");
  312. if (initRefCount == 0) {
  313. /* user no longer forced to call Init themselves */
  314. int ret = wolfSSL_Init();
  315. if (ret != WOLFSSL_SUCCESS) {
  316. WOLFSSL_MSG("wolfSSL_Init failed");
  317. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  318. if (method != NULL) {
  319. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  320. }
  321. return NULL;
  322. }
  323. }
  324. if (method == NULL)
  325. return ctx;
  326. ctx = (WOLFSSL_CTX*) XMALLOC(sizeof(WOLFSSL_CTX), heap, DYNAMIC_TYPE_CTX);
  327. if (ctx) {
  328. int ret;
  329. ret = InitSSL_Ctx(ctx, method, heap);
  330. #ifdef WOLFSSL_STATIC_MEMORY
  331. if (heap != NULL) {
  332. ctx->onHeap = 1; /* free the memory back to heap when done */
  333. }
  334. #endif
  335. if (ret < 0) {
  336. WOLFSSL_MSG("Init CTX failed");
  337. wolfSSL_CTX_free(ctx);
  338. ctx = NULL;
  339. }
  340. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  341. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  342. else {
  343. ctx->srp = (Srp*) XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
  344. if (ctx->srp == NULL){
  345. WOLFSSL_MSG("Init CTX failed");
  346. wolfSSL_CTX_free(ctx);
  347. return NULL;
  348. }
  349. XMEMSET(ctx->srp, 0, sizeof(Srp));
  350. }
  351. #endif
  352. }
  353. else {
  354. WOLFSSL_MSG("Alloc CTX failed, method freed");
  355. XFREE(method, heap, DYNAMIC_TYPE_METHOD);
  356. }
  357. WOLFSSL_LEAVE("WOLFSSL_CTX_new", 0);
  358. return ctx;
  359. }
  360. WOLFSSL_ABI
  361. WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method)
  362. {
  363. #ifdef WOLFSSL_HEAP_TEST
  364. /* if testing the heap hint then set top level CTX to have test value */
  365. return wolfSSL_CTX_new_ex(method, (void*)WOLFSSL_HEAP_TEST);
  366. #else
  367. return wolfSSL_CTX_new_ex(method, NULL);
  368. #endif
  369. }
  370. #ifdef OPENSSL_EXTRA
  371. /* increases CTX reference count to track proper time to "free" */
  372. int wolfSSL_CTX_up_ref(WOLFSSL_CTX* ctx)
  373. {
  374. int refCount = SSL_CTX_RefCount(ctx, 1);
  375. return ((refCount > 1) ? 1 : 0);
  376. }
  377. #endif
  378. WOLFSSL_ABI
  379. void wolfSSL_CTX_free(WOLFSSL_CTX* ctx)
  380. {
  381. WOLFSSL_ENTER("SSL_CTX_free");
  382. if (ctx) {
  383. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
  384. && !defined(NO_SHA256) && !defined(WC_NO_RNG)
  385. if (ctx->srp != NULL){
  386. if (ctx->srp_password != NULL){
  387. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  388. ctx->srp_password = NULL;
  389. }
  390. wc_SrpTerm(ctx->srp);
  391. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  392. ctx->srp = NULL;
  393. }
  394. #endif
  395. FreeSSL_Ctx(ctx);
  396. }
  397. WOLFSSL_LEAVE("SSL_CTX_free", 0);
  398. }
  399. #ifdef HAVE_ENCRYPT_THEN_MAC
  400. /**
  401. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  402. * The default value: enabled.
  403. *
  404. * ctx SSL/TLS context.
  405. * set Whether to allow or not: 1 is allow and 0 is disallow.
  406. * returns WOLFSSL_SUCCESS
  407. */
  408. int wolfSSL_CTX_AllowEncryptThenMac(WOLFSSL_CTX *ctx, int set)
  409. {
  410. ctx->disallowEncThenMac = !set;
  411. return WOLFSSL_SUCCESS;
  412. }
  413. /**
  414. * Sets whether Encrypt-Then-MAC extension can be negotiated against context.
  415. * The default value comes from context.
  416. *
  417. * ctx SSL/TLS context.
  418. * set Whether to allow or not: 1 is allow and 0 is disallow.
  419. * returns WOLFSSL_SUCCESS
  420. */
  421. int wolfSSL_AllowEncryptThenMac(WOLFSSL *ssl, int set)
  422. {
  423. ssl->options.disallowEncThenMac = !set;
  424. return WOLFSSL_SUCCESS;
  425. }
  426. #endif
  427. #ifdef SINGLE_THREADED
  428. /* no locking in single threaded mode, allow a CTX level rng to be shared with
  429. * WOLFSSL objects, WOLFSSL_SUCCESS on ok */
  430. int wolfSSL_CTX_new_rng(WOLFSSL_CTX* ctx)
  431. {
  432. WC_RNG* rng;
  433. int ret;
  434. if (ctx == NULL) {
  435. return BAD_FUNC_ARG;
  436. }
  437. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ctx->heap, DYNAMIC_TYPE_RNG);
  438. if (rng == NULL) {
  439. return MEMORY_E;
  440. }
  441. #ifndef HAVE_FIPS
  442. ret = wc_InitRng_ex(rng, ctx->heap, ctx->devId);
  443. #else
  444. ret = wc_InitRng(rng);
  445. #endif
  446. if (ret != 0) {
  447. XFREE(rng, ctx->heap, DYNAMIC_TYPE_RNG);
  448. return ret;
  449. }
  450. ctx->rng = rng;
  451. return WOLFSSL_SUCCESS;
  452. }
  453. #endif
  454. WOLFSSL_ABI
  455. WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx)
  456. {
  457. WOLFSSL* ssl = NULL;
  458. int ret = 0;
  459. (void)ret;
  460. WOLFSSL_ENTER("SSL_new");
  461. if (ctx == NULL)
  462. return ssl;
  463. ssl = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ctx->heap, DYNAMIC_TYPE_SSL);
  464. if (ssl)
  465. if ( (ret = InitSSL(ssl, ctx, 0)) < 0) {
  466. FreeSSL(ssl, ctx->heap);
  467. ssl = 0;
  468. }
  469. WOLFSSL_LEAVE("SSL_new", ret);
  470. return ssl;
  471. }
  472. WOLFSSL_ABI
  473. void wolfSSL_free(WOLFSSL* ssl)
  474. {
  475. WOLFSSL_ENTER("SSL_free");
  476. if (ssl)
  477. FreeSSL(ssl, ssl->ctx->heap);
  478. WOLFSSL_LEAVE("SSL_free", 0);
  479. }
  480. int wolfSSL_is_server(WOLFSSL* ssl)
  481. {
  482. if (ssl == NULL)
  483. return BAD_FUNC_ARG;
  484. return ssl->options.side == WOLFSSL_SERVER_END;
  485. }
  486. #ifdef HAVE_WRITE_DUP
  487. /*
  488. * Release resources around WriteDup object
  489. *
  490. * ssl WOLFSSL object
  491. *
  492. * no return, destruction so make best attempt
  493. */
  494. void FreeWriteDup(WOLFSSL* ssl)
  495. {
  496. int doFree = 0;
  497. WOLFSSL_ENTER("FreeWriteDup");
  498. if (ssl->dupWrite) {
  499. if (wc_LockMutex(&ssl->dupWrite->dupMutex) == 0) {
  500. ssl->dupWrite->dupCount--;
  501. if (ssl->dupWrite->dupCount == 0) {
  502. doFree = 1;
  503. } else {
  504. WOLFSSL_MSG("WriteDup count not zero, no full free");
  505. }
  506. wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  507. }
  508. }
  509. if (doFree) {
  510. WOLFSSL_MSG("Doing WriteDup full free, count to zero");
  511. wc_FreeMutex(&ssl->dupWrite->dupMutex);
  512. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  513. }
  514. }
  515. /*
  516. * duplicate existing ssl members into dup needed for writing
  517. *
  518. * dup write only WOLFSSL
  519. * ssl existing WOLFSSL
  520. *
  521. * 0 on success
  522. */
  523. static int DupSSL(WOLFSSL* dup, WOLFSSL* ssl)
  524. {
  525. /* shared dupWrite setup */
  526. ssl->dupWrite = (WriteDup*)XMALLOC(sizeof(WriteDup), ssl->heap,
  527. DYNAMIC_TYPE_WRITEDUP);
  528. if (ssl->dupWrite == NULL) {
  529. return MEMORY_E;
  530. }
  531. XMEMSET(ssl->dupWrite, 0, sizeof(WriteDup));
  532. if (wc_InitMutex(&ssl->dupWrite->dupMutex) != 0) {
  533. XFREE(ssl->dupWrite, ssl->heap, DYNAMIC_TYPE_WRITEDUP);
  534. ssl->dupWrite = NULL;
  535. return BAD_MUTEX_E;
  536. }
  537. ssl->dupWrite->dupCount = 2; /* both sides have a count to start */
  538. dup->dupWrite = ssl->dupWrite; /* each side uses */
  539. /* copy write parts over to dup writer */
  540. XMEMCPY(&dup->specs, &ssl->specs, sizeof(CipherSpecs));
  541. XMEMCPY(&dup->options, &ssl->options, sizeof(Options));
  542. XMEMCPY(&dup->keys, &ssl->keys, sizeof(Keys));
  543. XMEMCPY(&dup->encrypt, &ssl->encrypt, sizeof(Ciphers));
  544. /* dup side now owns encrypt/write ciphers */
  545. XMEMSET(&ssl->encrypt, 0, sizeof(Ciphers));
  546. dup->IOCB_WriteCtx = ssl->IOCB_WriteCtx;
  547. dup->wfd = ssl->wfd;
  548. dup->wflags = ssl->wflags;
  549. dup->hmac = ssl->hmac;
  550. #ifdef HAVE_TRUNCATED_HMAC
  551. dup->truncated_hmac = ssl->truncated_hmac;
  552. #endif
  553. /* unique side dup setup */
  554. dup->dupSide = WRITE_DUP_SIDE;
  555. ssl->dupSide = READ_DUP_SIDE;
  556. return 0;
  557. }
  558. /*
  559. * duplicate a WOLFSSL object post handshake for writing only
  560. * turn existing object into read only. Allows concurrent access from two
  561. * different threads.
  562. *
  563. * ssl existing WOLFSSL object
  564. *
  565. * return dup'd WOLFSSL object on success
  566. */
  567. WOLFSSL* wolfSSL_write_dup(WOLFSSL* ssl)
  568. {
  569. WOLFSSL* dup = NULL;
  570. int ret = 0;
  571. (void)ret;
  572. WOLFSSL_ENTER("wolfSSL_write_dup");
  573. if (ssl == NULL) {
  574. return ssl;
  575. }
  576. if (ssl->options.handShakeDone == 0) {
  577. WOLFSSL_MSG("wolfSSL_write_dup called before handshake complete");
  578. return NULL;
  579. }
  580. if (ssl->dupWrite) {
  581. WOLFSSL_MSG("wolfSSL_write_dup already called once");
  582. return NULL;
  583. }
  584. dup = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ssl->ctx->heap, DYNAMIC_TYPE_SSL);
  585. if (dup) {
  586. if ( (ret = InitSSL(dup, ssl->ctx, 1)) < 0) {
  587. FreeSSL(dup, ssl->ctx->heap);
  588. dup = NULL;
  589. } else if ( (ret = DupSSL(dup, ssl)) < 0) {
  590. FreeSSL(dup, ssl->ctx->heap);
  591. dup = NULL;
  592. }
  593. }
  594. WOLFSSL_LEAVE("wolfSSL_write_dup", ret);
  595. return dup;
  596. }
  597. /*
  598. * Notify write dup side of fatal error or close notify
  599. *
  600. * ssl WOLFSSL object
  601. * err Notify err
  602. *
  603. * 0 on success
  604. */
  605. int NotifyWriteSide(WOLFSSL* ssl, int err)
  606. {
  607. int ret;
  608. WOLFSSL_ENTER("NotifyWriteSide");
  609. ret = wc_LockMutex(&ssl->dupWrite->dupMutex);
  610. if (ret == 0) {
  611. ssl->dupWrite->dupErr = err;
  612. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  613. }
  614. return ret;
  615. }
  616. #endif /* HAVE_WRITE_DUP */
  617. #ifdef HAVE_POLY1305
  618. /* set if to use old poly 1 for yes 0 to use new poly */
  619. int wolfSSL_use_old_poly(WOLFSSL* ssl, int value)
  620. {
  621. (void)ssl;
  622. (void)value;
  623. #ifndef WOLFSSL_NO_TLS12
  624. WOLFSSL_ENTER("SSL_use_old_poly");
  625. WOLFSSL_MSG("Warning SSL connection auto detects old/new and this function"
  626. "is depreciated");
  627. ssl->options.oldPoly = (word16)value;
  628. WOLFSSL_LEAVE("SSL_use_old_poly", 0);
  629. #endif
  630. return 0;
  631. }
  632. #endif
  633. WOLFSSL_ABI
  634. int wolfSSL_set_fd(WOLFSSL* ssl, int fd)
  635. {
  636. int ret;
  637. WOLFSSL_ENTER("SSL_set_fd");
  638. if (ssl == NULL) {
  639. return BAD_FUNC_ARG;
  640. }
  641. ret = wolfSSL_set_read_fd(ssl, fd);
  642. if (ret == WOLFSSL_SUCCESS) {
  643. ret = wolfSSL_set_write_fd(ssl, fd);
  644. }
  645. return ret;
  646. }
  647. int wolfSSL_set_read_fd(WOLFSSL* ssl, int fd)
  648. {
  649. WOLFSSL_ENTER("SSL_set_read_fd");
  650. if (ssl == NULL) {
  651. return BAD_FUNC_ARG;
  652. }
  653. ssl->rfd = fd; /* not used directly to allow IO callbacks */
  654. ssl->IOCB_ReadCtx = &ssl->rfd;
  655. #ifdef WOLFSSL_DTLS
  656. if (ssl->options.dtls) {
  657. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx;
  658. ssl->buffers.dtlsCtx.rfd = fd;
  659. }
  660. #endif
  661. WOLFSSL_LEAVE("SSL_set_read_fd", WOLFSSL_SUCCESS);
  662. return WOLFSSL_SUCCESS;
  663. }
  664. int wolfSSL_set_write_fd(WOLFSSL* ssl, int fd)
  665. {
  666. WOLFSSL_ENTER("SSL_set_write_fd");
  667. if (ssl == NULL) {
  668. return BAD_FUNC_ARG;
  669. }
  670. ssl->wfd = fd; /* not used directly to allow IO callbacks */
  671. ssl->IOCB_WriteCtx = &ssl->wfd;
  672. #ifdef WOLFSSL_DTLS
  673. if (ssl->options.dtls) {
  674. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx;
  675. ssl->buffers.dtlsCtx.wfd = fd;
  676. }
  677. #endif
  678. WOLFSSL_LEAVE("SSL_set_write_fd", WOLFSSL_SUCCESS);
  679. return WOLFSSL_SUCCESS;
  680. }
  681. /**
  682. * Get the name of cipher at priority level passed in.
  683. */
  684. char* wolfSSL_get_cipher_list(int priority)
  685. {
  686. const CipherSuiteInfo* ciphers = GetCipherNames();
  687. if (priority >= GetCipherNamesSize() || priority < 0) {
  688. return 0;
  689. }
  690. return (char*)ciphers[priority].name;
  691. }
  692. /**
  693. * Get the name of cipher at priority level passed in.
  694. */
  695. char* wolfSSL_get_cipher_list_ex(WOLFSSL* ssl, int priority)
  696. {
  697. if (ssl == NULL) {
  698. return NULL;
  699. }
  700. else {
  701. const char* cipher;
  702. if ((cipher = wolfSSL_get_cipher_name_internal(ssl)) != NULL) {
  703. if (priority == 0) {
  704. return (char*)cipher;
  705. }
  706. else {
  707. return NULL;
  708. }
  709. }
  710. else {
  711. return wolfSSL_get_cipher_list(priority);
  712. }
  713. }
  714. }
  715. int wolfSSL_get_ciphers(char* buf, int len)
  716. {
  717. const CipherSuiteInfo* ciphers = GetCipherNames();
  718. int ciphersSz = GetCipherNamesSize();
  719. int i;
  720. int cipherNameSz;
  721. if (buf == NULL || len <= 0)
  722. return BAD_FUNC_ARG;
  723. /* Add each member to the buffer delimited by a : */
  724. for (i = 0; i < ciphersSz; i++) {
  725. cipherNameSz = (int)XSTRLEN(ciphers[i].name);
  726. if (cipherNameSz + 1 < len) {
  727. XSTRNCPY(buf, ciphers[i].name, len);
  728. buf += cipherNameSz;
  729. if (i < ciphersSz - 1)
  730. *buf++ = ':';
  731. *buf = 0;
  732. len -= cipherNameSz + 1;
  733. }
  734. else
  735. return BUFFER_E;
  736. }
  737. return WOLFSSL_SUCCESS;
  738. }
  739. #ifndef NO_ERROR_STRINGS
  740. /* places a list of all supported cipher suites in TLS_* format into "buf"
  741. * return WOLFSSL_SUCCESS on success */
  742. int wolfSSL_get_ciphers_iana(char* buf, int len)
  743. {
  744. const CipherSuiteInfo* ciphers = GetCipherNames();
  745. int ciphersSz = GetCipherNamesSize();
  746. int i;
  747. int cipherNameSz;
  748. if (buf == NULL || len <= 0)
  749. return BAD_FUNC_ARG;
  750. /* Add each member to the buffer delimited by a : */
  751. for (i = 0; i < ciphersSz; i++) {
  752. cipherNameSz = (int)XSTRLEN(ciphers[i].name_iana);
  753. if (cipherNameSz + 1 < len) {
  754. XSTRNCPY(buf, ciphers[i].name_iana, len);
  755. buf += cipherNameSz;
  756. if (i < ciphersSz - 1)
  757. *buf++ = ':';
  758. *buf = 0;
  759. len -= cipherNameSz + 1;
  760. }
  761. else
  762. return BUFFER_E;
  763. }
  764. return WOLFSSL_SUCCESS;
  765. }
  766. #endif /* NO_ERROR_STRINGS */
  767. const char* wolfSSL_get_shared_ciphers(WOLFSSL* ssl, char* buf, int len)
  768. {
  769. const char* cipher;
  770. if (ssl == NULL)
  771. return NULL;
  772. cipher = wolfSSL_get_cipher_name_iana(ssl);
  773. len = min(len, (int)(XSTRLEN(cipher) + 1));
  774. XMEMCPY(buf, cipher, len);
  775. return buf;
  776. }
  777. int wolfSSL_get_fd(const WOLFSSL* ssl)
  778. {
  779. int fd = -1;
  780. WOLFSSL_ENTER("SSL_get_fd");
  781. if (ssl) {
  782. fd = ssl->rfd;
  783. }
  784. WOLFSSL_LEAVE("SSL_get_fd", fd);
  785. return fd;
  786. }
  787. int wolfSSL_dtls(WOLFSSL* ssl)
  788. {
  789. int dtlsOpt = 0;
  790. if (ssl)
  791. dtlsOpt = ssl->options.dtls;
  792. return dtlsOpt;
  793. }
  794. #if !defined(NO_CERTS)
  795. /* Set whether mutual authentication is required for connections.
  796. * Server side only.
  797. *
  798. * ctx The SSL/TLS CTX object.
  799. * req 1 to indicate required and 0 when not.
  800. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  801. * 0 on success.
  802. */
  803. int wolfSSL_CTX_mutual_auth(WOLFSSL_CTX* ctx, int req)
  804. {
  805. if (ctx == NULL)
  806. return BAD_FUNC_ARG;
  807. if (ctx->method->side == WOLFSSL_CLIENT_END)
  808. return SIDE_ERROR;
  809. ctx->mutualAuth = (byte)req;
  810. return 0;
  811. }
  812. /* Set whether mutual authentication is required for the connection.
  813. * Server side only.
  814. *
  815. * ssl The SSL/TLS object.
  816. * req 1 to indicate required and 0 when not.
  817. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  818. * SIDE_ERROR when not a client and 0 on success.
  819. */
  820. int wolfSSL_mutual_auth(WOLFSSL* ssl, int req)
  821. {
  822. if (ssl == NULL)
  823. return BAD_FUNC_ARG;
  824. if (ssl->options.side == WOLFSSL_SERVER_END)
  825. return SIDE_ERROR;
  826. ssl->options.mutualAuth = (word16)req;
  827. return 0;
  828. }
  829. #endif /* NO_CERTS */
  830. #ifndef WOLFSSL_LEANPSK
  831. int wolfSSL_dtls_set_peer(WOLFSSL* ssl, void* peer, unsigned int peerSz)
  832. {
  833. #ifdef WOLFSSL_DTLS
  834. void* sa;
  835. if (ssl == NULL)
  836. return WOLFSSL_FAILURE;
  837. sa = (void*)XMALLOC(peerSz, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  838. if (sa != NULL) {
  839. if (ssl->buffers.dtlsCtx.peer.sa != NULL) {
  840. XFREE(ssl->buffers.dtlsCtx.peer.sa,ssl->heap,DYNAMIC_TYPE_SOCKADDR);
  841. ssl->buffers.dtlsCtx.peer.sa = NULL;
  842. }
  843. XMEMCPY(sa, peer, peerSz);
  844. ssl->buffers.dtlsCtx.peer.sa = sa;
  845. ssl->buffers.dtlsCtx.peer.sz = peerSz;
  846. return WOLFSSL_SUCCESS;
  847. }
  848. return WOLFSSL_FAILURE;
  849. #else
  850. (void)ssl;
  851. (void)peer;
  852. (void)peerSz;
  853. return WOLFSSL_NOT_IMPLEMENTED;
  854. #endif
  855. }
  856. int wolfSSL_dtls_get_peer(WOLFSSL* ssl, void* peer, unsigned int* peerSz)
  857. {
  858. #ifdef WOLFSSL_DTLS
  859. if (ssl == NULL) {
  860. return WOLFSSL_FAILURE;
  861. }
  862. if (peer != NULL && peerSz != NULL
  863. && *peerSz >= ssl->buffers.dtlsCtx.peer.sz
  864. && ssl->buffers.dtlsCtx.peer.sa != NULL) {
  865. *peerSz = ssl->buffers.dtlsCtx.peer.sz;
  866. XMEMCPY(peer, ssl->buffers.dtlsCtx.peer.sa, *peerSz);
  867. return WOLFSSL_SUCCESS;
  868. }
  869. return WOLFSSL_FAILURE;
  870. #else
  871. (void)ssl;
  872. (void)peer;
  873. (void)peerSz;
  874. return WOLFSSL_NOT_IMPLEMENTED;
  875. #endif
  876. }
  877. #if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS)
  878. int wolfSSL_CTX_dtls_set_sctp(WOLFSSL_CTX* ctx)
  879. {
  880. WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_sctp()");
  881. if (ctx == NULL)
  882. return BAD_FUNC_ARG;
  883. ctx->dtlsSctp = 1;
  884. return WOLFSSL_SUCCESS;
  885. }
  886. int wolfSSL_dtls_set_sctp(WOLFSSL* ssl)
  887. {
  888. WOLFSSL_ENTER("wolfSSL_dtls_set_sctp()");
  889. if (ssl == NULL)
  890. return BAD_FUNC_ARG;
  891. ssl->options.dtlsSctp = 1;
  892. return WOLFSSL_SUCCESS;
  893. }
  894. #endif /* WOLFSSL_DTLS && WOLFSSL_SCTP */
  895. #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
  896. defined(WOLFSSL_DTLS)
  897. int wolfSSL_CTX_dtls_set_mtu(WOLFSSL_CTX* ctx, word16 newMtu)
  898. {
  899. if (ctx == NULL || newMtu > MAX_RECORD_SIZE)
  900. return BAD_FUNC_ARG;
  901. ctx->dtlsMtuSz = newMtu;
  902. return WOLFSSL_SUCCESS;
  903. }
  904. int wolfSSL_dtls_set_mtu(WOLFSSL* ssl, word16 newMtu)
  905. {
  906. if (ssl == NULL)
  907. return BAD_FUNC_ARG;
  908. if (newMtu > MAX_RECORD_SIZE) {
  909. ssl->error = BAD_FUNC_ARG;
  910. return WOLFSSL_FAILURE;
  911. }
  912. ssl->dtlsMtuSz = newMtu;
  913. return WOLFSSL_SUCCESS;
  914. }
  915. #endif /* WOLFSSL_DTLS && (WOLFSSL_SCTP || WOLFSSL_DTLS_MTU) */
  916. #ifdef WOLFSSL_DTLS_DROP_STATS
  917. int wolfSSL_dtls_get_drop_stats(WOLFSSL* ssl,
  918. word32* macDropCount, word32* replayDropCount)
  919. {
  920. int ret;
  921. WOLFSSL_ENTER("wolfSSL_dtls_get_drop_stats()");
  922. if (ssl == NULL)
  923. ret = BAD_FUNC_ARG;
  924. else {
  925. ret = WOLFSSL_SUCCESS;
  926. if (macDropCount != NULL)
  927. *macDropCount = ssl->macDropCount;
  928. if (replayDropCount != NULL)
  929. *replayDropCount = ssl->replayDropCount;
  930. }
  931. WOLFSSL_LEAVE("wolfSSL_dtls_get_drop_stats()", ret);
  932. return ret;
  933. }
  934. #endif /* WOLFSSL_DTLS_DROP_STATS */
  935. #if defined(WOLFSSL_MULTICAST)
  936. int wolfSSL_CTX_mcast_set_member_id(WOLFSSL_CTX* ctx, word16 id)
  937. {
  938. int ret = 0;
  939. WOLFSSL_ENTER("wolfSSL_CTX_mcast_set_member_id()");
  940. if (ctx == NULL || id > 255)
  941. ret = BAD_FUNC_ARG;
  942. if (ret == 0) {
  943. ctx->haveEMS = 0;
  944. ctx->haveMcast = 1;
  945. ctx->mcastID = (byte)id;
  946. #ifndef WOLFSSL_USER_IO
  947. ctx->CBIORecv = EmbedReceiveFromMcast;
  948. #endif /* WOLFSSL_USER_IO */
  949. ret = WOLFSSL_SUCCESS;
  950. }
  951. WOLFSSL_LEAVE("wolfSSL_CTX_mcast_set_member_id()", ret);
  952. return ret;
  953. }
  954. int wolfSSL_mcast_get_max_peers(void)
  955. {
  956. return WOLFSSL_MULTICAST_PEERS;
  957. }
  958. #ifdef WOLFSSL_DTLS
  959. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  960. word32 second, word32 max)
  961. {
  962. word32 newCur = 0;
  963. if (cur < first)
  964. newCur = first;
  965. else if (cur < second)
  966. newCur = second;
  967. else if (cur < max)
  968. newCur = max;
  969. return newCur;
  970. }
  971. #endif /* WOLFSSL_DTLS */
  972. int wolfSSL_set_secret(WOLFSSL* ssl, word16 epoch,
  973. const byte* preMasterSecret, word32 preMasterSz,
  974. const byte* clientRandom, const byte* serverRandom,
  975. const byte* suite)
  976. {
  977. int ret = 0;
  978. WOLFSSL_ENTER("wolfSSL_set_secret()");
  979. if (ssl == NULL || preMasterSecret == NULL ||
  980. preMasterSz == 0 || preMasterSz > ENCRYPT_LEN ||
  981. clientRandom == NULL || serverRandom == NULL || suite == NULL) {
  982. ret = BAD_FUNC_ARG;
  983. }
  984. if (ret == 0) {
  985. XMEMCPY(ssl->arrays->preMasterSecret, preMasterSecret, preMasterSz);
  986. ssl->arrays->preMasterSz = preMasterSz;
  987. XMEMCPY(ssl->arrays->clientRandom, clientRandom, RAN_LEN);
  988. XMEMCPY(ssl->arrays->serverRandom, serverRandom, RAN_LEN);
  989. ssl->options.cipherSuite0 = suite[0];
  990. ssl->options.cipherSuite = suite[1];
  991. ret = SetCipherSpecs(ssl);
  992. }
  993. if (ret == 0)
  994. ret = MakeTlsMasterSecret(ssl);
  995. if (ret == 0) {
  996. ssl->keys.encryptionOn = 1;
  997. ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  998. }
  999. if (ret == 0) {
  1000. if (ssl->options.dtls) {
  1001. #ifdef WOLFSSL_DTLS
  1002. WOLFSSL_DTLS_PEERSEQ* peerSeq;
  1003. int i;
  1004. ssl->keys.dtls_epoch = epoch;
  1005. for (i = 0, peerSeq = ssl->keys.peerSeq;
  1006. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  1007. i++, peerSeq++) {
  1008. peerSeq->nextEpoch = epoch;
  1009. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  1010. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  1011. peerSeq->nextSeq_lo = 0;
  1012. peerSeq->nextSeq_hi = 0;
  1013. XMEMCPY(peerSeq->prevWindow, peerSeq->window, DTLS_SEQ_SZ);
  1014. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  1015. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  1016. ssl->ctx->mcastFirstSeq,
  1017. ssl->ctx->mcastSecondSeq,
  1018. ssl->ctx->mcastMaxSeq);
  1019. }
  1020. #else
  1021. (void)epoch;
  1022. #endif
  1023. }
  1024. FreeHandshakeResources(ssl);
  1025. ret = WOLFSSL_SUCCESS;
  1026. }
  1027. else {
  1028. if (ssl)
  1029. ssl->error = ret;
  1030. ret = WOLFSSL_FATAL_ERROR;
  1031. }
  1032. WOLFSSL_LEAVE("wolfSSL_set_secret()", ret);
  1033. return ret;
  1034. }
  1035. #ifdef WOLFSSL_DTLS
  1036. int wolfSSL_mcast_peer_add(WOLFSSL* ssl, word16 peerId, int remove)
  1037. {
  1038. WOLFSSL_DTLS_PEERSEQ* p = NULL;
  1039. int ret = WOLFSSL_SUCCESS;
  1040. int i;
  1041. WOLFSSL_ENTER("wolfSSL_mcast_peer_add()");
  1042. if (ssl == NULL || peerId > 255)
  1043. return BAD_FUNC_ARG;
  1044. if (!remove) {
  1045. /* Make sure it isn't already present, while keeping the first
  1046. * open spot. */
  1047. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1048. if (ssl->keys.peerSeq[i].peerId == INVALID_PEER_ID)
  1049. p = &ssl->keys.peerSeq[i];
  1050. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1051. WOLFSSL_MSG("Peer ID already in multicast peer list.");
  1052. p = NULL;
  1053. }
  1054. }
  1055. if (p != NULL) {
  1056. XMEMSET(p, 0, sizeof(WOLFSSL_DTLS_PEERSEQ));
  1057. p->peerId = peerId;
  1058. p->highwaterMark = UpdateHighwaterMark(0,
  1059. ssl->ctx->mcastFirstSeq,
  1060. ssl->ctx->mcastSecondSeq,
  1061. ssl->ctx->mcastMaxSeq);
  1062. }
  1063. else {
  1064. WOLFSSL_MSG("No room in peer list.");
  1065. ret = -1;
  1066. }
  1067. }
  1068. else {
  1069. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1070. if (ssl->keys.peerSeq[i].peerId == peerId)
  1071. p = &ssl->keys.peerSeq[i];
  1072. }
  1073. if (p != NULL) {
  1074. p->peerId = INVALID_PEER_ID;
  1075. }
  1076. else {
  1077. WOLFSSL_MSG("Peer not found in list.");
  1078. }
  1079. }
  1080. WOLFSSL_LEAVE("wolfSSL_mcast_peer_add()", ret);
  1081. return ret;
  1082. }
  1083. /* If peerId is in the list of peers and its last sequence number is non-zero,
  1084. * return 1, otherwise return 0. */
  1085. int wolfSSL_mcast_peer_known(WOLFSSL* ssl, unsigned short peerId)
  1086. {
  1087. int known = 0;
  1088. int i;
  1089. WOLFSSL_ENTER("wolfSSL_mcast_peer_known()");
  1090. if (ssl == NULL || peerId > 255) {
  1091. return BAD_FUNC_ARG;
  1092. }
  1093. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++) {
  1094. if (ssl->keys.peerSeq[i].peerId == peerId) {
  1095. if (ssl->keys.peerSeq[i].nextSeq_hi ||
  1096. ssl->keys.peerSeq[i].nextSeq_lo) {
  1097. known = 1;
  1098. }
  1099. break;
  1100. }
  1101. }
  1102. WOLFSSL_LEAVE("wolfSSL_mcast_peer_known()", known);
  1103. return known;
  1104. }
  1105. int wolfSSL_CTX_mcast_set_highwater_cb(WOLFSSL_CTX* ctx, word32 maxSeq,
  1106. word32 first, word32 second,
  1107. CallbackMcastHighwater cb)
  1108. {
  1109. if (ctx == NULL || (second && first > second) ||
  1110. first > maxSeq || second > maxSeq || cb == NULL) {
  1111. return BAD_FUNC_ARG;
  1112. }
  1113. ctx->mcastHwCb = cb;
  1114. ctx->mcastFirstSeq = first;
  1115. ctx->mcastSecondSeq = second;
  1116. ctx->mcastMaxSeq = maxSeq;
  1117. return WOLFSSL_SUCCESS;
  1118. }
  1119. int wolfSSL_mcast_set_highwater_ctx(WOLFSSL* ssl, void* ctx)
  1120. {
  1121. if (ssl == NULL || ctx == NULL)
  1122. return BAD_FUNC_ARG;
  1123. ssl->mcastHwCbCtx = ctx;
  1124. return WOLFSSL_SUCCESS;
  1125. }
  1126. #endif /* WOLFSSL_DTLS */
  1127. #endif /* WOLFSSL_MULTICAST */
  1128. #endif /* WOLFSSL_LEANPSK */
  1129. /* return underlying connect or accept, WOLFSSL_SUCCESS on ok */
  1130. int wolfSSL_negotiate(WOLFSSL* ssl)
  1131. {
  1132. int err = WOLFSSL_FATAL_ERROR;
  1133. WOLFSSL_ENTER("wolfSSL_negotiate");
  1134. #ifndef NO_WOLFSSL_SERVER
  1135. if (ssl->options.side == WOLFSSL_SERVER_END) {
  1136. #ifdef WOLFSSL_TLS13
  1137. if (IsAtLeastTLSv1_3(ssl->version))
  1138. err = wolfSSL_accept_TLSv13(ssl);
  1139. else
  1140. #endif
  1141. err = wolfSSL_accept(ssl);
  1142. }
  1143. #endif
  1144. #ifndef NO_WOLFSSL_CLIENT
  1145. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1146. #ifdef WOLFSSL_TLS13
  1147. if (IsAtLeastTLSv1_3(ssl->version))
  1148. err = wolfSSL_connect_TLSv13(ssl);
  1149. else
  1150. #endif
  1151. err = wolfSSL_connect(ssl);
  1152. }
  1153. #endif
  1154. (void)ssl;
  1155. WOLFSSL_LEAVE("wolfSSL_negotiate", err);
  1156. return err;
  1157. }
  1158. WOLFSSL_ABI
  1159. WC_RNG* wolfSSL_GetRNG(WOLFSSL* ssl)
  1160. {
  1161. if (ssl) {
  1162. return ssl->rng;
  1163. }
  1164. return NULL;
  1165. }
  1166. #ifndef WOLFSSL_LEANPSK
  1167. /* object size based on build */
  1168. int wolfSSL_GetObjectSize(void)
  1169. {
  1170. #ifdef SHOW_SIZES
  1171. printf("sizeof suites = %lu\n", (unsigned long)sizeof(Suites));
  1172. printf("sizeof ciphers(2) = %lu\n", (unsigned long)sizeof(Ciphers));
  1173. #ifndef NO_RC4
  1174. printf("\tsizeof arc4 = %lu\n", (unsigned long)sizeof(Arc4));
  1175. #endif
  1176. printf("\tsizeof aes = %lu\n", (unsigned long)sizeof(Aes));
  1177. #ifndef NO_DES3
  1178. printf("\tsizeof des3 = %lu\n", (unsigned long)sizeof(Des3));
  1179. #endif
  1180. #ifndef NO_RABBIT
  1181. printf("\tsizeof rabbit = %lu\n", (unsigned long)sizeof(Rabbit));
  1182. #endif
  1183. #ifdef HAVE_CHACHA
  1184. printf("\tsizeof chacha = %lu\n", (unsigned long)sizeof(ChaCha));
  1185. #endif
  1186. printf("sizeof cipher specs = %lu\n", (unsigned long)sizeof(CipherSpecs));
  1187. printf("sizeof keys = %lu\n", (unsigned long)sizeof(Keys));
  1188. printf("sizeof Hashes(2) = %lu\n", (unsigned long)sizeof(Hashes));
  1189. #ifndef NO_MD5
  1190. printf("\tsizeof MD5 = %lu\n", (unsigned long)sizeof(wc_Md5));
  1191. #endif
  1192. #ifndef NO_SHA
  1193. printf("\tsizeof SHA = %lu\n", (unsigned long)sizeof(wc_Sha));
  1194. #endif
  1195. #ifdef WOLFSSL_SHA224
  1196. printf("\tsizeof SHA224 = %lu\n", (unsigned long)sizeof(wc_Sha224));
  1197. #endif
  1198. #ifndef NO_SHA256
  1199. printf("\tsizeof SHA256 = %lu\n", (unsigned long)sizeof(wc_Sha256));
  1200. #endif
  1201. #ifdef WOLFSSL_SHA384
  1202. printf("\tsizeof SHA384 = %lu\n", (unsigned long)sizeof(wc_Sha384));
  1203. #endif
  1204. #ifdef WOLFSSL_SHA384
  1205. printf("\tsizeof SHA512 = %lu\n", (unsigned long)sizeof(wc_Sha512));
  1206. #endif
  1207. printf("sizeof Buffers = %lu\n", (unsigned long)sizeof(Buffers));
  1208. printf("sizeof Options = %lu\n", (unsigned long)sizeof(Options));
  1209. printf("sizeof Arrays = %lu\n", (unsigned long)sizeof(Arrays));
  1210. #ifndef NO_RSA
  1211. printf("sizeof RsaKey = %lu\n", (unsigned long)sizeof(RsaKey));
  1212. #endif
  1213. #ifdef HAVE_ECC
  1214. printf("sizeof ecc_key = %lu\n", (unsigned long)sizeof(ecc_key));
  1215. #endif
  1216. printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long)sizeof(WOLFSSL_CIPHER));
  1217. printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long)sizeof(WOLFSSL_SESSION));
  1218. printf("sizeof WOLFSSL = %lu\n", (unsigned long)sizeof(WOLFSSL));
  1219. printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long)sizeof(WOLFSSL_CTX));
  1220. #endif
  1221. return sizeof(WOLFSSL);
  1222. }
  1223. int wolfSSL_CTX_GetObjectSize(void)
  1224. {
  1225. return sizeof(WOLFSSL_CTX);
  1226. }
  1227. int wolfSSL_METHOD_GetObjectSize(void)
  1228. {
  1229. return sizeof(WOLFSSL_METHOD);
  1230. }
  1231. #endif
  1232. #ifdef WOLFSSL_STATIC_MEMORY
  1233. int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method,
  1234. unsigned char* buf, unsigned int sz,
  1235. int flag, int max)
  1236. {
  1237. WOLFSSL_HEAP* heap;
  1238. WOLFSSL_HEAP_HINT* hint;
  1239. word32 idx = 0;
  1240. if (ctx == NULL || buf == NULL) {
  1241. return BAD_FUNC_ARG;
  1242. }
  1243. if (*ctx == NULL && method == NULL) {
  1244. return BAD_FUNC_ARG;
  1245. }
  1246. if (*ctx == NULL || (*ctx)->heap == NULL) {
  1247. if (sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT) > sz - idx) {
  1248. return BUFFER_E; /* not enough memory for structures */
  1249. }
  1250. heap = (WOLFSSL_HEAP*)buf;
  1251. idx += sizeof(WOLFSSL_HEAP);
  1252. if (wolfSSL_init_memory_heap(heap) != 0) {
  1253. return WOLFSSL_FAILURE;
  1254. }
  1255. hint = (WOLFSSL_HEAP_HINT*)(buf + idx);
  1256. idx += sizeof(WOLFSSL_HEAP_HINT);
  1257. XMEMSET(hint, 0, sizeof(WOLFSSL_HEAP_HINT));
  1258. hint->memory = heap;
  1259. if (*ctx && (*ctx)->heap == NULL) {
  1260. (*ctx)->heap = (void*)hint;
  1261. }
  1262. }
  1263. else {
  1264. #ifdef WOLFSSL_HEAP_TEST
  1265. /* do not load in memory if test has been set */
  1266. if ((*ctx)->heap == (void*)WOLFSSL_HEAP_TEST) {
  1267. return WOLFSSL_SUCCESS;
  1268. }
  1269. #endif
  1270. hint = (WOLFSSL_HEAP_HINT*)((*ctx)->heap);
  1271. heap = hint->memory;
  1272. }
  1273. if (wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap) != 1) {
  1274. WOLFSSL_MSG("Error partitioning memory");
  1275. return WOLFSSL_FAILURE;
  1276. }
  1277. /* create ctx if needed */
  1278. if (*ctx == NULL) {
  1279. *ctx = wolfSSL_CTX_new_ex(method(hint), hint);
  1280. if (*ctx == NULL) {
  1281. WOLFSSL_MSG("Error creating ctx");
  1282. return WOLFSSL_FAILURE;
  1283. }
  1284. }
  1285. /* determine what max applies too */
  1286. if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) {
  1287. heap->maxIO = max;
  1288. }
  1289. else { /* general memory used in handshakes */
  1290. heap->maxHa = max;
  1291. }
  1292. heap->flag |= flag;
  1293. (void)max;
  1294. (void)method;
  1295. return WOLFSSL_SUCCESS;
  1296. }
  1297. int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_CONN_STATS* mem_stats)
  1298. {
  1299. if (ssl == NULL) {
  1300. return BAD_FUNC_ARG;
  1301. }
  1302. WOLFSSL_ENTER("wolfSSL_is_static_memory");
  1303. /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */
  1304. if (mem_stats != NULL && ssl->heap != NULL) {
  1305. WOLFSSL_HEAP_HINT* hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  1306. WOLFSSL_HEAP* heap = hint->memory;
  1307. if (heap->flag & WOLFMEM_TRACK_STATS && hint->stats != NULL) {
  1308. XMEMCPY(mem_stats, hint->stats, sizeof(WOLFSSL_MEM_CONN_STATS));
  1309. }
  1310. }
  1311. return (ssl->heap) ? 1 : 0;
  1312. }
  1313. int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats)
  1314. {
  1315. if (ctx == NULL) {
  1316. return BAD_FUNC_ARG;
  1317. }
  1318. WOLFSSL_ENTER("wolfSSL_CTX_is_static_memory");
  1319. /* fill out statistics if wanted */
  1320. if (mem_stats != NULL && ctx->heap != NULL) {
  1321. WOLFSSL_HEAP* heap = ((WOLFSSL_HEAP_HINT*)(ctx->heap))->memory;
  1322. if (wolfSSL_GetMemStats(heap, mem_stats) != 1) {
  1323. return MEMORY_E;
  1324. }
  1325. }
  1326. return (ctx->heap) ? 1 : 0;
  1327. }
  1328. #endif /* WOLFSSL_STATIC_MEMORY */
  1329. /* return max record layer size plaintext input size */
  1330. int wolfSSL_GetMaxOutputSize(WOLFSSL* ssl)
  1331. {
  1332. WOLFSSL_ENTER("wolfSSL_GetMaxOutputSize");
  1333. if (ssl == NULL)
  1334. return BAD_FUNC_ARG;
  1335. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  1336. WOLFSSL_MSG("Handshake not complete yet");
  1337. return BAD_FUNC_ARG;
  1338. }
  1339. return wolfSSL_GetMaxRecordSize(ssl, OUTPUT_RECORD_SIZE);
  1340. }
  1341. /* return record layer size of plaintext input size */
  1342. int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz)
  1343. {
  1344. int maxSize;
  1345. WOLFSSL_ENTER("wolfSSL_GetOutputSize");
  1346. if (inSz < 0)
  1347. return BAD_FUNC_ARG;
  1348. maxSize = wolfSSL_GetMaxOutputSize(ssl);
  1349. if (maxSize < 0)
  1350. return maxSize; /* error */
  1351. if (inSz > maxSize)
  1352. return INPUT_SIZE_E;
  1353. return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
  1354. }
  1355. #ifdef HAVE_ECC
  1356. int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1357. {
  1358. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1359. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1360. return BAD_FUNC_ARG;
  1361. }
  1362. ctx->minEccKeySz = keySz / 8;
  1363. #ifndef NO_CERTS
  1364. ctx->cm->minEccKeySz = keySz / 8;
  1365. #endif
  1366. return WOLFSSL_SUCCESS;
  1367. }
  1368. int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz)
  1369. {
  1370. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1371. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1372. return BAD_FUNC_ARG;
  1373. }
  1374. ssl->options.minEccKeySz = keySz / 8;
  1375. return WOLFSSL_SUCCESS;
  1376. }
  1377. #endif /* !NO_RSA */
  1378. #ifndef NO_RSA
  1379. int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz)
  1380. {
  1381. if (ctx == NULL || keySz < 0 || keySz % 8 != 0) {
  1382. WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null");
  1383. return BAD_FUNC_ARG;
  1384. }
  1385. ctx->minRsaKeySz = keySz / 8;
  1386. ctx->cm->minRsaKeySz = keySz / 8;
  1387. return WOLFSSL_SUCCESS;
  1388. }
  1389. int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz)
  1390. {
  1391. if (ssl == NULL || keySz < 0 || keySz % 8 != 0) {
  1392. WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null");
  1393. return BAD_FUNC_ARG;
  1394. }
  1395. ssl->options.minRsaKeySz = keySz / 8;
  1396. return WOLFSSL_SUCCESS;
  1397. }
  1398. #endif /* !NO_RSA */
  1399. #ifndef NO_DH
  1400. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1401. int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz,
  1402. const unsigned char* g, int gSz)
  1403. {
  1404. WOLFSSL_ENTER("wolfSSL_SetTmpDH");
  1405. if (ssl == NULL || p == NULL || g == NULL)
  1406. return BAD_FUNC_ARG;
  1407. if ((word16)pSz < ssl->options.minDhKeySz)
  1408. return DH_KEY_SIZE_E;
  1409. if ((word16)pSz > ssl->options.maxDhKeySz)
  1410. return DH_KEY_SIZE_E;
  1411. /* this function is for server only */
  1412. if (ssl->options.side == WOLFSSL_CLIENT_END)
  1413. return SIDE_ERROR;
  1414. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1415. !defined(HAVE_SELFTEST)
  1416. ssl->options.dhKeyTested = 0;
  1417. ssl->options.dhDoKeyTest = 1;
  1418. #endif
  1419. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  1420. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1421. ssl->buffers.serverDH_P.buffer = NULL;
  1422. }
  1423. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  1424. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1425. ssl->buffers.serverDH_G.buffer = NULL;
  1426. }
  1427. ssl->buffers.weOwnDH = 1; /* SSL owns now */
  1428. ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap,
  1429. DYNAMIC_TYPE_PUBLIC_KEY);
  1430. if (ssl->buffers.serverDH_P.buffer == NULL)
  1431. return MEMORY_E;
  1432. ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap,
  1433. DYNAMIC_TYPE_PUBLIC_KEY);
  1434. if (ssl->buffers.serverDH_G.buffer == NULL) {
  1435. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1436. ssl->buffers.serverDH_P.buffer = NULL;
  1437. return MEMORY_E;
  1438. }
  1439. ssl->buffers.serverDH_P.length = pSz;
  1440. ssl->buffers.serverDH_G.length = gSz;
  1441. XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz);
  1442. XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz);
  1443. ssl->options.haveDH = 1;
  1444. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  1445. word16 havePSK;
  1446. word16 haveRSA;
  1447. int keySz = 0;
  1448. #ifndef NO_PSK
  1449. havePSK = ssl->options.havePSK;
  1450. #else
  1451. havePSK = 0;
  1452. #endif
  1453. #ifdef NO_RSA
  1454. haveRSA = 0;
  1455. #else
  1456. haveRSA = 1;
  1457. #endif
  1458. #ifndef NO_CERTS
  1459. keySz = ssl->buffers.keySz;
  1460. #endif
  1461. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  1462. ssl->options.haveDH, ssl->options.haveNTRU,
  1463. ssl->options.haveECDSAsig, ssl->options.haveECC,
  1464. ssl->options.haveStaticECC, ssl->options.side);
  1465. }
  1466. WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0);
  1467. return WOLFSSL_SUCCESS;
  1468. }
  1469. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1470. !defined(HAVE_SELFTEST)
  1471. /* Enables or disables the session's DH key prime test. */
  1472. int wolfSSL_SetEnableDhKeyTest(WOLFSSL* ssl, int enable)
  1473. {
  1474. WOLFSSL_ENTER("wolfSSL_SetEnableDhKeyTest");
  1475. if (ssl == NULL)
  1476. return BAD_FUNC_ARG;
  1477. if (!enable)
  1478. ssl->options.dhDoKeyTest = 0;
  1479. else
  1480. ssl->options.dhDoKeyTest = 1;
  1481. WOLFSSL_LEAVE("wolfSSL_SetEnableDhKeyTest", WOLFSSL_SUCCESS);
  1482. return WOLFSSL_SUCCESS;
  1483. }
  1484. #endif
  1485. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  1486. int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz,
  1487. const unsigned char* g, int gSz)
  1488. {
  1489. WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH");
  1490. if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG;
  1491. if ((word16)pSz < ctx->minDhKeySz)
  1492. return DH_KEY_SIZE_E;
  1493. if ((word16)pSz > ctx->maxDhKeySz)
  1494. return DH_KEY_SIZE_E;
  1495. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  1496. !defined(HAVE_SELFTEST)
  1497. {
  1498. DhKey checkKey;
  1499. WC_RNG rng;
  1500. int error, freeKey = 0;
  1501. error = wc_InitRng(&rng);
  1502. if (!error)
  1503. error = wc_InitDhKey(&checkKey);
  1504. if (!error) {
  1505. freeKey = 1;
  1506. error = wc_DhSetCheckKey(&checkKey,
  1507. p, pSz, g, gSz, NULL, 0, 0, &rng);
  1508. }
  1509. if (freeKey)
  1510. wc_FreeDhKey(&checkKey);
  1511. wc_FreeRng(&rng);
  1512. if (error)
  1513. return error;
  1514. ctx->dhKeyTested = 1;
  1515. }
  1516. #endif
  1517. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1518. ctx->serverDH_P.buffer = NULL;
  1519. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1520. ctx->serverDH_G.buffer = NULL;
  1521. ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1522. if (ctx->serverDH_P.buffer == NULL)
  1523. return MEMORY_E;
  1524. ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1525. if (ctx->serverDH_G.buffer == NULL) {
  1526. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1527. ctx->serverDH_P.buffer = NULL;
  1528. return MEMORY_E;
  1529. }
  1530. ctx->serverDH_P.length = pSz;
  1531. ctx->serverDH_G.length = gSz;
  1532. XMEMCPY(ctx->serverDH_P.buffer, p, pSz);
  1533. XMEMCPY(ctx->serverDH_G.buffer, g, gSz);
  1534. ctx->haveDH = 1;
  1535. WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0);
  1536. return WOLFSSL_SUCCESS;
  1537. }
  1538. int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz)
  1539. {
  1540. if (ctx == NULL || keySz > 16000 || keySz % 8 != 0)
  1541. return BAD_FUNC_ARG;
  1542. ctx->minDhKeySz = keySz / 8;
  1543. return WOLFSSL_SUCCESS;
  1544. }
  1545. int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz)
  1546. {
  1547. if (ssl == NULL || keySz > 16000 || keySz % 8 != 0)
  1548. return BAD_FUNC_ARG;
  1549. ssl->options.minDhKeySz = keySz / 8;
  1550. return WOLFSSL_SUCCESS;
  1551. }
  1552. int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz)
  1553. {
  1554. if (ctx == NULL || keySz > 16000 || keySz % 8 != 0)
  1555. return BAD_FUNC_ARG;
  1556. ctx->maxDhKeySz = keySz / 8;
  1557. return WOLFSSL_SUCCESS;
  1558. }
  1559. int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz)
  1560. {
  1561. if (ssl == NULL || keySz > 16000 || keySz % 8 != 0)
  1562. return BAD_FUNC_ARG;
  1563. ssl->options.maxDhKeySz = keySz / 8;
  1564. return WOLFSSL_SUCCESS;
  1565. }
  1566. int wolfSSL_GetDhKey_Sz(WOLFSSL* ssl)
  1567. {
  1568. if (ssl == NULL)
  1569. return BAD_FUNC_ARG;
  1570. return (ssl->options.dhKeySz * 8);
  1571. }
  1572. #endif /* !NO_DH */
  1573. WOLFSSL_ABI
  1574. int wolfSSL_write(WOLFSSL* ssl, const void* data, int sz)
  1575. {
  1576. int ret;
  1577. WOLFSSL_ENTER("SSL_write()");
  1578. if (ssl == NULL || data == NULL || sz < 0)
  1579. return BAD_FUNC_ARG;
  1580. #ifdef WOLFSSL_EARLY_DATA
  1581. if (ssl->earlyData != no_early_data && (ret = wolfSSL_negotiate(ssl)) < 0) {
  1582. ssl->error = ret;
  1583. return WOLFSSL_FATAL_ERROR;
  1584. }
  1585. ssl->earlyData = no_early_data;
  1586. #endif
  1587. #ifdef HAVE_WRITE_DUP
  1588. { /* local variable scope */
  1589. int dupErr = 0; /* local copy */
  1590. ret = 0;
  1591. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  1592. WOLFSSL_MSG("Read dup side cannot write");
  1593. return WRITE_DUP_WRITE_E;
  1594. }
  1595. if (ssl->dupWrite) {
  1596. if (wc_LockMutex(&ssl->dupWrite->dupMutex) != 0) {
  1597. return BAD_MUTEX_E;
  1598. }
  1599. dupErr = ssl->dupWrite->dupErr;
  1600. ret = wc_UnLockMutex(&ssl->dupWrite->dupMutex);
  1601. }
  1602. if (ret != 0) {
  1603. ssl->error = ret; /* high priority fatal error */
  1604. return WOLFSSL_FATAL_ERROR;
  1605. }
  1606. if (dupErr != 0) {
  1607. WOLFSSL_MSG("Write dup error from other side");
  1608. ssl->error = dupErr;
  1609. return WOLFSSL_FATAL_ERROR;
  1610. }
  1611. }
  1612. #endif
  1613. #ifdef HAVE_ERRNO_H
  1614. errno = 0;
  1615. #endif
  1616. #ifdef OPENSSL_EXTRA
  1617. if (ssl->CBIS != NULL) {
  1618. ssl->CBIS(ssl, SSL_CB_WRITE, SSL_SUCCESS);
  1619. ssl->cbmode = SSL_CB_WRITE;
  1620. }
  1621. #endif
  1622. ret = SendData(ssl, data, sz);
  1623. WOLFSSL_LEAVE("SSL_write()", ret);
  1624. if (ret < 0)
  1625. return WOLFSSL_FATAL_ERROR;
  1626. else
  1627. return ret;
  1628. }
  1629. static int wolfSSL_read_internal(WOLFSSL* ssl, void* data, int sz, int peek)
  1630. {
  1631. int ret;
  1632. WOLFSSL_ENTER("wolfSSL_read_internal()");
  1633. if (ssl == NULL || data == NULL || sz < 0)
  1634. return BAD_FUNC_ARG;
  1635. #ifdef HAVE_WRITE_DUP
  1636. if (ssl->dupWrite && ssl->dupSide == WRITE_DUP_SIDE) {
  1637. WOLFSSL_MSG("Write dup side cannot read");
  1638. return WRITE_DUP_READ_E;
  1639. }
  1640. #endif
  1641. #ifdef HAVE_ERRNO_H
  1642. errno = 0;
  1643. #endif
  1644. #ifdef WOLFSSL_DTLS
  1645. if (ssl->options.dtls) {
  1646. ssl->dtls_expected_rx = max(sz + 100, MAX_MTU);
  1647. #ifdef WOLFSSL_SCTP
  1648. if (ssl->options.dtlsSctp)
  1649. #endif
  1650. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  1651. ssl->dtls_expected_rx = max(ssl->dtls_expected_rx, ssl->dtlsMtuSz);
  1652. #endif
  1653. }
  1654. #endif
  1655. sz = wolfSSL_GetMaxRecordSize(ssl, sz);
  1656. ret = ReceiveData(ssl, (byte*)data, sz, peek);
  1657. #ifdef HAVE_WRITE_DUP
  1658. if (ssl->dupWrite) {
  1659. if (ssl->error != 0 && ssl->error != WANT_READ
  1660. #ifdef WOLFSSL_ASYNC_CRYPT
  1661. && ssl->error != WC_PENDING_E
  1662. #endif
  1663. ) {
  1664. int notifyErr;
  1665. WOLFSSL_MSG("Notifying write side of fatal read error");
  1666. notifyErr = NotifyWriteSide(ssl, ssl->error);
  1667. if (notifyErr < 0) {
  1668. ret = ssl->error = notifyErr;
  1669. }
  1670. }
  1671. }
  1672. #endif
  1673. WOLFSSL_LEAVE("wolfSSL_read_internal()", ret);
  1674. if (ret < 0)
  1675. return WOLFSSL_FATAL_ERROR;
  1676. else
  1677. return ret;
  1678. }
  1679. int wolfSSL_peek(WOLFSSL* ssl, void* data, int sz)
  1680. {
  1681. WOLFSSL_ENTER("wolfSSL_peek()");
  1682. return wolfSSL_read_internal(ssl, data, sz, TRUE);
  1683. }
  1684. WOLFSSL_ABI
  1685. int wolfSSL_read(WOLFSSL* ssl, void* data, int sz)
  1686. {
  1687. WOLFSSL_ENTER("wolfSSL_read()");
  1688. #ifdef OPENSSL_EXTRA
  1689. if (ssl->CBIS != NULL) {
  1690. ssl->CBIS(ssl, SSL_CB_READ, SSL_SUCCESS);
  1691. ssl->cbmode = SSL_CB_READ;
  1692. }
  1693. #endif
  1694. return wolfSSL_read_internal(ssl, data, sz, FALSE);
  1695. }
  1696. #ifdef WOLFSSL_MULTICAST
  1697. int wolfSSL_mcast_read(WOLFSSL* ssl, word16* id, void* data, int sz)
  1698. {
  1699. int ret = 0;
  1700. WOLFSSL_ENTER("wolfSSL_mcast_read()");
  1701. if (ssl == NULL)
  1702. return BAD_FUNC_ARG;
  1703. ret = wolfSSL_read_internal(ssl, data, sz, FALSE);
  1704. if (ssl->options.dtls && ssl->options.haveMcast && id != NULL)
  1705. *id = ssl->keys.curPeerId;
  1706. return ret;
  1707. }
  1708. #endif /* WOLFSSL_MULTICAST */
  1709. /* helpers to set the device id, WOLFSSL_SUCCESS on ok */
  1710. WOLFSSL_ABI
  1711. int wolfSSL_SetDevId(WOLFSSL* ssl, int devId)
  1712. {
  1713. if (ssl == NULL)
  1714. return BAD_FUNC_ARG;
  1715. ssl->devId = devId;
  1716. return WOLFSSL_SUCCESS;
  1717. }
  1718. WOLFSSL_ABI
  1719. int wolfSSL_CTX_SetDevId(WOLFSSL_CTX* ctx, int devId)
  1720. {
  1721. if (ctx == NULL)
  1722. return BAD_FUNC_ARG;
  1723. ctx->devId = devId;
  1724. return WOLFSSL_SUCCESS;
  1725. }
  1726. /* helpers to get device id and heap */
  1727. WOLFSSL_ABI
  1728. int wolfSSL_CTX_GetDevId(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  1729. {
  1730. int devId = INVALID_DEVID;
  1731. if (ctx != NULL)
  1732. devId = ctx->devId;
  1733. else if (ssl != NULL)
  1734. devId = ssl->devId;
  1735. return devId;
  1736. }
  1737. void* wolfSSL_CTX_GetHeap(WOLFSSL_CTX* ctx, WOLFSSL* ssl)
  1738. {
  1739. void* heap = NULL;
  1740. if (ctx != NULL)
  1741. heap = ctx->heap;
  1742. else if (ssl != NULL)
  1743. heap = ssl->heap;
  1744. return heap;
  1745. }
  1746. #ifdef HAVE_SNI
  1747. WOLFSSL_ABI
  1748. int wolfSSL_UseSNI(WOLFSSL* ssl, byte type, const void* data, word16 size)
  1749. {
  1750. if (ssl == NULL)
  1751. return BAD_FUNC_ARG;
  1752. return TLSX_UseSNI(&ssl->extensions, type, data, size, ssl->heap);
  1753. }
  1754. WOLFSSL_ABI
  1755. int wolfSSL_CTX_UseSNI(WOLFSSL_CTX* ctx, byte type, const void* data,
  1756. word16 size)
  1757. {
  1758. if (ctx == NULL)
  1759. return BAD_FUNC_ARG;
  1760. return TLSX_UseSNI(&ctx->extensions, type, data, size, ctx->heap);
  1761. }
  1762. #ifndef NO_WOLFSSL_SERVER
  1763. void wolfSSL_SNI_SetOptions(WOLFSSL* ssl, byte type, byte options)
  1764. {
  1765. if (ssl && ssl->extensions)
  1766. TLSX_SNI_SetOptions(ssl->extensions, type, options);
  1767. }
  1768. void wolfSSL_CTX_SNI_SetOptions(WOLFSSL_CTX* ctx, byte type, byte options)
  1769. {
  1770. if (ctx && ctx->extensions)
  1771. TLSX_SNI_SetOptions(ctx->extensions, type, options);
  1772. }
  1773. byte wolfSSL_SNI_Status(WOLFSSL* ssl, byte type)
  1774. {
  1775. return TLSX_SNI_Status(ssl ? ssl->extensions : NULL, type);
  1776. }
  1777. word16 wolfSSL_SNI_GetRequest(WOLFSSL* ssl, byte type, void** data)
  1778. {
  1779. if (data)
  1780. *data = NULL;
  1781. if (ssl && ssl->extensions)
  1782. return TLSX_SNI_GetRequest(ssl->extensions, type, data);
  1783. return 0;
  1784. }
  1785. int wolfSSL_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  1786. byte type, byte* sni, word32* inOutSz)
  1787. {
  1788. if (clientHello && helloSz > 0 && sni && inOutSz && *inOutSz > 0)
  1789. return TLSX_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
  1790. return BAD_FUNC_ARG;
  1791. }
  1792. #endif /* NO_WOLFSSL_SERVER */
  1793. #endif /* HAVE_SNI */
  1794. #ifdef HAVE_TRUSTED_CA
  1795. WOLFSSL_API int wolfSSL_UseTrustedCA(WOLFSSL* ssl, byte type,
  1796. const byte* certId, word32 certIdSz)
  1797. {
  1798. if (ssl == NULL)
  1799. return BAD_FUNC_ARG;
  1800. if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED) {
  1801. if (certId != NULL || certIdSz != 0)
  1802. return BAD_FUNC_ARG;
  1803. }
  1804. else if (type == WOLFSSL_TRUSTED_CA_X509_NAME) {
  1805. if (certId == NULL || certIdSz == 0)
  1806. return BAD_FUNC_ARG;
  1807. }
  1808. #ifndef NO_SHA
  1809. else if (type == WOLFSSL_TRUSTED_CA_KEY_SHA1 ||
  1810. type == WOLFSSL_TRUSTED_CA_CERT_SHA1) {
  1811. if (certId == NULL || certIdSz != WC_SHA_DIGEST_SIZE)
  1812. return BAD_FUNC_ARG;
  1813. }
  1814. #endif
  1815. else
  1816. return BAD_FUNC_ARG;
  1817. return TLSX_UseTrustedCA(&ssl->extensions,
  1818. type, certId, certIdSz, ssl->heap);
  1819. }
  1820. #endif /* HAVE_TRUSTED_CA */
  1821. #ifdef HAVE_MAX_FRAGMENT
  1822. #ifndef NO_WOLFSSL_CLIENT
  1823. int wolfSSL_UseMaxFragment(WOLFSSL* ssl, byte mfl)
  1824. {
  1825. if (ssl == NULL)
  1826. return BAD_FUNC_ARG;
  1827. #ifdef WOLFSSL_ALLOW_MAX_FRAGMENT_ADJUST
  1828. /* The following is a non-standard way to reconfigure the max packet size
  1829. post-handshake for wolfSSL_write/woflSSL_read */
  1830. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  1831. switch (mfl) {
  1832. case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break;
  1833. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  1834. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  1835. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  1836. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  1837. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  1838. default: ssl->max_fragment = MAX_RECORD_SIZE; break;
  1839. }
  1840. return WOLFSSL_SUCCESS;
  1841. }
  1842. #endif /* WOLFSSL_MAX_FRAGMENT_ADJUST */
  1843. /* This call sets the max fragment TLS extension, which gets sent to server.
  1844. The server_hello response is what sets the `ssl->max_fragment` in
  1845. TLSX_MFL_Parse */
  1846. return TLSX_UseMaxFragment(&ssl->extensions, mfl, ssl->heap);
  1847. }
  1848. int wolfSSL_CTX_UseMaxFragment(WOLFSSL_CTX* ctx, byte mfl)
  1849. {
  1850. if (ctx == NULL)
  1851. return BAD_FUNC_ARG;
  1852. return TLSX_UseMaxFragment(&ctx->extensions, mfl, ctx->heap);
  1853. }
  1854. #endif /* NO_WOLFSSL_CLIENT */
  1855. #endif /* HAVE_MAX_FRAGMENT */
  1856. #ifdef HAVE_TRUNCATED_HMAC
  1857. #ifndef NO_WOLFSSL_CLIENT
  1858. int wolfSSL_UseTruncatedHMAC(WOLFSSL* ssl)
  1859. {
  1860. if (ssl == NULL)
  1861. return BAD_FUNC_ARG;
  1862. return TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  1863. }
  1864. int wolfSSL_CTX_UseTruncatedHMAC(WOLFSSL_CTX* ctx)
  1865. {
  1866. if (ctx == NULL)
  1867. return BAD_FUNC_ARG;
  1868. return TLSX_UseTruncatedHMAC(&ctx->extensions, ctx->heap);
  1869. }
  1870. #endif /* NO_WOLFSSL_CLIENT */
  1871. #endif /* HAVE_TRUNCATED_HMAC */
  1872. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  1873. int wolfSSL_UseOCSPStapling(WOLFSSL* ssl, byte status_type, byte options)
  1874. {
  1875. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  1876. return BAD_FUNC_ARG;
  1877. return TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  1878. options, NULL, ssl->heap, ssl->devId);
  1879. }
  1880. int wolfSSL_CTX_UseOCSPStapling(WOLFSSL_CTX* ctx, byte status_type,
  1881. byte options)
  1882. {
  1883. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  1884. return BAD_FUNC_ARG;
  1885. return TLSX_UseCertificateStatusRequest(&ctx->extensions, status_type,
  1886. options, NULL, ctx->heap, ctx->devId);
  1887. }
  1888. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  1889. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1890. int wolfSSL_UseOCSPStaplingV2(WOLFSSL* ssl, byte status_type, byte options)
  1891. {
  1892. if (ssl == NULL || ssl->options.side != WOLFSSL_CLIENT_END)
  1893. return BAD_FUNC_ARG;
  1894. return TLSX_UseCertificateStatusRequestV2(&ssl->extensions, status_type,
  1895. options, ssl->heap, ssl->devId);
  1896. }
  1897. int wolfSSL_CTX_UseOCSPStaplingV2(WOLFSSL_CTX* ctx, byte status_type,
  1898. byte options)
  1899. {
  1900. if (ctx == NULL || ctx->method->side != WOLFSSL_CLIENT_END)
  1901. return BAD_FUNC_ARG;
  1902. return TLSX_UseCertificateStatusRequestV2(&ctx->extensions, status_type,
  1903. options, ctx->heap, ctx->devId);
  1904. }
  1905. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  1906. /* Elliptic Curves */
  1907. #if defined(HAVE_SUPPORTED_CURVES) && !defined(NO_WOLFSSL_CLIENT)
  1908. int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
  1909. {
  1910. if (ssl == NULL)
  1911. return BAD_FUNC_ARG;
  1912. switch (name) {
  1913. case WOLFSSL_ECC_SECP160K1:
  1914. case WOLFSSL_ECC_SECP160R1:
  1915. case WOLFSSL_ECC_SECP160R2:
  1916. case WOLFSSL_ECC_SECP192K1:
  1917. case WOLFSSL_ECC_SECP192R1:
  1918. case WOLFSSL_ECC_SECP224K1:
  1919. case WOLFSSL_ECC_SECP224R1:
  1920. case WOLFSSL_ECC_SECP256K1:
  1921. case WOLFSSL_ECC_SECP256R1:
  1922. case WOLFSSL_ECC_SECP384R1:
  1923. case WOLFSSL_ECC_SECP521R1:
  1924. case WOLFSSL_ECC_BRAINPOOLP256R1:
  1925. case WOLFSSL_ECC_BRAINPOOLP384R1:
  1926. case WOLFSSL_ECC_BRAINPOOLP512R1:
  1927. case WOLFSSL_ECC_X25519:
  1928. case WOLFSSL_ECC_X448:
  1929. case WOLFSSL_FFDHE_2048:
  1930. case WOLFSSL_FFDHE_3072:
  1931. case WOLFSSL_FFDHE_4096:
  1932. case WOLFSSL_FFDHE_6144:
  1933. case WOLFSSL_FFDHE_8192:
  1934. break;
  1935. default:
  1936. return BAD_FUNC_ARG;
  1937. }
  1938. ssl->options.userCurves = 1;
  1939. return TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  1940. }
  1941. int wolfSSL_CTX_UseSupportedCurve(WOLFSSL_CTX* ctx, word16 name)
  1942. {
  1943. if (ctx == NULL)
  1944. return BAD_FUNC_ARG;
  1945. switch (name) {
  1946. case WOLFSSL_ECC_SECP160K1:
  1947. case WOLFSSL_ECC_SECP160R1:
  1948. case WOLFSSL_ECC_SECP160R2:
  1949. case WOLFSSL_ECC_SECP192K1:
  1950. case WOLFSSL_ECC_SECP192R1:
  1951. case WOLFSSL_ECC_SECP224K1:
  1952. case WOLFSSL_ECC_SECP224R1:
  1953. case WOLFSSL_ECC_SECP256K1:
  1954. case WOLFSSL_ECC_SECP256R1:
  1955. case WOLFSSL_ECC_SECP384R1:
  1956. case WOLFSSL_ECC_SECP521R1:
  1957. case WOLFSSL_ECC_BRAINPOOLP256R1:
  1958. case WOLFSSL_ECC_BRAINPOOLP384R1:
  1959. case WOLFSSL_ECC_BRAINPOOLP512R1:
  1960. case WOLFSSL_ECC_X25519:
  1961. case WOLFSSL_ECC_X448:
  1962. case WOLFSSL_FFDHE_2048:
  1963. case WOLFSSL_FFDHE_3072:
  1964. case WOLFSSL_FFDHE_4096:
  1965. case WOLFSSL_FFDHE_6144:
  1966. case WOLFSSL_FFDHE_8192:
  1967. break;
  1968. default:
  1969. return BAD_FUNC_ARG;
  1970. }
  1971. ctx->userCurves = 1;
  1972. return TLSX_UseSupportedCurve(&ctx->extensions, name, ctx->heap);
  1973. }
  1974. #endif /* HAVE_SUPPORTED_CURVES && !NO_WOLFSSL_CLIENT */
  1975. /* QSH quantum safe handshake */
  1976. #ifdef HAVE_QSH
  1977. /* returns 1 if QSH has been used 0 otherwise */
  1978. int wolfSSL_isQSH(WOLFSSL* ssl)
  1979. {
  1980. /* if no ssl struct than QSH was not used */
  1981. if (ssl == NULL)
  1982. return 0;
  1983. return ssl->isQSH;
  1984. }
  1985. int wolfSSL_UseSupportedQSH(WOLFSSL* ssl, word16 name)
  1986. {
  1987. if (ssl == NULL)
  1988. return BAD_FUNC_ARG;
  1989. switch (name) {
  1990. #ifdef HAVE_NTRU
  1991. case WOLFSSL_NTRU_EESS439:
  1992. case WOLFSSL_NTRU_EESS593:
  1993. case WOLFSSL_NTRU_EESS743:
  1994. break;
  1995. #endif
  1996. default:
  1997. return BAD_FUNC_ARG;
  1998. }
  1999. ssl->user_set_QSHSchemes = 1;
  2000. return TLSX_UseQSHScheme(&ssl->extensions, name, NULL, 0, ssl->heap);
  2001. }
  2002. #ifndef NO_WOLFSSL_CLIENT
  2003. /* user control over sending client public key in hello
  2004. when flag = 1 will send keys if flag is 0 or function is not called
  2005. then will not send keys in the hello extension
  2006. return 0 on success
  2007. */
  2008. int wolfSSL_UseClientQSHKeys(WOLFSSL* ssl, unsigned char flag)
  2009. {
  2010. if (ssl == NULL)
  2011. return BAD_FUNC_ARG;
  2012. ssl->sendQSHKeys = flag;
  2013. return 0;
  2014. }
  2015. #endif /* NO_WOLFSSL_CLIENT */
  2016. #endif /* HAVE_QSH */
  2017. /* Application-Layer Protocol Negotiation */
  2018. #ifdef HAVE_ALPN
  2019. WOLFSSL_ABI
  2020. int wolfSSL_UseALPN(WOLFSSL* ssl, char *protocol_name_list,
  2021. word32 protocol_name_listSz, byte options)
  2022. {
  2023. char *list, *ptr, *token[WOLFSSL_MAX_ALPN_NUMBER+1]={NULL};
  2024. word16 len;
  2025. int idx = 0;
  2026. int ret = WOLFSSL_FAILURE;
  2027. WOLFSSL_ENTER("wolfSSL_UseALPN");
  2028. if (ssl == NULL || protocol_name_list == NULL)
  2029. return BAD_FUNC_ARG;
  2030. if (protocol_name_listSz > (WOLFSSL_MAX_ALPN_NUMBER *
  2031. WOLFSSL_MAX_ALPN_PROTO_NAME_LEN +
  2032. WOLFSSL_MAX_ALPN_NUMBER)) {
  2033. WOLFSSL_MSG("Invalid arguments, protocol name list too long");
  2034. return BAD_FUNC_ARG;
  2035. }
  2036. if (!(options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) &&
  2037. !(options & WOLFSSL_ALPN_FAILED_ON_MISMATCH)) {
  2038. WOLFSSL_MSG("Invalid arguments, options not supported");
  2039. return BAD_FUNC_ARG;
  2040. }
  2041. list = (char *)XMALLOC(protocol_name_listSz+1, ssl->heap,
  2042. DYNAMIC_TYPE_ALPN);
  2043. if (list == NULL) {
  2044. WOLFSSL_MSG("Memory failure");
  2045. return MEMORY_ERROR;
  2046. }
  2047. XSTRNCPY(list, protocol_name_list, protocol_name_listSz);
  2048. list[protocol_name_listSz] = '\0';
  2049. /* read all protocol name from the list */
  2050. token[idx] = XSTRTOK(list, ",", &ptr);
  2051. while (idx < WOLFSSL_MAX_ALPN_NUMBER && token[idx] != NULL)
  2052. token[++idx] = XSTRTOK(NULL, ",", &ptr);
  2053. /* add protocol name list in the TLS extension in reverse order */
  2054. while ((idx--) > 0) {
  2055. len = (word16)XSTRLEN(token[idx]);
  2056. ret = TLSX_UseALPN(&ssl->extensions, token[idx], len, options,
  2057. ssl->heap);
  2058. if (ret != WOLFSSL_SUCCESS) {
  2059. WOLFSSL_MSG("TLSX_UseALPN failure");
  2060. break;
  2061. }
  2062. }
  2063. XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN);
  2064. return ret;
  2065. }
  2066. int wolfSSL_ALPN_GetProtocol(WOLFSSL* ssl, char **protocol_name, word16 *size)
  2067. {
  2068. return TLSX_ALPN_GetRequest(ssl ? ssl->extensions : NULL,
  2069. (void **)protocol_name, size);
  2070. }
  2071. int wolfSSL_ALPN_GetPeerProtocol(WOLFSSL* ssl, char **list, word16 *listSz)
  2072. {
  2073. if (list == NULL || listSz == NULL)
  2074. return BAD_FUNC_ARG;
  2075. if (ssl->alpn_client_list == NULL)
  2076. return BUFFER_ERROR;
  2077. *listSz = (word16)XSTRLEN(ssl->alpn_client_list);
  2078. if (*listSz == 0)
  2079. return BUFFER_ERROR;
  2080. *list = (char *)XMALLOC((*listSz)+1, ssl->heap, DYNAMIC_TYPE_TLSX);
  2081. if (*list == NULL)
  2082. return MEMORY_ERROR;
  2083. XSTRNCPY(*list, ssl->alpn_client_list, (*listSz)+1);
  2084. (*list)[*listSz] = 0;
  2085. return WOLFSSL_SUCCESS;
  2086. }
  2087. /* used to free memory allocated by wolfSSL_ALPN_GetPeerProtocol */
  2088. int wolfSSL_ALPN_FreePeerProtocol(WOLFSSL* ssl, char **list)
  2089. {
  2090. if (ssl == NULL) {
  2091. return BAD_FUNC_ARG;
  2092. }
  2093. XFREE(*list, ssl->heap, DYNAMIC_TYPE_TLSX);
  2094. *list = NULL;
  2095. return WOLFSSL_SUCCESS;
  2096. }
  2097. #endif /* HAVE_ALPN */
  2098. /* Secure Renegotiation */
  2099. #ifdef HAVE_SECURE_RENEGOTIATION
  2100. /* user is forcing ability to use secure renegotiation, we discourage it */
  2101. int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl)
  2102. {
  2103. int ret = BAD_FUNC_ARG;
  2104. if (ssl)
  2105. ret = TLSX_UseSecureRenegotiation(&ssl->extensions, ssl->heap);
  2106. if (ret == WOLFSSL_SUCCESS) {
  2107. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  2108. if (extension)
  2109. ssl->secure_renegotiation = (SecureRenegotiation*)extension->data;
  2110. }
  2111. return ret;
  2112. }
  2113. int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx)
  2114. {
  2115. if (ctx == NULL)
  2116. return BAD_FUNC_ARG;
  2117. ctx->useSecureReneg = 1;
  2118. return WOLFSSL_SUCCESS;
  2119. }
  2120. /* do a secure renegotiation handshake, user forced, we discourage */
  2121. static int _Rehandshake(WOLFSSL* ssl)
  2122. {
  2123. int ret;
  2124. if (ssl == NULL)
  2125. return BAD_FUNC_ARG;
  2126. if (ssl->secure_renegotiation == NULL) {
  2127. WOLFSSL_MSG("Secure Renegotiation not forced on by user");
  2128. return SECURE_RENEGOTIATION_E;
  2129. }
  2130. if (ssl->secure_renegotiation->enabled == 0) {
  2131. WOLFSSL_MSG("Secure Renegotiation not enabled at extension level");
  2132. return SECURE_RENEGOTIATION_E;
  2133. }
  2134. /* If the client started the renegotiation, the server will already
  2135. * have processed the client's hello. */
  2136. if (ssl->options.side != WOLFSSL_SERVER_END ||
  2137. ssl->options.acceptState != ACCEPT_FIRST_REPLY_DONE) {
  2138. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  2139. WOLFSSL_MSG("Can't renegotiate until previous handshake complete");
  2140. return SECURE_RENEGOTIATION_E;
  2141. }
  2142. #ifndef NO_FORCE_SCR_SAME_SUITE
  2143. /* force same suite */
  2144. if (ssl->suites) {
  2145. ssl->suites->suiteSz = SUITE_LEN;
  2146. ssl->suites->suites[0] = ssl->options.cipherSuite0;
  2147. ssl->suites->suites[1] = ssl->options.cipherSuite;
  2148. }
  2149. #endif
  2150. /* reset handshake states */
  2151. ssl->options.sendVerify = 0;
  2152. ssl->options.serverState = NULL_STATE;
  2153. ssl->options.clientState = NULL_STATE;
  2154. ssl->options.connectState = CONNECT_BEGIN;
  2155. ssl->options.acceptState = ACCEPT_BEGIN_RENEG;
  2156. ssl->options.handShakeState = NULL_STATE;
  2157. ssl->options.processReply = 0; /* TODO, move states in internal.h */
  2158. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  2159. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  2160. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SERVER_RENEGOTIATION_INFO)
  2161. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2162. ret = SendHelloRequest(ssl);
  2163. if (ret != 0) {
  2164. ssl->error = ret;
  2165. return WOLFSSL_FATAL_ERROR;
  2166. }
  2167. }
  2168. #endif /* NO_WOLFSSL_SERVER && HAVE_SERVER_RENEGOTIATION_INFO */
  2169. ret = InitHandshakeHashes(ssl);
  2170. if (ret != 0) {
  2171. ssl->error = ret;
  2172. return WOLFSSL_FATAL_ERROR;
  2173. }
  2174. }
  2175. ret = wolfSSL_negotiate(ssl);
  2176. if (ret == WOLFSSL_SUCCESS)
  2177. ssl->secure_rene_count++;
  2178. return ret;
  2179. }
  2180. /* do a secure renegotiation handshake, user forced, we discourage */
  2181. int wolfSSL_Rehandshake(WOLFSSL* ssl)
  2182. {
  2183. int ret = WOLFSSL_SUCCESS;
  2184. WOLFSSL_ENTER("wolfSSL_Rehandshake");
  2185. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2186. /* Reset option to send certificate verify. */
  2187. ssl->options.sendVerify = 0;
  2188. }
  2189. else {
  2190. /* Reset resuming flag to do full secure handshake. */
  2191. ssl->options.resuming = 0;
  2192. #ifdef HAVE_SESSION_TICKET
  2193. /* Clearing the ticket. */
  2194. ret = wolfSSL_UseSessionTicket(ssl);
  2195. #endif
  2196. }
  2197. if (ret == WOLFSSL_SUCCESS)
  2198. ret = _Rehandshake(ssl);
  2199. return ret;
  2200. }
  2201. #ifndef NO_WOLFSSL_CLIENT
  2202. /* do a secure resumption handshake, user forced, we discourage */
  2203. int wolfSSL_SecureResume(WOLFSSL* ssl)
  2204. {
  2205. WOLFSSL_ENTER("wolfSSL_SecureResume");
  2206. if (ssl == NULL)
  2207. return BAD_FUNC_ARG;
  2208. if (ssl->options.side == WOLFSSL_SERVER_END) {
  2209. ssl->error = SIDE_ERROR;
  2210. return SSL_FATAL_ERROR;
  2211. }
  2212. return _Rehandshake(ssl);
  2213. }
  2214. #endif /* NO_WOLFSSL_CLIENT */
  2215. long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl)
  2216. {
  2217. WOLFSSL_ENTER("wolfSSL_SSL_get_secure_renegotiation_support");
  2218. if (!ssl || !ssl->secure_renegotiation)
  2219. return WOLFSSL_FAILURE;
  2220. return ssl->secure_renegotiation->enabled;
  2221. }
  2222. #endif /* HAVE_SECURE_RENEGOTIATION */
  2223. /* Session Ticket */
  2224. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SESSION_TICKET)
  2225. /* WOLFSSL_SUCCESS on ok */
  2226. int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb)
  2227. {
  2228. if (ctx == NULL)
  2229. return BAD_FUNC_ARG;
  2230. ctx->ticketEncCb = cb;
  2231. return WOLFSSL_SUCCESS;
  2232. }
  2233. /* set hint interval, WOLFSSL_SUCCESS on ok */
  2234. int wolfSSL_CTX_set_TicketHint(WOLFSSL_CTX* ctx, int hint)
  2235. {
  2236. if (ctx == NULL)
  2237. return BAD_FUNC_ARG;
  2238. ctx->ticketHint = hint;
  2239. return WOLFSSL_SUCCESS;
  2240. }
  2241. /* set user context, WOLFSSL_SUCCESS on ok */
  2242. int wolfSSL_CTX_set_TicketEncCtx(WOLFSSL_CTX* ctx, void* userCtx)
  2243. {
  2244. if (ctx == NULL)
  2245. return BAD_FUNC_ARG;
  2246. ctx->ticketEncCtx = userCtx;
  2247. return WOLFSSL_SUCCESS;
  2248. }
  2249. #endif /* !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_SESSION_TICKET) */
  2250. /* Session Ticket */
  2251. #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_SESSION_TICKET)
  2252. int wolfSSL_UseSessionTicket(WOLFSSL* ssl)
  2253. {
  2254. if (ssl == NULL)
  2255. return BAD_FUNC_ARG;
  2256. return TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  2257. }
  2258. int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx)
  2259. {
  2260. if (ctx == NULL)
  2261. return BAD_FUNC_ARG;
  2262. return TLSX_UseSessionTicket(&ctx->extensions, NULL, ctx->heap);
  2263. }
  2264. WOLFSSL_API int wolfSSL_get_SessionTicket(WOLFSSL* ssl,
  2265. byte* buf, word32* bufSz)
  2266. {
  2267. if (ssl == NULL || buf == NULL || bufSz == NULL || *bufSz == 0)
  2268. return BAD_FUNC_ARG;
  2269. if (ssl->session.ticketLen <= *bufSz) {
  2270. XMEMCPY(buf, ssl->session.ticket, ssl->session.ticketLen);
  2271. *bufSz = ssl->session.ticketLen;
  2272. }
  2273. else
  2274. *bufSz = 0;
  2275. return WOLFSSL_SUCCESS;
  2276. }
  2277. WOLFSSL_API int wolfSSL_set_SessionTicket(WOLFSSL* ssl, const byte* buf,
  2278. word32 bufSz)
  2279. {
  2280. if (ssl == NULL || (buf == NULL && bufSz > 0))
  2281. return BAD_FUNC_ARG;
  2282. if (bufSz > 0) {
  2283. /* Ticket will fit into static ticket */
  2284. if(bufSz <= SESSION_TICKET_LEN) {
  2285. if (ssl->session.isDynamic) {
  2286. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  2287. ssl->session.isDynamic = 0;
  2288. ssl->session.ticket = ssl->session.staticTicket;
  2289. }
  2290. } else { /* Ticket requires dynamic ticket storage */
  2291. if (ssl->session.ticketLen < bufSz) { /* is dyn buffer big enough */
  2292. if(ssl->session.isDynamic)
  2293. XFREE(ssl->session.ticket, ssl->heap,
  2294. DYNAMIC_TYPE_SESSION_TICK);
  2295. ssl->session.ticket = (byte*)XMALLOC(bufSz, ssl->heap,
  2296. DYNAMIC_TYPE_SESSION_TICK);
  2297. if(!ssl->session.ticket) {
  2298. ssl->session.ticket = ssl->session.staticTicket;
  2299. ssl->session.isDynamic = 0;
  2300. return MEMORY_ERROR;
  2301. }
  2302. ssl->session.isDynamic = 1;
  2303. }
  2304. }
  2305. XMEMCPY(ssl->session.ticket, buf, bufSz);
  2306. }
  2307. ssl->session.ticketLen = (word16)bufSz;
  2308. return WOLFSSL_SUCCESS;
  2309. }
  2310. WOLFSSL_API int wolfSSL_set_SessionTicket_cb(WOLFSSL* ssl,
  2311. CallbackSessionTicket cb, void* ctx)
  2312. {
  2313. if (ssl == NULL)
  2314. return BAD_FUNC_ARG;
  2315. ssl->session_ticket_cb = cb;
  2316. ssl->session_ticket_ctx = ctx;
  2317. return WOLFSSL_SUCCESS;
  2318. }
  2319. #endif
  2320. #ifdef HAVE_EXTENDED_MASTER
  2321. #ifndef NO_WOLFSSL_CLIENT
  2322. int wolfSSL_CTX_DisableExtendedMasterSecret(WOLFSSL_CTX* ctx)
  2323. {
  2324. if (ctx == NULL)
  2325. return BAD_FUNC_ARG;
  2326. ctx->haveEMS = 0;
  2327. return WOLFSSL_SUCCESS;
  2328. }
  2329. int wolfSSL_DisableExtendedMasterSecret(WOLFSSL* ssl)
  2330. {
  2331. if (ssl == NULL)
  2332. return BAD_FUNC_ARG;
  2333. ssl->options.haveEMS = 0;
  2334. return WOLFSSL_SUCCESS;
  2335. }
  2336. #endif
  2337. #endif
  2338. #ifndef WOLFSSL_LEANPSK
  2339. int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags)
  2340. {
  2341. int ret;
  2342. int oldFlags;
  2343. WOLFSSL_ENTER("wolfSSL_send()");
  2344. if (ssl == NULL || data == NULL || sz < 0)
  2345. return BAD_FUNC_ARG;
  2346. oldFlags = ssl->wflags;
  2347. ssl->wflags = flags;
  2348. ret = wolfSSL_write(ssl, data, sz);
  2349. ssl->wflags = oldFlags;
  2350. WOLFSSL_LEAVE("wolfSSL_send()", ret);
  2351. return ret;
  2352. }
  2353. int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags)
  2354. {
  2355. int ret;
  2356. int oldFlags;
  2357. WOLFSSL_ENTER("wolfSSL_recv()");
  2358. if (ssl == NULL || data == NULL || sz < 0)
  2359. return BAD_FUNC_ARG;
  2360. oldFlags = ssl->rflags;
  2361. ssl->rflags = flags;
  2362. ret = wolfSSL_read(ssl, data, sz);
  2363. ssl->rflags = oldFlags;
  2364. WOLFSSL_LEAVE("wolfSSL_recv()", ret);
  2365. return ret;
  2366. }
  2367. #endif
  2368. /* WOLFSSL_SUCCESS on ok */
  2369. WOLFSSL_ABI
  2370. int wolfSSL_shutdown(WOLFSSL* ssl)
  2371. {
  2372. int ret = WOLFSSL_FATAL_ERROR;
  2373. WOLFSSL_ENTER("SSL_shutdown()");
  2374. if (ssl == NULL)
  2375. return WOLFSSL_FATAL_ERROR;
  2376. if (ssl->options.quietShutdown) {
  2377. WOLFSSL_MSG("quiet shutdown, no close notify sent");
  2378. ret = WOLFSSL_SUCCESS;
  2379. }
  2380. else {
  2381. /* try to send close notify, not an error if can't */
  2382. if (!ssl->options.isClosed && !ssl->options.connReset &&
  2383. !ssl->options.sentNotify) {
  2384. ssl->error = SendAlert(ssl, alert_warning, close_notify);
  2385. if (ssl->error < 0) {
  2386. WOLFSSL_ERROR(ssl->error);
  2387. return WOLFSSL_FATAL_ERROR;
  2388. }
  2389. ssl->options.sentNotify = 1; /* don't send close_notify twice */
  2390. if (ssl->options.closeNotify)
  2391. ret = WOLFSSL_SUCCESS;
  2392. else {
  2393. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2394. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2395. return ret;
  2396. }
  2397. }
  2398. #ifdef WOLFSSL_SHUTDOWNONCE
  2399. if (ssl->options.isClosed || ssl->options.connReset) {
  2400. /* Shutdown has already occurred.
  2401. * Caller is free to ignore this error. */
  2402. return SSL_SHUTDOWN_ALREADY_DONE_E;
  2403. }
  2404. #endif
  2405. /* call wolfSSL_shutdown again for bidirectional shutdown */
  2406. if (ssl->options.sentNotify && !ssl->options.closeNotify) {
  2407. ret = ProcessReply(ssl);
  2408. if (ret == ZERO_RETURN) {
  2409. /* simulate OpenSSL behavior */
  2410. ssl->error = WOLFSSL_ERROR_SYSCALL;
  2411. ret = WOLFSSL_SUCCESS;
  2412. } else if (ssl->error == WOLFSSL_ERROR_NONE) {
  2413. ret = WOLFSSL_SHUTDOWN_NOT_DONE;
  2414. } else {
  2415. WOLFSSL_ERROR(ssl->error);
  2416. ret = WOLFSSL_FATAL_ERROR;
  2417. }
  2418. }
  2419. }
  2420. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  2421. /* reset WOLFSSL structure state for possible re-use */
  2422. if (ret == WOLFSSL_SUCCESS) {
  2423. if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) {
  2424. WOLFSSL_MSG("could not clear WOLFSSL");
  2425. ret = WOLFSSL_FATAL_ERROR;
  2426. }
  2427. }
  2428. #endif
  2429. WOLFSSL_LEAVE("SSL_shutdown()", ret);
  2430. return ret;
  2431. }
  2432. /* get current error state value */
  2433. int wolfSSL_state(WOLFSSL* ssl)
  2434. {
  2435. if (ssl == NULL) {
  2436. return BAD_FUNC_ARG;
  2437. }
  2438. return ssl->error;
  2439. }
  2440. WOLFSSL_ABI
  2441. int wolfSSL_get_error(WOLFSSL* ssl, int ret)
  2442. {
  2443. WOLFSSL_ENTER("SSL_get_error");
  2444. if (ret > 0)
  2445. return WOLFSSL_ERROR_NONE;
  2446. if (ssl == NULL)
  2447. return BAD_FUNC_ARG;
  2448. WOLFSSL_LEAVE("SSL_get_error", ssl->error);
  2449. /* make sure converted types are handled in SetErrorString() too */
  2450. if (ssl->error == WANT_READ)
  2451. return WOLFSSL_ERROR_WANT_READ; /* convert to OpenSSL type */
  2452. else if (ssl->error == WANT_WRITE)
  2453. return WOLFSSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */
  2454. else if (ssl->error == ZERO_RETURN)
  2455. return WOLFSSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */
  2456. return ssl->error;
  2457. }
  2458. /* retrieve alert history, WOLFSSL_SUCCESS on ok */
  2459. int wolfSSL_get_alert_history(WOLFSSL* ssl, WOLFSSL_ALERT_HISTORY *h)
  2460. {
  2461. if (ssl && h) {
  2462. *h = ssl->alert_history;
  2463. }
  2464. return WOLFSSL_SUCCESS;
  2465. }
  2466. #ifdef OPENSSL_EXTRA
  2467. /* returns SSL_WRITING, SSL_READING or SSL_NOTHING */
  2468. int wolfSSL_want(WOLFSSL* ssl)
  2469. {
  2470. int rw_state = SSL_NOTHING;
  2471. if (ssl) {
  2472. if (ssl->error == WANT_READ)
  2473. rw_state = SSL_READING;
  2474. else if (ssl->error == WANT_WRITE)
  2475. rw_state = SSL_WRITING;
  2476. }
  2477. return rw_state;
  2478. }
  2479. #endif
  2480. /* return TRUE if current error is want read */
  2481. int wolfSSL_want_read(WOLFSSL* ssl)
  2482. {
  2483. WOLFSSL_ENTER("SSL_want_read");
  2484. if (ssl->error == WANT_READ)
  2485. return 1;
  2486. return 0;
  2487. }
  2488. /* return TRUE if current error is want write */
  2489. int wolfSSL_want_write(WOLFSSL* ssl)
  2490. {
  2491. WOLFSSL_ENTER("SSL_want_write");
  2492. if (ssl->error == WANT_WRITE)
  2493. return 1;
  2494. return 0;
  2495. }
  2496. char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
  2497. {
  2498. static wcchar msg = "Please supply a buffer for error string";
  2499. WOLFSSL_ENTER("ERR_error_string");
  2500. if (data) {
  2501. SetErrorString((int)errNumber, data);
  2502. return data;
  2503. }
  2504. return (char*)msg;
  2505. }
  2506. void wolfSSL_ERR_error_string_n(unsigned long e, char* buf, unsigned long len)
  2507. {
  2508. WOLFSSL_ENTER("wolfSSL_ERR_error_string_n");
  2509. if (len >= WOLFSSL_MAX_ERROR_SZ)
  2510. wolfSSL_ERR_error_string(e, buf);
  2511. else {
  2512. char tmp[WOLFSSL_MAX_ERROR_SZ];
  2513. WOLFSSL_MSG("Error buffer too short, truncating");
  2514. if (len) {
  2515. wolfSSL_ERR_error_string(e, tmp);
  2516. XMEMCPY(buf, tmp, len-1);
  2517. buf[len-1] = '\0';
  2518. }
  2519. }
  2520. }
  2521. /* don't free temporary arrays at end of handshake */
  2522. void wolfSSL_KeepArrays(WOLFSSL* ssl)
  2523. {
  2524. if (ssl)
  2525. ssl->options.saveArrays = 1;
  2526. }
  2527. /* user doesn't need temporary arrays anymore, Free */
  2528. void wolfSSL_FreeArrays(WOLFSSL* ssl)
  2529. {
  2530. if (ssl && ssl->options.handShakeState == HANDSHAKE_DONE) {
  2531. ssl->options.saveArrays = 0;
  2532. FreeArrays(ssl, 1);
  2533. }
  2534. }
  2535. /* Set option to indicate that the resources are not to be freed after
  2536. * handshake.
  2537. *
  2538. * ssl The SSL/TLS object.
  2539. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2540. */
  2541. int wolfSSL_KeepHandshakeResources(WOLFSSL* ssl)
  2542. {
  2543. if (ssl == NULL)
  2544. return BAD_FUNC_ARG;
  2545. ssl->options.keepResources = 1;
  2546. return 0;
  2547. }
  2548. /* Free the handshake resources after handshake.
  2549. *
  2550. * ssl The SSL/TLS object.
  2551. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2552. */
  2553. int wolfSSL_FreeHandshakeResources(WOLFSSL* ssl)
  2554. {
  2555. if (ssl == NULL)
  2556. return BAD_FUNC_ARG;
  2557. FreeHandshakeResources(ssl);
  2558. return 0;
  2559. }
  2560. /* Use the client's order of preference when matching cipher suites.
  2561. *
  2562. * ssl The SSL/TLS context object.
  2563. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2564. */
  2565. int wolfSSL_CTX_UseClientSuites(WOLFSSL_CTX* ctx)
  2566. {
  2567. if (ctx == NULL)
  2568. return BAD_FUNC_ARG;
  2569. ctx->useClientOrder = 1;
  2570. return 0;
  2571. }
  2572. /* Use the client's order of preference when matching cipher suites.
  2573. *
  2574. * ssl The SSL/TLS object.
  2575. * returns BAD_FUNC_ARG when ssl is NULL and 0 on success.
  2576. */
  2577. int wolfSSL_UseClientSuites(WOLFSSL* ssl)
  2578. {
  2579. if (ssl == NULL)
  2580. return BAD_FUNC_ARG;
  2581. ssl->options.useClientOrder = 1;
  2582. return 0;
  2583. }
  2584. #ifdef WOLFSSL_DTLS
  2585. const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
  2586. {
  2587. #ifndef WOLFSSL_AEAD_ONLY
  2588. Keys* keys = NULL;
  2589. (void)epochOrder;
  2590. if (ssl == NULL)
  2591. return NULL;
  2592. #ifdef HAVE_SECURE_RENEGOTIATION
  2593. switch (epochOrder) {
  2594. case PEER_ORDER:
  2595. if (IsDtlsMsgSCRKeys(ssl))
  2596. keys = &ssl->secure_renegotiation->tmp_keys;
  2597. else
  2598. keys = &ssl->keys;
  2599. break;
  2600. case PREV_ORDER:
  2601. keys = &ssl->keys;
  2602. break;
  2603. case CUR_ORDER:
  2604. if (DtlsUseSCRKeys(ssl))
  2605. keys = &ssl->secure_renegotiation->tmp_keys;
  2606. else
  2607. keys = &ssl->keys;
  2608. break;
  2609. default:
  2610. WOLFSSL_MSG("Unknown epoch order");
  2611. return NULL;
  2612. }
  2613. #else
  2614. keys = &ssl->keys;
  2615. #endif
  2616. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  2617. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  2618. return keys->client_write_MAC_secret;
  2619. else
  2620. return keys->server_write_MAC_secret;
  2621. #else
  2622. (void)ssl;
  2623. (void)verify;
  2624. (void)epochOrder;
  2625. return NULL;
  2626. #endif
  2627. }
  2628. #endif /* WOLFSSL_DTLS */
  2629. const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
  2630. {
  2631. #ifndef WOLFSSL_AEAD_ONLY
  2632. if (ssl == NULL)
  2633. return NULL;
  2634. if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
  2635. (ssl->options.side == WOLFSSL_SERVER_END && verify) )
  2636. return ssl->keys.client_write_MAC_secret;
  2637. else
  2638. return ssl->keys.server_write_MAC_secret;
  2639. #else
  2640. (void)ssl;
  2641. (void)verify;
  2642. return NULL;
  2643. #endif
  2644. }
  2645. #ifdef ATOMIC_USER
  2646. void wolfSSL_CTX_SetMacEncryptCb(WOLFSSL_CTX* ctx, CallbackMacEncrypt cb)
  2647. {
  2648. if (ctx)
  2649. ctx->MacEncryptCb = cb;
  2650. }
  2651. void wolfSSL_SetMacEncryptCtx(WOLFSSL* ssl, void *ctx)
  2652. {
  2653. if (ssl)
  2654. ssl->MacEncryptCtx = ctx;
  2655. }
  2656. void* wolfSSL_GetMacEncryptCtx(WOLFSSL* ssl)
  2657. {
  2658. if (ssl)
  2659. return ssl->MacEncryptCtx;
  2660. return NULL;
  2661. }
  2662. void wolfSSL_CTX_SetDecryptVerifyCb(WOLFSSL_CTX* ctx, CallbackDecryptVerify cb)
  2663. {
  2664. if (ctx)
  2665. ctx->DecryptVerifyCb = cb;
  2666. }
  2667. void wolfSSL_SetDecryptVerifyCtx(WOLFSSL* ssl, void *ctx)
  2668. {
  2669. if (ssl)
  2670. ssl->DecryptVerifyCtx = ctx;
  2671. }
  2672. void* wolfSSL_GetDecryptVerifyCtx(WOLFSSL* ssl)
  2673. {
  2674. if (ssl)
  2675. return ssl->DecryptVerifyCtx;
  2676. return NULL;
  2677. }
  2678. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  2679. /**
  2680. * Set the callback, against the context, that encrypts then MACs.
  2681. *
  2682. * ctx SSL/TLS context.
  2683. * cb Callback function to use with Encrypt-Then-MAC.
  2684. */
  2685. void wolfSSL_CTX_SetEncryptMacCb(WOLFSSL_CTX* ctx, CallbackEncryptMac cb)
  2686. {
  2687. if (ctx)
  2688. ctx->EncryptMacCb = cb;
  2689. }
  2690. /**
  2691. * Set the context to use with callback that encrypts then MACs.
  2692. *
  2693. * ssl SSL/TLS object.
  2694. * ctx Callback function's context.
  2695. */
  2696. void wolfSSL_SetEncryptMacCtx(WOLFSSL* ssl, void *ctx)
  2697. {
  2698. if (ssl)
  2699. ssl->EncryptMacCtx = ctx;
  2700. }
  2701. /**
  2702. * Get the context being used with callback that encrypts then MACs.
  2703. *
  2704. * ssl SSL/TLS object.
  2705. * returns callback function's context or NULL if SSL/TLS object is NULL.
  2706. */
  2707. void* wolfSSL_GetEncryptMacCtx(WOLFSSL* ssl)
  2708. {
  2709. if (ssl)
  2710. return ssl->EncryptMacCtx;
  2711. return NULL;
  2712. }
  2713. /**
  2714. * Set the callback, against the context, that MAC verifies then decrypts.
  2715. *
  2716. * ctx SSL/TLS context.
  2717. * cb Callback function to use with Encrypt-Then-MAC.
  2718. */
  2719. void wolfSSL_CTX_SetVerifyDecryptCb(WOLFSSL_CTX* ctx, CallbackVerifyDecrypt cb)
  2720. {
  2721. if (ctx)
  2722. ctx->VerifyDecryptCb = cb;
  2723. }
  2724. /**
  2725. * Set the context to use with callback that MAC verifies then decrypts.
  2726. *
  2727. * ssl SSL/TLS object.
  2728. * ctx Callback function's context.
  2729. */
  2730. void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx)
  2731. {
  2732. if (ssl)
  2733. ssl->VerifyDecryptCtx = ctx;
  2734. }
  2735. /**
  2736. * Get the context being used with callback that MAC verifies then decrypts.
  2737. *
  2738. * ssl SSL/TLS object.
  2739. * returns callback function's context or NULL if SSL/TLS object is NULL.
  2740. */
  2741. void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl)
  2742. {
  2743. if (ssl)
  2744. return ssl->VerifyDecryptCtx;
  2745. return NULL;
  2746. }
  2747. #endif /* HAVE_ENCRYPT_THEN_MAC !WOLFSSL_AEAD_ONLY */
  2748. const byte* wolfSSL_GetClientWriteKey(WOLFSSL* ssl)
  2749. {
  2750. if (ssl)
  2751. return ssl->keys.client_write_key;
  2752. return NULL;
  2753. }
  2754. const byte* wolfSSL_GetClientWriteIV(WOLFSSL* ssl)
  2755. {
  2756. if (ssl)
  2757. return ssl->keys.client_write_IV;
  2758. return NULL;
  2759. }
  2760. const byte* wolfSSL_GetServerWriteKey(WOLFSSL* ssl)
  2761. {
  2762. if (ssl)
  2763. return ssl->keys.server_write_key;
  2764. return NULL;
  2765. }
  2766. const byte* wolfSSL_GetServerWriteIV(WOLFSSL* ssl)
  2767. {
  2768. if (ssl)
  2769. return ssl->keys.server_write_IV;
  2770. return NULL;
  2771. }
  2772. int wolfSSL_GetKeySize(WOLFSSL* ssl)
  2773. {
  2774. if (ssl)
  2775. return ssl->specs.key_size;
  2776. return BAD_FUNC_ARG;
  2777. }
  2778. int wolfSSL_GetIVSize(WOLFSSL* ssl)
  2779. {
  2780. if (ssl)
  2781. return ssl->specs.iv_size;
  2782. return BAD_FUNC_ARG;
  2783. }
  2784. int wolfSSL_GetBulkCipher(WOLFSSL* ssl)
  2785. {
  2786. if (ssl)
  2787. return ssl->specs.bulk_cipher_algorithm;
  2788. return BAD_FUNC_ARG;
  2789. }
  2790. int wolfSSL_GetCipherType(WOLFSSL* ssl)
  2791. {
  2792. if (ssl == NULL)
  2793. return BAD_FUNC_ARG;
  2794. #ifndef WOLFSSL_AEAD_ONLY
  2795. if (ssl->specs.cipher_type == block)
  2796. return WOLFSSL_BLOCK_TYPE;
  2797. if (ssl->specs.cipher_type == stream)
  2798. return WOLFSSL_STREAM_TYPE;
  2799. #endif
  2800. if (ssl->specs.cipher_type == aead)
  2801. return WOLFSSL_AEAD_TYPE;
  2802. return -1;
  2803. }
  2804. int wolfSSL_GetCipherBlockSize(WOLFSSL* ssl)
  2805. {
  2806. if (ssl == NULL)
  2807. return BAD_FUNC_ARG;
  2808. return ssl->specs.block_size;
  2809. }
  2810. int wolfSSL_GetAeadMacSize(WOLFSSL* ssl)
  2811. {
  2812. if (ssl == NULL)
  2813. return BAD_FUNC_ARG;
  2814. return ssl->specs.aead_mac_size;
  2815. }
  2816. int wolfSSL_IsTLSv1_1(WOLFSSL* ssl)
  2817. {
  2818. if (ssl == NULL)
  2819. return BAD_FUNC_ARG;
  2820. if (ssl->options.tls1_1)
  2821. return 1;
  2822. return 0;
  2823. }
  2824. int wolfSSL_GetSide(WOLFSSL* ssl)
  2825. {
  2826. if (ssl)
  2827. return ssl->options.side;
  2828. return BAD_FUNC_ARG;
  2829. }
  2830. int wolfSSL_GetHmacSize(WOLFSSL* ssl)
  2831. {
  2832. /* AEAD ciphers don't have HMAC keys */
  2833. if (ssl)
  2834. return (ssl->specs.cipher_type != aead) ? ssl->specs.hash_size : 0;
  2835. return BAD_FUNC_ARG;
  2836. }
  2837. #endif /* ATOMIC_USER */
  2838. #ifndef NO_CERTS
  2839. WOLFSSL_CERT_MANAGER* wolfSSL_CTX_GetCertManager(WOLFSSL_CTX* ctx)
  2840. {
  2841. WOLFSSL_CERT_MANAGER* cm = NULL;
  2842. if (ctx)
  2843. cm = ctx->cm;
  2844. return cm;
  2845. }
  2846. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew_ex(void* heap)
  2847. {
  2848. WOLFSSL_CERT_MANAGER* cm;
  2849. WOLFSSL_ENTER("wolfSSL_CertManagerNew");
  2850. cm = (WOLFSSL_CERT_MANAGER*) XMALLOC(sizeof(WOLFSSL_CERT_MANAGER), heap,
  2851. DYNAMIC_TYPE_CERT_MANAGER);
  2852. if (cm) {
  2853. XMEMSET(cm, 0, sizeof(WOLFSSL_CERT_MANAGER));
  2854. if (wc_InitMutex(&cm->caLock) != 0) {
  2855. WOLFSSL_MSG("Bad mutex init");
  2856. wolfSSL_CertManagerFree(cm);
  2857. return NULL;
  2858. }
  2859. #ifdef WOLFSSL_TRUST_PEER_CERT
  2860. if (wc_InitMutex(&cm->tpLock) != 0) {
  2861. WOLFSSL_MSG("Bad mutex init");
  2862. wolfSSL_CertManagerFree(cm);
  2863. return NULL;
  2864. }
  2865. #endif
  2866. /* set default minimum key size allowed */
  2867. #ifndef NO_RSA
  2868. cm->minRsaKeySz = MIN_RSAKEY_SZ;
  2869. #endif
  2870. #ifdef HAVE_ECC
  2871. cm->minEccKeySz = MIN_ECCKEY_SZ;
  2872. #endif
  2873. cm->heap = heap;
  2874. }
  2875. return cm;
  2876. }
  2877. WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew(void)
  2878. {
  2879. return wolfSSL_CertManagerNew_ex(NULL);
  2880. }
  2881. void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm)
  2882. {
  2883. WOLFSSL_ENTER("wolfSSL_CertManagerFree");
  2884. if (cm) {
  2885. #ifdef HAVE_CRL
  2886. if (cm->crl)
  2887. FreeCRL(cm->crl, 1);
  2888. #endif
  2889. #ifdef HAVE_OCSP
  2890. if (cm->ocsp)
  2891. FreeOCSP(cm->ocsp, 1);
  2892. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  2893. #if !defined(NO_WOLFSSL_SERVER) && \
  2894. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  2895. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  2896. if (cm->ocsp_stapling)
  2897. FreeOCSP(cm->ocsp_stapling, 1);
  2898. #endif
  2899. #endif
  2900. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  2901. wc_FreeMutex(&cm->caLock);
  2902. #ifdef WOLFSSL_TRUST_PEER_CERT
  2903. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  2904. wc_FreeMutex(&cm->tpLock);
  2905. #endif
  2906. XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER);
  2907. }
  2908. }
  2909. #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM)
  2910. #if defined(WOLFSSL_SIGNER_DER_CERT)
  2911. /******************************************************************************
  2912. * wolfSSL_CertManagerGetCerts - retrieve stack of X509 certificates in a
  2913. * certificate manager (CM).
  2914. *
  2915. * RETURNS:
  2916. * returns stack of X509 certs on success, otherwise returns a NULL.
  2917. */
  2918. WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm)
  2919. {
  2920. WOLFSSL_STACK* sk = NULL;
  2921. Signer* signers = NULL;
  2922. word32 row = 0;
  2923. DecodedCert* dCert = NULL;
  2924. WOLFSSL_X509* x509 = NULL;
  2925. int found = 0;
  2926. if (cm == NULL)
  2927. return NULL;
  2928. sk = wolfSSL_sk_X509_new();
  2929. if (sk == NULL) {
  2930. return NULL;
  2931. }
  2932. if (wc_LockMutex(&cm->caLock) != 0) {
  2933. goto error_init;
  2934. }
  2935. for (row = 0; row < CA_TABLE_SIZE; row++) {
  2936. signers = cm->caTable[row];
  2937. while (signers && signers->derCert && signers->derCert->buffer) {
  2938. dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  2939. DYNAMIC_TYPE_DCERT);
  2940. if (dCert == NULL) {
  2941. goto error;
  2942. }
  2943. XMEMSET(dCert, 0, sizeof(DecodedCert));
  2944. InitDecodedCert(dCert, signers->derCert->buffer,
  2945. signers->derCert->length, cm->heap);
  2946. /* Parse Certificate */
  2947. if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, cm)) {
  2948. goto error;
  2949. }
  2950. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), cm->heap,
  2951. DYNAMIC_TYPE_X509);
  2952. if (x509 == NULL) {
  2953. goto error;
  2954. }
  2955. InitX509(x509, 1, NULL);
  2956. if (CopyDecodedToX509(x509, dCert) == 0) {
  2957. if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
  2958. WOLFSSL_MSG("Unable to load x509 into stack");
  2959. FreeX509(x509);
  2960. XFREE(x509, cm->heap, DYNAMIC_TYPE_X509);
  2961. goto error;
  2962. }
  2963. }
  2964. else {
  2965. goto error;
  2966. }
  2967. found = 1;
  2968. signers = signers->next;
  2969. FreeDecodedCert(dCert);
  2970. XFREE(dCert, cm->heap, DYNAMIC_TYPE_DCERT);
  2971. dCert = NULL;
  2972. }
  2973. }
  2974. wc_UnLockMutex(&cm->caLock);
  2975. if (!found) {
  2976. goto error_init;
  2977. }
  2978. return sk;
  2979. error:
  2980. wc_UnLockMutex(&cm->caLock);
  2981. error_init:
  2982. if (dCert) {
  2983. FreeDecodedCert(dCert);
  2984. XFREE(dCert, cm->heap, DYNAMIC_TYPE_DCERT);
  2985. }
  2986. if (sk)
  2987. wolfSSL_sk_X509_free(sk);
  2988. return NULL;
  2989. }
  2990. #endif /* WOLFSSL_SIGNER_DER_CERT */
  2991. /******************************************************************************
  2992. * wolfSSL_X509_STORE_GetCerts - retrieve stack of X509 in a certificate store ctx
  2993. *
  2994. * This API can be used in SSL verify callback function to view cert chain
  2995. * See examples/client/client.c and myVerify() function in test.h
  2996. *
  2997. * RETURNS:
  2998. * returns stack of X509 certs on success, otherwise returns a NULL.
  2999. */
  3000. WOLFSSL_STACK* wolfSSL_X509_STORE_GetCerts(WOLFSSL_X509_STORE_CTX* s)
  3001. {
  3002. int certIdx = 0;
  3003. WOLFSSL_BUFFER_INFO* cert = NULL;
  3004. DecodedCert* dCert = NULL;
  3005. WOLFSSL_X509* x509 = NULL;
  3006. WOLFSSL_STACK* sk = NULL;
  3007. int found = 0;
  3008. if (s == NULL) {
  3009. return NULL;
  3010. }
  3011. sk = wolfSSL_sk_X509_new();
  3012. if (sk == NULL) {
  3013. return NULL;
  3014. }
  3015. for (certIdx = s->totalCerts - 1; certIdx >= 0; certIdx--) {
  3016. /* get certificate buffer */
  3017. cert = &s->certs[certIdx];
  3018. dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  3019. if (dCert == NULL) {
  3020. goto error;
  3021. }
  3022. XMEMSET(dCert, 0, sizeof(DecodedCert));
  3023. InitDecodedCert(dCert, cert->buffer, cert->length, NULL);
  3024. /* Parse Certificate */
  3025. if (ParseCert(dCert, CERT_TYPE, NO_VERIFY, NULL)){
  3026. goto error;
  3027. }
  3028. x509 = wolfSSL_X509_new();
  3029. if (x509 == NULL) {
  3030. goto error;
  3031. }
  3032. InitX509(x509, 1, NULL);
  3033. if (CopyDecodedToX509(x509, dCert) == 0) {
  3034. if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
  3035. WOLFSSL_MSG("Unable to load x509 into stack");
  3036. wolfSSL_X509_free(x509);
  3037. goto error;
  3038. }
  3039. }
  3040. else {
  3041. goto error;
  3042. }
  3043. found = 1;
  3044. FreeDecodedCert(dCert);
  3045. XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
  3046. dCert = NULL;
  3047. }
  3048. if (!found) {
  3049. wolfSSL_sk_X509_free(sk);
  3050. sk = NULL;
  3051. }
  3052. return sk;
  3053. error:
  3054. if (dCert) {
  3055. FreeDecodedCert(dCert);
  3056. XFREE(dCert, NULL, DYNAMIC_TYPE_DCERT);
  3057. }
  3058. if (sk)
  3059. wolfSSL_sk_X509_free(sk);
  3060. return NULL;
  3061. }
  3062. #endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */
  3063. /* Unload the CA signer list */
  3064. int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm)
  3065. {
  3066. WOLFSSL_ENTER("wolfSSL_CertManagerUnloadCAs");
  3067. if (cm == NULL)
  3068. return BAD_FUNC_ARG;
  3069. if (wc_LockMutex(&cm->caLock) != 0)
  3070. return BAD_MUTEX_E;
  3071. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  3072. wc_UnLockMutex(&cm->caLock);
  3073. return WOLFSSL_SUCCESS;
  3074. }
  3075. #ifdef WOLFSSL_TRUST_PEER_CERT
  3076. int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm)
  3077. {
  3078. WOLFSSL_ENTER("wolfSSL_CertManagerUnload_trust_peers");
  3079. if (cm == NULL)
  3080. return BAD_FUNC_ARG;
  3081. if (wc_LockMutex(&cm->tpLock) != 0)
  3082. return BAD_MUTEX_E;
  3083. FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
  3084. wc_UnLockMutex(&cm->tpLock);
  3085. return WOLFSSL_SUCCESS;
  3086. }
  3087. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3088. #endif /* NO_CERTS */
  3089. #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
  3090. void wolfSSL_ERR_print_errors_fp(XFILE fp, int err)
  3091. {
  3092. char data[WOLFSSL_MAX_ERROR_SZ + 1];
  3093. WOLFSSL_ENTER("wolfSSL_ERR_print_errors_fp");
  3094. SetErrorString(err, data);
  3095. fprintf(fp, "%s", data);
  3096. }
  3097. #if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  3098. void wolfSSL_ERR_dump_errors_fp(XFILE fp)
  3099. {
  3100. wc_ERR_print_errors_fp(fp);
  3101. }
  3102. void wolfSSL_ERR_print_errors_cb (int (*cb)(const char *str, size_t len,
  3103. void *u), void *u)
  3104. {
  3105. wc_ERR_print_errors_cb(cb, u);
  3106. }
  3107. #endif
  3108. #endif
  3109. WOLFSSL_ABI
  3110. int wolfSSL_pending(WOLFSSL* ssl)
  3111. {
  3112. WOLFSSL_ENTER("SSL_pending");
  3113. return ssl->buffers.clearOutputBuffer.length;
  3114. }
  3115. #ifndef WOLFSSL_LEANPSK
  3116. /* turn on handshake group messages for context */
  3117. int wolfSSL_CTX_set_group_messages(WOLFSSL_CTX* ctx)
  3118. {
  3119. if (ctx == NULL)
  3120. return BAD_FUNC_ARG;
  3121. ctx->groupMessages = 1;
  3122. return WOLFSSL_SUCCESS;
  3123. }
  3124. #endif
  3125. #ifndef NO_WOLFSSL_CLIENT
  3126. /* connect enough to get peer cert chain */
  3127. int wolfSSL_connect_cert(WOLFSSL* ssl)
  3128. {
  3129. int ret;
  3130. if (ssl == NULL)
  3131. return WOLFSSL_FAILURE;
  3132. ssl->options.certOnly = 1;
  3133. ret = wolfSSL_connect(ssl);
  3134. ssl->options.certOnly = 0;
  3135. return ret;
  3136. }
  3137. #endif
  3138. #ifndef WOLFSSL_LEANPSK
  3139. /* turn on handshake group messages for ssl object */
  3140. int wolfSSL_set_group_messages(WOLFSSL* ssl)
  3141. {
  3142. if (ssl == NULL)
  3143. return BAD_FUNC_ARG;
  3144. ssl->options.groupMessages = 1;
  3145. return WOLFSSL_SUCCESS;
  3146. }
  3147. /* make minVersion the internal equivalent SSL version */
  3148. static int SetMinVersionHelper(byte* minVersion, int version)
  3149. {
  3150. #ifdef NO_TLS
  3151. (void)minVersion;
  3152. #endif
  3153. switch (version) {
  3154. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3155. case WOLFSSL_SSLV3:
  3156. *minVersion = SSLv3_MINOR;
  3157. break;
  3158. #endif
  3159. #ifndef NO_TLS
  3160. #ifndef NO_OLD_TLS
  3161. #ifdef WOLFSSL_ALLOW_TLSV10
  3162. case WOLFSSL_TLSV1:
  3163. *minVersion = TLSv1_MINOR;
  3164. break;
  3165. #endif
  3166. case WOLFSSL_TLSV1_1:
  3167. *minVersion = TLSv1_1_MINOR;
  3168. break;
  3169. #endif
  3170. #ifndef WOLFSSL_NO_TLS12
  3171. case WOLFSSL_TLSV1_2:
  3172. *minVersion = TLSv1_2_MINOR;
  3173. break;
  3174. #endif
  3175. #endif
  3176. #ifdef WOLFSSL_TLS13
  3177. case WOLFSSL_TLSV1_3:
  3178. *minVersion = TLSv1_3_MINOR;
  3179. break;
  3180. #endif
  3181. default:
  3182. WOLFSSL_MSG("Bad function argument");
  3183. return BAD_FUNC_ARG;
  3184. }
  3185. return WOLFSSL_SUCCESS;
  3186. }
  3187. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3188. WOLFSSL_ABI
  3189. int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version)
  3190. {
  3191. WOLFSSL_ENTER("wolfSSL_CTX_SetMinVersion");
  3192. if (ctx == NULL) {
  3193. WOLFSSL_MSG("Bad function argument");
  3194. return BAD_FUNC_ARG;
  3195. }
  3196. return SetMinVersionHelper(&ctx->minDowngrade, version);
  3197. }
  3198. /* Set minimum downgrade version allowed, WOLFSSL_SUCCESS on ok */
  3199. int wolfSSL_SetMinVersion(WOLFSSL* ssl, int version)
  3200. {
  3201. WOLFSSL_ENTER("wolfSSL_SetMinVersion");
  3202. if (ssl == NULL) {
  3203. WOLFSSL_MSG("Bad function argument");
  3204. return BAD_FUNC_ARG;
  3205. }
  3206. return SetMinVersionHelper(&ssl->options.minDowngrade, version);
  3207. }
  3208. /* Function to get version as WOLFSSL_ enum value for wolfSSL_SetVersion */
  3209. int wolfSSL_GetVersion(WOLFSSL* ssl)
  3210. {
  3211. if (ssl == NULL)
  3212. return BAD_FUNC_ARG;
  3213. if (ssl->version.major == SSLv3_MAJOR) {
  3214. switch (ssl->version.minor) {
  3215. case SSLv3_MINOR :
  3216. return WOLFSSL_SSLV3;
  3217. case TLSv1_MINOR :
  3218. return WOLFSSL_TLSV1;
  3219. case TLSv1_1_MINOR :
  3220. return WOLFSSL_TLSV1_1;
  3221. case TLSv1_2_MINOR :
  3222. return WOLFSSL_TLSV1_2;
  3223. case TLSv1_3_MINOR :
  3224. return WOLFSSL_TLSV1_3;
  3225. default:
  3226. break;
  3227. }
  3228. }
  3229. return VERSION_ERROR;
  3230. }
  3231. int wolfSSL_SetVersion(WOLFSSL* ssl, int version)
  3232. {
  3233. word16 haveRSA = 1;
  3234. word16 havePSK = 0;
  3235. int keySz = 0;
  3236. WOLFSSL_ENTER("wolfSSL_SetVersion");
  3237. if (ssl == NULL) {
  3238. WOLFSSL_MSG("Bad function argument");
  3239. return BAD_FUNC_ARG;
  3240. }
  3241. switch (version) {
  3242. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  3243. case WOLFSSL_SSLV3:
  3244. ssl->version = MakeSSLv3();
  3245. break;
  3246. #endif
  3247. #ifndef NO_TLS
  3248. #ifndef NO_OLD_TLS
  3249. #ifdef WOLFSSL_ALLOW_TLSV10
  3250. case WOLFSSL_TLSV1:
  3251. ssl->version = MakeTLSv1();
  3252. break;
  3253. #endif
  3254. case WOLFSSL_TLSV1_1:
  3255. ssl->version = MakeTLSv1_1();
  3256. break;
  3257. #endif
  3258. #ifndef WOLFSSL_NO_TLS12
  3259. case WOLFSSL_TLSV1_2:
  3260. ssl->version = MakeTLSv1_2();
  3261. break;
  3262. #endif
  3263. #endif
  3264. #ifdef WOLFSSL_TLS13
  3265. case WOLFSSL_TLSV1_3:
  3266. ssl->version = MakeTLSv1_3();
  3267. break;
  3268. #endif
  3269. default:
  3270. WOLFSSL_MSG("Bad function argument");
  3271. return BAD_FUNC_ARG;
  3272. }
  3273. #ifdef NO_RSA
  3274. haveRSA = 0;
  3275. #endif
  3276. #ifndef NO_PSK
  3277. havePSK = ssl->options.havePSK;
  3278. #endif
  3279. #ifndef NO_CERTS
  3280. keySz = ssl->buffers.keySz;
  3281. #endif
  3282. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  3283. ssl->options.haveDH, ssl->options.haveNTRU,
  3284. ssl->options.haveECDSAsig, ssl->options.haveECC,
  3285. ssl->options.haveStaticECC, ssl->options.side);
  3286. return WOLFSSL_SUCCESS;
  3287. }
  3288. #endif /* !leanpsk */
  3289. #if !defined(NO_CERTS) || !defined(NO_SESSION_CACHE)
  3290. /* Make a work from the front of random hash */
  3291. static WC_INLINE word32 MakeWordFromHash(const byte* hashID)
  3292. {
  3293. return ((word32)hashID[0] << 24) | ((word32)hashID[1] << 16) |
  3294. ((word32)hashID[2] << 8) | (word32)hashID[3];
  3295. }
  3296. #endif /* !NO_CERTS || !NO_SESSION_CACHE */
  3297. #ifndef NO_CERTS
  3298. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3299. static WC_INLINE word32 HashSigner(const byte* hash)
  3300. {
  3301. return MakeWordFromHash(hash) % CA_TABLE_SIZE;
  3302. }
  3303. /* does CA already exist on signer list */
  3304. int AlreadySigner(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3305. {
  3306. Signer* signers;
  3307. int ret = 0;
  3308. word32 row;
  3309. if (cm == NULL || hash == NULL) {
  3310. return ret;
  3311. }
  3312. row = HashSigner(hash);
  3313. if (wc_LockMutex(&cm->caLock) != 0) {
  3314. return ret;
  3315. }
  3316. signers = cm->caTable[row];
  3317. while (signers) {
  3318. byte* subjectHash;
  3319. #ifndef NO_SKID
  3320. subjectHash = signers->subjectKeyIdHash;
  3321. #else
  3322. subjectHash = signers->subjectNameHash;
  3323. #endif
  3324. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3325. ret = 1; /* success */
  3326. break;
  3327. }
  3328. signers = signers->next;
  3329. }
  3330. wc_UnLockMutex(&cm->caLock);
  3331. return ret;
  3332. }
  3333. #ifdef WOLFSSL_TRUST_PEER_CERT
  3334. /* hash is the SHA digest of name, just use first 32 bits as hash */
  3335. static WC_INLINE word32 TrustedPeerHashSigner(const byte* hash)
  3336. {
  3337. return MakeWordFromHash(hash) % TP_TABLE_SIZE;
  3338. }
  3339. /* does trusted peer already exist on signer list */
  3340. int AlreadyTrustedPeer(WOLFSSL_CERT_MANAGER* cm, byte* hash)
  3341. {
  3342. TrustedPeerCert* tp;
  3343. int ret = 0;
  3344. word32 row = TrustedPeerHashSigner(hash);
  3345. if (wc_LockMutex(&cm->tpLock) != 0)
  3346. return ret;
  3347. tp = cm->tpTable[row];
  3348. while (tp) {
  3349. byte* subjectHash;
  3350. #ifndef NO_SKID
  3351. subjectHash = tp->subjectKeyIdHash;
  3352. #else
  3353. subjectHash = tp->subjectNameHash;
  3354. #endif
  3355. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3356. ret = 1;
  3357. break;
  3358. }
  3359. tp = tp->next;
  3360. }
  3361. wc_UnLockMutex(&cm->tpLock);
  3362. return ret;
  3363. }
  3364. /* return Trusted Peer if found, otherwise NULL
  3365. type is what to match on
  3366. */
  3367. TrustedPeerCert* GetTrustedPeer(void* vp, byte* hash, int type)
  3368. {
  3369. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3370. TrustedPeerCert* ret = NULL;
  3371. TrustedPeerCert* tp = NULL;
  3372. word32 row;
  3373. if (cm == NULL || hash == NULL)
  3374. return NULL;
  3375. row = TrustedPeerHashSigner(hash);
  3376. if (wc_LockMutex(&cm->tpLock) != 0)
  3377. return ret;
  3378. tp = cm->tpTable[row];
  3379. while (tp) {
  3380. byte* subjectHash;
  3381. switch (type) {
  3382. #ifndef NO_SKID
  3383. case WC_MATCH_SKID:
  3384. subjectHash = tp->subjectKeyIdHash;
  3385. break;
  3386. #endif
  3387. case WC_MATCH_NAME:
  3388. subjectHash = tp->subjectNameHash;
  3389. break;
  3390. default:
  3391. WOLFSSL_MSG("Unknown search type");
  3392. wc_UnLockMutex(&cm->tpLock);
  3393. return NULL;
  3394. }
  3395. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3396. ret = tp;
  3397. break;
  3398. }
  3399. tp = tp->next;
  3400. }
  3401. wc_UnLockMutex(&cm->tpLock);
  3402. return ret;
  3403. }
  3404. int MatchTrustedPeer(TrustedPeerCert* tp, DecodedCert* cert)
  3405. {
  3406. if (tp == NULL || cert == NULL)
  3407. return BAD_FUNC_ARG;
  3408. /* subject key id or subject hash has been compared when searching
  3409. tpTable for the cert from function GetTrustedPeer */
  3410. /* compare signatures */
  3411. if (tp->sigLen == cert->sigLength) {
  3412. if (XMEMCMP(tp->sig, cert->signature, cert->sigLength)) {
  3413. return WOLFSSL_FAILURE;
  3414. }
  3415. }
  3416. else {
  3417. return WOLFSSL_FAILURE;
  3418. }
  3419. return WOLFSSL_SUCCESS;
  3420. }
  3421. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3422. /* return CA if found, otherwise NULL */
  3423. Signer* GetCA(void* vp, byte* hash)
  3424. {
  3425. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3426. Signer* ret = NULL;
  3427. Signer* signers;
  3428. word32 row = HashSigner(hash);
  3429. if (cm == NULL)
  3430. return NULL;
  3431. if (wc_LockMutex(&cm->caLock) != 0)
  3432. return ret;
  3433. signers = cm->caTable[row];
  3434. while (signers) {
  3435. byte* subjectHash;
  3436. #ifndef NO_SKID
  3437. subjectHash = signers->subjectKeyIdHash;
  3438. #else
  3439. subjectHash = signers->subjectNameHash;
  3440. #endif
  3441. if (XMEMCMP(hash, subjectHash, SIGNER_DIGEST_SIZE) == 0) {
  3442. ret = signers;
  3443. break;
  3444. }
  3445. signers = signers->next;
  3446. }
  3447. wc_UnLockMutex(&cm->caLock);
  3448. return ret;
  3449. }
  3450. #ifndef NO_SKID
  3451. /* return CA if found, otherwise NULL. Walk through hash table. */
  3452. Signer* GetCAByName(void* vp, byte* hash)
  3453. {
  3454. WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp;
  3455. Signer* ret = NULL;
  3456. Signer* signers;
  3457. word32 row;
  3458. if (cm == NULL)
  3459. return NULL;
  3460. if (wc_LockMutex(&cm->caLock) != 0)
  3461. return ret;
  3462. for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) {
  3463. signers = cm->caTable[row];
  3464. while (signers && ret == NULL) {
  3465. if (XMEMCMP(hash, signers->subjectNameHash,
  3466. SIGNER_DIGEST_SIZE) == 0) {
  3467. ret = signers;
  3468. }
  3469. signers = signers->next;
  3470. }
  3471. }
  3472. wc_UnLockMutex(&cm->caLock);
  3473. return ret;
  3474. }
  3475. #endif
  3476. #ifdef WOLFSSL_TRUST_PEER_CERT
  3477. /* add a trusted peer cert to linked list */
  3478. int AddTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int verify)
  3479. {
  3480. int ret, row;
  3481. TrustedPeerCert* peerCert;
  3482. DecodedCert* cert;
  3483. DerBuffer* der = *pDer;
  3484. byte* subjectHash = NULL;
  3485. WOLFSSL_MSG("Adding a Trusted Peer Cert");
  3486. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  3487. DYNAMIC_TYPE_DCERT);
  3488. if (cert == NULL)
  3489. return MEMORY_E;
  3490. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  3491. if ((ret = ParseCert(cert, TRUSTED_PEER_TYPE, verify, cm)) != 0) {
  3492. FreeDecodedCert(cert);
  3493. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  3494. return ret;
  3495. }
  3496. WOLFSSL_MSG("\tParsed new trusted peer cert");
  3497. peerCert = (TrustedPeerCert*)XMALLOC(sizeof(TrustedPeerCert), cm->heap,
  3498. DYNAMIC_TYPE_CERT);
  3499. if (peerCert == NULL) {
  3500. FreeDecodedCert(cert);
  3501. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3502. return MEMORY_E;
  3503. }
  3504. XMEMSET(peerCert, 0, sizeof(TrustedPeerCert));
  3505. #ifndef NO_SKID
  3506. if (cert->extAuthKeyIdSet) {
  3507. subjectHash = cert->extSubjKeyId;
  3508. }
  3509. else {
  3510. subjectHash = cert->subjectHash;
  3511. }
  3512. #else
  3513. subjectHash = cert->subjectHash;
  3514. #endif
  3515. #ifndef IGNORE_NAME_CONSTRAINTS
  3516. if (peerCert->permittedNames)
  3517. FreeNameSubtrees(peerCert->permittedNames, cm->heap);
  3518. if (peerCert->excludedNames)
  3519. FreeNameSubtrees(peerCert->excludedNames, cm->heap);
  3520. #endif
  3521. if (AlreadyTrustedPeer(cm, subjectHash)) {
  3522. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  3523. FreeTrustedPeer(peerCert, cm->heap);
  3524. (void)ret;
  3525. }
  3526. else {
  3527. /* add trusted peer signature */
  3528. peerCert->sigLen = cert->sigLength;
  3529. peerCert->sig = XMALLOC(cert->sigLength, cm->heap,
  3530. DYNAMIC_TYPE_SIGNATURE);
  3531. if (peerCert->sig == NULL) {
  3532. FreeDecodedCert(cert);
  3533. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3534. FreeTrustedPeer(peerCert, cm->heap);
  3535. return MEMORY_E;
  3536. }
  3537. XMEMCPY(peerCert->sig, cert->signature, cert->sigLength);
  3538. /* add trusted peer name */
  3539. peerCert->nameLen = cert->subjectCNLen;
  3540. peerCert->name = cert->subjectCN;
  3541. #ifndef IGNORE_NAME_CONSTRAINTS
  3542. peerCert->permittedNames = cert->permittedNames;
  3543. peerCert->excludedNames = cert->excludedNames;
  3544. #endif
  3545. /* add SKID when available and hash of name */
  3546. #ifndef NO_SKID
  3547. XMEMCPY(peerCert->subjectKeyIdHash, cert->extSubjKeyId,
  3548. SIGNER_DIGEST_SIZE);
  3549. #endif
  3550. XMEMCPY(peerCert->subjectNameHash, cert->subjectHash,
  3551. SIGNER_DIGEST_SIZE);
  3552. peerCert->next = NULL; /* If Key Usage not set, all uses valid. */
  3553. cert->subjectCN = 0;
  3554. #ifndef IGNORE_NAME_CONSTRAINTS
  3555. cert->permittedNames = NULL;
  3556. cert->excludedNames = NULL;
  3557. #endif
  3558. #ifndef NO_SKID
  3559. if (cert->extAuthKeyIdSet) {
  3560. row = TrustedPeerHashSigner(peerCert->subjectKeyIdHash);
  3561. }
  3562. else {
  3563. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  3564. }
  3565. #else
  3566. row = TrustedPeerHashSigner(peerCert->subjectNameHash);
  3567. #endif
  3568. if (wc_LockMutex(&cm->tpLock) == 0) {
  3569. peerCert->next = cm->tpTable[row];
  3570. cm->tpTable[row] = peerCert; /* takes ownership */
  3571. wc_UnLockMutex(&cm->tpLock);
  3572. }
  3573. else {
  3574. WOLFSSL_MSG("\tTrusted Peer Cert Mutex Lock failed");
  3575. FreeDecodedCert(cert);
  3576. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3577. FreeTrustedPeer(peerCert, cm->heap);
  3578. return BAD_MUTEX_E;
  3579. }
  3580. }
  3581. WOLFSSL_MSG("\tFreeing parsed trusted peer cert");
  3582. FreeDecodedCert(cert);
  3583. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  3584. WOLFSSL_MSG("\tFreeing der trusted peer cert");
  3585. FreeDer(&der);
  3586. WOLFSSL_MSG("\t\tOK Freeing der trusted peer cert");
  3587. WOLFSSL_LEAVE("AddTrustedPeer", ret);
  3588. return WOLFSSL_SUCCESS;
  3589. }
  3590. #endif /* WOLFSSL_TRUST_PEER_CERT */
  3591. /* owns der, internal now uses too */
  3592. /* type flag ids from user or from chain received during verify
  3593. don't allow chain ones to be added w/o isCA extension */
  3594. int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify)
  3595. {
  3596. int ret;
  3597. Signer* signer = NULL;
  3598. word32 row;
  3599. byte* subjectHash;
  3600. #ifdef WOLFSSL_SMALL_STACK
  3601. DecodedCert* cert = NULL;
  3602. #else
  3603. DecodedCert cert[1];
  3604. #endif
  3605. DerBuffer* der = *pDer;
  3606. WOLFSSL_MSG("Adding a CA");
  3607. if (cm == NULL) {
  3608. FreeDer(pDer);
  3609. return BAD_FUNC_ARG;
  3610. }
  3611. #ifdef WOLFSSL_SMALL_STACK
  3612. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  3613. DYNAMIC_TYPE_DCERT);
  3614. if (cert == NULL) {
  3615. FreeDer(pDer);
  3616. return MEMORY_E;
  3617. }
  3618. #endif
  3619. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  3620. ret = ParseCert(cert, CA_TYPE, verify, cm);
  3621. WOLFSSL_MSG("\tParsed new CA");
  3622. #ifndef NO_SKID
  3623. subjectHash = cert->extSubjKeyId;
  3624. #else
  3625. subjectHash = cert->subjectHash;
  3626. #endif
  3627. /* check CA key size */
  3628. if (verify) {
  3629. switch (cert->keyOID) {
  3630. #ifndef NO_RSA
  3631. case RSAk:
  3632. if (cm->minRsaKeySz < 0 ||
  3633. cert->pubKeySize < (word16)cm->minRsaKeySz) {
  3634. ret = RSA_KEY_SIZE_E;
  3635. WOLFSSL_MSG("\tCA RSA key size error");
  3636. }
  3637. break;
  3638. #endif /* !NO_RSA */
  3639. #ifdef HAVE_ECC
  3640. case ECDSAk:
  3641. if (cm->minEccKeySz < 0 ||
  3642. cert->pubKeySize < (word16)cm->minEccKeySz) {
  3643. ret = ECC_KEY_SIZE_E;
  3644. WOLFSSL_MSG("\tCA ECC key size error");
  3645. }
  3646. break;
  3647. #endif /* HAVE_ECC */
  3648. #ifdef HAVE_ED25519
  3649. case ED25519k:
  3650. if (cm->minEccKeySz < 0 ||
  3651. ED25519_KEY_SIZE < (word16)cm->minEccKeySz) {
  3652. ret = ECC_KEY_SIZE_E;
  3653. WOLFSSL_MSG("\tCA ECC key size error");
  3654. }
  3655. break;
  3656. #endif /* HAVE_ED25519 */
  3657. #ifdef HAVE_ED448
  3658. case ED448k:
  3659. if (cm->minEccKeySz < 0 ||
  3660. ED448_KEY_SIZE < (word16)cm->minEccKeySz) {
  3661. ret = ECC_KEY_SIZE_E;
  3662. WOLFSSL_MSG("\tCA ECC key size error");
  3663. }
  3664. break;
  3665. #endif /* HAVE_ED448 */
  3666. default:
  3667. WOLFSSL_MSG("\tNo key size check done on CA");
  3668. break; /* no size check if key type is not in switch */
  3669. }
  3670. }
  3671. if (ret == 0 && cert->isCA == 0 && type != WOLFSSL_USER_CA) {
  3672. WOLFSSL_MSG("\tCan't add as CA if not actually one");
  3673. ret = NOT_CA_ERROR;
  3674. }
  3675. #ifndef ALLOW_INVALID_CERTSIGN
  3676. else if (ret == 0 && cert->isCA == 1 && type != WOLFSSL_USER_CA &&
  3677. !cert->selfSigned && (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) == 0) {
  3678. /* Intermediate CA certs are required to have the keyCertSign
  3679. * extension set. User loaded root certs are not. */
  3680. WOLFSSL_MSG("\tDoesn't have key usage certificate signing");
  3681. ret = NOT_CA_ERROR;
  3682. }
  3683. #endif
  3684. else if (ret == 0 && AlreadySigner(cm, subjectHash)) {
  3685. WOLFSSL_MSG("\tAlready have this CA, not adding again");
  3686. (void)ret;
  3687. }
  3688. else if (ret == 0) {
  3689. /* take over signer parts */
  3690. signer = MakeSigner(cm->heap);
  3691. if (!signer)
  3692. ret = MEMORY_ERROR;
  3693. }
  3694. if (ret == 0 && signer != NULL) {
  3695. #ifdef WOLFSSL_SIGNER_DER_CERT
  3696. ret = AllocDer(&signer->derCert, der->length, der->type, NULL);
  3697. }
  3698. if (ret == 0 && signer != NULL) {
  3699. XMEMCPY(signer->derCert->buffer, der->buffer, der->length);
  3700. #endif
  3701. signer->keyOID = cert->keyOID;
  3702. if (cert->pubKeyStored) {
  3703. signer->publicKey = cert->publicKey;
  3704. signer->pubKeySize = cert->pubKeySize;
  3705. }
  3706. if (cert->subjectCNStored) {
  3707. signer->nameLen = cert->subjectCNLen;
  3708. signer->name = cert->subjectCN;
  3709. }
  3710. signer->pathLength = cert->pathLength;
  3711. signer->maxPathLen = cert->maxPathLen;
  3712. signer->pathLengthSet = cert->pathLengthSet;
  3713. signer->selfSigned = cert->selfSigned;
  3714. #ifndef IGNORE_NAME_CONSTRAINTS
  3715. signer->permittedNames = cert->permittedNames;
  3716. signer->excludedNames = cert->excludedNames;
  3717. #endif
  3718. #ifndef NO_SKID
  3719. XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId,
  3720. SIGNER_DIGEST_SIZE);
  3721. #endif
  3722. XMEMCPY(signer->subjectNameHash, cert->subjectHash,
  3723. SIGNER_DIGEST_SIZE);
  3724. #ifdef HAVE_OCSP
  3725. XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash,
  3726. KEYID_SIZE);
  3727. #endif
  3728. signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage
  3729. : 0xFFFF;
  3730. signer->next = NULL; /* If Key Usage not set, all uses valid. */
  3731. cert->publicKey = 0; /* in case lock fails don't free here. */
  3732. cert->subjectCN = 0;
  3733. #ifndef IGNORE_NAME_CONSTRAINTS
  3734. cert->permittedNames = NULL;
  3735. cert->excludedNames = NULL;
  3736. #endif
  3737. #ifndef NO_SKID
  3738. row = HashSigner(signer->subjectKeyIdHash);
  3739. #else
  3740. row = HashSigner(signer->subjectNameHash);
  3741. #endif
  3742. if (wc_LockMutex(&cm->caLock) == 0) {
  3743. signer->next = cm->caTable[row];
  3744. cm->caTable[row] = signer; /* takes ownership */
  3745. wc_UnLockMutex(&cm->caLock);
  3746. if (cm->caCacheCallback)
  3747. cm->caCacheCallback(der->buffer, (int)der->length, type);
  3748. }
  3749. else {
  3750. WOLFSSL_MSG("\tCA Mutex Lock failed");
  3751. ret = BAD_MUTEX_E;
  3752. FreeSigner(signer, cm->heap);
  3753. }
  3754. }
  3755. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  3756. /* Verify CA by TSIP so that generated tsip key is going to be able to */
  3757. /* be used for peer's cert verification */
  3758. /* TSIP is only able to handle USER CA, and only one CA. */
  3759. /* Therefore, it doesn't need to call TSIP again if there is already */
  3760. /* verified CA. */
  3761. if ( ret == 0 && signer != NULL ) {
  3762. signer->cm_idx = row;
  3763. if (type == WOLFSSL_USER_CA && tsip_rootCAverified() == 0 ) {
  3764. if ((ret = tsip_tls_RootCertVerify(cert->source, cert->maxIdx,
  3765. cert->sigCtx.pubkey_n_start, cert->sigCtx.pubkey_n_len - 1,
  3766. cert->sigCtx.pubkey_e_start, cert->sigCtx.pubkey_e_len - 1,
  3767. row/* cm index */))
  3768. != 0)
  3769. WOLFSSL_MSG("tsip_tls_RootCertVerify() failed");
  3770. else
  3771. WOLFSSL_MSG("tsip_tls_RootCertVerify() succeed");
  3772. }
  3773. }
  3774. #endif
  3775. WOLFSSL_MSG("\tFreeing Parsed CA");
  3776. FreeDecodedCert(cert);
  3777. #ifdef WOLFSSL_SMALL_STACK
  3778. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  3779. #endif
  3780. WOLFSSL_MSG("\tFreeing der CA");
  3781. FreeDer(pDer);
  3782. WOLFSSL_MSG("\t\tOK Freeing der CA");
  3783. WOLFSSL_LEAVE("AddCA", ret);
  3784. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  3785. }
  3786. #endif /* !NO_CERTS */
  3787. #ifndef NO_SESSION_CACHE
  3788. /* basic config gives a cache with 33 sessions, adequate for clients and
  3789. embedded servers
  3790. TITAN_SESSION_CACHE allows just over 2 million sessions, for servers
  3791. with titanic amounts of memory with long session ID timeouts and high
  3792. levels of traffic.
  3793. HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load,
  3794. allows over 13,000 new sessions per minute or over 200 new sessions per
  3795. second
  3796. BIG_SESSION_CACHE yields 20,027 sessions
  3797. MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that
  3798. aren't under heavy load, basically allows 200 new sessions per minute
  3799. SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients
  3800. or systems where the default of nearly 3kB is too much RAM, this define
  3801. uses less than 500 bytes RAM
  3802. default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined)
  3803. */
  3804. #if defined(TITAN_SESSION_CACHE)
  3805. #define SESSIONS_PER_ROW 31
  3806. #define SESSION_ROWS 64937
  3807. #elif defined(HUGE_SESSION_CACHE)
  3808. #define SESSIONS_PER_ROW 11
  3809. #define SESSION_ROWS 5981
  3810. #elif defined(BIG_SESSION_CACHE)
  3811. #define SESSIONS_PER_ROW 7
  3812. #define SESSION_ROWS 2861
  3813. #elif defined(MEDIUM_SESSION_CACHE)
  3814. #define SESSIONS_PER_ROW 5
  3815. #define SESSION_ROWS 211
  3816. #elif defined(SMALL_SESSION_CACHE)
  3817. #define SESSIONS_PER_ROW 2
  3818. #define SESSION_ROWS 3
  3819. #else
  3820. #define SESSIONS_PER_ROW 3
  3821. #define SESSION_ROWS 11
  3822. #endif
  3823. typedef struct SessionRow {
  3824. int nextIdx; /* where to place next one */
  3825. int totalCount; /* sessions ever on this row */
  3826. WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW];
  3827. } SessionRow;
  3828. static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS];
  3829. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  3830. static WOLFSSL_GLOBAL word32 PeakSessions;
  3831. #endif
  3832. static WOLFSSL_GLOBAL wolfSSL_Mutex session_mutex; /* SessionCache mutex */
  3833. #ifndef NO_CLIENT_CACHE
  3834. typedef struct ClientSession {
  3835. word16 serverRow; /* SessionCache Row id */
  3836. word16 serverIdx; /* SessionCache Idx (column) */
  3837. } ClientSession;
  3838. typedef struct ClientRow {
  3839. int nextIdx; /* where to place next one */
  3840. int totalCount; /* sessions ever on this row */
  3841. ClientSession Clients[SESSIONS_PER_ROW];
  3842. } ClientRow;
  3843. static WOLFSSL_GLOBAL ClientRow ClientCache[SESSION_ROWS];
  3844. /* Client Cache */
  3845. /* uses session mutex */
  3846. #endif /* NO_CLIENT_CACHE */
  3847. #endif /* NO_SESSION_CACHE */
  3848. WOLFSSL_ABI
  3849. int wolfSSL_Init(void)
  3850. {
  3851. WOLFSSL_ENTER("wolfSSL_Init");
  3852. if (initRefCount == 0) {
  3853. /* Initialize crypto for use with TLS connection */
  3854. if (wolfCrypt_Init() != 0) {
  3855. WOLFSSL_MSG("Bad wolfCrypt Init");
  3856. return WC_INIT_E;
  3857. }
  3858. #ifdef OPENSSL_EXTRA
  3859. if (wolfSSL_RAND_seed(NULL, 0) != WOLFSSL_SUCCESS) {
  3860. WOLFSSL_MSG("wolfSSL_RAND_Seed failed");
  3861. return WC_INIT_E;
  3862. }
  3863. #endif
  3864. #ifndef NO_SESSION_CACHE
  3865. if (wc_InitMutex(&session_mutex) != 0) {
  3866. WOLFSSL_MSG("Bad Init Mutex session");
  3867. return BAD_MUTEX_E;
  3868. }
  3869. #endif
  3870. if (wc_InitMutex(&count_mutex) != 0) {
  3871. WOLFSSL_MSG("Bad Init Mutex count");
  3872. return BAD_MUTEX_E;
  3873. }
  3874. }
  3875. if (wc_LockMutex(&count_mutex) != 0) {
  3876. WOLFSSL_MSG("Bad Lock Mutex count");
  3877. return BAD_MUTEX_E;
  3878. }
  3879. initRefCount++;
  3880. wc_UnLockMutex(&count_mutex);
  3881. return WOLFSSL_SUCCESS;
  3882. }
  3883. #ifndef NO_CERTS
  3884. /* process user cert chain to pass during the handshake */
  3885. static int ProcessUserChain(WOLFSSL_CTX* ctx, const unsigned char* buff,
  3886. long sz, int format, int type, WOLFSSL* ssl,
  3887. long* used, EncryptedInfo* info, int verify)
  3888. {
  3889. int ret = 0;
  3890. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  3891. #ifdef WOLFSSL_TLS13
  3892. int cnt = 0;
  3893. #endif
  3894. if ((type == CA_TYPE) && (ctx == NULL)) {
  3895. WOLFSSL_MSG("Need context for CA load");
  3896. return BAD_FUNC_ARG;
  3897. }
  3898. /* we may have a user cert chain, try to consume */
  3899. if ((type == CERT_TYPE || type == CA_TYPE) && (info->consumed < sz)) {
  3900. #ifdef WOLFSSL_SMALL_STACK
  3901. byte staticBuffer[1]; /* force heap usage */
  3902. #else
  3903. byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */
  3904. #endif
  3905. byte* chainBuffer = staticBuffer;
  3906. int dynamicBuffer = 0;
  3907. word32 bufferSz;
  3908. long consumed = info->consumed;
  3909. word32 idx = 0;
  3910. int gotOne = 0;
  3911. /* Calculate max possible size, including max headers */
  3912. bufferSz = (word32)(sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH);
  3913. if (bufferSz > sizeof(staticBuffer)) {
  3914. WOLFSSL_MSG("Growing Tmp Chain Buffer");
  3915. /* will shrink to actual size */
  3916. chainBuffer = (byte*)XMALLOC(bufferSz, heap, DYNAMIC_TYPE_FILE);
  3917. if (chainBuffer == NULL) {
  3918. return MEMORY_E;
  3919. }
  3920. dynamicBuffer = 1;
  3921. }
  3922. WOLFSSL_MSG("Processing Cert Chain");
  3923. while (consumed < sz) {
  3924. DerBuffer* part = NULL;
  3925. word32 remain = (word32)(sz - consumed);
  3926. info->consumed = 0;
  3927. if (format == WOLFSSL_FILETYPE_PEM) {
  3928. #ifdef WOLFSSL_PEM_TO_DER
  3929. ret = PemToDer(buff + consumed, remain, type, &part,
  3930. heap, info, NULL);
  3931. #else
  3932. ret = NOT_COMPILED_IN;
  3933. #endif
  3934. }
  3935. else {
  3936. int length = remain;
  3937. if (format == WOLFSSL_FILETYPE_ASN1) {
  3938. /* get length of der (read sequence) */
  3939. word32 inOutIdx = 0;
  3940. if (GetSequence(buff + consumed, &inOutIdx, &length,
  3941. remain) < 0) {
  3942. ret = ASN_NO_PEM_HEADER;
  3943. }
  3944. length += inOutIdx; /* include leading sequence */
  3945. }
  3946. info->consumed = length;
  3947. if (ret == 0) {
  3948. ret = AllocDer(&part, length, type, heap);
  3949. if (ret == 0) {
  3950. XMEMCPY(part->buffer, buff + consumed, length);
  3951. }
  3952. }
  3953. }
  3954. if (ret == 0) {
  3955. gotOne = 1;
  3956. #ifdef WOLFSSL_TLS13
  3957. cnt++;
  3958. #endif
  3959. if ((idx + part->length + CERT_HEADER_SZ) > bufferSz) {
  3960. WOLFSSL_MSG(" Cert Chain bigger than buffer");
  3961. ret = BUFFER_E;
  3962. }
  3963. else {
  3964. c32to24(part->length, &chainBuffer[idx]);
  3965. idx += CERT_HEADER_SZ;
  3966. XMEMCPY(&chainBuffer[idx], part->buffer, part->length);
  3967. idx += part->length;
  3968. consumed += info->consumed;
  3969. if (used)
  3970. *used += info->consumed;
  3971. }
  3972. /* add CA's to certificate manager */
  3973. if (type == CA_TYPE) {
  3974. /* verify CA unless user set to no verify */
  3975. ret = AddCA(ctx->cm, &part, WOLFSSL_USER_CA, verify);
  3976. gotOne = 0; /* don't exit loop for CA type */
  3977. }
  3978. }
  3979. FreeDer(&part);
  3980. if (ret == ASN_NO_PEM_HEADER && gotOne) {
  3981. WOLFSSL_MSG("We got one good cert, so stuff at end ok");
  3982. break;
  3983. }
  3984. if (ret < 0) {
  3985. WOLFSSL_MSG(" Error in Cert in Chain");
  3986. if (dynamicBuffer)
  3987. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  3988. return ret;
  3989. }
  3990. WOLFSSL_MSG(" Consumed another Cert in Chain");
  3991. }
  3992. WOLFSSL_MSG("Finished Processing Cert Chain");
  3993. /* only retain actual size used */
  3994. ret = 0;
  3995. if (idx > 0) {
  3996. if (ssl) {
  3997. if (ssl->buffers.weOwnCertChain) {
  3998. FreeDer(&ssl->buffers.certChain);
  3999. }
  4000. ret = AllocDer(&ssl->buffers.certChain, idx, type, heap);
  4001. if (ret == 0) {
  4002. XMEMCPY(ssl->buffers.certChain->buffer, chainBuffer,
  4003. idx);
  4004. ssl->buffers.weOwnCertChain = 1;
  4005. }
  4006. #ifdef WOLFSSL_TLS13
  4007. ssl->buffers.certChainCnt = cnt;
  4008. #endif
  4009. } else if (ctx) {
  4010. FreeDer(&ctx->certChain);
  4011. ret = AllocDer(&ctx->certChain, idx, type, heap);
  4012. if (ret == 0) {
  4013. XMEMCPY(ctx->certChain->buffer, chainBuffer, idx);
  4014. }
  4015. #ifdef WOLFSSL_TLS13
  4016. ctx->certChainCnt = cnt;
  4017. #endif
  4018. }
  4019. }
  4020. if (dynamicBuffer)
  4021. XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE);
  4022. }
  4023. return ret;
  4024. }
  4025. static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl, DerBuffer* der,
  4026. int* keySz, word32* idx, int* resetSuites, int* keyFormat, void* heap, int devId)
  4027. {
  4028. int ret = 0;
  4029. (void)heap;
  4030. (void)devId;
  4031. if (ctx == NULL && ssl == NULL)
  4032. ret = BAD_FUNC_ARG;
  4033. if (!der || !keySz || !idx || !resetSuites || !keyFormat)
  4034. ret = BAD_FUNC_ARG;
  4035. #ifndef NO_RSA
  4036. if (ret == 0 && (*keyFormat == 0 || *keyFormat == RSAk)) {
  4037. /* make sure RSA key can be used */
  4038. #ifdef WOLFSSL_SMALL_STACK
  4039. RsaKey* key;
  4040. #else
  4041. RsaKey key[1];
  4042. #endif
  4043. #ifdef WOLFSSL_SMALL_STACK
  4044. key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  4045. if (key == NULL)
  4046. return MEMORY_E;
  4047. #endif
  4048. ret = wc_InitRsaKey_ex(key, heap, devId);
  4049. if (ret == 0) {
  4050. *idx = 0;
  4051. if (wc_RsaPrivateKeyDecode(der->buffer, idx, key, der->length)
  4052. != 0) {
  4053. #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
  4054. !defined(HAVE_ED448)
  4055. WOLFSSL_MSG("RSA decode failed and ECC/ED25519/ED448 not "
  4056. "enabled to try");
  4057. ret = WOLFSSL_BAD_FILE;
  4058. #endif
  4059. }
  4060. else {
  4061. /* check that the size of the RSA key is enough */
  4062. int minRsaSz = ssl ? ssl->options.minRsaKeySz :
  4063. ctx->minRsaKeySz;
  4064. *keySz = wc_RsaEncryptSize((RsaKey*)key);
  4065. if (*keySz < minRsaSz) {
  4066. ret = RSA_KEY_SIZE_E;
  4067. WOLFSSL_MSG("Private Key size too small");
  4068. }
  4069. if (ssl) {
  4070. ssl->buffers.keyType = rsa_sa_algo;
  4071. ssl->buffers.keySz = *keySz;
  4072. }
  4073. else {
  4074. ctx->privateKeyType = rsa_sa_algo;
  4075. ctx->privateKeySz = *keySz;
  4076. }
  4077. *keyFormat = RSAk;
  4078. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4079. ssl->options.haveStaticECC = 0;
  4080. *resetSuites = 1;
  4081. }
  4082. }
  4083. wc_FreeRsaKey(key);
  4084. }
  4085. #ifdef WOLFSSL_SMALL_STACK
  4086. XFREE(key, heap, DYNAMIC_TYPE_RSA);
  4087. #endif
  4088. }
  4089. #endif
  4090. #ifdef HAVE_ECC
  4091. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ECDSAk)) {
  4092. /* make sure ECC key can be used */
  4093. #ifdef WOLFSSL_SMALL_STACK
  4094. ecc_key* key;
  4095. #else
  4096. ecc_key key[1];
  4097. #endif
  4098. #ifdef WOLFSSL_SMALL_STACK
  4099. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  4100. if (key == NULL)
  4101. return MEMORY_E;
  4102. #endif
  4103. if (wc_ecc_init_ex(key, heap, devId) == 0) {
  4104. *idx = 0;
  4105. if (wc_EccPrivateKeyDecode(der->buffer, idx, key,
  4106. der->length) == 0) {
  4107. /* check for minimum ECC key size and then free */
  4108. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4109. ctx->minEccKeySz;
  4110. *keySz = wc_ecc_size(key);
  4111. if (*keySz < minKeySz) {
  4112. WOLFSSL_MSG("ECC private key too small");
  4113. ret = ECC_KEY_SIZE_E;
  4114. }
  4115. *keyFormat = ECDSAk;
  4116. if (ssl) {
  4117. ssl->options.haveStaticECC = 1;
  4118. ssl->buffers.keyType = ecc_dsa_sa_algo;
  4119. ssl->buffers.keySz = *keySz;
  4120. }
  4121. else {
  4122. ctx->haveStaticECC = 1;
  4123. ctx->privateKeyType = ecc_dsa_sa_algo;
  4124. ctx->privateKeySz = *keySz;
  4125. }
  4126. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4127. *resetSuites = 1;
  4128. }
  4129. }
  4130. wc_ecc_free(key);
  4131. }
  4132. #ifdef WOLFSSL_SMALL_STACK
  4133. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  4134. #endif
  4135. }
  4136. #endif /* HAVE_ECC */
  4137. #ifdef HAVE_ED25519
  4138. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ED25519k)) {
  4139. /* make sure Ed25519 key can be used */
  4140. #ifdef WOLFSSL_SMALL_STACK
  4141. ed25519_key* key;
  4142. #else
  4143. ed25519_key key[1];
  4144. #endif
  4145. #ifdef WOLFSSL_SMALL_STACK
  4146. key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap,
  4147. DYNAMIC_TYPE_ED25519);
  4148. if (key == NULL)
  4149. return MEMORY_E;
  4150. #endif
  4151. ret = wc_ed25519_init(key);
  4152. if (ret == 0) {
  4153. *idx = 0;
  4154. if (wc_Ed25519PrivateKeyDecode(der->buffer, idx, key,
  4155. der->length) == 0) {
  4156. /* check for minimum key size and then free */
  4157. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4158. ctx->minEccKeySz;
  4159. *keySz = ED25519_KEY_SIZE;
  4160. if (*keySz < minKeySz) {
  4161. WOLFSSL_MSG("ED25519 private key too small");
  4162. ret = ECC_KEY_SIZE_E;
  4163. }
  4164. if (ret == 0) {
  4165. if (ssl) {
  4166. ssl->buffers.keyType = ed25519_sa_algo;
  4167. ssl->buffers.keySz = *keySz;
  4168. }
  4169. else if (ctx) {
  4170. ctx->privateKeyType = ed25519_sa_algo;
  4171. ctx->privateKeySz = *keySz;
  4172. }
  4173. *keyFormat = ED25519k;
  4174. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4175. *resetSuites = 1;
  4176. }
  4177. }
  4178. }
  4179. wc_ed25519_free(key);
  4180. }
  4181. #ifdef WOLFSSL_SMALL_STACK
  4182. XFREE(key, heap, DYNAMIC_TYPE_ED25519);
  4183. #endif
  4184. }
  4185. #endif /* HAVE_ED25519 */
  4186. #ifdef HAVE_ED448
  4187. if (ret == 0 && (*keyFormat == 0 || *keyFormat == ED448k)) {
  4188. /* make sure Ed448 key can be used */
  4189. #ifdef WOLFSSL_SMALL_STACK
  4190. ed448_key* key = NULL;
  4191. #else
  4192. ed448_key key[1];
  4193. #endif
  4194. #ifdef WOLFSSL_SMALL_STACK
  4195. key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448);
  4196. if (key == NULL)
  4197. return MEMORY_E;
  4198. #endif
  4199. ret = wc_ed448_init(key);
  4200. if (ret == 0) {
  4201. *idx = 0;
  4202. if (wc_Ed448PrivateKeyDecode(der->buffer, idx, key,
  4203. der->length) != 0) {
  4204. ret = WOLFSSL_BAD_FILE;
  4205. }
  4206. if (ret == 0) {
  4207. /* check for minimum key size and then free */
  4208. int minKeySz = ssl ? ssl->options.minEccKeySz :
  4209. ctx->minEccKeySz;
  4210. *keySz = ED448_KEY_SIZE;
  4211. if (*keySz < minKeySz) {
  4212. WOLFSSL_MSG("ED448 private key too small");
  4213. ret = ECC_KEY_SIZE_E;
  4214. }
  4215. }
  4216. if (ret == 0) {
  4217. if (ssl) {
  4218. ssl->buffers.keyType = ed448_sa_algo;
  4219. ssl->buffers.keySz = *keySz;
  4220. }
  4221. else if (ctx) {
  4222. ctx->privateKeyType = ed448_sa_algo;
  4223. ctx->privateKeySz = *keySz;
  4224. }
  4225. *keyFormat = ED448k;
  4226. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4227. *resetSuites = 1;
  4228. }
  4229. }
  4230. wc_ed448_free(key);
  4231. }
  4232. #ifdef WOLFSSL_SMALL_STACK
  4233. XFREE(key, heap, DYNAMIC_TYPE_ED448);
  4234. #endif
  4235. }
  4236. #endif /* HAVE_ED448 */
  4237. return ret;
  4238. }
  4239. /* process the buffer buff, length sz, into ctx of format and type
  4240. used tracks bytes consumed, userChain specifies a user cert chain
  4241. to pass during the handshake */
  4242. int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4243. long sz, int format, int type, WOLFSSL* ssl,
  4244. long* used, int userChain, int verify)
  4245. {
  4246. DerBuffer* der = NULL; /* holds DER or RAW (for NTRU) */
  4247. int ret = 0;
  4248. int done = 0;
  4249. int keyFormat = 0;
  4250. int resetSuites = 0;
  4251. void* heap = wolfSSL_CTX_GetHeap(ctx, ssl);
  4252. int devId = wolfSSL_CTX_GetDevId(ctx, ssl);
  4253. word32 idx = 0;
  4254. int keySz = 0;
  4255. #if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \
  4256. defined(HAVE_PKCS8)
  4257. word32 algId = 0;
  4258. #endif
  4259. #ifdef WOLFSSL_SMALL_STACK
  4260. EncryptedInfo* info = NULL;
  4261. #else
  4262. EncryptedInfo info[1];
  4263. #endif
  4264. (void)devId;
  4265. (void)idx;
  4266. (void)keySz;
  4267. if (used)
  4268. *used = sz; /* used bytes default to sz, PEM chain may shorten*/
  4269. /* check args */
  4270. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM
  4271. && format != WOLFSSL_FILETYPE_RAW)
  4272. return WOLFSSL_BAD_FILETYPE;
  4273. if (ctx == NULL && ssl == NULL)
  4274. return BAD_FUNC_ARG;
  4275. #ifdef WOLFSSL_SMALL_STACK
  4276. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap,
  4277. DYNAMIC_TYPE_ENCRYPTEDINFO);
  4278. if (info == NULL)
  4279. return MEMORY_E;
  4280. #endif
  4281. XMEMSET(info, 0, sizeof(EncryptedInfo));
  4282. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  4283. if (ctx) {
  4284. info->passwd_cb = ctx->passwd_cb;
  4285. info->passwd_userdata = ctx->passwd_userdata;
  4286. }
  4287. #endif
  4288. if (format == WOLFSSL_FILETYPE_PEM) {
  4289. #ifdef WOLFSSL_PEM_TO_DER
  4290. ret = PemToDer(buff, sz, type, &der, heap, info, &keyFormat);
  4291. #else
  4292. ret = NOT_COMPILED_IN;
  4293. #endif
  4294. }
  4295. else {
  4296. /* ASN1 (DER) or RAW (NTRU) */
  4297. int length = (int)sz;
  4298. if (format == WOLFSSL_FILETYPE_ASN1) {
  4299. /* get length of der (read sequence or octet string) */
  4300. word32 inOutIdx = 0;
  4301. if (GetSequence(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  4302. length += inOutIdx; /* include leading sequence */
  4303. }
  4304. /* get length using octect string (allowed for private key types) */
  4305. else if (type == PRIVATEKEY_TYPE &&
  4306. GetOctetString(buff, &inOutIdx, &length, (word32)sz) >= 0) {
  4307. length += inOutIdx; /* include leading oct string */
  4308. }
  4309. else {
  4310. ret = ASN_PARSE_E;
  4311. }
  4312. }
  4313. info->consumed = length;
  4314. if (ret == 0) {
  4315. ret = AllocDer(&der, (word32)length, type, heap);
  4316. if (ret == 0) {
  4317. XMEMCPY(der->buffer, buff, length);
  4318. }
  4319. #ifdef HAVE_PKCS8
  4320. /* if private key try and remove PKCS8 header */
  4321. if (type == PRIVATEKEY_TYPE) {
  4322. if ((ret = ToTraditional_ex(der->buffer, der->length, &algId)) > 0) {
  4323. /* Found PKCS8 header */
  4324. /* ToTraditional_ex moves buff and returns adjusted length */
  4325. der->length = ret;
  4326. }
  4327. ret = 0; /* failures should be ignored */
  4328. }
  4329. #endif
  4330. }
  4331. }
  4332. if (used) {
  4333. *used = info->consumed;
  4334. }
  4335. /* process user chain */
  4336. if (ret >= 0) {
  4337. /* Chain should have server cert first, then intermediates, then root.
  4338. * First certificate in chain is processed below after ProcessUserChain
  4339. * and is loaded into ssl->buffers.certificate.
  4340. * Remainder are processed using ProcessUserChain and are loaded into
  4341. * ssl->buffers.certChain. */
  4342. if (userChain) {
  4343. ret = ProcessUserChain(ctx, buff, sz, format, type, ssl, used, info,
  4344. verify);
  4345. }
  4346. }
  4347. /* info is only used for private key with DER or PEM, so free now */
  4348. if (ret < 0 || type != PRIVATEKEY_TYPE || format == WOLFSSL_FILETYPE_RAW) {
  4349. #ifdef WOLFSSL_SMALL_STACK
  4350. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4351. #endif
  4352. }
  4353. /* check for error */
  4354. if (ret < 0) {
  4355. FreeDer(&der);
  4356. done = 1;
  4357. }
  4358. if (done == 1) {
  4359. /* No operation, just skip the next section */
  4360. }
  4361. /* Handle DER owner */
  4362. else if (type == CA_TYPE) {
  4363. if (ctx == NULL) {
  4364. WOLFSSL_MSG("Need context for CA load");
  4365. FreeDer(&der);
  4366. return BAD_FUNC_ARG;
  4367. }
  4368. /* verify CA unless user set to no verify */
  4369. ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify);
  4370. done = 1;
  4371. }
  4372. #ifdef WOLFSSL_TRUST_PEER_CERT
  4373. else if (type == TRUSTED_PEER_TYPE) {
  4374. if (ctx == NULL) {
  4375. WOLFSSL_MSG("Need context for trusted peer cert load");
  4376. FreeDer(&der);
  4377. return BAD_FUNC_ARG;
  4378. }
  4379. /* add trusted peer cert */
  4380. ret = AddTrustedPeer(ctx->cm, &der, !ctx->verifyNone);
  4381. done = 1;
  4382. }
  4383. #endif /* WOLFSSL_TRUST_PEER_CERT */
  4384. else if (type == CERT_TYPE) {
  4385. if (ssl) {
  4386. /* Make sure previous is free'd */
  4387. if (ssl->buffers.weOwnCert) {
  4388. FreeDer(&ssl->buffers.certificate);
  4389. #ifdef KEEP_OUR_CERT
  4390. FreeX509(ssl->ourCert);
  4391. if (ssl->ourCert) {
  4392. XFREE(ssl->ourCert, ssl->heap, DYNAMIC_TYPE_X509);
  4393. ssl->ourCert = NULL;
  4394. }
  4395. #endif
  4396. }
  4397. ssl->buffers.certificate = der;
  4398. #ifdef KEEP_OUR_CERT
  4399. ssl->keepCert = 1; /* hold cert for ssl lifetime */
  4400. #endif
  4401. ssl->buffers.weOwnCert = 1;
  4402. }
  4403. else if (ctx) {
  4404. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  4405. #ifdef KEEP_OUR_CERT
  4406. if (ctx->ourCert) {
  4407. if (ctx->ownOurCert) {
  4408. FreeX509(ctx->ourCert);
  4409. XFREE(ctx->ourCert, ctx->heap, DYNAMIC_TYPE_X509);
  4410. }
  4411. ctx->ourCert = NULL;
  4412. }
  4413. #endif
  4414. ctx->certificate = der;
  4415. }
  4416. }
  4417. else if (type == PRIVATEKEY_TYPE) {
  4418. if (ssl) {
  4419. /* Make sure previous is free'd */
  4420. if (ssl->buffers.weOwnKey) {
  4421. FreeDer(&ssl->buffers.key);
  4422. }
  4423. ssl->buffers.key = der;
  4424. ssl->buffers.weOwnKey = 1;
  4425. }
  4426. else if (ctx) {
  4427. FreeDer(&ctx->privateKey);
  4428. ctx->privateKey = der;
  4429. }
  4430. }
  4431. else {
  4432. FreeDer(&der);
  4433. return WOLFSSL_BAD_CERTTYPE;
  4434. }
  4435. if (done == 1) {
  4436. /* No operation, just skip the next section */
  4437. }
  4438. else if (type == PRIVATEKEY_TYPE && format != WOLFSSL_FILETYPE_RAW) {
  4439. #if defined(WOLFSSL_ENCRYPTED_KEYS) || defined(HAVE_PKCS8)
  4440. keyFormat = algId;
  4441. #endif
  4442. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, &resetSuites,
  4443. &keyFormat, heap, devId);
  4444. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  4445. /* for WOLFSSL_FILETYPE_PEM, PemToDer manages the decryption */
  4446. /* If private key type PKCS8 header wasn't already removed (algoId == 0) */
  4447. if ((ret != 0 || keyFormat == 0)
  4448. && format != WOLFSSL_FILETYPE_PEM && info->passwd_cb && algId == 0)
  4449. {
  4450. int passwordSz = NAME_SZ;
  4451. #ifndef WOLFSSL_SMALL_STACK
  4452. char password[NAME_SZ];
  4453. #else
  4454. char* password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING);
  4455. if (password == NULL) {
  4456. #ifdef WOLFSSL_SMALL_STACK
  4457. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4458. #endif
  4459. FreeDer(&der);
  4460. return MEMORY_E;
  4461. }
  4462. #endif
  4463. /* get password */
  4464. ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ,
  4465. info->passwd_userdata);
  4466. if (ret >= 0) {
  4467. passwordSz = ret;
  4468. /* PKCS8 decrypt */
  4469. ret = ToTraditionalEnc(der->buffer, der->length,
  4470. password, passwordSz, &algId);
  4471. if (ret >= 0) {
  4472. der->length = ret;
  4473. }
  4474. /* ignore failures and try parsing as unencrypted */
  4475. ForceZero(password, passwordSz);
  4476. }
  4477. #ifdef WOLFSSL_SMALL_STACK
  4478. XFREE(password, heap, DYNAMIC_TYPE_STRING);
  4479. #endif
  4480. ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx,
  4481. &resetSuites, &keyFormat, heap, devId);
  4482. }
  4483. #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
  4484. #ifdef WOLFSSL_SMALL_STACK
  4485. XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO);
  4486. #endif
  4487. if (ret != 0)
  4488. return ret;
  4489. if (keyFormat == 0)
  4490. return WOLFSSL_BAD_FILE;
  4491. (void)devId;
  4492. }
  4493. else if (type == CERT_TYPE) {
  4494. #ifdef WOLFSSL_SMALL_STACK
  4495. DecodedCert* cert;
  4496. #else
  4497. DecodedCert cert[1];
  4498. #endif
  4499. #ifdef HAVE_PK_CALLBACKS
  4500. int keyType = 0;
  4501. #endif
  4502. #ifdef WOLFSSL_SMALL_STACK
  4503. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap,
  4504. DYNAMIC_TYPE_DCERT);
  4505. if (cert == NULL)
  4506. return MEMORY_E;
  4507. #endif
  4508. WOLFSSL_MSG("Checking cert signature type");
  4509. InitDecodedCert(cert, der->buffer, der->length, heap);
  4510. if (DecodeToKey(cert, 0) < 0) {
  4511. WOLFSSL_MSG("Decode to key failed");
  4512. FreeDecodedCert(cert);
  4513. #ifdef WOLFSSL_SMALL_STACK
  4514. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  4515. #endif
  4516. return WOLFSSL_BAD_FILE;
  4517. }
  4518. if (ssl && ssl->options.side == WOLFSSL_SERVER_END) {
  4519. resetSuites = 1;
  4520. }
  4521. if (ssl && ssl->ctx->haveECDSAsig) {
  4522. WOLFSSL_MSG("SSL layer setting cert, CTX had ECDSA, turning off");
  4523. ssl->options.haveECDSAsig = 0; /* may turn back on next */
  4524. }
  4525. switch (cert->signatureOID) {
  4526. case CTC_SHAwECDSA:
  4527. case CTC_SHA256wECDSA:
  4528. case CTC_SHA384wECDSA:
  4529. case CTC_SHA512wECDSA:
  4530. WOLFSSL_MSG("ECDSA cert signature");
  4531. if (ssl)
  4532. ssl->options.haveECDSAsig = 1;
  4533. else if (ctx)
  4534. ctx->haveECDSAsig = 1;
  4535. break;
  4536. case CTC_ED25519:
  4537. WOLFSSL_MSG("ED25519 cert signature");
  4538. if (ssl)
  4539. ssl->options.haveECDSAsig = 1;
  4540. else if (ctx)
  4541. ctx->haveECDSAsig = 1;
  4542. break;
  4543. case CTC_ED448:
  4544. WOLFSSL_MSG("ED448 cert signature");
  4545. if (ssl)
  4546. ssl->options.haveECDSAsig = 1;
  4547. else if (ctx)
  4548. ctx->haveECDSAsig = 1;
  4549. break;
  4550. default:
  4551. WOLFSSL_MSG("Not ECDSA cert signature");
  4552. break;
  4553. }
  4554. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  4555. if (ssl) {
  4556. ssl->pkCurveOID = cert->pkCurveOID;
  4557. #ifndef WC_STRICT_SIG
  4558. if (cert->keyOID == ECDSAk) {
  4559. ssl->options.haveECC = 1;
  4560. }
  4561. #ifdef HAVE_ED25519
  4562. else if (cert->keyOID == ED25519k) {
  4563. ssl->options.haveECC = 1;
  4564. }
  4565. #endif
  4566. #ifdef HAVE_ED448
  4567. else if (cert->keyOID == ED448k) {
  4568. ssl->options.haveECC = 1;
  4569. }
  4570. #endif
  4571. #else
  4572. ssl->options.haveECC = ssl->options.haveECDSAsig;
  4573. #endif
  4574. }
  4575. else if (ctx) {
  4576. ctx->pkCurveOID = cert->pkCurveOID;
  4577. #ifndef WC_STRICT_SIG
  4578. if (cert->keyOID == ECDSAk) {
  4579. ctx->haveECC = 1;
  4580. }
  4581. #ifdef HAVE_ED25519
  4582. else if (cert->keyOID == ED25519k) {
  4583. ctx->haveECC = 1;
  4584. }
  4585. #endif
  4586. #ifdef HAVE_ED448
  4587. else if (cert->keyOID == ED448k) {
  4588. ctx->haveECC = 1;
  4589. }
  4590. #endif
  4591. #else
  4592. ctx->haveECC = ctx->haveECDSAsig;
  4593. #endif
  4594. }
  4595. #endif
  4596. /* check key size of cert unless specified not to */
  4597. switch (cert->keyOID) {
  4598. #ifndef NO_RSA
  4599. case RSAk:
  4600. #ifdef HAVE_PK_CALLBACKS
  4601. keyType = rsa_sa_algo;
  4602. #endif
  4603. #ifdef HAVE_PKCS11
  4604. if (ctx) {
  4605. ctx->privateKeyType = rsa_sa_algo;
  4606. }
  4607. else {
  4608. ssl->buffers.keyType = rsa_sa_algo;
  4609. }
  4610. #endif
  4611. /* Determine RSA key size by parsing public key */
  4612. idx = 0;
  4613. ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx,
  4614. cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL);
  4615. if (ret < 0)
  4616. break;
  4617. if (ssl && !ssl->options.verifyNone) {
  4618. if (ssl->options.minRsaKeySz < 0 ||
  4619. keySz < (int)ssl->options.minRsaKeySz) {
  4620. ret = RSA_KEY_SIZE_E;
  4621. WOLFSSL_MSG("Certificate RSA key size too small");
  4622. }
  4623. }
  4624. else if (ctx && !ctx->verifyNone) {
  4625. if (ctx->minRsaKeySz < 0 ||
  4626. keySz < (int)ctx->minRsaKeySz) {
  4627. ret = RSA_KEY_SIZE_E;
  4628. WOLFSSL_MSG("Certificate RSA key size too small");
  4629. }
  4630. }
  4631. break;
  4632. #endif /* !NO_RSA */
  4633. #ifdef HAVE_ECC
  4634. case ECDSAk:
  4635. #ifdef HAVE_PK_CALLBACKS
  4636. keyType = ecc_dsa_sa_algo;
  4637. #endif
  4638. #ifdef HAVE_PKCS11
  4639. if (ctx) {
  4640. ctx->privateKeyType = ecc_dsa_sa_algo;
  4641. }
  4642. else {
  4643. ssl->buffers.keyType = ecc_dsa_sa_algo;
  4644. }
  4645. #endif
  4646. /* Determine ECC key size based on curve */
  4647. keySz = wc_ecc_get_curve_size_from_id(
  4648. wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL));
  4649. if (ssl && !ssl->options.verifyNone) {
  4650. if (ssl->options.minEccKeySz < 0 ||
  4651. keySz < (int)ssl->options.minEccKeySz) {
  4652. ret = ECC_KEY_SIZE_E;
  4653. WOLFSSL_MSG("Certificate ECC key size error");
  4654. }
  4655. }
  4656. else if (ctx && !ctx->verifyNone) {
  4657. if (ctx->minEccKeySz < 0 ||
  4658. keySz < (int)ctx->minEccKeySz) {
  4659. ret = ECC_KEY_SIZE_E;
  4660. WOLFSSL_MSG("Certificate ECC key size error");
  4661. }
  4662. }
  4663. break;
  4664. #endif /* HAVE_ECC */
  4665. #ifdef HAVE_ED25519
  4666. case ED25519k:
  4667. #ifdef HAVE_PK_CALLBACKS
  4668. keyType = ed25519_sa_algo;
  4669. #endif
  4670. #ifdef HAVE_PKCS11
  4671. if (ctx) {
  4672. ctx->privateKeyType = ed25519_sa_algo;
  4673. }
  4674. else {
  4675. ssl->buffers.keyType = ed25519_sa_algo;
  4676. }
  4677. #endif
  4678. /* ED25519 is fixed key size */
  4679. keySz = ED25519_KEY_SIZE;
  4680. if (ssl && !ssl->options.verifyNone) {
  4681. if (ssl->options.minEccKeySz < 0 ||
  4682. keySz < (int)ssl->options.minEccKeySz) {
  4683. ret = ECC_KEY_SIZE_E;
  4684. WOLFSSL_MSG("Certificate Ed key size error");
  4685. }
  4686. }
  4687. else if (ctx && !ctx->verifyNone) {
  4688. if (ctx->minEccKeySz < 0 ||
  4689. keySz < (int)ctx->minEccKeySz) {
  4690. ret = ECC_KEY_SIZE_E;
  4691. WOLFSSL_MSG("Certificate ECC key size error");
  4692. }
  4693. }
  4694. break;
  4695. #endif /* HAVE_ED25519 */
  4696. #ifdef HAVE_ED448
  4697. case ED448k:
  4698. #ifdef HAVE_PK_CALLBACKS
  4699. keyType = ed448_sa_algo;
  4700. #endif
  4701. #ifdef HAVE_PKCS11
  4702. if (ctx) {
  4703. ctx->privateKeyType = ed448_sa_algo;
  4704. }
  4705. else {
  4706. ssl->buffers.keyType = ed448_sa_algo;
  4707. }
  4708. #endif
  4709. /* ED448 is fixed key size */
  4710. keySz = ED448_KEY_SIZE;
  4711. if (ssl && !ssl->options.verifyNone) {
  4712. if (ssl->options.minEccKeySz < 0 ||
  4713. keySz < (int)ssl->options.minEccKeySz) {
  4714. ret = ECC_KEY_SIZE_E;
  4715. WOLFSSL_MSG("Certificate Ed key size error");
  4716. }
  4717. }
  4718. else if (ctx && !ctx->verifyNone) {
  4719. if (ctx->minEccKeySz < 0 ||
  4720. keySz < (int)ctx->minEccKeySz) {
  4721. ret = ECC_KEY_SIZE_E;
  4722. WOLFSSL_MSG("Certificate ECC key size error");
  4723. }
  4724. }
  4725. break;
  4726. #endif /* HAVE_ED448 */
  4727. default:
  4728. WOLFSSL_MSG("No key size check done on certificate");
  4729. break; /* do no check if not a case for the key */
  4730. }
  4731. #ifdef HAVE_PK_CALLBACKS
  4732. if (ssl && ssl->buffers.keyType == 0) {
  4733. ssl->buffers.keyType = keyType;
  4734. ssl->buffers.keySz = keySz;
  4735. }
  4736. else if (ctx && ctx->privateKeyType == 0) {
  4737. ctx->privateKeyType = keyType;
  4738. ctx->privateKeySz = keySz;
  4739. }
  4740. #endif
  4741. FreeDecodedCert(cert);
  4742. #ifdef WOLFSSL_SMALL_STACK
  4743. XFREE(cert, heap, DYNAMIC_TYPE_DCERT);
  4744. #endif
  4745. if (ret != 0) {
  4746. done = 1;
  4747. }
  4748. }
  4749. if (done == 1) {
  4750. #ifndef NO_WOLFSSL_CM_VERIFY
  4751. if ((type == CA_TYPE) || (type == CERT_TYPE)) {
  4752. /* Call to over-ride status */
  4753. if ((ctx != NULL) && (ctx->cm != NULL) &&
  4754. (ctx->cm->verifyCallback != NULL)) {
  4755. ret = CM_VerifyBuffer_ex(ctx->cm, buff,
  4756. sz, format, (ret == WOLFSSL_SUCCESS ? 0 : ret));
  4757. }
  4758. }
  4759. #endif /* NO_WOLFSSL_CM_VERIFY */
  4760. return ret;
  4761. }
  4762. if (ssl && resetSuites) {
  4763. word16 havePSK = 0;
  4764. word16 haveRSA = 0;
  4765. #ifndef NO_PSK
  4766. if (ssl->options.havePSK) {
  4767. havePSK = 1;
  4768. }
  4769. #endif
  4770. #ifndef NO_RSA
  4771. haveRSA = 1;
  4772. #endif
  4773. #ifndef NO_CERTS
  4774. keySz = ssl->buffers.keySz;
  4775. #endif
  4776. /* let's reset suites */
  4777. InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
  4778. havePSK, ssl->options.haveDH, ssl->options.haveNTRU,
  4779. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4780. ssl->options.haveStaticECC, ssl->options.side);
  4781. }
  4782. return WOLFSSL_SUCCESS;
  4783. }
  4784. /* CA PEM file for verification, may have multiple/chain certs to process */
  4785. static int ProcessChainBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4786. long sz, int format, int type, WOLFSSL* ssl, int verify)
  4787. {
  4788. long used = 0;
  4789. int ret = 0;
  4790. int gotOne = 0;
  4791. WOLFSSL_MSG("Processing CA PEM file");
  4792. while (used < sz) {
  4793. long consumed = 0;
  4794. ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl,
  4795. &consumed, 0, verify);
  4796. if (ret < 0) {
  4797. #if defined(WOLFSSL_WPAS) && defined(HAVE_CRL)
  4798. DerBuffer* der = NULL;
  4799. EncryptedInfo info;
  4800. WOLFSSL_MSG("Trying a CRL");
  4801. if (PemToDer(buff + used, sz - used, CRL_TYPE, &der, NULL, &info,
  4802. NULL) == 0) {
  4803. WOLFSSL_MSG(" Processed a CRL");
  4804. wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer,
  4805. der->length, WOLFSSL_FILETYPE_ASN1);
  4806. FreeDer(&der);
  4807. used += info.consumed;
  4808. continue;
  4809. }
  4810. #endif
  4811. if (consumed > 0) { /* Made progress in file */
  4812. WOLFSSL_ERROR(ret);
  4813. WOLFSSL_MSG("CA Parse failed, with progress in file.");
  4814. WOLFSSL_MSG("Search for other certs in file");
  4815. }
  4816. else {
  4817. WOLFSSL_MSG("CA Parse failed, no progress in file.");
  4818. WOLFSSL_MSG("Do not continue search for other certs in file");
  4819. break;
  4820. }
  4821. }
  4822. else {
  4823. WOLFSSL_MSG(" Processed a CA");
  4824. gotOne = 1;
  4825. }
  4826. used += consumed;
  4827. }
  4828. if (gotOne) {
  4829. WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK");
  4830. return WOLFSSL_SUCCESS;
  4831. }
  4832. return ret;
  4833. }
  4834. static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void)
  4835. {
  4836. #ifndef NO_WOLFSSL_CLIENT
  4837. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  4838. return wolfSSLv3_client_method();
  4839. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  4840. return wolfTLSv1_client_method();
  4841. #elif !defined(NO_OLD_TLS)
  4842. return wolfTLSv1_1_client_method();
  4843. #elif !defined(WOLFSSL_NO_TLS12)
  4844. return wolfTLSv1_2_client_method();
  4845. #elif defined(WOLFSSL_TLS13)
  4846. return wolfTLSv1_3_client_method();
  4847. #else
  4848. return NULL;
  4849. #endif
  4850. #elif !defined(NO_WOLFSSL_SERVER)
  4851. #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3)
  4852. return wolfSSLv3_server_method();
  4853. #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10)
  4854. return wolfTLSv1_server_method();
  4855. #elif !defined(NO_OLD_TLS)
  4856. return wolfTLSv1_1_server_method();
  4857. #elif !defined(WOLFSSL_NO_TLS12)
  4858. return wolfTLSv1_2_server_method();
  4859. #elif defined(WOLFSSL_TLS13)
  4860. return wolfTLSv1_3_server_method();
  4861. #else
  4862. return NULL;
  4863. #endif
  4864. #else
  4865. return NULL;
  4866. #endif
  4867. }
  4868. /* like load verify locations, 1 for success, < 0 for error */
  4869. int wolfSSL_CertManagerLoadCABuffer(WOLFSSL_CERT_MANAGER* cm,
  4870. const unsigned char* in, long sz, int format)
  4871. {
  4872. int ret = WOLFSSL_FATAL_ERROR;
  4873. WOLFSSL_CTX* tmp;
  4874. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCABuffer");
  4875. if (cm == NULL) {
  4876. WOLFSSL_MSG("No CertManager error");
  4877. return ret;
  4878. }
  4879. tmp = wolfSSL_CTX_new(cm_pick_method());
  4880. if (tmp == NULL) {
  4881. WOLFSSL_MSG("CTX new failed");
  4882. return ret;
  4883. }
  4884. /* for tmp use */
  4885. wolfSSL_CertManagerFree(tmp->cm);
  4886. tmp->cm = cm;
  4887. ret = wolfSSL_CTX_load_verify_buffer(tmp, in, sz, format);
  4888. /* don't loose our good one */
  4889. tmp->cm = NULL;
  4890. wolfSSL_CTX_free(tmp);
  4891. return ret;
  4892. }
  4893. #ifdef HAVE_CRL
  4894. int wolfSSL_CertManagerLoadCRLBuffer(WOLFSSL_CERT_MANAGER* cm,
  4895. const unsigned char* buff, long sz, int type)
  4896. {
  4897. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLBuffer");
  4898. if (cm == NULL)
  4899. return BAD_FUNC_ARG;
  4900. if (cm->crl == NULL) {
  4901. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  4902. WOLFSSL_MSG("Enable CRL failed");
  4903. return WOLFSSL_FATAL_ERROR;
  4904. }
  4905. }
  4906. return BufferLoadCRL(cm->crl, buff, sz, type, VERIFY);
  4907. }
  4908. int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm)
  4909. {
  4910. WOLFSSL_ENTER("wolfSSL_CertManagerFreeCRL");
  4911. if (cm == NULL)
  4912. return BAD_FUNC_ARG;
  4913. if (cm->crl != NULL){
  4914. FreeCRL(cm->crl, 1);
  4915. cm->crl = NULL;
  4916. }
  4917. return WOLFSSL_SUCCESS;
  4918. }
  4919. int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff,
  4920. long sz, int type)
  4921. {
  4922. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRLBuffer");
  4923. if (ctx == NULL)
  4924. return BAD_FUNC_ARG;
  4925. return wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, buff, sz, type);
  4926. }
  4927. int wolfSSL_LoadCRLBuffer(WOLFSSL* ssl, const unsigned char* buff,
  4928. long sz, int type)
  4929. {
  4930. WOLFSSL_ENTER("wolfSSL_LoadCRLBuffer");
  4931. if (ssl == NULL || ssl->ctx == NULL)
  4932. return BAD_FUNC_ARG;
  4933. return wolfSSL_CertManagerLoadCRLBuffer(ssl->ctx->cm, buff, sz, type);
  4934. }
  4935. #endif /* HAVE_CRL */
  4936. /* turn on CRL if off and compiled in, set options */
  4937. int wolfSSL_CertManagerEnableCRL(WOLFSSL_CERT_MANAGER* cm, int options)
  4938. {
  4939. int ret = WOLFSSL_SUCCESS;
  4940. (void)options;
  4941. WOLFSSL_ENTER("wolfSSL_CertManagerEnableCRL");
  4942. if (cm == NULL)
  4943. return BAD_FUNC_ARG;
  4944. #ifdef HAVE_CRL
  4945. if (cm->crl == NULL) {
  4946. cm->crl = (WOLFSSL_CRL*)XMALLOC(sizeof(WOLFSSL_CRL), cm->heap,
  4947. DYNAMIC_TYPE_CRL);
  4948. if (cm->crl == NULL)
  4949. return MEMORY_E;
  4950. if (InitCRL(cm->crl, cm) != 0) {
  4951. WOLFSSL_MSG("Init CRL failed");
  4952. FreeCRL(cm->crl, 1);
  4953. cm->crl = NULL;
  4954. return WOLFSSL_FAILURE;
  4955. }
  4956. #ifdef HAVE_CRL_IO
  4957. cm->crl->crlIOCb = EmbedCrlLookup;
  4958. #endif
  4959. }
  4960. cm->crlEnabled = 1;
  4961. if (options & WOLFSSL_CRL_CHECKALL)
  4962. cm->crlCheckAll = 1;
  4963. #else
  4964. ret = NOT_COMPILED_IN;
  4965. #endif
  4966. return ret;
  4967. }
  4968. int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER* cm)
  4969. {
  4970. WOLFSSL_ENTER("wolfSSL_CertManagerDisableCRL");
  4971. if (cm == NULL)
  4972. return BAD_FUNC_ARG;
  4973. cm->crlEnabled = 0;
  4974. return WOLFSSL_SUCCESS;
  4975. }
  4976. #ifndef NO_WOLFSSL_CM_VERIFY
  4977. void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc)
  4978. {
  4979. WOLFSSL_ENTER("wolfSSL_CertManagerSetVerify");
  4980. if (cm == NULL)
  4981. return;
  4982. cm->verifyCallback = vc;
  4983. }
  4984. #endif /* NO_WOLFSSL_CM_VERIFY */
  4985. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  4986. int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  4987. long sz, int format, int err_val)
  4988. {
  4989. int ret = 0;
  4990. DerBuffer* der = NULL;
  4991. #ifdef WOLFSSL_SMALL_STACK
  4992. DecodedCert* cert;
  4993. #else
  4994. DecodedCert cert[1];
  4995. #endif
  4996. WOLFSSL_ENTER("wolfSSL_CertManagerVerifyBuffer");
  4997. #ifdef WOLFSSL_SMALL_STACK
  4998. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap,
  4999. DYNAMIC_TYPE_DCERT);
  5000. if (cert == NULL)
  5001. return MEMORY_E;
  5002. #endif
  5003. if (format == WOLFSSL_FILETYPE_PEM) {
  5004. #ifdef WOLFSSL_PEM_TO_DER
  5005. ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, NULL, NULL);
  5006. if (ret != 0) {
  5007. FreeDer(&der);
  5008. #ifdef WOLFSSL_SMALL_STACK
  5009. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5010. #endif
  5011. return ret;
  5012. }
  5013. InitDecodedCert(cert, der->buffer, der->length, cm->heap);
  5014. #else
  5015. ret = NOT_COMPILED_IN;
  5016. #endif
  5017. }
  5018. else {
  5019. InitDecodedCert(cert, (byte*)buff, (word32)sz, cm->heap);
  5020. }
  5021. if (ret == 0)
  5022. ret = ParseCertRelative(cert, CERT_TYPE, 1, cm);
  5023. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  5024. /* ret needs to be self-singer error for Qt compat */
  5025. if (ret == ASN_NO_SIGNER_E && cert->selfSigned)
  5026. ret = ASN_SELF_SIGNED_E;
  5027. #endif
  5028. #ifdef HAVE_CRL
  5029. if (ret == 0 && cm->crlEnabled)
  5030. ret = CheckCertCRL(cm->crl, cert);
  5031. #endif
  5032. #ifndef NO_WOLFSSL_CM_VERIFY
  5033. /* if verify callback has been set */
  5034. if (cm->verifyCallback) {
  5035. buffer certBuf;
  5036. #ifdef WOLFSSL_SMALL_STACK
  5037. ProcPeerCertArgs* args;
  5038. args = (ProcPeerCertArgs*)XMALLOC(
  5039. sizeof(ProcPeerCertArgs), cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5040. if (args == NULL) {
  5041. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5042. return MEMORY_E;
  5043. }
  5044. #else
  5045. ProcPeerCertArgs args[1];
  5046. #endif
  5047. certBuf.buffer = (byte*)buff;
  5048. certBuf.length = (unsigned int)sz;
  5049. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  5050. args->totalCerts = 1;
  5051. args->certs = &certBuf;
  5052. args->dCert = cert;
  5053. args->dCertInit = 1;
  5054. if (err_val != 0) {
  5055. ret = err_val;
  5056. }
  5057. ret = DoVerifyCallback(cm, NULL, ret, args);
  5058. #ifdef WOLFSSL_SMALL_STACK
  5059. XFREE(args, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5060. #endif
  5061. }
  5062. #else
  5063. (void)err_val;
  5064. #endif
  5065. FreeDecodedCert(cert);
  5066. FreeDer(&der);
  5067. #ifdef WOLFSSL_SMALL_STACK
  5068. XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
  5069. #endif
  5070. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5071. }
  5072. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5073. int wolfSSL_CertManagerVerifyBuffer(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
  5074. long sz, int format)
  5075. {
  5076. return CM_VerifyBuffer_ex(cm, buff, sz, format, 0);
  5077. }
  5078. /* turn on OCSP if off and compiled in, set options */
  5079. int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, int options)
  5080. {
  5081. int ret = WOLFSSL_SUCCESS;
  5082. (void)options;
  5083. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSP");
  5084. if (cm == NULL)
  5085. return BAD_FUNC_ARG;
  5086. #ifdef HAVE_OCSP
  5087. if (cm->ocsp == NULL) {
  5088. cm->ocsp = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), cm->heap,
  5089. DYNAMIC_TYPE_OCSP);
  5090. if (cm->ocsp == NULL)
  5091. return MEMORY_E;
  5092. if (InitOCSP(cm->ocsp, cm) != 0) {
  5093. WOLFSSL_MSG("Init OCSP failed");
  5094. FreeOCSP(cm->ocsp, 1);
  5095. cm->ocsp = NULL;
  5096. return WOLFSSL_FAILURE;
  5097. }
  5098. }
  5099. cm->ocspEnabled = 1;
  5100. if (options & WOLFSSL_OCSP_URL_OVERRIDE)
  5101. cm->ocspUseOverrideURL = 1;
  5102. if (options & WOLFSSL_OCSP_NO_NONCE)
  5103. cm->ocspSendNonce = 0;
  5104. else
  5105. cm->ocspSendNonce = 1;
  5106. if (options & WOLFSSL_OCSP_CHECKALL)
  5107. cm->ocspCheckAll = 1;
  5108. #ifndef WOLFSSL_USER_IO
  5109. cm->ocspIOCb = EmbedOcspLookup;
  5110. cm->ocspRespFreeCb = EmbedOcspRespFree;
  5111. cm->ocspIOCtx = cm->heap;
  5112. #endif /* WOLFSSL_USER_IO */
  5113. #else
  5114. ret = NOT_COMPILED_IN;
  5115. #endif
  5116. return ret;
  5117. }
  5118. int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER* cm)
  5119. {
  5120. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSP");
  5121. if (cm == NULL)
  5122. return BAD_FUNC_ARG;
  5123. cm->ocspEnabled = 0;
  5124. return WOLFSSL_SUCCESS;
  5125. }
  5126. /* turn on OCSP Stapling if off and compiled in, set options */
  5127. int wolfSSL_CertManagerEnableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  5128. {
  5129. int ret = WOLFSSL_SUCCESS;
  5130. WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPStapling");
  5131. if (cm == NULL)
  5132. return BAD_FUNC_ARG;
  5133. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5134. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5135. #ifndef NO_WOLFSSL_SERVER
  5136. if (cm->ocsp_stapling == NULL) {
  5137. cm->ocsp_stapling = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP),
  5138. cm->heap, DYNAMIC_TYPE_OCSP);
  5139. if (cm->ocsp_stapling == NULL)
  5140. return MEMORY_E;
  5141. if (InitOCSP(cm->ocsp_stapling, cm) != 0) {
  5142. WOLFSSL_MSG("Init OCSP failed");
  5143. FreeOCSP(cm->ocsp_stapling, 1);
  5144. cm->ocsp_stapling = NULL;
  5145. return WOLFSSL_FAILURE;
  5146. }
  5147. }
  5148. #ifndef WOLFSSL_USER_IO
  5149. cm->ocspIOCb = EmbedOcspLookup;
  5150. cm->ocspRespFreeCb = EmbedOcspRespFree;
  5151. cm->ocspIOCtx = cm->heap;
  5152. #endif /* WOLFSSL_USER_IO */
  5153. #endif /* NO_WOLFSSL_SERVER */
  5154. cm->ocspStaplingEnabled = 1;
  5155. #else
  5156. ret = NOT_COMPILED_IN;
  5157. #endif
  5158. return ret;
  5159. }
  5160. int wolfSSL_CertManagerDisableOCSPStapling(WOLFSSL_CERT_MANAGER* cm)
  5161. {
  5162. int ret = WOLFSSL_SUCCESS;
  5163. WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPStapling");
  5164. if (cm == NULL)
  5165. return BAD_FUNC_ARG;
  5166. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5167. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5168. cm->ocspStaplingEnabled = 0;
  5169. #else
  5170. ret = NOT_COMPILED_IN;
  5171. #endif
  5172. return ret;
  5173. }
  5174. #ifdef HAVE_OCSP
  5175. /* check CRL if enabled, WOLFSSL_SUCCESS */
  5176. int wolfSSL_CertManagerCheckOCSP(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  5177. {
  5178. int ret;
  5179. #ifdef WOLFSSL_SMALL_STACK
  5180. DecodedCert* cert = NULL;
  5181. #else
  5182. DecodedCert cert[1];
  5183. #endif
  5184. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP");
  5185. if (cm == NULL)
  5186. return BAD_FUNC_ARG;
  5187. if (cm->ocspEnabled == 0)
  5188. return WOLFSSL_SUCCESS;
  5189. #ifdef WOLFSSL_SMALL_STACK
  5190. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  5191. if (cert == NULL)
  5192. return MEMORY_E;
  5193. #endif
  5194. InitDecodedCert(cert, der, sz, NULL);
  5195. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm)) != 0) {
  5196. WOLFSSL_MSG("ParseCert failed");
  5197. }
  5198. else if ((ret = CheckCertOCSP(cm->ocsp, cert, NULL)) != 0) {
  5199. WOLFSSL_MSG("CheckCertOCSP failed");
  5200. }
  5201. FreeDecodedCert(cert);
  5202. #ifdef WOLFSSL_SMALL_STACK
  5203. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  5204. #endif
  5205. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5206. }
  5207. WOLFSSL_API int wolfSSL_CertManagerCheckOCSPResponse(WOLFSSL_CERT_MANAGER *cm,
  5208. byte *response, int responseSz, buffer *responseBuffer,
  5209. CertStatus *status, OcspEntry *entry, OcspRequest *ocspRequest)
  5210. {
  5211. int ret;
  5212. WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP_Staple");
  5213. if (cm == NULL || response == NULL)
  5214. return BAD_FUNC_ARG;
  5215. if (cm->ocspEnabled == 0)
  5216. return WOLFSSL_SUCCESS;
  5217. ret = CheckOcspResponse(cm->ocsp, response, responseSz, responseBuffer, status,
  5218. entry, ocspRequest);
  5219. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5220. }
  5221. int wolfSSL_CertManagerSetOCSPOverrideURL(WOLFSSL_CERT_MANAGER* cm,
  5222. const char* url)
  5223. {
  5224. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSPOverrideURL");
  5225. if (cm == NULL)
  5226. return BAD_FUNC_ARG;
  5227. XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
  5228. if (url != NULL) {
  5229. int urlSz = (int)XSTRLEN(url) + 1;
  5230. cm->ocspOverrideURL = (char*)XMALLOC(urlSz, cm->heap, DYNAMIC_TYPE_URL);
  5231. if (cm->ocspOverrideURL != NULL) {
  5232. XMEMCPY(cm->ocspOverrideURL, url, urlSz);
  5233. }
  5234. else
  5235. return MEMORY_E;
  5236. }
  5237. else
  5238. cm->ocspOverrideURL = NULL;
  5239. return WOLFSSL_SUCCESS;
  5240. }
  5241. int wolfSSL_CertManagerSetOCSP_Cb(WOLFSSL_CERT_MANAGER* cm,
  5242. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5243. {
  5244. WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSP_Cb");
  5245. if (cm == NULL)
  5246. return BAD_FUNC_ARG;
  5247. cm->ocspIOCb = ioCb;
  5248. cm->ocspRespFreeCb = respFreeCb;
  5249. cm->ocspIOCtx = ioCbCtx;
  5250. return WOLFSSL_SUCCESS;
  5251. }
  5252. int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options)
  5253. {
  5254. WOLFSSL_ENTER("wolfSSL_EnableOCSP");
  5255. if (ssl)
  5256. return wolfSSL_CertManagerEnableOCSP(ssl->ctx->cm, options);
  5257. else
  5258. return BAD_FUNC_ARG;
  5259. }
  5260. int wolfSSL_DisableOCSP(WOLFSSL* ssl)
  5261. {
  5262. WOLFSSL_ENTER("wolfSSL_DisableOCSP");
  5263. if (ssl)
  5264. return wolfSSL_CertManagerDisableOCSP(ssl->ctx->cm);
  5265. else
  5266. return BAD_FUNC_ARG;
  5267. }
  5268. int wolfSSL_EnableOCSPStapling(WOLFSSL* ssl)
  5269. {
  5270. WOLFSSL_ENTER("wolfSSL_EnableOCSPStapling");
  5271. if (ssl)
  5272. return wolfSSL_CertManagerEnableOCSPStapling(ssl->ctx->cm);
  5273. else
  5274. return BAD_FUNC_ARG;
  5275. }
  5276. int wolfSSL_DisableOCSPStapling(WOLFSSL* ssl)
  5277. {
  5278. WOLFSSL_ENTER("wolfSSL_DisableOCSPStapling");
  5279. if (ssl)
  5280. return wolfSSL_CertManagerDisableOCSPStapling(ssl->ctx->cm);
  5281. else
  5282. return BAD_FUNC_ARG;
  5283. }
  5284. int wolfSSL_SetOCSP_OverrideURL(WOLFSSL* ssl, const char* url)
  5285. {
  5286. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  5287. if (ssl)
  5288. return wolfSSL_CertManagerSetOCSPOverrideURL(ssl->ctx->cm, url);
  5289. else
  5290. return BAD_FUNC_ARG;
  5291. }
  5292. int wolfSSL_SetOCSP_Cb(WOLFSSL* ssl,
  5293. CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5294. {
  5295. WOLFSSL_ENTER("wolfSSL_SetOCSP_Cb");
  5296. if (ssl) {
  5297. ssl->ocspIOCtx = ioCbCtx; /* use SSL specific ioCbCtx */
  5298. return wolfSSL_CertManagerSetOCSP_Cb(ssl->ctx->cm,
  5299. ioCb, respFreeCb, NULL);
  5300. }
  5301. else
  5302. return BAD_FUNC_ARG;
  5303. }
  5304. int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options)
  5305. {
  5306. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSP");
  5307. if (ctx)
  5308. return wolfSSL_CertManagerEnableOCSP(ctx->cm, options);
  5309. else
  5310. return BAD_FUNC_ARG;
  5311. }
  5312. int wolfSSL_CTX_DisableOCSP(WOLFSSL_CTX* ctx)
  5313. {
  5314. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSP");
  5315. if (ctx)
  5316. return wolfSSL_CertManagerDisableOCSP(ctx->cm);
  5317. else
  5318. return BAD_FUNC_ARG;
  5319. }
  5320. int wolfSSL_CTX_SetOCSP_OverrideURL(WOLFSSL_CTX* ctx, const char* url)
  5321. {
  5322. WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL");
  5323. if (ctx)
  5324. return wolfSSL_CertManagerSetOCSPOverrideURL(ctx->cm, url);
  5325. else
  5326. return BAD_FUNC_ARG;
  5327. }
  5328. int wolfSSL_CTX_SetOCSP_Cb(WOLFSSL_CTX* ctx, CbOCSPIO ioCb,
  5329. CbOCSPRespFree respFreeCb, void* ioCbCtx)
  5330. {
  5331. WOLFSSL_ENTER("wolfSSL_CTX_SetOCSP_Cb");
  5332. if (ctx)
  5333. return wolfSSL_CertManagerSetOCSP_Cb(ctx->cm, ioCb,
  5334. respFreeCb, ioCbCtx);
  5335. else
  5336. return BAD_FUNC_ARG;
  5337. }
  5338. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  5339. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  5340. int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX* ctx)
  5341. {
  5342. WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPStapling");
  5343. if (ctx)
  5344. return wolfSSL_CertManagerEnableOCSPStapling(ctx->cm);
  5345. else
  5346. return BAD_FUNC_ARG;
  5347. }
  5348. int wolfSSL_CTX_DisableOCSPStapling(WOLFSSL_CTX* ctx)
  5349. {
  5350. WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPStapling");
  5351. if (ctx)
  5352. return wolfSSL_CertManagerDisableOCSPStapling(ctx->cm);
  5353. else
  5354. return BAD_FUNC_ARG;
  5355. }
  5356. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST || HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  5357. #endif /* HAVE_OCSP */
  5358. /* macro to get verify settings for AddCA */
  5359. #define GET_VERIFY_SETTING_CTX(ctx) \
  5360. (ctx && ctx->verifyNone ? NO_VERIFY : VERIFY)
  5361. #define GET_VERIFY_SETTING_SSL(ssl) \
  5362. (ssl && ssl->options.verifyNone ? NO_VERIFY : VERIFY)
  5363. #ifndef NO_FILESYSTEM
  5364. /* process a file with name fname into ctx of format and type
  5365. userChain specifies a user certificate chain to pass during handshake */
  5366. int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type,
  5367. WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify)
  5368. {
  5369. #ifdef WOLFSSL_SMALL_STACK
  5370. byte staticBuffer[1]; /* force heap usage */
  5371. #else
  5372. byte staticBuffer[FILE_BUFFER_SIZE];
  5373. #endif
  5374. byte* myBuffer = staticBuffer;
  5375. int dynamic = 0;
  5376. int ret;
  5377. long sz = 0;
  5378. XFILE file;
  5379. void* heapHint = wolfSSL_CTX_GetHeap(ctx, ssl);
  5380. const char* header = NULL;
  5381. const char* footer = NULL;
  5382. (void)crl;
  5383. (void)heapHint;
  5384. if (fname == NULL) return WOLFSSL_BAD_FILE;
  5385. file = XFOPEN(fname, "rb");
  5386. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  5387. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  5388. XFCLOSE(file);
  5389. return WOLFSSL_BAD_FILE;
  5390. }
  5391. sz = XFTELL(file);
  5392. XREWIND(file);
  5393. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5394. WOLFSSL_MSG("ProcessFile file size error");
  5395. XFCLOSE(file);
  5396. return WOLFSSL_BAD_FILE;
  5397. }
  5398. if (sz > (long)sizeof(staticBuffer)) {
  5399. WOLFSSL_MSG("Getting dynamic buffer");
  5400. myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE);
  5401. if (myBuffer == NULL) {
  5402. XFCLOSE(file);
  5403. return WOLFSSL_BAD_FILE;
  5404. }
  5405. dynamic = 1;
  5406. }
  5407. if ( (ret = (int)XFREAD(myBuffer, 1, sz, file)) != sz)
  5408. ret = WOLFSSL_BAD_FILE;
  5409. else {
  5410. /* Try to detect type by parsing cert header and footer */
  5411. if (type == DETECT_CERT_TYPE) {
  5412. if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 &&
  5413. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5414. type = CA_TYPE;
  5415. }
  5416. #ifdef HAVE_CRL
  5417. else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  5418. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5419. type = CRL_TYPE;
  5420. }
  5421. #endif
  5422. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  5423. (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) {
  5424. type = CERT_TYPE;
  5425. }
  5426. else {
  5427. WOLFSSL_MSG("Failed to detect certificate type");
  5428. if (dynamic)
  5429. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  5430. XFCLOSE(file);
  5431. return WOLFSSL_BAD_CERTTYPE;
  5432. }
  5433. }
  5434. if ((type == CA_TYPE || type == TRUSTED_PEER_TYPE)
  5435. && format == WOLFSSL_FILETYPE_PEM) {
  5436. ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl,
  5437. verify);
  5438. }
  5439. #ifdef HAVE_CRL
  5440. else if (type == CRL_TYPE)
  5441. ret = BufferLoadCRL(crl, myBuffer, sz, format, verify);
  5442. #endif
  5443. else
  5444. ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL,
  5445. userChain, verify);
  5446. }
  5447. XFCLOSE(file);
  5448. if (dynamic)
  5449. XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE);
  5450. return ret;
  5451. }
  5452. /* loads file then loads each file in path, no c_rehash */
  5453. int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file,
  5454. const char* path, word32 flags)
  5455. {
  5456. int ret = WOLFSSL_SUCCESS;
  5457. #ifndef NO_WOLFSSL_DIR
  5458. int fileRet;
  5459. int successCount = 0;
  5460. int failCount = 0;
  5461. #endif
  5462. int verify;
  5463. WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex");
  5464. if (ctx == NULL || (file == NULL && path == NULL)) {
  5465. return WOLFSSL_FAILURE;
  5466. }
  5467. verify = GET_VERIFY_SETTING_CTX(ctx);
  5468. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  5469. verify = VERIFY_SKIP_DATE;
  5470. if (file) {
  5471. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0,
  5472. NULL, verify);
  5473. #ifndef NO_WOLFSSL_DIR
  5474. if (ret == WOLFSSL_SUCCESS)
  5475. successCount++;
  5476. #endif
  5477. }
  5478. if (ret == WOLFSSL_SUCCESS && path) {
  5479. #ifndef NO_WOLFSSL_DIR
  5480. char* name = NULL;
  5481. #ifdef WOLFSSL_SMALL_STACK
  5482. ReadDirCtx* readCtx;
  5483. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  5484. DYNAMIC_TYPE_DIRCTX);
  5485. if (readCtx == NULL)
  5486. return MEMORY_E;
  5487. #else
  5488. ReadDirCtx readCtx[1];
  5489. #endif
  5490. /* try to load each regular file in path */
  5491. fileRet = wc_ReadDirFirst(readCtx, path, &name);
  5492. while (fileRet == 0 && name) {
  5493. WOLFSSL_MSG(name); /* log file name */
  5494. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE,
  5495. NULL, 0, NULL, verify);
  5496. if (ret != WOLFSSL_SUCCESS) {
  5497. /* handle flags for ignoring errors, skipping expired certs or
  5498. by PEM certificate header error */
  5499. if ( (flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) ||
  5500. ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) &&
  5501. (ret == ASN_NO_PEM_HEADER))) {
  5502. /* Do not fail here if a certificate fails to load,
  5503. continue to next file */
  5504. ret = WOLFSSL_SUCCESS;
  5505. }
  5506. else {
  5507. WOLFSSL_ERROR(ret);
  5508. WOLFSSL_MSG("Load CA file failed, continuing");
  5509. failCount++;
  5510. }
  5511. }
  5512. else {
  5513. successCount++;
  5514. }
  5515. fileRet = wc_ReadDirNext(readCtx, path, &name);
  5516. }
  5517. wc_ReadDirClose(readCtx);
  5518. /* pass directory read failure to response code */
  5519. if (fileRet != WC_READDIR_NOFILE) {
  5520. ret = fileRet;
  5521. }
  5522. /* report failure if no files were loaded or there were failures */
  5523. else if (successCount == 0 || failCount > 0) {
  5524. /* use existing error code if exists */
  5525. if (ret == WOLFSSL_SUCCESS)
  5526. ret = WOLFSSL_FAILURE;
  5527. }
  5528. else {
  5529. ret = WOLFSSL_SUCCESS;
  5530. }
  5531. #ifdef WOLFSSL_SMALL_STACK
  5532. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  5533. #endif
  5534. #else
  5535. ret = NOT_COMPILED_IN;
  5536. (void)flags;
  5537. #endif
  5538. }
  5539. return ret;
  5540. }
  5541. WOLFSSL_ABI
  5542. int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  5543. const char* path)
  5544. {
  5545. return wolfSSL_CTX_load_verify_locations_ex(ctx, file, path,
  5546. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  5547. }
  5548. #ifdef WOLFSSL_TRUST_PEER_CERT
  5549. /* Used to specify a peer cert to match when connecting
  5550. ctx : the ctx structure to load in peer cert
  5551. file: the string name of cert file
  5552. type: type of format such as PEM/DER
  5553. */
  5554. int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type)
  5555. {
  5556. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert");
  5557. if (ctx == NULL || file == NULL) {
  5558. return WOLFSSL_FAILURE;
  5559. }
  5560. return ProcessFile(ctx, file, type, TRUSTED_PEER_TYPE, NULL, 0, NULL,
  5561. GET_VERIFY_SETTING_CTX(ctx));
  5562. }
  5563. #endif /* WOLFSSL_TRUST_PEER_CERT */
  5564. /* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
  5565. int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* fname,
  5566. int format)
  5567. {
  5568. int ret = WOLFSSL_FATAL_ERROR;
  5569. #ifdef WOLFSSL_SMALL_STACK
  5570. byte staticBuffer[1]; /* force heap usage */
  5571. #else
  5572. byte staticBuffer[FILE_BUFFER_SIZE];
  5573. #endif
  5574. byte* myBuffer = staticBuffer;
  5575. int dynamic = 0;
  5576. long sz = 0;
  5577. XFILE file = XFOPEN(fname, "rb");
  5578. WOLFSSL_ENTER("wolfSSL_CertManagerVerify");
  5579. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  5580. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  5581. XFCLOSE(file);
  5582. return WOLFSSL_BAD_FILE;
  5583. }
  5584. sz = XFTELL(file);
  5585. XREWIND(file);
  5586. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5587. WOLFSSL_MSG("CertManagerVerify file size error");
  5588. XFCLOSE(file);
  5589. return WOLFSSL_BAD_FILE;
  5590. }
  5591. if (sz > (long)sizeof(staticBuffer)) {
  5592. WOLFSSL_MSG("Getting dynamic buffer");
  5593. myBuffer = (byte*) XMALLOC(sz, cm->heap, DYNAMIC_TYPE_FILE);
  5594. if (myBuffer == NULL) {
  5595. XFCLOSE(file);
  5596. return WOLFSSL_BAD_FILE;
  5597. }
  5598. dynamic = 1;
  5599. }
  5600. if ( (ret = (int)XFREAD(myBuffer, 1, sz, file)) != sz)
  5601. ret = WOLFSSL_BAD_FILE;
  5602. else
  5603. ret = wolfSSL_CertManagerVerifyBuffer(cm, myBuffer, sz, format);
  5604. XFCLOSE(file);
  5605. if (dynamic)
  5606. XFREE(myBuffer, cm->heap, DYNAMIC_TYPE_FILE);
  5607. return ret;
  5608. }
  5609. /* like load verify locations, 1 for success, < 0 for error */
  5610. int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file,
  5611. const char* path)
  5612. {
  5613. int ret = WOLFSSL_FATAL_ERROR;
  5614. WOLFSSL_CTX* tmp;
  5615. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCA");
  5616. if (cm == NULL) {
  5617. WOLFSSL_MSG("No CertManager error");
  5618. return ret;
  5619. }
  5620. tmp = wolfSSL_CTX_new(cm_pick_method());
  5621. if (tmp == NULL) {
  5622. WOLFSSL_MSG("CTX new failed");
  5623. return ret;
  5624. }
  5625. /* for tmp use */
  5626. wolfSSL_CertManagerFree(tmp->cm);
  5627. tmp->cm = cm;
  5628. ret = wolfSSL_CTX_load_verify_locations(tmp, file, path);
  5629. /* don't lose our good one */
  5630. tmp->cm = NULL;
  5631. wolfSSL_CTX_free(tmp);
  5632. return ret;
  5633. }
  5634. #ifndef NO_CHECK_PRIVATE_KEY
  5635. /* Check private against public in certificate for match
  5636. *
  5637. * ctx WOLFSSL_CTX structure to check private key in
  5638. *
  5639. * Returns SSL_SUCCESS on good private key and SSL_FAILURE if miss matched. */
  5640. int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx)
  5641. {
  5642. #ifdef WOLFSSL_SMALL_STACK
  5643. DecodedCert* der = NULL;
  5644. #else
  5645. DecodedCert der[1];
  5646. #endif
  5647. word32 size;
  5648. byte* buff;
  5649. int ret;
  5650. WOLFSSL_ENTER("wolfSSL_CTX_check_private_key");
  5651. if (ctx == NULL || ctx->certificate == NULL) {
  5652. return WOLFSSL_FAILURE;
  5653. }
  5654. #ifndef NO_CERTS
  5655. #ifdef WOLFSSL_SMALL_STACK
  5656. der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  5657. if (der == NULL)
  5658. return MEMORY_E;
  5659. #endif
  5660. size = ctx->certificate->length;
  5661. buff = ctx->certificate->buffer;
  5662. InitDecodedCert(der, buff, size, ctx->heap);
  5663. if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  5664. FreeDecodedCert(der);
  5665. #ifdef WOLFSSL_SMALL_STACK
  5666. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  5667. #endif
  5668. return WOLFSSL_FAILURE;
  5669. }
  5670. size = ctx->privateKey->length;
  5671. buff = ctx->privateKey->buffer;
  5672. ret = wc_CheckPrivateKey(buff, size, der);
  5673. FreeDecodedCert(der);
  5674. #ifdef WOLFSSL_SMALL_STACK
  5675. XFREE(der, NULL, DYNAMIC_TYPE_DCERT);
  5676. #endif
  5677. if (ret == 1) {
  5678. return WOLFSSL_SUCCESS;
  5679. }
  5680. else {
  5681. return WOLFSSL_FAILURE;
  5682. }
  5683. #else
  5684. WOLFSSL_MSG("NO_CERTS is defined, can not check private key");
  5685. return WOLFSSL_FAILURE;
  5686. #endif
  5687. }
  5688. #endif /* !NO_CHECK_PRIVATE_KEY */
  5689. #ifdef HAVE_CRL
  5690. /* check CRL if enabled, WOLFSSL_SUCCESS */
  5691. int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
  5692. {
  5693. int ret = 0;
  5694. #ifdef WOLFSSL_SMALL_STACK
  5695. DecodedCert* cert = NULL;
  5696. #else
  5697. DecodedCert cert[1];
  5698. #endif
  5699. WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL");
  5700. if (cm == NULL)
  5701. return BAD_FUNC_ARG;
  5702. if (cm->crlEnabled == 0)
  5703. return WOLFSSL_SUCCESS;
  5704. #ifdef WOLFSSL_SMALL_STACK
  5705. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  5706. if (cert == NULL)
  5707. return MEMORY_E;
  5708. #endif
  5709. InitDecodedCert(cert, der, sz, NULL);
  5710. if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm)) != 0) {
  5711. WOLFSSL_MSG("ParseCert failed");
  5712. }
  5713. else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) {
  5714. WOLFSSL_MSG("CheckCertCRL failed");
  5715. }
  5716. FreeDecodedCert(cert);
  5717. #ifdef WOLFSSL_SMALL_STACK
  5718. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  5719. #endif
  5720. return ret == 0 ? WOLFSSL_SUCCESS : ret;
  5721. }
  5722. int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb)
  5723. {
  5724. WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb");
  5725. if (cm == NULL)
  5726. return BAD_FUNC_ARG;
  5727. cm->cbMissingCRL = cb;
  5728. return WOLFSSL_SUCCESS;
  5729. }
  5730. #ifdef HAVE_CRL_IO
  5731. int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb)
  5732. {
  5733. if (cm == NULL)
  5734. return BAD_FUNC_ARG;
  5735. cm->crl->crlIOCb = cb;
  5736. return WOLFSSL_SUCCESS;
  5737. }
  5738. #endif
  5739. int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path,
  5740. int type, int monitor)
  5741. {
  5742. WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL");
  5743. if (cm == NULL)
  5744. return BAD_FUNC_ARG;
  5745. if (cm->crl == NULL) {
  5746. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  5747. WOLFSSL_MSG("Enable CRL failed");
  5748. return WOLFSSL_FATAL_ERROR;
  5749. }
  5750. }
  5751. return LoadCRL(cm->crl, path, type, monitor);
  5752. }
  5753. int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
  5754. {
  5755. WOLFSSL_ENTER("wolfSSL_EnableCRL");
  5756. if (ssl)
  5757. return wolfSSL_CertManagerEnableCRL(ssl->ctx->cm, options);
  5758. else
  5759. return BAD_FUNC_ARG;
  5760. }
  5761. int wolfSSL_DisableCRL(WOLFSSL* ssl)
  5762. {
  5763. WOLFSSL_ENTER("wolfSSL_DisableCRL");
  5764. if (ssl)
  5765. return wolfSSL_CertManagerDisableCRL(ssl->ctx->cm);
  5766. else
  5767. return BAD_FUNC_ARG;
  5768. }
  5769. int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
  5770. {
  5771. WOLFSSL_ENTER("wolfSSL_LoadCRL");
  5772. if (ssl)
  5773. return wolfSSL_CertManagerLoadCRL(ssl->ctx->cm, path, type, monitor);
  5774. else
  5775. return BAD_FUNC_ARG;
  5776. }
  5777. int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
  5778. {
  5779. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  5780. if (ssl)
  5781. return wolfSSL_CertManagerSetCRL_Cb(ssl->ctx->cm, cb);
  5782. else
  5783. return BAD_FUNC_ARG;
  5784. }
  5785. #ifdef HAVE_CRL_IO
  5786. int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
  5787. {
  5788. WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
  5789. if (ssl)
  5790. return wolfSSL_CertManagerSetCRL_IOCb(ssl->ctx->cm, cb);
  5791. else
  5792. return BAD_FUNC_ARG;
  5793. }
  5794. #endif
  5795. int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
  5796. {
  5797. WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
  5798. if (ctx)
  5799. return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
  5800. else
  5801. return BAD_FUNC_ARG;
  5802. }
  5803. int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
  5804. {
  5805. WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
  5806. if (ctx)
  5807. return wolfSSL_CertManagerDisableCRL(ctx->cm);
  5808. else
  5809. return BAD_FUNC_ARG;
  5810. }
  5811. int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
  5812. int type, int monitor)
  5813. {
  5814. WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
  5815. if (ctx)
  5816. return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
  5817. else
  5818. return BAD_FUNC_ARG;
  5819. }
  5820. int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
  5821. {
  5822. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
  5823. if (ctx)
  5824. return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
  5825. else
  5826. return BAD_FUNC_ARG;
  5827. }
  5828. #ifdef HAVE_CRL_IO
  5829. int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
  5830. {
  5831. WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
  5832. if (ctx)
  5833. return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
  5834. else
  5835. return BAD_FUNC_ARG;
  5836. }
  5837. #endif
  5838. #endif /* HAVE_CRL */
  5839. #ifdef WOLFSSL_DER_LOAD
  5840. /* Add format parameter to allow DER load of CA files */
  5841. int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
  5842. int format)
  5843. {
  5844. WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
  5845. if (ctx == NULL || file == NULL)
  5846. return WOLFSSL_FAILURE;
  5847. if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
  5848. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5849. return WOLFSSL_SUCCESS;
  5850. }
  5851. return WOLFSSL_FAILURE;
  5852. }
  5853. #endif /* WOLFSSL_DER_LOAD */
  5854. WOLFSSL_ABI
  5855. int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
  5856. int format)
  5857. {
  5858. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
  5859. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
  5860. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5861. return WOLFSSL_SUCCESS;
  5862. }
  5863. return WOLFSSL_FAILURE;
  5864. }
  5865. WOLFSSL_ABI
  5866. int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
  5867. int format)
  5868. {
  5869. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
  5870. if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
  5871. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5872. return WOLFSSL_SUCCESS;
  5873. }
  5874. return WOLFSSL_FAILURE;
  5875. }
  5876. /* Sets the max chain depth when verifying a certificate chain. Default depth
  5877. * is set to MAX_CHAIN_DEPTH.
  5878. *
  5879. * ctx WOLFSSL_CTX structure to set depth in
  5880. * depth max depth
  5881. */
  5882. void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
  5883. WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
  5884. if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
  5885. WOLFSSL_MSG("Bad depth argument, too large or less than 0");
  5886. return;
  5887. }
  5888. ctx->verifyDepth = (byte)depth;
  5889. }
  5890. /* get cert chaining depth using ssl struct */
  5891. long wolfSSL_get_verify_depth(WOLFSSL* ssl)
  5892. {
  5893. if(ssl == NULL) {
  5894. return BAD_FUNC_ARG;
  5895. }
  5896. #ifndef OPENSSL_EXTRA
  5897. return MAX_CHAIN_DEPTH;
  5898. #else
  5899. return ssl->options.verifyDepth;
  5900. #endif
  5901. }
  5902. /* get cert chaining depth using ctx struct */
  5903. long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
  5904. {
  5905. if (ctx == NULL) {
  5906. return BAD_FUNC_ARG;
  5907. }
  5908. #ifndef OPENSSL_EXTRA
  5909. return MAX_CHAIN_DEPTH;
  5910. #else
  5911. return ctx->verifyDepth;
  5912. #endif
  5913. }
  5914. WOLFSSL_ABI
  5915. int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
  5916. {
  5917. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  5918. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
  5919. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
  5920. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5921. return WOLFSSL_SUCCESS;
  5922. }
  5923. return WOLFSSL_FAILURE;
  5924. }
  5925. int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
  5926. const char* file, int format)
  5927. {
  5928. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  5929. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
  5930. if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
  5931. GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  5932. return WOLFSSL_SUCCESS;
  5933. }
  5934. return WOLFSSL_FAILURE;
  5935. }
  5936. #ifndef NO_DH
  5937. /* server Diffie-Hellman parameters */
  5938. static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  5939. const char* fname, int format)
  5940. {
  5941. #ifdef WOLFSSL_SMALL_STACK
  5942. byte staticBuffer[1]; /* force heap usage */
  5943. #else
  5944. byte staticBuffer[FILE_BUFFER_SIZE];
  5945. #endif
  5946. byte* myBuffer = staticBuffer;
  5947. int dynamic = 0;
  5948. int ret;
  5949. long sz = 0;
  5950. XFILE file;
  5951. if (ctx == NULL || fname == NULL)
  5952. return BAD_FUNC_ARG;
  5953. file = XFOPEN(fname, "rb");
  5954. if (file == XBADFILE) return WOLFSSL_BAD_FILE;
  5955. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  5956. XFCLOSE(file);
  5957. return WOLFSSL_BAD_FILE;
  5958. }
  5959. sz = XFTELL(file);
  5960. XREWIND(file);
  5961. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  5962. WOLFSSL_MSG("SetTmpDH file size error");
  5963. XFCLOSE(file);
  5964. return WOLFSSL_BAD_FILE;
  5965. }
  5966. if (sz > (long)sizeof(staticBuffer)) {
  5967. WOLFSSL_MSG("Getting dynamic buffer");
  5968. myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  5969. if (myBuffer == NULL) {
  5970. XFCLOSE(file);
  5971. return WOLFSSL_BAD_FILE;
  5972. }
  5973. dynamic = 1;
  5974. }
  5975. if ( (ret = (int)XFREAD(myBuffer, 1, sz, file)) != sz)
  5976. ret = WOLFSSL_BAD_FILE;
  5977. else {
  5978. if (ssl)
  5979. ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
  5980. else
  5981. ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
  5982. }
  5983. XFCLOSE(file);
  5984. if (dynamic)
  5985. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  5986. return ret;
  5987. }
  5988. /* server Diffie-Hellman parameters */
  5989. int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
  5990. {
  5991. if (ssl == NULL)
  5992. return BAD_FUNC_ARG;
  5993. return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
  5994. }
  5995. /* server Diffie-Hellman parameters */
  5996. int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
  5997. {
  5998. return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
  5999. }
  6000. #endif /* NO_DH */
  6001. #endif /* NO_FILESYSTEM */
  6002. #ifdef OPENSSL_EXTRA
  6003. /* put SSL type in extra for now, not very common */
  6004. /* Converts a DER format key read from "bio" to a PKCS8 structure.
  6005. *
  6006. * bio input bio to read DER from
  6007. * pkey If not NULL then this pointer will be overwritten with a new PKCS8
  6008. * structure.
  6009. *
  6010. * returns a WOLFSSL_PKCS8_PRIV_KEY_INFO pointer on success and NULL in fail
  6011. * case.
  6012. */
  6013. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY_bio(WOLFSSL_BIO* bio,
  6014. WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey)
  6015. {
  6016. WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL;
  6017. #ifdef WOLFSSL_PEM_TO_DER
  6018. unsigned char* mem = NULL;
  6019. int memSz;
  6020. int keySz;
  6021. word32 algId;
  6022. WOLFSSL_MSG("wolfSSL_d2i_PKCS8_PKEY_bio()");
  6023. if (bio == NULL) {
  6024. return NULL;
  6025. }
  6026. if ((memSz = wolfSSL_BIO_get_mem_data(bio, &mem)) < 0) {
  6027. return NULL;
  6028. }
  6029. if ((keySz = wc_KeyPemToDer(mem, memSz, mem, memSz, NULL)) < 0) {
  6030. WOLFSSL_MSG("Not PEM format");
  6031. keySz = memSz;
  6032. if ((keySz = ToTraditional_ex((byte*)mem, (word32)keySz, &algId)) < 0) {
  6033. return NULL;
  6034. }
  6035. }
  6036. pkcs8 = wolfSSL_EVP_PKEY_new();
  6037. if (pkcs8 == NULL) {
  6038. return NULL;
  6039. }
  6040. pkcs8->pkey.ptr = (char*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  6041. if (pkcs8->pkey.ptr == NULL) {
  6042. wolfSSL_EVP_PKEY_free(pkcs8);
  6043. return NULL;
  6044. }
  6045. XMEMCPY(pkcs8->pkey.ptr, mem, keySz);
  6046. pkcs8->pkey_sz = keySz;
  6047. if (pkey != NULL) {
  6048. *pkey = pkcs8;
  6049. }
  6050. #else
  6051. (void)bio;
  6052. (void)pkey;
  6053. #endif /* WOLFSSL_PEM_TO_DER */
  6054. return pkcs8;
  6055. }
  6056. /* expecting DER format public key
  6057. *
  6058. * bio input bio to read DER from
  6059. * out If not NULL then this pointer will be overwritten with a new
  6060. * WOLFSSL_EVP_PKEY pointer
  6061. *
  6062. * returns a WOLFSSL_EVP_PKEY pointer on success and NULL in fail case.
  6063. */
  6064. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio,
  6065. WOLFSSL_EVP_PKEY** out)
  6066. {
  6067. unsigned char* mem;
  6068. long memSz;
  6069. WOLFSSL_EVP_PKEY* pkey = NULL;
  6070. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY_bio()");
  6071. if (bio == NULL) {
  6072. return NULL;
  6073. }
  6074. (void)out;
  6075. memSz = wolfSSL_BIO_pending(bio);
  6076. if (memSz <= 0) {
  6077. return NULL;
  6078. }
  6079. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6080. if (mem == NULL) {
  6081. return NULL;
  6082. }
  6083. if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) {
  6084. pkey = wolfSSL_d2i_PUBKEY(NULL, (const unsigned char**)&mem, memSz);
  6085. if (out != NULL && pkey != NULL) {
  6086. *out = pkey;
  6087. }
  6088. }
  6089. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6090. return pkey;
  6091. }
  6092. /* Converts a DER encoded public key to a WOLFSSL_EVP_PKEY structure.
  6093. *
  6094. * out pointer to new WOLFSSL_EVP_PKEY structure. Can be NULL
  6095. * in DER buffer to convert
  6096. * inSz size of in buffer
  6097. *
  6098. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  6099. * on fail
  6100. */
  6101. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** out,
  6102. const unsigned char** in, long inSz)
  6103. {
  6104. WOLFSSL_EVP_PKEY* pkey = NULL;
  6105. const unsigned char* mem;
  6106. long memSz = inSz;
  6107. WOLFSSL_ENTER("wolfSSL_d2i_PUBKEY");
  6108. if (in == NULL || inSz < 0) {
  6109. WOLFSSL_MSG("Bad argument");
  6110. return NULL;
  6111. }
  6112. mem = *in;
  6113. #if !defined(NO_RSA)
  6114. {
  6115. RsaKey rsa;
  6116. word32 keyIdx = 0;
  6117. /* test if RSA key */
  6118. if (wc_InitRsaKey(&rsa, NULL) == 0 &&
  6119. wc_RsaPublicKeyDecode(mem, &keyIdx, &rsa, (word32)memSz) == 0) {
  6120. wc_FreeRsaKey(&rsa);
  6121. pkey = wolfSSL_EVP_PKEY_new();
  6122. if (pkey != NULL) {
  6123. pkey->pkey_sz = keyIdx;
  6124. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6125. DYNAMIC_TYPE_PUBLIC_KEY);
  6126. if (pkey->pkey.ptr == NULL) {
  6127. wolfSSL_EVP_PKEY_free(pkey);
  6128. return NULL;
  6129. }
  6130. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6131. pkey->type = EVP_PKEY_RSA;
  6132. if (out != NULL) {
  6133. *out = pkey;
  6134. }
  6135. pkey->ownRsa = 1;
  6136. pkey->rsa = wolfSSL_RSA_new();
  6137. if (pkey->rsa == NULL) {
  6138. wolfSSL_EVP_PKEY_free(pkey);
  6139. return NULL;
  6140. }
  6141. if (wolfSSL_RSA_LoadDer_ex(pkey->rsa,
  6142. (const unsigned char*)pkey->pkey.ptr,
  6143. pkey->pkey_sz, WOLFSSL_RSA_LOAD_PUBLIC) != 1) {
  6144. wolfSSL_EVP_PKEY_free(pkey);
  6145. return NULL;
  6146. }
  6147. return pkey;
  6148. }
  6149. }
  6150. wc_FreeRsaKey(&rsa);
  6151. }
  6152. #endif /* NO_RSA */
  6153. #ifdef HAVE_ECC
  6154. {
  6155. word32 keyIdx = 0;
  6156. ecc_key ecc;
  6157. if (wc_ecc_init(&ecc) == 0 &&
  6158. wc_EccPublicKeyDecode(mem, &keyIdx, &ecc, (word32)memSz) == 0) {
  6159. wc_ecc_free(&ecc);
  6160. pkey = wolfSSL_EVP_PKEY_new();
  6161. if (pkey != NULL) {
  6162. pkey->pkey_sz = keyIdx;
  6163. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  6164. DYNAMIC_TYPE_PUBLIC_KEY);
  6165. if (pkey->pkey.ptr == NULL) {
  6166. wolfSSL_EVP_PKEY_free(pkey);
  6167. return NULL;
  6168. }
  6169. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6170. pkey->type = EVP_PKEY_EC;
  6171. if (out != NULL) {
  6172. *out = pkey;
  6173. }
  6174. pkey->ownEcc = 1;
  6175. pkey->ecc = wolfSSL_EC_KEY_new();
  6176. if (pkey->ecc == NULL) {
  6177. wolfSSL_EVP_PKEY_free(pkey);
  6178. return NULL;
  6179. }
  6180. if (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc,
  6181. (const unsigned char*)pkey->pkey.ptr,
  6182. pkey->pkey_sz, WOLFSSL_EC_KEY_LOAD_PUBLIC) != 1) {
  6183. wolfSSL_EVP_PKEY_free(pkey);
  6184. return NULL;
  6185. }
  6186. return pkey;
  6187. }
  6188. }
  6189. wc_ecc_free(&ecc);
  6190. }
  6191. #endif /* HAVE_ECC */
  6192. #if !defined(NO_DSA)
  6193. {
  6194. DsaKey dsa;
  6195. word32 keyIdx = 0;
  6196. /* test if DSA key */
  6197. if (wc_InitDsaKey(&dsa) == 0 &&
  6198. wc_DsaPublicKeyDecode(mem, &keyIdx, &dsa, (word32)memSz) == 0) {
  6199. wc_FreeDsaKey(&dsa);
  6200. pkey = wolfSSL_EVP_PKEY_new();
  6201. if (pkey != NULL) {
  6202. pkey->pkey_sz = keyIdx;
  6203. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6204. DYNAMIC_TYPE_PUBLIC_KEY);
  6205. if (pkey->pkey.ptr == NULL) {
  6206. wolfSSL_EVP_PKEY_free(pkey);
  6207. return NULL;
  6208. }
  6209. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  6210. pkey->type = EVP_PKEY_DSA;
  6211. if (out != NULL) {
  6212. *out = pkey;
  6213. }
  6214. pkey->ownDsa = 1;
  6215. pkey->dsa = wolfSSL_DSA_new();
  6216. if (pkey->dsa == NULL) {
  6217. wolfSSL_EVP_PKEY_free(pkey);
  6218. return NULL;
  6219. }
  6220. if (wolfSSL_DSA_LoadDer_ex(pkey->dsa,
  6221. (const unsigned char*)pkey->pkey.ptr,
  6222. pkey->pkey_sz, WOLFSSL_DSA_LOAD_PUBLIC) != 1) {
  6223. wolfSSL_EVP_PKEY_free(pkey);
  6224. return NULL;
  6225. }
  6226. return pkey;
  6227. }
  6228. }
  6229. wc_FreeDsaKey(&dsa);
  6230. }
  6231. #endif /* NO_DSA */
  6232. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  6233. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  6234. (HAVE_FIPS_VERSION > 2))
  6235. {
  6236. DhKey dh;
  6237. word32 keyIdx = 0;
  6238. /* test if DH key */
  6239. if (wc_InitDhKey(&dh) == 0 &&
  6240. wc_DhKeyDecode(mem, &keyIdx, &dh, (word32)memSz) == 0) {
  6241. wc_FreeDhKey(&dh);
  6242. pkey = wolfSSL_EVP_PKEY_new();
  6243. if (pkey != NULL) {
  6244. pkey->pkey_sz = (int)memSz;
  6245. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  6246. DYNAMIC_TYPE_PUBLIC_KEY);
  6247. if (pkey->pkey.ptr == NULL) {
  6248. wolfSSL_EVP_PKEY_free(pkey);
  6249. return NULL;
  6250. }
  6251. XMEMCPY(pkey->pkey.ptr, mem, memSz);
  6252. pkey->type = EVP_PKEY_DH;
  6253. if (out != NULL) {
  6254. *out = pkey;
  6255. }
  6256. pkey->ownDh = 1;
  6257. pkey->dh = wolfSSL_DH_new();
  6258. if (pkey->dh == NULL) {
  6259. wolfSSL_EVP_PKEY_free(pkey);
  6260. return NULL;
  6261. }
  6262. if (wolfSSL_DH_LoadDer(pkey->dh,
  6263. (const unsigned char*)pkey->pkey.ptr,
  6264. pkey->pkey_sz) != WOLFSSL_SUCCESS) {
  6265. wolfSSL_EVP_PKEY_free(pkey);
  6266. return NULL;
  6267. }
  6268. return pkey;
  6269. }
  6270. }
  6271. wc_FreeDhKey(&dh);
  6272. }
  6273. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  6274. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  6275. return pkey;
  6276. }
  6277. /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
  6278. static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  6279. {
  6280. unsigned char* pt;
  6281. int sz;
  6282. if (!key || !key->pkey_sz)
  6283. return WOLFSSL_FATAL_ERROR;
  6284. sz = key->pkey_sz;
  6285. if (der) {
  6286. pt = (unsigned char*)key->pkey.ptr;
  6287. if (*der) {
  6288. /* since this function signature has no size value passed in it is
  6289. * assumed that the user has allocated a large enough buffer */
  6290. XMEMCPY(*der, pt, sz);
  6291. *der += sz;
  6292. }
  6293. else {
  6294. *der = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
  6295. if (*der == NULL) {
  6296. return WOLFSSL_FATAL_ERROR;
  6297. }
  6298. XMEMCPY(*der, pt, sz);
  6299. }
  6300. }
  6301. return sz;
  6302. }
  6303. int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
  6304. {
  6305. return wolfSSL_EVP_PKEY_get_der(key, der);
  6306. }
  6307. /* Reads in a DER format key. If PKCS8 headers are found they are stripped off.
  6308. *
  6309. * type type of key
  6310. * out newly created WOLFSSL_EVP_PKEY structure
  6311. * in pointer to input key DER
  6312. * inSz size of in buffer
  6313. *
  6314. * On success a non null pointer is returned and the pointer in is advanced the
  6315. * same number of bytes read.
  6316. */
  6317. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey(int type, WOLFSSL_EVP_PKEY** out,
  6318. const unsigned char **in, long inSz)
  6319. {
  6320. WOLFSSL_EVP_PKEY* local;
  6321. word32 idx = 0;
  6322. int ret;
  6323. word32 algId;
  6324. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey");
  6325. if (in == NULL || inSz < 0) {
  6326. WOLFSSL_MSG("Bad argument");
  6327. return NULL;
  6328. }
  6329. /* Check if input buffer has PKCS8 header. In the case that it does not
  6330. * have a PKCS8 header then do not error out. */
  6331. if ((ret = ToTraditionalInline_ex((const byte*)(*in), &idx, (word32)inSz,
  6332. &algId)) > 0) {
  6333. WOLFSSL_MSG("Found and removed PKCS8 header");
  6334. }
  6335. else {
  6336. if (ret != ASN_PARSE_E) {
  6337. WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 header");
  6338. return NULL;
  6339. }
  6340. }
  6341. if (out != NULL && *out != NULL) {
  6342. wolfSSL_EVP_PKEY_free(*out);
  6343. *out = NULL;
  6344. }
  6345. local = wolfSSL_EVP_PKEY_new();
  6346. if (local == NULL) {
  6347. return NULL;
  6348. }
  6349. /* sanity check on idx before use */
  6350. if ((int)idx > inSz) {
  6351. WOLFSSL_MSG("Issue with index pointer");
  6352. wolfSSL_EVP_PKEY_free(local);
  6353. local = NULL;
  6354. return NULL;
  6355. }
  6356. local->type = type;
  6357. local->pkey_sz = (int)inSz - idx;
  6358. local->pkey.ptr = (char*)XMALLOC(inSz - idx, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  6359. if (local->pkey.ptr == NULL) {
  6360. wolfSSL_EVP_PKEY_free(local);
  6361. local = NULL;
  6362. return NULL;
  6363. }
  6364. else {
  6365. XMEMCPY(local->pkey.ptr, *in + idx, inSz - idx);
  6366. }
  6367. switch (type) {
  6368. #ifndef NO_RSA
  6369. case EVP_PKEY_RSA:
  6370. local->ownRsa = 1;
  6371. local->rsa = wolfSSL_RSA_new();
  6372. if (local->rsa == NULL) {
  6373. wolfSSL_EVP_PKEY_free(local);
  6374. return NULL;
  6375. }
  6376. if (wolfSSL_RSA_LoadDer_ex(local->rsa,
  6377. (const unsigned char*)local->pkey.ptr, local->pkey_sz,
  6378. WOLFSSL_RSA_LOAD_PRIVATE) != SSL_SUCCESS) {
  6379. wolfSSL_EVP_PKEY_free(local);
  6380. return NULL;
  6381. }
  6382. break;
  6383. #endif /* NO_RSA */
  6384. #ifdef HAVE_ECC
  6385. case EVP_PKEY_EC:
  6386. local->ownEcc = 1;
  6387. local->ecc = wolfSSL_EC_KEY_new();
  6388. if (local->ecc == NULL) {
  6389. wolfSSL_EVP_PKEY_free(local);
  6390. return NULL;
  6391. }
  6392. if (wolfSSL_EC_KEY_LoadDer(local->ecc,
  6393. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6394. != SSL_SUCCESS) {
  6395. wolfSSL_EVP_PKEY_free(local);
  6396. return NULL;
  6397. }
  6398. break;
  6399. #endif /* HAVE_ECC */
  6400. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  6401. #ifndef NO_DSA
  6402. case EVP_PKEY_DSA:
  6403. local->ownDsa = 1;
  6404. local->dsa = wolfSSL_DSA_new();
  6405. if (local->dsa == NULL) {
  6406. wolfSSL_EVP_PKEY_free(local);
  6407. return NULL;
  6408. }
  6409. if (wolfSSL_DSA_LoadDer(local->dsa,
  6410. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6411. != SSL_SUCCESS) {
  6412. wolfSSL_EVP_PKEY_free(local);
  6413. return NULL;
  6414. }
  6415. break;
  6416. #endif /* NO_DSA */
  6417. #ifndef NO_DH
  6418. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  6419. case EVP_PKEY_DH:
  6420. local->ownDh = 1;
  6421. local->dh = wolfSSL_DH_new();
  6422. if (local->dh == NULL) {
  6423. wolfSSL_EVP_PKEY_free(local);
  6424. return NULL;
  6425. }
  6426. if (wolfSSL_DH_LoadDer(local->dh,
  6427. (const unsigned char*)local->pkey.ptr, local->pkey_sz)
  6428. != SSL_SUCCESS) {
  6429. wolfSSL_EVP_PKEY_free(local);
  6430. return NULL;
  6431. }
  6432. break;
  6433. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  6434. #endif /* HAVE_DH */
  6435. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  6436. default:
  6437. WOLFSSL_MSG("Unsupported key type");
  6438. wolfSSL_EVP_PKEY_free(local);
  6439. return NULL;
  6440. }
  6441. /* advance pointer with success */
  6442. if (local != NULL) {
  6443. if ((idx + local->pkey_sz) <= (word32)inSz) {
  6444. *in = *in + idx + local->pkey_sz;
  6445. }
  6446. if (out != NULL) {
  6447. *out = local;
  6448. }
  6449. }
  6450. return local;
  6451. }
  6452. #ifndef NO_CERTS
  6453. int wolfSSL_check_private_key(const WOLFSSL* ssl)
  6454. {
  6455. DecodedCert der;
  6456. word32 size;
  6457. byte* buff;
  6458. int ret;
  6459. if (ssl == NULL) {
  6460. return WOLFSSL_FAILURE;
  6461. }
  6462. size = ssl->buffers.certificate->length;
  6463. buff = ssl->buffers.certificate->buffer;
  6464. InitDecodedCert(&der, buff, size, ssl->heap);
  6465. #ifdef HAVE_PK_CALLBACKS
  6466. ret = InitSigPkCb((WOLFSSL*)ssl, &der.sigCtx);
  6467. if (ret != 0) {
  6468. FreeDecodedCert(&der);
  6469. return ret;
  6470. }
  6471. #endif
  6472. if (ParseCertRelative(&der, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  6473. FreeDecodedCert(&der);
  6474. return WOLFSSL_FAILURE;
  6475. }
  6476. size = ssl->buffers.key->length;
  6477. buff = ssl->buffers.key->buffer;
  6478. ret = wc_CheckPrivateKey(buff, size, &der);
  6479. FreeDecodedCert(&der);
  6480. return ret;
  6481. }
  6482. #if defined(OPENSSL_ALL)
  6483. /* Returns the number of X509V3 extensions in X509 object, or 0 on failure */
  6484. int wolfSSL_X509_get_ext_count(const WOLFSSL_X509* passedCert)
  6485. {
  6486. int extCount = 0;
  6487. int length = 0;
  6488. int outSz = 0;
  6489. const byte* rawCert;
  6490. int sz = 0;
  6491. word32 idx = 0;
  6492. DecodedCert cert;
  6493. const byte* input;
  6494. WOLFSSL_ENTER("wolfSSL_X509_get_ext_count()");
  6495. if (passedCert == NULL) {
  6496. WOLFSSL_MSG("\tNot passed a certificate");
  6497. return WOLFSSL_FAILURE;
  6498. }
  6499. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)passedCert, &outSz);
  6500. if (rawCert == NULL) {
  6501. WOLFSSL_MSG("\tpassedCert has no internal DerBuffer set.");
  6502. return WOLFSSL_FAILURE;
  6503. }
  6504. InitDecodedCert(&cert, rawCert, (word32)outSz, 0);
  6505. if (ParseCert(&cert, CA_TYPE, NO_VERIFY, NULL) < 0) {
  6506. WOLFSSL_MSG("\tCertificate parsing failed");
  6507. return WOLFSSL_FAILURE;
  6508. }
  6509. input = cert.extensions;
  6510. sz = cert.extensionsSz;
  6511. if (input == NULL || sz == 0) {
  6512. WOLFSSL_MSG("\tsz or input NULL error");
  6513. FreeDecodedCert(&cert);
  6514. return WOLFSSL_FAILURE;
  6515. }
  6516. if (input[idx++] != ASN_EXTENSIONS) {
  6517. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  6518. FreeDecodedCert(&cert);
  6519. return WOLFSSL_FAILURE;
  6520. }
  6521. if (GetLength(input, &idx, &length, sz) < 0) {
  6522. WOLFSSL_MSG("\tfail: invalid length");
  6523. FreeDecodedCert(&cert);
  6524. return WOLFSSL_FAILURE;
  6525. }
  6526. if (GetSequence(input, &idx, &length, sz) < 0) {
  6527. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  6528. FreeDecodedCert(&cert);
  6529. return WOLFSSL_FAILURE;
  6530. }
  6531. while (idx < (word32)sz) {
  6532. if (GetSequence(input, &idx, &length, sz) < 0) {
  6533. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  6534. FreeDecodedCert(&cert);
  6535. return WOLFSSL_FAILURE;
  6536. }
  6537. idx += length;
  6538. extCount++;
  6539. }
  6540. FreeDecodedCert(&cert);
  6541. return extCount;
  6542. }
  6543. /* Creates and returns pointer to a new X509_EXTENSION object in memory */
  6544. WOLFSSL_X509_EXTENSION* wolfSSL_X509_EXTENSION_new(void)
  6545. {
  6546. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_new");
  6547. WOLFSSL_X509_EXTENSION* newExt;
  6548. newExt = (WOLFSSL_X509_EXTENSION*)XMALLOC(sizeof(WOLFSSL_X509_EXTENSION),
  6549. NULL, DYNAMIC_TYPE_X509_EXT);
  6550. if (newExt == NULL)
  6551. return NULL;
  6552. XMEMSET(newExt, 0, sizeof(WOLFSSL_X509_EXTENSION));
  6553. return newExt;
  6554. }
  6555. void wolfSSL_X509_EXTENSION_free(WOLFSSL_X509_EXTENSION* x)
  6556. {
  6557. WOLFSSL_ASN1_STRING asn1;
  6558. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_free");
  6559. if (x == NULL)
  6560. return;
  6561. if (x->obj != NULL)
  6562. wolfSSL_ASN1_OBJECT_free(x->obj);
  6563. asn1 = x->value;
  6564. if (asn1.length > 0 && asn1.data != NULL && asn1.isDynamic)
  6565. XFREE(asn1.data, NULL, DYNAMIC_TYPE_OPENSSL);
  6566. wolfSSL_sk_free(x->ext_sk);
  6567. XFREE(x, NULL, DYNAMIC_TYPE_X509_EXT);
  6568. }
  6569. /* Creates and returns a new WOLFSSL_X509_EXTENSION stack. */
  6570. WOLFSSL_STACK* wolfSSL_sk_new_x509_ext(void)
  6571. {
  6572. WOLFSSL_STACK* sk;
  6573. WOLFSSL_ENTER("wolfSSL_sk_new_x509_ext");
  6574. sk = wolfSSL_sk_new_null();
  6575. if (sk) {
  6576. sk->type = STACK_TYPE_X509_EXT;
  6577. }
  6578. return sk;
  6579. }
  6580. /* return 1 on success 0 on fail */
  6581. int wolfSSL_sk_X509_EXTENSION_push(WOLFSSL_STACK* sk,WOLFSSL_X509_EXTENSION* ext)
  6582. {
  6583. WOLFSSL_STACK* node;
  6584. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_push");
  6585. if (sk == NULL || ext == NULL) {
  6586. return WOLFSSL_FAILURE;
  6587. }
  6588. /* no previous values in stack */
  6589. if (sk->data.ext == NULL) {
  6590. sk->data.ext = ext;
  6591. sk->num += 1;
  6592. return WOLFSSL_SUCCESS;
  6593. }
  6594. /* stack already has value(s) create a new node and add more */
  6595. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  6596. DYNAMIC_TYPE_X509);
  6597. if (node == NULL) {
  6598. WOLFSSL_MSG("Memory error");
  6599. return WOLFSSL_FAILURE;
  6600. }
  6601. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  6602. /* push new obj onto head of stack */
  6603. node->data.ext = sk->data.ext;
  6604. node->next = sk->next;
  6605. node->type = sk->type;
  6606. sk->next = node;
  6607. sk->data.ext = ext;
  6608. sk->num += 1;
  6609. return WOLFSSL_SUCCESS;
  6610. }
  6611. /* Free the structure for X509_EXTENSION stack
  6612. *
  6613. * sk stack to free nodes in
  6614. */
  6615. void wolfSSL_sk_X509_EXTENSION_free(WOLFSSL_STACK* sk)
  6616. {
  6617. WOLFSSL_STACK* node;
  6618. WOLFSSL_ENTER("wolfSSL_sk_X509_EXTENSION_free");
  6619. if (sk == NULL) {
  6620. return;
  6621. }
  6622. /* parse through stack freeing each node */
  6623. node = sk->next;
  6624. while ((node != NULL) && (sk->num > 1)) {
  6625. WOLFSSL_STACK* tmp = node;
  6626. node = node->next;
  6627. wolfSSL_X509_EXTENSION_free(tmp->data.ext);
  6628. XFREE(tmp, NULL, DYNAMIC_TYPE_X509);
  6629. sk->num -= 1;
  6630. }
  6631. /* free head of stack */
  6632. if (sk->num == 1) {
  6633. wolfSSL_X509_EXTENSION_free(sk->data.ext);
  6634. }
  6635. XFREE(sk, NULL, DYNAMIC_TYPE_X509);
  6636. }
  6637. int wolfSSL_ASN1_BIT_STRING_set_bit(WOLFSSL_ASN1_BIT_STRING* str, int pos,
  6638. int val)
  6639. {
  6640. int bytes_cnt, bit;
  6641. byte* temp;
  6642. if (!str || (val != 0 && val != 1) || pos < 0) {
  6643. return WOLFSSL_FAILURE;
  6644. }
  6645. bytes_cnt = pos/8;
  6646. bit = 1<<(7-(pos%8));
  6647. if (bytes_cnt+1 > str->length) {
  6648. if (!(temp = (byte*)XREALLOC(str->data, bytes_cnt+1, NULL,
  6649. DYNAMIC_TYPE_OPENSSL))) {
  6650. return WOLFSSL_FAILURE;
  6651. }
  6652. XMEMSET(temp+str->length, 0, bytes_cnt+1 - str->length);
  6653. str->data = temp;
  6654. str->length = bytes_cnt+1;
  6655. }
  6656. str->data[bytes_cnt] &= ~bit;
  6657. str->data[bytes_cnt] |= val ? bit : 0;
  6658. return WOLFSSL_SUCCESS;
  6659. }
  6660. /* Gets the X509_EXTENSION* ext based on it's location in WOLFSSL_X509* x509.
  6661. *
  6662. * x509 : The X509 structure to look for the extension.
  6663. * loc : Location of the extension. If the extension is found at the given
  6664. * location, a new X509_EXTENSION structure is populated with extension-specific
  6665. * data based on the extension type.
  6666. * Returns NULL on error or pointer to X509_EXTENSION structure containing the
  6667. * extension. The returned X509_EXTENSION should not be free'd by caller.
  6668. * The returned X509_EXTENSION is pushed onto a stack inside the x509 argument.
  6669. * This is later free'd when x509 is free'd.
  6670. *
  6671. * NOTE: for unknown extension NIDs, a X509_EXTENSION is populated with the
  6672. * extension oid as the ASN1_OBJECT (QT compatibility)
  6673. */
  6674. WOLFSSL_X509_EXTENSION* wolfSSL_X509_get_ext(const WOLFSSL_X509* x509, int loc)
  6675. {
  6676. WOLFSSL_X509_EXTENSION* ext = NULL;
  6677. WOLFSSL_ENTER("wolfSSL_X509_get_ext");
  6678. if (x509 == NULL)
  6679. return NULL;
  6680. ext = wolfSSL_X509_set_ext((WOLFSSL_X509*) x509, loc);
  6681. return ext;
  6682. }
  6683. /* Pushes a new X509_EXTENSION* ext onto the stack inside WOLFSSL_X509* x509.
  6684. * This is currently a helper function for wolfSSL_X509_get_ext
  6685. * Caller does not free the returned WOLFSSL_X509_EXTENSION*
  6686. */
  6687. WOLFSSL_X509_EXTENSION* wolfSSL_X509_set_ext(WOLFSSL_X509* x509, int loc)
  6688. {
  6689. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  6690. int objSz = 0, isSet = 0;
  6691. const byte* rawCert;
  6692. const byte* input;
  6693. byte* oidBuf;
  6694. word32 oid, idx = 0, tmpIdx = 0;
  6695. WOLFSSL_X509_EXTENSION* ext = NULL;
  6696. WOLFSSL_ASN1_INTEGER* a;
  6697. WOLFSSL_STACK* sk;
  6698. DecodedCert cert;
  6699. WOLFSSL_ENTER("wolfSSL_X509_set_ext");
  6700. if(x509 == NULL){
  6701. WOLFSSL_MSG("\tNot passed a certificate");
  6702. return NULL;
  6703. }
  6704. if(loc <0 || (loc > wolfSSL_X509_get_ext_count(x509))){
  6705. WOLFSSL_MSG("\tBad location argument");
  6706. return NULL;
  6707. }
  6708. ext = wolfSSL_X509_EXTENSION_new();
  6709. if (ext == NULL) {
  6710. WOLFSSL_MSG("\tX509_EXTENSION_new() failed");
  6711. return NULL;
  6712. }
  6713. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  6714. if (rawCert == NULL) {
  6715. WOLFSSL_MSG("\tX509_get_der() failed");
  6716. wolfSSL_X509_EXTENSION_free(ext);
  6717. return NULL;
  6718. }
  6719. InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
  6720. if (ParseCert(&cert, CA_TYPE, NO_VERIFY, NULL) < 0) {
  6721. WOLFSSL_MSG("\tCertificate parsing failed");
  6722. wolfSSL_X509_EXTENSION_free(ext);
  6723. return NULL;
  6724. }
  6725. input = cert.extensions;
  6726. sz = cert.extensionsSz;
  6727. if (input == NULL || sz == 0) {
  6728. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  6729. wolfSSL_X509_EXTENSION_free(ext);
  6730. FreeDecodedCert(&cert);
  6731. return NULL;
  6732. }
  6733. if (input[idx++] != ASN_EXTENSIONS) {
  6734. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  6735. wolfSSL_X509_EXTENSION_free(ext);
  6736. FreeDecodedCert(&cert);
  6737. return NULL;
  6738. }
  6739. if (GetLength(input, &idx, &length, sz) < 0) {
  6740. WOLFSSL_MSG("\tfail: invalid length");
  6741. wolfSSL_X509_EXTENSION_free(ext);
  6742. FreeDecodedCert(&cert);
  6743. return NULL;
  6744. }
  6745. if (GetSequence(input, &idx, &length, sz) < 0) {
  6746. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  6747. wolfSSL_X509_EXTENSION_free(ext);
  6748. FreeDecodedCert(&cert);
  6749. return NULL;
  6750. }
  6751. while (idx < (word32)sz) {
  6752. oid = 0;
  6753. if (GetSequence(input, &idx, &length, sz) < 0) {
  6754. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  6755. wolfSSL_X509_EXTENSION_free(ext);
  6756. FreeDecodedCert(&cert);
  6757. return NULL;
  6758. }
  6759. tmpIdx = idx;
  6760. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  6761. if (ret < 0) {
  6762. WOLFSSL_MSG("\tfail: OBJECT ID");
  6763. wolfSSL_X509_EXTENSION_free(ext);
  6764. FreeDecodedCert(&cert);
  6765. return NULL;
  6766. }
  6767. idx = tmpIdx;
  6768. /* Continue while loop until extCount == loc or idx > sz */
  6769. if (extCount != loc) {
  6770. idx += length;
  6771. extCount++;
  6772. continue;
  6773. }
  6774. /* extCount == loc. Now get the extension. */
  6775. /* Check if extension has been set */
  6776. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, oid);
  6777. ext->obj = wolfSSL_OBJ_nid2obj(oid);
  6778. if (ext->obj == NULL) {
  6779. WOLFSSL_MSG("\tfail: Invalid OBJECT");
  6780. wolfSSL_X509_EXTENSION_free(ext);
  6781. FreeDecodedCert(&cert);
  6782. return NULL;
  6783. }
  6784. ext->obj->nid = oid;
  6785. switch (oid) {
  6786. case BASIC_CA_OID:
  6787. if (!isSet)
  6788. break;
  6789. /* Set pathlength */
  6790. a = wolfSSL_ASN1_INTEGER_new();
  6791. if (a == NULL) {
  6792. wolfSSL_X509_EXTENSION_free(ext);
  6793. FreeDecodedCert(&cert);
  6794. return NULL;
  6795. }
  6796. a->length = x509->pathLength;
  6797. /* Save ASN1_INTEGER in x509 extension */
  6798. ext->obj->pathlen = a;
  6799. ext->obj->ca = x509->isCa;
  6800. ext->crit = x509->basicConstCrit;
  6801. break;
  6802. case AUTH_INFO_OID:
  6803. if (!isSet)
  6804. break;
  6805. /* Create a stack to hold both the caIssuer and ocsp objects
  6806. in X509_EXTENSION structure */
  6807. sk = (WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)*)XMALLOC(
  6808. sizeof(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)),
  6809. NULL, DYNAMIC_TYPE_ASN1);
  6810. if (sk == NULL) {
  6811. WOLFSSL_MSG("Failed to malloc stack");
  6812. wolfSSL_X509_EXTENSION_free(ext);
  6813. FreeDecodedCert(&cert);
  6814. return NULL;
  6815. }
  6816. XMEMSET(sk, 0, sizeof(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)));
  6817. sk->type = STACK_TYPE_OBJ;
  6818. /* Add CaIssuers object to stack */
  6819. if (x509->authInfoCaIssuer != NULL &&
  6820. x509->authInfoCaIssuerSz > 0)
  6821. {
  6822. WOLFSSL_ASN1_OBJECT* obj;
  6823. obj = wolfSSL_ASN1_OBJECT_new();
  6824. if (obj == NULL) {
  6825. WOLFSSL_MSG("Error creating ASN1 object");
  6826. wolfSSL_sk_ASN1_OBJECT_free(sk);
  6827. wolfSSL_X509_EXTENSION_free(ext);
  6828. FreeDecodedCert(&cert);
  6829. return NULL;
  6830. }
  6831. obj->obj = (byte*)x509->authInfoCaIssuer;
  6832. obj->objSz = x509->authInfoCaIssuerSz;
  6833. obj->grp = oidCertAuthInfoType;
  6834. obj->nid = AIA_CA_ISSUER_OID;
  6835. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  6836. if (ret != WOLFSSL_SUCCESS) {
  6837. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  6838. wolfSSL_ASN1_OBJECT_free(obj);
  6839. wolfSSL_sk_ASN1_OBJECT_free(sk);
  6840. wolfSSL_X509_EXTENSION_free(ext);
  6841. FreeDecodedCert(&cert);
  6842. return NULL;
  6843. }
  6844. }
  6845. /* Add OCSP object to stack */
  6846. if (x509->authInfo != NULL &&
  6847. x509->authInfoSz > 0)
  6848. {
  6849. WOLFSSL_ASN1_OBJECT* obj;
  6850. obj = wolfSSL_ASN1_OBJECT_new();
  6851. if (obj == NULL) {
  6852. WOLFSSL_MSG("Error creating ASN1 object");
  6853. wolfSSL_sk_ASN1_OBJECT_free(sk);
  6854. wolfSSL_X509_EXTENSION_free(ext);
  6855. FreeDecodedCert(&cert);
  6856. return NULL;
  6857. }
  6858. obj->obj = x509->authInfo;
  6859. obj->objSz = x509->authInfoSz;
  6860. obj->grp = oidCertAuthInfoType;
  6861. obj->nid = AIA_OCSP_OID;
  6862. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, obj);
  6863. if (ret != WOLFSSL_SUCCESS) {
  6864. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  6865. wolfSSL_ASN1_OBJECT_free(obj);
  6866. wolfSSL_sk_ASN1_OBJECT_free(sk);
  6867. wolfSSL_X509_EXTENSION_free(ext);
  6868. FreeDecodedCert(&cert);
  6869. return NULL;
  6870. }
  6871. }
  6872. ext->ext_sk = sk;
  6873. ext->crit = x509->authInfoCrit;
  6874. break;
  6875. case AUTH_KEY_OID:
  6876. if (!isSet)
  6877. break;
  6878. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->authKeyId,
  6879. x509->authKeyIdSz);
  6880. if (ret != WOLFSSL_SUCCESS) {
  6881. WOLFSSL_MSG("ASN1_STRING_set() failed");
  6882. wolfSSL_X509_EXTENSION_free(ext);
  6883. FreeDecodedCert(&cert);
  6884. return NULL;
  6885. }
  6886. ext->crit = x509->authKeyIdCrit;
  6887. break;
  6888. case SUBJ_KEY_OID:
  6889. if (!isSet)
  6890. break;
  6891. ret = wolfSSL_ASN1_STRING_set(&ext->value, x509->subjKeyId,
  6892. x509->subjKeyIdSz);
  6893. if (ret != WOLFSSL_SUCCESS) {
  6894. WOLFSSL_MSG("ASN1_STRING_set() failed");
  6895. wolfSSL_X509_EXTENSION_free(ext);
  6896. FreeDecodedCert(&cert);
  6897. return NULL;
  6898. }
  6899. ext->crit = x509->subjKeyIdCrit;
  6900. break;
  6901. case CERT_POLICY_OID:
  6902. if (!isSet)
  6903. break;
  6904. ext->crit = x509->certPolicyCrit;
  6905. break;
  6906. case KEY_USAGE_OID:
  6907. if (!isSet)
  6908. break;
  6909. ret = wolfSSL_ASN1_STRING_set(&ext->value,
  6910. (byte*)&(x509->keyUsage), sizeof(word16));
  6911. if (ret != WOLFSSL_SUCCESS) {
  6912. WOLFSSL_MSG("ASN1_STRING_set() failed");
  6913. wolfSSL_X509_EXTENSION_free(ext);
  6914. FreeDecodedCert(&cert);
  6915. return NULL;
  6916. }
  6917. ext->crit = x509->keyUsageCrit;
  6918. break;
  6919. case EXT_KEY_USAGE_OID:
  6920. if (!isSet)
  6921. break;
  6922. ext->crit = x509->keyUsageCrit;
  6923. break;
  6924. case CRL_DIST_OID:
  6925. if (!isSet)
  6926. break;
  6927. ext->crit = x509->CRLdistCrit;
  6928. break;
  6929. case ALT_NAMES_OID:
  6930. {
  6931. WOLFSSL_GENERAL_NAME* gn = NULL;
  6932. DNS_entry* dns = NULL;
  6933. if (!isSet)
  6934. break;
  6935. sk = (WOLFSSL_GENERAL_NAMES*)XMALLOC(
  6936. sizeof(WOLFSSL_GENERAL_NAMES), NULL,
  6937. DYNAMIC_TYPE_ASN1);
  6938. if (sk == NULL) {
  6939. return NULL;
  6940. }
  6941. XMEMSET(sk, 0, sizeof(WOLFSSL_GENERAL_NAMES));
  6942. sk->type = STACK_TYPE_GEN_NAME;
  6943. if (x509->subjAltNameSet && x509->altNames != NULL) {
  6944. /* alt names are DNS_entry structs */
  6945. dns = x509->altNames;
  6946. /* Currently only support GEN_DNS type */
  6947. while (dns != NULL) {
  6948. gn = wolfSSL_GENERAL_NAME_new();
  6949. if (gn == NULL) {
  6950. WOLFSSL_MSG("Error creating GENERAL_NAME");
  6951. wolfSSL_sk_free(sk);
  6952. return NULL;
  6953. }
  6954. gn->type = dns->type;
  6955. gn->d.ia5->length = dns->len;
  6956. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  6957. gn->d.ia5->length) != WOLFSSL_SUCCESS) {
  6958. WOLFSSL_MSG("ASN1_STRING_set failed");
  6959. wolfSSL_GENERAL_NAME_free(gn);
  6960. wolfSSL_sk_free(sk);
  6961. return NULL;
  6962. }
  6963. dns = dns->next;
  6964. /* last dns in list add at end of function */
  6965. if (dns != NULL) {
  6966. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  6967. WOLFSSL_SUCCESS) {
  6968. WOLFSSL_MSG("Error pushing onto stack");
  6969. wolfSSL_GENERAL_NAME_free(gn);
  6970. wolfSSL_sk_free(sk);
  6971. sk = NULL;
  6972. }
  6973. }
  6974. }
  6975. if (wolfSSL_sk_GENERAL_NAME_push(sk,gn) !=
  6976. WOLFSSL_SUCCESS) {
  6977. WOLFSSL_MSG("Error pushing onto stack");
  6978. wolfSSL_GENERAL_NAME_free(gn);
  6979. wolfSSL_sk_free(sk);
  6980. sk = NULL;
  6981. }
  6982. }
  6983. ext->ext_sk = sk;
  6984. ext->crit = x509->subjAltNameCrit;
  6985. break;
  6986. }
  6987. default:
  6988. WOLFSSL_MSG("Unknown extension type found, parsing OID");
  6989. /* If the extension type is not recognized/supported,
  6990. set the ASN1_OBJECT in the extension with the
  6991. parsed oid for access in later function calls */
  6992. /* Get OID from input */
  6993. if (GetASNObjectId(input, &idx, &length, sz) != 0) {
  6994. WOLFSSL_MSG("Failed to Get ASN Object Id");
  6995. wolfSSL_X509_EXTENSION_free(ext);
  6996. FreeDecodedCert(&cert);
  6997. return NULL;
  6998. }
  6999. oidBuf = (byte*)XMALLOC(length+1+MAX_LENGTH_SZ, NULL,
  7000. DYNAMIC_TYPE_TMP_BUFFER);
  7001. if (oidBuf == NULL) {
  7002. WOLFSSL_MSG("Failed to malloc tmp buffer");
  7003. wolfSSL_X509_EXTENSION_free(ext);
  7004. FreeDecodedCert(&cert);
  7005. return NULL;
  7006. }
  7007. oidBuf[0] = ASN_OBJECT_ID;
  7008. objSz++;
  7009. objSz += SetLength(length, oidBuf + 1);
  7010. objSz += length;
  7011. /* Set object size and reallocate space in object buffer */
  7012. ext->obj->objSz = objSz;
  7013. if(((ext->obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  7014. (ext->obj->obj == NULL)) {
  7015. ext->obj->obj =(byte*)XREALLOC((byte*)ext->obj->obj,
  7016. ext->obj->objSz,
  7017. NULL,DYNAMIC_TYPE_ASN1);
  7018. if (ext->obj->obj == NULL) {
  7019. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7020. wolfSSL_X509_EXTENSION_free(ext);
  7021. FreeDecodedCert(&cert);
  7022. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7023. return NULL;
  7024. }
  7025. ext->obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  7026. } else {
  7027. ext->obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7028. }
  7029. /* Get OID from input and copy to ASN1_OBJECT buffer */
  7030. XMEMCPY(oidBuf+2, input+idx, length);
  7031. XMEMCPY((byte*)ext->obj->obj, oidBuf, ext->obj->objSz);
  7032. XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7033. oidBuf = NULL;
  7034. ext->obj->grp = oidCertExtType;
  7035. ext->crit = 0;
  7036. /* Get extension data and copy as ASN1_STRING */
  7037. tmpIdx = idx + length;
  7038. if ((tmpIdx >= (word32)sz) || (input[tmpIdx++] != ASN_OCTET_STRING)) {
  7039. WOLFSSL_MSG("Error decoding unknown extension data");
  7040. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7041. wolfSSL_X509_EXTENSION_free(ext);
  7042. FreeDecodedCert(&cert);
  7043. return NULL;
  7044. }
  7045. if (GetLength(input, &tmpIdx, &length, sz) <= 0) {
  7046. WOLFSSL_MSG("Error: Invalid Input Length.");
  7047. wolfSSL_ASN1_OBJECT_free(ext->obj);
  7048. wolfSSL_X509_EXTENSION_free(ext);
  7049. FreeDecodedCert(&cert);
  7050. return NULL;
  7051. }
  7052. ext->value.data = (char*)XMALLOC(length, NULL, DYNAMIC_TYPE_ASN1);
  7053. ext->value.isDynamic = 1;
  7054. if (ext->value.data == NULL) {
  7055. WOLFSSL_MSG("Failed to malloc ASN1_STRING data");
  7056. wolfSSL_X509_EXTENSION_free(ext);
  7057. FreeDecodedCert(&cert);
  7058. return NULL;
  7059. }
  7060. XMEMCPY(ext->value.data,input+tmpIdx,length);
  7061. ext->value.length = length;
  7062. } /* switch(oid) */
  7063. break; /* Got the Extension. Now exit while loop. */
  7064. } /* while(idx < sz) */
  7065. /* Store the new extension in a stack inside x509
  7066. * The extensions on the stack are free'd internally when FreeX509 is called
  7067. */
  7068. if (x509->ext_sk == NULL)
  7069. x509->ext_sk = wolfSSL_sk_new_x509_ext();
  7070. if (x509->ext_sk != NULL)
  7071. wolfSSL_sk_X509_EXTENSION_push(x509->ext_sk, ext);
  7072. FreeDecodedCert(&cert);
  7073. return ext;
  7074. }
  7075. /* Return 0 on success and 1 on failure. Copies ext data to bio, using indent
  7076. * to pad the output. flag is ignored. */
  7077. int wolfSSL_X509V3_EXT_print(WOLFSSL_BIO *out, WOLFSSL_X509_EXTENSION *ext,
  7078. unsigned long flag, int indent)
  7079. {
  7080. ASN1_OBJECT* obj;
  7081. ASN1_STRING* str;
  7082. int nid;
  7083. const int sz = CTC_NAME_SIZE*2;
  7084. int rc = WOLFSSL_FAILURE;
  7085. char tmp[CTC_NAME_SIZE*2] = {0};
  7086. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_print");
  7087. if ((out == NULL) || (ext == NULL)) {
  7088. WOLFSSL_MSG("NULL parameter error");
  7089. return rc;
  7090. }
  7091. obj = wolfSSL_X509_EXTENSION_get_object(ext);
  7092. if (obj == NULL) {
  7093. WOLFSSL_MSG("Error getting ASN1_OBJECT from X509_EXTENSION");
  7094. return rc;
  7095. }
  7096. str = wolfSSL_X509_EXTENSION_get_data(ext);
  7097. if (str == NULL) {
  7098. WOLFSSL_MSG("Error getting ASN1_STRING from X509_EXTENSION");
  7099. return rc;
  7100. }
  7101. /* Print extension based on the type */
  7102. nid = wolfSSL_OBJ_obj2nid(obj);
  7103. switch (nid) {
  7104. case BASIC_CA_OID:
  7105. {
  7106. char isCa[] = "TRUE";
  7107. char notCa[] = "FALSE";
  7108. XSNPRINTF(tmp, sz, "%*sCA:%s", indent, "",
  7109. obj->ca ? isCa : notCa);
  7110. break;
  7111. }
  7112. case ALT_NAMES_OID:
  7113. {
  7114. WOLFSSL_STACK* sk;
  7115. char* val;
  7116. int len;
  7117. tmp[0] = '\0'; /* Make sure tmp is null-terminated */
  7118. sk = ext->ext_sk;
  7119. while (sk != NULL) {
  7120. if (sk->type == STACK_TYPE_GEN_NAME && sk->data.gn) {
  7121. /* str is GENERAL_NAME for subject alternative name ext */
  7122. str = sk->data.gn->d.ia5;
  7123. len = str->length + 2; /* + 2 for NULL char and "," */
  7124. if (len > sz) {
  7125. WOLFSSL_MSG("len greater than buffer size");
  7126. return rc;
  7127. }
  7128. val = (char*)XMALLOC(len + indent, NULL,
  7129. DYNAMIC_TYPE_TMP_BUFFER);
  7130. if (val == NULL) {
  7131. WOLFSSL_MSG("Memory error");
  7132. return rc;
  7133. }
  7134. if (sk->next)
  7135. XSNPRINTF(val, len, "%*s%s, ", indent, "", str->strData);
  7136. else
  7137. XSNPRINTF(val, len, "%*s%s", indent, "", str->strData);
  7138. XSTRNCAT(tmp, val, len);
  7139. XFREE(val, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7140. }
  7141. sk = sk->next;
  7142. }
  7143. break;
  7144. }
  7145. case AUTH_KEY_OID:
  7146. case SUBJ_KEY_OID:
  7147. {
  7148. char* asn1str;
  7149. asn1str = wolfSSL_i2s_ASN1_STRING(NULL, str);
  7150. XSNPRINTF(tmp, sz, "%*s%s", indent, "", asn1str);
  7151. XFREE(asn1str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  7152. break;
  7153. }
  7154. case AUTH_INFO_OID:
  7155. case CERT_POLICY_OID:
  7156. case CRL_DIST_OID:
  7157. case KEY_USAGE_OID:
  7158. WOLFSSL_MSG("X509V3_EXT_print not yet implemented for ext type");
  7159. break;
  7160. default:
  7161. XSNPRINTF(tmp, sz, "%*s%s", indent, "", str->strData);
  7162. }
  7163. if (wolfSSL_BIO_write(out, tmp, (int)XSTRLEN(tmp)) == (int)XSTRLEN(tmp)) {
  7164. rc = WOLFSSL_SUCCESS;
  7165. }
  7166. (void) flag;
  7167. return rc;
  7168. }
  7169. /* Returns crit flag in X509_EXTENSION object */
  7170. int wolfSSL_X509_EXTENSION_get_critical(const WOLFSSL_X509_EXTENSION* ex)
  7171. {
  7172. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_critical");
  7173. if (ex == NULL)
  7174. return BAD_FUNC_ARG;
  7175. return ex->crit;
  7176. }
  7177. /* Creates v3_ext_method for a given X509v3 extension
  7178. *
  7179. * ex : The X509_EXTENSION used to create v3_ext_method. If the extension is
  7180. * not NULL, get the NID of the extension object and populate the
  7181. * extension type-specific X509V3_EXT_* function(s) in v3_ext_method.
  7182. *
  7183. * Returns NULL on error or pointer to the v3_ext_method populated with extension
  7184. * type-specific X509V3_EXT_* function(s).
  7185. *
  7186. * NOTE: NID_subject_key_identifier is currently the only extension implementing
  7187. * the X509V3_EXT_* functions, as it is the only type called directly by QT. The
  7188. * other extension types return a pointer to a v3_ext_method struct that contains
  7189. * only the NID.
  7190. */
  7191. const WOLFSSL_v3_ext_method* wolfSSL_X509V3_EXT_get(WOLFSSL_X509_EXTENSION* ex)
  7192. {
  7193. int nid;
  7194. WOLFSSL_v3_ext_method method;
  7195. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_get");
  7196. if ((ex == NULL) || (ex->obj == NULL)) {
  7197. WOLFSSL_MSG("Passed an invalid X509_EXTENSION*");
  7198. return NULL;
  7199. }
  7200. /* Initialize method to 0 */
  7201. XMEMSET(&method, 0, sizeof(struct WOLFSSL_v3_ext_method));
  7202. nid = ex->obj->nid;
  7203. if (nid <= 0) {
  7204. WOLFSSL_MSG("Failed to get nid from passed extension object");
  7205. return NULL;
  7206. }
  7207. XMEMSET(&method, 0, sizeof(WOLFSSL_v3_ext_method));
  7208. switch (nid) {
  7209. case NID_basic_constraints:
  7210. break;
  7211. case NID_subject_key_identifier:
  7212. method.i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  7213. break;
  7214. case NID_subject_alt_name:
  7215. WOLFSSL_MSG("i2v function not yet implemented for Subject Alternative Name");
  7216. break;
  7217. case NID_key_usage:
  7218. WOLFSSL_MSG("i2v function not yet implemented for Key Usage");
  7219. break;
  7220. case NID_authority_key_identifier:
  7221. WOLFSSL_MSG("i2v function not yet implemented for Auth Key Id");
  7222. break;
  7223. case NID_info_access:
  7224. WOLFSSL_MSG("i2v function not yet implemented for Info Access");
  7225. break;
  7226. case NID_ext_key_usage:
  7227. WOLFSSL_MSG("i2v function not yet implemented for Ext Key Usage");
  7228. break;
  7229. case NID_certificate_policies:
  7230. WOLFSSL_MSG("r2i function not yet implemented for Cert Policies");
  7231. break;
  7232. case NID_crl_distribution_points:
  7233. WOLFSSL_MSG("r2i function not yet implemented for CRL Dist Points");
  7234. break;
  7235. default:
  7236. /* If extension type is unknown, return NULL -- QT makes call to
  7237. X509_EXTENSION_get_data() if there is no v3_ext_method */
  7238. WOLFSSL_MSG("X509V3_EXT_get(): Unknown extension type found");
  7239. return NULL;
  7240. }
  7241. method.ext_nid = nid;
  7242. ex->ext_method = method;
  7243. return (const WOLFSSL_v3_ext_method*)&ex->ext_method;
  7244. }
  7245. /* Parses and returns an x509v3 extension internal structure.
  7246. *
  7247. * ext : The X509_EXTENSION for parsing internal structure. If extension is
  7248. * not NULL, get the NID of the extension object and create a new
  7249. * extension-specific internal structure based on the extension type.
  7250. *
  7251. * Returns NULL on error or if NID is not found, otherwise returns a pointer to
  7252. * the extension type-specific X509_EXTENSION internal structure.
  7253. * Return is expected to be free'd by caller.
  7254. */
  7255. void* wolfSSL_X509V3_EXT_d2i(WOLFSSL_X509_EXTENSION* ext)
  7256. {
  7257. const WOLFSSL_v3_ext_method* method;
  7258. int ret;
  7259. WOLFSSL_ASN1_OBJECT* object;
  7260. WOLFSSL_BASIC_CONSTRAINTS* bc;
  7261. WOLFSSL_AUTHORITY_KEYID* akey;
  7262. WOLFSSL_ASN1_STRING* asn1String, *newString;
  7263. WOLFSSL_AUTHORITY_INFO_ACCESS* aia;
  7264. WOLFSSL_STACK* sk;
  7265. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_d2i");
  7266. if(ext == NULL) {
  7267. WOLFSSL_MSG("Bad function Argument");
  7268. return NULL;
  7269. }
  7270. /* extract extension info */
  7271. method = wolfSSL_X509V3_EXT_get(ext);
  7272. if (method == NULL) {
  7273. WOLFSSL_MSG("wolfSSL_X509V3_EXT_get error");
  7274. return NULL;
  7275. }
  7276. object = wolfSSL_X509_EXTENSION_get_object(ext);
  7277. if (object == NULL) {
  7278. WOLFSSL_MSG("X509_EXTENSION_get_object failed");
  7279. return NULL;
  7280. }
  7281. /* Return pointer to proper internal structure based on NID */
  7282. switch (object->type) {
  7283. /* basicConstraints */
  7284. case (NID_basic_constraints):
  7285. WOLFSSL_MSG("basicConstraints");
  7286. /* Allocate new BASIC_CONSTRAINTS structure */
  7287. bc = wolfSSL_BASIC_CONSTRAINTS_new();
  7288. if (bc == NULL) {
  7289. WOLFSSL_MSG("Failed to malloc basic constraints");
  7290. return NULL;
  7291. }
  7292. /* Copy pathlen and CA into BASIC_CONSTRAINTS from object */
  7293. bc->ca = object->ca;
  7294. if (object->pathlen->length > 0) {
  7295. bc->pathlen = wolfSSL_ASN1_INTEGER_dup(object->pathlen);
  7296. if (bc->pathlen == NULL) {
  7297. WOLFSSL_MSG("Failed to duplicate ASN1_INTEGER");
  7298. wolfSSL_BASIC_CONSTRAINTS_free(bc);
  7299. return NULL;
  7300. }
  7301. }
  7302. else
  7303. bc->pathlen = NULL;
  7304. return bc;
  7305. /* subjectKeyIdentifier */
  7306. case (NID_subject_key_identifier):
  7307. WOLFSSL_MSG("subjectKeyIdentifier");
  7308. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7309. if (asn1String == NULL) {
  7310. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7311. return NULL;
  7312. }
  7313. newString = wolfSSL_ASN1_STRING_new();
  7314. if (newString == NULL) {
  7315. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  7316. return NULL;
  7317. }
  7318. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  7319. asn1String->length);
  7320. if (ret != WOLFSSL_SUCCESS) {
  7321. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7322. wolfSSL_ASN1_STRING_free(newString);
  7323. return NULL;
  7324. };
  7325. newString->type = asn1String->type;
  7326. return newString;
  7327. /* authorityKeyIdentifier */
  7328. case (NID_authority_key_identifier):
  7329. WOLFSSL_MSG("AuthorityKeyIdentifier");
  7330. akey = (WOLFSSL_AUTHORITY_KEYID*)
  7331. XMALLOC(sizeof(WOLFSSL_AUTHORITY_KEYID), NULL,
  7332. DYNAMIC_TYPE_X509_EXT);
  7333. if (akey == NULL) {
  7334. WOLFSSL_MSG("Failed to malloc authority key id");
  7335. return NULL;
  7336. }
  7337. akey->keyid = wolfSSL_ASN1_STRING_new();
  7338. if (akey->keyid == NULL) {
  7339. WOLFSSL_MSG("ASN1_STRING_new() failed");
  7340. wolfSSL_AUTHORITY_KEYID_free(akey);
  7341. return NULL;
  7342. }
  7343. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7344. if (asn1String == NULL) {
  7345. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7346. wolfSSL_AUTHORITY_KEYID_free(akey);
  7347. return NULL;
  7348. }
  7349. ret = wolfSSL_ASN1_STRING_set(akey->keyid, asn1String->data,
  7350. asn1String->length);
  7351. if (ret != WOLFSSL_SUCCESS) {
  7352. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7353. wolfSSL_AUTHORITY_KEYID_free(akey);
  7354. return NULL;
  7355. };
  7356. akey->keyid->type = asn1String->type;
  7357. /* For now, set issuer and serial to NULL. This may need to be
  7358. updated for future use */
  7359. akey->issuer = NULL;
  7360. akey->serial = NULL;
  7361. return akey;
  7362. /* keyUsage */
  7363. case (NID_key_usage):
  7364. WOLFSSL_MSG("keyUsage");
  7365. /* This may need to be updated for future use. The i2v method for
  7366. keyUsage is not currently set. For now, return the ASN1_STRING
  7367. representation of KeyUsage bit string */
  7368. asn1String = wolfSSL_X509_EXTENSION_get_data(ext);
  7369. if (asn1String == NULL) {
  7370. WOLFSSL_MSG("X509_EXTENSION_get_data() failed");
  7371. return NULL;
  7372. }
  7373. newString = wolfSSL_ASN1_STRING_new();
  7374. if (newString == NULL) {
  7375. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  7376. return NULL;
  7377. }
  7378. ret = wolfSSL_ASN1_STRING_set(newString, asn1String->data,
  7379. asn1String->length);
  7380. if (ret != WOLFSSL_SUCCESS) {
  7381. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7382. wolfSSL_ASN1_STRING_free(newString);
  7383. return NULL;
  7384. };
  7385. newString->type = asn1String->type;
  7386. return newString;
  7387. /* extKeyUsage */
  7388. case (NID_ext_key_usage):
  7389. WOLFSSL_MSG("extKeyUsage not supported yet");
  7390. return NULL;
  7391. /* certificatePolicies */
  7392. case (NID_certificate_policies):
  7393. WOLFSSL_MSG("certificatePolicies not supported yet");
  7394. return NULL;
  7395. /* cRLDistributionPoints */
  7396. case (NID_crl_distribution_points):
  7397. WOLFSSL_MSG("cRLDistributionPoints not supported yet");
  7398. return NULL;
  7399. /* authorityInfoAccess */
  7400. case (NID_info_access):
  7401. WOLFSSL_MSG("AuthorityInfoAccess");
  7402. sk = ext->ext_sk;
  7403. if (sk == NULL) {
  7404. WOLFSSL_MSG("ACCESS_DESCRIPTION stack NULL");
  7405. return NULL;
  7406. }
  7407. /* AUTHORITY_INFO_ACCESS is a stack of ACCESS_DESCRIPTION entries */
  7408. aia = wolfSSL_sk_new_null();
  7409. if (aia == NULL) {
  7410. WOLFSSL_MSG("Failed to malloc AUTHORITY_INFO_ACCESS");
  7411. return NULL;
  7412. }
  7413. aia->type = STACK_TYPE_ACCESS_DESCRIPTION;
  7414. while (sk) {
  7415. WOLFSSL_ACCESS_DESCRIPTION* ad;
  7416. WOLFSSL_ASN1_OBJECT* aiaEntry;
  7417. if (sk->type != STACK_TYPE_OBJ) {
  7418. sk = sk->next;
  7419. continue;
  7420. }
  7421. aiaEntry = sk->data.obj;
  7422. /* ACCESS_DESCRIPTION has two members, method and location.
  7423. Method: ASN1_OBJECT as either AIA_OCSP_OID or AIA_CA_ISSUER_OID
  7424. Location: GENERAL_NAME structure containing the URI. */
  7425. ad = (WOLFSSL_ACCESS_DESCRIPTION*)
  7426. XMALLOC(sizeof(WOLFSSL_ACCESS_DESCRIPTION), NULL,
  7427. DYNAMIC_TYPE_X509_EXT);
  7428. if (ad == NULL) {
  7429. WOLFSSL_MSG("Failed to malloc ACCESS_DESCRIPTION");
  7430. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7431. return NULL;
  7432. }
  7433. XMEMSET(ad, 0, sizeof(WOLFSSL_ACCESS_DESCRIPTION));
  7434. /* Create new ASN1_OBJECT from oid */
  7435. ad->method = wolfSSL_OBJ_nid2obj(aiaEntry->nid);
  7436. if (ad->method == NULL) {
  7437. WOLFSSL_MSG("OBJ_nid2obj() failed");
  7438. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7439. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7440. return NULL;
  7441. }
  7442. /* Allocate memory for GENERAL NAME */
  7443. ad->location = (WOLFSSL_GENERAL_NAME*)
  7444. XMALLOC(sizeof(WOLFSSL_GENERAL_NAME), NULL,
  7445. DYNAMIC_TYPE_OPENSSL);
  7446. if (ad->location == NULL) {
  7447. WOLFSSL_MSG("Failed to malloc GENERAL_NAME");
  7448. wolfSSL_ASN1_OBJECT_free(ad->method);
  7449. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7450. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7451. return NULL;
  7452. }
  7453. XMEMSET(ad->location, 0, sizeof(WOLFSSL_GENERAL_NAME));
  7454. ad->location->type = GEN_URI;
  7455. ad->location->d.uniformResourceIdentifier =
  7456. wolfSSL_ASN1_STRING_new();
  7457. /* Set the URI in GENERAL_NAME */
  7458. ret = wolfSSL_ASN1_STRING_set(
  7459. ad->location->d.uniformResourceIdentifier,
  7460. aiaEntry->obj, aiaEntry->objSz);
  7461. if (ret != WOLFSSL_SUCCESS) {
  7462. WOLFSSL_MSG("ASN1_STRING_set() failed");
  7463. wolfSSL_ASN1_OBJECT_free(ad->method);
  7464. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7465. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7466. return NULL;
  7467. }
  7468. /* Push to AUTHORITY_INFO_ACCESS stack */
  7469. ret = wolfSSL_sk_ACCESS_DESCRIPTION_push(aia, ad);
  7470. if (ret != WOLFSSL_SUCCESS) {
  7471. WOLFSSL_MSG("Error pushing ASN1 AD onto stack");
  7472. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(aia, NULL);
  7473. wolfSSL_ASN1_OBJECT_free(ad->method);
  7474. XFREE(aia, NULL, DYNAMIC_TYPE_X509_EXT);
  7475. XFREE(ad, NULL, DYNAMIC_TYPE_X509_EXT);
  7476. return NULL;
  7477. }
  7478. sk = sk->next;
  7479. }
  7480. return aia;
  7481. default:
  7482. WOLFSSL_MSG("Extension NID not in table, returning NULL");
  7483. break;
  7484. }
  7485. return NULL;
  7486. }
  7487. /* Looks for the extension matching the passed in nid
  7488. *
  7489. * x509 : certificate to get parse through for extension.
  7490. * nid : Extension OID to be found.
  7491. * lastPos : Start search from extension after lastPos.
  7492. * Set to -1 to search from index 0.
  7493. * return >= 0 If successful the extension index is returned.
  7494. * return -1 If extension is not found or error is encountered.
  7495. */
  7496. int wolfSSL_X509_get_ext_by_NID(const WOLFSSL_X509* x509, int nid, int lastPos)
  7497. {
  7498. int extCount = 0, length = 0, outSz = 0, sz = 0, ret = 0;
  7499. int isSet = 0, found = 0, loc;
  7500. const byte* rawCert;
  7501. const byte* input;
  7502. word32 oid, idx = 0, tmpIdx = 0;
  7503. DecodedCert cert;
  7504. WOLFSSL_ENTER("wolfSSL_X509_get_ext_by_NID");
  7505. if(x509 == NULL){
  7506. WOLFSSL_MSG("\tNot passed a certificate");
  7507. return WOLFSSL_FATAL_ERROR;
  7508. }
  7509. if(lastPos < -1 || (lastPos > (wolfSSL_X509_get_ext_count(x509) - 1))){
  7510. WOLFSSL_MSG("\tBad location argument");
  7511. return WOLFSSL_FATAL_ERROR;
  7512. }
  7513. loc = lastPos + 1;
  7514. rawCert = wolfSSL_X509_get_der((WOLFSSL_X509*)x509, &outSz);
  7515. if (rawCert == NULL) {
  7516. WOLFSSL_MSG("\tX509_get_der() failed");
  7517. return WOLFSSL_FATAL_ERROR;
  7518. }
  7519. InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
  7520. if (ParseCert(&cert, CA_TYPE, NO_VERIFY, NULL) < 0) {
  7521. WOLFSSL_MSG("\tCertificate parsing failed");
  7522. return WOLFSSL_FATAL_ERROR;
  7523. }
  7524. input = cert.extensions;
  7525. sz = cert.extensionsSz;
  7526. if (input == NULL || sz == 0) {
  7527. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  7528. FreeDecodedCert(&cert);
  7529. return WOLFSSL_FATAL_ERROR;
  7530. }
  7531. if (input[idx++] != ASN_EXTENSIONS) {
  7532. WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
  7533. FreeDecodedCert(&cert);
  7534. return WOLFSSL_FATAL_ERROR;
  7535. }
  7536. if (GetLength(input, &idx, &length, sz) < 0) {
  7537. WOLFSSL_MSG("\tfail: invalid length");
  7538. FreeDecodedCert(&cert);
  7539. return WOLFSSL_FATAL_ERROR;
  7540. }
  7541. if (GetSequence(input, &idx, &length, sz) < 0) {
  7542. WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)");
  7543. FreeDecodedCert(&cert);
  7544. return WOLFSSL_FATAL_ERROR;
  7545. }
  7546. while (idx < (word32)sz) {
  7547. oid = 0;
  7548. if (GetSequence(input, &idx, &length, sz) < 0) {
  7549. WOLFSSL_MSG("\tfail: should be a SEQUENCE");
  7550. FreeDecodedCert(&cert);
  7551. return WOLFSSL_FATAL_ERROR;
  7552. }
  7553. tmpIdx = idx;
  7554. ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz);
  7555. if (ret < 0) {
  7556. WOLFSSL_MSG("\tfail: OBJECT ID");
  7557. FreeDecodedCert(&cert);
  7558. return WOLFSSL_FATAL_ERROR;
  7559. }
  7560. idx = tmpIdx;
  7561. if (extCount >= loc) {
  7562. /* extCount >= loc. Now check if extension has been set */
  7563. isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, oid);
  7564. if (isSet && ((word32)nid == oid)) {
  7565. found = 1;
  7566. break;
  7567. }
  7568. }
  7569. idx += length;
  7570. extCount++;
  7571. } /* while(idx < sz) */
  7572. FreeDecodedCert(&cert);
  7573. return found ? extCount : WOLFSSL_FATAL_ERROR;
  7574. }
  7575. #endif /* OPENSSL_ALL */
  7576. #endif /* !NO_CERTS */
  7577. #endif /* OPENSSL_EXTRA */
  7578. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  7579. WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void)
  7580. {
  7581. WOLFSSL_ASN1_BIT_STRING* str;
  7582. str = (WOLFSSL_ASN1_BIT_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_BIT_STRING),
  7583. NULL, DYNAMIC_TYPE_OPENSSL);
  7584. if (str) {
  7585. XMEMSET(str, 0, sizeof(WOLFSSL_ASN1_BIT_STRING));
  7586. }
  7587. return str;
  7588. }
  7589. void wolfSSL_ASN1_BIT_STRING_free(WOLFSSL_ASN1_BIT_STRING* str)
  7590. {
  7591. if (str) {
  7592. if (str->data) {
  7593. XFREE(str->data, NULL, DYNAMIC_TYPE_OPENSSL);
  7594. str->data = NULL;
  7595. }
  7596. XFREE(str, NULL, DYNAMIC_TYPE_OPENSSL);
  7597. }
  7598. }
  7599. int wolfSSL_ASN1_BIT_STRING_get_bit(const WOLFSSL_ASN1_BIT_STRING* str, int i)
  7600. {
  7601. if (!str || !str->data || str->length <= (i/8) || i < 0) {
  7602. return WOLFSSL_FAILURE;
  7603. }
  7604. return (str->data[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
  7605. }
  7606. /* Looks for the extension matching the passed in nid
  7607. *
  7608. * c : if not null then is set to status value -2 if multiple occurrences
  7609. * of the extension are found, -1 if not found, 0 if found and not
  7610. * critical, and 1 if found and critical.
  7611. * nid : Extension OID to be found.
  7612. * idx : if NULL return first extension found match, otherwise start search at
  7613. * idx location and set idx to the location of extension returned.
  7614. * returns NULL or a pointer to an WOLFSSL_ASN1_BIT_STRING (for KEY_USAGE_OID)
  7615. * or WOLFSSL_STACK (for other)
  7616. * holding extension structure
  7617. *
  7618. * NOTE code for decoding extensions is in asn.c DecodeCertExtensions --
  7619. * use already decoded extension in this function to avoid decoding twice.
  7620. * Currently we do not make use of idx since getting pre decoded extensions.
  7621. */
  7622. void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
  7623. int* idx)
  7624. {
  7625. void* ret = NULL;
  7626. WOLFSSL_STACK* sk = NULL;
  7627. WOLFSSL_ASN1_OBJECT* obj = NULL;
  7628. WOLFSSL_GENERAL_NAME* gn = NULL;
  7629. WOLFSSL_BASIC_CONSTRAINTS* bc = NULL;
  7630. WOLFSSL_ENTER("wolfSSL_X509_get_ext_d2i");
  7631. if (x509 == NULL) {
  7632. return NULL;
  7633. }
  7634. if (c != NULL) {
  7635. *c = -1; /* default to not found */
  7636. }
  7637. switch (nid) {
  7638. case BASIC_CA_OID:
  7639. if (x509->basicConstSet) {
  7640. WOLFSSL_ASN1_INTEGER* a;
  7641. bc = wolfSSL_BASIC_CONSTRAINTS_new();
  7642. if (!bc) {
  7643. WOLFSSL_MSG("wolfSSL_BASIC_CONSTRAINTS_new error");
  7644. return NULL;
  7645. }
  7646. a = wolfSSL_ASN1_INTEGER_new();
  7647. if (!a) {
  7648. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
  7649. wolfSSL_BASIC_CONSTRAINTS_free(bc);
  7650. return NULL;
  7651. }
  7652. a->length = x509->pathLength;
  7653. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  7654. defined(WOLFSSL_APACHE_HTTPD)
  7655. bc->ca = x509->isCa;
  7656. #endif
  7657. bc->pathlen = a;
  7658. if (c != NULL) {
  7659. *c = x509->basicConstCrit;
  7660. }
  7661. }
  7662. else {
  7663. WOLFSSL_MSG("No Basic Constraint set");
  7664. }
  7665. return bc;
  7666. case ALT_NAMES_OID:
  7667. {
  7668. DNS_entry* dns = NULL;
  7669. /* Malloc GENERAL_NAME stack */
  7670. sk = (WOLFSSL_GENERAL_NAMES*)XMALLOC(
  7671. sizeof(WOLFSSL_GENERAL_NAMES), NULL,
  7672. DYNAMIC_TYPE_ASN1);
  7673. if (sk == NULL) {
  7674. return NULL;
  7675. }
  7676. XMEMSET(sk, 0, sizeof(WOLFSSL_GENERAL_NAMES));
  7677. sk->type = STACK_TYPE_GEN_NAME;
  7678. if (x509->subjAltNameSet && x509->altNames != NULL) {
  7679. /* alt names are DNS_entry structs */
  7680. if (c != NULL) {
  7681. if (x509->altNames->next != NULL) {
  7682. *c = -2; /* more then one found */
  7683. }
  7684. else {
  7685. *c = x509->subjAltNameCrit;
  7686. }
  7687. }
  7688. dns = x509->altNames;
  7689. /* Currently only support GEN_DNS type */
  7690. while (dns != NULL) {
  7691. gn = wolfSSL_GENERAL_NAME_new();
  7692. if (gn == NULL) {
  7693. WOLFSSL_MSG("Error creating GENERAL_NAME");
  7694. wolfSSL_sk_free(sk);
  7695. return NULL;
  7696. }
  7697. gn->type = dns->type;
  7698. gn->d.ia5->length = dns->len;
  7699. if (wolfSSL_ASN1_STRING_set(gn->d.ia5, dns->name,
  7700. gn->d.ia5->length) != WOLFSSL_SUCCESS) {
  7701. WOLFSSL_MSG("ASN1_STRING_set failed");
  7702. wolfSSL_GENERAL_NAME_free(gn);
  7703. wolfSSL_sk_free(sk);
  7704. return NULL;
  7705. }
  7706. dns = dns->next;
  7707. /* last dns in list add at end of function */
  7708. if (dns != NULL) {
  7709. if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
  7710. WOLFSSL_SUCCESS) {
  7711. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  7712. wolfSSL_GENERAL_NAME_free(gn);
  7713. wolfSSL_sk_free(sk);
  7714. sk = NULL;
  7715. }
  7716. }
  7717. }
  7718. }
  7719. else {
  7720. WOLFSSL_MSG("No Alt Names set");
  7721. }
  7722. break;
  7723. }
  7724. case CRL_DIST_OID:
  7725. if (x509->CRLdistSet && x509->CRLInfo != NULL) {
  7726. if (c != NULL) {
  7727. *c = x509->CRLdistCrit;
  7728. }
  7729. obj = wolfSSL_ASN1_OBJECT_new();
  7730. if (obj == NULL) {
  7731. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7732. return NULL;
  7733. }
  7734. obj->type = CRL_DIST_OID;
  7735. obj->grp = oidCertExtType;
  7736. obj->obj = x509->CRLInfo;
  7737. obj->objSz = x509->CRLInfoSz;
  7738. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7739. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  7740. }
  7741. else {
  7742. WOLFSSL_MSG("No CRL dist set");
  7743. }
  7744. break;
  7745. case AUTH_INFO_OID:
  7746. if (x509->authInfoSet && x509->authInfo != NULL) {
  7747. if (c != NULL) {
  7748. *c = x509->authInfoCrit;
  7749. }
  7750. obj = wolfSSL_ASN1_OBJECT_new();
  7751. if (obj == NULL) {
  7752. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7753. return NULL;
  7754. }
  7755. obj->type = AUTH_INFO_OID;
  7756. obj->grp = oidCertExtType;
  7757. obj->obj = x509->authInfo;
  7758. obj->objSz = x509->authInfoSz;
  7759. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7760. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7761. }
  7762. else {
  7763. WOLFSSL_MSG("No Auth Info set");
  7764. }
  7765. break;
  7766. case AUTH_KEY_OID:
  7767. if (x509->authKeyIdSet) {
  7768. WOLFSSL_AUTHORITY_KEYID* akey = wolfSSL_AUTHORITY_KEYID_new();
  7769. if (!akey) {
  7770. WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
  7771. return NULL;
  7772. }
  7773. if (c != NULL) {
  7774. *c = x509->authKeyIdCrit;
  7775. }
  7776. obj = wolfSSL_ASN1_OBJECT_new();
  7777. if (obj == NULL) {
  7778. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7779. return NULL;
  7780. }
  7781. obj->type = AUTH_KEY_OID;
  7782. obj->grp = oidCertExtType;
  7783. obj->obj = x509->authKeyId;
  7784. obj->objSz = x509->authKeyIdSz;
  7785. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7786. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7787. akey->issuer = obj;
  7788. return akey;
  7789. }
  7790. else {
  7791. WOLFSSL_MSG("No Auth Key set");
  7792. }
  7793. break;
  7794. case SUBJ_KEY_OID:
  7795. if (x509->subjKeyIdSet) {
  7796. if (c != NULL) {
  7797. *c = x509->subjKeyIdCrit;
  7798. }
  7799. obj = wolfSSL_ASN1_OBJECT_new();
  7800. if (obj == NULL) {
  7801. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7802. return NULL;
  7803. }
  7804. obj->type = SUBJ_KEY_OID;
  7805. obj->grp = oidCertExtType;
  7806. obj->obj = x509->subjKeyId;
  7807. obj->objSz = x509->subjKeyIdSz;
  7808. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7809. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7810. }
  7811. else {
  7812. WOLFSSL_MSG("No Subject Key set");
  7813. }
  7814. break;
  7815. case CERT_POLICY_OID:
  7816. {
  7817. #ifdef WOLFSSL_CERT_EXT
  7818. int i;
  7819. if (x509->certPoliciesNb > 0) {
  7820. if (c != NULL) {
  7821. if (x509->certPoliciesNb > 1) {
  7822. *c = -2;
  7823. }
  7824. else {
  7825. *c = 0;
  7826. }
  7827. }
  7828. sk = wolfSSL_sk_new_asn1_obj();
  7829. if (sk == NULL) {
  7830. return NULL;
  7831. }
  7832. for (i = 0; i < x509->certPoliciesNb - 1; i++) {
  7833. obj = wolfSSL_ASN1_OBJECT_new();
  7834. if (obj == NULL) {
  7835. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7836. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7837. return NULL;
  7838. }
  7839. obj->type = CERT_POLICY_OID;
  7840. obj->grp = oidCertExtType;
  7841. obj->obj = (byte*)(x509->certPolicies[i]);
  7842. obj->objSz = MAX_CERTPOL_SZ;
  7843. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7844. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7845. if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj)
  7846. != WOLFSSL_SUCCESS) {
  7847. WOLFSSL_MSG("Error pushing ASN1 object onto stack");
  7848. wolfSSL_ASN1_OBJECT_free(obj);
  7849. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7850. sk = NULL;
  7851. }
  7852. }
  7853. obj = wolfSSL_ASN1_OBJECT_new();
  7854. if (obj == NULL) {
  7855. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7856. wolfSSL_sk_ASN1_OBJECT_free(sk);
  7857. return NULL;
  7858. }
  7859. obj->type = CERT_POLICY_OID;
  7860. obj->grp = oidCertExtType;
  7861. obj->obj = (byte*)(x509->certPolicies[i]);
  7862. obj->objSz = MAX_CERTPOL_SZ;
  7863. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7864. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7865. }
  7866. else {
  7867. WOLFSSL_MSG("No Cert Policy set");
  7868. }
  7869. #elif defined(WOLFSSL_SEP)
  7870. if (x509->certPolicySet) {
  7871. if (c != NULL) {
  7872. *c = x509->certPolicyCrit;
  7873. }
  7874. obj = wolfSSL_ASN1_OBJECT_new();
  7875. if (obj == NULL) {
  7876. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7877. return NULL;
  7878. }
  7879. obj->type = CERT_POLICY_OID;
  7880. obj->grp = oidCertExtType;
  7881. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7882. }
  7883. else {
  7884. WOLFSSL_MSG("No Cert Policy set");
  7885. }
  7886. #else
  7887. WOLFSSL_MSG("wolfSSL not built with WOLFSSL_SEP or WOLFSSL_CERT_EXT");
  7888. #endif
  7889. break;
  7890. }
  7891. case KEY_USAGE_OID:
  7892. {
  7893. WOLFSSL_ASN1_STRING* asn1str = NULL;
  7894. if (x509->keyUsageSet) {
  7895. if (c != NULL) {
  7896. *c = x509->keyUsageCrit;
  7897. }
  7898. asn1str = wolfSSL_ASN1_STRING_new();
  7899. if (asn1str == NULL) {
  7900. WOLFSSL_MSG("Failed to malloc ASN1_STRING");
  7901. return NULL;
  7902. }
  7903. if (wolfSSL_ASN1_STRING_set(asn1str, &x509->keyUsage,
  7904. sizeof(word16)) != WOLFSSL_SUCCESS) {
  7905. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  7906. wolfSSL_ASN1_STRING_free(asn1str);
  7907. return NULL;
  7908. }
  7909. asn1str->type = KEY_USAGE_OID;
  7910. }
  7911. else {
  7912. WOLFSSL_MSG("No Key Usage set");
  7913. }
  7914. /* don't add stack of and return bit string directly */
  7915. return asn1str;
  7916. }
  7917. case INHIBIT_ANY_OID:
  7918. WOLFSSL_MSG("INHIBIT ANY extension not supported");
  7919. break;
  7920. case EXT_KEY_USAGE_OID:
  7921. if (x509->extKeyUsageSrc != NULL) {
  7922. if (c != NULL) {
  7923. if (x509->extKeyUsageCount > 1) {
  7924. *c = -2;
  7925. }
  7926. else {
  7927. *c = x509->extKeyUsageCrit;
  7928. }
  7929. }
  7930. obj = wolfSSL_ASN1_OBJECT_new();
  7931. if (obj == NULL) {
  7932. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  7933. return NULL;
  7934. }
  7935. obj->type = EXT_KEY_USAGE_OID;
  7936. obj->grp = oidCertExtType;
  7937. obj->obj = x509->extKeyUsageSrc;
  7938. obj->objSz = x509->extKeyUsageSz;
  7939. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  7940. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
  7941. }
  7942. else {
  7943. WOLFSSL_MSG("No Extended Key Usage set");
  7944. }
  7945. break;
  7946. case NAME_CONS_OID:
  7947. WOLFSSL_MSG("Name Constraint OID extension not supported");
  7948. break;
  7949. case PRIV_KEY_USAGE_PERIOD_OID:
  7950. WOLFSSL_MSG("Private Key Usage Period extension not supported");
  7951. break;
  7952. case SUBJECT_INFO_ACCESS:
  7953. WOLFSSL_MSG("Subject Info Access extension not supported");
  7954. break;
  7955. case POLICY_MAP_OID:
  7956. WOLFSSL_MSG("Policy Map extension not supported");
  7957. break;
  7958. case POLICY_CONST_OID:
  7959. WOLFSSL_MSG("Policy Constraint extension not supported");
  7960. break;
  7961. case ISSUE_ALT_NAMES_OID:
  7962. WOLFSSL_MSG("Issue Alt Names extension not supported");
  7963. break;
  7964. case TLS_FEATURE_OID:
  7965. WOLFSSL_MSG("TLS Feature extension not supported");
  7966. break;
  7967. default:
  7968. WOLFSSL_MSG("Unsupported/Unknown extension OID");
  7969. }
  7970. /* make sure stack of is allocated */
  7971. if ((obj || gn) && sk == NULL) {
  7972. sk = wolfSSL_sk_new_asn1_obj();
  7973. if (sk == NULL) {
  7974. goto err;
  7975. }
  7976. }
  7977. if (obj && wolfSSL_sk_ASN1_OBJECT_push(sk, obj) == WOLFSSL_SUCCESS) {
  7978. /* obj pushed successfully on stack */
  7979. }
  7980. else if (gn && wolfSSL_sk_GENERAL_NAME_push(sk, gn) == WOLFSSL_SUCCESS) {
  7981. /* gn pushed successfully on stack */
  7982. }
  7983. else {
  7984. /* Nothing to push or push failed */
  7985. WOLFSSL_MSG("Error pushing ASN1_OBJECT or GENERAL_NAME object onto stack "
  7986. "or nothing to push.");
  7987. goto err;
  7988. }
  7989. ret = sk;
  7990. (void)idx;
  7991. return ret;
  7992. err:
  7993. if (obj) {
  7994. wolfSSL_ASN1_OBJECT_free(obj);
  7995. }
  7996. if (gn) {
  7997. wolfSSL_GENERAL_NAME_free(gn);
  7998. }
  7999. if (sk) {
  8000. wolfSSL_sk_ASN1_OBJECT_free(sk);
  8001. }
  8002. return NULL;
  8003. }
  8004. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  8005. #ifdef OPENSSL_EXTRA
  8006. #ifndef NO_CERTS
  8007. int wolfSSL_X509_add_altname_ex(WOLFSSL_X509* x509, const char* name,
  8008. word32 nameSz, int type)
  8009. {
  8010. DNS_entry* newAltName = NULL;
  8011. char* nameCopy = NULL;
  8012. if (x509 == NULL)
  8013. return WOLFSSL_FAILURE;
  8014. if ((name == NULL) || (nameSz == 0))
  8015. return WOLFSSL_SUCCESS;
  8016. newAltName = (DNS_entry*)XMALLOC(sizeof(DNS_entry),
  8017. x509->heap, DYNAMIC_TYPE_ALTNAME);
  8018. if (newAltName == NULL)
  8019. return WOLFSSL_FAILURE;
  8020. nameCopy = (char*)XMALLOC(nameSz + 1, x509->heap, DYNAMIC_TYPE_ALTNAME);
  8021. if (nameCopy == NULL) {
  8022. XFREE(newAltName, x509->heap, DYNAMIC_TYPE_ALTNAME);
  8023. return WOLFSSL_FAILURE;
  8024. }
  8025. XMEMCPY(nameCopy, name, nameSz);
  8026. nameCopy[nameSz] = '\0';
  8027. newAltName->next = x509->altNames;
  8028. newAltName->type = type;
  8029. newAltName->len = nameSz;
  8030. newAltName->name = nameCopy;
  8031. x509->altNames = newAltName;
  8032. return WOLFSSL_SUCCESS;
  8033. }
  8034. int wolfSSL_X509_add_altname(WOLFSSL_X509* x509, const char* name, int type)
  8035. {
  8036. word32 nameSz;
  8037. if (name == NULL)
  8038. return WOLFSSL_SUCCESS;
  8039. nameSz = (word32)XSTRLEN(name);
  8040. if (nameSz == 0)
  8041. return WOLFSSL_SUCCESS;
  8042. if (type == ASN_IP_TYPE) {
  8043. WOLFSSL_MSG("Type not supported, use wolfSSL_X509_add_altname_ex");
  8044. return WOLFSSL_FAILURE;
  8045. }
  8046. return wolfSSL_X509_add_altname_ex(x509, name, nameSz, type);
  8047. }
  8048. #ifndef NO_WOLFSSL_STUB
  8049. int wolfSSL_X509_add_ext(WOLFSSL_X509 *x509, WOLFSSL_X509_EXTENSION *ext, int loc)
  8050. {
  8051. WOLFSSL_STUB("wolfSSL_X509_add_ext");
  8052. (void)x509;
  8053. (void)ext;
  8054. (void)loc;
  8055. return WOLFSSL_FAILURE;
  8056. }
  8057. /* currently LHASH is not implemented (and not needed for Apache port) */
  8058. WOLFSSL_X509_EXTENSION* wolfSSL_X509V3_EXT_conf_nid(
  8059. WOLF_LHASH_OF(CONF_VALUE)* conf, WOLFSSL_X509V3_CTX* ctx, int nid,
  8060. char* value)
  8061. {
  8062. WOLFSSL_STUB("wolfSSL_X509V3_EXT_conf_nid");
  8063. if (conf != NULL) {
  8064. WOLFSSL_MSG("Handling LHASH not implemented yet");
  8065. return NULL;
  8066. }
  8067. (void)conf;
  8068. (void)ctx;
  8069. (void)nid;
  8070. (void)value;
  8071. return NULL;
  8072. }
  8073. void wolfSSL_X509V3_set_ctx_nodb(WOLFSSL_X509V3_CTX* ctx)
  8074. {
  8075. WOLFSSL_STUB("wolfSSL_X509V3_set_ctx_nodb");
  8076. (void)ctx;
  8077. }
  8078. #endif /* !NO_WOLFSSL_STUB */
  8079. #if defined(OPENSSL_ALL)
  8080. static void wolfSSL_X509V3_EXT_METHOD_populate(WOLFSSL_v3_ext_method *method,
  8081. int nid)
  8082. {
  8083. if (!method)
  8084. return;
  8085. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_METHOD_populate");
  8086. switch (nid) {
  8087. case NID_subject_key_identifier:
  8088. method->i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
  8089. FALL_THROUGH;
  8090. case NID_authority_key_identifier:
  8091. case NID_key_usage:
  8092. case NID_certificate_policies:
  8093. case NID_policy_mappings:
  8094. case NID_subject_alt_name:
  8095. case NID_issuer_alt_name:
  8096. case NID_basic_constraints:
  8097. case NID_name_constraints:
  8098. case NID_policy_constraints:
  8099. case NID_ext_key_usage:
  8100. case NID_crl_distribution_points:
  8101. case NID_inhibit_any_policy:
  8102. case NID_info_access:
  8103. WOLFSSL_MSG("Nothing to populate for current NID");
  8104. break;
  8105. default:
  8106. WOLFSSL_MSG("Unknown or unsupported NID");
  8107. break;
  8108. }
  8109. return;
  8110. }
  8111. /**
  8112. * @param nid One of the NID_* constants defined in asn.h
  8113. * @param crit
  8114. * @param data This data is copied to the returned extension.
  8115. * @return
  8116. */
  8117. WOLFSSL_X509_EXTENSION *wolfSSL_X509V3_EXT_i2d(int nid, int crit,
  8118. void *data)
  8119. {
  8120. WOLFSSL_X509_EXTENSION *ext = NULL;
  8121. WOLFSSL_ASN1_STRING* asn1str = NULL;
  8122. WOLFSSL_ENTER("wolfSSL_X509V3_EXT_i2d");
  8123. if (!data) {
  8124. return NULL;
  8125. }
  8126. if (!(ext = wolfSSL_X509_EXTENSION_new())) {
  8127. return NULL;
  8128. }
  8129. wolfSSL_X509V3_EXT_METHOD_populate(&ext->ext_method, nid);
  8130. switch (nid) {
  8131. case NID_subject_key_identifier:
  8132. /* WOLFSSL_ASN1_STRING */
  8133. case NID_key_usage:
  8134. /* WOLFSSL_ASN1_STRING */
  8135. {
  8136. asn1str = (WOLFSSL_ASN1_STRING*)data;
  8137. ext->value = *asn1str;
  8138. if (asn1str->isDynamic) {
  8139. ext->value.data = (char*)XMALLOC(asn1str->length, NULL,
  8140. DYNAMIC_TYPE_OPENSSL);
  8141. if (!ext->value.data) {
  8142. WOLFSSL_MSG("malloc failed");
  8143. /* Zero so that no existing memory is freed */
  8144. XMEMSET(&ext->value, 0, sizeof(WOLFSSL_ASN1_STRING));
  8145. goto err_cleanup;
  8146. }
  8147. XMEMCPY(ext->value.data, asn1str->data, asn1str->length);
  8148. }
  8149. else {
  8150. ext->value.data = ext->value.strData;
  8151. }
  8152. break;
  8153. }
  8154. case NID_subject_alt_name:
  8155. /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
  8156. case NID_issuer_alt_name:
  8157. /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
  8158. case NID_ext_key_usage:
  8159. /* typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE */
  8160. case NID_info_access:
  8161. /* typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS */
  8162. {
  8163. WOLFSSL_STACK* sk = (WOLFSSL_STACK*)data;
  8164. if (ext->ext_sk) {
  8165. wolfSSL_sk_free(ext->ext_sk);
  8166. }
  8167. if (!(ext->ext_sk = wolfSSL_sk_dup(sk))) {
  8168. WOLFSSL_MSG("wolfSSL_sk_dup failed");
  8169. goto err_cleanup;
  8170. }
  8171. break;
  8172. }
  8173. case NID_basic_constraints:
  8174. {
  8175. /* WOLFSSL_BASIC_CONSTRAINTS */
  8176. WOLFSSL_BASIC_CONSTRAINTS* bc = (WOLFSSL_BASIC_CONSTRAINTS*)data;
  8177. if (!(ext->obj = wolfSSL_ASN1_OBJECT_new())) {
  8178. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
  8179. goto err_cleanup;
  8180. }
  8181. ext->obj->ca = bc->ca;
  8182. if (bc->pathlen) {
  8183. ext->obj->pathlen = wolfSSL_ASN1_INTEGER_dup(bc->pathlen);
  8184. if (!ext->obj->pathlen) {
  8185. WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_dup failed");
  8186. goto err_cleanup;
  8187. }
  8188. }
  8189. break;
  8190. }
  8191. case NID_authority_key_identifier:
  8192. {
  8193. /* AUTHORITY_KEYID */
  8194. WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)data;
  8195. if (akey->keyid) {
  8196. if (wolfSSL_ASN1_STRING_set(&ext->value, akey->keyid->data,
  8197. akey->keyid->length) != WOLFSSL_SUCCESS) {
  8198. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set failed");
  8199. goto err_cleanup;
  8200. }
  8201. ext->value.type = akey->keyid->type;
  8202. }
  8203. else if (akey->issuer) {
  8204. ext->obj = wolfSSL_ASN1_OBJECT_dup(akey->issuer);
  8205. if (!ext->obj) {
  8206. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup failed");
  8207. goto err_cleanup;
  8208. }
  8209. }
  8210. else {
  8211. WOLFSSL_MSG("NID_authority_key_identifier empty data");
  8212. goto err_cleanup;
  8213. }
  8214. break;
  8215. }
  8216. case NID_inhibit_any_policy:
  8217. /* ASN1_INTEGER */
  8218. case NID_certificate_policies:
  8219. /* STACK_OF(POLICYINFO) */
  8220. case NID_policy_mappings:
  8221. /* STACK_OF(POLICY_MAPPING) */
  8222. case NID_name_constraints:
  8223. /* NAME_CONSTRAINTS */
  8224. case NID_policy_constraints:
  8225. /* POLICY_CONSTRAINTS */
  8226. case NID_crl_distribution_points:
  8227. /* typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS */
  8228. default:
  8229. WOLFSSL_MSG("Unknown or unsupported NID");
  8230. break;
  8231. }
  8232. ext->crit = crit;
  8233. return ext;
  8234. err_cleanup:
  8235. if (ext) {
  8236. wolfSSL_X509_EXTENSION_free(ext);
  8237. }
  8238. if (asn1str) {
  8239. wolfSSL_ASN1_STRING_free(asn1str);
  8240. }
  8241. return NULL;
  8242. }
  8243. /* Returns pointer to ASN1_OBJECT from an X509_EXTENSION object */
  8244. WOLFSSL_ASN1_OBJECT* wolfSSL_X509_EXTENSION_get_object \
  8245. (WOLFSSL_X509_EXTENSION* ext)
  8246. {
  8247. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_object");
  8248. if(ext == NULL)
  8249. return NULL;
  8250. return ext->obj;
  8251. }
  8252. #endif /* OPENSSL_ALL */
  8253. /* Returns pointer to ASN1_STRING in X509_EXTENSION object */
  8254. WOLFSSL_ASN1_STRING* wolfSSL_X509_EXTENSION_get_data(WOLFSSL_X509_EXTENSION* ext)
  8255. {
  8256. WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_get_data");
  8257. if (ext == NULL)
  8258. return NULL;
  8259. return &ext->value;
  8260. }
  8261. #if !defined(NO_PWDBASED)
  8262. int wolfSSL_X509_digest(const WOLFSSL_X509* x509, const WOLFSSL_EVP_MD* digest,
  8263. unsigned char* buf, unsigned int* len)
  8264. {
  8265. int ret;
  8266. WOLFSSL_ENTER("wolfSSL_X509_digest");
  8267. if (x509 == NULL || digest == NULL) {
  8268. WOLFSSL_MSG("Null argument found");
  8269. return WOLFSSL_FAILURE;
  8270. }
  8271. if (x509->derCert == NULL) {
  8272. WOLFSSL_MSG("No DER certificate stored in X509");
  8273. return WOLFSSL_FAILURE;
  8274. }
  8275. ret = wolfSSL_EVP_Digest(x509->derCert->buffer, x509->derCert->length, buf,
  8276. len, digest, NULL);
  8277. WOLFSSL_LEAVE("wolfSSL_X509_digest", ret);
  8278. return ret;
  8279. }
  8280. #endif
  8281. int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey)
  8282. {
  8283. WOLFSSL_ENTER("wolfSSL_use_PrivateKey");
  8284. if (ssl == NULL || pkey == NULL ) {
  8285. return WOLFSSL_FAILURE;
  8286. }
  8287. return wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr,
  8288. pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1);
  8289. }
  8290. int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der,
  8291. long derSz)
  8292. {
  8293. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1");
  8294. if (ssl == NULL || der == NULL ) {
  8295. return WOLFSSL_FAILURE;
  8296. }
  8297. (void)pri; /* type of private key */
  8298. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8299. }
  8300. /******************************************************************************
  8301. * wolfSSL_CTX_use_PrivateKey_ASN1 - loads a private key buffer into the SSL ctx
  8302. *
  8303. * RETURNS:
  8304. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  8305. */
  8306. int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx,
  8307. unsigned char* der, long derSz)
  8308. {
  8309. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1");
  8310. if (ctx == NULL || der == NULL ) {
  8311. return WOLFSSL_FAILURE;
  8312. }
  8313. (void)pri; /* type of private key */
  8314. return wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8315. }
  8316. #ifndef NO_RSA
  8317. int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz)
  8318. {
  8319. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1");
  8320. if (ssl == NULL || der == NULL ) {
  8321. return WOLFSSL_FAILURE;
  8322. }
  8323. return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1);
  8324. }
  8325. #endif
  8326. int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509)
  8327. {
  8328. long idx;
  8329. WOLFSSL_ENTER("wolfSSL_use_certificate");
  8330. if (x509 != NULL && ssl != NULL && x509->derCert != NULL) {
  8331. if (ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length,
  8332. WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0,
  8333. GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8334. return WOLFSSL_SUCCESS;
  8335. }
  8336. }
  8337. (void)idx;
  8338. return WOLFSSL_FAILURE;
  8339. }
  8340. #endif /* NO_CERTS */
  8341. #endif /* OPENSSL_EXTRA */
  8342. #ifndef NO_CERTS
  8343. int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der,
  8344. int derSz)
  8345. {
  8346. long idx;
  8347. WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1");
  8348. if (der != NULL && ssl != NULL) {
  8349. if (ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  8350. ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8351. return WOLFSSL_SUCCESS;
  8352. }
  8353. }
  8354. (void)idx;
  8355. return WOLFSSL_FAILURE;
  8356. }
  8357. #ifndef NO_FILESYSTEM
  8358. WOLFSSL_ABI
  8359. int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format)
  8360. {
  8361. WOLFSSL_ENTER("wolfSSL_use_certificate_file");
  8362. if (ssl == NULL) {
  8363. return BAD_FUNC_ARG;
  8364. }
  8365. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE,
  8366. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8367. return WOLFSSL_SUCCESS;
  8368. }
  8369. return WOLFSSL_FAILURE;
  8370. }
  8371. WOLFSSL_ABI
  8372. int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8373. {
  8374. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file");
  8375. if (ssl == NULL) {
  8376. return BAD_FUNC_ARG;
  8377. }
  8378. if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE,
  8379. ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8380. return WOLFSSL_SUCCESS;
  8381. }
  8382. return WOLFSSL_FAILURE;
  8383. }
  8384. WOLFSSL_ABI
  8385. int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file)
  8386. {
  8387. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8388. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file");
  8389. if (ssl == NULL) {
  8390. return BAD_FUNC_ARG;
  8391. }
  8392. if (ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE,
  8393. ssl, 1, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8394. return WOLFSSL_SUCCESS;
  8395. }
  8396. return WOLFSSL_FAILURE;
  8397. }
  8398. int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file,
  8399. int format)
  8400. {
  8401. /* process up to MAX_CHAIN_DEPTH plus subject cert */
  8402. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format");
  8403. if (ssl == NULL) {
  8404. return BAD_FUNC_ARG;
  8405. }
  8406. if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1,
  8407. NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) {
  8408. return WOLFSSL_SUCCESS;
  8409. }
  8410. return WOLFSSL_FAILURE;
  8411. }
  8412. #endif /* !NO_FILESYSTEM */
  8413. #endif /* !NO_CERTS */
  8414. #ifdef HAVE_ECC
  8415. /* Set Temp CTX EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */
  8416. int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz)
  8417. {
  8418. if (ctx == NULL)
  8419. return BAD_FUNC_ARG;
  8420. if (sz == 0) {
  8421. /* applies only to ECDSA */
  8422. if (ctx->privateKeyType != ecc_dsa_sa_algo)
  8423. return WOLFSSL_SUCCESS;
  8424. if (ctx->privateKeySz == 0) {
  8425. WOLFSSL_MSG("Must set private key/cert first");
  8426. return BAD_FUNC_ARG;
  8427. }
  8428. sz = (word16)ctx->privateKeySz;
  8429. }
  8430. /* check size */
  8431. if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8432. return BAD_FUNC_ARG;
  8433. ctx->eccTempKeySz = sz;
  8434. return WOLFSSL_SUCCESS;
  8435. }
  8436. /* Set Temp SSL EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */
  8437. int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz)
  8438. {
  8439. if (ssl == NULL || sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
  8440. return BAD_FUNC_ARG;
  8441. ssl->eccTempKeySz = sz;
  8442. return WOLFSSL_SUCCESS;
  8443. }
  8444. #endif /* HAVE_ECC */
  8445. #ifdef OPENSSL_EXTRA
  8446. #ifndef NO_FILESYSTEM
  8447. int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file,
  8448. int format)
  8449. {
  8450. WOLFSSL_ENTER("SSL_CTX_use_RSAPrivateKey_file");
  8451. return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format);
  8452. }
  8453. int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format)
  8454. {
  8455. WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file");
  8456. return wolfSSL_use_PrivateKey_file(ssl, file, format);
  8457. }
  8458. #endif /* NO_FILESYSTEM */
  8459. /* Copies the master secret over to out buffer. If outSz is 0 returns the size
  8460. * of master secret.
  8461. *
  8462. * ses : a session from completed TLS/SSL handshake
  8463. * out : buffer to hold copy of master secret
  8464. * outSz : size of out buffer
  8465. * returns : number of bytes copied into out buffer on success
  8466. * less then or equal to 0 is considered a failure case
  8467. */
  8468. int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses,
  8469. unsigned char* out, int outSz)
  8470. {
  8471. int size;
  8472. if (outSz == 0) {
  8473. return SECRET_LEN;
  8474. }
  8475. if (ses == NULL || out == NULL || outSz < 0) {
  8476. return 0;
  8477. }
  8478. if (outSz > SECRET_LEN) {
  8479. size = SECRET_LEN;
  8480. }
  8481. else {
  8482. size = outSz;
  8483. }
  8484. XMEMCPY(out, ses->masterSecret, size);
  8485. return size;
  8486. }
  8487. int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses)
  8488. {
  8489. (void)ses;
  8490. return SECRET_LEN;
  8491. }
  8492. #endif /* OPENSSL_EXTRA */
  8493. #ifndef NO_FILESYSTEM
  8494. #ifdef HAVE_NTRU
  8495. int wolfSSL_CTX_use_NTRUPrivateKey_file(WOLFSSL_CTX* ctx, const char* file)
  8496. {
  8497. WOLFSSL_ENTER("wolfSSL_CTX_use_NTRUPrivateKey_file");
  8498. if (ctx == NULL)
  8499. return WOLFSSL_FAILURE;
  8500. if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_RAW, PRIVATEKEY_TYPE, NULL, 0,
  8501. NULL, GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
  8502. ctx->haveNTRU = 1;
  8503. return WOLFSSL_SUCCESS;
  8504. }
  8505. return WOLFSSL_FAILURE;
  8506. }
  8507. #endif /* HAVE_NTRU */
  8508. #endif /* NO_FILESYSTEM */
  8509. void wolfSSL_CTX_set_verify(WOLFSSL_CTX* ctx, int mode, VerifyCallback vc)
  8510. {
  8511. WOLFSSL_ENTER("wolfSSL_CTX_set_verify");
  8512. if (ctx == NULL)
  8513. return;
  8514. if (mode & WOLFSSL_VERIFY_PEER) {
  8515. ctx->verifyPeer = 1;
  8516. ctx->verifyNone = 0; /* in case previously set */
  8517. }
  8518. if (mode == WOLFSSL_VERIFY_NONE) {
  8519. ctx->verifyNone = 1;
  8520. ctx->verifyPeer = 0; /* in case previously set */
  8521. }
  8522. if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
  8523. ctx->failNoCert = 1;
  8524. }
  8525. if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
  8526. ctx->failNoCert = 0; /* fail on all is set to fail on PSK */
  8527. ctx->failNoCertxPSK = 1;
  8528. }
  8529. ctx->verifyCallback = vc;
  8530. }
  8531. #ifdef OPENSSL_ALL
  8532. void wolfSSL_CTX_set_cert_verify_callback(WOLFSSL_CTX* ctx,
  8533. CertVerifyCallback cb, void* arg)
  8534. {
  8535. WOLFSSL_ENTER("SSL_CTX_set_cert_verify_callback");
  8536. if (ctx == NULL)
  8537. return;
  8538. ctx->verifyCertCb = cb;
  8539. ctx->verifyCertCbArg = arg;
  8540. }
  8541. #endif
  8542. void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback vc)
  8543. {
  8544. WOLFSSL_ENTER("wolfSSL_set_verify");
  8545. if (ssl == NULL)
  8546. return;
  8547. if (mode & WOLFSSL_VERIFY_PEER) {
  8548. ssl->options.verifyPeer = 1;
  8549. ssl->options.verifyNone = 0; /* in case previously set */
  8550. }
  8551. if (mode == WOLFSSL_VERIFY_NONE) {
  8552. ssl->options.verifyNone = 1;
  8553. ssl->options.verifyPeer = 0; /* in case previously set */
  8554. }
  8555. if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT)
  8556. ssl->options.failNoCert = 1;
  8557. if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
  8558. ssl->options.failNoCert = 0; /* fail on all is set to fail on PSK */
  8559. ssl->options.failNoCertxPSK = 1;
  8560. }
  8561. ssl->verifyCallback = vc;
  8562. }
  8563. void wolfSSL_set_verify_result(WOLFSSL *ssl, long v)
  8564. {
  8565. WOLFSSL_ENTER("wolfSSL_set_verify_result");
  8566. if (ssl == NULL)
  8567. return;
  8568. #ifdef OPENSSL_ALL
  8569. ssl->verifyCallbackResult = v;
  8570. #else
  8571. (void)v;
  8572. WOLFSSL_STUB("wolfSSL_set_verify_result");
  8573. #endif
  8574. }
  8575. /* store user ctx for verify callback */
  8576. void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx)
  8577. {
  8578. WOLFSSL_ENTER("wolfSSL_SetCertCbCtx");
  8579. if (ssl)
  8580. ssl->verifyCbCtx = ctx;
  8581. }
  8582. /* store context CA Cache addition callback */
  8583. void wolfSSL_CTX_SetCACb(WOLFSSL_CTX* ctx, CallbackCACache cb)
  8584. {
  8585. if (ctx && ctx->cm)
  8586. ctx->cm->caCacheCallback = cb;
  8587. }
  8588. #if defined(PERSIST_CERT_CACHE)
  8589. #if !defined(NO_FILESYSTEM)
  8590. /* Persist cert cache to file */
  8591. int wolfSSL_CTX_save_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  8592. {
  8593. WOLFSSL_ENTER("wolfSSL_CTX_save_cert_cache");
  8594. if (ctx == NULL || fname == NULL)
  8595. return BAD_FUNC_ARG;
  8596. return CM_SaveCertCache(ctx->cm, fname);
  8597. }
  8598. /* Persist cert cache from file */
  8599. int wolfSSL_CTX_restore_cert_cache(WOLFSSL_CTX* ctx, const char* fname)
  8600. {
  8601. WOLFSSL_ENTER("wolfSSL_CTX_restore_cert_cache");
  8602. if (ctx == NULL || fname == NULL)
  8603. return BAD_FUNC_ARG;
  8604. return CM_RestoreCertCache(ctx->cm, fname);
  8605. }
  8606. #endif /* NO_FILESYSTEM */
  8607. /* Persist cert cache to memory */
  8608. int wolfSSL_CTX_memsave_cert_cache(WOLFSSL_CTX* ctx, void* mem,
  8609. int sz, int* used)
  8610. {
  8611. WOLFSSL_ENTER("wolfSSL_CTX_memsave_cert_cache");
  8612. if (ctx == NULL || mem == NULL || used == NULL || sz <= 0)
  8613. return BAD_FUNC_ARG;
  8614. return CM_MemSaveCertCache(ctx->cm, mem, sz, used);
  8615. }
  8616. /* Restore cert cache from memory */
  8617. int wolfSSL_CTX_memrestore_cert_cache(WOLFSSL_CTX* ctx, const void* mem, int sz)
  8618. {
  8619. WOLFSSL_ENTER("wolfSSL_CTX_memrestore_cert_cache");
  8620. if (ctx == NULL || mem == NULL || sz <= 0)
  8621. return BAD_FUNC_ARG;
  8622. return CM_MemRestoreCertCache(ctx->cm, mem, sz);
  8623. }
  8624. /* get how big the the cert cache save buffer needs to be */
  8625. int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx)
  8626. {
  8627. WOLFSSL_ENTER("wolfSSL_CTX_get_cert_cache_memsize");
  8628. if (ctx == NULL)
  8629. return BAD_FUNC_ARG;
  8630. return CM_GetCertCacheMemSize(ctx->cm);
  8631. }
  8632. #endif /* PERSIST_CERT_CACHE */
  8633. #endif /* !NO_CERTS */
  8634. #ifndef NO_SESSION_CACHE
  8635. WOLFSSL_ABI
  8636. WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl)
  8637. {
  8638. WOLFSSL_ENTER("SSL_get_session");
  8639. if (ssl)
  8640. return GetSession(ssl, 0, 1);
  8641. return NULL;
  8642. }
  8643. WOLFSSL_ABI
  8644. int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  8645. {
  8646. WOLFSSL_ENTER("SSL_set_session");
  8647. if (session)
  8648. return SetSession(ssl, session);
  8649. return WOLFSSL_FAILURE;
  8650. }
  8651. #ifndef NO_CLIENT_CACHE
  8652. /* Associate client session with serverID, find existing or store for saving
  8653. if newSession flag on, don't reuse existing session
  8654. WOLFSSL_SUCCESS on ok */
  8655. int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession)
  8656. {
  8657. WOLFSSL_SESSION* session = NULL;
  8658. WOLFSSL_ENTER("wolfSSL_SetServerID");
  8659. if (ssl == NULL || id == NULL || len <= 0)
  8660. return BAD_FUNC_ARG;
  8661. if (newSession == 0) {
  8662. session = GetSessionClient(ssl, id, len);
  8663. if (session) {
  8664. if (SetSession(ssl, session) != WOLFSSL_SUCCESS) {
  8665. #ifdef HAVE_EXT_CACHE
  8666. wolfSSL_SESSION_free(session);
  8667. #endif
  8668. WOLFSSL_MSG("SetSession failed");
  8669. session = NULL;
  8670. }
  8671. }
  8672. }
  8673. if (session == NULL) {
  8674. WOLFSSL_MSG("Valid ServerID not cached already");
  8675. ssl->session.idLen = (word16)min(SERVER_ID_LEN, (word32)len);
  8676. XMEMCPY(ssl->session.serverID, id, ssl->session.idLen);
  8677. }
  8678. #ifdef HAVE_EXT_CACHE
  8679. else
  8680. wolfSSL_SESSION_free(session);
  8681. #endif
  8682. return WOLFSSL_SUCCESS;
  8683. }
  8684. #endif /* NO_CLIENT_CACHE */
  8685. #if defined(PERSIST_SESSION_CACHE)
  8686. /* for persistence, if changes to layout need to increment and modify
  8687. save_session_cache() and restore_session_cache and memory versions too */
  8688. #define WOLFSSL_CACHE_VERSION 2
  8689. /* Session Cache Header information */
  8690. typedef struct {
  8691. int version; /* cache layout version id */
  8692. int rows; /* session rows */
  8693. int columns; /* session columns */
  8694. int sessionSz; /* sizeof WOLFSSL_SESSION */
  8695. } cache_header_t;
  8696. /* current persistence layout is:
  8697. 1) cache_header_t
  8698. 2) SessionCache
  8699. 3) ClientCache
  8700. update WOLFSSL_CACHE_VERSION if change layout for the following
  8701. PERSISTENT_SESSION_CACHE functions
  8702. */
  8703. /* get how big the the session cache save buffer needs to be */
  8704. int wolfSSL_get_session_cache_memsize(void)
  8705. {
  8706. int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t));
  8707. #ifndef NO_CLIENT_CACHE
  8708. sz += (int)(sizeof(ClientCache));
  8709. #endif
  8710. return sz;
  8711. }
  8712. /* Persist session cache to memory */
  8713. int wolfSSL_memsave_session_cache(void* mem, int sz)
  8714. {
  8715. int i;
  8716. cache_header_t cache_header;
  8717. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  8718. #ifndef NO_CLIENT_CACHE
  8719. ClientRow* clRow;
  8720. #endif
  8721. WOLFSSL_ENTER("wolfSSL_memsave_session_cache");
  8722. if (sz < wolfSSL_get_session_cache_memsize()) {
  8723. WOLFSSL_MSG("Memory buffer too small");
  8724. return BUFFER_E;
  8725. }
  8726. cache_header.version = WOLFSSL_CACHE_VERSION;
  8727. cache_header.rows = SESSION_ROWS;
  8728. cache_header.columns = SESSIONS_PER_ROW;
  8729. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  8730. XMEMCPY(mem, &cache_header, sizeof(cache_header));
  8731. if (wc_LockMutex(&session_mutex) != 0) {
  8732. WOLFSSL_MSG("Session cache mutex lock failed");
  8733. return BAD_MUTEX_E;
  8734. }
  8735. for (i = 0; i < cache_header.rows; ++i)
  8736. XMEMCPY(row++, SessionCache + i, sizeof(SessionRow));
  8737. #ifndef NO_CLIENT_CACHE
  8738. clRow = (ClientRow*)row;
  8739. for (i = 0; i < cache_header.rows; ++i)
  8740. XMEMCPY(clRow++, ClientCache + i, sizeof(ClientRow));
  8741. #endif
  8742. wc_UnLockMutex(&session_mutex);
  8743. WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS);
  8744. return WOLFSSL_SUCCESS;
  8745. }
  8746. /* Restore the persistent session cache from memory */
  8747. int wolfSSL_memrestore_session_cache(const void* mem, int sz)
  8748. {
  8749. int i;
  8750. cache_header_t cache_header;
  8751. SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header));
  8752. #ifndef NO_CLIENT_CACHE
  8753. ClientRow* clRow;
  8754. #endif
  8755. WOLFSSL_ENTER("wolfSSL_memrestore_session_cache");
  8756. if (sz < wolfSSL_get_session_cache_memsize()) {
  8757. WOLFSSL_MSG("Memory buffer too small");
  8758. return BUFFER_E;
  8759. }
  8760. XMEMCPY(&cache_header, mem, sizeof(cache_header));
  8761. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  8762. cache_header.rows != SESSION_ROWS ||
  8763. cache_header.columns != SESSIONS_PER_ROW ||
  8764. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  8765. WOLFSSL_MSG("Session cache header match failed");
  8766. return CACHE_MATCH_ERROR;
  8767. }
  8768. if (wc_LockMutex(&session_mutex) != 0) {
  8769. WOLFSSL_MSG("Session cache mutex lock failed");
  8770. return BAD_MUTEX_E;
  8771. }
  8772. for (i = 0; i < cache_header.rows; ++i)
  8773. XMEMCPY(SessionCache + i, row++, sizeof(SessionRow));
  8774. #ifndef NO_CLIENT_CACHE
  8775. clRow = (ClientRow*)row;
  8776. for (i = 0; i < cache_header.rows; ++i)
  8777. XMEMCPY(ClientCache + i, clRow++, sizeof(ClientRow));
  8778. #endif
  8779. wc_UnLockMutex(&session_mutex);
  8780. WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS);
  8781. return WOLFSSL_SUCCESS;
  8782. }
  8783. #if !defined(NO_FILESYSTEM)
  8784. /* Persist session cache to file */
  8785. /* doesn't use memsave because of additional memory use */
  8786. int wolfSSL_save_session_cache(const char *fname)
  8787. {
  8788. XFILE file;
  8789. int ret;
  8790. int rc = WOLFSSL_SUCCESS;
  8791. int i;
  8792. cache_header_t cache_header;
  8793. WOLFSSL_ENTER("wolfSSL_save_session_cache");
  8794. file = XFOPEN(fname, "w+b");
  8795. if (file == XBADFILE) {
  8796. WOLFSSL_MSG("Couldn't open session cache save file");
  8797. return WOLFSSL_BAD_FILE;
  8798. }
  8799. cache_header.version = WOLFSSL_CACHE_VERSION;
  8800. cache_header.rows = SESSION_ROWS;
  8801. cache_header.columns = SESSIONS_PER_ROW;
  8802. cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION);
  8803. /* cache header */
  8804. ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file);
  8805. if (ret != 1) {
  8806. WOLFSSL_MSG("Session cache header file write failed");
  8807. XFCLOSE(file);
  8808. return FWRITE_ERROR;
  8809. }
  8810. if (wc_LockMutex(&session_mutex) != 0) {
  8811. WOLFSSL_MSG("Session cache mutex lock failed");
  8812. XFCLOSE(file);
  8813. return BAD_MUTEX_E;
  8814. }
  8815. /* session cache */
  8816. for (i = 0; i < cache_header.rows; ++i) {
  8817. ret = (int)XFWRITE(SessionCache + i, sizeof(SessionRow), 1, file);
  8818. if (ret != 1) {
  8819. WOLFSSL_MSG("Session cache member file write failed");
  8820. rc = FWRITE_ERROR;
  8821. break;
  8822. }
  8823. }
  8824. #ifndef NO_CLIENT_CACHE
  8825. /* client cache */
  8826. for (i = 0; i < cache_header.rows; ++i) {
  8827. ret = (int)XFWRITE(ClientCache + i, sizeof(ClientRow), 1, file);
  8828. if (ret != 1) {
  8829. WOLFSSL_MSG("Client cache member file write failed");
  8830. rc = FWRITE_ERROR;
  8831. break;
  8832. }
  8833. }
  8834. #endif /* NO_CLIENT_CACHE */
  8835. wc_UnLockMutex(&session_mutex);
  8836. XFCLOSE(file);
  8837. WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc);
  8838. return rc;
  8839. }
  8840. /* Restore the persistent session cache from file */
  8841. /* doesn't use memstore because of additional memory use */
  8842. int wolfSSL_restore_session_cache(const char *fname)
  8843. {
  8844. XFILE file;
  8845. int rc = WOLFSSL_SUCCESS;
  8846. int ret;
  8847. int i;
  8848. cache_header_t cache_header;
  8849. WOLFSSL_ENTER("wolfSSL_restore_session_cache");
  8850. file = XFOPEN(fname, "rb");
  8851. if (file == XBADFILE) {
  8852. WOLFSSL_MSG("Couldn't open session cache save file");
  8853. return WOLFSSL_BAD_FILE;
  8854. }
  8855. /* cache header */
  8856. ret = (int)XFREAD(&cache_header, sizeof cache_header, 1, file);
  8857. if (ret != 1) {
  8858. WOLFSSL_MSG("Session cache header file read failed");
  8859. XFCLOSE(file);
  8860. return FREAD_ERROR;
  8861. }
  8862. if (cache_header.version != WOLFSSL_CACHE_VERSION ||
  8863. cache_header.rows != SESSION_ROWS ||
  8864. cache_header.columns != SESSIONS_PER_ROW ||
  8865. cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) {
  8866. WOLFSSL_MSG("Session cache header match failed");
  8867. XFCLOSE(file);
  8868. return CACHE_MATCH_ERROR;
  8869. }
  8870. if (wc_LockMutex(&session_mutex) != 0) {
  8871. WOLFSSL_MSG("Session cache mutex lock failed");
  8872. XFCLOSE(file);
  8873. return BAD_MUTEX_E;
  8874. }
  8875. /* session cache */
  8876. for (i = 0; i < cache_header.rows; ++i) {
  8877. ret = (int)XFREAD(SessionCache + i, sizeof(SessionRow), 1, file);
  8878. if (ret != 1) {
  8879. WOLFSSL_MSG("Session cache member file read failed");
  8880. XMEMSET(SessionCache, 0, sizeof SessionCache);
  8881. rc = FREAD_ERROR;
  8882. break;
  8883. }
  8884. }
  8885. #ifndef NO_CLIENT_CACHE
  8886. /* client cache */
  8887. for (i = 0; i < cache_header.rows; ++i) {
  8888. ret = (int)XFREAD(ClientCache + i, sizeof(ClientRow), 1, file);
  8889. if (ret != 1) {
  8890. WOLFSSL_MSG("Client cache member file read failed");
  8891. XMEMSET(ClientCache, 0, sizeof ClientCache);
  8892. rc = FREAD_ERROR;
  8893. break;
  8894. }
  8895. }
  8896. #endif /* NO_CLIENT_CACHE */
  8897. wc_UnLockMutex(&session_mutex);
  8898. XFCLOSE(file);
  8899. WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc);
  8900. return rc;
  8901. }
  8902. #endif /* !NO_FILESYSTEM */
  8903. #endif /* PERSIST_SESSION_CACHE */
  8904. #endif /* NO_SESSION_CACHE */
  8905. void wolfSSL_load_error_strings(void) /* compatibility only */
  8906. {}
  8907. int wolfSSL_library_init(void)
  8908. {
  8909. WOLFSSL_ENTER("SSL_library_init");
  8910. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  8911. return WOLFSSL_SUCCESS;
  8912. else
  8913. return WOLFSSL_FATAL_ERROR;
  8914. }
  8915. #ifdef HAVE_SECRET_CALLBACK
  8916. int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, void* ctx)
  8917. {
  8918. WOLFSSL_ENTER("wolfSSL_set_session_secret_cb");
  8919. if (ssl == NULL)
  8920. return WOLFSSL_FATAL_ERROR;
  8921. ssl->sessionSecretCb = cb;
  8922. ssl->sessionSecretCtx = ctx;
  8923. /* If using a pre-set key, assume session resumption. */
  8924. ssl->session.sessionIDSz = 0;
  8925. ssl->options.resuming = 1;
  8926. return WOLFSSL_SUCCESS;
  8927. }
  8928. #endif
  8929. #ifndef NO_SESSION_CACHE
  8930. /* on by default if built in but allow user to turn off */
  8931. WOLFSSL_ABI
  8932. long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode)
  8933. {
  8934. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  8935. if (mode == WOLFSSL_SESS_CACHE_OFF)
  8936. ctx->sessionCacheOff = 1;
  8937. if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0)
  8938. ctx->sessionCacheFlushOff = 1;
  8939. #ifdef HAVE_EXT_CACHE
  8940. if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0)
  8941. ctx->internalCacheOff = 1;
  8942. #endif
  8943. return WOLFSSL_SUCCESS;
  8944. }
  8945. #endif /* NO_SESSION_CACHE */
  8946. #if !defined(NO_CERTS)
  8947. #if defined(PERSIST_CERT_CACHE)
  8948. #define WOLFSSL_CACHE_CERT_VERSION 1
  8949. typedef struct {
  8950. int version; /* cache cert layout version id */
  8951. int rows; /* hash table rows, CA_TABLE_SIZE */
  8952. int columns[CA_TABLE_SIZE]; /* columns per row on list */
  8953. int signerSz; /* sizeof Signer object */
  8954. } CertCacheHeader;
  8955. /* current cert persistence layout is:
  8956. 1) CertCacheHeader
  8957. 2) caTable
  8958. update WOLFSSL_CERT_CACHE_VERSION if change layout for the following
  8959. PERSIST_CERT_CACHE functions
  8960. */
  8961. /* Return memory needed to persist this signer, have lock */
  8962. static WC_INLINE int GetSignerMemory(Signer* signer)
  8963. {
  8964. int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID)
  8965. + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  8966. #if !defined(NO_SKID)
  8967. sz += (int)sizeof(signer->subjectKeyIdHash);
  8968. #endif
  8969. /* add dynamic bytes needed */
  8970. sz += signer->pubKeySize;
  8971. sz += signer->nameLen;
  8972. return sz;
  8973. }
  8974. /* Return memory needed to persist this row, have lock */
  8975. static WC_INLINE int GetCertCacheRowMemory(Signer* row)
  8976. {
  8977. int sz = 0;
  8978. while (row) {
  8979. sz += GetSignerMemory(row);
  8980. row = row->next;
  8981. }
  8982. return sz;
  8983. }
  8984. /* get the size of persist cert cache, have lock */
  8985. static WC_INLINE int GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  8986. {
  8987. int sz;
  8988. int i;
  8989. sz = sizeof(CertCacheHeader);
  8990. for (i = 0; i < CA_TABLE_SIZE; i++)
  8991. sz += GetCertCacheRowMemory(cm->caTable[i]);
  8992. return sz;
  8993. }
  8994. /* Store cert cache header columns with number of items per list, have lock */
  8995. static WC_INLINE void SetCertHeaderColumns(WOLFSSL_CERT_MANAGER* cm, int* columns)
  8996. {
  8997. int i;
  8998. Signer* row;
  8999. for (i = 0; i < CA_TABLE_SIZE; i++) {
  9000. int count = 0;
  9001. row = cm->caTable[i];
  9002. while (row) {
  9003. ++count;
  9004. row = row->next;
  9005. }
  9006. columns[i] = count;
  9007. }
  9008. }
  9009. /* Restore whole cert row from memory, have lock, return bytes consumed,
  9010. < 0 on error, have lock */
  9011. static WC_INLINE int RestoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current,
  9012. int row, int listSz, const byte* end)
  9013. {
  9014. int idx = 0;
  9015. if (listSz < 0) {
  9016. WOLFSSL_MSG("Row header corrupted, negative value");
  9017. return PARSE_ERROR;
  9018. }
  9019. while (listSz) {
  9020. Signer* signer;
  9021. byte* publicKey;
  9022. byte* start = current + idx; /* for end checks on this signer */
  9023. int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) +
  9024. sizeof(signer->nameLen) + sizeof(signer->subjectNameHash);
  9025. #ifndef NO_SKID
  9026. minSz += (int)sizeof(signer->subjectKeyIdHash);
  9027. #endif
  9028. if (start + minSz > end) {
  9029. WOLFSSL_MSG("Would overread restore buffer");
  9030. return BUFFER_E;
  9031. }
  9032. signer = MakeSigner(cm->heap);
  9033. if (signer == NULL)
  9034. return MEMORY_E;
  9035. /* pubKeySize */
  9036. XMEMCPY(&signer->pubKeySize, current + idx, sizeof(signer->pubKeySize));
  9037. idx += (int)sizeof(signer->pubKeySize);
  9038. /* keyOID */
  9039. XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID));
  9040. idx += (int)sizeof(signer->keyOID);
  9041. /* pulicKey */
  9042. if (start + minSz + signer->pubKeySize > end) {
  9043. WOLFSSL_MSG("Would overread restore buffer");
  9044. FreeSigner(signer, cm->heap);
  9045. return BUFFER_E;
  9046. }
  9047. publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap,
  9048. DYNAMIC_TYPE_KEY);
  9049. if (publicKey == NULL) {
  9050. FreeSigner(signer, cm->heap);
  9051. return MEMORY_E;
  9052. }
  9053. XMEMCPY(publicKey, current + idx, signer->pubKeySize);
  9054. signer->publicKey = publicKey;
  9055. idx += signer->pubKeySize;
  9056. /* nameLen */
  9057. XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen));
  9058. idx += (int)sizeof(signer->nameLen);
  9059. /* name */
  9060. if (start + minSz + signer->pubKeySize + signer->nameLen > end) {
  9061. WOLFSSL_MSG("Would overread restore buffer");
  9062. FreeSigner(signer, cm->heap);
  9063. return BUFFER_E;
  9064. }
  9065. signer->name = (char*)XMALLOC(signer->nameLen, cm->heap,
  9066. DYNAMIC_TYPE_SUBJECT_CN);
  9067. if (signer->name == NULL) {
  9068. FreeSigner(signer, cm->heap);
  9069. return MEMORY_E;
  9070. }
  9071. XMEMCPY(signer->name, current + idx, signer->nameLen);
  9072. idx += signer->nameLen;
  9073. /* subjectNameHash */
  9074. XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE);
  9075. idx += SIGNER_DIGEST_SIZE;
  9076. #ifndef NO_SKID
  9077. /* subjectKeyIdHash */
  9078. XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE);
  9079. idx += SIGNER_DIGEST_SIZE;
  9080. #endif
  9081. signer->next = cm->caTable[row];
  9082. cm->caTable[row] = signer;
  9083. --listSz;
  9084. }
  9085. return idx;
  9086. }
  9087. /* Store whole cert row into memory, have lock, return bytes added */
  9088. static WC_INLINE int StoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current, int row)
  9089. {
  9090. int added = 0;
  9091. Signer* list = cm->caTable[row];
  9092. while (list) {
  9093. XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize));
  9094. added += (int)sizeof(list->pubKeySize);
  9095. XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID));
  9096. added += (int)sizeof(list->keyOID);
  9097. XMEMCPY(current + added, list->publicKey, list->pubKeySize);
  9098. added += list->pubKeySize;
  9099. XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen));
  9100. added += (int)sizeof(list->nameLen);
  9101. XMEMCPY(current + added, list->name, list->nameLen);
  9102. added += list->nameLen;
  9103. XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE);
  9104. added += SIGNER_DIGEST_SIZE;
  9105. #ifndef NO_SKID
  9106. XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE);
  9107. added += SIGNER_DIGEST_SIZE;
  9108. #endif
  9109. list = list->next;
  9110. }
  9111. return added;
  9112. }
  9113. /* Persist cert cache to memory, have lock */
  9114. static WC_INLINE int DoMemSaveCertCache(WOLFSSL_CERT_MANAGER* cm,
  9115. void* mem, int sz)
  9116. {
  9117. int realSz;
  9118. int ret = WOLFSSL_SUCCESS;
  9119. int i;
  9120. WOLFSSL_ENTER("DoMemSaveCertCache");
  9121. realSz = GetCertCacheMemSize(cm);
  9122. if (realSz > sz) {
  9123. WOLFSSL_MSG("Mem output buffer too small");
  9124. ret = BUFFER_E;
  9125. }
  9126. else {
  9127. byte* current;
  9128. CertCacheHeader hdr;
  9129. hdr.version = WOLFSSL_CACHE_CERT_VERSION;
  9130. hdr.rows = CA_TABLE_SIZE;
  9131. SetCertHeaderColumns(cm, hdr.columns);
  9132. hdr.signerSz = (int)sizeof(Signer);
  9133. XMEMCPY(mem, &hdr, sizeof(CertCacheHeader));
  9134. current = (byte*)mem + sizeof(CertCacheHeader);
  9135. for (i = 0; i < CA_TABLE_SIZE; ++i)
  9136. current += StoreCertRow(cm, current, i);
  9137. }
  9138. return ret;
  9139. }
  9140. #if !defined(NO_FILESYSTEM)
  9141. /* Persist cert cache to file */
  9142. int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  9143. {
  9144. XFILE file;
  9145. int rc = WOLFSSL_SUCCESS;
  9146. int memSz;
  9147. byte* mem;
  9148. WOLFSSL_ENTER("CM_SaveCertCache");
  9149. file = XFOPEN(fname, "w+b");
  9150. if (file == XBADFILE) {
  9151. WOLFSSL_MSG("Couldn't open cert cache save file");
  9152. return WOLFSSL_BAD_FILE;
  9153. }
  9154. if (wc_LockMutex(&cm->caLock) != 0) {
  9155. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9156. XFCLOSE(file);
  9157. return BAD_MUTEX_E;
  9158. }
  9159. memSz = GetCertCacheMemSize(cm);
  9160. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9161. if (mem == NULL) {
  9162. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9163. rc = MEMORY_E;
  9164. } else {
  9165. rc = DoMemSaveCertCache(cm, mem, memSz);
  9166. if (rc == WOLFSSL_SUCCESS) {
  9167. int ret = (int)XFWRITE(mem, memSz, 1, file);
  9168. if (ret != 1) {
  9169. WOLFSSL_MSG("Cert cache file write failed");
  9170. rc = FWRITE_ERROR;
  9171. }
  9172. }
  9173. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9174. }
  9175. wc_UnLockMutex(&cm->caLock);
  9176. XFCLOSE(file);
  9177. return rc;
  9178. }
  9179. /* Restore cert cache from file */
  9180. int CM_RestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname)
  9181. {
  9182. XFILE file;
  9183. int rc = WOLFSSL_SUCCESS;
  9184. int ret;
  9185. int memSz;
  9186. byte* mem;
  9187. WOLFSSL_ENTER("CM_RestoreCertCache");
  9188. file = XFOPEN(fname, "rb");
  9189. if (file == XBADFILE) {
  9190. WOLFSSL_MSG("Couldn't open cert cache save file");
  9191. return WOLFSSL_BAD_FILE;
  9192. }
  9193. if(XFSEEK(file, 0, XSEEK_END) != 0) {
  9194. XFCLOSE(file);
  9195. return WOLFSSL_BAD_FILE;
  9196. }
  9197. memSz = (int)XFTELL(file);
  9198. XREWIND(file);
  9199. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz <= 0) {
  9200. WOLFSSL_MSG("CM_RestoreCertCache file size error");
  9201. XFCLOSE(file);
  9202. return WOLFSSL_BAD_FILE;
  9203. }
  9204. mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9205. if (mem == NULL) {
  9206. WOLFSSL_MSG("Alloc for tmp buffer failed");
  9207. XFCLOSE(file);
  9208. return MEMORY_E;
  9209. }
  9210. ret = (int)XFREAD(mem, memSz, 1, file);
  9211. if (ret != 1) {
  9212. WOLFSSL_MSG("Cert file read error");
  9213. rc = FREAD_ERROR;
  9214. } else {
  9215. rc = CM_MemRestoreCertCache(cm, mem, memSz);
  9216. if (rc != WOLFSSL_SUCCESS) {
  9217. WOLFSSL_MSG("Mem restore cert cache failed");
  9218. }
  9219. }
  9220. XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9221. XFCLOSE(file);
  9222. return rc;
  9223. }
  9224. #endif /* NO_FILESYSTEM */
  9225. /* Persist cert cache to memory */
  9226. int CM_MemSaveCertCache(WOLFSSL_CERT_MANAGER* cm, void* mem, int sz, int* used)
  9227. {
  9228. int ret = WOLFSSL_SUCCESS;
  9229. WOLFSSL_ENTER("CM_MemSaveCertCache");
  9230. if (wc_LockMutex(&cm->caLock) != 0) {
  9231. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9232. return BAD_MUTEX_E;
  9233. }
  9234. ret = DoMemSaveCertCache(cm, mem, sz);
  9235. if (ret == WOLFSSL_SUCCESS)
  9236. *used = GetCertCacheMemSize(cm);
  9237. wc_UnLockMutex(&cm->caLock);
  9238. return ret;
  9239. }
  9240. /* Restore cert cache from memory */
  9241. int CM_MemRestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const void* mem, int sz)
  9242. {
  9243. int ret = WOLFSSL_SUCCESS;
  9244. int i;
  9245. CertCacheHeader* hdr = (CertCacheHeader*)mem;
  9246. byte* current = (byte*)mem + sizeof(CertCacheHeader);
  9247. byte* end = (byte*)mem + sz; /* don't go over */
  9248. WOLFSSL_ENTER("CM_MemRestoreCertCache");
  9249. if (current > end) {
  9250. WOLFSSL_MSG("Cert Cache Memory buffer too small");
  9251. return BUFFER_E;
  9252. }
  9253. if (hdr->version != WOLFSSL_CACHE_CERT_VERSION ||
  9254. hdr->rows != CA_TABLE_SIZE ||
  9255. hdr->signerSz != (int)sizeof(Signer)) {
  9256. WOLFSSL_MSG("Cert Cache Memory header mismatch");
  9257. return CACHE_MATCH_ERROR;
  9258. }
  9259. if (wc_LockMutex(&cm->caLock) != 0) {
  9260. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9261. return BAD_MUTEX_E;
  9262. }
  9263. FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
  9264. for (i = 0; i < CA_TABLE_SIZE; ++i) {
  9265. int added = RestoreCertRow(cm, current, i, hdr->columns[i], end);
  9266. if (added < 0) {
  9267. WOLFSSL_MSG("RestoreCertRow error");
  9268. ret = added;
  9269. break;
  9270. }
  9271. current += added;
  9272. }
  9273. wc_UnLockMutex(&cm->caLock);
  9274. return ret;
  9275. }
  9276. /* get how big the the cert cache save buffer needs to be */
  9277. int CM_GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm)
  9278. {
  9279. int sz;
  9280. WOLFSSL_ENTER("CM_GetCertCacheMemSize");
  9281. if (wc_LockMutex(&cm->caLock) != 0) {
  9282. WOLFSSL_MSG("wc_LockMutex on caLock failed");
  9283. return BAD_MUTEX_E;
  9284. }
  9285. sz = GetCertCacheMemSize(cm);
  9286. wc_UnLockMutex(&cm->caLock);
  9287. return sz;
  9288. }
  9289. #endif /* PERSIST_CERT_CACHE */
  9290. #endif /* NO_CERTS */
  9291. #ifdef OPENSSL_EXTRA
  9292. /* removes all cipher suites from the list that contain "toRemove"
  9293. * returns the new list size on success
  9294. */
  9295. static int wolfSSL_remove_ciphers(char* list, int sz, const char* toRemove)
  9296. {
  9297. int idx = 0;
  9298. char* next = (char*)list;
  9299. int totalSz = sz;
  9300. if (list == NULL) {
  9301. return 0;
  9302. }
  9303. do {
  9304. char* current = next;
  9305. char name[MAX_SUITE_NAME + 1];
  9306. word32 length;
  9307. next = XSTRSTR(next, ":");
  9308. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /* last */
  9309. : (word32)(next - current));
  9310. XSTRNCPY(name, current, length);
  9311. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  9312. if (XSTRSTR(name, toRemove)) {
  9313. XMEMMOVE(list + idx, list + idx + length, totalSz - (idx + length));
  9314. totalSz -= length;
  9315. list[totalSz] = '\0';
  9316. next = current;
  9317. }
  9318. else {
  9319. idx += length;
  9320. }
  9321. } while (next++); /* ++ needed to skip ':' */
  9322. return totalSz;
  9323. }
  9324. /* parse some bulk lists like !eNULL / !aNULL
  9325. *
  9326. * returns WOLFSSL_SUCCESS on success and sets the cipher suite list
  9327. */
  9328. static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, Suites* suites,
  9329. const char* list)
  9330. {
  9331. int ret = 0;
  9332. const int suiteSz = GetCipherNamesSize();
  9333. char* next = (char*)list;
  9334. const CipherSuiteInfo* names = GetCipherNames();
  9335. char* localList = NULL;
  9336. int sz = 0;
  9337. if (suites == NULL || list == NULL) {
  9338. WOLFSSL_MSG("NULL argument");
  9339. return WOLFSSL_FAILURE;
  9340. }
  9341. /* does list contain eNULL or aNULL? */
  9342. if (XSTRSTR(list, "aNULL") || XSTRSTR(list, "eNULL")) {
  9343. do {
  9344. char* current = next;
  9345. char name[MAX_SUITE_NAME + 1];
  9346. int i;
  9347. word32 length;
  9348. next = XSTRSTR(next, ":");
  9349. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /*last*/
  9350. : (word32)(next - current));
  9351. XSTRNCPY(name, current, length);
  9352. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  9353. /* check for "not" case */
  9354. if (name[0] == '!' && suiteSz > 0) {
  9355. /* populate list with all suites if not already created */
  9356. if (localList == NULL) {
  9357. for (i = 0; i < suiteSz; i++) {
  9358. sz += (int)XSTRLEN(names[i].name) + 2;
  9359. }
  9360. localList = (char*)XMALLOC(sz, ctx->heap,
  9361. DYNAMIC_TYPE_TMP_BUFFER);
  9362. if (localList == NULL) {
  9363. return WOLFSSL_FAILURE;
  9364. }
  9365. wolfSSL_get_ciphers(localList, sz);
  9366. sz = (int)XSTRLEN(localList);
  9367. }
  9368. if (XSTRSTR(name, "eNULL")) {
  9369. wolfSSL_remove_ciphers(localList, sz, "-NULL");
  9370. }
  9371. }
  9372. }
  9373. while (next++); /* ++ needed to skip ':' */
  9374. ret = SetCipherList(ctx, suites, localList);
  9375. XFREE(localList, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9376. return (ret)? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9377. }
  9378. else {
  9379. return (SetCipherList(ctx, suites, list)) ? WOLFSSL_SUCCESS :
  9380. WOLFSSL_FAILURE;
  9381. }
  9382. }
  9383. #endif
  9384. int wolfSSL_CTX_set_cipher_list(WOLFSSL_CTX* ctx, const char* list)
  9385. {
  9386. WOLFSSL_ENTER("wolfSSL_CTX_set_cipher_list");
  9387. if (ctx == NULL)
  9388. return WOLFSSL_FAILURE;
  9389. /* alloc/init on demand only */
  9390. if (ctx->suites == NULL) {
  9391. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  9392. DYNAMIC_TYPE_SUITES);
  9393. if (ctx->suites == NULL) {
  9394. WOLFSSL_MSG("Memory alloc for Suites failed");
  9395. return WOLFSSL_FAILURE;
  9396. }
  9397. XMEMSET(ctx->suites, 0, sizeof(Suites));
  9398. }
  9399. #ifdef OPENSSL_EXTRA
  9400. return wolfSSL_parse_cipher_list(ctx, ctx->suites, list);
  9401. #else
  9402. return (SetCipherList(ctx, ctx->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9403. #endif
  9404. }
  9405. int wolfSSL_set_cipher_list(WOLFSSL* ssl, const char* list)
  9406. {
  9407. WOLFSSL_ENTER("wolfSSL_set_cipher_list");
  9408. #ifdef SINGLE_THREADED
  9409. if (ssl->ctx->suites == ssl->suites) {
  9410. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  9411. DYNAMIC_TYPE_SUITES);
  9412. if (ssl->suites == NULL) {
  9413. WOLFSSL_MSG("Suites Memory error");
  9414. return MEMORY_E;
  9415. }
  9416. ssl->options.ownSuites = 1;
  9417. }
  9418. #endif
  9419. #ifdef OPENSSL_EXTRA
  9420. return wolfSSL_parse_cipher_list(ssl->ctx, ssl->suites, list);
  9421. #else
  9422. return (SetCipherList(ssl->ctx, ssl->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  9423. #endif
  9424. }
  9425. int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl)
  9426. {
  9427. int useNb = 0;
  9428. if (ssl == NULL)
  9429. return WOLFSSL_FAILURE;
  9430. WOLFSSL_ENTER("wolfSSL_dtls_get_using_nonblock");
  9431. if (ssl->options.dtls) {
  9432. #ifdef WOLFSSL_DTLS
  9433. useNb = ssl->options.dtlsUseNonblock;
  9434. #endif
  9435. }
  9436. else {
  9437. WOLFSSL_MSG("wolfSSL_dtls_get_using_nonblock() is "
  9438. "DEPRECATED for non-DTLS use.");
  9439. }
  9440. return useNb;
  9441. }
  9442. #ifndef WOLFSSL_LEANPSK
  9443. void wolfSSL_dtls_set_using_nonblock(WOLFSSL* ssl, int nonblock)
  9444. {
  9445. (void)nonblock;
  9446. WOLFSSL_ENTER("wolfSSL_dtls_set_using_nonblock");
  9447. if (ssl == NULL)
  9448. return;
  9449. if (ssl->options.dtls) {
  9450. #ifdef WOLFSSL_DTLS
  9451. ssl->options.dtlsUseNonblock = (nonblock != 0);
  9452. #endif
  9453. }
  9454. else {
  9455. WOLFSSL_MSG("wolfSSL_dtls_set_using_nonblock() is "
  9456. "DEPRECATED for non-DTLS use.");
  9457. }
  9458. }
  9459. #ifdef WOLFSSL_DTLS
  9460. int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl)
  9461. {
  9462. int timeout = 0;
  9463. if (ssl)
  9464. timeout = ssl->dtls_timeout;
  9465. WOLFSSL_LEAVE("wolfSSL_dtls_get_current_timeout()", timeout);
  9466. return timeout;
  9467. }
  9468. int wolfSSL_DTLSv1_get_timeout(WOLFSSL* ssl, WOLFSSL_TIMEVAL* timeleft)
  9469. {
  9470. if (ssl && timeleft) {
  9471. XMEMSET(timeleft, 0, sizeof(WOLFSSL_TIMEVAL));
  9472. timeleft->tv_sec = ssl->dtls_timeout;
  9473. }
  9474. return 0;
  9475. }
  9476. #ifndef NO_WOLFSSL_STUB
  9477. int wolfSSL_DTLSv1_handle_timeout(WOLFSSL* ssl)
  9478. {
  9479. WOLFSSL_STUB("SSL_DTLSv1_handle_timeout");
  9480. (void)ssl;
  9481. return 0;
  9482. }
  9483. #endif
  9484. #ifndef NO_WOLFSSL_STUB
  9485. void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, word32 duration_ms)
  9486. {
  9487. WOLFSSL_STUB("SSL_DTLSv1_set_initial_timeout_duration");
  9488. (void)ssl;
  9489. (void)duration_ms;
  9490. }
  9491. #endif
  9492. /* user may need to alter init dtls recv timeout, WOLFSSL_SUCCESS on ok */
  9493. int wolfSSL_dtls_set_timeout_init(WOLFSSL* ssl, int timeout)
  9494. {
  9495. if (ssl == NULL || timeout < 0)
  9496. return BAD_FUNC_ARG;
  9497. if (timeout > ssl->dtls_timeout_max) {
  9498. WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout max");
  9499. return BAD_FUNC_ARG;
  9500. }
  9501. ssl->dtls_timeout_init = timeout;
  9502. ssl->dtls_timeout = timeout;
  9503. return WOLFSSL_SUCCESS;
  9504. }
  9505. /* user may need to alter max dtls recv timeout, WOLFSSL_SUCCESS on ok */
  9506. int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int timeout)
  9507. {
  9508. if (ssl == NULL || timeout < 0)
  9509. return BAD_FUNC_ARG;
  9510. if (timeout < ssl->dtls_timeout_init) {
  9511. WOLFSSL_MSG("Can't set dtls timeout max less than dtls timeout init");
  9512. return BAD_FUNC_ARG;
  9513. }
  9514. ssl->dtls_timeout_max = timeout;
  9515. return WOLFSSL_SUCCESS;
  9516. }
  9517. int wolfSSL_dtls_got_timeout(WOLFSSL* ssl)
  9518. {
  9519. int result = WOLFSSL_SUCCESS;
  9520. WOLFSSL_ENTER("wolfSSL_dtls_got_timeout()");
  9521. if (ssl == NULL)
  9522. return WOLFSSL_FATAL_ERROR;
  9523. if (!ssl->options.handShakeDone &&
  9524. (DtlsMsgPoolTimeout(ssl) < 0 || DtlsMsgPoolSend(ssl, 0) < 0)) {
  9525. result = WOLFSSL_FATAL_ERROR;
  9526. }
  9527. WOLFSSL_LEAVE("wolfSSL_dtls_got_timeout()", result);
  9528. return result;
  9529. }
  9530. /* retransmit all the saves messages, WOLFSSL_SUCCESS on ok */
  9531. int wolfSSL_dtls_retransmit(WOLFSSL* ssl)
  9532. {
  9533. WOLFSSL_ENTER("wolfSSL_dtls_retransmit()");
  9534. if (ssl == NULL)
  9535. return WOLFSSL_FATAL_ERROR;
  9536. if (!ssl->options.handShakeDone) {
  9537. int result = DtlsMsgPoolSend(ssl, 0);
  9538. if (result < 0) {
  9539. ssl->error = result;
  9540. WOLFSSL_ERROR(result);
  9541. return WOLFSSL_FATAL_ERROR;
  9542. }
  9543. }
  9544. return 0;
  9545. }
  9546. #endif /* DTLS */
  9547. #endif /* LEANPSK */
  9548. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  9549. /* Not an SSL function, return 0 for success, error code otherwise */
  9550. /* Prereq: ssl's RNG needs to be initialized. */
  9551. int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
  9552. const byte* secret, word32 secretSz)
  9553. {
  9554. int ret = 0;
  9555. WOLFSSL_ENTER("wolfSSL_DTLS_SetCookieSecret");
  9556. if (ssl == NULL) {
  9557. WOLFSSL_MSG("need a SSL object");
  9558. return BAD_FUNC_ARG;
  9559. }
  9560. if (secret != NULL && secretSz == 0) {
  9561. WOLFSSL_MSG("can't have a new secret without a size");
  9562. return BAD_FUNC_ARG;
  9563. }
  9564. /* If secretSz is 0, use the default size. */
  9565. if (secretSz == 0)
  9566. secretSz = COOKIE_SECRET_SZ;
  9567. if (secretSz != ssl->buffers.dtlsCookieSecret.length) {
  9568. byte* newSecret;
  9569. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  9570. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  9571. ssl->buffers.dtlsCookieSecret.length);
  9572. XFREE(ssl->buffers.dtlsCookieSecret.buffer,
  9573. ssl->heap, DYNAMIC_TYPE_NONE);
  9574. }
  9575. newSecret = (byte*)XMALLOC(secretSz, ssl->heap,DYNAMIC_TYPE_COOKIE_PWD);
  9576. if (newSecret == NULL) {
  9577. ssl->buffers.dtlsCookieSecret.buffer = NULL;
  9578. ssl->buffers.dtlsCookieSecret.length = 0;
  9579. WOLFSSL_MSG("couldn't allocate new cookie secret");
  9580. return MEMORY_ERROR;
  9581. }
  9582. ssl->buffers.dtlsCookieSecret.buffer = newSecret;
  9583. ssl->buffers.dtlsCookieSecret.length = secretSz;
  9584. }
  9585. /* If the supplied secret is NULL, randomly generate a new secret. */
  9586. if (secret == NULL) {
  9587. ret = wc_RNG_GenerateBlock(ssl->rng,
  9588. ssl->buffers.dtlsCookieSecret.buffer, secretSz);
  9589. }
  9590. else
  9591. XMEMCPY(ssl->buffers.dtlsCookieSecret.buffer, secret, secretSz);
  9592. WOLFSSL_LEAVE("wolfSSL_DTLS_SetCookieSecret", 0);
  9593. return ret;
  9594. }
  9595. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  9596. /* EITHER SIDE METHODS */
  9597. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  9598. WOLFSSL_METHOD* wolfSSLv23_method(void)
  9599. {
  9600. return wolfSSLv23_method_ex(NULL);
  9601. }
  9602. WOLFSSL_METHOD* wolfSSLv23_method_ex(void* heap)
  9603. {
  9604. WOLFSSL_METHOD* m = NULL;
  9605. WOLFSSL_ENTER("SSLv23_method");
  9606. #if !defined(NO_WOLFSSL_CLIENT)
  9607. m = wolfSSLv23_client_method_ex(heap);
  9608. #elif !defined(NO_WOLFSSL_SERVER)
  9609. m = wolfSSLv23_server_method_ex(heap);
  9610. #endif
  9611. if (m != NULL) {
  9612. m->side = WOLFSSL_NEITHER_END;
  9613. }
  9614. return m;
  9615. }
  9616. #ifdef WOLFSSL_ALLOW_SSLV3
  9617. WOLFSSL_METHOD* wolfSSLv3_method(void)
  9618. {
  9619. return wolfSSLv3_method_ex(NULL);
  9620. }
  9621. WOLFSSL_METHOD* wolfSSLv3_method_ex(void* heap)
  9622. {
  9623. WOLFSSL_METHOD* m = NULL;
  9624. WOLFSSL_ENTER("SSLv3_method");
  9625. #if !defined(NO_WOLFSSL_CLIENT)
  9626. m = wolfSSLv3_client_method_ex(heap);
  9627. #elif !defined(NO_WOLFSSL_SERVER)
  9628. m = wolfSSLv3_server_method_ex(heap);
  9629. #endif
  9630. if (m != NULL) {
  9631. m->side = WOLFSSL_NEITHER_END;
  9632. }
  9633. return m;
  9634. }
  9635. #endif
  9636. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  9637. /* client only parts */
  9638. #ifndef NO_WOLFSSL_CLIENT
  9639. #ifdef OPENSSL_EXTRA
  9640. WOLFSSL_METHOD* wolfSSLv2_client_method(void)
  9641. {
  9642. WOLFSSL_STUB("wolfSSLv2_client_method");
  9643. return NULL;
  9644. }
  9645. #endif
  9646. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  9647. WOLFSSL_METHOD* wolfSSLv3_client_method(void)
  9648. {
  9649. return wolfSSLv3_client_method_ex(NULL);
  9650. }
  9651. WOLFSSL_METHOD* wolfSSLv3_client_method_ex(void* heap)
  9652. {
  9653. WOLFSSL_METHOD* method =
  9654. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9655. heap, DYNAMIC_TYPE_METHOD);
  9656. (void)heap;
  9657. WOLFSSL_ENTER("SSLv3_client_method_ex");
  9658. if (method)
  9659. InitSSL_Method(method, MakeSSLv3());
  9660. return method;
  9661. }
  9662. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  9663. WOLFSSL_METHOD* wolfSSLv23_client_method(void)
  9664. {
  9665. return wolfSSLv23_client_method_ex(NULL);
  9666. }
  9667. WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
  9668. {
  9669. WOLFSSL_METHOD* method =
  9670. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9671. heap, DYNAMIC_TYPE_METHOD);
  9672. (void)heap;
  9673. WOLFSSL_ENTER("SSLv23_client_method_ex");
  9674. if (method) {
  9675. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  9676. #if defined(WOLFSSL_TLS13)
  9677. InitSSL_Method(method, MakeTLSv1_3());
  9678. #elif !defined(WOLFSSL_NO_TLS12)
  9679. InitSSL_Method(method, MakeTLSv1_2());
  9680. #elif !defined(NO_OLD_TLS)
  9681. InitSSL_Method(method, MakeTLSv1_1());
  9682. #endif
  9683. #else
  9684. #ifndef NO_OLD_TLS
  9685. InitSSL_Method(method, MakeTLSv1_1());
  9686. #endif
  9687. #endif
  9688. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  9689. method->downgrade = 1;
  9690. #endif
  9691. }
  9692. return method;
  9693. }
  9694. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  9695. defined(WOLFSSL_ALLOW_SSLV3)
  9696. /* If SCTP is not enabled returns the state of the dtls option.
  9697. * If SCTP is enabled returns dtls && !sctp. */
  9698. static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl)
  9699. {
  9700. int result = ssl->options.dtls;
  9701. if (result) {
  9702. #ifdef WOLFSSL_SCTP
  9703. result = !ssl->options.dtlsSctp;
  9704. #endif
  9705. }
  9706. return result;
  9707. }
  9708. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
  9709. /* please see note at top of README if you get an error from connect */
  9710. WOLFSSL_ABI
  9711. int wolfSSL_connect(WOLFSSL* ssl)
  9712. {
  9713. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  9714. int neededState;
  9715. #endif
  9716. WOLFSSL_ENTER("SSL_connect()");
  9717. #ifdef HAVE_ERRNO_H
  9718. errno = 0;
  9719. #endif
  9720. if (ssl == NULL)
  9721. return BAD_FUNC_ARG;
  9722. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  9723. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  9724. ssl->error = InitSSL_Side(ssl, WOLFSSL_CLIENT_END);
  9725. if (ssl->error != WOLFSSL_SUCCESS) {
  9726. WOLFSSL_ERROR(ssl->error);
  9727. return WOLFSSL_FATAL_ERROR;
  9728. }
  9729. ssl->error = 0; /* expected to be zero here */
  9730. }
  9731. #ifdef OPENSSL_EXTRA
  9732. if (ssl->CBIS != NULL) {
  9733. ssl->CBIS(ssl, SSL_ST_CONNECT, SSL_SUCCESS);
  9734. ssl->cbmode = SSL_CB_WRITE;
  9735. }
  9736. #endif
  9737. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  9738. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  9739. return wolfSSL_connect_TLSv13(ssl);
  9740. #else
  9741. #ifdef WOLFSSL_TLS13
  9742. if (ssl->options.tls1_3)
  9743. return wolfSSL_connect_TLSv13(ssl);
  9744. #endif
  9745. if (ssl->options.side != WOLFSSL_CLIENT_END) {
  9746. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  9747. return WOLFSSL_FATAL_ERROR;
  9748. }
  9749. #ifdef WOLFSSL_DTLS
  9750. if (ssl->version.major == DTLS_MAJOR) {
  9751. ssl->options.dtls = 1;
  9752. ssl->options.tls = 1;
  9753. ssl->options.tls1_1 = 1;
  9754. }
  9755. #endif
  9756. if (ssl->buffers.outputBuffer.length > 0
  9757. #ifdef WOLFSSL_ASYNC_CRYPT
  9758. /* do not send buffered or advance state if last error was an
  9759. async pending operation */
  9760. && ssl->error != WC_PENDING_E
  9761. #endif
  9762. ) {
  9763. if ( (ssl->error = SendBuffered(ssl)) == 0) {
  9764. /* fragOffset is non-zero when sending fragments. On the last
  9765. * fragment, fragOffset is zero again, and the state can be
  9766. * advanced. */
  9767. if (ssl->fragOffset == 0) {
  9768. ssl->options.connectState++;
  9769. WOLFSSL_MSG("connect state: "
  9770. "Advanced from last buffered fragment send");
  9771. }
  9772. else {
  9773. WOLFSSL_MSG("connect state: "
  9774. "Not advanced, more fragments to send");
  9775. }
  9776. }
  9777. else {
  9778. WOLFSSL_ERROR(ssl->error);
  9779. return WOLFSSL_FATAL_ERROR;
  9780. }
  9781. }
  9782. switch (ssl->options.connectState) {
  9783. case CONNECT_BEGIN :
  9784. /* always send client hello first */
  9785. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  9786. WOLFSSL_ERROR(ssl->error);
  9787. return WOLFSSL_FATAL_ERROR;
  9788. }
  9789. ssl->options.connectState = CLIENT_HELLO_SENT;
  9790. WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT");
  9791. FALL_THROUGH;
  9792. case CLIENT_HELLO_SENT :
  9793. neededState = ssl->options.resuming ? SERVER_FINISHED_COMPLETE :
  9794. SERVER_HELLODONE_COMPLETE;
  9795. #ifdef WOLFSSL_DTLS
  9796. /* In DTLS, when resuming, we can go straight to FINISHED,
  9797. * or do a cookie exchange and then skip to FINISHED, assume
  9798. * we need the cookie exchange first. */
  9799. if (IsDtlsNotSctpMode(ssl))
  9800. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  9801. #endif
  9802. /* get response */
  9803. while (ssl->options.serverState < neededState) {
  9804. #ifdef WOLFSSL_TLS13
  9805. if (ssl->options.tls1_3)
  9806. return wolfSSL_connect_TLSv13(ssl);
  9807. #endif
  9808. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  9809. WOLFSSL_ERROR(ssl->error);
  9810. return WOLFSSL_FATAL_ERROR;
  9811. }
  9812. /* if resumption failed, reset needed state */
  9813. else if (neededState == SERVER_FINISHED_COMPLETE)
  9814. if (!ssl->options.resuming) {
  9815. if (!IsDtlsNotSctpMode(ssl))
  9816. neededState = SERVER_HELLODONE_COMPLETE;
  9817. else
  9818. neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  9819. }
  9820. }
  9821. ssl->options.connectState = HELLO_AGAIN;
  9822. WOLFSSL_MSG("connect state: HELLO_AGAIN");
  9823. FALL_THROUGH;
  9824. case HELLO_AGAIN :
  9825. if (ssl->options.certOnly)
  9826. return WOLFSSL_SUCCESS;
  9827. #ifdef WOLFSSL_TLS13
  9828. if (ssl->options.tls1_3)
  9829. return wolfSSL_connect_TLSv13(ssl);
  9830. #endif
  9831. #ifdef WOLFSSL_DTLS
  9832. if (ssl->options.serverState ==
  9833. SERVER_HELLOVERIFYREQUEST_COMPLETE) {
  9834. if (IsDtlsNotSctpMode(ssl)) {
  9835. /* re-init hashes, exclude first hello and verify request */
  9836. if ((ssl->error = InitHandshakeHashes(ssl)) != 0) {
  9837. WOLFSSL_ERROR(ssl->error);
  9838. return WOLFSSL_FATAL_ERROR;
  9839. }
  9840. if ( (ssl->error = SendClientHello(ssl)) != 0) {
  9841. WOLFSSL_ERROR(ssl->error);
  9842. return WOLFSSL_FATAL_ERROR;
  9843. }
  9844. }
  9845. }
  9846. #endif
  9847. ssl->options.connectState = HELLO_AGAIN_REPLY;
  9848. WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
  9849. FALL_THROUGH;
  9850. case HELLO_AGAIN_REPLY :
  9851. #ifdef WOLFSSL_DTLS
  9852. if (IsDtlsNotSctpMode(ssl)) {
  9853. neededState = ssl->options.resuming ?
  9854. SERVER_FINISHED_COMPLETE : SERVER_HELLODONE_COMPLETE;
  9855. /* get response */
  9856. while (ssl->options.serverState < neededState) {
  9857. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  9858. WOLFSSL_ERROR(ssl->error);
  9859. return WOLFSSL_FATAL_ERROR;
  9860. }
  9861. /* if resumption failed, reset needed state */
  9862. if (neededState == SERVER_FINISHED_COMPLETE) {
  9863. if (!ssl->options.resuming)
  9864. neededState = SERVER_HELLODONE_COMPLETE;
  9865. }
  9866. }
  9867. }
  9868. #endif
  9869. ssl->options.connectState = FIRST_REPLY_DONE;
  9870. WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
  9871. FALL_THROUGH;
  9872. case FIRST_REPLY_DONE :
  9873. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  9874. #ifdef WOLFSSL_TLS13
  9875. if (ssl->options.tls1_3)
  9876. return wolfSSL_connect_TLSv13(ssl);
  9877. #endif
  9878. if (ssl->options.sendVerify) {
  9879. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  9880. WOLFSSL_ERROR(ssl->error);
  9881. return WOLFSSL_FATAL_ERROR;
  9882. }
  9883. WOLFSSL_MSG("sent: certificate");
  9884. }
  9885. #endif
  9886. ssl->options.connectState = FIRST_REPLY_FIRST;
  9887. WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
  9888. FALL_THROUGH;
  9889. case FIRST_REPLY_FIRST :
  9890. #ifdef WOLFSSL_TLS13
  9891. if (ssl->options.tls1_3)
  9892. return wolfSSL_connect_TLSv13(ssl);
  9893. #endif
  9894. if (!ssl->options.resuming) {
  9895. if ( (ssl->error = SendClientKeyExchange(ssl)) != 0) {
  9896. WOLFSSL_ERROR(ssl->error);
  9897. return WOLFSSL_FATAL_ERROR;
  9898. }
  9899. WOLFSSL_MSG("sent: client key exchange");
  9900. }
  9901. ssl->options.connectState = FIRST_REPLY_SECOND;
  9902. WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
  9903. FALL_THROUGH;
  9904. case FIRST_REPLY_SECOND :
  9905. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  9906. if (ssl->options.sendVerify) {
  9907. if ( (ssl->error = SendCertificateVerify(ssl)) != 0) {
  9908. WOLFSSL_ERROR(ssl->error);
  9909. return WOLFSSL_FATAL_ERROR;
  9910. }
  9911. WOLFSSL_MSG("sent: certificate verify");
  9912. }
  9913. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  9914. ssl->options.connectState = FIRST_REPLY_THIRD;
  9915. WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
  9916. FALL_THROUGH;
  9917. case FIRST_REPLY_THIRD :
  9918. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  9919. WOLFSSL_ERROR(ssl->error);
  9920. return WOLFSSL_FATAL_ERROR;
  9921. }
  9922. WOLFSSL_MSG("sent: change cipher spec");
  9923. ssl->options.connectState = FIRST_REPLY_FOURTH;
  9924. WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
  9925. FALL_THROUGH;
  9926. case FIRST_REPLY_FOURTH :
  9927. if ( (ssl->error = SendFinished(ssl)) != 0) {
  9928. WOLFSSL_ERROR(ssl->error);
  9929. return WOLFSSL_FATAL_ERROR;
  9930. }
  9931. WOLFSSL_MSG("sent: finished");
  9932. ssl->options.connectState = FINISHED_DONE;
  9933. WOLFSSL_MSG("connect state: FINISHED_DONE");
  9934. FALL_THROUGH;
  9935. case FINISHED_DONE :
  9936. /* get response */
  9937. while (ssl->options.serverState < SERVER_FINISHED_COMPLETE)
  9938. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  9939. WOLFSSL_ERROR(ssl->error);
  9940. return WOLFSSL_FATAL_ERROR;
  9941. }
  9942. ssl->options.connectState = SECOND_REPLY_DONE;
  9943. WOLFSSL_MSG("connect state: SECOND_REPLY_DONE");
  9944. FALL_THROUGH;
  9945. case SECOND_REPLY_DONE:
  9946. #ifndef NO_HANDSHAKE_DONE_CB
  9947. if (ssl->hsDoneCb) {
  9948. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  9949. if (cbret < 0) {
  9950. ssl->error = cbret;
  9951. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  9952. return WOLFSSL_FATAL_ERROR;
  9953. }
  9954. }
  9955. #endif /* NO_HANDSHAKE_DONE_CB */
  9956. if (!ssl->options.dtls) {
  9957. if (!ssl->options.keepResources) {
  9958. FreeHandshakeResources(ssl);
  9959. }
  9960. }
  9961. #ifdef WOLFSSL_DTLS
  9962. else {
  9963. ssl->options.dtlsHsRetain = 1;
  9964. }
  9965. #endif /* WOLFSSL_DTLS */
  9966. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  9967. /* This may be necessary in async so that we don't try to
  9968. * renegotiate again */
  9969. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  9970. ssl->secure_renegotiation->startScr = 0;
  9971. }
  9972. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  9973. WOLFSSL_LEAVE("SSL_connect()", WOLFSSL_SUCCESS);
  9974. return WOLFSSL_SUCCESS;
  9975. default:
  9976. WOLFSSL_MSG("Unknown connect state ERROR");
  9977. return WOLFSSL_FATAL_ERROR; /* unknown connect state */
  9978. }
  9979. #endif /* !WOLFSSL_NO_TLS12 */
  9980. }
  9981. #endif /* NO_WOLFSSL_CLIENT */
  9982. /* server only parts */
  9983. #ifndef NO_WOLFSSL_SERVER
  9984. #ifdef OPENSSL_EXTRA
  9985. WOLFSSL_METHOD* wolfSSLv2_server_method(void)
  9986. {
  9987. WOLFSSL_STUB("wolfSSLv2_server_method");
  9988. return 0;
  9989. }
  9990. #endif
  9991. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  9992. WOLFSSL_METHOD* wolfSSLv3_server_method(void)
  9993. {
  9994. return wolfSSLv3_server_method_ex(NULL);
  9995. }
  9996. WOLFSSL_METHOD* wolfSSLv3_server_method_ex(void* heap)
  9997. {
  9998. WOLFSSL_METHOD* method =
  9999. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10000. heap, DYNAMIC_TYPE_METHOD);
  10001. (void)heap;
  10002. WOLFSSL_ENTER("SSLv3_server_method_ex");
  10003. if (method) {
  10004. InitSSL_Method(method, MakeSSLv3());
  10005. method->side = WOLFSSL_SERVER_END;
  10006. }
  10007. return method;
  10008. }
  10009. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  10010. WOLFSSL_METHOD* wolfSSLv23_server_method(void)
  10011. {
  10012. return wolfSSLv23_server_method_ex(NULL);
  10013. }
  10014. WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
  10015. {
  10016. WOLFSSL_METHOD* method =
  10017. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10018. heap, DYNAMIC_TYPE_METHOD);
  10019. (void)heap;
  10020. WOLFSSL_ENTER("SSLv23_server_method_ex");
  10021. if (method) {
  10022. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  10023. #ifdef WOLFSSL_TLS13
  10024. InitSSL_Method(method, MakeTLSv1_3());
  10025. #elif !defined(WOLFSSL_NO_TLS12)
  10026. InitSSL_Method(method, MakeTLSv1_2());
  10027. #elif !defined(NO_OLD_TLS)
  10028. InitSSL_Method(method, MakeTLSv1_1());
  10029. #endif
  10030. #else
  10031. #ifndef NO_OLD_TLS
  10032. InitSSL_Method(method, MakeTLSv1_1());
  10033. #else
  10034. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  10035. #endif
  10036. #endif
  10037. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_TLS13)
  10038. method->downgrade = 1;
  10039. #endif
  10040. method->side = WOLFSSL_SERVER_END;
  10041. }
  10042. return method;
  10043. }
  10044. WOLFSSL_ABI
  10045. int wolfSSL_accept(WOLFSSL* ssl)
  10046. {
  10047. #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13))
  10048. word16 havePSK = 0;
  10049. word16 haveAnon = 0;
  10050. word16 haveMcast = 0;
  10051. #endif
  10052. if (ssl == NULL)
  10053. return WOLFSSL_FATAL_ERROR;
  10054. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  10055. if (ssl->options.side == WOLFSSL_NEITHER_END) {
  10056. WOLFSSL_MSG("Setting WOLFSSL_SSL to be server side");
  10057. ssl->error = InitSSL_Side(ssl, WOLFSSL_SERVER_END);
  10058. if (ssl->error != WOLFSSL_SUCCESS) {
  10059. WOLFSSL_ERROR(ssl->error);
  10060. return WOLFSSL_FATAL_ERROR;
  10061. }
  10062. ssl->error = 0; /* expected to be zero here */
  10063. }
  10064. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  10065. #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)
  10066. return wolfSSL_accept_TLSv13(ssl);
  10067. #else
  10068. #ifdef WOLFSSL_TLS13
  10069. if (ssl->options.tls1_3)
  10070. return wolfSSL_accept_TLSv13(ssl);
  10071. #endif
  10072. WOLFSSL_ENTER("SSL_accept()");
  10073. #ifdef HAVE_ERRNO_H
  10074. errno = 0;
  10075. #endif
  10076. #ifndef NO_PSK
  10077. havePSK = ssl->options.havePSK;
  10078. #endif
  10079. (void)havePSK;
  10080. #ifdef HAVE_ANON
  10081. haveAnon = ssl->options.haveAnon;
  10082. #endif
  10083. (void)haveAnon;
  10084. #ifdef WOLFSSL_MULTICAST
  10085. haveMcast = ssl->options.haveMcast;
  10086. #endif
  10087. (void)haveMcast;
  10088. if (ssl->options.side != WOLFSSL_SERVER_END) {
  10089. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  10090. return WOLFSSL_FATAL_ERROR;
  10091. }
  10092. #ifndef NO_CERTS
  10093. /* in case used set_accept_state after init */
  10094. /* allow no private key if using PK callbacks and CB is set */
  10095. if (!havePSK && !haveAnon && !haveMcast) {
  10096. if (!ssl->buffers.certificate ||
  10097. !ssl->buffers.certificate->buffer) {
  10098. WOLFSSL_MSG("accept error: server cert required");
  10099. WOLFSSL_ERROR(ssl->error = NO_PRIVATE_KEY);
  10100. return WOLFSSL_FATAL_ERROR;
  10101. }
  10102. #ifdef HAVE_PK_CALLBACKS
  10103. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  10104. WOLFSSL_MSG("Using PK for server private key");
  10105. }
  10106. else
  10107. #endif
  10108. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  10109. WOLFSSL_MSG("accept error: server key required");
  10110. WOLFSSL_ERROR(ssl->error = NO_PRIVATE_KEY);
  10111. return WOLFSSL_FATAL_ERROR;
  10112. }
  10113. }
  10114. #endif
  10115. #ifdef WOLFSSL_DTLS
  10116. if (ssl->version.major == DTLS_MAJOR) {
  10117. ssl->options.dtls = 1;
  10118. ssl->options.tls = 1;
  10119. ssl->options.tls1_1 = 1;
  10120. }
  10121. #endif
  10122. if (ssl->buffers.outputBuffer.length > 0
  10123. #ifdef WOLFSSL_ASYNC_CRYPT
  10124. /* do not send buffered or advance state if last error was an
  10125. async pending operation */
  10126. && ssl->error != WC_PENDING_E
  10127. #endif
  10128. ) {
  10129. if ( (ssl->error = SendBuffered(ssl)) == 0) {
  10130. /* fragOffset is non-zero when sending fragments. On the last
  10131. * fragment, fragOffset is zero again, and the state can be
  10132. * advanced. */
  10133. if (ssl->fragOffset == 0) {
  10134. ssl->options.acceptState++;
  10135. WOLFSSL_MSG("accept state: "
  10136. "Advanced from last buffered fragment send");
  10137. }
  10138. else {
  10139. WOLFSSL_MSG("accept state: "
  10140. "Not advanced, more fragments to send");
  10141. }
  10142. }
  10143. else {
  10144. WOLFSSL_ERROR(ssl->error);
  10145. return WOLFSSL_FATAL_ERROR;
  10146. }
  10147. }
  10148. switch (ssl->options.acceptState) {
  10149. case ACCEPT_BEGIN :
  10150. #ifdef HAVE_SECURE_RENEGOTIATION
  10151. case ACCEPT_BEGIN_RENEG:
  10152. #endif
  10153. /* get response */
  10154. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE)
  10155. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10156. WOLFSSL_ERROR(ssl->error);
  10157. return WOLFSSL_FATAL_ERROR;
  10158. }
  10159. #ifdef WOLFSSL_TLS13
  10160. ssl->options.acceptState = ACCEPT_CLIENT_HELLO_DONE;
  10161. WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
  10162. FALL_THROUGH;
  10163. case ACCEPT_CLIENT_HELLO_DONE :
  10164. if (ssl->options.tls1_3) {
  10165. return wolfSSL_accept_TLSv13(ssl);
  10166. }
  10167. #endif
  10168. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  10169. WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
  10170. FALL_THROUGH;
  10171. case ACCEPT_FIRST_REPLY_DONE :
  10172. if ( (ssl->error = SendServerHello(ssl)) != 0) {
  10173. WOLFSSL_ERROR(ssl->error);
  10174. return WOLFSSL_FATAL_ERROR;
  10175. }
  10176. ssl->options.acceptState = SERVER_HELLO_SENT;
  10177. WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
  10178. FALL_THROUGH;
  10179. case SERVER_HELLO_SENT :
  10180. #ifdef WOLFSSL_TLS13
  10181. if (ssl->options.tls1_3) {
  10182. return wolfSSL_accept_TLSv13(ssl);
  10183. }
  10184. #endif
  10185. #ifndef NO_CERTS
  10186. if (!ssl->options.resuming)
  10187. if ( (ssl->error = SendCertificate(ssl)) != 0) {
  10188. WOLFSSL_ERROR(ssl->error);
  10189. return WOLFSSL_FATAL_ERROR;
  10190. }
  10191. #endif
  10192. ssl->options.acceptState = CERT_SENT;
  10193. WOLFSSL_MSG("accept state CERT_SENT");
  10194. FALL_THROUGH;
  10195. case CERT_SENT :
  10196. #ifndef NO_CERTS
  10197. if (!ssl->options.resuming)
  10198. if ( (ssl->error = SendCertificateStatus(ssl)) != 0) {
  10199. WOLFSSL_ERROR(ssl->error);
  10200. return WOLFSSL_FATAL_ERROR;
  10201. }
  10202. #endif
  10203. ssl->options.acceptState = CERT_STATUS_SENT;
  10204. WOLFSSL_MSG("accept state CERT_STATUS_SENT");
  10205. FALL_THROUGH;
  10206. case CERT_STATUS_SENT :
  10207. #ifdef WOLFSSL_TLS13
  10208. if (ssl->options.tls1_3) {
  10209. return wolfSSL_accept_TLSv13(ssl);
  10210. }
  10211. #endif
  10212. if (!ssl->options.resuming)
  10213. if ( (ssl->error = SendServerKeyExchange(ssl)) != 0) {
  10214. WOLFSSL_ERROR(ssl->error);
  10215. return WOLFSSL_FATAL_ERROR;
  10216. }
  10217. ssl->options.acceptState = KEY_EXCHANGE_SENT;
  10218. WOLFSSL_MSG("accept state KEY_EXCHANGE_SENT");
  10219. FALL_THROUGH;
  10220. case KEY_EXCHANGE_SENT :
  10221. #ifndef NO_CERTS
  10222. if (!ssl->options.resuming) {
  10223. if (ssl->options.verifyPeer) {
  10224. if ( (ssl->error = SendCertificateRequest(ssl)) != 0) {
  10225. WOLFSSL_ERROR(ssl->error);
  10226. return WOLFSSL_FATAL_ERROR;
  10227. }
  10228. }
  10229. }
  10230. #endif
  10231. ssl->options.acceptState = CERT_REQ_SENT;
  10232. WOLFSSL_MSG("accept state CERT_REQ_SENT");
  10233. FALL_THROUGH;
  10234. case CERT_REQ_SENT :
  10235. if (!ssl->options.resuming)
  10236. if ( (ssl->error = SendServerHelloDone(ssl)) != 0) {
  10237. WOLFSSL_ERROR(ssl->error);
  10238. return WOLFSSL_FATAL_ERROR;
  10239. }
  10240. ssl->options.acceptState = SERVER_HELLO_DONE;
  10241. WOLFSSL_MSG("accept state SERVER_HELLO_DONE");
  10242. FALL_THROUGH;
  10243. case SERVER_HELLO_DONE :
  10244. if (!ssl->options.resuming) {
  10245. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  10246. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10247. WOLFSSL_ERROR(ssl->error);
  10248. return WOLFSSL_FATAL_ERROR;
  10249. }
  10250. }
  10251. ssl->options.acceptState = ACCEPT_SECOND_REPLY_DONE;
  10252. WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
  10253. FALL_THROUGH;
  10254. case ACCEPT_SECOND_REPLY_DONE :
  10255. #ifdef HAVE_SESSION_TICKET
  10256. if (ssl->options.createTicket) {
  10257. if ( (ssl->error = SendTicket(ssl)) != 0) {
  10258. WOLFSSL_ERROR(ssl->error);
  10259. return WOLFSSL_FATAL_ERROR;
  10260. }
  10261. }
  10262. #endif /* HAVE_SESSION_TICKET */
  10263. ssl->options.acceptState = TICKET_SENT;
  10264. WOLFSSL_MSG("accept state TICKET_SENT");
  10265. FALL_THROUGH;
  10266. case TICKET_SENT:
  10267. if ( (ssl->error = SendChangeCipher(ssl)) != 0) {
  10268. WOLFSSL_ERROR(ssl->error);
  10269. return WOLFSSL_FATAL_ERROR;
  10270. }
  10271. ssl->options.acceptState = CHANGE_CIPHER_SENT;
  10272. WOLFSSL_MSG("accept state CHANGE_CIPHER_SENT");
  10273. FALL_THROUGH;
  10274. case CHANGE_CIPHER_SENT :
  10275. if ( (ssl->error = SendFinished(ssl)) != 0) {
  10276. WOLFSSL_ERROR(ssl->error);
  10277. return WOLFSSL_FATAL_ERROR;
  10278. }
  10279. ssl->options.acceptState = ACCEPT_FINISHED_DONE;
  10280. WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
  10281. FALL_THROUGH;
  10282. case ACCEPT_FINISHED_DONE :
  10283. if (ssl->options.resuming)
  10284. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE)
  10285. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  10286. WOLFSSL_ERROR(ssl->error);
  10287. return WOLFSSL_FATAL_ERROR;
  10288. }
  10289. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  10290. WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
  10291. FALL_THROUGH;
  10292. case ACCEPT_THIRD_REPLY_DONE :
  10293. #ifndef NO_HANDSHAKE_DONE_CB
  10294. if (ssl->hsDoneCb) {
  10295. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  10296. if (cbret < 0) {
  10297. ssl->error = cbret;
  10298. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  10299. return WOLFSSL_FATAL_ERROR;
  10300. }
  10301. }
  10302. #endif /* NO_HANDSHAKE_DONE_CB */
  10303. if (!ssl->options.dtls) {
  10304. if (!ssl->options.keepResources) {
  10305. FreeHandshakeResources(ssl);
  10306. }
  10307. }
  10308. #ifdef WOLFSSL_DTLS
  10309. else {
  10310. ssl->options.dtlsHsRetain = 1;
  10311. }
  10312. #endif /* WOLFSSL_DTLS */
  10313. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
  10314. /* This may be necessary in async so that we don't try to
  10315. * renegotiate again */
  10316. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  10317. ssl->secure_renegotiation->startScr = 0;
  10318. }
  10319. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
  10320. #ifdef WOLFSSL_SESSION_EXPORT
  10321. if (ssl->dtls_export) {
  10322. if ((ssl->error = wolfSSL_send_session(ssl)) != 0) {
  10323. WOLFSSL_MSG("Export DTLS session error");
  10324. WOLFSSL_ERROR(ssl->error);
  10325. return WOLFSSL_FATAL_ERROR;
  10326. }
  10327. }
  10328. #endif
  10329. WOLFSSL_LEAVE("SSL_accept()", WOLFSSL_SUCCESS);
  10330. return WOLFSSL_SUCCESS;
  10331. default :
  10332. WOLFSSL_MSG("Unknown accept state ERROR");
  10333. return WOLFSSL_FATAL_ERROR;
  10334. }
  10335. #endif /* !WOLFSSL_NO_TLS12 */
  10336. }
  10337. #endif /* NO_WOLFSSL_SERVER */
  10338. #ifndef NO_HANDSHAKE_DONE_CB
  10339. int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx)
  10340. {
  10341. WOLFSSL_ENTER("wolfSSL_SetHsDoneCb");
  10342. if (ssl == NULL)
  10343. return BAD_FUNC_ARG;
  10344. ssl->hsDoneCb = cb;
  10345. ssl->hsDoneCtx = user_ctx;
  10346. return WOLFSSL_SUCCESS;
  10347. }
  10348. #endif /* NO_HANDSHAKE_DONE_CB */
  10349. WOLFSSL_ABI
  10350. int wolfSSL_Cleanup(void)
  10351. {
  10352. int ret = WOLFSSL_SUCCESS;
  10353. int release = 0;
  10354. WOLFSSL_ENTER("wolfSSL_Cleanup");
  10355. if (initRefCount == 0)
  10356. return ret; /* possibly no init yet, but not failure either way */
  10357. if (wc_LockMutex(&count_mutex) != 0) {
  10358. WOLFSSL_MSG("Bad Lock Mutex count");
  10359. return BAD_MUTEX_E;
  10360. }
  10361. release = initRefCount-- == 1;
  10362. if (initRefCount < 0)
  10363. initRefCount = 0;
  10364. wc_UnLockMutex(&count_mutex);
  10365. if (!release)
  10366. return ret;
  10367. #ifdef OPENSSL_EXTRA
  10368. if (bn_one) {
  10369. wolfSSL_BN_free(bn_one);
  10370. bn_one = NULL;
  10371. }
  10372. #endif
  10373. #ifndef NO_SESSION_CACHE
  10374. if (wc_FreeMutex(&session_mutex) != 0)
  10375. ret = BAD_MUTEX_E;
  10376. #endif
  10377. if (wc_FreeMutex(&count_mutex) != 0)
  10378. ret = BAD_MUTEX_E;
  10379. #ifdef OPENSSL_EXTRA
  10380. wolfSSL_RAND_Cleanup();
  10381. #endif
  10382. if (wolfCrypt_Cleanup() != 0) {
  10383. WOLFSSL_MSG("Error with wolfCrypt_Cleanup call");
  10384. ret = WC_CLEANUP_E;
  10385. }
  10386. return ret;
  10387. }
  10388. #ifndef NO_SESSION_CACHE
  10389. /* some session IDs aren't random after all, let's make them random */
  10390. static WC_INLINE word32 HashSession(const byte* sessionID, word32 len, int* error)
  10391. {
  10392. byte digest[WC_MAX_DIGEST_SIZE];
  10393. #ifndef NO_MD5
  10394. *error = wc_Md5Hash(sessionID, len, digest);
  10395. #elif !defined(NO_SHA)
  10396. *error = wc_ShaHash(sessionID, len, digest);
  10397. #elif !defined(NO_SHA256)
  10398. *error = wc_Sha256Hash(sessionID, len, digest);
  10399. #else
  10400. #error "We need a digest to hash the session IDs"
  10401. #endif
  10402. return *error == 0 ? MakeWordFromHash(digest) : 0; /* 0 on failure */
  10403. }
  10404. WOLFSSL_ABI
  10405. void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm)
  10406. {
  10407. /* static table now, no flushing needed */
  10408. (void)ctx;
  10409. (void)tm;
  10410. }
  10411. /* set ssl session timeout in seconds */
  10412. WOLFSSL_ABI
  10413. int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to)
  10414. {
  10415. if (ssl == NULL)
  10416. return BAD_FUNC_ARG;
  10417. if (to == 0)
  10418. to = WOLFSSL_SESSION_TIMEOUT;
  10419. ssl->timeout = to;
  10420. return WOLFSSL_SUCCESS;
  10421. }
  10422. /* set ctx session timeout in seconds */
  10423. WOLFSSL_ABI
  10424. int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to)
  10425. {
  10426. if (ctx == NULL)
  10427. return BAD_FUNC_ARG;
  10428. if (to == 0)
  10429. to = WOLFSSL_SESSION_TIMEOUT;
  10430. ctx->timeout = to;
  10431. return WOLFSSL_SUCCESS;
  10432. }
  10433. #ifndef NO_CLIENT_CACHE
  10434. /* Get Session from Client cache based on id/len, return NULL on failure */
  10435. WOLFSSL_SESSION* GetSessionClient(WOLFSSL* ssl, const byte* id, int len)
  10436. {
  10437. WOLFSSL_SESSION* ret = NULL;
  10438. word32 row;
  10439. int idx;
  10440. int count;
  10441. int error = 0;
  10442. WOLFSSL_ENTER("GetSessionClient");
  10443. if (ssl->ctx->sessionCacheOff)
  10444. return NULL;
  10445. if (ssl->options.side == WOLFSSL_SERVER_END)
  10446. return NULL;
  10447. len = min(SERVER_ID_LEN, (word32)len);
  10448. #ifdef HAVE_EXT_CACHE
  10449. if (ssl->ctx->get_sess_cb != NULL) {
  10450. int copy = 0;
  10451. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, len, &copy);
  10452. if (ret != NULL)
  10453. return ret;
  10454. }
  10455. if (ssl->ctx->internalCacheOff)
  10456. return NULL;
  10457. #endif
  10458. row = HashSession(id, len, &error) % SESSION_ROWS;
  10459. if (error != 0) {
  10460. WOLFSSL_MSG("Hash session failed");
  10461. return NULL;
  10462. }
  10463. if (wc_LockMutex(&session_mutex) != 0) {
  10464. WOLFSSL_MSG("Lock session mutex failed");
  10465. return NULL;
  10466. }
  10467. /* start from most recently used */
  10468. count = min((word32)ClientCache[row].totalCount, SESSIONS_PER_ROW);
  10469. idx = ClientCache[row].nextIdx - 1;
  10470. if (idx < 0)
  10471. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  10472. for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
  10473. WOLFSSL_SESSION* current;
  10474. ClientSession clSess;
  10475. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  10476. WOLFSSL_MSG("Bad idx");
  10477. break;
  10478. }
  10479. clSess = ClientCache[row].Clients[idx];
  10480. current = &SessionCache[clSess.serverRow].Sessions[clSess.serverIdx];
  10481. if (XMEMCMP(current->serverID, id, len) == 0) {
  10482. WOLFSSL_MSG("Found a serverid match for client");
  10483. if (LowResTimer() < (current->bornOn + current->timeout)) {
  10484. WOLFSSL_MSG("Session valid");
  10485. ret = current;
  10486. break;
  10487. } else {
  10488. WOLFSSL_MSG("Session timed out"); /* could have more for id */
  10489. }
  10490. } else {
  10491. WOLFSSL_MSG("ServerID not a match from client table");
  10492. }
  10493. }
  10494. wc_UnLockMutex(&session_mutex);
  10495. return ret;
  10496. }
  10497. #endif /* NO_CLIENT_CACHE */
  10498. /* Restore the master secret and session information for certificates.
  10499. *
  10500. * ssl The SSL/TLS object.
  10501. * session The cached session to restore.
  10502. * masterSecret The master secret from the cached session.
  10503. * restoreSessionCerts Restoring session certificates is required.
  10504. */
  10505. static WC_INLINE void RestoreSession(WOLFSSL* ssl, WOLFSSL_SESSION* session,
  10506. byte* masterSecret, byte restoreSessionCerts)
  10507. {
  10508. (void)ssl;
  10509. (void)restoreSessionCerts;
  10510. if (masterSecret)
  10511. XMEMCPY(masterSecret, session->masterSecret, SECRET_LEN);
  10512. #ifdef SESSION_CERTS
  10513. /* If set, we should copy the session certs into the ssl object
  10514. * from the session we are returning so we can resume */
  10515. if (restoreSessionCerts) {
  10516. ssl->session.chain = session->chain;
  10517. ssl->session.version = session->version;
  10518. #ifdef NO_RESUME_SUITE_CHECK
  10519. ssl->session.cipherSuite0 = session->cipherSuite0;
  10520. ssl->session.cipherSuite = session->cipherSuite;
  10521. #endif
  10522. }
  10523. #endif /* SESSION_CERTS */
  10524. #if !defined(NO_RESUME_SUITE_CHECK) || \
  10525. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  10526. ssl->session.cipherSuite0 = session->cipherSuite0;
  10527. ssl->session.cipherSuite = session->cipherSuite;
  10528. #endif
  10529. }
  10530. WOLFSSL_SESSION* GetSession(WOLFSSL* ssl, byte* masterSecret,
  10531. byte restoreSessionCerts)
  10532. {
  10533. WOLFSSL_SESSION* ret = 0;
  10534. const byte* id = NULL;
  10535. word32 row;
  10536. int idx;
  10537. int count;
  10538. int error = 0;
  10539. (void) restoreSessionCerts;
  10540. if (ssl->options.sessionCacheOff)
  10541. return NULL;
  10542. if (ssl->options.haveSessionId == 0)
  10543. return NULL;
  10544. #ifdef HAVE_SESSION_TICKET
  10545. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  10546. return NULL;
  10547. #endif
  10548. if (!ssl->options.tls1_3 && ssl->arrays != NULL)
  10549. id = ssl->arrays->sessionID;
  10550. else
  10551. id = ssl->session.sessionID;
  10552. #ifdef HAVE_EXT_CACHE
  10553. if (ssl->ctx->get_sess_cb != NULL) {
  10554. int copy = 0;
  10555. /* Attempt to retrieve the session from the external cache. */
  10556. ret = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, &copy);
  10557. if (ret != NULL) {
  10558. RestoreSession(ssl, ret, masterSecret, restoreSessionCerts);
  10559. return ret;
  10560. }
  10561. }
  10562. if (ssl->ctx->internalCacheOff)
  10563. return NULL;
  10564. #endif
  10565. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  10566. if (error != 0) {
  10567. WOLFSSL_MSG("Hash session failed");
  10568. return NULL;
  10569. }
  10570. if (wc_LockMutex(&session_mutex) != 0)
  10571. return 0;
  10572. /* start from most recently used */
  10573. count = min((word32)SessionCache[row].totalCount, SESSIONS_PER_ROW);
  10574. idx = SessionCache[row].nextIdx - 1;
  10575. if (idx < 0)
  10576. idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */
  10577. for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
  10578. WOLFSSL_SESSION* current;
  10579. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  10580. WOLFSSL_MSG("Bad idx");
  10581. break;
  10582. }
  10583. current = &SessionCache[row].Sessions[idx];
  10584. if (XMEMCMP(current->sessionID, id, ID_LEN) == 0) {
  10585. WOLFSSL_MSG("Found a session match");
  10586. if (LowResTimer() < (current->bornOn + current->timeout)) {
  10587. WOLFSSL_MSG("Session valid");
  10588. ret = current;
  10589. RestoreSession(ssl, ret, masterSecret, restoreSessionCerts);
  10590. } else {
  10591. WOLFSSL_MSG("Session timed out");
  10592. }
  10593. break; /* no more sessionIDs whether valid or not that match */
  10594. } else {
  10595. WOLFSSL_MSG("SessionID not a match at this idx");
  10596. }
  10597. }
  10598. wc_UnLockMutex(&session_mutex);
  10599. return ret;
  10600. }
  10601. static int GetDeepCopySession(WOLFSSL* ssl, WOLFSSL_SESSION* copyFrom)
  10602. {
  10603. WOLFSSL_SESSION* copyInto = &ssl->session;
  10604. void* tmpBuff = NULL;
  10605. int ticketLen = 0;
  10606. int doDynamicCopy = 0;
  10607. int ret = WOLFSSL_SUCCESS;
  10608. (void)ticketLen;
  10609. (void)doDynamicCopy;
  10610. (void)tmpBuff;
  10611. if (!ssl || !copyFrom)
  10612. return BAD_FUNC_ARG;
  10613. #ifdef HAVE_SESSION_TICKET
  10614. /* Free old dynamic ticket if we had one to avoid leak */
  10615. if (copyInto->isDynamic) {
  10616. XFREE(copyInto->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10617. copyInto->ticket = copyInto->staticTicket;
  10618. copyInto->isDynamic = 0;
  10619. }
  10620. #endif
  10621. if (wc_LockMutex(&session_mutex) != 0)
  10622. return BAD_MUTEX_E;
  10623. #ifdef HAVE_SESSION_TICKET
  10624. /* Size of ticket to alloc if needed; Use later for alloc outside lock */
  10625. doDynamicCopy = copyFrom->isDynamic;
  10626. ticketLen = copyFrom->ticketLen;
  10627. #endif
  10628. *copyInto = *copyFrom;
  10629. /* Default ticket to non dynamic. This will avoid crash if we fail below */
  10630. #ifdef HAVE_SESSION_TICKET
  10631. copyInto->ticket = copyInto->staticTicket;
  10632. copyInto->isDynamic = 0;
  10633. #endif
  10634. #ifndef NO_RESUME_SUITE_CHECK
  10635. copyInto->cipherSuite0 = copyFrom->cipherSuite0;
  10636. copyInto->cipherSuite = copyFrom->cipherSuite;
  10637. #endif
  10638. if (wc_UnLockMutex(&session_mutex) != 0) {
  10639. return BAD_MUTEX_E;
  10640. }
  10641. #ifdef HAVE_SESSION_TICKET
  10642. #ifdef WOLFSSL_TLS13
  10643. if (wc_LockMutex(&session_mutex) != 0) {
  10644. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10645. return BAD_MUTEX_E;
  10646. }
  10647. #ifdef NO_RESUME_SUITE_CHECK
  10648. copyInto->cipherSuite0 = copyFrom->cipherSuite0;
  10649. copyInto->cipherSuite = copyFrom->cipherSuite;
  10650. #endif
  10651. copyInto->namedGroup = copyFrom->namedGroup;
  10652. copyInto->ticketSeen = copyFrom->ticketSeen;
  10653. copyInto->ticketAdd = copyFrom->ticketAdd;
  10654. XMEMCPY(&copyInto->ticketNonce, &copyFrom->ticketNonce,
  10655. sizeof(TicketNonce));
  10656. #ifdef WOLFSSL_EARLY_DATA
  10657. copyInto->maxEarlyDataSz = copyFrom->maxEarlyDataSz;
  10658. #endif
  10659. XMEMCPY(copyInto->masterSecret, copyFrom->masterSecret, SECRET_LEN);
  10660. if (wc_UnLockMutex(&session_mutex) != 0) {
  10661. if (ret == WOLFSSL_SUCCESS)
  10662. ret = BAD_MUTEX_E;
  10663. }
  10664. #endif
  10665. /* If doing dynamic copy, need to alloc outside lock, then inside a lock
  10666. * confirm the size still matches and memcpy */
  10667. if (doDynamicCopy) {
  10668. tmpBuff = (byte*)XMALLOC(ticketLen, ssl->heap,
  10669. DYNAMIC_TYPE_SESSION_TICK);
  10670. if (!tmpBuff)
  10671. return MEMORY_ERROR;
  10672. if (wc_LockMutex(&session_mutex) != 0) {
  10673. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10674. return BAD_MUTEX_E;
  10675. }
  10676. if ((word16)ticketLen != copyFrom->ticketLen) {
  10677. /* Another thread modified the ssl-> session ticket during alloc.
  10678. * Treat as error, since ticket different than when copy requested */
  10679. ret = VAR_STATE_CHANGE_E;
  10680. }
  10681. if (ret == WOLFSSL_SUCCESS) {
  10682. copyInto->ticket = (byte*)tmpBuff;
  10683. copyInto->isDynamic = 1;
  10684. XMEMCPY(copyInto->ticket, copyFrom->ticket, ticketLen);
  10685. }
  10686. } else {
  10687. /* Need to ensure ticket pointer gets updated to own buffer
  10688. * and is not pointing to buff of session copied from */
  10689. copyInto->ticket = copyInto->staticTicket;
  10690. }
  10691. if (doDynamicCopy) {
  10692. if (wc_UnLockMutex(&session_mutex) != 0) {
  10693. if (ret == WOLFSSL_SUCCESS)
  10694. ret = BAD_MUTEX_E;
  10695. }
  10696. }
  10697. if (ret != WOLFSSL_SUCCESS) {
  10698. /* cleanup */
  10699. if (tmpBuff)
  10700. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10701. copyInto->ticket = copyInto->staticTicket;
  10702. copyInto->isDynamic = 0;
  10703. }
  10704. #endif /* HAVE_SESSION_TICKET */
  10705. return ret;
  10706. }
  10707. int SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session)
  10708. {
  10709. if (ssl->options.sessionCacheOff)
  10710. return WOLFSSL_FAILURE;
  10711. #ifdef OPENSSL_EXTRA
  10712. /* check for application context id */
  10713. if (ssl->sessionCtxSz > 0) {
  10714. if (XMEMCMP(ssl->sessionCtx, session->sessionCtx, ssl->sessionCtxSz)) {
  10715. /* context id did not match! */
  10716. WOLFSSL_MSG("Session context did not match");
  10717. return SSL_FAILURE;
  10718. }
  10719. }
  10720. #endif /* OPENSSL_EXTRA */
  10721. if (LowResTimer() < (session->bornOn + session->timeout)) {
  10722. int ret = GetDeepCopySession(ssl, session);
  10723. if (ret == WOLFSSL_SUCCESS) {
  10724. ssl->options.resuming = 1;
  10725. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  10726. defined(HAVE_SESSION_TICKET))
  10727. ssl->version = session->version;
  10728. #endif
  10729. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  10730. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  10731. ssl->options.cipherSuite0 = session->cipherSuite0;
  10732. ssl->options.cipherSuite = session->cipherSuite;
  10733. #endif
  10734. }
  10735. return ret;
  10736. }
  10737. return WOLFSSL_FAILURE; /* session timed out */
  10738. }
  10739. #ifdef WOLFSSL_SESSION_STATS
  10740. static int get_locked_session_stats(word32* active, word32* total,
  10741. word32* peak);
  10742. #endif
  10743. int AddSession(WOLFSSL* ssl)
  10744. {
  10745. word32 row = 0;
  10746. word32 idx = 0;
  10747. int error = 0;
  10748. const byte* id = NULL;
  10749. #ifdef HAVE_SESSION_TICKET
  10750. byte* tmpBuff = NULL;
  10751. int ticLen = 0;
  10752. #endif
  10753. WOLFSSL_SESSION* session;
  10754. int i;
  10755. int overwrite = 0;
  10756. if (ssl->options.sessionCacheOff)
  10757. return 0;
  10758. if (ssl->options.haveSessionId == 0)
  10759. return 0;
  10760. #ifdef HAVE_SESSION_TICKET
  10761. if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1)
  10762. return 0;
  10763. #endif
  10764. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  10765. if (ssl->options.tls1_3)
  10766. id = ssl->session.sessionID;
  10767. else
  10768. #endif
  10769. if (ssl->arrays)
  10770. id = ssl->arrays->sessionID;
  10771. if (id == NULL) {
  10772. return BAD_FUNC_ARG;
  10773. }
  10774. #ifdef HAVE_SESSION_TICKET
  10775. ticLen = ssl->session.ticketLen;
  10776. /* Alloc Memory here so if Malloc fails can exit outside of lock */
  10777. if (ticLen > SESSION_TICKET_LEN) {
  10778. tmpBuff = (byte*)XMALLOC(ticLen, ssl->heap,
  10779. DYNAMIC_TYPE_SESSION_TICK);
  10780. if(!tmpBuff)
  10781. return MEMORY_E;
  10782. }
  10783. #endif
  10784. #ifdef HAVE_EXT_CACHE
  10785. if (ssl->options.internalCacheOff) {
  10786. /* Create a new session object to be stored. */
  10787. session = wolfSSL_SESSION_new();
  10788. if (session == NULL) {
  10789. #ifdef HAVE_SESSION_TICKET
  10790. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10791. #endif
  10792. return MEMORY_E;
  10793. }
  10794. }
  10795. else
  10796. #endif
  10797. {
  10798. /* Use the session object in the cache for external cache if required.
  10799. */
  10800. row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
  10801. if (error != 0) {
  10802. WOLFSSL_MSG("Hash session failed");
  10803. #ifdef HAVE_SESSION_TICKET
  10804. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10805. #endif
  10806. return error;
  10807. }
  10808. if (wc_LockMutex(&session_mutex) != 0) {
  10809. #ifdef HAVE_SESSION_TICKET
  10810. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10811. #endif
  10812. return BAD_MUTEX_E;
  10813. }
  10814. for (i=0; i<SESSIONS_PER_ROW; i++) {
  10815. if (XMEMCMP(id, SessionCache[row].Sessions[i].sessionID, ID_LEN) == 0) {
  10816. WOLFSSL_MSG("Session already exists. Overwriting.");
  10817. overwrite = 1;
  10818. idx = i;
  10819. break;
  10820. }
  10821. }
  10822. if (!overwrite) {
  10823. idx = SessionCache[row].nextIdx++;
  10824. }
  10825. #ifdef SESSION_INDEX
  10826. ssl->sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx;
  10827. #endif
  10828. session = &SessionCache[row].Sessions[idx];
  10829. }
  10830. #ifdef WOLFSSL_TLS13
  10831. if (ssl->options.tls1_3) {
  10832. XMEMCPY(session->masterSecret, ssl->session.masterSecret, SECRET_LEN);
  10833. session->sessionIDSz = ID_LEN;
  10834. }
  10835. else
  10836. #endif
  10837. {
  10838. XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN);
  10839. session->sessionIDSz = ssl->arrays->sessionIDSz;
  10840. }
  10841. XMEMCPY(session->sessionID, id, ID_LEN);
  10842. session->haveEMS = ssl->options.haveEMS;
  10843. #ifdef OPENSSL_EXTRA
  10844. /* If using compatibility layer then check for and copy over session context
  10845. * id. */
  10846. if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) {
  10847. XMEMCPY(session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz);
  10848. }
  10849. #endif
  10850. session->timeout = ssl->timeout;
  10851. session->bornOn = LowResTimer();
  10852. #ifdef HAVE_SESSION_TICKET
  10853. /* Check if another thread modified ticket since alloc */
  10854. if ((word16)ticLen != ssl->session.ticketLen) {
  10855. error = VAR_STATE_CHANGE_E;
  10856. }
  10857. if (error == 0) {
  10858. /* Cleanup cache row's old Dynamic buff if exists */
  10859. if (session->isDynamic) {
  10860. XFREE(session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10861. session->ticket = NULL;
  10862. }
  10863. /* If too large to store in static buffer, use dyn buffer */
  10864. if (ticLen > SESSION_TICKET_LEN) {
  10865. session->ticket = tmpBuff;
  10866. session->isDynamic = 1;
  10867. } else {
  10868. session->ticket = session->staticTicket;
  10869. session->isDynamic = 0;
  10870. }
  10871. session->ticketLen = (word16)ticLen;
  10872. XMEMCPY(session->ticket, ssl->session.ticket, ticLen);
  10873. } else { /* cleanup, reset state */
  10874. session->ticket = session->staticTicket;
  10875. session->isDynamic = 0;
  10876. session->ticketLen = 0;
  10877. if (tmpBuff) {
  10878. XFREE(tmpBuff, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  10879. tmpBuff = NULL;
  10880. }
  10881. }
  10882. #endif
  10883. #ifdef SESSION_CERTS
  10884. if (error == 0) {
  10885. if (!overwrite || ssl->session.chain.count > 0) {
  10886. /*
  10887. * If we are overwriting and no certs present in ssl->session.chain
  10888. * then keep the old chain.
  10889. */
  10890. session->chain.count = ssl->session.chain.count;
  10891. XMEMCPY(session->chain.certs, ssl->session.chain.certs,
  10892. sizeof(x509_buffer) * session->chain.count);
  10893. }
  10894. }
  10895. #endif /* SESSION_CERTS */
  10896. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  10897. defined(HAVE_SESSION_TICKET))
  10898. if (error == 0) {
  10899. session->version = ssl->version;
  10900. }
  10901. #endif /* SESSION_CERTS || (WOLFSSL_TLS13 & HAVE_SESSION_TICKET) */
  10902. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  10903. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  10904. if (error == 0) {
  10905. session->cipherSuite0 = ssl->options.cipherSuite0;
  10906. session->cipherSuite = ssl->options.cipherSuite;
  10907. }
  10908. #endif
  10909. #if defined(WOLFSSL_TLS13)
  10910. if (error == 0) {
  10911. session->namedGroup = ssl->session.namedGroup;
  10912. }
  10913. #endif
  10914. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  10915. if (error == 0) {
  10916. session->ticketSeen = ssl->session.ticketSeen;
  10917. session->ticketAdd = ssl->session.ticketAdd;
  10918. XMEMCPY(&session->ticketNonce, &ssl->session.ticketNonce,
  10919. sizeof(TicketNonce));
  10920. #ifdef WOLFSSL_EARLY_DATA
  10921. session->maxEarlyDataSz = ssl->session.maxEarlyDataSz;
  10922. #endif
  10923. }
  10924. #endif /* WOLFSSL_TLS13 && HAVE_SESSION_TICKET */
  10925. #ifdef HAVE_EXT_CACHE
  10926. if (!ssl->options.internalCacheOff)
  10927. #endif
  10928. {
  10929. if (error == 0) {
  10930. SessionCache[row].totalCount++;
  10931. if (SessionCache[row].nextIdx == SESSIONS_PER_ROW)
  10932. SessionCache[row].nextIdx = 0;
  10933. }
  10934. }
  10935. #ifndef NO_CLIENT_CACHE
  10936. if (error == 0) {
  10937. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->session.idLen) {
  10938. word32 clientRow, clientIdx;
  10939. WOLFSSL_MSG("Adding client cache entry");
  10940. session->idLen = ssl->session.idLen;
  10941. XMEMCPY(session->serverID, ssl->session.serverID,
  10942. ssl->session.idLen);
  10943. #ifdef HAVE_EXT_CACHE
  10944. if (!ssl->options.internalCacheOff)
  10945. #endif
  10946. {
  10947. clientRow = HashSession(ssl->session.serverID,
  10948. ssl->session.idLen, &error) % SESSION_ROWS;
  10949. if (error != 0) {
  10950. WOLFSSL_MSG("Hash session failed");
  10951. } else {
  10952. clientIdx = ClientCache[clientRow].nextIdx++;
  10953. ClientCache[clientRow].Clients[clientIdx].serverRow =
  10954. (word16)row;
  10955. ClientCache[clientRow].Clients[clientIdx].serverIdx =
  10956. (word16)idx;
  10957. ClientCache[clientRow].totalCount++;
  10958. if (ClientCache[clientRow].nextIdx == SESSIONS_PER_ROW)
  10959. ClientCache[clientRow].nextIdx = 0;
  10960. }
  10961. }
  10962. }
  10963. else
  10964. session->idLen = 0;
  10965. }
  10966. #endif /* NO_CLIENT_CACHE */
  10967. #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS)
  10968. #ifdef HAVE_EXT_CACHE
  10969. if (!ssl->options.internalCacheOff)
  10970. #endif
  10971. {
  10972. if (error == 0) {
  10973. word32 active = 0;
  10974. error = get_locked_session_stats(&active, NULL, NULL);
  10975. if (error == WOLFSSL_SUCCESS) {
  10976. error = 0; /* back to this function ok */
  10977. if (active > PeakSessions)
  10978. PeakSessions = active;
  10979. }
  10980. }
  10981. }
  10982. #endif /* defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) */
  10983. #ifdef HAVE_EXT_CACHE
  10984. if (!ssl->options.internalCacheOff)
  10985. #endif
  10986. {
  10987. if (wc_UnLockMutex(&session_mutex) != 0)
  10988. return BAD_MUTEX_E;
  10989. }
  10990. #ifdef HAVE_EXT_CACHE
  10991. if (error == 0 && ssl->ctx->new_sess_cb != NULL)
  10992. ssl->ctx->new_sess_cb(ssl, session);
  10993. if (ssl->options.internalCacheOff)
  10994. wolfSSL_SESSION_free(session);
  10995. #endif
  10996. return error;
  10997. }
  10998. #ifdef SESSION_INDEX
  10999. int wolfSSL_GetSessionIndex(WOLFSSL* ssl)
  11000. {
  11001. WOLFSSL_ENTER("wolfSSL_GetSessionIndex");
  11002. WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex);
  11003. return ssl->sessionIndex;
  11004. }
  11005. int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session)
  11006. {
  11007. int row, col, result = WOLFSSL_FAILURE;
  11008. WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex");
  11009. row = idx >> SESSIDX_ROW_SHIFT;
  11010. col = idx & SESSIDX_IDX_MASK;
  11011. if (wc_LockMutex(&session_mutex) != 0) {
  11012. return BAD_MUTEX_E;
  11013. }
  11014. if (row < SESSION_ROWS &&
  11015. col < (int)min(SessionCache[row].totalCount, SESSIONS_PER_ROW)) {
  11016. XMEMCPY(session,
  11017. &SessionCache[row].Sessions[col], sizeof(WOLFSSL_SESSION));
  11018. result = WOLFSSL_SUCCESS;
  11019. }
  11020. if (wc_UnLockMutex(&session_mutex) != 0)
  11021. result = BAD_MUTEX_E;
  11022. WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result);
  11023. return result;
  11024. }
  11025. #endif /* SESSION_INDEX */
  11026. #if defined(SESSION_CERTS)
  11027. WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session)
  11028. {
  11029. WOLFSSL_X509_CHAIN* chain = NULL;
  11030. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  11031. if (session)
  11032. chain = &session->chain;
  11033. WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0);
  11034. return chain;
  11035. }
  11036. #ifdef OPENSSL_EXTRA
  11037. /* gets the peer certificate associated with the session passed in
  11038. * returns null on failure, the caller should not free the returned pointer */
  11039. WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session)
  11040. {
  11041. WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain");
  11042. if (session) {
  11043. int count;
  11044. count = wolfSSL_get_chain_count(&session->chain);
  11045. if (count < 1 || count >= MAX_CHAIN_DEPTH) {
  11046. WOLFSSL_MSG("bad count found");
  11047. return NULL;
  11048. }
  11049. if (session->peer == NULL) {
  11050. session->peer = wolfSSL_get_chain_X509(&session->chain, 0);
  11051. }
  11052. return session->peer;
  11053. }
  11054. WOLFSSL_MSG("No session passed in");
  11055. return NULL;
  11056. }
  11057. #endif /* OPENSSL_EXTRA */
  11058. #endif /* SESSION_INDEX && SESSION_CERTS */
  11059. #ifdef WOLFSSL_SESSION_STATS
  11060. /* requires session_mutex lock held, WOLFSSL_SUCCESS on ok */
  11061. static int get_locked_session_stats(word32* active, word32* total, word32* peak)
  11062. {
  11063. int result = WOLFSSL_SUCCESS;
  11064. int i;
  11065. int count;
  11066. int idx;
  11067. word32 now = 0;
  11068. word32 seen = 0;
  11069. word32 ticks = LowResTimer();
  11070. (void)peak;
  11071. WOLFSSL_ENTER("get_locked_session_stats");
  11072. for (i = 0; i < SESSION_ROWS; i++) {
  11073. seen += SessionCache[i].totalCount;
  11074. if (active == NULL)
  11075. continue; /* no need to calculate what we can't set */
  11076. count = min((word32)SessionCache[i].totalCount, SESSIONS_PER_ROW);
  11077. idx = SessionCache[i].nextIdx - 1;
  11078. if (idx < 0)
  11079. idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */
  11080. for (; count > 0; --count, idx = idx ? idx - 1 : SESSIONS_PER_ROW - 1) {
  11081. if (idx >= SESSIONS_PER_ROW || idx < 0) { /* sanity check */
  11082. WOLFSSL_MSG("Bad idx");
  11083. break;
  11084. }
  11085. /* if not expired then good */
  11086. if (ticks < (SessionCache[i].Sessions[idx].bornOn +
  11087. SessionCache[i].Sessions[idx].timeout) ) {
  11088. now++;
  11089. }
  11090. }
  11091. }
  11092. if (active)
  11093. *active = now;
  11094. if (total)
  11095. *total = seen;
  11096. #ifdef WOLFSSL_PEAK_SESSIONS
  11097. if (peak)
  11098. *peak = PeakSessions;
  11099. #endif
  11100. WOLFSSL_LEAVE("get_locked_session_stats", result);
  11101. return result;
  11102. }
  11103. /* return WOLFSSL_SUCCESS on ok */
  11104. int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak,
  11105. word32* maxSessions)
  11106. {
  11107. int result = WOLFSSL_SUCCESS;
  11108. WOLFSSL_ENTER("wolfSSL_get_session_stats");
  11109. if (maxSessions) {
  11110. *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS;
  11111. if (active == NULL && total == NULL && peak == NULL)
  11112. return result; /* we're done */
  11113. }
  11114. /* user must provide at least one query value */
  11115. if (active == NULL && total == NULL && peak == NULL)
  11116. return BAD_FUNC_ARG;
  11117. if (wc_LockMutex(&session_mutex) != 0) {
  11118. return BAD_MUTEX_E;
  11119. }
  11120. result = get_locked_session_stats(active, total, peak);
  11121. if (wc_UnLockMutex(&session_mutex) != 0)
  11122. result = BAD_MUTEX_E;
  11123. WOLFSSL_LEAVE("wolfSSL_get_session_stats", result);
  11124. return result;
  11125. }
  11126. #endif /* WOLFSSL_SESSION_STATS */
  11127. #ifdef PRINT_SESSION_STATS
  11128. /* WOLFSSL_SUCCESS on ok */
  11129. int wolfSSL_PrintSessionStats(void)
  11130. {
  11131. word32 totalSessionsSeen = 0;
  11132. word32 totalSessionsNow = 0;
  11133. word32 peak = 0;
  11134. word32 maxSessions = 0;
  11135. int i;
  11136. int ret;
  11137. double E; /* expected freq */
  11138. double chiSquare = 0;
  11139. ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen,
  11140. &peak, &maxSessions);
  11141. if (ret != WOLFSSL_SUCCESS)
  11142. return ret;
  11143. printf("Total Sessions Seen = %d\n", totalSessionsSeen);
  11144. printf("Total Sessions Now = %d\n", totalSessionsNow);
  11145. #ifdef WOLFSSL_PEAK_SESSIONS
  11146. printf("Peak Sessions = %d\n", peak);
  11147. #endif
  11148. printf("Max Sessions = %d\n", maxSessions);
  11149. E = (double)totalSessionsSeen / SESSION_ROWS;
  11150. for (i = 0; i < SESSION_ROWS; i++) {
  11151. double diff = SessionCache[i].totalCount - E;
  11152. diff *= diff; /* square */
  11153. diff /= E; /* normalize */
  11154. chiSquare += diff;
  11155. }
  11156. printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare,
  11157. SESSION_ROWS - 1);
  11158. #if (SESSION_ROWS == 11)
  11159. printf(" .05 p value = 18.3, chi-square should be less\n");
  11160. #elif (SESSION_ROWS == 211)
  11161. printf(".05 p value = 244.8, chi-square should be less\n");
  11162. #elif (SESSION_ROWS == 5981)
  11163. printf(".05 p value = 6161.0, chi-square should be less\n");
  11164. #elif (SESSION_ROWS == 3)
  11165. printf(".05 p value = 6.0, chi-square should be less\n");
  11166. #elif (SESSION_ROWS == 2861)
  11167. printf(".05 p value = 2985.5, chi-square should be less\n");
  11168. #endif
  11169. printf("\n");
  11170. return ret;
  11171. }
  11172. #endif /* SESSION_STATS */
  11173. #else /* NO_SESSION_CACHE */
  11174. /* No session cache version */
  11175. WOLFSSL_SESSION* GetSession(WOLFSSL* ssl, byte* masterSecret,
  11176. byte restoreSessionCerts)
  11177. {
  11178. (void)ssl;
  11179. (void)masterSecret;
  11180. (void)restoreSessionCerts;
  11181. return NULL;
  11182. }
  11183. #endif /* NO_SESSION_CACHE */
  11184. /* call before SSL_connect, if verifying will add name check to
  11185. date check and signature check */
  11186. WOLFSSL_ABI
  11187. int wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)
  11188. {
  11189. WOLFSSL_ENTER("wolfSSL_check_domain_name");
  11190. if (ssl == NULL || dn == NULL) {
  11191. WOLFSSL_MSG("Bad function argument: NULL");
  11192. return WOLFSSL_FAILURE;
  11193. }
  11194. if (ssl->buffers.domainName.buffer)
  11195. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  11196. ssl->buffers.domainName.length = (word32)XSTRLEN(dn);
  11197. ssl->buffers.domainName.buffer = (byte*)XMALLOC(
  11198. ssl->buffers.domainName.length + 1, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  11199. if (ssl->buffers.domainName.buffer) {
  11200. unsigned char* domainName = ssl->buffers.domainName.buffer;
  11201. XMEMCPY(domainName, dn, ssl->buffers.domainName.length);
  11202. domainName[ssl->buffers.domainName.length] = '\0';
  11203. return WOLFSSL_SUCCESS;
  11204. }
  11205. else {
  11206. ssl->error = MEMORY_ERROR;
  11207. return WOLFSSL_FAILURE;
  11208. }
  11209. }
  11210. /* turn on wolfSSL zlib compression
  11211. returns WOLFSSL_SUCCESS for success, else error (not built in)
  11212. */
  11213. int wolfSSL_set_compression(WOLFSSL* ssl)
  11214. {
  11215. WOLFSSL_ENTER("wolfSSL_set_compression");
  11216. (void)ssl;
  11217. #ifdef HAVE_LIBZ
  11218. ssl->options.usingCompression = 1;
  11219. return WOLFSSL_SUCCESS;
  11220. #else
  11221. return NOT_COMPILED_IN;
  11222. #endif
  11223. }
  11224. #ifndef USE_WINDOWS_API
  11225. #ifndef NO_WRITEV
  11226. /* simulate writev semantics, doesn't actually do block at a time though
  11227. because of SSL_write behavior and because front adds may be small */
  11228. int wolfSSL_writev(WOLFSSL* ssl, const struct iovec* iov, int iovcnt)
  11229. {
  11230. #ifdef WOLFSSL_SMALL_STACK
  11231. byte staticBuffer[1]; /* force heap usage */
  11232. #else
  11233. byte staticBuffer[FILE_BUFFER_SIZE];
  11234. #endif
  11235. byte* myBuffer = staticBuffer;
  11236. int dynamic = 0;
  11237. int sending = 0;
  11238. int idx = 0;
  11239. int i;
  11240. int ret;
  11241. WOLFSSL_ENTER("wolfSSL_writev");
  11242. for (i = 0; i < iovcnt; i++)
  11243. sending += (int)iov[i].iov_len;
  11244. if (sending > (int)sizeof(staticBuffer)) {
  11245. myBuffer = (byte*)XMALLOC(sending, ssl->heap,
  11246. DYNAMIC_TYPE_WRITEV);
  11247. if (!myBuffer)
  11248. return MEMORY_ERROR;
  11249. dynamic = 1;
  11250. }
  11251. for (i = 0; i < iovcnt; i++) {
  11252. XMEMCPY(&myBuffer[idx], iov[i].iov_base, iov[i].iov_len);
  11253. idx += (int)iov[i].iov_len;
  11254. }
  11255. ret = wolfSSL_write(ssl, myBuffer, sending);
  11256. if (dynamic)
  11257. XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV);
  11258. return ret;
  11259. }
  11260. #endif
  11261. #endif
  11262. #ifdef WOLFSSL_CALLBACKS
  11263. typedef struct itimerval Itimerval;
  11264. /* don't keep calling simple functions while setting up timer and signals
  11265. if no inlining these are the next best */
  11266. #define AddTimes(a, b, c) \
  11267. do { \
  11268. c.tv_sec = a.tv_sec + b.tv_sec; \
  11269. c.tv_usec = a.tv_usec + b.tv_usec; \
  11270. if (c.tv_usec >= 1000000) { \
  11271. c.tv_sec++; \
  11272. c.tv_usec -= 1000000; \
  11273. } \
  11274. } while (0)
  11275. #define SubtractTimes(a, b, c) \
  11276. do { \
  11277. c.tv_sec = a.tv_sec - b.tv_sec; \
  11278. c.tv_usec = a.tv_usec - b.tv_usec; \
  11279. if (c.tv_usec < 0) { \
  11280. c.tv_sec--; \
  11281. c.tv_usec += 1000000; \
  11282. } \
  11283. } while (0)
  11284. #define CmpTimes(a, b, cmp) \
  11285. ((a.tv_sec == b.tv_sec) ? \
  11286. (a.tv_usec cmp b.tv_usec) : \
  11287. (a.tv_sec cmp b.tv_sec)) \
  11288. /* do nothing handler */
  11289. static void myHandler(int signo)
  11290. {
  11291. (void)signo;
  11292. return;
  11293. }
  11294. static int wolfSSL_ex_wrapper(WOLFSSL* ssl, HandShakeCallBack hsCb,
  11295. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  11296. {
  11297. int ret = WOLFSSL_FATAL_ERROR;
  11298. int oldTimerOn = 0; /* was timer already on */
  11299. WOLFSSL_TIMEVAL startTime;
  11300. WOLFSSL_TIMEVAL endTime;
  11301. WOLFSSL_TIMEVAL totalTime;
  11302. Itimerval myTimeout;
  11303. Itimerval oldTimeout; /* if old timer adjust from total time to reset */
  11304. struct sigaction act, oact;
  11305. #define ERR_OUT(x) { ssl->hsInfoOn = 0; ssl->toInfoOn = 0; return x; }
  11306. if (hsCb) {
  11307. ssl->hsInfoOn = 1;
  11308. InitHandShakeInfo(&ssl->handShakeInfo, ssl);
  11309. }
  11310. if (toCb) {
  11311. ssl->toInfoOn = 1;
  11312. InitTimeoutInfo(&ssl->timeoutInfo);
  11313. if (gettimeofday(&startTime, 0) < 0)
  11314. ERR_OUT(GETTIME_ERROR);
  11315. /* use setitimer to simulate getitimer, init 0 myTimeout */
  11316. myTimeout.it_interval.tv_sec = 0;
  11317. myTimeout.it_interval.tv_usec = 0;
  11318. myTimeout.it_value.tv_sec = 0;
  11319. myTimeout.it_value.tv_usec = 0;
  11320. if (setitimer(ITIMER_REAL, &myTimeout, &oldTimeout) < 0)
  11321. ERR_OUT(SETITIMER_ERROR);
  11322. if (oldTimeout.it_value.tv_sec || oldTimeout.it_value.tv_usec) {
  11323. oldTimerOn = 1;
  11324. /* is old timer going to expire before ours */
  11325. if (CmpTimes(oldTimeout.it_value, timeout, <)) {
  11326. timeout.tv_sec = oldTimeout.it_value.tv_sec;
  11327. timeout.tv_usec = oldTimeout.it_value.tv_usec;
  11328. }
  11329. }
  11330. myTimeout.it_value.tv_sec = timeout.tv_sec;
  11331. myTimeout.it_value.tv_usec = timeout.tv_usec;
  11332. /* set up signal handler, don't restart socket send/recv */
  11333. act.sa_handler = myHandler;
  11334. sigemptyset(&act.sa_mask);
  11335. act.sa_flags = 0;
  11336. #ifdef SA_INTERRUPT
  11337. act.sa_flags |= SA_INTERRUPT;
  11338. #endif
  11339. if (sigaction(SIGALRM, &act, &oact) < 0)
  11340. ERR_OUT(SIGACT_ERROR);
  11341. if (setitimer(ITIMER_REAL, &myTimeout, 0) < 0)
  11342. ERR_OUT(SETITIMER_ERROR);
  11343. }
  11344. /* do main work */
  11345. #ifndef NO_WOLFSSL_CLIENT
  11346. if (ssl->options.side == WOLFSSL_CLIENT_END)
  11347. ret = wolfSSL_connect(ssl);
  11348. #endif
  11349. #ifndef NO_WOLFSSL_SERVER
  11350. if (ssl->options.side == WOLFSSL_SERVER_END)
  11351. ret = wolfSSL_accept(ssl);
  11352. #endif
  11353. /* do callbacks */
  11354. if (toCb) {
  11355. if (oldTimerOn) {
  11356. gettimeofday(&endTime, 0);
  11357. SubtractTimes(endTime, startTime, totalTime);
  11358. /* adjust old timer for elapsed time */
  11359. if (CmpTimes(totalTime, oldTimeout.it_value, <))
  11360. SubtractTimes(oldTimeout.it_value, totalTime,
  11361. oldTimeout.it_value);
  11362. else {
  11363. /* reset value to interval, may be off */
  11364. oldTimeout.it_value.tv_sec = oldTimeout.it_interval.tv_sec;
  11365. oldTimeout.it_value.tv_usec =oldTimeout.it_interval.tv_usec;
  11366. }
  11367. /* keep iter the same whether there or not */
  11368. }
  11369. /* restore old handler */
  11370. if (sigaction(SIGALRM, &oact, 0) < 0)
  11371. ret = SIGACT_ERROR; /* more pressing error, stomp */
  11372. else
  11373. /* use old settings which may turn off (expired or not there) */
  11374. if (setitimer(ITIMER_REAL, &oldTimeout, 0) < 0)
  11375. ret = SETITIMER_ERROR;
  11376. /* if we had a timeout call callback */
  11377. if (ssl->timeoutInfo.timeoutName[0]) {
  11378. ssl->timeoutInfo.timeoutValue.tv_sec = timeout.tv_sec;
  11379. ssl->timeoutInfo.timeoutValue.tv_usec = timeout.tv_usec;
  11380. (toCb)(&ssl->timeoutInfo);
  11381. }
  11382. /* clean up */
  11383. FreeTimeoutInfo(&ssl->timeoutInfo, ssl->heap);
  11384. ssl->toInfoOn = 0;
  11385. }
  11386. if (hsCb) {
  11387. FinishHandShakeInfo(&ssl->handShakeInfo);
  11388. (hsCb)(&ssl->handShakeInfo);
  11389. ssl->hsInfoOn = 0;
  11390. }
  11391. return ret;
  11392. }
  11393. #ifndef NO_WOLFSSL_CLIENT
  11394. int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  11395. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  11396. {
  11397. WOLFSSL_ENTER("wolfSSL_connect_ex");
  11398. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  11399. }
  11400. #endif
  11401. #ifndef NO_WOLFSSL_SERVER
  11402. int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack hsCb,
  11403. TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout)
  11404. {
  11405. WOLFSSL_ENTER("wolfSSL_accept_ex");
  11406. return wolfSSL_ex_wrapper(ssl, hsCb, toCb, timeout);
  11407. }
  11408. #endif
  11409. #endif /* WOLFSSL_CALLBACKS */
  11410. #ifndef NO_PSK
  11411. void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx,
  11412. wc_psk_client_callback cb)
  11413. {
  11414. WOLFSSL_ENTER("SSL_CTX_set_psk_client_callback");
  11415. if (ctx == NULL)
  11416. return;
  11417. ctx->havePSK = 1;
  11418. ctx->client_psk_cb = cb;
  11419. }
  11420. void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb)
  11421. {
  11422. byte haveRSA = 1;
  11423. int keySz = 0;
  11424. WOLFSSL_ENTER("SSL_set_psk_client_callback");
  11425. if (ssl == NULL)
  11426. return;
  11427. ssl->options.havePSK = 1;
  11428. ssl->options.client_psk_cb = cb;
  11429. #ifdef NO_RSA
  11430. haveRSA = 0;
  11431. #endif
  11432. #ifndef NO_CERTS
  11433. keySz = ssl->buffers.keySz;
  11434. #endif
  11435. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  11436. ssl->options.haveDH, ssl->options.haveNTRU,
  11437. ssl->options.haveECDSAsig, ssl->options.haveECC,
  11438. ssl->options.haveStaticECC, ssl->options.side);
  11439. }
  11440. void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx,
  11441. wc_psk_server_callback cb)
  11442. {
  11443. WOLFSSL_ENTER("SSL_CTX_set_psk_server_callback");
  11444. if (ctx == NULL)
  11445. return;
  11446. ctx->havePSK = 1;
  11447. ctx->server_psk_cb = cb;
  11448. }
  11449. void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb)
  11450. {
  11451. byte haveRSA = 1;
  11452. int keySz = 0;
  11453. WOLFSSL_ENTER("SSL_set_psk_server_callback");
  11454. if (ssl == NULL)
  11455. return;
  11456. ssl->options.havePSK = 1;
  11457. ssl->options.server_psk_cb = cb;
  11458. #ifdef NO_RSA
  11459. haveRSA = 0;
  11460. #endif
  11461. #ifndef NO_CERTS
  11462. keySz = ssl->buffers.keySz;
  11463. #endif
  11464. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  11465. ssl->options.haveDH, ssl->options.haveNTRU,
  11466. ssl->options.haveECDSAsig, ssl->options.haveECC,
  11467. ssl->options.haveStaticECC, ssl->options.side);
  11468. }
  11469. const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
  11470. {
  11471. WOLFSSL_ENTER("SSL_get_psk_identity_hint");
  11472. if (ssl == NULL || ssl->arrays == NULL)
  11473. return NULL;
  11474. return ssl->arrays->server_hint;
  11475. }
  11476. const char* wolfSSL_get_psk_identity(const WOLFSSL* ssl)
  11477. {
  11478. WOLFSSL_ENTER("SSL_get_psk_identity");
  11479. if (ssl == NULL || ssl->arrays == NULL)
  11480. return NULL;
  11481. return ssl->arrays->client_identity;
  11482. }
  11483. int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint)
  11484. {
  11485. WOLFSSL_ENTER("SSL_CTX_use_psk_identity_hint");
  11486. if (hint == 0)
  11487. ctx->server_hint[0] = '\0';
  11488. else {
  11489. /* Qt does not call CTX_set_*_psk_callbacks where havePSK is set */
  11490. #ifdef WOLFSSL_QT
  11491. ctx->havePSK=1;
  11492. #endif
  11493. XSTRNCPY(ctx->server_hint, hint, MAX_PSK_ID_LEN);
  11494. ctx->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  11495. }
  11496. return WOLFSSL_SUCCESS;
  11497. }
  11498. int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint)
  11499. {
  11500. WOLFSSL_ENTER("SSL_use_psk_identity_hint");
  11501. if (ssl == NULL || ssl->arrays == NULL)
  11502. return WOLFSSL_FAILURE;
  11503. if (hint == 0)
  11504. ssl->arrays->server_hint[0] = 0;
  11505. else {
  11506. XSTRNCPY(ssl->arrays->server_hint, hint,
  11507. sizeof(ssl->arrays->server_hint)-1);
  11508. ssl->arrays->server_hint[sizeof(ssl->arrays->server_hint)-1] = '\0';
  11509. }
  11510. return WOLFSSL_SUCCESS;
  11511. }
  11512. void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl)
  11513. {
  11514. return ssl ? ssl->options.psk_ctx : NULL;
  11515. }
  11516. void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx)
  11517. {
  11518. return ctx ? ctx->psk_ctx : NULL;
  11519. }
  11520. int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx)
  11521. {
  11522. if (ssl == NULL)
  11523. return WOLFSSL_FAILURE;
  11524. ssl->options.psk_ctx = psk_ctx;
  11525. return WOLFSSL_SUCCESS;
  11526. }
  11527. int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx)
  11528. {
  11529. if (ctx == NULL)
  11530. return WOLFSSL_FAILURE;
  11531. ctx->psk_ctx = psk_ctx;
  11532. return WOLFSSL_SUCCESS;
  11533. }
  11534. #endif /* NO_PSK */
  11535. #ifdef HAVE_ANON
  11536. int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX* ctx)
  11537. {
  11538. WOLFSSL_ENTER("wolfSSL_CTX_allow_anon_cipher");
  11539. if (ctx == NULL)
  11540. return WOLFSSL_FAILURE;
  11541. ctx->haveAnon = 1;
  11542. return WOLFSSL_SUCCESS;
  11543. }
  11544. #endif /* HAVE_ANON */
  11545. #ifndef NO_CERTS
  11546. /* used to be defined on NO_FILESYSTEM only, but are generally useful */
  11547. int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx,
  11548. const unsigned char* in,
  11549. long sz, int format, int userChain,
  11550. word32 flags)
  11551. {
  11552. int verify;
  11553. int ret = WOLFSSL_FAILURE;
  11554. WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex");
  11555. verify = GET_VERIFY_SETTING_CTX(ctx);
  11556. if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY)
  11557. verify = VERIFY_SKIP_DATE;
  11558. if (format == WOLFSSL_FILETYPE_PEM)
  11559. ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
  11560. verify);
  11561. else
  11562. ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
  11563. userChain, verify);
  11564. WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret);
  11565. return ret;
  11566. }
  11567. /* wolfSSL extension allows DER files to be loaded from buffers as well */
  11568. int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx,
  11569. const unsigned char* in,
  11570. long sz, int format)
  11571. {
  11572. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0,
  11573. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  11574. }
  11575. int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx,
  11576. const unsigned char* in,
  11577. long sz, int format)
  11578. {
  11579. return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1,
  11580. WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS);
  11581. }
  11582. #ifdef WOLFSSL_TRUST_PEER_CERT
  11583. int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx,
  11584. const unsigned char* in,
  11585. long sz, int format)
  11586. {
  11587. WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer");
  11588. /* sanity check on arguments */
  11589. if (sz < 0 || in == NULL || ctx == NULL) {
  11590. return BAD_FUNC_ARG;
  11591. }
  11592. if (format == WOLFSSL_FILETYPE_PEM)
  11593. return ProcessChainBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE,
  11594. NULL, GET_VERIFY_SETTING_CTX(ctx));
  11595. else
  11596. return ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL,
  11597. NULL, 0, GET_VERIFY_SETTING_CTX(ctx));
  11598. }
  11599. #endif /* WOLFSSL_TRUST_PEER_CERT */
  11600. int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx,
  11601. const unsigned char* in, long sz, int format)
  11602. {
  11603. int ret = WOLFSSL_FAILURE;
  11604. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer");
  11605. ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
  11606. GET_VERIFY_SETTING_CTX(ctx));
  11607. WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret);
  11608. return ret;
  11609. }
  11610. int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx,
  11611. const unsigned char* in, long sz, int format)
  11612. {
  11613. int ret = WOLFSSL_FAILURE;
  11614. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer");
  11615. ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
  11616. 0, GET_VERIFY_SETTING_CTX(ctx));
  11617. WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret);
  11618. return ret;
  11619. }
  11620. #ifdef HAVE_PKCS11
  11621. int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id,
  11622. long sz, int devId, long keySz)
  11623. {
  11624. int ret = WOLFSSL_FAILURE;
  11625. FreeDer(&ctx->privateKey);
  11626. if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
  11627. ctx->heap) == 0) {
  11628. XMEMCPY(ctx->privateKey->buffer, id, sz);
  11629. ctx->privateKeyId = 1;
  11630. ctx->privateKeySz = (word32)keySz;
  11631. if (devId != INVALID_DEVID)
  11632. ctx->privateKeyDevId = devId;
  11633. else
  11634. ctx->privateKeyDevId = ctx->devId;
  11635. ret = WOLFSSL_SUCCESS;
  11636. }
  11637. return ret;
  11638. }
  11639. #endif
  11640. int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx,
  11641. const unsigned char* in, long sz, int format)
  11642. {
  11643. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format");
  11644. return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1,
  11645. GET_VERIFY_SETTING_CTX(ctx));
  11646. }
  11647. int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx,
  11648. const unsigned char* in, long sz)
  11649. {
  11650. return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz,
  11651. WOLFSSL_FILETYPE_PEM);
  11652. }
  11653. #ifndef NO_DH
  11654. /* server wrapper for ctx or ssl Diffie-Hellman parameters */
  11655. static int wolfSSL_SetTmpDH_buffer_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
  11656. const unsigned char* buf,
  11657. long sz, int format)
  11658. {
  11659. DerBuffer* der = NULL;
  11660. int ret = 0;
  11661. word32 pSz = MAX_DH_SIZE;
  11662. word32 gSz = MAX_DH_SIZE;
  11663. #ifdef WOLFSSL_SMALL_STACK
  11664. byte* p = NULL;
  11665. byte* g = NULL;
  11666. #else
  11667. byte p[MAX_DH_SIZE];
  11668. byte g[MAX_DH_SIZE];
  11669. #endif
  11670. if (ctx == NULL || buf == NULL)
  11671. return BAD_FUNC_ARG;
  11672. ret = AllocDer(&der, 0, DH_PARAM_TYPE, ctx->heap);
  11673. if (ret != 0) {
  11674. return ret;
  11675. }
  11676. der->buffer = (byte*)buf;
  11677. der->length = (word32)sz;
  11678. #ifdef WOLFSSL_SMALL_STACK
  11679. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11680. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11681. if (p == NULL || g == NULL) {
  11682. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11683. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11684. return MEMORY_E;
  11685. }
  11686. #endif
  11687. if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM)
  11688. ret = WOLFSSL_BAD_FILETYPE;
  11689. else {
  11690. if (format == WOLFSSL_FILETYPE_PEM) {
  11691. #ifdef WOLFSSL_PEM_TO_DER
  11692. FreeDer(&der);
  11693. ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap,
  11694. NULL, NULL);
  11695. #ifdef WOLFSSL_WPAS
  11696. #ifndef NO_DSA
  11697. if (ret < 0) {
  11698. ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, ctx->heap,
  11699. NULL, NULL);
  11700. }
  11701. #endif
  11702. #endif /* WOLFSSL_WPAS */
  11703. #else
  11704. ret = NOT_COMPILED_IN;
  11705. #endif /* WOLFSSL_PEM_TO_DER */
  11706. }
  11707. if (ret == 0) {
  11708. if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0)
  11709. ret = WOLFSSL_BAD_FILETYPE;
  11710. else if (ssl)
  11711. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  11712. else
  11713. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  11714. }
  11715. }
  11716. FreeDer(&der);
  11717. #ifdef WOLFSSL_SMALL_STACK
  11718. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11719. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  11720. #endif
  11721. return ret;
  11722. }
  11723. /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  11724. int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz,
  11725. int format)
  11726. {
  11727. if (ssl == NULL)
  11728. return BAD_FUNC_ARG;
  11729. return wolfSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format);
  11730. }
  11731. /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */
  11732. int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf,
  11733. long sz, int format)
  11734. {
  11735. return wolfSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format);
  11736. }
  11737. #endif /* NO_DH */
  11738. int wolfSSL_use_certificate_buffer(WOLFSSL* ssl,
  11739. const unsigned char* in, long sz, int format)
  11740. {
  11741. WOLFSSL_ENTER("wolfSSL_use_certificate_buffer");
  11742. if (ssl == NULL)
  11743. return BAD_FUNC_ARG;
  11744. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0,
  11745. GET_VERIFY_SETTING_SSL(ssl));
  11746. }
  11747. int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl,
  11748. const unsigned char* in, long sz, int format)
  11749. {
  11750. WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer");
  11751. if (ssl == NULL)
  11752. return BAD_FUNC_ARG;
  11753. return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE,
  11754. ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl));
  11755. }
  11756. #ifdef HAVE_PKCS11
  11757. int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id,
  11758. long sz, int devId, long keySz)
  11759. {
  11760. int ret = WOLFSSL_FAILURE;
  11761. if (ssl->buffers.weOwnKey)
  11762. FreeDer(&ssl->buffers.key);
  11763. if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
  11764. ssl->heap) == 0) {
  11765. XMEMCPY(ssl->buffers.key->buffer, id, sz);
  11766. ssl->buffers.weOwnKey = 1;
  11767. ssl->buffers.keyId = 1;
  11768. ssl->buffers.keySz = (word32)keySz;
  11769. if (devId != INVALID_DEVID)
  11770. ssl->buffers.keyDevId = devId;
  11771. else
  11772. ssl->buffers.keyDevId = ssl->devId;
  11773. ret = WOLFSSL_SUCCESS;
  11774. }
  11775. return ret;
  11776. }
  11777. #endif
  11778. int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl,
  11779. const unsigned char* in, long sz, int format)
  11780. {
  11781. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  11782. if (ssl == NULL)
  11783. return BAD_FUNC_ARG;
  11784. return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE,
  11785. ssl, NULL, 1, GET_VERIFY_SETTING_SSL(ssl));
  11786. }
  11787. int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl,
  11788. const unsigned char* in, long sz)
  11789. {
  11790. return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz,
  11791. WOLFSSL_FILETYPE_PEM);
  11792. }
  11793. /* unload any certs or keys that SSL owns, leave CTX as is
  11794. WOLFSSL_SUCCESS on ok */
  11795. int wolfSSL_UnloadCertsKeys(WOLFSSL* ssl)
  11796. {
  11797. if (ssl == NULL) {
  11798. WOLFSSL_MSG("Null function arg");
  11799. return BAD_FUNC_ARG;
  11800. }
  11801. if (ssl->buffers.weOwnCert && !ssl->keepCert) {
  11802. WOLFSSL_MSG("Unloading cert");
  11803. FreeDer(&ssl->buffers.certificate);
  11804. #ifdef KEEP_OUR_CERT
  11805. FreeX509(ssl->ourCert);
  11806. if (ssl->ourCert) {
  11807. XFREE(ssl->ourCert, ssl->heap, DYNAMIC_TYPE_X509);
  11808. ssl->ourCert = NULL;
  11809. }
  11810. #endif
  11811. ssl->buffers.weOwnCert = 0;
  11812. }
  11813. if (ssl->buffers.weOwnCertChain) {
  11814. WOLFSSL_MSG("Unloading cert chain");
  11815. FreeDer(&ssl->buffers.certChain);
  11816. ssl->buffers.weOwnCertChain = 0;
  11817. }
  11818. if (ssl->buffers.weOwnKey) {
  11819. WOLFSSL_MSG("Unloading key");
  11820. FreeDer(&ssl->buffers.key);
  11821. ssl->buffers.weOwnKey = 0;
  11822. }
  11823. return WOLFSSL_SUCCESS;
  11824. }
  11825. int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX* ctx)
  11826. {
  11827. WOLFSSL_ENTER("wolfSSL_CTX_UnloadCAs");
  11828. if (ctx == NULL)
  11829. return BAD_FUNC_ARG;
  11830. return wolfSSL_CertManagerUnloadCAs(ctx->cm);
  11831. }
  11832. #ifdef WOLFSSL_TRUST_PEER_CERT
  11833. int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx)
  11834. {
  11835. WOLFSSL_ENTER("wolfSSL_CTX_Unload_trust_peers");
  11836. if (ctx == NULL)
  11837. return BAD_FUNC_ARG;
  11838. return wolfSSL_CertManagerUnload_trust_peers(ctx->cm);
  11839. }
  11840. #endif /* WOLFSSL_TRUST_PEER_CERT */
  11841. /* old NO_FILESYSTEM end */
  11842. #endif /* !NO_CERTS */
  11843. #ifdef OPENSSL_EXTRA
  11844. int wolfSSL_add_all_algorithms(void)
  11845. {
  11846. WOLFSSL_ENTER("wolfSSL_add_all_algorithms");
  11847. if (wolfSSL_Init() == WOLFSSL_SUCCESS)
  11848. return WOLFSSL_SUCCESS;
  11849. else
  11850. return WOLFSSL_FATAL_ERROR;
  11851. }
  11852. int wolfSSL_OpenSSL_add_all_algorithms_noconf(void)
  11853. {
  11854. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_noconf");
  11855. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR)
  11856. return WOLFSSL_FATAL_ERROR;
  11857. return WOLFSSL_SUCCESS;
  11858. }
  11859. int wolfSSL_OpenSSL_add_all_algorithms_conf(void)
  11860. {
  11861. WOLFSSL_ENTER("wolfSSL_OpenSSL_add_all_algorithms_conf");
  11862. /* This function is currently the same as
  11863. wolfSSL_OpenSSL_add_all_algorithms_noconf since we do not employ
  11864. the use of a wolfssl.cnf type configuration file and is only used for
  11865. OpenSSL compatability. */
  11866. if (wolfSSL_add_all_algorithms() == WOLFSSL_FATAL_ERROR) {
  11867. return WOLFSSL_FATAL_ERROR;
  11868. }
  11869. return WOLFSSL_SUCCESS;
  11870. }
  11871. /* returns previous set cache size which stays constant */
  11872. long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz)
  11873. {
  11874. /* cache size fixed at compile time in wolfSSL */
  11875. (void)ctx;
  11876. (void)sz;
  11877. WOLFSSL_MSG("session cache is set at compile time");
  11878. #ifndef NO_SESSION_CACHE
  11879. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  11880. #else
  11881. return 0;
  11882. #endif
  11883. }
  11884. #endif
  11885. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  11886. void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode)
  11887. {
  11888. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  11889. if (mode)
  11890. ctx->quietShutdown = 1;
  11891. }
  11892. void wolfSSL_set_quiet_shutdown(WOLFSSL* ssl, int mode)
  11893. {
  11894. WOLFSSL_ENTER("wolfSSL_CTX_set_quiet_shutdown");
  11895. if (mode)
  11896. ssl->options.quietShutdown = 1;
  11897. }
  11898. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  11899. #ifdef OPENSSL_EXTRA
  11900. void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr)
  11901. {
  11902. WOLFSSL_ENTER("wolfSSL_set_bio");
  11903. if (ssl == NULL) {
  11904. WOLFSSL_MSG("Bad argument, ssl was NULL");
  11905. return;
  11906. }
  11907. /* if WOLFSSL_BIO is socket type then set WOLFSSL socket to use */
  11908. if (rd != NULL && rd->type == WOLFSSL_BIO_SOCKET) {
  11909. wolfSSL_set_rfd(ssl, rd->num);
  11910. }
  11911. if (wr != NULL && wr->type == WOLFSSL_BIO_SOCKET) {
  11912. wolfSSL_set_wfd(ssl, wr->num);
  11913. }
  11914. /* free any existing WOLFSSL_BIOs in use */
  11915. if (ssl->biord != NULL) {
  11916. if (ssl->biord != ssl->biowr) {
  11917. if (ssl->biowr != NULL) {
  11918. wolfSSL_BIO_free(ssl->biowr);
  11919. ssl->biowr = NULL;
  11920. }
  11921. }
  11922. wolfSSL_BIO_free(ssl->biord);
  11923. ssl->biord = NULL;
  11924. }
  11925. ssl->biord = rd;
  11926. ssl->biowr = wr;
  11927. /* set SSL to use BIO callbacks instead */
  11928. if (((ssl->cbioFlag & WOLFSSL_CBIO_RECV) == 0) &&
  11929. (rd != NULL && rd->type != WOLFSSL_BIO_SOCKET)) {
  11930. ssl->CBIORecv = BioReceive;
  11931. }
  11932. if (((ssl->cbioFlag & WOLFSSL_CBIO_SEND) == 0) &&
  11933. (wr != NULL && wr->type != WOLFSSL_BIO_SOCKET)) {
  11934. ssl->CBIOSend = BioSend;
  11935. }
  11936. /* User programs should always retry reading from these BIOs */
  11937. if (rd) {
  11938. /* User writes to rd */
  11939. BIO_set_retry_write(rd);
  11940. }
  11941. if (wr) {
  11942. /* User reads from wr */
  11943. BIO_set_retry_read(wr);
  11944. }
  11945. }
  11946. #endif
  11947. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_WEBSERVER)
  11948. void wolfSSL_CTX_set_client_CA_list(WOLFSSL_CTX* ctx,
  11949. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names)
  11950. {
  11951. WOLFSSL_ENTER("wolfSSL_CTX_set_client_CA_list");
  11952. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  11953. if (ctx != NULL)
  11954. ctx->ca_names = names;
  11955. #else
  11956. (void)ctx;
  11957. (void)names;
  11958. #endif
  11959. }
  11960. /* returns the CA's set on server side or the CA's sent from server when
  11961. * on client side */
  11962. #if defined(SESSION_CERTS) && defined(OPENSSL_ALL)
  11963. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_get_client_CA_list(
  11964. const WOLFSSL* ssl)
  11965. {
  11966. WOLFSSL_ENTER("wolfSSL_get_client_CA_list");
  11967. if (ssl == NULL) {
  11968. WOLFSSL_MSG("Bad argument passed to wolfSSL_get_client_CA_list");
  11969. return NULL;
  11970. }
  11971. /* return list of CAs sent from the server */
  11972. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11973. WOLF_STACK_OF(WOLFSSL_X509)* sk;
  11974. sk = wolfSSL_get_peer_cert_chain(ssl);
  11975. if (sk != NULL) {
  11976. WOLF_STACK_OF(WOLFSSL_X509_NAME)* ret;
  11977. WOLFSSL_X509* x509;
  11978. ret = wolfSSL_sk_X509_NAME_new(NULL);
  11979. do {
  11980. x509 = wolfSSL_sk_X509_pop(sk);
  11981. if (x509 != NULL) {
  11982. if (wolfSSL_X509_get_isCA(x509)) {
  11983. if (wolfSSL_sk_X509_NAME_push(ret,
  11984. wolfSSL_X509_get_subject_name(x509)) != 0) {
  11985. WOLFSSL_MSG("Error pushing X509 name to stack");
  11986. /* continue on to try other certificates and
  11987. * do not fail out here */
  11988. }
  11989. }
  11990. wolfSSL_X509_free(x509);
  11991. }
  11992. } while (x509 != NULL);
  11993. wolfSSL_sk_X509_free(sk);
  11994. return ret;
  11995. }
  11996. return NULL;
  11997. }
  11998. else {
  11999. /* currently only can be set in the CTX */
  12000. return ssl->ctx->ca_names;
  12001. }
  12002. }
  12003. #endif /* SESSION_CERTS */
  12004. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  12005. defined(WOLFSSL_NGINX) || defined (WOLFSSL_HAPROXY)
  12006. /* registers client cert callback, called during handshake if server
  12007. requests client auth but user has not loaded client cert/key */
  12008. void wolfSSL_CTX_set_client_cert_cb(WOLFSSL_CTX *ctx, client_cert_cb cb)
  12009. {
  12010. WOLFSSL_ENTER("wolfSSL_CTX_set_client_cert_cb");
  12011. if (ctx != NULL) {
  12012. ctx->CBClientCert = cb;
  12013. }
  12014. }
  12015. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  12016. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || HAVE_WEBSERVER */
  12017. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
  12018. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_CTX_get_client_CA_list(
  12019. const WOLFSSL_CTX *s)
  12020. {
  12021. WOLFSSL_ENTER("wolfSSL_CTX_get_client_CA_list");
  12022. if (s == NULL)
  12023. return NULL;
  12024. return s->ca_names;
  12025. }
  12026. #endif
  12027. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  12028. #if !defined(NO_RSA) && !defined(NO_CERTS)
  12029. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname)
  12030. {
  12031. /* The webserver build is using this to load a CA into the server
  12032. * for client authentication as an option. Have this return NULL in
  12033. * that case. If OPENSSL_EXTRA is enabled, go ahead and include
  12034. * the function. */
  12035. #ifdef OPENSSL_EXTRA
  12036. WOLFSSL_STACK *list = NULL;
  12037. WOLFSSL_STACK *node;
  12038. WOLFSSL_BIO* bio;
  12039. WOLFSSL_X509 *cert = NULL;
  12040. WOLFSSL_X509_NAME *subjectName = NULL;
  12041. unsigned long err;
  12042. WOLFSSL_ENTER("wolfSSL_load_client_CA_file");
  12043. bio = wolfSSL_BIO_new_file(fname, "r");
  12044. if (bio == NULL)
  12045. return NULL;
  12046. /* Read each certificate in the chain out of the file. */
  12047. while (wolfSSL_PEM_read_bio_X509(bio, &cert, NULL, NULL) != NULL) {
  12048. subjectName = wolfSSL_X509_get_subject_name(cert);
  12049. if (subjectName == NULL)
  12050. break;
  12051. node = wolfSSL_sk_new_node(NULL);
  12052. if (node == NULL)
  12053. break;
  12054. node->type = STACK_TYPE_X509_NAME;
  12055. /* Need a persistent copy of the subject name. */
  12056. node->data.name = wolfSSL_X509_NAME_dup(subjectName);
  12057. /*
  12058. * Original cert will be freed so make sure not to try to access
  12059. * it in the future.
  12060. */
  12061. node->data.name->x509 = NULL;
  12062. /* Put node on the front of the list. */
  12063. node->num = (list == NULL) ? 1 : list->num + 1;
  12064. node->next = list;
  12065. list = node;
  12066. wolfSSL_X509_free(cert);
  12067. cert = NULL;
  12068. }
  12069. err = wolfSSL_ERR_peek_last_error();
  12070. if (ERR_GET_LIB(err) == ERR_LIB_PEM &&
  12071. ERR_GET_REASON(err) == PEM_R_NO_START_LINE) {
  12072. /*
  12073. * wolfSSL_PEM_read_bio_X509 pushes an ASN_NO_PEM_HEADER error
  12074. * to the error queue on file end. This should not be left
  12075. * for the caller to find so we clear the last error.
  12076. */
  12077. wc_RemoveErrorNode(-1);
  12078. }
  12079. wolfSSL_X509_free(cert);
  12080. wolfSSL_BIO_free(bio);
  12081. return list;
  12082. #else
  12083. (void)fname;
  12084. return NULL;
  12085. #endif
  12086. }
  12087. #endif
  12088. #endif
  12089. #ifdef OPENSSL_EXTRA
  12090. #if !defined(NO_RSA) && !defined(NO_CERTS)
  12091. int wolfSSL_CTX_add_client_CA(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  12092. {
  12093. WOLFSSL_STACK *node = NULL;
  12094. WOLFSSL_X509_NAME *subjectName = NULL;
  12095. WOLFSSL_ENTER("wolfSSL_CTX_add_client_CA");
  12096. if (ctx == NULL || x509 == NULL){
  12097. WOLFSSL_MSG("Bad argument");
  12098. return SSL_FAILURE;
  12099. }
  12100. subjectName = wolfSSL_X509_get_subject_name(x509);
  12101. if (subjectName == NULL){
  12102. WOLFSSL_MSG("invalid x509 data");
  12103. return SSL_FAILURE;
  12104. }
  12105. /* Alloc stack struct */
  12106. node = (WOLF_STACK_OF(WOLFSSL_X509_NAME)*)XMALLOC(
  12107. sizeof(WOLF_STACK_OF(WOLFSSL_X509_NAME)),
  12108. NULL, DYNAMIC_TYPE_OPENSSL);
  12109. if (node == NULL){
  12110. WOLFSSL_MSG("memory allocation error");
  12111. return SSL_FAILURE;
  12112. }
  12113. XMEMSET(node, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509_NAME)));
  12114. /* Alloc and copy WOLFSSL_X509_NAME */
  12115. node->data.name = (WOLFSSL_X509_NAME*)XMALLOC(
  12116. sizeof(WOLFSSL_X509_NAME),
  12117. NULL, DYNAMIC_TYPE_OPENSSL);
  12118. if (node->data.name == NULL) {
  12119. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  12120. WOLFSSL_MSG("memory allocation error");
  12121. return SSL_FAILURE;
  12122. }
  12123. XMEMCPY(node->data.name, subjectName, sizeof(WOLFSSL_X509_NAME));
  12124. XMEMSET(subjectName, 0, sizeof(WOLFSSL_X509_NAME));
  12125. /* push new node onto head of stack */
  12126. node->num = (ctx->ca_names == NULL) ? 1 : ctx->ca_names->num + 1;
  12127. node->next = ctx->ca_names;
  12128. ctx->ca_names = node;
  12129. return SSL_SUCCESS;
  12130. }
  12131. #endif
  12132. #ifndef NO_WOLFSSL_STUB
  12133. int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx)
  12134. {
  12135. /* TODO:, not needed in goahead */
  12136. (void)ctx;
  12137. WOLFSSL_STUB("SSL_CTX_set_default_verify_paths");
  12138. return SSL_NOT_IMPLEMENTED;
  12139. }
  12140. #endif
  12141. #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \
  12142. && !defined(WC_NO_RNG)
  12143. static const byte srp_N[] = {
  12144. 0xEE, 0xAF, 0x0A, 0xB9, 0xAD, 0xB3, 0x8D, 0xD6, 0x9C, 0x33, 0xF8,
  12145. 0x0A, 0xFA, 0x8F, 0xC5, 0xE8, 0x60, 0x72, 0x61, 0x87, 0x75, 0xFF,
  12146. 0x3C, 0x0B, 0x9E, 0xA2, 0x31, 0x4C, 0x9C, 0x25, 0x65, 0x76, 0xD6,
  12147. 0x74, 0xDF, 0x74, 0x96, 0xEA, 0x81, 0xD3, 0x38, 0x3B, 0x48, 0x13,
  12148. 0xD6, 0x92, 0xC6, 0xE0, 0xE0, 0xD5, 0xD8, 0xE2, 0x50, 0xB9, 0x8B,
  12149. 0xE4, 0x8E, 0x49, 0x5C, 0x1D, 0x60, 0x89, 0xDA, 0xD1, 0x5D, 0xC7,
  12150. 0xD7, 0xB4, 0x61, 0x54, 0xD6, 0xB6, 0xCE, 0x8E, 0xF4, 0xAD, 0x69,
  12151. 0xB1, 0x5D, 0x49, 0x82, 0x55, 0x9B, 0x29, 0x7B, 0xCF, 0x18, 0x85,
  12152. 0xC5, 0x29, 0xF5, 0x66, 0x66, 0x0E, 0x57, 0xEC, 0x68, 0xED, 0xBC,
  12153. 0x3C, 0x05, 0x72, 0x6C, 0xC0, 0x2F, 0xD4, 0xCB, 0xF4, 0x97, 0x6E,
  12154. 0xAA, 0x9A, 0xFD, 0x51, 0x38, 0xFE, 0x83, 0x76, 0x43, 0x5B, 0x9F,
  12155. 0xC6, 0x1D, 0x2F, 0xC0, 0xEB, 0x06, 0xE3
  12156. };
  12157. static const byte srp_g[] = {
  12158. 0x02
  12159. };
  12160. int wolfSSL_CTX_set_srp_username(WOLFSSL_CTX* ctx, char* username)
  12161. {
  12162. int r = 0;
  12163. SrpSide srp_side = SRP_CLIENT_SIDE;
  12164. WC_RNG rng;
  12165. byte salt[SRP_SALT_SIZE];
  12166. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_username");
  12167. if (ctx == NULL || ctx->srp == NULL || username==NULL)
  12168. return SSL_FAILURE;
  12169. if (ctx->method->side == WOLFSSL_SERVER_END){
  12170. srp_side = SRP_SERVER_SIDE;
  12171. } else if (ctx->method->side == WOLFSSL_CLIENT_END){
  12172. srp_side = SRP_CLIENT_SIDE;
  12173. } else {
  12174. WOLFSSL_MSG("Init CTX failed");
  12175. return SSL_FAILURE;
  12176. }
  12177. if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0){
  12178. WOLFSSL_MSG("Init CTX failed");
  12179. XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
  12180. wolfSSL_CTX_free(ctx);
  12181. return SSL_FAILURE;
  12182. }
  12183. r = wc_SrpSetUsername(ctx->srp, (const byte*)username,
  12184. (word32)XSTRLEN(username));
  12185. if (r < 0) {
  12186. WOLFSSL_MSG("fail to set srp username.");
  12187. return SSL_FAILURE;
  12188. }
  12189. /* if wolfSSL_CTX_set_srp_password has already been called, */
  12190. /* execute wc_SrpSetPassword here */
  12191. if (ctx->srp_password != NULL){
  12192. if (wc_InitRng(&rng) < 0){
  12193. WOLFSSL_MSG("wc_InitRng failed");
  12194. return SSL_FAILURE;
  12195. }
  12196. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  12197. if (wc_RNG_GenerateBlock(&rng, salt,
  12198. sizeof(salt)/sizeof(salt[0])) < 0){
  12199. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  12200. wc_FreeRng(&rng);
  12201. return SSL_FAILURE;
  12202. }
  12203. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  12204. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  12205. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  12206. WOLFSSL_MSG("wc_SrpSetParam failed");
  12207. wc_FreeRng(&rng);
  12208. return SSL_FAILURE;
  12209. }
  12210. r = wc_SrpSetPassword(ctx->srp,
  12211. (const byte*)ctx->srp_password,
  12212. (word32)XSTRLEN((char *)ctx->srp_password));
  12213. if (r < 0) {
  12214. WOLFSSL_MSG("fail to set srp password.");
  12215. return SSL_FAILURE;
  12216. }
  12217. wc_FreeRng(&rng);
  12218. XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
  12219. ctx->srp_password = NULL;
  12220. }
  12221. return SSL_SUCCESS;
  12222. }
  12223. int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
  12224. {
  12225. int r;
  12226. WC_RNG rng;
  12227. byte salt[SRP_SALT_SIZE];
  12228. WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
  12229. if (ctx == NULL || ctx->srp == NULL || password == NULL)
  12230. return SSL_FAILURE;
  12231. if (ctx->srp->user != NULL){
  12232. if (wc_InitRng(&rng) < 0){
  12233. WOLFSSL_MSG("wc_InitRng failed");
  12234. return SSL_FAILURE;
  12235. }
  12236. XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
  12237. if (wc_RNG_GenerateBlock(&rng, salt,
  12238. sizeof(salt)/sizeof(salt[0])) < 0){
  12239. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  12240. wc_FreeRng(&rng);
  12241. return SSL_FAILURE;
  12242. }
  12243. if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
  12244. srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
  12245. salt, sizeof(salt)/sizeof(salt[0])) < 0){
  12246. WOLFSSL_MSG("wc_SrpSetParam failed");
  12247. wc_FreeRng(&rng);
  12248. return SSL_FAILURE;
  12249. }
  12250. r = wc_SrpSetPassword(ctx->srp, (const byte*)password,
  12251. (word32)XSTRLEN(password));
  12252. if (r < 0) {
  12253. WOLFSSL_MSG("wc_SrpSetPassword failed.");
  12254. wc_FreeRng(&rng);
  12255. return SSL_FAILURE;
  12256. }
  12257. if (ctx->srp_password != NULL){
  12258. XFREE(ctx->srp_password,NULL,
  12259. DYNAMIC_TYPE_SRP);
  12260. ctx->srp_password = NULL;
  12261. }
  12262. wc_FreeRng(&rng);
  12263. } else {
  12264. /* save password for wolfSSL_set_srp_username */
  12265. if (ctx->srp_password != NULL)
  12266. XFREE(ctx->srp_password,ctx->heap, DYNAMIC_TYPE_SRP);
  12267. ctx->srp_password = (byte*)XMALLOC(XSTRLEN(password) + 1, ctx->heap,
  12268. DYNAMIC_TYPE_SRP);
  12269. if (ctx->srp_password == NULL){
  12270. WOLFSSL_MSG("memory allocation error");
  12271. return SSL_FAILURE;
  12272. }
  12273. XMEMCPY(ctx->srp_password, password, XSTRLEN(password) + 1);
  12274. }
  12275. return SSL_SUCCESS;
  12276. }
  12277. #endif /* WOLFCRYPT_HAVE_SRP && !NO_SHA256 && !WC_NO_RNG */
  12278. /* keyblock size in bytes or -1 */
  12279. int wolfSSL_get_keyblock_size(WOLFSSL* ssl)
  12280. {
  12281. if (ssl == NULL)
  12282. return WOLFSSL_FATAL_ERROR;
  12283. return 2 * (ssl->specs.key_size + ssl->specs.iv_size +
  12284. ssl->specs.hash_size);
  12285. }
  12286. #endif /* OPENSSL_EXTRA */
  12287. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  12288. /* store keys returns WOLFSSL_SUCCESS or -1 on error */
  12289. int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen,
  12290. unsigned char** sr, unsigned int* srLen,
  12291. unsigned char** cr, unsigned int* crLen)
  12292. {
  12293. if (ssl == NULL || ssl->arrays == NULL)
  12294. return WOLFSSL_FATAL_ERROR;
  12295. *ms = ssl->arrays->masterSecret;
  12296. *sr = ssl->arrays->serverRandom;
  12297. *cr = ssl->arrays->clientRandom;
  12298. *msLen = SECRET_LEN;
  12299. *srLen = RAN_LEN;
  12300. *crLen = RAN_LEN;
  12301. return WOLFSSL_SUCCESS;
  12302. }
  12303. void wolfSSL_set_accept_state(WOLFSSL* ssl)
  12304. {
  12305. WOLFSSL_ENTER("wolfSSL_set_accept_state");
  12306. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12307. #ifdef HAVE_ECC
  12308. ecc_key key;
  12309. word32 idx = 0;
  12310. if (ssl->options.haveStaticECC && ssl->buffers.key != NULL) {
  12311. if (wc_ecc_init(&key) >= 0) {
  12312. if (wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx, &key,
  12313. ssl->buffers.key->length) != 0) {
  12314. ssl->options.haveECDSAsig = 0;
  12315. ssl->options.haveECC = 0;
  12316. ssl->options.haveStaticECC = 0;
  12317. }
  12318. wc_ecc_free(&key);
  12319. }
  12320. }
  12321. #endif
  12322. #ifndef NO_DH
  12323. if (!ssl->options.haveDH && ssl->ctx->haveDH) {
  12324. ssl->buffers.serverDH_P = ssl->ctx->serverDH_P;
  12325. ssl->buffers.serverDH_G = ssl->ctx->serverDH_G;
  12326. ssl->options.haveDH = 1;
  12327. }
  12328. #endif
  12329. }
  12330. if (InitSSL_Side(ssl, WOLFSSL_SERVER_END) != WOLFSSL_SUCCESS) {
  12331. WOLFSSL_MSG("Error initializing server side");
  12332. }
  12333. }
  12334. #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  12335. /* return true if connection established */
  12336. int wolfSSL_is_init_finished(WOLFSSL* ssl)
  12337. {
  12338. if (ssl == NULL)
  12339. return 0;
  12340. if (ssl->options.handShakeState == HANDSHAKE_DONE)
  12341. return 1;
  12342. return 0;
  12343. }
  12344. #ifdef OPENSSL_EXTRA
  12345. void wolfSSL_CTX_set_tmp_rsa_callback(WOLFSSL_CTX* ctx,
  12346. WOLFSSL_RSA*(*f)(WOLFSSL*, int, int))
  12347. {
  12348. /* wolfSSL verifies all these internally */
  12349. (void)ctx;
  12350. (void)f;
  12351. }
  12352. void wolfSSL_set_shutdown(WOLFSSL* ssl, int opt)
  12353. {
  12354. WOLFSSL_ENTER("wolfSSL_set_shutdown");
  12355. if(ssl==NULL) {
  12356. WOLFSSL_MSG("Shutdown not set. ssl is null");
  12357. return;
  12358. }
  12359. ssl->options.sentNotify = (opt&WOLFSSL_SENT_SHUTDOWN) > 0;
  12360. ssl->options.closeNotify = (opt&WOLFSSL_RECEIVED_SHUTDOWN) > 0;
  12361. }
  12362. long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx)
  12363. {
  12364. WOLFSSL_ENTER("wolfSSL_CTX_get_options");
  12365. WOLFSSL_MSG("wolfSSL options are set through API calls and macros");
  12366. if(ctx == NULL)
  12367. return BAD_FUNC_ARG;
  12368. return ctx->mask;
  12369. }
  12370. #endif
  12371. static long wolf_set_options(long old_op, long op);
  12372. long wolfSSL_CTX_set_options(WOLFSSL_CTX* ctx, long opt)
  12373. {
  12374. WOLFSSL_ENTER("SSL_CTX_set_options");
  12375. if (ctx == NULL)
  12376. return BAD_FUNC_ARG;
  12377. ctx->mask = wolf_set_options(ctx->mask, opt);
  12378. return ctx->mask;
  12379. }
  12380. #ifdef OPENSSL_EXTRA
  12381. long wolfSSL_CTX_clear_options(WOLFSSL_CTX* ctx, long opt)
  12382. {
  12383. WOLFSSL_ENTER("SSL_CTX_clear_options");
  12384. if(ctx == NULL)
  12385. return BAD_FUNC_ARG;
  12386. ctx->mask &= ~opt;
  12387. return ctx->mask;
  12388. }
  12389. int wolfSSL_set_rfd(WOLFSSL* ssl, int rfd)
  12390. {
  12391. WOLFSSL_ENTER("SSL_set_rfd");
  12392. ssl->rfd = rfd; /* not used directly to allow IO callbacks */
  12393. ssl->IOCB_ReadCtx = &ssl->rfd;
  12394. return WOLFSSL_SUCCESS;
  12395. }
  12396. int wolfSSL_set_wfd(WOLFSSL* ssl, int wfd)
  12397. {
  12398. WOLFSSL_ENTER("SSL_set_wfd");
  12399. ssl->wfd = wfd; /* not used directly to allow IO callbacks */
  12400. ssl->IOCB_WriteCtx = &ssl->wfd;
  12401. return WOLFSSL_SUCCESS;
  12402. }
  12403. #endif /* OPENSSL_EXTRA */
  12404. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  12405. WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
  12406. {
  12407. if (ctx == NULL) {
  12408. return NULL;
  12409. }
  12410. return &ctx->x509_store;
  12411. }
  12412. void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
  12413. {
  12414. if (ctx == NULL || str == NULL) {
  12415. return;
  12416. }
  12417. /* free cert manager if have one */
  12418. if (ctx->cm != NULL) {
  12419. wolfSSL_CertManagerFree(ctx->cm);
  12420. }
  12421. ctx->cm = str->cm;
  12422. /* free existing store if it exists */
  12423. if (ctx->x509_store_pt != NULL) {
  12424. /* cert manager was free'd a little earlier in this function */
  12425. ctx->x509_store_pt->cm = NULL;
  12426. }
  12427. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  12428. ctx->x509_store.cache = str->cache;
  12429. ctx->x509_store_pt = str; /* take ownership of store and free it
  12430. with CTX free */
  12431. }
  12432. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get_current_cert(
  12433. WOLFSSL_X509_STORE_CTX* ctx)
  12434. {
  12435. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_current_cert");
  12436. if (ctx)
  12437. return ctx->current_cert;
  12438. return NULL;
  12439. }
  12440. int wolfSSL_X509_STORE_CTX_get_error(WOLFSSL_X509_STORE_CTX* ctx)
  12441. {
  12442. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_error");
  12443. if (ctx != NULL)
  12444. return ctx->error;
  12445. return 0;
  12446. }
  12447. int wolfSSL_X509_STORE_CTX_get_error_depth(WOLFSSL_X509_STORE_CTX* ctx)
  12448. {
  12449. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_error_depth");
  12450. if(ctx)
  12451. return ctx->error_depth;
  12452. return WOLFSSL_FATAL_ERROR;
  12453. }
  12454. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  12455. #ifdef OPENSSL_EXTRA
  12456. #ifndef NO_CERTS
  12457. void wolfSSL_X509_STORE_CTX_set_verify_cb(WOLFSSL_X509_STORE_CTX *ctx,
  12458. WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
  12459. {
  12460. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_verify_cb");
  12461. if(ctx == NULL)
  12462. return;
  12463. ctx->verify_cb = verify_cb;
  12464. }
  12465. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  12466. void wolfSSL_X509_STORE_set_verify_cb(WOLFSSL_X509_STORE *st,
  12467. WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
  12468. {
  12469. WOLFSSL_ENTER("WOLFSSL_X509_STORE_set_verify_cb");
  12470. if (st != NULL) {
  12471. st->verify_cb = verify_cb;
  12472. }
  12473. }
  12474. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  12475. #endif /* !NO_CERTS */
  12476. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void)
  12477. {
  12478. static WOLFSSL_BIO_METHOD meth;
  12479. WOLFSSL_ENTER("wolfSSL_BIO_f_md");
  12480. meth.type = WOLFSSL_BIO_MD;
  12481. return &meth;
  12482. }
  12483. /* return the context and initialize the BIO state */
  12484. int wolfSSL_BIO_get_md_ctx(WOLFSSL_BIO *bio, WOLFSSL_EVP_MD_CTX **mdcp)
  12485. {
  12486. int ret = WOLFSSL_FAILURE;
  12487. if ((bio != NULL) && (mdcp != NULL)) {
  12488. *mdcp = (WOLFSSL_EVP_MD_CTX*)bio->ptr;
  12489. ret = WOLFSSL_SUCCESS;
  12490. }
  12491. return ret;
  12492. }
  12493. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void)
  12494. {
  12495. static WOLFSSL_BIO_METHOD meth;
  12496. WOLFSSL_ENTER("BIO_f_buffer");
  12497. meth.type = WOLFSSL_BIO_BUFFER;
  12498. return &meth;
  12499. }
  12500. #ifndef NO_WOLFSSL_STUB
  12501. long wolfSSL_BIO_set_write_buffer_size(WOLFSSL_BIO* bio, long size)
  12502. {
  12503. /* wolfSSL has internal buffer, compatibility only */
  12504. WOLFSSL_ENTER("BIO_set_write_buffer_size");
  12505. WOLFSSL_STUB("BIO_set_write_buffer_size");
  12506. (void)bio;
  12507. return size;
  12508. }
  12509. #endif
  12510. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_bio(void)
  12511. {
  12512. static WOLFSSL_BIO_METHOD bio_meth;
  12513. WOLFSSL_ENTER("wolfSSL_BIO_s_bio");
  12514. bio_meth.type = WOLFSSL_BIO_BIO;
  12515. return &bio_meth;
  12516. }
  12517. #ifndef NO_FILESYSTEM
  12518. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_file(void)
  12519. {
  12520. static WOLFSSL_BIO_METHOD file_meth;
  12521. WOLFSSL_ENTER("wolfSSL_BIO_s_file");
  12522. file_meth.type = WOLFSSL_BIO_FILE;
  12523. return &file_meth;
  12524. }
  12525. #endif
  12526. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_ssl(void)
  12527. {
  12528. static WOLFSSL_BIO_METHOD meth;
  12529. WOLFSSL_ENTER("wolfSSL_BIO_f_ssl");
  12530. meth.type = WOLFSSL_BIO_SSL;
  12531. return &meth;
  12532. }
  12533. WOLFSSL_BIO_METHOD *wolfSSL_BIO_s_socket(void)
  12534. {
  12535. static WOLFSSL_BIO_METHOD meth;
  12536. WOLFSSL_ENTER("wolfSSL_BIO_s_socket");
  12537. meth.type = WOLFSSL_BIO_SOCKET;
  12538. return &meth;
  12539. }
  12540. WOLFSSL_BIO* wolfSSL_BIO_new_socket(int sfd, int closeF)
  12541. {
  12542. WOLFSSL_BIO* bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
  12543. WOLFSSL_ENTER("BIO_new_socket");
  12544. if (bio) {
  12545. bio->type = WOLFSSL_BIO_SOCKET;
  12546. bio->shutdown = (byte)closeF;
  12547. bio->num = sfd;
  12548. }
  12549. return bio;
  12550. }
  12551. int wolfSSL_BIO_eof(WOLFSSL_BIO* b)
  12552. {
  12553. WOLFSSL_ENTER("BIO_eof");
  12554. if ((b != NULL) && (b->eof))
  12555. return 1;
  12556. return 0;
  12557. }
  12558. long wolfSSL_BIO_set_ssl(WOLFSSL_BIO* b, WOLFSSL* ssl, int closeF)
  12559. {
  12560. WOLFSSL_ENTER("wolfSSL_BIO_set_ssl");
  12561. if (b != NULL) {
  12562. b->ptr = ssl;
  12563. b->shutdown = (byte)closeF;
  12564. /* add to ssl for bio free if SSL_free called before/instead of free_all? */
  12565. }
  12566. return 0;
  12567. }
  12568. #ifndef NO_FILESYSTEM
  12569. long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int closeF)
  12570. {
  12571. WOLFSSL_ENTER("wolfSSL_BIO_set_fd");
  12572. if (b != NULL) {
  12573. b->num = fd;
  12574. b->shutdown = (byte)closeF;
  12575. }
  12576. return WOLFSSL_SUCCESS;
  12577. }
  12578. #endif
  12579. /* Sets the close flag */
  12580. int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag)
  12581. {
  12582. WOLFSSL_ENTER("wolfSSL_BIO_set_close");
  12583. if (b != NULL) {
  12584. b->shutdown = (byte)flag;
  12585. }
  12586. return WOLFSSL_SUCCESS;
  12587. }
  12588. WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD* method)
  12589. {
  12590. WOLFSSL_BIO* bio;
  12591. WOLFSSL_ENTER("wolfSSL_BIO_new");
  12592. if (method == NULL) {
  12593. WOLFSSL_MSG("Bad method pointer passed in");
  12594. return NULL;
  12595. }
  12596. bio = (WOLFSSL_BIO*) XMALLOC(sizeof(WOLFSSL_BIO), 0,
  12597. DYNAMIC_TYPE_OPENSSL);
  12598. if (bio) {
  12599. XMEMSET(bio, 0, sizeof(WOLFSSL_BIO));
  12600. bio->type = (byte)method->type;
  12601. bio->method = method;
  12602. bio->shutdown = BIO_CLOSE; /* default to close things */
  12603. bio->init = 1;
  12604. if (method->type != WOLFSSL_BIO_FILE &&
  12605. method->type != WOLFSSL_BIO_SOCKET &&
  12606. method->type != WOLFSSL_BIO_MD) {
  12607. bio->mem_buf =(WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM),
  12608. 0, DYNAMIC_TYPE_OPENSSL);
  12609. if (bio->mem_buf == NULL) {
  12610. WOLFSSL_MSG("Memory error");
  12611. wolfSSL_BIO_free(bio);
  12612. return NULL;
  12613. }
  12614. bio->mem_buf->data = (char*)bio->ptr;
  12615. }
  12616. if (method->type == WOLFSSL_BIO_MD) {
  12617. bio->ptr = wolfSSL_EVP_MD_CTX_new();
  12618. if (bio->ptr == NULL) {
  12619. WOLFSSL_MSG("Memory error");
  12620. wolfSSL_BIO_free(bio);
  12621. return NULL;
  12622. }
  12623. }
  12624. /* check if is custom method */
  12625. if (method->createCb) {
  12626. method->createCb(bio);
  12627. }
  12628. }
  12629. return bio;
  12630. }
  12631. WOLFSSL_BIO* wolfSSL_BIO_new_mem_buf(const void* buf, int len)
  12632. {
  12633. WOLFSSL_BIO* bio = NULL;
  12634. if (buf == NULL) {
  12635. return bio;
  12636. }
  12637. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  12638. if (bio == NULL) {
  12639. return bio;
  12640. }
  12641. if (len < 0) {
  12642. len = (int)XSTRLEN((const char*)buf);
  12643. }
  12644. bio->num = bio->wrSz = len;
  12645. bio->ptr = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL);
  12646. if (bio->ptr == NULL) {
  12647. wolfSSL_BIO_free(bio);
  12648. return NULL;
  12649. }
  12650. if (bio->mem_buf != NULL) {
  12651. bio->mem_buf->data = (char*)bio->ptr;
  12652. bio->mem_buf->length = bio->num;
  12653. }
  12654. XMEMCPY(bio->ptr, buf, len);
  12655. return bio;
  12656. }
  12657. /*
  12658. * Note : If the flag BIO_NOCLOSE is set then freeing memory buffers is up
  12659. * to the application.
  12660. * Returns 1 on success, 0 on failure
  12661. */
  12662. int wolfSSL_BIO_free(WOLFSSL_BIO* bio)
  12663. {
  12664. int ret;
  12665. /* unchain?, doesn't matter in goahead since from free all */
  12666. WOLFSSL_ENTER("wolfSSL_BIO_free");
  12667. if (bio) {
  12668. if (bio->infoCb) {
  12669. /* info callback is called before free */
  12670. ret = (int)bio->infoCb(bio, WOLFSSL_BIO_CB_FREE, NULL, 0, 0, 1);
  12671. if (ret <= 0) {
  12672. return ret;
  12673. }
  12674. }
  12675. /* call custom set free callback */
  12676. if (bio->method && bio->method->freeCb) {
  12677. bio->method->freeCb(bio);
  12678. }
  12679. /* remove from pair by setting the paired bios pair to NULL */
  12680. if (bio->pair != NULL) {
  12681. bio->pair->pair = NULL;
  12682. }
  12683. if (bio->shutdown) {
  12684. if (bio->type == WOLFSSL_BIO_SSL && bio->ptr)
  12685. wolfSSL_free((WOLFSSL*)bio->ptr);
  12686. #ifdef CloseSocket
  12687. if (bio->type == WOLFSSL_BIO_SOCKET && bio->num)
  12688. CloseSocket(bio->num);
  12689. #endif
  12690. }
  12691. #ifndef NO_FILESYSTEM
  12692. if (bio->type == WOLFSSL_BIO_FILE && bio->shutdown == BIO_CLOSE) {
  12693. if (bio->ptr) {
  12694. XFCLOSE((XFILE)bio->ptr);
  12695. }
  12696. }
  12697. #endif
  12698. if (bio->shutdown != BIO_NOCLOSE) {
  12699. if (bio->type == WOLFSSL_BIO_MEMORY && bio->ptr != NULL) {
  12700. if (bio->mem_buf != NULL) {
  12701. if (bio->mem_buf->data != (char*)bio->ptr) {
  12702. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  12703. bio->ptr = NULL;
  12704. }
  12705. }
  12706. else {
  12707. XFREE(bio->ptr, bio->heap, DYNAMIC_TYPE_OPENSSL);
  12708. bio->ptr = NULL;
  12709. }
  12710. }
  12711. if (bio->mem_buf != NULL) {
  12712. wolfSSL_BUF_MEM_free(bio->mem_buf);
  12713. bio->mem_buf = NULL;
  12714. }
  12715. }
  12716. if (bio->type == WOLFSSL_BIO_MD) {
  12717. wolfSSL_EVP_MD_CTX_free((WOLFSSL_EVP_MD_CTX*)bio->ptr);
  12718. }
  12719. XFREE(bio, 0, DYNAMIC_TYPE_OPENSSL);
  12720. }
  12721. return 1;
  12722. }
  12723. /* like BIO_free, but no return value */
  12724. void wolfSSL_BIO_vfree(WOLFSSL_BIO* bio)
  12725. {
  12726. wolfSSL_BIO_free(bio);
  12727. }
  12728. int wolfSSL_BIO_free_all(WOLFSSL_BIO* bio)
  12729. {
  12730. WOLFSSL_ENTER("BIO_free_all");
  12731. while (bio) {
  12732. WOLFSSL_BIO* next = bio->next;
  12733. wolfSSL_BIO_free(bio);
  12734. bio = next;
  12735. }
  12736. return 0;
  12737. }
  12738. WOLFSSL_BIO* wolfSSL_BIO_push(WOLFSSL_BIO* top, WOLFSSL_BIO* append)
  12739. {
  12740. WOLFSSL_ENTER("BIO_push");
  12741. top->next = append;
  12742. append->prev = top;
  12743. return top;
  12744. }
  12745. #endif /* OPENSSL_EXTRA */
  12746. #ifdef WOLFSSL_ENCRYPTED_KEYS
  12747. void wolfSSL_CTX_set_default_passwd_cb_userdata(WOLFSSL_CTX* ctx,
  12748. void* userdata)
  12749. {
  12750. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb_userdata");
  12751. if (ctx)
  12752. ctx->passwd_userdata = userdata;
  12753. }
  12754. void wolfSSL_CTX_set_default_passwd_cb(WOLFSSL_CTX* ctx,pem_password_cb* cb)
  12755. {
  12756. WOLFSSL_ENTER("SSL_CTX_set_default_passwd_cb");
  12757. if (ctx)
  12758. ctx->passwd_cb = cb;
  12759. }
  12760. pem_password_cb* wolfSSL_CTX_get_default_passwd_cb(WOLFSSL_CTX *ctx)
  12761. {
  12762. if (ctx == NULL || ctx->passwd_cb == NULL) {
  12763. return NULL;
  12764. }
  12765. return ctx->passwd_cb;
  12766. }
  12767. void* wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx)
  12768. {
  12769. if (ctx == NULL) {
  12770. return NULL;
  12771. }
  12772. return ctx->passwd_userdata;
  12773. }
  12774. #endif /* WOLFSSL_ENCRYPTED_KEYS */
  12775. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  12776. int wolfSSL_num_locks(void)
  12777. {
  12778. return 0;
  12779. }
  12780. void wolfSSL_set_locking_callback(void (*f)(int, int, const char*, int))
  12781. {
  12782. WOLFSSL_ENTER("wolfSSL_set_locking_callback");
  12783. if (wc_SetMutexCb(f) != 0) {
  12784. WOLFSSL_MSG("Error when setting mutex call back");
  12785. }
  12786. }
  12787. typedef unsigned long (idCb)(void);
  12788. static idCb* inner_idCb = NULL;
  12789. unsigned long wolfSSL_thread_id(void)
  12790. {
  12791. if (inner_idCb != NULL) {
  12792. return inner_idCb();
  12793. }
  12794. else {
  12795. return 0;
  12796. }
  12797. }
  12798. void wolfSSL_set_id_callback(unsigned long (*f)(void))
  12799. {
  12800. inner_idCb = f;
  12801. }
  12802. unsigned long wolfSSL_ERR_get_error(void)
  12803. {
  12804. WOLFSSL_ENTER("wolfSSL_ERR_get_error");
  12805. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  12806. {
  12807. unsigned long ret = wolfSSL_ERR_peek_error_line_data(NULL, NULL,
  12808. NULL, NULL);
  12809. wc_RemoveErrorNode(-1);
  12810. return ret;
  12811. }
  12812. #elif (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE))
  12813. {
  12814. int ret = wc_PullErrorNode(NULL, NULL, NULL);
  12815. if (ret < 0) {
  12816. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  12817. WOLFSSL_MSG("Error with pulling error node!");
  12818. WOLFSSL_LEAVE("wolfSSL_ERR_get_error", ret);
  12819. ret = 0 - ret; /* return absolute value of error */
  12820. /* panic and try to clear out nodes */
  12821. wc_ClearErrorNodes();
  12822. }
  12823. return (unsigned long)ret;
  12824. }
  12825. #else
  12826. return (unsigned long)(0 - NOT_COMPILED_IN);
  12827. #endif
  12828. }
  12829. #if (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE))
  12830. /* print out and clear all errors */
  12831. void wolfSSL_ERR_print_errors(WOLFSSL_BIO* bio)
  12832. {
  12833. const char* file = NULL;
  12834. const char* reason = NULL;
  12835. int ret;
  12836. int line = 0;
  12837. char buf[WOLFSSL_MAX_ERROR_SZ * 2];
  12838. WOLFSSL_ENTER("wolfSSL_ERR_print_errors");
  12839. if (bio == NULL) {
  12840. WOLFSSL_MSG("BIO passed in was null");
  12841. return;
  12842. }
  12843. do {
  12844. ret = wc_PeekErrorNode(0, &file, &reason, &line);
  12845. if (ret >= 0) {
  12846. const char* r = wolfSSL_ERR_reason_error_string(0 - ret);
  12847. XSNPRINTF(buf, sizeof(buf), "error:%d:wolfSSL library:%s:%s:%d\n",
  12848. ret, r, file, line);
  12849. wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf));
  12850. wc_RemoveErrorNode(0);
  12851. }
  12852. } while (ret >= 0);
  12853. }
  12854. #endif /* OPENSSL_EXTRA || DEBUG_WOLFSSL_VERBOSE */
  12855. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  12856. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  12857. #if !defined(NO_WOLFSSL_SERVER)
  12858. size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out,
  12859. size_t outSz)
  12860. {
  12861. size_t size;
  12862. /* return max size of buffer */
  12863. if (outSz == 0) {
  12864. return RAN_LEN;
  12865. }
  12866. if (ssl == NULL || out == NULL) {
  12867. return 0;
  12868. }
  12869. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  12870. WOLFSSL_MSG("Arrays struct not saved after handshake");
  12871. return 0;
  12872. }
  12873. if (outSz > RAN_LEN) {
  12874. size = RAN_LEN;
  12875. }
  12876. else {
  12877. size = outSz;
  12878. }
  12879. XMEMCPY(out, ssl->arrays->serverRandom, size);
  12880. return size;
  12881. }
  12882. #endif /* !NO_WOLFSSL_SERVER */
  12883. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  12884. #ifdef OPENSSL_EXTRA
  12885. #if !defined(NO_WOLFSSL_SERVER)
  12886. /* Used to get the peer ephemeral public key sent during the connection
  12887. * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called
  12888. * before the ephemeral key is stored.
  12889. * return WOLFSSL_SUCCESS on success */
  12890. int wolfSSL_get_server_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey)
  12891. {
  12892. WOLFSSL_EVP_PKEY* ret = NULL;
  12893. WOLFSSL_ENTER("wolfSSL_get_server_tmp_key");
  12894. if (ssl == NULL || pkey == NULL) {
  12895. WOLFSSL_MSG("Bad argument passed in");
  12896. return WOLFSSL_FAILURE;
  12897. }
  12898. #ifdef HAVE_ECC
  12899. if (ssl->peerEccKey != NULL) {
  12900. unsigned char* der;
  12901. const unsigned char* pt;
  12902. unsigned int derSz = 0;
  12903. int sz;
  12904. if (wc_ecc_export_x963(ssl->peerEccKey, NULL, &derSz) !=
  12905. LENGTH_ONLY_E) {
  12906. WOLFSSL_MSG("get ecc der size failed");
  12907. return WOLFSSL_FAILURE;
  12908. }
  12909. derSz += MAX_SEQ_SZ + (2 * MAX_ALGO_SZ) + MAX_SEQ_SZ + TRAILING_ZERO;
  12910. der = (unsigned char*)XMALLOC(derSz, ssl->heap, DYNAMIC_TYPE_KEY);
  12911. if (der == NULL) {
  12912. WOLFSSL_MSG("Memory error");
  12913. return WOLFSSL_FAILURE;
  12914. }
  12915. if ((sz = wc_EccPublicKeyToDer(ssl->peerEccKey, der, derSz, 1)) <= 0) {
  12916. WOLFSSL_MSG("get ecc der failed");
  12917. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  12918. return WOLFSSL_FAILURE;
  12919. }
  12920. pt = der; /* in case pointer gets advanced */
  12921. ret = wolfSSL_d2i_PUBKEY(NULL, &pt, sz);
  12922. XFREE(der, ssl->heap, DYNAMIC_TYPE_KEY);
  12923. }
  12924. #endif
  12925. *pkey = ret;
  12926. if (ret == NULL)
  12927. return WOLFSSL_FAILURE;
  12928. else
  12929. return WOLFSSL_SUCCESS;
  12930. }
  12931. #endif /* !NO_WOLFSSL_SERVER */
  12932. int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
  12933. {
  12934. WOLFSSL_ENTER("wolfSSL_CTX_set_min_proto_version");
  12935. if (ctx == NULL) {
  12936. return BAD_FUNC_ARG;
  12937. }
  12938. switch (version) {
  12939. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  12940. case SSL3_VERSION:
  12941. ctx->minDowngrade = SSLv3_MINOR;
  12942. break;
  12943. #endif
  12944. #ifndef NO_TLS
  12945. #ifndef NO_OLD_TLS
  12946. #ifdef WOLFSSL_ALLOW_TLSV10
  12947. case TLS1_VERSION:
  12948. ctx->minDowngrade = TLSv1_MINOR;
  12949. break;
  12950. #endif
  12951. case TLS1_1_VERSION:
  12952. ctx->minDowngrade = TLSv1_1_MINOR;
  12953. break;
  12954. #endif
  12955. #ifndef WOLFSSL_NO_TLS12
  12956. case TLS1_2_VERSION:
  12957. ctx->minDowngrade = TLSv1_2_MINOR;
  12958. break;
  12959. #endif
  12960. #ifdef WOLFSSL_TLS13
  12961. case TLS1_3_VERSION:
  12962. ctx->minDowngrade = TLSv1_3_MINOR;
  12963. break;
  12964. #endif
  12965. #endif
  12966. #ifdef WOLFSSL_DTLS
  12967. #ifndef NO_OLD_TLS
  12968. case DTLS1_VERSION:
  12969. ctx->minDowngrade = DTLS_MINOR;
  12970. break;
  12971. #endif
  12972. case DTLS1_2_VERSION:
  12973. ctx->minDowngrade = DTLSv1_2_MINOR;
  12974. break;
  12975. #endif
  12976. default:
  12977. return BAD_FUNC_ARG;
  12978. }
  12979. return WOLFSSL_SUCCESS;
  12980. }
  12981. int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int ver)
  12982. {
  12983. WOLFSSL_ENTER("wolfSSL_CTX_set_max_proto_version");
  12984. /* supported only at compile-time only */
  12985. (void)ctx;
  12986. (void)ver;
  12987. return WOLFSSL_SUCCESS;
  12988. }
  12989. #endif /* OPENSSL_EXTRA */
  12990. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  12991. #if !defined(NO_WOLFSSL_CLIENT)
  12992. /* Return the amount of random bytes copied over or error case.
  12993. * ssl : ssl struct after handshake
  12994. * out : buffer to hold random bytes
  12995. * outSz : either 0 (return max buffer sz) or size of out buffer
  12996. *
  12997. * NOTE: wolfSSL_KeepArrays(ssl) must be called to retain handshake information.
  12998. */
  12999. size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out,
  13000. size_t outSz)
  13001. {
  13002. size_t size;
  13003. /* return max size of buffer */
  13004. if (outSz == 0) {
  13005. return RAN_LEN;
  13006. }
  13007. if (ssl == NULL || out == NULL) {
  13008. return 0;
  13009. }
  13010. if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
  13011. WOLFSSL_MSG("Arrays struct not saved after handshake");
  13012. return 0;
  13013. }
  13014. if (outSz > RAN_LEN) {
  13015. size = RAN_LEN;
  13016. }
  13017. else {
  13018. size = outSz;
  13019. }
  13020. XMEMCPY(out, ssl->arrays->clientRandom, size);
  13021. return size;
  13022. }
  13023. #endif /* !NO_WOLFSSL_CLIENT */
  13024. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  13025. #ifdef OPENSSL_EXTRA
  13026. unsigned long wolfSSLeay(void)
  13027. {
  13028. return SSLEAY_VERSION_NUMBER;
  13029. }
  13030. unsigned long wolfSSL_OpenSSL_version_num(void)
  13031. {
  13032. return OPENSSL_VERSION_NUMBER;
  13033. }
  13034. const char* wolfSSLeay_version(int type)
  13035. {
  13036. static const char* version = "SSLeay wolfSSL compatibility";
  13037. (void)type;
  13038. return version;
  13039. }
  13040. #ifndef NO_MD5
  13041. int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX* md5)
  13042. {
  13043. int ret;
  13044. typedef char md5_test[sizeof(MD5_CTX) >= sizeof(wc_Md5) ? 1 : -1];
  13045. (void)sizeof(md5_test);
  13046. WOLFSSL_ENTER("MD5_Init");
  13047. ret = wc_InitMd5((wc_Md5*)md5);
  13048. /* return 1 on success, 0 otherwise */
  13049. if (ret == 0)
  13050. return 1;
  13051. return 0;
  13052. }
  13053. int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX* md5, const void* input,
  13054. unsigned long sz)
  13055. {
  13056. int ret;
  13057. WOLFSSL_ENTER("wolfSSL_MD5_Update");
  13058. ret = wc_Md5Update((wc_Md5*)md5, (const byte*)input, (word32)sz);
  13059. /* return 1 on success, 0 otherwise */
  13060. if (ret == 0)
  13061. return 1;
  13062. return 0;
  13063. }
  13064. int wolfSSL_MD5_Final(byte* input, WOLFSSL_MD5_CTX* md5)
  13065. {
  13066. int ret;
  13067. WOLFSSL_ENTER("MD5_Final");
  13068. ret = wc_Md5Final((wc_Md5*)md5, input);
  13069. /* return 1 on success, 0 otherwise */
  13070. if (ret == 0)
  13071. return 1;
  13072. return 0;
  13073. }
  13074. #endif /* !NO_MD5 */
  13075. #ifndef NO_SHA
  13076. int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX* sha)
  13077. {
  13078. int ret;
  13079. typedef char sha_test[sizeof(SHA_CTX) >= sizeof(wc_Sha) ? 1 : -1];
  13080. (void)sizeof(sha_test);
  13081. WOLFSSL_ENTER("SHA_Init");
  13082. ret = wc_InitSha((wc_Sha*)sha);
  13083. /* return 1 on success, 0 otherwise */
  13084. if (ret == 0)
  13085. return 1;
  13086. return 0;
  13087. }
  13088. int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  13089. unsigned long sz)
  13090. {
  13091. int ret;
  13092. WOLFSSL_ENTER("SHA_Update");
  13093. ret = wc_ShaUpdate((wc_Sha*)sha, (const byte*)input, (word32)sz);
  13094. /* return 1 on success, 0 otherwise */
  13095. if (ret == 0)
  13096. return 1;
  13097. return 0;
  13098. }
  13099. int wolfSSL_SHA_Final(byte* input, WOLFSSL_SHA_CTX* sha)
  13100. {
  13101. int ret;
  13102. WOLFSSL_ENTER("SHA_Final");
  13103. ret = wc_ShaFinal((wc_Sha*)sha, input);
  13104. /* return 1 on success, 0 otherwise */
  13105. if (ret == 0)
  13106. return 1;
  13107. return 0;
  13108. }
  13109. int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha)
  13110. {
  13111. WOLFSSL_ENTER("SHA1_Init");
  13112. return SHA_Init(sha);
  13113. }
  13114. int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX* sha, const void* input,
  13115. unsigned long sz)
  13116. {
  13117. WOLFSSL_ENTER("SHA1_Update");
  13118. return SHA_Update(sha, input, sz);
  13119. }
  13120. int wolfSSL_SHA1_Final(byte* input, WOLFSSL_SHA_CTX* sha)
  13121. {
  13122. WOLFSSL_ENTER("SHA1_Final");
  13123. return SHA_Final(input, sha);
  13124. }
  13125. #endif /* !NO_SHA */
  13126. #ifdef WOLFSSL_SHA224
  13127. int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX* sha)
  13128. {
  13129. int ret;
  13130. typedef char sha_test[sizeof(SHA224_CTX) >= sizeof(wc_Sha224) ? 1 : -1];
  13131. (void)sizeof(sha_test);
  13132. WOLFSSL_ENTER("SHA224_Init");
  13133. ret = wc_InitSha224((wc_Sha224*)sha);
  13134. /* return 1 on success, 0 otherwise */
  13135. if (ret == 0)
  13136. return 1;
  13137. return 0;
  13138. }
  13139. int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX* sha, const void* input,
  13140. unsigned long sz)
  13141. {
  13142. int ret;
  13143. WOLFSSL_ENTER("SHA224_Update");
  13144. ret = wc_Sha224Update((wc_Sha224*)sha, (const byte*)input, (word32)sz);
  13145. /* return 1 on success, 0 otherwise */
  13146. if (ret == 0)
  13147. return 1;
  13148. return 0;
  13149. }
  13150. int wolfSSL_SHA224_Final(byte* input, WOLFSSL_SHA224_CTX* sha)
  13151. {
  13152. int ret;
  13153. WOLFSSL_ENTER("SHA224_Final");
  13154. ret = wc_Sha224Final((wc_Sha224*)sha, input);
  13155. /* return 1 on success, 0 otherwise */
  13156. if (ret == 0)
  13157. return 1;
  13158. return 0;
  13159. }
  13160. #endif /* WOLFSSL_SHA224 */
  13161. int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX* sha256)
  13162. {
  13163. int ret;
  13164. typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(wc_Sha256) ? 1 : -1];
  13165. (void)sizeof(sha_test);
  13166. WOLFSSL_ENTER("SHA256_Init");
  13167. ret = wc_InitSha256((wc_Sha256*)sha256);
  13168. /* return 1 on success, 0 otherwise */
  13169. if (ret == 0)
  13170. return 1;
  13171. return 0;
  13172. }
  13173. int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX* sha, const void* input,
  13174. unsigned long sz)
  13175. {
  13176. int ret;
  13177. WOLFSSL_ENTER("SHA256_Update");
  13178. ret = wc_Sha256Update((wc_Sha256*)sha, (const byte*)input, (word32)sz);
  13179. /* return 1 on success, 0 otherwise */
  13180. if (ret == 0)
  13181. return 1;
  13182. return 0;
  13183. }
  13184. int wolfSSL_SHA256_Final(byte* input, WOLFSSL_SHA256_CTX* sha)
  13185. {
  13186. int ret;
  13187. WOLFSSL_ENTER("SHA256_Final");
  13188. ret = wc_Sha256Final((wc_Sha256*)sha, input);
  13189. /* return 1 on success, 0 otherwise */
  13190. if (ret == 0)
  13191. return 1;
  13192. return 0;
  13193. }
  13194. #ifdef WOLFSSL_SHA384
  13195. int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX* sha)
  13196. {
  13197. int ret;
  13198. typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(wc_Sha384) ? 1 : -1];
  13199. (void)sizeof(sha_test);
  13200. WOLFSSL_ENTER("SHA384_Init");
  13201. ret = wc_InitSha384((wc_Sha384*)sha);
  13202. /* return 1 on success, 0 otherwise */
  13203. if (ret == 0)
  13204. return 1;
  13205. return 0;
  13206. }
  13207. int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX* sha, const void* input,
  13208. unsigned long sz)
  13209. {
  13210. int ret;
  13211. WOLFSSL_ENTER("SHA384_Update");
  13212. ret = wc_Sha384Update((wc_Sha384*)sha, (const byte*)input, (word32)sz);
  13213. /* return 1 on success, 0 otherwise */
  13214. if (ret == 0)
  13215. return 1;
  13216. return 0;
  13217. }
  13218. int wolfSSL_SHA384_Final(byte* input, WOLFSSL_SHA384_CTX* sha)
  13219. {
  13220. int ret;
  13221. WOLFSSL_ENTER("SHA384_Final");
  13222. ret = wc_Sha384Final((wc_Sha384*)sha, input);
  13223. /* return 1 on success, 0 otherwise */
  13224. if (ret == 0)
  13225. return 1;
  13226. return 0;
  13227. }
  13228. #endif /* WOLFSSL_SHA384 */
  13229. #ifdef WOLFSSL_SHA512
  13230. int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX* sha)
  13231. {
  13232. int ret;
  13233. typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(wc_Sha512) ? 1 : -1];
  13234. (void)sizeof(sha_test);
  13235. WOLFSSL_ENTER("SHA512_Init");
  13236. ret = wc_InitSha512((wc_Sha512*)sha);
  13237. /* return 1 on success, 0 otherwise */
  13238. if (ret == 0)
  13239. return 1;
  13240. return 0;
  13241. }
  13242. int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX* sha, const void* input,
  13243. unsigned long sz)
  13244. {
  13245. int ret;
  13246. WOLFSSL_ENTER("SHA512_Update");
  13247. ret = wc_Sha512Update((wc_Sha512*)sha, (const byte*)input, (word32)sz);
  13248. /* return 1 on success, 0 otherwise */
  13249. if (ret == 0)
  13250. return 1;
  13251. return 0;
  13252. }
  13253. int wolfSSL_SHA512_Final(byte* input, WOLFSSL_SHA512_CTX* sha)
  13254. {
  13255. int ret;
  13256. WOLFSSL_ENTER("SHA512_Final");
  13257. ret = wc_Sha512Final((wc_Sha512*)sha, input);
  13258. /* return 1 on success, 0 otherwise */
  13259. if (ret == 0)
  13260. return 1;
  13261. return 0;
  13262. }
  13263. #endif /* WOLFSSL_SHA512 */
  13264. #ifdef WOLFSSL_SHA3
  13265. #ifndef WOLFSSL_NOSHA3_224
  13266. int wolfSSL_SHA3_224_Init(WOLFSSL_SHA3_224_CTX* sha)
  13267. {
  13268. int ret;
  13269. typedef char sha_test[sizeof(SHA3_224_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  13270. (void)sizeof(sha_test);
  13271. WOLFSSL_ENTER("SHA3_224_Init");
  13272. ret = wc_InitSha3_224((wc_Sha3*)sha, NULL, 0);
  13273. /* return 1 on success, 0 otherwise */
  13274. if (ret == 0)
  13275. return 1;
  13276. return 0;
  13277. }
  13278. int wolfSSL_SHA3_224_Update(WOLFSSL_SHA3_224_CTX* sha, const void* input,
  13279. unsigned long sz)
  13280. {
  13281. int ret;
  13282. WOLFSSL_ENTER("SHA3_224_Update");
  13283. ret = wc_Sha3_224_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  13284. /* return 1 on success, 0 otherwise */
  13285. if (ret == 0)
  13286. return 1;
  13287. return 0;
  13288. }
  13289. int wolfSSL_SHA3_224_Final(byte* input, WOLFSSL_SHA3_224_CTX* sha)
  13290. {
  13291. int ret;
  13292. WOLFSSL_ENTER("SHA3_224_Final");
  13293. ret = wc_Sha3_224_Final((wc_Sha3*)sha, input);
  13294. /* return 1 on success, 0 otherwise */
  13295. if (ret == 0)
  13296. return 1;
  13297. return 0;
  13298. }
  13299. #endif /* WOLFSSL_NOSHA3_224 */
  13300. #ifndef WOLFSSL_NOSHA3_256
  13301. int wolfSSL_SHA3_256_Init(WOLFSSL_SHA3_256_CTX* sha3_256)
  13302. {
  13303. int ret;
  13304. typedef char sha_test[sizeof(SHA3_256_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  13305. (void)sizeof(sha_test);
  13306. WOLFSSL_ENTER("SHA3_256_Init");
  13307. ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID);
  13308. /* return 1 on success, 0 otherwise */
  13309. if (ret == 0)
  13310. return 1;
  13311. return 0;
  13312. }
  13313. int wolfSSL_SHA3_256_Update(WOLFSSL_SHA3_256_CTX* sha, const void* input,
  13314. unsigned long sz)
  13315. {
  13316. int ret;
  13317. WOLFSSL_ENTER("SHA3_256_Update");
  13318. ret = wc_Sha3_256_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  13319. /* return 1 on success, 0 otherwise */
  13320. if (ret == 0)
  13321. return 1;
  13322. return 0;
  13323. }
  13324. int wolfSSL_SHA3_256_Final(byte* input, WOLFSSL_SHA3_256_CTX* sha)
  13325. {
  13326. int ret;
  13327. WOLFSSL_ENTER("SHA3_256_Final");
  13328. ret = wc_Sha3_256_Final((wc_Sha3*)sha, input);
  13329. /* return 1 on success, 0 otherwise */
  13330. if (ret == 0)
  13331. return 1;
  13332. return 0;
  13333. }
  13334. #endif /* WOLFSSL_NOSHA3_256 */
  13335. int wolfSSL_SHA3_384_Init(WOLFSSL_SHA3_384_CTX* sha)
  13336. {
  13337. int ret;
  13338. typedef char sha_test[sizeof(SHA3_384_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  13339. (void)sizeof(sha_test);
  13340. WOLFSSL_ENTER("SHA3_384_Init");
  13341. ret = wc_InitSha3_384((wc_Sha3*)sha, NULL, 0);
  13342. /* return 1 on success, 0 otherwise */
  13343. if (ret == 0)
  13344. return 1;
  13345. return 0;
  13346. }
  13347. int wolfSSL_SHA3_384_Update(WOLFSSL_SHA3_384_CTX* sha, const void* input,
  13348. unsigned long sz)
  13349. {
  13350. int ret;
  13351. WOLFSSL_ENTER("SHA3_384_Update");
  13352. ret = wc_Sha3_384_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  13353. /* return 1 on success, 0 otherwise */
  13354. if (ret == 0)
  13355. return 1;
  13356. return 0;
  13357. }
  13358. int wolfSSL_SHA3_384_Final(byte* input, WOLFSSL_SHA3_384_CTX* sha)
  13359. {
  13360. int ret;
  13361. WOLFSSL_ENTER("SHA3_384_Final");
  13362. ret = wc_Sha3_384_Final((wc_Sha3*)sha, input);
  13363. /* return 1 on success, 0 otherwise */
  13364. if (ret == 0)
  13365. return 1;
  13366. return 0;
  13367. }
  13368. #ifndef WOLFSSL_NOSHA3_512
  13369. int wolfSSL_SHA3_512_Init(WOLFSSL_SHA3_512_CTX* sha)
  13370. {
  13371. int ret;
  13372. typedef char sha_test[sizeof(SHA3_512_CTX) >= sizeof(wc_Sha3) ? 1 : -1];
  13373. (void)sizeof(sha_test);
  13374. WOLFSSL_ENTER("SHA3_512_Init");
  13375. ret = wc_InitSha3_512((wc_Sha3*)sha, NULL, 0);
  13376. /* return 1 on success, 0 otherwise */
  13377. if (ret == 0)
  13378. return 1;
  13379. return 0;
  13380. }
  13381. int wolfSSL_SHA3_512_Update(WOLFSSL_SHA3_512_CTX* sha, const void* input,
  13382. unsigned long sz)
  13383. {
  13384. int ret;
  13385. WOLFSSL_ENTER("SHA3_512_Update");
  13386. ret = wc_Sha3_512_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz);
  13387. /* return 1 on success, 0 otherwise */
  13388. if (ret == 0)
  13389. return 1;
  13390. return 0;
  13391. }
  13392. int wolfSSL_SHA3_512_Final(byte* input, WOLFSSL_SHA3_512_CTX* sha)
  13393. {
  13394. int ret;
  13395. WOLFSSL_ENTER("SHA3_512_Final");
  13396. ret = wc_Sha3_512_Final((wc_Sha3*)sha, input);
  13397. /* return 1 on success, 0 otherwise */
  13398. if (ret == 0)
  13399. return 1;
  13400. return 0;
  13401. }
  13402. #endif /* WOLFSSL_NOSHA3_512 */
  13403. #endif /* WOLFSSL_SHA3 */
  13404. /* store for external read of iv, WOLFSSL_SUCCESS on success */
  13405. int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  13406. {
  13407. WOLFSSL_ENTER("wolfSSL_StoreExternalIV");
  13408. if (ctx == NULL) {
  13409. WOLFSSL_MSG("Bad function argument");
  13410. return WOLFSSL_FATAL_ERROR;
  13411. }
  13412. switch (ctx->cipherType) {
  13413. #ifndef NO_AES
  13414. #ifdef HAVE_AES_CBC
  13415. case AES_128_CBC_TYPE :
  13416. case AES_192_CBC_TYPE :
  13417. case AES_256_CBC_TYPE :
  13418. WOLFSSL_MSG("AES CBC");
  13419. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  13420. break;
  13421. #endif
  13422. #ifdef HAVE_AESGCM
  13423. case AES_128_GCM_TYPE :
  13424. case AES_192_GCM_TYPE :
  13425. case AES_256_GCM_TYPE :
  13426. WOLFSSL_MSG("AES GCM");
  13427. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  13428. break;
  13429. #endif /* HAVE_AESGCM */
  13430. #ifdef HAVE_AES_ECB
  13431. case AES_128_ECB_TYPE :
  13432. case AES_192_ECB_TYPE :
  13433. case AES_256_ECB_TYPE :
  13434. WOLFSSL_MSG("AES ECB");
  13435. break;
  13436. #endif
  13437. #ifdef WOLFSSL_AES_COUNTER
  13438. case AES_128_CTR_TYPE :
  13439. case AES_192_CTR_TYPE :
  13440. case AES_256_CTR_TYPE :
  13441. WOLFSSL_MSG("AES CTR");
  13442. XMEMCPY(ctx->iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  13443. break;
  13444. #endif /* WOLFSSL_AES_COUNTER */
  13445. #ifdef WOLFSSL_AES_CFB
  13446. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  13447. case AES_128_CFB1_TYPE:
  13448. case AES_192_CFB1_TYPE:
  13449. case AES_256_CFB1_TYPE:
  13450. WOLFSSL_MSG("AES CFB1");
  13451. break;
  13452. case AES_128_CFB8_TYPE:
  13453. case AES_192_CFB8_TYPE:
  13454. case AES_256_CFB8_TYPE:
  13455. WOLFSSL_MSG("AES CFB8");
  13456. break;
  13457. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  13458. case AES_128_CFB128_TYPE:
  13459. case AES_192_CFB128_TYPE:
  13460. case AES_256_CFB128_TYPE:
  13461. WOLFSSL_MSG("AES CFB128");
  13462. break;
  13463. #endif /* WOLFSSL_AES_CFB */
  13464. #if defined(WOLFSSL_AES_OFB)
  13465. case AES_128_OFB_TYPE:
  13466. case AES_192_OFB_TYPE:
  13467. case AES_256_OFB_TYPE:
  13468. WOLFSSL_MSG("AES OFB");
  13469. break;
  13470. #endif /* WOLFSSL_AES_OFB */
  13471. #ifdef WOLFSSL_AES_XTS
  13472. case AES_128_XTS_TYPE:
  13473. case AES_256_XTS_TYPE:
  13474. WOLFSSL_MSG("AES XTS");
  13475. break;
  13476. #endif /* WOLFSSL_AES_XTS */
  13477. #endif /* NO_AES */
  13478. #ifndef NO_DES3
  13479. case DES_CBC_TYPE :
  13480. WOLFSSL_MSG("DES CBC");
  13481. XMEMCPY(ctx->iv, &ctx->cipher.des.reg, DES_BLOCK_SIZE);
  13482. break;
  13483. case DES_EDE3_CBC_TYPE :
  13484. WOLFSSL_MSG("DES EDE3 CBC");
  13485. XMEMCPY(ctx->iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  13486. break;
  13487. #endif
  13488. #ifdef WOLFSSL_DES_ECB
  13489. case DES_ECB_TYPE :
  13490. WOLFSSL_MSG("DES ECB");
  13491. break;
  13492. case DES_EDE3_ECB_TYPE :
  13493. WOLFSSL_MSG("DES3 ECB");
  13494. break;
  13495. #endif
  13496. #ifdef HAVE_IDEA
  13497. case IDEA_CBC_TYPE :
  13498. WOLFSSL_MSG("IDEA CBC");
  13499. XMEMCPY(ctx->iv, &ctx->cipher.idea.reg, IDEA_BLOCK_SIZE);
  13500. break;
  13501. #endif
  13502. case ARC4_TYPE :
  13503. WOLFSSL_MSG("ARC4");
  13504. break;
  13505. case NULL_CIPHER_TYPE :
  13506. WOLFSSL_MSG("NULL");
  13507. break;
  13508. default: {
  13509. WOLFSSL_MSG("bad type");
  13510. return WOLFSSL_FATAL_ERROR;
  13511. }
  13512. }
  13513. return WOLFSSL_SUCCESS;
  13514. }
  13515. /* set internal IV from external, WOLFSSL_SUCCESS on success */
  13516. int wolfSSL_SetInternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx)
  13517. {
  13518. WOLFSSL_ENTER("wolfSSL_SetInternalIV");
  13519. if (ctx == NULL) {
  13520. WOLFSSL_MSG("Bad function argument");
  13521. return WOLFSSL_FATAL_ERROR;
  13522. }
  13523. switch (ctx->cipherType) {
  13524. #ifndef NO_AES
  13525. #ifdef HAVE_AES_CBC
  13526. case AES_128_CBC_TYPE :
  13527. case AES_192_CBC_TYPE :
  13528. case AES_256_CBC_TYPE :
  13529. WOLFSSL_MSG("AES CBC");
  13530. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  13531. break;
  13532. #endif
  13533. #ifdef HAVE_AESGCM
  13534. case AES_128_GCM_TYPE :
  13535. case AES_192_GCM_TYPE :
  13536. case AES_256_GCM_TYPE :
  13537. WOLFSSL_MSG("AES GCM");
  13538. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  13539. break;
  13540. #endif
  13541. #ifdef HAVE_AES_ECB
  13542. case AES_128_ECB_TYPE :
  13543. case AES_192_ECB_TYPE :
  13544. case AES_256_ECB_TYPE :
  13545. WOLFSSL_MSG("AES ECB");
  13546. break;
  13547. #endif
  13548. #ifdef WOLFSSL_AES_COUNTER
  13549. case AES_128_CTR_TYPE :
  13550. case AES_192_CTR_TYPE :
  13551. case AES_256_CTR_TYPE :
  13552. WOLFSSL_MSG("AES CTR");
  13553. XMEMCPY(&ctx->cipher.aes.reg, ctx->iv, AES_BLOCK_SIZE);
  13554. break;
  13555. #endif
  13556. #endif /* NO_AES */
  13557. #ifndef NO_DES3
  13558. case DES_CBC_TYPE :
  13559. WOLFSSL_MSG("DES CBC");
  13560. XMEMCPY(&ctx->cipher.des.reg, ctx->iv, DES_BLOCK_SIZE);
  13561. break;
  13562. case DES_EDE3_CBC_TYPE :
  13563. WOLFSSL_MSG("DES EDE3 CBC");
  13564. XMEMCPY(&ctx->cipher.des3.reg, ctx->iv, DES_BLOCK_SIZE);
  13565. break;
  13566. #endif
  13567. #ifdef WOLFSSL_DES_ECB
  13568. case DES_ECB_TYPE :
  13569. WOLFSSL_MSG("DES ECB");
  13570. break;
  13571. case DES_EDE3_ECB_TYPE :
  13572. WOLFSSL_MSG("DES3 ECB");
  13573. break;
  13574. #endif
  13575. #ifdef HAVE_IDEA
  13576. case IDEA_CBC_TYPE :
  13577. WOLFSSL_MSG("IDEA CBC");
  13578. XMEMCPY(&ctx->cipher.idea.reg, ctx->iv, IDEA_BLOCK_SIZE);
  13579. break;
  13580. #endif
  13581. case ARC4_TYPE :
  13582. WOLFSSL_MSG("ARC4");
  13583. break;
  13584. case NULL_CIPHER_TYPE :
  13585. WOLFSSL_MSG("NULL");
  13586. break;
  13587. default: {
  13588. WOLFSSL_MSG("bad type");
  13589. return WOLFSSL_FATAL_ERROR;
  13590. }
  13591. }
  13592. return WOLFSSL_SUCCESS;
  13593. }
  13594. unsigned char* wolfSSL_HMAC(const WOLFSSL_EVP_MD* evp_md, const void* key,
  13595. int key_len, const unsigned char* d, int n,
  13596. unsigned char* md, unsigned int* md_len)
  13597. {
  13598. int type;
  13599. int mdlen;
  13600. unsigned char* ret = NULL;
  13601. #ifdef WOLFSSL_SMALL_STACK
  13602. Hmac* hmac = NULL;
  13603. #else
  13604. Hmac hmac[1];
  13605. #endif
  13606. void* heap = NULL;
  13607. WOLFSSL_ENTER("wolfSSL_HMAC");
  13608. if (!md) {
  13609. WOLFSSL_MSG("Static buffer not supported, pass in md buffer");
  13610. return NULL; /* no static buffer support */
  13611. }
  13612. #ifndef NO_MD5
  13613. if (XSTRNCMP(evp_md, "MD5", 3) == 0) {
  13614. type = WC_MD5;
  13615. mdlen = WC_MD5_DIGEST_SIZE;
  13616. } else
  13617. #endif
  13618. #ifdef WOLFSSL_SHA224
  13619. if (XSTRNCMP(evp_md, "SHA224", 6) == 0) {
  13620. type = WC_SHA224;
  13621. mdlen = WC_SHA224_DIGEST_SIZE;
  13622. } else
  13623. #endif
  13624. #ifndef NO_SHA256
  13625. if (XSTRNCMP(evp_md, "SHA256", 6) == 0) {
  13626. type = WC_SHA256;
  13627. mdlen = WC_SHA256_DIGEST_SIZE;
  13628. } else
  13629. #endif
  13630. #ifdef WOLFSSL_SHA384
  13631. if (XSTRNCMP(evp_md, "SHA384", 6) == 0) {
  13632. type = WC_SHA384;
  13633. mdlen = WC_SHA384_DIGEST_SIZE;
  13634. } else
  13635. #endif
  13636. #ifdef WOLFSSL_SHA512
  13637. if (XSTRNCMP(evp_md, "SHA512", 6) == 0) {
  13638. type = WC_SHA512;
  13639. mdlen = WC_SHA512_DIGEST_SIZE;
  13640. } else
  13641. #endif
  13642. #ifdef WOLFSSL_SHA3
  13643. #ifndef WOLFSSL_NOSHA3_224
  13644. if (XSTRNCMP(evp_md, "SHA3_224", 8) == 0) {
  13645. type = WC_SHA3_224;
  13646. mdlen = WC_SHA3_224_DIGEST_SIZE;
  13647. } else
  13648. #endif
  13649. #ifndef WOLFSSL_NOSHA3_256
  13650. if (XSTRNCMP(evp_md, "SHA3_256", 8) == 0) {
  13651. type = WC_SHA3_256;
  13652. mdlen = WC_SHA3_256_DIGEST_SIZE;
  13653. } else
  13654. #endif
  13655. if (XSTRNCMP(evp_md, "SHA3_384", 8) == 0) {
  13656. type = WC_SHA3_384;
  13657. mdlen = WC_SHA3_384_DIGEST_SIZE;
  13658. } else
  13659. #ifndef WOLFSSL_NOSHA3_512
  13660. if (XSTRNCMP(evp_md, "SHA3_512", 8) == 0) {
  13661. type = WC_SHA3_512;
  13662. mdlen = WC_SHA3_512_DIGEST_SIZE;
  13663. } else
  13664. #endif
  13665. #endif
  13666. #ifndef NO_SHA
  13667. if (XSTRNCMP(evp_md, "SHA", 3) == 0) {
  13668. type = WC_SHA;
  13669. mdlen = WC_SHA_DIGEST_SIZE;
  13670. } else
  13671. #endif
  13672. {
  13673. return NULL;
  13674. }
  13675. #ifdef WOLFSSL_SMALL_STACK
  13676. hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC);
  13677. if (hmac == NULL)
  13678. return NULL;
  13679. #endif
  13680. if (wc_HmacInit(hmac, heap, INVALID_DEVID) == 0) {
  13681. if (wc_HmacSetKey(hmac, type, (const byte*)key, key_len) == 0) {
  13682. if (wc_HmacUpdate(hmac, d, n) == 0) {
  13683. if (wc_HmacFinal(hmac, md) == 0) {
  13684. if (md_len)
  13685. *md_len = mdlen;
  13686. ret = md;
  13687. }
  13688. }
  13689. }
  13690. wc_HmacFree(hmac);
  13691. }
  13692. #ifdef WOLFSSL_SMALL_STACK
  13693. XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
  13694. #endif
  13695. (void)evp_md;
  13696. return ret;
  13697. }
  13698. void wolfSSL_ERR_clear_error(void)
  13699. {
  13700. WOLFSSL_ENTER("wolfSSL_ERR_clear_error");
  13701. #if defined(DEBUG_WOLFSSL) || defined(WOLFSSL_NGINX) || \
  13702. defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)
  13703. wc_ClearErrorNodes();
  13704. #endif
  13705. }
  13706. int wolfSSL_RAND_status(void)
  13707. {
  13708. return WOLFSSL_SUCCESS; /* wolfCrypt provides enough seed internally */
  13709. }
  13710. #ifndef NO_WOLFSSL_STUB
  13711. void wolfSSL_RAND_add(const void* add, int len, double entropy)
  13712. {
  13713. (void)add;
  13714. (void)len;
  13715. (void)entropy;
  13716. WOLFSSL_STUB("RAND_add");
  13717. /* wolfSSL seeds/adds internally, use explicit RNG if you want
  13718. to take control */
  13719. }
  13720. #endif
  13721. #ifndef NO_DES3
  13722. /* 0 on ok */
  13723. int wolfSSL_DES_key_sched(WOLFSSL_const_DES_cblock* key,
  13724. WOLFSSL_DES_key_schedule* schedule)
  13725. {
  13726. WOLFSSL_ENTER("wolfSSL_DES_key_sched");
  13727. if (key == NULL || schedule == NULL) {
  13728. WOLFSSL_MSG("Null argument passed in");
  13729. }
  13730. else {
  13731. XMEMCPY(schedule, key, sizeof(WOLFSSL_const_DES_cblock));
  13732. }
  13733. return 0;
  13734. }
  13735. /* intended to behave similar to Kerberos mit_des_cbc_cksum
  13736. * return the last 4 bytes of cipher text */
  13737. WOLFSSL_DES_LONG wolfSSL_DES_cbc_cksum(const unsigned char* in,
  13738. WOLFSSL_DES_cblock* out, long length, WOLFSSL_DES_key_schedule* sc,
  13739. WOLFSSL_const_DES_cblock* iv)
  13740. {
  13741. WOLFSSL_DES_LONG ret;
  13742. unsigned char* tmp;
  13743. unsigned char* data = (unsigned char*)in;
  13744. long dataSz = length;
  13745. byte dynamicFlag = 0; /* when padding the buffer created needs free'd */
  13746. WOLFSSL_ENTER("wolfSSL_DES_cbc_cksum");
  13747. if (in == NULL || out == NULL || sc == NULL || iv == NULL) {
  13748. WOLFSSL_MSG("Bad argument passed in");
  13749. return 0;
  13750. }
  13751. /* if input length is not a multiple of DES_BLOCK_SIZE pad with 0s */
  13752. if (dataSz % DES_BLOCK_SIZE) {
  13753. dataSz += DES_BLOCK_SIZE - (dataSz % DES_BLOCK_SIZE);
  13754. data = (unsigned char*)XMALLOC(dataSz, NULL,
  13755. DYNAMIC_TYPE_TMP_BUFFER);
  13756. if (data == NULL) {
  13757. WOLFSSL_MSG("Issue creating temporary buffer");
  13758. return 0;
  13759. }
  13760. dynamicFlag = 1; /* set to free buffer at end */
  13761. XMEMCPY(data, in, length);
  13762. XMEMSET(data + length, 0, dataSz - length); /* padding */
  13763. }
  13764. tmp = (unsigned char*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  13765. if (tmp == NULL) {
  13766. WOLFSSL_MSG("Issue creating temporary buffer");
  13767. if (dynamicFlag == 1) {
  13768. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  13769. }
  13770. return 0;
  13771. }
  13772. wolfSSL_DES_cbc_encrypt(data, tmp, dataSz, sc,
  13773. (WOLFSSL_DES_cblock*)iv, 1);
  13774. XMEMCPY((unsigned char*)out, tmp + (dataSz - DES_BLOCK_SIZE),
  13775. DES_BLOCK_SIZE);
  13776. ret = (((*((unsigned char*)out + 4) & 0xFF) << 24)|
  13777. ((*((unsigned char*)out + 5) & 0xFF) << 16)|
  13778. ((*((unsigned char*)out + 6) & 0xFF) << 8) |
  13779. (*((unsigned char*)out + 7) & 0xFF));
  13780. XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  13781. if (dynamicFlag == 1) {
  13782. XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  13783. }
  13784. return ret;
  13785. }
  13786. void wolfSSL_DES_cbc_encrypt(const unsigned char* input,
  13787. unsigned char* output, long length,
  13788. WOLFSSL_DES_key_schedule* schedule,
  13789. WOLFSSL_DES_cblock* ivec, int enc)
  13790. {
  13791. Des myDes;
  13792. byte lastblock[DES_BLOCK_SIZE];
  13793. int lb_sz;
  13794. long blk;
  13795. WOLFSSL_ENTER("DES_cbc_encrypt");
  13796. /* OpenSSL compat, no ret */
  13797. wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
  13798. lb_sz = length%DES_BLOCK_SIZE;
  13799. blk = length/DES_BLOCK_SIZE;
  13800. if (enc){
  13801. wc_Des_CbcEncrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  13802. if(lb_sz){
  13803. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  13804. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  13805. wc_Des_CbcEncrypt(&myDes, output+blk*DES_BLOCK_SIZE,
  13806. lastblock, (word32)DES_BLOCK_SIZE);
  13807. }
  13808. }
  13809. else {
  13810. wc_Des_CbcDecrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE);
  13811. if(lb_sz){
  13812. wc_Des_CbcDecrypt(&myDes, lastblock, input+length-lb_sz, (word32)DES_BLOCK_SIZE);
  13813. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  13814. }
  13815. }
  13816. }
  13817. /* WOLFSSL_DES_key_schedule is a unsigned char array of size 8 */
  13818. void wolfSSL_DES_ede3_cbc_encrypt(const unsigned char* input,
  13819. unsigned char* output, long sz,
  13820. WOLFSSL_DES_key_schedule* ks1,
  13821. WOLFSSL_DES_key_schedule* ks2,
  13822. WOLFSSL_DES_key_schedule* ks3,
  13823. WOLFSSL_DES_cblock* ivec, int enc)
  13824. {
  13825. int ret;
  13826. Des3 des;
  13827. byte key[24];/* EDE uses 24 size key */
  13828. byte lastblock[DES_BLOCK_SIZE];
  13829. int lb_sz;
  13830. long blk;
  13831. WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt");
  13832. XMEMSET(key, 0, sizeof(key));
  13833. XMEMCPY(key, *ks1, DES_BLOCK_SIZE);
  13834. XMEMCPY(&key[DES_BLOCK_SIZE], *ks2, DES_BLOCK_SIZE);
  13835. XMEMCPY(&key[DES_BLOCK_SIZE * 2], *ks3, DES_BLOCK_SIZE);
  13836. lb_sz = sz%DES_BLOCK_SIZE;
  13837. blk = sz/DES_BLOCK_SIZE;
  13838. /* OpenSSL compat, no ret */
  13839. (void)wc_Des3Init(&des, NULL, INVALID_DEVID);
  13840. if (enc) {
  13841. wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_ENCRYPTION);
  13842. ret = wc_Des3_CbcEncrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  13843. #if defined(WOLFSSL_ASYNC_CRYPT)
  13844. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  13845. #endif
  13846. (void)ret; /* ignore return codes for processing */
  13847. if(lb_sz){
  13848. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  13849. XMEMCPY(lastblock, input+sz-lb_sz, lb_sz);
  13850. ret = wc_Des3_CbcEncrypt(&des, output+blk*DES_BLOCK_SIZE,
  13851. lastblock, (word32)DES_BLOCK_SIZE);
  13852. #if defined(WOLFSSL_ASYNC_CRYPT)
  13853. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  13854. #endif
  13855. (void)ret; /* ignore return codes for processing */
  13856. }
  13857. }
  13858. else {
  13859. wc_Des3_SetKey(&des, key, (const byte*)ivec, DES_DECRYPTION);
  13860. ret = wc_Des3_CbcDecrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE);
  13861. #if defined(WOLFSSL_ASYNC_CRYPT)
  13862. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  13863. #endif
  13864. (void)ret; /* ignore return codes for processing */
  13865. if(lb_sz){
  13866. ret = wc_Des3_CbcDecrypt(&des, lastblock, input+sz-lb_sz, (word32)DES_BLOCK_SIZE);
  13867. #if defined(WOLFSSL_ASYNC_CRYPT)
  13868. ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE);
  13869. #endif
  13870. (void)ret; /* ignore return codes for processing */
  13871. XMEMCPY(output+sz-lb_sz, lastblock, lb_sz);
  13872. }
  13873. }
  13874. wc_Des3Free(&des);
  13875. }
  13876. /* correctly sets ivec for next call */
  13877. void wolfSSL_DES_ncbc_encrypt(const unsigned char* input,
  13878. unsigned char* output, long length,
  13879. WOLFSSL_DES_key_schedule* schedule, WOLFSSL_DES_cblock* ivec,
  13880. int enc)
  13881. {
  13882. Des myDes;
  13883. byte lastblock[DES_BLOCK_SIZE];
  13884. int lb_sz;
  13885. long idx = length;
  13886. long blk;
  13887. WOLFSSL_ENTER("DES_ncbc_encrypt");
  13888. /* OpenSSL compat, no ret */
  13889. if (wc_Des_SetKey(&myDes, (const byte*)schedule,
  13890. (const byte*)ivec, !enc) != 0) {
  13891. WOLFSSL_MSG("wc_Des_SetKey return error.");
  13892. return;
  13893. }
  13894. lb_sz = length%DES_BLOCK_SIZE;
  13895. blk = length/DES_BLOCK_SIZE;
  13896. idx -= sizeof(DES_cblock);
  13897. if (lb_sz) {
  13898. idx += DES_BLOCK_SIZE - lb_sz;
  13899. }
  13900. if (enc){
  13901. wc_Des_CbcEncrypt(&myDes, output, input,
  13902. (word32)blk * DES_BLOCK_SIZE);
  13903. if (lb_sz){
  13904. XMEMSET(lastblock, 0, DES_BLOCK_SIZE);
  13905. XMEMCPY(lastblock, input+length-lb_sz, lb_sz);
  13906. wc_Des_CbcEncrypt(&myDes, output + blk * DES_BLOCK_SIZE,
  13907. lastblock, (word32)DES_BLOCK_SIZE);
  13908. }
  13909. XMEMCPY(ivec, output + idx, sizeof(DES_cblock));
  13910. } else {
  13911. WOLFSSL_DES_cblock tmp;
  13912. XMEMCPY(tmp, input + idx, sizeof(DES_cblock));
  13913. wc_Des_CbcDecrypt(&myDes, output, input,
  13914. (word32)blk * DES_BLOCK_SIZE);
  13915. if (lb_sz){
  13916. wc_Des_CbcDecrypt(&myDes, lastblock, input + length - lb_sz,
  13917. (word32)DES_BLOCK_SIZE);
  13918. XMEMCPY(output+length-lb_sz, lastblock, lb_sz);
  13919. }
  13920. XMEMCPY(ivec, tmp, sizeof(WOLFSSL_DES_cblock));
  13921. }
  13922. }
  13923. #endif /* NO_DES3 */
  13924. void wolfSSL_ERR_free_strings(void)
  13925. {
  13926. /* handled internally */
  13927. }
  13928. void wolfSSL_cleanup_all_ex_data(void)
  13929. {
  13930. /* nothing to do here */
  13931. }
  13932. #endif /* OPENSSL_EXTRA */
  13933. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  13934. int wolfSSL_clear(WOLFSSL* ssl)
  13935. {
  13936. if (ssl == NULL) {
  13937. return WOLFSSL_FAILURE;
  13938. }
  13939. ssl->options.isClosed = 0;
  13940. ssl->options.connReset = 0;
  13941. ssl->options.sentNotify = 0;
  13942. ssl->options.sendVerify = 0;
  13943. ssl->options.serverState = NULL_STATE;
  13944. ssl->options.clientState = NULL_STATE;
  13945. ssl->options.connectState = CONNECT_BEGIN;
  13946. ssl->options.acceptState = ACCEPT_BEGIN;
  13947. ssl->options.handShakeState = NULL_STATE;
  13948. ssl->options.handShakeDone = 0;
  13949. /* ssl->options.processReply = doProcessInit; */
  13950. ssl->keys.encryptionOn = 0;
  13951. XMEMSET(&ssl->msgsReceived, 0, sizeof(ssl->msgsReceived));
  13952. if (ssl->hsHashes != NULL) {
  13953. #ifndef NO_OLD_TLS
  13954. #ifndef NO_MD5
  13955. if (wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap,
  13956. ssl->devId) != 0) {
  13957. return WOLFSSL_FAILURE;
  13958. }
  13959. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  13960. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  13961. #endif
  13962. #endif
  13963. #ifndef NO_SHA
  13964. if (wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap,
  13965. ssl->devId) != 0) {
  13966. return WOLFSSL_FAILURE;
  13967. }
  13968. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  13969. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  13970. #endif
  13971. #endif
  13972. #endif
  13973. #ifndef NO_SHA256
  13974. if (wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap,
  13975. ssl->devId) != 0) {
  13976. return WOLFSSL_FAILURE;
  13977. }
  13978. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  13979. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  13980. #endif
  13981. #endif
  13982. #ifdef WOLFSSL_SHA384
  13983. if (wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap,
  13984. ssl->devId) != 0) {
  13985. return WOLFSSL_FAILURE;
  13986. }
  13987. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  13988. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  13989. #endif
  13990. #endif
  13991. #ifdef WOLFSSL_SHA512
  13992. if (wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap,
  13993. ssl->devId) != 0) {
  13994. return WOLFSSL_FAILURE;
  13995. }
  13996. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  13997. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  13998. #endif
  13999. #endif
  14000. }
  14001. #ifdef SESSION_CERTS
  14002. ssl->session.chain.count = 0;
  14003. #endif
  14004. #ifdef KEEP_PEER_CERT
  14005. FreeX509(&ssl->peerCert);
  14006. InitX509(&ssl->peerCert, 0, ssl->heap);
  14007. #endif
  14008. return WOLFSSL_SUCCESS;
  14009. }
  14010. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  14011. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  14012. long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode)
  14013. {
  14014. /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */
  14015. WOLFSSL_ENTER("SSL_CTX_set_mode");
  14016. switch(mode) {
  14017. case SSL_MODE_ENABLE_PARTIAL_WRITE:
  14018. ctx->partialWrite = 1;
  14019. break;
  14020. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  14021. case SSL_MODE_RELEASE_BUFFERS:
  14022. WOLFSSL_MSG("SSL_MODE_RELEASE_BUFFERS not implemented.");
  14023. break;
  14024. #endif
  14025. default:
  14026. WOLFSSL_MSG("Mode Not Implemented");
  14027. }
  14028. /* SSL_MODE_AUTO_RETRY
  14029. * Should not return -1 with renegotiation on read/write */
  14030. return mode;
  14031. }
  14032. #endif
  14033. #ifdef OPENSSL_EXTRA
  14034. #ifndef NO_WOLFSSL_STUB
  14035. long wolfSSL_SSL_get_mode(WOLFSSL* ssl)
  14036. {
  14037. /* TODO: */
  14038. (void)ssl;
  14039. WOLFSSL_STUB("SSL_get_mode");
  14040. return 0;
  14041. }
  14042. #endif
  14043. #ifndef NO_WOLFSSL_STUB
  14044. long wolfSSL_CTX_get_mode(WOLFSSL_CTX* ctx)
  14045. {
  14046. /* TODO: */
  14047. (void)ctx;
  14048. WOLFSSL_STUB("SSL_CTX_get_mode");
  14049. return 0;
  14050. }
  14051. #endif
  14052. #ifndef NO_WOLFSSL_STUB
  14053. void wolfSSL_CTX_set_default_read_ahead(WOLFSSL_CTX* ctx, int m)
  14054. {
  14055. /* TODO: maybe? */
  14056. (void)ctx;
  14057. (void)m;
  14058. WOLFSSL_STUB("SSL_CTX_set_default_read_ahead");
  14059. }
  14060. #endif
  14061. /* Storing app session context id, this value is inherited by WOLFSSL
  14062. * objects created from WOLFSSL_CTX. Any session that is imported with a
  14063. * different session context id will be rejected.
  14064. *
  14065. * ctx structure to set context in
  14066. * sid_ctx value of context to set
  14067. * sid_ctx_len length of sid_ctx buffer
  14068. *
  14069. * Returns SSL_SUCCESS in success case and SSL_FAILURE when failing
  14070. */
  14071. int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx,
  14072. const unsigned char* sid_ctx,
  14073. unsigned int sid_ctx_len)
  14074. {
  14075. WOLFSSL_ENTER("SSL_CTX_set_session_id_context");
  14076. /* No application specific context needed for wolfSSL */
  14077. if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) {
  14078. return SSL_FAILURE;
  14079. }
  14080. XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len);
  14081. ctx->sessionCtxSz = (byte)sid_ctx_len;
  14082. return SSL_SUCCESS;
  14083. }
  14084. /* Storing app session context id. Any session that is imported with a
  14085. * different session context id will be rejected.
  14086. *
  14087. * ssl structure to set context in
  14088. * id value of context to set
  14089. * len length of sid_ctx buffer
  14090. *
  14091. * Returns SSL_SUCCESS in success case and SSL_FAILURE when failing
  14092. */
  14093. int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id,
  14094. unsigned int len)
  14095. {
  14096. WOLFSSL_ENTER("wolfSSL_set_session_id_context");
  14097. if (len > ID_LEN || ssl == NULL || id == NULL) {
  14098. return SSL_FAILURE;
  14099. }
  14100. XMEMCPY(ssl->sessionCtx, id, len);
  14101. ssl->sessionCtxSz = (byte)len;
  14102. return SSL_SUCCESS;
  14103. }
  14104. long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx)
  14105. {
  14106. (void)ctx;
  14107. #ifndef NO_SESSION_CACHE
  14108. return (long)(SESSIONS_PER_ROW * SESSION_ROWS);
  14109. #else
  14110. return 0;
  14111. #endif
  14112. }
  14113. /* returns the unsigned error value and increments the pointer into the
  14114. * error queue.
  14115. *
  14116. * file pointer to file name
  14117. * line gets set to line number of error when not NULL
  14118. */
  14119. unsigned long wolfSSL_ERR_get_error_line(const char** file, int* line)
  14120. {
  14121. #ifdef DEBUG_WOLFSSL
  14122. int ret = wc_PullErrorNode(file, NULL, line);
  14123. if (ret < 0) {
  14124. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  14125. WOLFSSL_MSG("Issue getting error node");
  14126. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line", ret);
  14127. ret = 0 - ret; /* return absolute value of error */
  14128. /* panic and try to clear out nodes */
  14129. wc_ClearErrorNodes();
  14130. }
  14131. return (unsigned long)ret;
  14132. #else
  14133. (void)file;
  14134. (void)line;
  14135. return 0;
  14136. #endif
  14137. }
  14138. #if (defined(DEBUG_WOLFSSL) || defined(OPENSSL_EXTRA)) && \
  14139. (!defined(_WIN32) && !defined(NO_ERROR_QUEUE))
  14140. static const char WOLFSSL_SYS_ACCEPT_T[] = "accept";
  14141. static const char WOLFSSL_SYS_BIND_T[] = "bind";
  14142. static const char WOLFSSL_SYS_CONNECT_T[] = "connect";
  14143. static const char WOLFSSL_SYS_FOPEN_T[] = "fopen";
  14144. static const char WOLFSSL_SYS_FREAD_T[] = "fread";
  14145. static const char WOLFSSL_SYS_GETADDRINFO_T[] = "getaddrinfo";
  14146. static const char WOLFSSL_SYS_GETSOCKOPT_T[] = "getsockopt";
  14147. static const char WOLFSSL_SYS_GETSOCKNAME_T[] = "getsockname";
  14148. static const char WOLFSSL_SYS_GETHOSTBYNAME_T[] = "gethostbyname";
  14149. static const char WOLFSSL_SYS_GETNAMEINFO_T[] = "getnameinfo";
  14150. static const char WOLFSSL_SYS_GETSERVBYNAME_T[] = "getservbyname";
  14151. static const char WOLFSSL_SYS_IOCTLSOCKET_T[] = "ioctlsocket";
  14152. static const char WOLFSSL_SYS_LISTEN_T[] = "listen";
  14153. static const char WOLFSSL_SYS_OPENDIR_T[] = "opendir";
  14154. static const char WOLFSSL_SYS_SETSOCKOPT_T[] = "setsockopt";
  14155. static const char WOLFSSL_SYS_SOCKET_T[] = "socket";
  14156. /* switch with int mapped to function name for compatibility */
  14157. static const char* wolfSSL_ERR_sys_func(int fun)
  14158. {
  14159. switch (fun) {
  14160. case WOLFSSL_SYS_ACCEPT: return WOLFSSL_SYS_ACCEPT_T;
  14161. case WOLFSSL_SYS_BIND: return WOLFSSL_SYS_BIND_T;
  14162. case WOLFSSL_SYS_CONNECT: return WOLFSSL_SYS_CONNECT_T;
  14163. case WOLFSSL_SYS_FOPEN: return WOLFSSL_SYS_FOPEN_T;
  14164. case WOLFSSL_SYS_FREAD: return WOLFSSL_SYS_FREAD_T;
  14165. case WOLFSSL_SYS_GETADDRINFO: return WOLFSSL_SYS_GETADDRINFO_T;
  14166. case WOLFSSL_SYS_GETSOCKOPT: return WOLFSSL_SYS_GETSOCKOPT_T;
  14167. case WOLFSSL_SYS_GETSOCKNAME: return WOLFSSL_SYS_GETSOCKNAME_T;
  14168. case WOLFSSL_SYS_GETHOSTBYNAME: return WOLFSSL_SYS_GETHOSTBYNAME_T;
  14169. case WOLFSSL_SYS_GETNAMEINFO: return WOLFSSL_SYS_GETNAMEINFO_T;
  14170. case WOLFSSL_SYS_GETSERVBYNAME: return WOLFSSL_SYS_GETSERVBYNAME_T;
  14171. case WOLFSSL_SYS_IOCTLSOCKET: return WOLFSSL_SYS_IOCTLSOCKET_T;
  14172. case WOLFSSL_SYS_LISTEN: return WOLFSSL_SYS_LISTEN_T;
  14173. case WOLFSSL_SYS_OPENDIR: return WOLFSSL_SYS_OPENDIR_T;
  14174. case WOLFSSL_SYS_SETSOCKOPT: return WOLFSSL_SYS_SETSOCKOPT_T;
  14175. case WOLFSSL_SYS_SOCKET: return WOLFSSL_SYS_SOCKET_T;
  14176. default:
  14177. return "NULL";
  14178. }
  14179. }
  14180. #endif /* DEBUG_WOLFSSL */
  14181. /* @TODO when having an error queue this needs to push to the queue */
  14182. void wolfSSL_ERR_put_error(int lib, int fun, int err, const char* file,
  14183. int line)
  14184. {
  14185. WOLFSSL_ENTER("wolfSSL_ERR_put_error");
  14186. #if !defined(DEBUG_WOLFSSL) && !defined(OPENSSL_EXTRA)
  14187. (void)fun;
  14188. (void)err;
  14189. (void)file;
  14190. (void)line;
  14191. WOLFSSL_MSG("Not compiled in debug mode");
  14192. #elif defined(OPENSSL_EXTRA) && \
  14193. (defined(_WIN32) || defined(NO_ERROR_QUEUE))
  14194. (void)fun;
  14195. (void)file;
  14196. (void)line;
  14197. WOLFSSL_ERROR(err);
  14198. #else
  14199. WOLFSSL_ERROR_LINE(err, wolfSSL_ERR_sys_func(fun), (unsigned int)line,
  14200. file, NULL);
  14201. #endif
  14202. (void)lib;
  14203. }
  14204. /* Similar to wolfSSL_ERR_get_error_line but takes in a flags argument for
  14205. * more flexibility.
  14206. *
  14207. * file output pointer to file where error happened
  14208. * line output to line number of error
  14209. * data output data. Is a string if ERR_TXT_STRING flag is used
  14210. * flags bit flag to adjust data output
  14211. *
  14212. * Returns the error value or 0 if no errors are in the queue
  14213. */
  14214. unsigned long wolfSSL_ERR_get_error_line_data(const char** file, int* line,
  14215. const char** data, int *flags)
  14216. {
  14217. int ret;
  14218. WOLFSSL_STUB("wolfSSL_ERR_get_error_line_data");
  14219. if (flags != NULL) {
  14220. if ((*flags & ERR_TXT_STRING) == ERR_TXT_STRING) {
  14221. ret = wc_PullErrorNode(file, data, line);
  14222. if (ret < 0) {
  14223. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  14224. WOLFSSL_MSG("Error with pulling error node!");
  14225. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  14226. ret = 0 - ret; /* return absolute value of error */
  14227. /* panic and try to clear out nodes */
  14228. wc_ClearErrorNodes();
  14229. }
  14230. return (unsigned long)ret;
  14231. }
  14232. }
  14233. ret = wc_PullErrorNode(file, NULL, line);
  14234. if (ret < 0) {
  14235. if (ret == BAD_STATE_E) return 0; /* no errors in queue */
  14236. WOLFSSL_MSG("Error with pulling error node!");
  14237. WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret);
  14238. ret = 0 - ret; /* return absolute value of error */
  14239. /* panic and try to clear out nodes */
  14240. wc_ClearErrorNodes();
  14241. }
  14242. return (unsigned long)ret;
  14243. }
  14244. #endif /* OPENSSL_EXTRA */
  14245. #if (defined(KEEP_PEER_CERT) && defined(SESSION_CERTS)) || \
  14246. (defined(OPENSSL_ALL) && defined(HAVE_PKCS7))
  14247. /* Decode the X509 DER encoded certificate into a WOLFSSL_X509 object.
  14248. *
  14249. * x509 WOLFSSL_X509 object to decode into.
  14250. * in X509 DER data.
  14251. * len Length of the X509 DER data.
  14252. * returns the new certificate on success, otherwise NULL.
  14253. */
  14254. static int DecodeToX509(WOLFSSL_X509* x509, const byte* in, int len)
  14255. {
  14256. int ret;
  14257. #ifdef WOLFSSL_SMALL_STACK
  14258. DecodedCert* cert;
  14259. #else
  14260. DecodedCert cert[1];
  14261. #endif
  14262. if (x509 == NULL || in == NULL || len <= 0)
  14263. return BAD_FUNC_ARG;
  14264. #ifdef WOLFSSL_SMALL_STACK
  14265. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  14266. DYNAMIC_TYPE_DCERT);
  14267. if (cert == NULL)
  14268. return MEMORY_E;
  14269. #endif
  14270. /* Create a DecodedCert object and copy fields into WOLFSSL_X509 object.
  14271. */
  14272. InitDecodedCert(cert, (byte*)in, len, NULL);
  14273. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) == 0) {
  14274. /* Check if x509 was not previously initialized by wolfSSL_X509_new() */
  14275. if (x509->dynamicMemory != TRUE)
  14276. InitX509(x509, 0, NULL);
  14277. ret = CopyDecodedToX509(x509, cert);
  14278. FreeDecodedCert(cert);
  14279. }
  14280. #ifdef WOLFSSL_SMALL_STACK
  14281. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  14282. #endif
  14283. return ret;
  14284. }
  14285. #endif /* (KEEP_PEER_CERT && SESSION_CERTS) || (OPENSSL_ALL && HAVE_PKCS7) */
  14286. #ifdef KEEP_PEER_CERT
  14287. WOLFSSL_ABI
  14288. WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL* ssl)
  14289. {
  14290. WOLFSSL_ENTER("SSL_get_peer_certificate");
  14291. if (ssl == NULL)
  14292. return NULL;
  14293. if (ssl->peerCert.issuer.sz)
  14294. return &ssl->peerCert;
  14295. #ifdef SESSION_CERTS
  14296. else if (ssl->session.chain.count > 0) {
  14297. if (DecodeToX509(&ssl->peerCert, ssl->session.chain.certs[0].buffer,
  14298. ssl->session.chain.certs[0].length) == 0) {
  14299. return &ssl->peerCert;
  14300. }
  14301. }
  14302. #endif
  14303. return 0;
  14304. }
  14305. #endif /* KEEP_PEER_CERT */
  14306. #if defined(SESSION_CERTS)
  14307. /* Return stack of peer certs.
  14308. * If Qt or OPENSSL_ALL is defined then return ssl->peerCertChain.
  14309. * All other cases return &ssl->session.chain
  14310. * ssl->peerCertChain is type WOLFSSL_STACK*
  14311. * ssl->session.chain is type WOLFSSL_X509_CHAIN
  14312. * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is.
  14313. */
  14314. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl)
  14315. {
  14316. WOLFSSL_STACK* sk;
  14317. WOLFSSL_ENTER("wolfSSL_get_peer_cert_chain");
  14318. if (ssl == NULL)
  14319. return NULL;
  14320. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  14321. if (ssl->peerCertChain == NULL)
  14322. wolfSSL_set_peer_cert_chain((WOLFSSL*) ssl);
  14323. sk = ssl->peerCertChain;
  14324. #else
  14325. sk = (WOLF_STACK_OF(WOLFSSL_X509)* )&ssl->session.chain;
  14326. #endif
  14327. if (sk == NULL) {
  14328. WOLFSSL_MSG("Error: Null Peer Cert Chain");
  14329. }
  14330. return sk;
  14331. }
  14332. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  14333. /* Builds up and creates a stack of peer certificates for ssl->peerCertChain
  14334. based off of the ssl session chain. Returns stack of WOLFSSL_X509 certs or
  14335. NULL on failure */
  14336. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_set_peer_cert_chain(WOLFSSL* ssl)
  14337. {
  14338. WOLFSSL_STACK* sk;
  14339. WOLFSSL_X509* x509;
  14340. int i = 0;
  14341. int ret;
  14342. WOLFSSL_ENTER("wolfSSL_set_peer_cert_chain");
  14343. if ((ssl == NULL) || (ssl->session.chain.count == 0))
  14344. return NULL;
  14345. sk = wolfSSL_sk_X509_new();
  14346. i = ssl->session.chain.count-1;
  14347. for (; i >= 0; i--) {
  14348. /* For servers, the peer certificate chain does not include the peer
  14349. certificate, so do not add it to the stack */
  14350. if (ssl->options.side == WOLFSSL_SERVER_END && i == 0)
  14351. continue;
  14352. x509 = wolfSSL_X509_new();
  14353. if (x509 == NULL) {
  14354. WOLFSSL_MSG("Error Creating X509");
  14355. return NULL;
  14356. }
  14357. ret = DecodeToX509(x509, ssl->session.chain.certs[i].buffer,
  14358. ssl->session.chain.certs[i].length);
  14359. if (ret != 0 || wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
  14360. WOLFSSL_MSG("Error decoding cert");
  14361. wolfSSL_X509_free(x509);
  14362. wolfSSL_sk_X509_free(sk);
  14363. return NULL;
  14364. }
  14365. }
  14366. if (sk == NULL) {
  14367. WOLFSSL_MSG("Null session chain");
  14368. }
  14369. /* This is Free'd when ssl is Free'd */
  14370. ssl->peerCertChain = sk;
  14371. return sk;
  14372. }
  14373. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  14374. #endif /* SESSION_CERTS */
  14375. #ifndef NO_CERTS
  14376. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  14377. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  14378. /* user externally called free X509, if dynamic go ahead with free, otherwise
  14379. * don't */
  14380. static void ExternalFreeX509(WOLFSSL_X509* x509)
  14381. {
  14382. int doFree = 0;
  14383. WOLFSSL_ENTER("ExternalFreeX509");
  14384. if (x509) {
  14385. if (x509->dynamicMemory) {
  14386. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  14387. if (wc_LockMutex(&x509->refMutex) != 0) {
  14388. WOLFSSL_MSG("Couldn't lock x509 mutex");
  14389. }
  14390. /* only free if all references to it are done */
  14391. x509->refCount--;
  14392. if (x509->refCount == 0)
  14393. doFree = 1;
  14394. wc_UnLockMutex(&x509->refMutex);
  14395. #else
  14396. doFree = 1;
  14397. #endif /* OPENSSL_EXTRA */
  14398. if (doFree) {
  14399. FreeX509(x509);
  14400. XFREE(x509, x509->heap, DYNAMIC_TYPE_X509);
  14401. }
  14402. } else {
  14403. WOLFSSL_MSG("free called on non dynamic object, not freeing");
  14404. }
  14405. }
  14406. }
  14407. /* Frees an external WOLFSSL_X509 structure */
  14408. WOLFSSL_ABI
  14409. void wolfSSL_X509_free(WOLFSSL_X509* x509)
  14410. {
  14411. WOLFSSL_ENTER("wolfSSL_FreeX509");
  14412. ExternalFreeX509(x509);
  14413. }
  14414. /* copy name into in buffer, at most sz bytes, if buffer is null will
  14415. malloc buffer, call responsible for freeing */
  14416. WOLFSSL_ABI
  14417. char* wolfSSL_X509_NAME_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  14418. {
  14419. int copySz;
  14420. if (name == NULL) {
  14421. WOLFSSL_MSG("WOLFSSL_X509_NAME pointer was NULL");
  14422. return NULL;
  14423. }
  14424. copySz = min(sz, name->sz);
  14425. WOLFSSL_ENTER("wolfSSL_X509_NAME_oneline");
  14426. if (!name->sz) return in;
  14427. if (!in) {
  14428. #ifdef WOLFSSL_STATIC_MEMORY
  14429. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  14430. return NULL;
  14431. #else
  14432. in = (char*)XMALLOC(name->sz, NULL, DYNAMIC_TYPE_OPENSSL);
  14433. if (!in ) return in;
  14434. copySz = name->sz;
  14435. #endif
  14436. }
  14437. if (copySz <= 0)
  14438. return in;
  14439. XMEMCPY(in, name->name, copySz - 1);
  14440. in[copySz - 1] = 0;
  14441. return in;
  14442. }
  14443. #if defined(OPENSSL_EXTRA) && defined(XSNPRINTF)
  14444. /* Copies X509 subject name into a buffer, with comma-separated name entries
  14445. * (matching OpenSSL v1.0.0 format)
  14446. * Example Output for Issuer:
  14447. *
  14448. * C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting,
  14449. * CN=www.wolfssl.com, emailAddress=info@wolfssl.com
  14450. */
  14451. char* wolfSSL_X509_get_name_oneline(WOLFSSL_X509_NAME* name, char* in, int sz)
  14452. {
  14453. WOLFSSL_X509_NAME_ENTRY* entry;
  14454. int nameSz, strSz, count, i, idx = 0;
  14455. int totalSz = 0;
  14456. char *str;
  14457. char tmpBuf[256];
  14458. char buf[80];
  14459. const char* sn;
  14460. WOLFSSL_ENTER("wolfSSL_X509_get_name_oneline");
  14461. if (name == NULL) {
  14462. WOLFSSL_MSG("wolfSSL_X509_get_subject_name failed");
  14463. return NULL;
  14464. }
  14465. #ifdef WOLFSSL_STATIC_MEMORY
  14466. if (!in) {
  14467. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  14468. return NULL;
  14469. }
  14470. #endif
  14471. tmpBuf[0] = '\0'; /* Make sure tmpBuf is NULL terminated */
  14472. /* Loop through X509 name entries and copy new format to buffer */
  14473. count = wolfSSL_X509_NAME_entry_count(name);
  14474. for (i = 0; i < count; i++) {
  14475. /* Get name entry and size */
  14476. entry = wolfSSL_X509_NAME_get_entry(name, i);
  14477. if (entry == NULL) {
  14478. WOLFSSL_MSG("wolfSSL_X509_NAME_get_entry failed");
  14479. return NULL;
  14480. }
  14481. nameSz = wolfSSL_X509_NAME_get_text_by_NID(name, entry->nid, buf,
  14482. sizeof(buf));
  14483. if (nameSz < 0) {
  14484. WOLFSSL_MSG("wolfSSL_X509_NAME_get_text_by_NID failed");
  14485. return NULL;
  14486. }
  14487. /* Get short name */
  14488. sn = wolfSSL_OBJ_nid2sn(entry->nid);
  14489. if (sn == NULL) {
  14490. WOLFSSL_MSG("OBJ_nid2sn failed");
  14491. return NULL;
  14492. }
  14493. /* Copy sn and name text to buffer
  14494. * Add extra strSz for '=', ',', ' ' and '\0' characters in XSNPRINTF.
  14495. */
  14496. if (i != count - 1) {
  14497. strSz = (int)XSTRLEN(sn) + nameSz + 4;
  14498. totalSz+= strSz;
  14499. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14500. if (str == NULL) {
  14501. WOLFSSL_MSG("Memory error");
  14502. return NULL;
  14503. }
  14504. XSNPRINTF(str, strSz, "%s=%s, ", sn, buf);
  14505. }
  14506. else {
  14507. /* Copy last name entry
  14508. * Add extra strSz for '=' and '\0' characters in XSNPRINTF.
  14509. */
  14510. strSz = (int)XSTRLEN(sn) + nameSz + 2;
  14511. totalSz+= strSz;
  14512. str = (char*)XMALLOC(strSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14513. if (str == NULL) {
  14514. WOLFSSL_MSG("Memory error");
  14515. return NULL;
  14516. }
  14517. XSNPRINTF(str, strSz, "%s=%s", sn, buf);
  14518. }
  14519. /* Copy string to tmpBuf */
  14520. XSTRNCAT(tmpBuf, str, strSz);
  14521. idx += strSz;
  14522. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  14523. }
  14524. /* Allocate space based on total string size if no buffer was provided */
  14525. if (!in) {
  14526. in = (char*)XMALLOC(totalSz+1, NULL, DYNAMIC_TYPE_OPENSSL);
  14527. if (in == NULL) {
  14528. WOLFSSL_MSG("Memory error");
  14529. return in;
  14530. }
  14531. }
  14532. else {
  14533. if (totalSz > sz) {
  14534. WOLFSSL_MSG("Memory error");
  14535. return NULL;
  14536. }
  14537. }
  14538. XMEMCPY(in, tmpBuf, totalSz);
  14539. in[totalSz] = '\0';
  14540. return in;
  14541. }
  14542. #endif
  14543. /* Wraps wolfSSL_X509_d2i
  14544. *
  14545. * returns a WOLFSSL_X509 structure pointer on success and NULL on fail
  14546. */
  14547. WOLFSSL_X509* wolfSSL_d2i_X509(WOLFSSL_X509** x509, const unsigned char** in,
  14548. int len)
  14549. {
  14550. WOLFSSL_X509* newX509 = NULL;
  14551. WOLFSSL_ENTER("wolfSSL_d2i_X509");
  14552. if (in == NULL) {
  14553. WOLFSSL_MSG("NULL input for wolfSSL_d2i_X509");
  14554. return NULL;
  14555. }
  14556. newX509 = wolfSSL_X509_d2i(x509, *in, len);
  14557. if (newX509 != NULL) {
  14558. *in += newX509->derCert->length;
  14559. }
  14560. return newX509;
  14561. }
  14562. WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len)
  14563. {
  14564. WOLFSSL_X509 *newX509 = NULL;
  14565. WOLFSSL_ENTER("wolfSSL_X509_d2i");
  14566. if (in != NULL && len != 0) {
  14567. #ifdef WOLFSSL_SMALL_STACK
  14568. DecodedCert* cert;
  14569. #else
  14570. DecodedCert cert[1];
  14571. #endif
  14572. #ifdef WOLFSSL_SMALL_STACK
  14573. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  14574. DYNAMIC_TYPE_DCERT);
  14575. if (cert == NULL)
  14576. return NULL;
  14577. #endif
  14578. InitDecodedCert(cert, (byte*)in, len, NULL);
  14579. if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0) {
  14580. newX509 = wolfSSL_X509_new();
  14581. if (newX509 != NULL) {
  14582. if (CopyDecodedToX509(newX509, cert) != 0) {
  14583. wolfSSL_X509_free(newX509);
  14584. newX509 = NULL;
  14585. }
  14586. }
  14587. }
  14588. FreeDecodedCert(cert);
  14589. #ifdef WOLFSSL_SMALL_STACK
  14590. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  14591. #endif
  14592. }
  14593. if (x509 != NULL)
  14594. *x509 = newX509;
  14595. return newX509;
  14596. }
  14597. int wolfSSL_X509_get_isCA(WOLFSSL_X509* x509)
  14598. {
  14599. int isCA = 0;
  14600. WOLFSSL_ENTER("wolfSSL_X509_get_isCA");
  14601. if (x509 != NULL)
  14602. isCA = x509->isCa;
  14603. WOLFSSL_LEAVE("wolfSSL_X509_get_isCA", isCA);
  14604. return isCA;
  14605. }
  14606. #endif /* KEEP_PEER_CERT || SESSION_CERTS || OPENSSL_EXTRA ||
  14607. OPENSSL_EXTRA_X509_SMALL */
  14608. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  14609. /* returns the number of entries in the WOLFSSL_X509_NAME */
  14610. int wolfSSL_X509_NAME_entry_count(WOLFSSL_X509_NAME* name)
  14611. {
  14612. int count = 0;
  14613. WOLFSSL_ENTER("wolfSSL_X509_NAME_entry_count");
  14614. if (name != NULL)
  14615. count = name->entrySz;
  14616. WOLFSSL_LEAVE("wolfSSL_X509_NAME_entry_count", count);
  14617. return count;
  14618. }
  14619. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  14620. #if defined(OPENSSL_ALL) || defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || \
  14621. defined(SESSION_CERTS)
  14622. /* return the next, if any, altname from the peer cert */
  14623. WOLFSSL_ABI
  14624. char* wolfSSL_X509_get_next_altname(WOLFSSL_X509* cert)
  14625. {
  14626. char* ret = NULL;
  14627. WOLFSSL_ENTER("wolfSSL_X509_get_next_altname");
  14628. /* don't have any to work with */
  14629. if (cert == NULL || cert->altNames == NULL)
  14630. return NULL;
  14631. /* already went through them */
  14632. if (cert->altNamesNext == NULL)
  14633. return NULL;
  14634. ret = cert->altNamesNext->name;
  14635. cert->altNamesNext = cert->altNamesNext->next;
  14636. return ret;
  14637. }
  14638. int wolfSSL_X509_get_signature(WOLFSSL_X509* x509,
  14639. unsigned char* buf, int* bufSz)
  14640. {
  14641. WOLFSSL_ENTER("wolfSSL_X509_get_signature");
  14642. if (x509 == NULL || bufSz == NULL || (*bufSz < (int)x509->sig.length &&
  14643. buf != NULL))
  14644. return WOLFSSL_FATAL_ERROR;
  14645. if (buf != NULL)
  14646. XMEMCPY(buf, x509->sig.buffer, x509->sig.length);
  14647. *bufSz = x509->sig.length;
  14648. return WOLFSSL_SUCCESS;
  14649. }
  14650. /* Getter function that copies over the DER public key buffer to "buf" and
  14651. * sets the size in bufSz. If "buf" is NULL then just bufSz is set to needed
  14652. * buffer size. "bufSz" passed in should initially be set by the user to be
  14653. * the size of "buf". This gets checked to make sure the buffer is large
  14654. * enough to hold the public key.
  14655. *
  14656. * Note: this is the X.509 form of key with "header" info.
  14657. * return WOLFSSL_SUCCESS on success
  14658. */
  14659. int wolfSSL_X509_get_pubkey_buffer(WOLFSSL_X509* x509,
  14660. unsigned char* buf, int* bufSz)
  14661. {
  14662. #ifdef WOLFSSL_SMALL_STACK
  14663. DecodedCert* cert;
  14664. #else
  14665. DecodedCert cert[1];
  14666. #endif
  14667. word32 idx;
  14668. const byte* der;
  14669. int length = 0;
  14670. int ret, derSz = 0;
  14671. int badDate = 0;
  14672. const byte* pubKeyX509 = NULL;
  14673. int pubKeyX509Sz = 0;
  14674. WOLFSSL_ENTER("wolfSSL_X509_get_pubkey_buffer");
  14675. if (x509 == NULL || bufSz == NULL) {
  14676. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BAD_FUNC_ARG);
  14677. return WOLFSSL_FATAL_ERROR;
  14678. }
  14679. #ifdef WOLFSSL_SMALL_STACK
  14680. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert),
  14681. x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  14682. if (cert == NULL) {
  14683. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", MEMORY_E);
  14684. return WOLFSSL_FATAL_ERROR;
  14685. }
  14686. #endif
  14687. der = wolfSSL_X509_get_der(x509, &derSz);
  14688. InitDecodedCert(cert, der, derSz, NULL);
  14689. ret = wc_GetPubX509(cert, 0, &badDate);
  14690. if (ret >= 0) {
  14691. idx = cert->srcIdx;
  14692. pubKeyX509 = cert->source + cert->srcIdx;
  14693. ret = GetSequence(cert->source, &cert->srcIdx, &length,
  14694. cert->maxIdx);
  14695. pubKeyX509Sz = length + (cert->srcIdx - idx);
  14696. }
  14697. FreeDecodedCert(cert);
  14698. #ifdef WOLFSSL_SMALL_STACK
  14699. XFREE(cert, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  14700. #endif
  14701. if (ret < 0) {
  14702. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", ret);
  14703. return WOLFSSL_FATAL_ERROR;
  14704. }
  14705. if (buf != NULL) {
  14706. if (pubKeyX509Sz > *bufSz) {
  14707. WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BUFFER_E);
  14708. return WOLFSSL_FATAL_ERROR;
  14709. }
  14710. XMEMCPY(buf, pubKeyX509, pubKeyX509Sz);
  14711. }
  14712. *bufSz = pubKeyX509Sz;
  14713. return WOLFSSL_SUCCESS;
  14714. }
  14715. /* Getter function for the public key OID value
  14716. * return public key OID stored in WOLFSSL_X509 structure */
  14717. int wolfSSL_X509_get_pubkey_type(WOLFSSL_X509* x509)
  14718. {
  14719. if (x509 == NULL)
  14720. return WOLFSSL_FAILURE;
  14721. return x509->pubKeyOID;
  14722. }
  14723. /* write X509 serial number in unsigned binary to buffer
  14724. buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases
  14725. return WOLFSSL_SUCCESS on success */
  14726. int wolfSSL_X509_get_serial_number(WOLFSSL_X509* x509,
  14727. byte* in, int* inOutSz)
  14728. {
  14729. WOLFSSL_ENTER("wolfSSL_X509_get_serial_number");
  14730. if (x509 == NULL || in == NULL ||
  14731. inOutSz == NULL || *inOutSz < x509->serialSz)
  14732. return BAD_FUNC_ARG;
  14733. XMEMCPY(in, x509->serial, x509->serialSz);
  14734. *inOutSz = x509->serialSz;
  14735. return WOLFSSL_SUCCESS;
  14736. }
  14737. /* not an openssl compatibility function - getting for derCert */
  14738. const byte* wolfSSL_X509_get_der(WOLFSSL_X509* x509, int* outSz)
  14739. {
  14740. WOLFSSL_ENTER("wolfSSL_X509_get_der");
  14741. if (x509 == NULL || x509->derCert == NULL || outSz == NULL)
  14742. return NULL;
  14743. *outSz = (int)x509->derCert->length;
  14744. return x509->derCert->buffer;
  14745. }
  14746. /* used by JSSE (not a standard compatibility function) */
  14747. /* this is not thread safe */
  14748. WOLFSSL_ABI
  14749. const byte* wolfSSL_X509_notBefore(WOLFSSL_X509* x509)
  14750. {
  14751. static byte notBeforeData[CTC_DATE_SIZE]; /* temp buffer for date */
  14752. WOLFSSL_ENTER("wolfSSL_X509_notBefore");
  14753. if (x509 == NULL)
  14754. return NULL;
  14755. XMEMSET(notBeforeData, 0, sizeof(notBeforeData));
  14756. notBeforeData[0] = (byte)x509->notBefore.type;
  14757. notBeforeData[1] = (byte)x509->notBefore.length;
  14758. XMEMCPY(&notBeforeData[2], x509->notBefore.data, x509->notBefore.length);
  14759. return notBeforeData;
  14760. }
  14761. /* used by JSSE (not a standard compatibility function) */
  14762. /* this is not thread safe */
  14763. WOLFSSL_ABI
  14764. const byte* wolfSSL_X509_notAfter(WOLFSSL_X509* x509)
  14765. {
  14766. static byte notAfterData[CTC_DATE_SIZE]; /* temp buffer for date */
  14767. WOLFSSL_ENTER("wolfSSL_X509_notAfter");
  14768. if (x509 == NULL)
  14769. return NULL;
  14770. XMEMSET(notAfterData, 0, sizeof(notAfterData));
  14771. notAfterData[0] = (byte)x509->notAfter.type;
  14772. notAfterData[1] = (byte)x509->notAfter.length;
  14773. XMEMCPY(&notAfterData[2], x509->notAfter.data, x509->notAfter.length);
  14774. return notAfterData;
  14775. }
  14776. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_STUB)
  14777. WOLFSSL_ASN1_TIME* wolfSSL_X509_gmtime_adj(WOLFSSL_ASN1_TIME *s, long adj)
  14778. {
  14779. (void) s;
  14780. (void) adj;
  14781. WOLFSSL_STUB("wolfSSL_X509_gmtime_adj");
  14782. return NULL;
  14783. }
  14784. #endif
  14785. /* get the buffer to be signed (tbs) from the WOLFSSL_X509 certificate
  14786. *
  14787. * outSz : gets set to the size of the buffer
  14788. * returns a pointer to the internal buffer at the location of TBS on
  14789. * on success and NULL on failure.
  14790. */
  14791. const unsigned char* wolfSSL_X509_get_tbs(WOLFSSL_X509* x509, int* outSz)
  14792. {
  14793. int sz = 0, len;
  14794. unsigned int idx = 0, tmpIdx;
  14795. const unsigned char* der = NULL;
  14796. const unsigned char* tbs = NULL;
  14797. if (x509 == NULL || outSz == NULL) {
  14798. return NULL;
  14799. }
  14800. der = wolfSSL_X509_get_der(x509, &sz);
  14801. if (der == NULL) {
  14802. return NULL;
  14803. }
  14804. if (GetSequence(der, &idx, &len, sz) < 0) {
  14805. return NULL;
  14806. }
  14807. tbs = der + idx;
  14808. tmpIdx = idx;
  14809. if (GetSequence(der, &idx, &len, sz) < 0) {
  14810. return NULL;
  14811. }
  14812. *outSz = len + (idx - tmpIdx);
  14813. return tbs;
  14814. }
  14815. int wolfSSL_X509_version(WOLFSSL_X509* x509)
  14816. {
  14817. WOLFSSL_ENTER("wolfSSL_X509_version");
  14818. if (x509 == NULL)
  14819. return 0;
  14820. return x509->version;
  14821. }
  14822. #ifdef WOLFSSL_SEP
  14823. /* copy oid into in buffer, at most *inOutSz bytes, if buffer is null will
  14824. malloc buffer, call responsible for freeing. Actual size returned in
  14825. *inOutSz. Requires inOutSz be non-null */
  14826. byte* wolfSSL_X509_get_device_type(WOLFSSL_X509* x509, byte* in, int *inOutSz)
  14827. {
  14828. int copySz;
  14829. WOLFSSL_ENTER("wolfSSL_X509_get_dev_type");
  14830. if (inOutSz == NULL) return NULL;
  14831. if (!x509->deviceTypeSz) return in;
  14832. copySz = min(*inOutSz, x509->deviceTypeSz);
  14833. if (!in) {
  14834. #ifdef WOLFSSL_STATIC_MEMORY
  14835. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  14836. return NULL;
  14837. #else
  14838. in = (byte*)XMALLOC(x509->deviceTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  14839. if (!in) return in;
  14840. copySz = x509->deviceTypeSz;
  14841. #endif
  14842. }
  14843. XMEMCPY(in, x509->deviceType, copySz);
  14844. *inOutSz = copySz;
  14845. return in;
  14846. }
  14847. byte* wolfSSL_X509_get_hw_type(WOLFSSL_X509* x509, byte* in, int* inOutSz)
  14848. {
  14849. int copySz;
  14850. WOLFSSL_ENTER("wolfSSL_X509_get_hw_type");
  14851. if (inOutSz == NULL) return NULL;
  14852. if (!x509->hwTypeSz) return in;
  14853. copySz = min(*inOutSz, x509->hwTypeSz);
  14854. if (!in) {
  14855. #ifdef WOLFSSL_STATIC_MEMORY
  14856. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  14857. return NULL;
  14858. #else
  14859. in = (byte*)XMALLOC(x509->hwTypeSz, 0, DYNAMIC_TYPE_OPENSSL);
  14860. if (!in) return in;
  14861. copySz = x509->hwTypeSz;
  14862. #endif
  14863. }
  14864. XMEMCPY(in, x509->hwType, copySz);
  14865. *inOutSz = copySz;
  14866. return in;
  14867. }
  14868. byte* wolfSSL_X509_get_hw_serial_number(WOLFSSL_X509* x509,byte* in,
  14869. int* inOutSz)
  14870. {
  14871. int copySz;
  14872. WOLFSSL_ENTER("wolfSSL_X509_get_hw_serial_number");
  14873. if (inOutSz == NULL) return NULL;
  14874. if (!x509->hwTypeSz) return in;
  14875. copySz = min(*inOutSz, x509->hwSerialNumSz);
  14876. if (!in) {
  14877. #ifdef WOLFSSL_STATIC_MEMORY
  14878. WOLFSSL_MSG("Using static memory -- please pass in a buffer");
  14879. return NULL;
  14880. #else
  14881. in = (byte*)XMALLOC(x509->hwSerialNumSz, 0, DYNAMIC_TYPE_OPENSSL);
  14882. if (!in) return in;
  14883. copySz = x509->hwSerialNumSz;
  14884. #endif
  14885. }
  14886. XMEMCPY(in, x509->hwSerialNum, copySz);
  14887. *inOutSz = copySz;
  14888. return in;
  14889. }
  14890. #endif /* WOLFSSL_SEP */
  14891. /* require OPENSSL_EXTRA since wolfSSL_X509_free is wrapped by OPENSSL_EXTRA */
  14892. #if !defined(NO_CERTS) && defined(OPENSSL_EXTRA)
  14893. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notBefore(const WOLFSSL_X509* x509)
  14894. {
  14895. WOLFSSL_ENTER("wolfSSL_X509_get_notBefore");
  14896. if (x509 == NULL)
  14897. return NULL;
  14898. return (WOLFSSL_ASN1_TIME*)&x509->notBefore;
  14899. }
  14900. WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notAfter(const WOLFSSL_X509* x509)
  14901. {
  14902. WOLFSSL_ENTER("wolfSSL_X509_get_notAfter");
  14903. if (x509 == NULL)
  14904. return NULL;
  14905. return (WOLFSSL_ASN1_TIME*)&x509->notAfter;
  14906. }
  14907. /* return 1 on success 0 on fail */
  14908. int wolfSSL_sk_X509_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, WOLFSSL_X509* x509)
  14909. {
  14910. WOLFSSL_STACK* node;
  14911. WOLFSSL_ENTER("wolfSSL_sk_X509_push");
  14912. if (sk == NULL || x509 == NULL) {
  14913. return WOLFSSL_FAILURE;
  14914. }
  14915. /* no previous values in stack */
  14916. if (sk->data.x509 == NULL) {
  14917. sk->data.x509 = x509;
  14918. sk->num += 1;
  14919. return WOLFSSL_SUCCESS;
  14920. }
  14921. /* stack already has value(s) create a new node and add more */
  14922. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  14923. DYNAMIC_TYPE_X509);
  14924. if (node == NULL) {
  14925. WOLFSSL_MSG("Memory error");
  14926. return WOLFSSL_FAILURE;
  14927. }
  14928. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  14929. /* push new x509 onto head of stack */
  14930. node->data.x509 = sk->data.x509;
  14931. node->next = sk->next;
  14932. node->type = sk->type;
  14933. sk->next = node;
  14934. sk->data.x509 = x509;
  14935. sk->num += 1;
  14936. return WOLFSSL_SUCCESS;
  14937. }
  14938. WOLFSSL_X509* wolfSSL_sk_X509_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk) {
  14939. WOLFSSL_STACK* node;
  14940. WOLFSSL_X509* x509;
  14941. if (sk == NULL) {
  14942. return NULL;
  14943. }
  14944. node = sk->next;
  14945. x509 = sk->data.x509;
  14946. if (node != NULL) { /* update sk and remove node from stack */
  14947. sk->data.x509 = node->data.x509;
  14948. sk->next = node->next;
  14949. XFREE(node, NULL, DYNAMIC_TYPE_X509);
  14950. }
  14951. else { /* last x509 in stack */
  14952. sk->data.x509 = NULL;
  14953. }
  14954. if (sk->num > 0) {
  14955. sk->num -= 1;
  14956. }
  14957. return x509;
  14958. }
  14959. /* Getter function for WOLFSSL_X509 pointer
  14960. *
  14961. * sk is the stack to retrieve pointer from
  14962. * i is the index value in stack
  14963. *
  14964. * returns a pointer to a WOLFSSL_X509 structure on success and NULL on
  14965. * fail
  14966. */
  14967. WOLFSSL_X509* wolfSSL_sk_X509_value(STACK_OF(WOLFSSL_X509)* sk, int i)
  14968. {
  14969. WOLFSSL_ENTER("wolfSSL_sk_X509_value");
  14970. for (; sk != NULL && i > 0; i--)
  14971. sk = sk->next;
  14972. if (i != 0 || sk == NULL)
  14973. return NULL;
  14974. return sk->data.x509;
  14975. }
  14976. WOLFSSL_X509* wolfSSL_sk_X509_shift(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  14977. {
  14978. return wolfSSL_sk_X509_pop(sk);
  14979. }
  14980. #ifndef NO_WOLFSSL_STUB
  14981. void* wolfSSL_sk_X509_OBJECT_value(WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int x)
  14982. {
  14983. (void) sk;
  14984. (void) x;
  14985. return NULL;
  14986. }
  14987. #endif
  14988. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  14989. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  14990. /* Free's all nodes in X509 stack. This is different then wolfSSL_sk_X509_free
  14991. * in that it allows for choosing the function to use when freeing an X509s.
  14992. *
  14993. * sk stack to free nodes in
  14994. * f X509 free function
  14995. */
  14996. void wolfSSL_sk_X509_pop_free(STACK_OF(WOLFSSL_X509)* sk,
  14997. void (*f) (WOLFSSL_X509*))
  14998. {
  14999. WOLFSSL_STACK* node;
  15000. WOLFSSL_ENTER("wolfSSL_sk_X509_pop_free");
  15001. if (sk == NULL) {
  15002. return;
  15003. }
  15004. /* parse through stack freeing each node */
  15005. node = sk->next;
  15006. while (node && sk->num > 1) {
  15007. WOLFSSL_STACK* tmp = node;
  15008. node = node->next;
  15009. if (f)
  15010. f(tmp->data.x509);
  15011. else
  15012. wolfSSL_X509_free(tmp->data.x509);
  15013. tmp->data.x509 = NULL;
  15014. XFREE(tmp, NULL, DYNAMIC_TYPE_X509);
  15015. sk->num -= 1;
  15016. }
  15017. /* free head of stack */
  15018. if (sk->num == 1) {
  15019. if (f)
  15020. f(sk->data.x509);
  15021. else
  15022. wolfSSL_X509_free(sk->data.x509);
  15023. sk->data.x509 = NULL;
  15024. }
  15025. XFREE(sk, NULL, DYNAMIC_TYPE_X509);
  15026. }
  15027. /* free structure for x509 stack */
  15028. void wolfSSL_sk_X509_free(WOLF_STACK_OF(WOLFSSL_X509)* sk)
  15029. {
  15030. wolfSSL_sk_X509_pop_free(sk, NULL);
  15031. }
  15032. #endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  15033. #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
  15034. /* return 1 on success 0 on fail */
  15035. int wolfSSL_sk_ACCESS_DESCRIPTION_push(WOLF_STACK_OF(ACCESS_DESCRIPTION)* sk,
  15036. WOLFSSL_ACCESS_DESCRIPTION* access)
  15037. {
  15038. WOLFSSL_STACK* node;
  15039. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_push");
  15040. if (sk == NULL || access == NULL) {
  15041. return WOLFSSL_FAILURE;
  15042. }
  15043. /* no previous values in stack */
  15044. if (sk->data.access == NULL) {
  15045. sk->data.access = access;
  15046. sk->num += 1;
  15047. return WOLFSSL_SUCCESS;
  15048. }
  15049. /* stack already has value(s) create a new node and add more */
  15050. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  15051. DYNAMIC_TYPE_ASN1);
  15052. if (node == NULL) {
  15053. WOLFSSL_MSG("Memory error");
  15054. return WOLFSSL_FAILURE;
  15055. }
  15056. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  15057. /* push new obj onto head of stack */
  15058. node->data.access = sk->data.access;
  15059. node->next = sk->next;
  15060. node->type = sk->type;
  15061. sk->next = node;
  15062. sk->data.access = access;
  15063. sk->num += 1;
  15064. return WOLFSSL_SUCCESS;
  15065. }
  15066. /* Frees all nodes in ACCESS_DESCRIPTION stack
  15067. *
  15068. * sk stack of nodes to free
  15069. * f free function to use, not called with wolfSSL
  15070. */
  15071. void wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(WOLFSSL_STACK* sk,
  15072. void (*f) (WOLFSSL_ACCESS_DESCRIPTION*))
  15073. {
  15074. WOLFSSL_STACK* node;
  15075. WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_pop_free");
  15076. if (sk == NULL) {
  15077. return;
  15078. }
  15079. /* parse through stack freeing each node */
  15080. node = sk->next;
  15081. while (node && sk->num > 1) {
  15082. WOLFSSL_STACK* tmp = node;
  15083. node = node->next;
  15084. if (f)
  15085. f(tmp->data.access);
  15086. else
  15087. wolfSSL_ACCESS_DESCRIPTION_free(tmp->data.access);
  15088. tmp->data.access = NULL;
  15089. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  15090. sk->num -= 1;
  15091. }
  15092. /* free head of stack */
  15093. if (sk->num == 1) {
  15094. if (f)
  15095. f(sk->data.access);
  15096. else {
  15097. if(sk->data.access->method) {
  15098. wolfSSL_ASN1_OBJECT_free(sk->data.access->method);
  15099. }
  15100. if(sk->data.access->location) {
  15101. wolfSSL_GENERAL_NAME_free(sk->data.access->location);
  15102. }
  15103. }
  15104. sk->data.access = NULL;
  15105. }
  15106. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  15107. }
  15108. void wolfSSL_sk_ACCESS_DESCRIPTION_free(WOLFSSL_STACK* sk)
  15109. {
  15110. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(sk, NULL);
  15111. }
  15112. void wolfSSL_ACCESS_DESCRIPTION_free(WOLFSSL_ACCESS_DESCRIPTION* access)
  15113. {
  15114. WOLFSSL_ENTER("wolfSSL_ACCESS_DESCRIPTION_free");
  15115. if (access == NULL)
  15116. return;
  15117. if (access->method)
  15118. wolfSSL_ASN1_OBJECT_free(access->method);
  15119. if (access->location)
  15120. wolfSSL_GENERAL_NAME_free(access->location);
  15121. /* access = NULL, don't try to access or double free it */
  15122. }
  15123. #endif
  15124. #ifdef OPENSSL_EXTRA
  15125. /* create a generic wolfSSL stack node
  15126. * returns a new WOLFSSL_STACK structure on success */
  15127. WOLFSSL_STACK* wolfSSL_sk_new_node(void* heap)
  15128. {
  15129. WOLFSSL_STACK* sk;
  15130. WOLFSSL_ENTER("wolfSSL_sk_new_node");
  15131. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), heap,
  15132. DYNAMIC_TYPE_OPENSSL);
  15133. if (sk != NULL) {
  15134. XMEMSET(sk, 0, sizeof(*sk));
  15135. sk->heap = heap;
  15136. }
  15137. return sk;
  15138. }
  15139. /* free's node but does not free internal data such as in->data.x509 */
  15140. void wolfSSL_sk_free_node(WOLFSSL_STACK* in)
  15141. {
  15142. if (in != NULL) {
  15143. XFREE(in, in->heap, DYNAMIC_TYPE_OPENSSL);
  15144. }
  15145. }
  15146. /* pushes node "in" onto "stack" and returns pointer to the new stack on success
  15147. * also handles internal "num" for number of nodes on stack
  15148. * return WOLFSSL_SUCCESS on success
  15149. */
  15150. int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in)
  15151. {
  15152. if (stack == NULL || in == NULL) {
  15153. return WOLFSSL_FAILURE;
  15154. }
  15155. if (*stack == NULL) {
  15156. in->num = 1;
  15157. *stack = in;
  15158. return WOLFSSL_SUCCESS;
  15159. }
  15160. in->num = (*stack)->num + 1;
  15161. in->next = *stack;
  15162. *stack = in;
  15163. return WOLFSSL_SUCCESS;
  15164. }
  15165. /* return 1 on success 0 on fail */
  15166. int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
  15167. {
  15168. int ret = WOLFSSL_FAILURE;
  15169. WOLFSSL_ENTER("wolfSSL_sk_push");
  15170. switch (sk->type) {
  15171. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  15172. case STACK_TYPE_X509:
  15173. ret = wolfSSL_sk_X509_push(sk, (WOLFSSL_X509*) data);
  15174. break;
  15175. #ifndef NO_WOLFSSL_STUB
  15176. case STACK_TYPE_CIPHER:
  15177. ret = wolfSSL_sk_CIPHER_push(sk, (WOLFSSL_CIPHER*) data);
  15178. break;
  15179. #endif
  15180. case STACK_TYPE_GEN_NAME:
  15181. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, (WOLFSSL_ASN1_OBJECT*) data);
  15182. break;
  15183. case STACK_TYPE_ACCESS_DESCRIPTION:
  15184. ret = wolfSSL_sk_ACCESS_DESCRIPTION_push(sk,
  15185. (WOLFSSL_ACCESS_DESCRIPTION*) data);
  15186. break;
  15187. case STACK_TYPE_NULL:
  15188. ret = wolfSSL_sk_GENERIC_push(sk, (void*) data);
  15189. break;
  15190. case STACK_TYPE_OBJ:
  15191. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, (WOLFSSL_ASN1_OBJECT*) data);
  15192. break;
  15193. #endif
  15194. default:
  15195. ret = wolfSSL_sk_ASN1_OBJECT_push(sk, (WOLFSSL_ASN1_OBJECT*) data);
  15196. break;
  15197. }
  15198. return ret;
  15199. }
  15200. #endif /* OPENSSL_EXTRA */
  15201. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15202. /* Creates and returns new GENERAL_NAME structure */
  15203. WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_new(void)
  15204. {
  15205. WOLFSSL_GENERAL_NAME* gn;
  15206. WOLFSSL_ENTER("GENERAL_NAME_new");
  15207. gn = (WOLFSSL_GENERAL_NAME*)XMALLOC(sizeof(WOLFSSL_GENERAL_NAME), NULL,
  15208. DYNAMIC_TYPE_ASN1);
  15209. if (gn == NULL) {
  15210. return NULL;
  15211. }
  15212. XMEMSET(gn, 0, sizeof(WOLFSSL_GENERAL_NAME));
  15213. gn->d.ia5 = wolfSSL_ASN1_STRING_new();
  15214. if (gn->d.ia5 == NULL) {
  15215. WOLFSSL_MSG("Issue creating ASN1_STRING struct");
  15216. wolfSSL_GENERAL_NAME_free(gn);
  15217. return NULL;
  15218. }
  15219. return gn;
  15220. }
  15221. static WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_dup(WOLFSSL_GENERAL_NAME* gn)
  15222. {
  15223. WOLFSSL_GENERAL_NAME* dup = NULL;
  15224. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_dup");
  15225. if (!gn) {
  15226. WOLFSSL_MSG("Bad parameter");
  15227. return NULL;
  15228. }
  15229. if (!(dup = wolfSSL_GENERAL_NAME_new())) {
  15230. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  15231. return NULL;
  15232. }
  15233. switch (gn->type) {
  15234. /* WOLFSSL_ASN1_STRING types */
  15235. case GEN_DNS:
  15236. if (!(dup->d.dNSName = wolfSSL_ASN1_STRING_dup(gn->d.dNSName))) {
  15237. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  15238. goto error;
  15239. }
  15240. break;
  15241. case GEN_IPADD:
  15242. if (!(dup->d.iPAddress = wolfSSL_ASN1_STRING_dup(gn->d.iPAddress))) {
  15243. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  15244. goto error;
  15245. }
  15246. break;
  15247. case GEN_EMAIL:
  15248. if (!(dup->d.rfc822Name = wolfSSL_ASN1_STRING_dup(gn->d.rfc822Name))) {
  15249. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  15250. goto error;
  15251. }
  15252. break;
  15253. case GEN_URI:
  15254. if (!(dup->d.uniformResourceIdentifier =
  15255. wolfSSL_ASN1_STRING_dup(gn->d.uniformResourceIdentifier))) {
  15256. WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
  15257. goto error;
  15258. }
  15259. break;
  15260. case GEN_OTHERNAME:
  15261. case GEN_X400:
  15262. case GEN_DIRNAME:
  15263. case GEN_EDIPARTY:
  15264. case GEN_RID:
  15265. default:
  15266. WOLFSSL_MSG("Unrecognized or unsupported GENERAL_NAME type");
  15267. goto error;
  15268. }
  15269. return dup;
  15270. error:
  15271. if (dup) {
  15272. wolfSSL_GENERAL_NAME_free(dup);
  15273. }
  15274. return NULL;
  15275. }
  15276. /* return 1 on success 0 on fail */
  15277. int wolfSSL_sk_GENERAL_NAME_push(WOLFSSL_GENERAL_NAMES* sk,
  15278. WOLFSSL_GENERAL_NAME* gn)
  15279. {
  15280. WOLFSSL_STACK* node;
  15281. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_push");
  15282. if (sk == NULL || gn == NULL) {
  15283. return WOLFSSL_FAILURE;
  15284. }
  15285. /* no previous values in stack */
  15286. if (sk->data.gn == NULL) {
  15287. sk->data.gn = gn;
  15288. sk->num += 1;
  15289. return WOLFSSL_SUCCESS;
  15290. }
  15291. /* stack already has value(s) create a new node and add more */
  15292. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  15293. DYNAMIC_TYPE_ASN1);
  15294. if (node == NULL) {
  15295. WOLFSSL_MSG("Memory error");
  15296. return WOLFSSL_FAILURE;
  15297. }
  15298. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  15299. /* push new obj onto head of stack */
  15300. node->data.gn = sk->data.gn;
  15301. node->next = sk->next;
  15302. sk->next = node;
  15303. sk->data.gn = gn;
  15304. sk->num += 1;
  15305. return WOLFSSL_SUCCESS;
  15306. }
  15307. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15308. #ifdef OPENSSL_EXTRA
  15309. /* Returns the general name at index i from the stack
  15310. *
  15311. * sk stack to get general name from
  15312. * idx index to get
  15313. *
  15314. * return a pointer to the internal node of the stack
  15315. */
  15316. WOLFSSL_GENERAL_NAME* wolfSSL_sk_GENERAL_NAME_value(WOLFSSL_STACK* sk, int idx)
  15317. {
  15318. WOLFSSL_STACK* ret;
  15319. if (sk == NULL) {
  15320. return NULL;
  15321. }
  15322. ret = wolfSSL_sk_get_node(sk, idx);
  15323. if (ret != NULL) {
  15324. return ret->data.gn;
  15325. }
  15326. return NULL;
  15327. }
  15328. /* Gets the number of nodes in the stack
  15329. *
  15330. * sk stack to get the number of nodes from
  15331. *
  15332. * returns the number of nodes, -1 if no nodes
  15333. */
  15334. int wolfSSL_sk_GENERAL_NAME_num(WOLFSSL_STACK* sk)
  15335. {
  15336. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_num");
  15337. if (sk == NULL) {
  15338. return -1;
  15339. }
  15340. return (int)sk->num;
  15341. }
  15342. #endif /* OPENSSL_EXTRA */
  15343. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15344. /* Frees all nodes in a GENERAL NAME stack
  15345. *
  15346. * sk stack of nodes to free
  15347. * f free function to use, not called with wolfSSL
  15348. */
  15349. void wolfSSL_sk_GENERAL_NAME_pop_free(WOLFSSL_STACK* sk,
  15350. void (*f) (WOLFSSL_GENERAL_NAME*))
  15351. {
  15352. WOLFSSL_STACK* node;
  15353. WOLFSSL_ENTER("wolfSSL_sk_GENERAL_NAME_pop_free");
  15354. if (sk == NULL) {
  15355. return;
  15356. }
  15357. /* parse through stack freeing each node */
  15358. node = sk->next;
  15359. while (node && sk->num > 1) {
  15360. WOLFSSL_STACK* tmp = node;
  15361. node = node->next;
  15362. if (f)
  15363. f(tmp->data.gn);
  15364. else
  15365. wolfSSL_GENERAL_NAME_free(tmp->data.gn);
  15366. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  15367. sk->num -= 1;
  15368. }
  15369. /* free head of stack */
  15370. if (sk->num == 1) {
  15371. if (f)
  15372. f(sk->data.gn);
  15373. else
  15374. wolfSSL_GENERAL_NAME_free(sk->data.gn);
  15375. }
  15376. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  15377. }
  15378. void wolfSSL_sk_GENERAL_NAME_free(WOLFSSL_STACK* sk)
  15379. {
  15380. WOLFSSL_ENTER("sk_GENERAL_NAME_free");
  15381. wolfSSL_sk_GENERAL_NAME_pop_free(sk, NULL);
  15382. }
  15383. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15384. #ifdef OPENSSL_EXTRA
  15385. /* returns the number of nodes in stack on success and WOLFSSL_FATAL_ERROR
  15386. * on fail */
  15387. int wolfSSL_sk_ACCESS_DESCRIPTION_num(WOLFSSL_STACK* sk)
  15388. {
  15389. if (sk == NULL) {
  15390. return WOLFSSL_FATAL_ERROR;
  15391. }
  15392. return (int)sk->num;
  15393. }
  15394. #ifndef NO_WOLFSSL_STUB
  15395. /* similar to call to sk_ACCESS_DESCRIPTION_pop_free */
  15396. void wolfSSL_AUTHORITY_INFO_ACCESS_free(
  15397. WOLF_STACK_OF(WOLFSSL_ACCESS_DESCRIPTION)* sk)
  15398. {
  15399. WOLFSSL_STUB("wolfSSL_AUTHORITY_INFO_ACCESS_free");
  15400. (void)sk;
  15401. }
  15402. #endif
  15403. /* returns the node at index "idx", NULL if not found */
  15404. WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx)
  15405. {
  15406. int i;
  15407. WOLFSSL_STACK* ret = NULL;
  15408. WOLFSSL_STACK* current;
  15409. current = sk;
  15410. for (i = 0; i <= idx && current != NULL; i++) {
  15411. if (i == idx) {
  15412. ret = current;
  15413. break;
  15414. }
  15415. current = current->next;
  15416. }
  15417. return ret;
  15418. }
  15419. /* returns NULL on fail and pointer to internal data on success */
  15420. WOLFSSL_ACCESS_DESCRIPTION* wolfSSL_sk_ACCESS_DESCRIPTION_value(
  15421. WOLFSSL_STACK* sk, int idx)
  15422. {
  15423. WOLFSSL_STACK* ret;
  15424. if (sk == NULL) {
  15425. return NULL;
  15426. }
  15427. ret = wolfSSL_sk_get_node(sk, idx);
  15428. if (ret != NULL) {
  15429. return ret->data.access;
  15430. }
  15431. return NULL;
  15432. }
  15433. #endif /* OPENSSL_EXTRA */
  15434. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  15435. /* Frees GENERAL_NAME objects.
  15436. */
  15437. void wolfSSL_GENERAL_NAME_free(WOLFSSL_GENERAL_NAME* name)
  15438. {
  15439. WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_Free");
  15440. if(name != NULL) {
  15441. if (name->d.dNSName != NULL) {
  15442. wolfSSL_ASN1_STRING_free(name->d.dNSName);
  15443. name->d.dNSName = NULL;
  15444. }
  15445. if (name->d.uniformResourceIdentifier != NULL) {
  15446. wolfSSL_ASN1_STRING_free(name->d.uniformResourceIdentifier);
  15447. name->d.uniformResourceIdentifier = NULL;
  15448. }
  15449. if (name->d.iPAddress != NULL) {
  15450. wolfSSL_ASN1_STRING_free(name->d.iPAddress);
  15451. name->d.iPAddress = NULL;
  15452. }
  15453. if (name->d.registeredID != NULL) {
  15454. wolfSSL_ASN1_OBJECT_free(name->d.registeredID);
  15455. name->d.registeredID = NULL;
  15456. }
  15457. if (name->d.ia5 != NULL) {
  15458. wolfSSL_ASN1_STRING_free(name->d.ia5);
  15459. name->d.ia5 = NULL;
  15460. }
  15461. XFREE(name, NULL, DYNAMIC_TYPE_OPENSSL);
  15462. }
  15463. }
  15464. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  15465. #ifdef OPENSSL_EXTRA
  15466. void wolfSSL_GENERAL_NAMES_free(WOLFSSL_GENERAL_NAMES *gens)
  15467. {
  15468. WOLFSSL_STACK* node;
  15469. WOLFSSL_ENTER("wolfSSL_GENERAL_NAMES_free");
  15470. if (gens == NULL) {
  15471. return;
  15472. }
  15473. /* parse through stack freeing each node */
  15474. node = gens->next;
  15475. while (gens->num > 1) {
  15476. WOLFSSL_STACK* tmp = node;
  15477. node = node->next;
  15478. wolfSSL_ASN1_OBJECT_free(tmp->data.obj);
  15479. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  15480. gens->num -= 1;
  15481. }
  15482. /* free head of stack */
  15483. if (gens->num == 1) {
  15484. wolfSSL_ASN1_OBJECT_free(gens->data.obj);
  15485. }
  15486. XFREE(gens, NULL, DYNAMIC_TYPE_ASN1);
  15487. }
  15488. #if defined(OPENSSL_ALL)
  15489. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* wolfSSL_sk_X509_EXTENSION_new_null(void)
  15490. {
  15491. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  15492. if (sk) {
  15493. sk->type = STACK_TYPE_X509_EXT;
  15494. }
  15495. return (WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)*)sk;;
  15496. }
  15497. /* returns the number of nodes on the stack */
  15498. int wolfSSL_sk_X509_EXTENSION_num(WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk)
  15499. {
  15500. if (sk != NULL) {
  15501. return (int)sk->num;
  15502. }
  15503. return WOLFSSL_FATAL_ERROR;
  15504. }
  15505. /* returns null on failure and pointer to internal value on success */
  15506. WOLFSSL_X509_EXTENSION* wolfSSL_sk_X509_EXTENSION_value(
  15507. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk, int idx)
  15508. {
  15509. WOLFSSL_STACK* ret;
  15510. if (sk == NULL) {
  15511. return NULL;
  15512. }
  15513. ret = wolfSSL_sk_get_node(sk, idx);
  15514. if (ret != NULL) {
  15515. return ret->data.ext;
  15516. }
  15517. return NULL;
  15518. }
  15519. /* frees all of the nodes and the values in stack */
  15520. void wolfSSL_sk_X509_EXTENSION_pop_free(
  15521. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* sk,
  15522. void (*f) (WOLFSSL_X509_EXTENSION*))
  15523. {
  15524. WOLFSSL_STACK* current;
  15525. if (sk == NULL) {
  15526. return;
  15527. }
  15528. current = sk;
  15529. while (current != NULL) {
  15530. WOLFSSL_STACK* toFree = current;
  15531. current = current->next;
  15532. if (f)
  15533. f(toFree->data.ext);
  15534. wolfSSL_sk_free_node(toFree);
  15535. }
  15536. }
  15537. #if defined(HAVE_ECC)
  15538. /* Copies ecc_key into new WOLFSSL_EC_KEY object
  15539. *
  15540. * src : EC_KEY to duplicate. If EC_KEY is not null, create new EC_KEY and copy
  15541. * internal ecc_key from src to dup.
  15542. *
  15543. * Returns pointer to duplicate EC_KEY.
  15544. */
  15545. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_dup(const WOLFSSL_EC_KEY *src)
  15546. {
  15547. WOLFSSL_EC_KEY *dup;
  15548. ecc_key *key, *srcKey;
  15549. int ret;
  15550. WOLFSSL_ENTER("wolfSSL_EC_KEY_dup");
  15551. if (src == NULL || src->internal == NULL || src->group == NULL || \
  15552. src->pub_key == NULL || src->priv_key == NULL) {
  15553. WOLFSSL_MSG("src NULL error");
  15554. return NULL;
  15555. }
  15556. dup = wolfSSL_EC_KEY_new();
  15557. if (dup == NULL) {
  15558. WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
  15559. return NULL;
  15560. }
  15561. key = (ecc_key*)dup->internal;
  15562. if (key == NULL) {
  15563. WOLFSSL_MSG("ecc_key NULL error");
  15564. wolfSSL_EC_KEY_free(dup);
  15565. return NULL;
  15566. }
  15567. srcKey = (ecc_key*)src->internal;
  15568. /* ecc_key */
  15569. /* copy pubkey */
  15570. ret = wc_ecc_copy_point(&srcKey->pubkey, &key->pubkey);
  15571. if (ret != MP_OKAY) {
  15572. WOLFSSL_MSG("wc_ecc_copy_point error");
  15573. wolfSSL_EC_KEY_free(dup);
  15574. return NULL;
  15575. }
  15576. /* copy private key k */
  15577. ret = mp_copy(&srcKey->k, &key->k);
  15578. if (ret != MP_OKAY) {
  15579. WOLFSSL_MSG("mp_copy error");
  15580. wolfSSL_EC_KEY_free(dup);
  15581. return NULL;
  15582. }
  15583. /* copy domain parameters */
  15584. if (srcKey->dp) {
  15585. ret = wc_ecc_set_curve(key, 0, srcKey->dp->id);
  15586. if (ret != 0) {
  15587. WOLFSSL_MSG("wc_ecc_set_curve error");
  15588. return NULL;
  15589. }
  15590. }
  15591. key->type = srcKey->type;
  15592. key->idx = srcKey->idx;
  15593. key->state = srcKey->state;
  15594. key->flags = srcKey->flags;
  15595. /* Copy group */
  15596. if (dup->group == NULL) {
  15597. WOLFSSL_MSG("EC_GROUP_new_by_curve_name error");
  15598. wolfSSL_EC_KEY_free(dup);
  15599. return NULL;
  15600. }
  15601. dup->group->curve_idx = src->group->curve_idx;
  15602. dup->group->curve_nid = src->group->curve_nid;
  15603. dup->group->curve_oid = src->group->curve_oid;
  15604. /* Copy public key */
  15605. if (src->pub_key->internal == NULL || dup->pub_key->internal == NULL) {
  15606. WOLFSSL_MSG("NULL pub_key error");
  15607. wolfSSL_EC_KEY_free(dup);
  15608. return NULL;
  15609. }
  15610. /* Copy public key internal */
  15611. ret = wc_ecc_copy_point((ecc_point*)src->pub_key->internal, \
  15612. (ecc_point*)dup->pub_key->internal);
  15613. if (ret != MP_OKAY) {
  15614. WOLFSSL_MSG("ecc_copy_point error");
  15615. wolfSSL_EC_KEY_free(dup);
  15616. return NULL;
  15617. }
  15618. /* Copy X, Y, Z */
  15619. dup->pub_key->X = wolfSSL_BN_dup(src->pub_key->X);
  15620. if (!dup->pub_key->X && src->pub_key->X) {
  15621. WOLFSSL_MSG("Error copying EC_POINT");
  15622. wolfSSL_EC_KEY_free(dup);
  15623. return NULL;
  15624. }
  15625. dup->pub_key->Y = wolfSSL_BN_dup(src->pub_key->Y);
  15626. if (!dup->pub_key->Y && src->pub_key->Y) {
  15627. WOLFSSL_MSG("Error copying EC_POINT");
  15628. wolfSSL_EC_KEY_free(dup);
  15629. return NULL;
  15630. }
  15631. dup->pub_key->Z = wolfSSL_BN_dup(src->pub_key->Z);
  15632. if (!dup->pub_key->Z && src->pub_key->Z) {
  15633. WOLFSSL_MSG("Error copying EC_POINT");
  15634. wolfSSL_EC_KEY_free(dup);
  15635. return NULL;
  15636. }
  15637. dup->pub_key->inSet = src->pub_key->inSet;
  15638. dup->pub_key->exSet = src->pub_key->exSet;
  15639. /* Copy private key */
  15640. if (src->priv_key->internal == NULL || dup->priv_key->internal == NULL) {
  15641. WOLFSSL_MSG("NULL priv_key error");
  15642. wolfSSL_EC_KEY_free(dup);
  15643. return NULL;
  15644. }
  15645. /* Free priv_key before call to dup function */
  15646. wolfSSL_BN_free(dup->priv_key);
  15647. dup->priv_key = wolfSSL_BN_dup(src->priv_key);
  15648. if (dup->priv_key == NULL) {
  15649. WOLFSSL_MSG("BN_dup error");
  15650. wolfSSL_EC_KEY_free(dup);
  15651. return NULL;
  15652. }
  15653. return dup;
  15654. }
  15655. #endif /* HAVE_ECC */
  15656. #if !defined(NO_DH)
  15657. int wolfSSL_DH_check(const WOLFSSL_DH *dh, int *codes)
  15658. {
  15659. int isPrime = MP_NO, codeTmp = 0;
  15660. WC_RNG rng;
  15661. WOLFSSL_ENTER("wolfSSL_DH_check");
  15662. if (dh == NULL){
  15663. return WOLFSSL_FAILURE;
  15664. }
  15665. if (dh->g == NULL || dh->g->internal == NULL){
  15666. codeTmp = DH_NOT_SUITABLE_GENERATOR;
  15667. }
  15668. if (dh->p == NULL || dh->p->internal == NULL){
  15669. codeTmp = DH_CHECK_P_NOT_PRIME;
  15670. }
  15671. else
  15672. {
  15673. /* test if dh->p has prime */
  15674. if (wc_InitRng(&rng) == 0){
  15675. mp_prime_is_prime_ex((mp_int*)dh->p->internal,8,&isPrime,&rng);
  15676. }
  15677. else {
  15678. WOLFSSL_MSG("Error initializing rng\n");
  15679. return WOLFSSL_FAILURE;
  15680. }
  15681. wc_FreeRng(&rng);
  15682. if (isPrime != MP_YES){
  15683. codeTmp = DH_CHECK_P_NOT_PRIME;
  15684. }
  15685. }
  15686. /* User may choose to enter NULL for codes if they don't want to check it*/
  15687. if (codes != NULL){
  15688. *codes = codeTmp;
  15689. }
  15690. /* if codeTmp was set,some check was flagged invalid */
  15691. if (codeTmp){
  15692. return WOLFSSL_FAILURE;
  15693. }
  15694. return WOLFSSL_SUCCESS;
  15695. }
  15696. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  15697. /* Converts DER encoded DH parameters to a WOLFSSL_DH structure.
  15698. *
  15699. * dh : structure to copy DH parameters into.
  15700. * pp : DER encoded DH parameters
  15701. * length : length to copy
  15702. *
  15703. * Returns pointer to WOLFSSL_DH structure on success, or NULL on failure
  15704. */
  15705. WOLFSSL_DH *wolfSSL_d2i_DHparams(WOLFSSL_DH **dh, const unsigned char **pp,
  15706. long length)
  15707. {
  15708. WOLFSSL_DH *newDH = NULL;
  15709. int ret;
  15710. word32 idx = 0;
  15711. WOLFSSL_ENTER("wolfSSL_d2i_DHparams");
  15712. if (pp == NULL || length <= 0) {
  15713. WOLFSSL_MSG("bad argument");
  15714. return NULL;
  15715. }
  15716. if ((newDH = wolfSSL_DH_new()) == NULL) {
  15717. WOLFSSL_MSG("wolfSSL_DH_new() failed");
  15718. return NULL;
  15719. }
  15720. ret = wc_DhKeyDecode(*pp, &idx, (DhKey*)newDH->internal, (word32)length);
  15721. if (ret != 0) {
  15722. WOLFSSL_MSG("DhKeyDecode() failed");
  15723. wolfSSL_DH_free(newDH);
  15724. return NULL;
  15725. }
  15726. newDH->inSet = 1;
  15727. if (SetDhExternal(newDH) != WOLFSSL_SUCCESS) {
  15728. WOLFSSL_MSG("SetDhExternal failed");
  15729. wolfSSL_DH_free(newDH);
  15730. return NULL;
  15731. }
  15732. *pp += length;
  15733. if (dh != NULL){
  15734. *dh = newDH;
  15735. }
  15736. return newDH;
  15737. }
  15738. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  15739. /* Converts internal WOLFSSL_DH structure to DER encoded DH.
  15740. *
  15741. * dh : structure to copy DH parameters from.
  15742. * out : DER buffer for DH parameters
  15743. *
  15744. * Returns size of DER on success and WOLFSSL_FAILURE if error
  15745. */
  15746. int wolfSSL_i2d_DHparams(const WOLFSSL_DH *dh, unsigned char **out)
  15747. {
  15748. word32 len;
  15749. int ret = 0;
  15750. WOLFSSL_ENTER("wolfSSL_i2d_DHparams");
  15751. if (dh == NULL) {
  15752. WOLFSSL_MSG("Bad parameters");
  15753. return WOLFSSL_FAILURE;
  15754. }
  15755. /* Get total length */
  15756. len = 2 + mp_leading_bit((mp_int*)dh->p->internal) +
  15757. mp_unsigned_bin_size((mp_int*)dh->p->internal) +
  15758. 2 + mp_leading_bit((mp_int*)dh->g->internal) +
  15759. mp_unsigned_bin_size((mp_int*)dh->g->internal);
  15760. /* Two bytes required for length if ASN.1 SEQ data greater than 127 bytes
  15761. * and less than 256 bytes.
  15762. */
  15763. len = ((len > 127) ? 2 : 1) + len;
  15764. if (out != NULL && *out != NULL) {
  15765. ret = StoreDHparams(*out, &len, (mp_int*)dh->p->internal,
  15766. (mp_int*)dh->g->internal);
  15767. if (ret != MP_OKAY) {
  15768. WOLFSSL_MSG("StoreDHparams error");
  15769. len = 0;
  15770. }
  15771. else{
  15772. *out += len;
  15773. }
  15774. }
  15775. return (int)len;
  15776. }
  15777. #endif /* !NO_DH */
  15778. #endif /* OPENSSL_ALL */
  15779. #endif /* OPENSSL_EXTRA */
  15780. #ifndef NO_FILESYSTEM
  15781. #ifndef NO_STDIO_FILESYSTEM
  15782. WOLFSSL_X509* wolfSSL_X509_d2i_fp(WOLFSSL_X509** x509, XFILE file)
  15783. {
  15784. WOLFSSL_X509* newX509 = NULL;
  15785. WOLFSSL_ENTER("wolfSSL_X509_d2i_fp");
  15786. if (file != XBADFILE) {
  15787. byte* fileBuffer = NULL;
  15788. long sz = 0;
  15789. if (XFSEEK(file, 0, XSEEK_END) != 0)
  15790. return NULL;
  15791. sz = XFTELL(file);
  15792. XREWIND(file);
  15793. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  15794. WOLFSSL_MSG("X509_d2i file size error");
  15795. return NULL;
  15796. }
  15797. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  15798. if (fileBuffer != NULL) {
  15799. int ret = (int)XFREAD(fileBuffer, 1, sz, file);
  15800. if (ret == sz) {
  15801. newX509 = wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  15802. }
  15803. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  15804. }
  15805. }
  15806. if (x509 != NULL)
  15807. *x509 = newX509;
  15808. return newX509;
  15809. }
  15810. #endif /* NO_STDIO_FILESYSTEM */
  15811. WOLFSSL_ABI
  15812. WOLFSSL_X509* wolfSSL_X509_load_certificate_file(const char* fname, int format)
  15813. {
  15814. #ifdef WOLFSSL_SMALL_STACK
  15815. byte staticBuffer[1]; /* force heap usage */
  15816. #else
  15817. byte staticBuffer[FILE_BUFFER_SIZE];
  15818. #endif
  15819. byte* fileBuffer = staticBuffer;
  15820. int dynamic = 0;
  15821. int ret;
  15822. long sz = 0;
  15823. XFILE file;
  15824. WOLFSSL_X509* x509 = NULL;
  15825. /* Check the inputs */
  15826. if ((fname == NULL) ||
  15827. (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM))
  15828. return NULL;
  15829. file = XFOPEN(fname, "rb");
  15830. if (file == XBADFILE)
  15831. return NULL;
  15832. if (XFSEEK(file, 0, XSEEK_END) != 0){
  15833. XFCLOSE(file);
  15834. return NULL;
  15835. }
  15836. sz = XFTELL(file);
  15837. XREWIND(file);
  15838. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  15839. WOLFSSL_MSG("X509_load_certificate_file size error");
  15840. XFCLOSE(file);
  15841. return NULL;
  15842. }
  15843. if (sz > (long)sizeof(staticBuffer)) {
  15844. fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  15845. if (fileBuffer == NULL) {
  15846. XFCLOSE(file);
  15847. return NULL;
  15848. }
  15849. dynamic = 1;
  15850. }
  15851. ret = (int)XFREAD(fileBuffer, 1, sz, file);
  15852. if (ret != sz) {
  15853. XFCLOSE(file);
  15854. if (dynamic)
  15855. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  15856. return NULL;
  15857. }
  15858. XFCLOSE(file);
  15859. x509 = wolfSSL_X509_load_certificate_buffer(fileBuffer, (int)sz, format);
  15860. if (dynamic)
  15861. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  15862. return x509;
  15863. }
  15864. #endif /* NO_FILESYSTEM */
  15865. WOLFSSL_X509* wolfSSL_X509_load_certificate_buffer(
  15866. const unsigned char* buf, int sz, int format)
  15867. {
  15868. int ret;
  15869. WOLFSSL_X509* x509 = NULL;
  15870. DerBuffer* der = NULL;
  15871. WOLFSSL_ENTER("wolfSSL_X509_load_certificate_ex");
  15872. if (format == WOLFSSL_FILETYPE_PEM) {
  15873. #ifdef WOLFSSL_PEM_TO_DER
  15874. if (PemToDer(buf, sz, CERT_TYPE, &der, NULL, NULL, NULL) != 0) {
  15875. FreeDer(&der);
  15876. }
  15877. #else
  15878. ret = NOT_COMPILED_IN;
  15879. #endif
  15880. }
  15881. else {
  15882. ret = AllocDer(&der, (word32)sz, CERT_TYPE, NULL);
  15883. if (ret == 0) {
  15884. XMEMCPY(der->buffer, buf, sz);
  15885. }
  15886. }
  15887. /* At this point we want `der` to have the certificate in DER format */
  15888. /* ready to be decoded. */
  15889. if (der != NULL && der->buffer != NULL) {
  15890. #ifdef WOLFSSL_SMALL_STACK
  15891. DecodedCert* cert;
  15892. #else
  15893. DecodedCert cert[1];
  15894. #endif
  15895. #ifdef WOLFSSL_SMALL_STACK
  15896. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  15897. DYNAMIC_TYPE_DCERT);
  15898. if (cert != NULL)
  15899. #endif
  15900. {
  15901. InitDecodedCert(cert, der->buffer, der->length, NULL);
  15902. if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0) {
  15903. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  15904. DYNAMIC_TYPE_X509);
  15905. if (x509 != NULL) {
  15906. InitX509(x509, 1, NULL);
  15907. if (CopyDecodedToX509(x509, cert) != 0) {
  15908. wolfSSL_X509_free(x509);
  15909. x509 = NULL;
  15910. }
  15911. }
  15912. }
  15913. FreeDecodedCert(cert);
  15914. #ifdef WOLFSSL_SMALL_STACK
  15915. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  15916. #endif
  15917. }
  15918. FreeDer(&der);
  15919. }
  15920. return x509;
  15921. }
  15922. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  15923. /* OPENSSL_EXTRA is needed for wolfSSL_X509_d21 function
  15924. KEEP_OUR_CERT is to insure ability for returning ssl certificate */
  15925. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  15926. defined(KEEP_OUR_CERT)
  15927. WOLFSSL_X509* wolfSSL_get_certificate(WOLFSSL* ssl)
  15928. {
  15929. if (ssl == NULL) {
  15930. return NULL;
  15931. }
  15932. if (ssl->buffers.weOwnCert) {
  15933. if (ssl->ourCert == NULL) {
  15934. if (ssl->buffers.certificate == NULL) {
  15935. WOLFSSL_MSG("Certificate buffer not set!");
  15936. return NULL;
  15937. }
  15938. #ifndef WOLFSSL_X509_STORE_CERTS
  15939. ssl->ourCert = wolfSSL_X509_d2i(NULL,
  15940. ssl->buffers.certificate->buffer,
  15941. ssl->buffers.certificate->length);
  15942. #endif
  15943. }
  15944. return ssl->ourCert;
  15945. }
  15946. else { /* if cert not owned get parent ctx cert or return null */
  15947. if (ssl->ctx) {
  15948. if (ssl->ctx->ourCert == NULL) {
  15949. if (ssl->ctx->certificate == NULL) {
  15950. WOLFSSL_MSG("Ctx Certificate buffer not set!");
  15951. return NULL;
  15952. }
  15953. #ifndef WOLFSSL_X509_STORE_CERTS
  15954. ssl->ctx->ourCert = wolfSSL_X509_d2i(NULL,
  15955. ssl->ctx->certificate->buffer,
  15956. ssl->ctx->certificate->length);
  15957. #endif
  15958. ssl->ctx->ownOurCert = 1;
  15959. }
  15960. return ssl->ctx->ourCert;
  15961. }
  15962. }
  15963. return NULL;
  15964. }
  15965. #endif /* OPENSSL_EXTRA && KEEP_OUR_CERT */
  15966. #endif /* NO_CERTS */
  15967. #if !defined(NO_ASN) && (defined(OPENSSL_EXTRA) || \
  15968. defined(OPENSSL_EXTRA_X509_SMALL))
  15969. void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj)
  15970. {
  15971. if (obj == NULL) {
  15972. return;
  15973. }
  15974. if ((obj->obj != NULL) && ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0)) {
  15975. WOLFSSL_MSG("Freeing ASN1 data");
  15976. XFREE((void*)obj->obj, obj->heap, DYNAMIC_TYPE_ASN1);
  15977. obj->obj = NULL;
  15978. }
  15979. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  15980. if (obj->pathlen != NULL) {
  15981. wolfSSL_ASN1_INTEGER_free(obj->pathlen);
  15982. obj->pathlen = NULL;
  15983. }
  15984. #endif
  15985. if ((obj->dynamic & WOLFSSL_ASN1_DYNAMIC) != 0) {
  15986. WOLFSSL_MSG("Freeing ASN1 OBJECT");
  15987. XFREE(obj, NULL, DYNAMIC_TYPE_ASN1);
  15988. }
  15989. }
  15990. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_new(void)
  15991. {
  15992. WOLFSSL_ASN1_OBJECT* obj;
  15993. obj = (WOLFSSL_ASN1_OBJECT*)XMALLOC(sizeof(WOLFSSL_ASN1_OBJECT), NULL,
  15994. DYNAMIC_TYPE_ASN1);
  15995. if (obj == NULL) {
  15996. return NULL;
  15997. }
  15998. XMEMSET(obj, 0, sizeof(WOLFSSL_ASN1_OBJECT));
  15999. obj->d.ia5 = &(obj->d.ia5_internal);
  16000. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  16001. obj->d.iPAddress = &(obj->d.iPAddress_internal);
  16002. #endif
  16003. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  16004. return obj;
  16005. }
  16006. WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_dup(WOLFSSL_ASN1_OBJECT* obj)
  16007. {
  16008. WOLFSSL_ASN1_OBJECT* dup = NULL;
  16009. WOLFSSL_ENTER("wolfSSL_ASN1_OBJECT_dup");
  16010. if (!obj) {
  16011. WOLFSSL_MSG("Bad parameter");
  16012. return NULL;
  16013. }
  16014. dup = wolfSSL_ASN1_OBJECT_new();
  16015. if (!dup) {
  16016. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
  16017. return NULL;
  16018. }
  16019. /* Copy data */
  16020. XMEMCPY(dup->sName, obj->sName, WOLFSSL_MAX_SNAME);
  16021. dup->type = obj->type;
  16022. dup->grp = obj->grp;
  16023. dup->nid = obj->nid;
  16024. dup->objSz = obj->objSz;
  16025. if (obj->obj) {
  16026. dup->obj = (const unsigned char*)XMALLOC(
  16027. obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  16028. if (!dup->obj) {
  16029. WOLFSSL_MSG("ASN1 obj malloc error");
  16030. wolfSSL_ASN1_OBJECT_free(dup);
  16031. return NULL;
  16032. }
  16033. XMEMCPY((byte*)dup->obj, obj->obj, obj->objSz);
  16034. dup->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
  16035. }
  16036. return dup;
  16037. }
  16038. #endif /* !NO_ASN && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  16039. #ifndef NO_ASN
  16040. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16041. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  16042. WOLFSSL_STACK* wolfSSL_sk_new_asn1_obj(void)
  16043. {
  16044. WOLFSSL_STACK* sk;
  16045. WOLFSSL_ENTER("wolfSSL_sk_new_asn1_obj");
  16046. sk = wolfSSL_sk_new_null();
  16047. if (sk == NULL)
  16048. return NULL;
  16049. sk->type = STACK_TYPE_OBJ;
  16050. return sk;
  16051. }
  16052. /* return 1 on success 0 on fail */
  16053. int wolfSSL_sk_ASN1_OBJECT_push(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  16054. WOLFSSL_ASN1_OBJECT* obj)
  16055. {
  16056. WOLFSSL_STACK* node;
  16057. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_push");
  16058. if (sk == NULL || obj == NULL) {
  16059. return WOLFSSL_FAILURE;
  16060. }
  16061. /* no previous values in stack */
  16062. if (sk->data.obj == NULL) {
  16063. sk->data.obj = obj;
  16064. sk->num += 1;
  16065. return WOLFSSL_SUCCESS;
  16066. }
  16067. /* stack already has value(s) create a new node and add more */
  16068. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  16069. DYNAMIC_TYPE_ASN1);
  16070. if (node == NULL) {
  16071. WOLFSSL_MSG("Memory error");
  16072. return WOLFSSL_FAILURE;
  16073. }
  16074. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  16075. /* push new obj onto head of stack */
  16076. node->data.obj = sk->data.obj;
  16077. node->next = sk->next;
  16078. node->type = sk->type;
  16079. sk->next = node;
  16080. sk->data.obj = obj;
  16081. sk->num += 1;
  16082. return WOLFSSL_SUCCESS;
  16083. }
  16084. WOLFSSL_ASN1_OBJECT* wolfSSL_sk_ASN1_OBJECT_pop(
  16085. WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  16086. {
  16087. WOLFSSL_STACK* node;
  16088. WOLFSSL_ASN1_OBJECT* obj;
  16089. if (sk == NULL) {
  16090. return NULL;
  16091. }
  16092. node = sk->next;
  16093. obj = sk->data.obj;
  16094. if (node != NULL) { /* update sk and remove node from stack */
  16095. sk->data.obj = node->data.obj;
  16096. sk->next = node->next;
  16097. XFREE(node, NULL, DYNAMIC_TYPE_ASN1);
  16098. }
  16099. else { /* last obj in stack */
  16100. sk->data.obj = NULL;
  16101. }
  16102. if (sk->num > 0) {
  16103. sk->num -= 1;
  16104. }
  16105. return obj;
  16106. }
  16107. /* Free the structure for ASN1_OBJECT stack
  16108. *
  16109. * sk stack to free nodes in
  16110. */
  16111. void wolfSSL_sk_ASN1_OBJECT_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk)
  16112. {
  16113. wolfSSL_sk_ASN1_OBJECT_pop_free(sk, NULL);
  16114. }
  16115. /* Free's all nodes in ASN1_OBJECT stack.
  16116. * This is different then wolfSSL_ASN1_OBJECT_free in that it allows for
  16117. * choosing the function to use when freeing an ASN1_OBJECT stack.
  16118. *
  16119. * sk stack to free nodes in
  16120. * f X509 free function
  16121. */
  16122. void wolfSSL_sk_ASN1_OBJECT_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  16123. void (*f) (WOLFSSL_ASN1_OBJECT*))
  16124. {
  16125. WOLFSSL_STACK* node;
  16126. WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_pop_free");
  16127. if (sk == NULL) {
  16128. WOLFSSL_MSG("Parameter error");
  16129. return;
  16130. }
  16131. /* parse through stack freeing each node */
  16132. node = sk->next;
  16133. while (node && sk->num > 1) {
  16134. WOLFSSL_STACK* tmp = node;
  16135. node = node->next;
  16136. if (f)
  16137. f(tmp->data.obj);
  16138. else
  16139. wolfSSL_ASN1_OBJECT_free(tmp->data.obj);
  16140. tmp->data.obj = NULL;
  16141. XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
  16142. sk->num -= 1;
  16143. }
  16144. /* free head of stack */
  16145. if (sk->num == 1) {
  16146. if (f)
  16147. f(sk->data.obj);
  16148. else
  16149. wolfSSL_ASN1_OBJECT_free(sk->data.obj);
  16150. sk->data.obj = NULL;
  16151. }
  16152. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  16153. }
  16154. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16155. #endif /* !NO_ASN */
  16156. #ifdef OPENSSL_EXTRA
  16157. #ifndef NO_ASN
  16158. int wolfSSL_ASN1_STRING_to_UTF8(unsigned char **out, WOLFSSL_ASN1_STRING *in)
  16159. {
  16160. /*
  16161. ASN1_STRING_to_UTF8() converts the string in to UTF8 format,
  16162. the converted data is allocated in a buffer in *out.
  16163. The length of out is returned or a negative error code.
  16164. The buffer *out should be free using OPENSSL_free().
  16165. */
  16166. unsigned char* buf;
  16167. unsigned char* inPtr;
  16168. int inLen;
  16169. if (!out || !in) {
  16170. return -1;
  16171. }
  16172. inPtr = wolfSSL_ASN1_STRING_data(in);
  16173. inLen = wolfSSL_ASN1_STRING_length(in);
  16174. if (!inPtr || inLen < 0) {
  16175. return -1;
  16176. }
  16177. buf = (unsigned char*)XMALLOC(inLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  16178. if (!buf) {
  16179. return -1;
  16180. }
  16181. XMEMCPY(buf, inPtr, inLen + 1);
  16182. *out = buf;
  16183. return inLen;
  16184. }
  16185. /* Returns string representation of ASN1_STRING */
  16186. char* wolfSSL_i2s_ASN1_STRING(WOLFSSL_v3_ext_method *method,
  16187. const WOLFSSL_ASN1_STRING *s)
  16188. {
  16189. int i;
  16190. int tmpSz = 100;
  16191. int valSz = 5;
  16192. char* tmp;
  16193. char val[5];
  16194. unsigned char* str;
  16195. WOLFSSL_ENTER("wolfSSL_i2s_ASN1_STRING");
  16196. (void)method;
  16197. if(s == NULL || s->data == NULL) {
  16198. WOLFSSL_MSG("Bad Function Argument");
  16199. return NULL;
  16200. }
  16201. str = (unsigned char*)XMALLOC(s->length, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16202. if (str == NULL) {
  16203. WOLFSSL_MSG("Memory Error");
  16204. return NULL;
  16205. }
  16206. XMEMCPY(str, (unsigned char*)s->data, s->length);
  16207. tmp = (char*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16208. if (tmp == NULL) {
  16209. WOLFSSL_MSG("Memory Error");
  16210. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16211. return NULL;
  16212. }
  16213. XMEMSET(tmp, 0, tmpSz);
  16214. for (i = 0; i < tmpSz && i < (s->length - 1); i++) {
  16215. XSNPRINTF(val, valSz - 1, "%02X:", str[i]);
  16216. XSTRNCAT(tmp, val, valSz);
  16217. }
  16218. XSNPRINTF(val, valSz - 1, "%02X", str[i]);
  16219. XSTRNCAT(tmp, val, valSz);
  16220. XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  16221. return tmp;
  16222. }
  16223. #endif /* NO_ASN */
  16224. #endif /* OPENSSL_EXTRA */
  16225. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  16226. void wolfSSL_set_connect_state(WOLFSSL* ssl)
  16227. {
  16228. WOLFSSL_ENTER("wolfSSL_set_connect_state");
  16229. if (ssl == NULL) {
  16230. WOLFSSL_MSG("WOLFSSL struct pointer passed in was null");
  16231. return;
  16232. }
  16233. #ifndef NO_DH
  16234. /* client creates its own DH parameters on handshake */
  16235. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  16236. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  16237. DYNAMIC_TYPE_PUBLIC_KEY);
  16238. }
  16239. ssl->buffers.serverDH_P.buffer = NULL;
  16240. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  16241. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  16242. DYNAMIC_TYPE_PUBLIC_KEY);
  16243. }
  16244. ssl->buffers.serverDH_G.buffer = NULL;
  16245. #endif
  16246. if (InitSSL_Side(ssl, WOLFSSL_CLIENT_END) != WOLFSSL_SUCCESS) {
  16247. WOLFSSL_MSG("Error initializing client side");
  16248. }
  16249. }
  16250. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  16251. int wolfSSL_get_shutdown(const WOLFSSL* ssl)
  16252. {
  16253. int isShutdown = 0;
  16254. WOLFSSL_ENTER("wolfSSL_get_shutdown");
  16255. if (ssl) {
  16256. /* in OpenSSL, WOLFSSL_SENT_SHUTDOWN = 1, when closeNotifySent *
  16257. * WOLFSSL_RECEIVED_SHUTDOWN = 2, from close notify or fatal err */
  16258. isShutdown = ((ssl->options.closeNotify||ssl->options.connReset) << 1)
  16259. | (ssl->options.sentNotify);
  16260. }
  16261. return isShutdown;
  16262. }
  16263. int wolfSSL_session_reused(WOLFSSL* ssl)
  16264. {
  16265. int resuming = 0;
  16266. if (ssl)
  16267. resuming = ssl->options.resuming;
  16268. return resuming;
  16269. }
  16270. #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
  16271. /* return a new malloc'd session with default settings on success */
  16272. WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
  16273. {
  16274. WOLFSSL_SESSION* ret = NULL;
  16275. ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), NULL,
  16276. DYNAMIC_TYPE_OPENSSL);
  16277. if (ret != NULL) {
  16278. XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
  16279. #ifdef OPENSSL_EXTRA
  16280. if (wc_InitMutex(&ret->refMutex) != 0) {
  16281. WOLFSSL_MSG("Error setting up session reference mutex");
  16282. XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
  16283. return NULL;
  16284. }
  16285. #endif
  16286. ret->isAlloced = 1;
  16287. }
  16288. return ret;
  16289. }
  16290. /* add one to session reference count
  16291. * return WOFLSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
  16292. int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session)
  16293. {
  16294. if (session == NULL)
  16295. return WOLFSSL_FAILURE;
  16296. #ifdef OPENSSL_EXTRA
  16297. if (wc_LockMutex(&session->refMutex) != 0) {
  16298. WOLFSSL_MSG("Failed to lock session mutex");
  16299. }
  16300. session->refCount++;
  16301. wc_UnLockMutex(&session->refMutex);
  16302. #endif
  16303. return WOLFSSL_SUCCESS;
  16304. }
  16305. WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
  16306. {
  16307. #ifdef HAVE_EXT_CACHE
  16308. WOLFSSL_SESSION* copy;
  16309. WOLFSSL_ENTER("wolfSSL_SESSION_dup");
  16310. if (session == NULL)
  16311. return NULL;
  16312. #ifdef HAVE_SESSION_TICKET
  16313. if (session->isDynamic && !session->ticket) {
  16314. WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null");
  16315. return NULL;
  16316. }
  16317. #endif
  16318. copy = wolfSSL_SESSION_new();
  16319. if (copy != NULL) {
  16320. XMEMCPY(copy, session, sizeof(WOLFSSL_SESSION));
  16321. copy->isAlloced = 1;
  16322. #ifdef HAVE_SESSION_TICKET
  16323. if (session->isDynamic) {
  16324. copy->ticket = (byte*)XMALLOC(session->ticketLen, NULL,
  16325. DYNAMIC_TYPE_SESSION_TICK);
  16326. XMEMCPY(copy->ticket, session->ticket, session->ticketLen);
  16327. } else {
  16328. copy->ticket = copy->staticTicket;
  16329. }
  16330. #endif
  16331. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16332. copy->peer = wolfSSL_X509_dup(session->peer);
  16333. #endif
  16334. }
  16335. return copy;
  16336. #else
  16337. WOLFSSL_MSG("wolfSSL_SESSION_dup was called "
  16338. "but HAVE_EXT_CACHE is not defined");
  16339. (void)session;
  16340. return NULL;
  16341. #endif /* HAVE_EXT_CACHE */
  16342. }
  16343. void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
  16344. {
  16345. if (session == NULL)
  16346. return;
  16347. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  16348. if (session->peer) {
  16349. wolfSSL_X509_free(session->peer);
  16350. }
  16351. #endif
  16352. #ifdef OPENSSL_EXTRA
  16353. if (wc_LockMutex(&session->refMutex) != 0) {
  16354. WOLFSSL_MSG("Failed to lock session mutex");
  16355. }
  16356. if (session->refCount > 0) {
  16357. session->refCount--;
  16358. wc_UnLockMutex(&session->refMutex);
  16359. return;
  16360. }
  16361. wc_UnLockMutex(&session->refMutex);
  16362. #endif
  16363. #if defined(HAVE_EXT_CACHE) || defined(OPENSSL_EXTRA)
  16364. if (session->isAlloced) {
  16365. #ifdef HAVE_SESSION_TICKET
  16366. if (session->isDynamic)
  16367. XFREE(session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  16368. #endif
  16369. XFREE(session, NULL, DYNAMIC_TYPE_OPENSSL);
  16370. }
  16371. #else
  16372. /* No need to free since cache is static */
  16373. (void)session;
  16374. #endif
  16375. }
  16376. #endif
  16377. /* helper function that takes in a protocol version struct and returns string */
  16378. static const char* wolfSSL_internal_get_version(const ProtocolVersion* version)
  16379. {
  16380. WOLFSSL_ENTER("wolfSSL_get_version");
  16381. if (version == NULL) {
  16382. return "Bad arg";
  16383. }
  16384. if (version->major == SSLv3_MAJOR) {
  16385. switch (version->minor) {
  16386. case SSLv3_MINOR :
  16387. return "SSLv3";
  16388. case TLSv1_MINOR :
  16389. return "TLSv1";
  16390. case TLSv1_1_MINOR :
  16391. return "TLSv1.1";
  16392. case TLSv1_2_MINOR :
  16393. return "TLSv1.2";
  16394. case TLSv1_3_MINOR :
  16395. return "TLSv1.3";
  16396. default:
  16397. return "unknown";
  16398. }
  16399. }
  16400. #ifdef WOLFSSL_DTLS
  16401. else if (version->major == DTLS_MAJOR) {
  16402. switch (version->minor) {
  16403. case DTLS_MINOR :
  16404. return "DTLS";
  16405. case DTLSv1_2_MINOR :
  16406. return "DTLSv1.2";
  16407. default:
  16408. return "unknown";
  16409. }
  16410. }
  16411. #endif /* WOLFSSL_DTLS */
  16412. return "unknown";
  16413. }
  16414. const char* wolfSSL_get_version(const WOLFSSL* ssl)
  16415. {
  16416. if (ssl == NULL) {
  16417. WOLFSSL_MSG("Bad argument");
  16418. return "unknown";
  16419. }
  16420. return wolfSSL_internal_get_version(&ssl->version);
  16421. }
  16422. /* current library version */
  16423. const char* wolfSSL_lib_version(void)
  16424. {
  16425. return LIBWOLFSSL_VERSION_STRING;
  16426. }
  16427. #ifdef OPENSSL_EXTRA
  16428. const char* wolfSSL_OpenSSL_version(void)
  16429. {
  16430. return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
  16431. }
  16432. #endif
  16433. /* current library version in hex */
  16434. word32 wolfSSL_lib_version_hex(void)
  16435. {
  16436. return LIBWOLFSSL_VERSION_HEX;
  16437. }
  16438. int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl)
  16439. {
  16440. WOLFSSL_ENTER("SSL_get_current_cipher_suite");
  16441. if (ssl)
  16442. return (ssl->options.cipherSuite0 << 8) | ssl->options.cipherSuite;
  16443. return 0;
  16444. }
  16445. WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl)
  16446. {
  16447. WOLFSSL_ENTER("SSL_get_current_cipher");
  16448. if (ssl) {
  16449. ssl->cipher.cipherSuite0 = ssl->options.cipherSuite0;
  16450. ssl->cipher.cipherSuite = ssl->options.cipherSuite;
  16451. return &ssl->cipher;
  16452. }
  16453. else
  16454. return NULL;
  16455. }
  16456. const char* wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER* cipher)
  16457. {
  16458. WOLFSSL_ENTER("wolfSSL_CIPHER_get_name");
  16459. if (cipher == NULL) {
  16460. return NULL;
  16461. }
  16462. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) && \
  16463. !defined(WOLFSSL_QT)
  16464. return GetCipherNameIana(cipher->cipherSuite0, cipher->cipherSuite);
  16465. #else
  16466. return wolfSSL_get_cipher_name_from_suite(cipher->cipherSuite0,
  16467. cipher->cipherSuite);
  16468. #endif
  16469. }
  16470. const char* wolfSSL_CIPHER_get_version(const WOLFSSL_CIPHER* cipher)
  16471. {
  16472. WOLFSSL_ENTER("SSL_CIPHER_get_version");
  16473. if (cipher == NULL || cipher->ssl == NULL) {
  16474. return NULL;
  16475. }
  16476. return wolfSSL_get_version(cipher->ssl);
  16477. }
  16478. const char* wolfSSL_SESSION_CIPHER_get_name(WOLFSSL_SESSION* session)
  16479. {
  16480. if (session == NULL) {
  16481. return NULL;
  16482. }
  16483. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  16484. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  16485. #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS)
  16486. return GetCipherNameIana(session->cipherSuite0, session->cipherSuite);
  16487. #else
  16488. return GetCipherNameInternal(session->cipherSuite0, session->cipherSuite);
  16489. #endif
  16490. #else
  16491. return NULL;
  16492. #endif
  16493. }
  16494. const char* wolfSSL_get_cipher(WOLFSSL* ssl)
  16495. {
  16496. WOLFSSL_ENTER("wolfSSL_get_cipher");
  16497. return wolfSSL_CIPHER_get_name(wolfSSL_get_current_cipher(ssl));
  16498. }
  16499. /* gets cipher name in the format DHE-RSA-... rather then TLS_DHE... */
  16500. const char* wolfSSL_get_cipher_name(WOLFSSL* ssl)
  16501. {
  16502. /* get access to cipher_name_idx in internal.c */
  16503. return wolfSSL_get_cipher_name_internal(ssl);
  16504. }
  16505. const char* wolfSSL_get_cipher_name_from_suite(const byte cipherSuite0,
  16506. const byte cipherSuite)
  16507. {
  16508. return GetCipherNameInternal(cipherSuite0, cipherSuite);
  16509. }
  16510. const char* wolfSSL_get_cipher_name_iana_from_suite(const byte cipherSuite0,
  16511. const byte cipherSuite)
  16512. {
  16513. return GetCipherNameIana(cipherSuite0, cipherSuite);
  16514. }
  16515. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  16516. /* Creates and returns a new WOLFSSL_CIPHER stack. */
  16517. WOLFSSL_STACK* wolfSSL_sk_new_cipher(void)
  16518. {
  16519. WOLFSSL_STACK* sk;
  16520. WOLFSSL_ENTER("wolfSSL_sk_new_cipher");
  16521. sk = wolfSSL_sk_new_null();
  16522. if (sk == NULL)
  16523. return NULL;
  16524. sk->type = STACK_TYPE_CIPHER;
  16525. return sk;
  16526. }
  16527. #ifndef NO_WOLFSSL_STUB
  16528. /* Keep as stubs for now */
  16529. /* return 1 on success 0 on fail */
  16530. int wolfSSL_sk_CIPHER_push(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk,
  16531. WOLFSSL_CIPHER* cipher)
  16532. {
  16533. WOLFSSL_STUB("wolfSSL_sk_CIPHER_push");
  16534. (void)sk;
  16535. (void)cipher;
  16536. return 0;
  16537. }
  16538. WOLFSSL_CIPHER* wolfSSL_sk_CIPHER_pop(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  16539. {
  16540. WOLFSSL_STUB("wolfSSL_sk_CIPHER_pop");
  16541. (void)sk;
  16542. return NULL;
  16543. }
  16544. #endif /* NO_WOLFSSL_STUB */
  16545. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  16546. word32 wolfSSL_CIPHER_get_id(const WOLFSSL_CIPHER* cipher)
  16547. {
  16548. word16 cipher_id = 0;
  16549. WOLFSSL_ENTER("SSL_CIPHER_get_id");
  16550. if (cipher && cipher->ssl) {
  16551. cipher_id = (cipher->ssl->options.cipherSuite0 << 8) |
  16552. cipher->ssl->options.cipherSuite;
  16553. }
  16554. return cipher_id;
  16555. }
  16556. const WOLFSSL_CIPHER* wolfSSL_get_cipher_by_value(word16 value)
  16557. {
  16558. const WOLFSSL_CIPHER* cipher = NULL;
  16559. byte cipherSuite0, cipherSuite;
  16560. WOLFSSL_ENTER("SSL_get_cipher_by_value");
  16561. /* extract cipher id information */
  16562. cipherSuite = (value & 0xFF);
  16563. cipherSuite0 = ((value >> 8) & 0xFF);
  16564. /* TODO: lookup by cipherSuite0 / cipherSuite */
  16565. (void)cipherSuite0;
  16566. (void)cipherSuite;
  16567. return cipher;
  16568. }
  16569. #if defined(OPENSSL_ALL)
  16570. /* Free the structure for WOLFSSL_CIPHER stack
  16571. *
  16572. * sk stack to free nodes in
  16573. */
  16574. void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  16575. {
  16576. WOLFSSL_STACK* node;
  16577. WOLFSSL_STACK* tmp;
  16578. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_free");
  16579. if (sk == NULL)
  16580. return;
  16581. /* parse through stack freeing each node */
  16582. node = sk->next;
  16583. while (node) {
  16584. tmp = node;
  16585. node = node->next;
  16586. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  16587. }
  16588. /* free head of stack */
  16589. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  16590. }
  16591. #endif
  16592. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
  16593. !defined(NO_DH)
  16594. #ifdef HAVE_FFDHE
  16595. static const char* wolfssl_ffdhe_name(word16 group)
  16596. {
  16597. const char* str = NULL;
  16598. switch (group) {
  16599. case WOLFSSL_FFDHE_2048:
  16600. str = "FFDHE_2048";
  16601. break;
  16602. case WOLFSSL_FFDHE_3072:
  16603. str = "FFDHE_3072";
  16604. break;
  16605. case WOLFSSL_FFDHE_4096:
  16606. str = "FFDHE_4096";
  16607. break;
  16608. case WOLFSSL_FFDHE_6144:
  16609. str = "FFDHE_6144";
  16610. break;
  16611. case WOLFSSL_FFDHE_8192:
  16612. str = "FFDHE_8192";
  16613. break;
  16614. }
  16615. return str;
  16616. }
  16617. #endif
  16618. /* Return the name of the curve used for key exchange as a printable string.
  16619. *
  16620. * ssl The SSL/TLS object.
  16621. * returns NULL if ECDH was not used, otherwise the name as a string.
  16622. */
  16623. const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
  16624. {
  16625. const char* cName = NULL;
  16626. if (ssl == NULL)
  16627. return NULL;
  16628. #ifdef HAVE_FFDHE
  16629. if (ssl->namedGroup != 0) {
  16630. cName = wolfssl_ffdhe_name(ssl->namedGroup);
  16631. }
  16632. #endif
  16633. #ifdef HAVE_CURVE25519
  16634. if (ssl->ecdhCurveOID == ECC_X25519_OID && cName == NULL) {
  16635. cName = "X25519";
  16636. }
  16637. #endif
  16638. #ifdef HAVE_CURVE448
  16639. if (ssl->ecdhCurveOID == ECC_X448_OID && cName == NULL) {
  16640. cName = "X448";
  16641. }
  16642. #endif
  16643. #ifdef HAVE_ECC
  16644. if (ssl->ecdhCurveOID != 0 && cName == NULL) {
  16645. cName = wc_ecc_get_name(wc_ecc_get_oid(ssl->ecdhCurveOID, NULL,
  16646. NULL));
  16647. }
  16648. #endif
  16649. return cName;
  16650. }
  16651. #endif
  16652. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(KEEP_PEER_CERT) || \
  16653. defined(SESSION_CERTS)
  16654. /* Smaller subset of X509 compatibility functions. Avoid increasing the size of
  16655. * this subset and its memory usage */
  16656. #if !defined(NO_CERTS)
  16657. /* returns a pointer to a new WOLFSSL_X509 structure on success and NULL on
  16658. * fail
  16659. */
  16660. WOLFSSL_X509* wolfSSL_X509_new(void)
  16661. {
  16662. WOLFSSL_X509* x509;
  16663. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  16664. DYNAMIC_TYPE_X509);
  16665. if (x509 != NULL) {
  16666. InitX509(x509, 1, NULL);
  16667. }
  16668. return x509;
  16669. }
  16670. WOLFSSL_ABI
  16671. WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert)
  16672. {
  16673. WOLFSSL_ENTER("wolfSSL_X509_get_subject_name");
  16674. if (cert && cert->subject.sz != 0)
  16675. return &cert->subject;
  16676. return NULL;
  16677. }
  16678. #if defined(OPENSSL_EXTRA) && (!defined(NO_SHA) || !defined(NO_SHA256))
  16679. /******************************************************************************
  16680. * wolfSSL_X509_subject_name_hash - compute the hash digest of the raw subject name
  16681. * This function prefers SHA-1 (if available) for compatibility
  16682. *
  16683. * RETURNS:
  16684. * The beginning of the hash digest. Otherwise, returns zero.
  16685. * Note:
  16686. * Returns a different hash value from OpenSSL's X509_subject_name_hash() API
  16687. * depending on the subject name.
  16688. */
  16689. unsigned long wolfSSL_X509_subject_name_hash(const WOLFSSL_X509* x509)
  16690. {
  16691. unsigned long ret = 0;
  16692. int retHash = NOT_COMPILED_IN;
  16693. WOLFSSL_X509_NAME *subjectName = NULL;
  16694. byte digest[WC_MAX_DIGEST_SIZE];
  16695. if (x509 == NULL) {
  16696. return ret;
  16697. }
  16698. subjectName = wolfSSL_X509_get_subject_name((WOLFSSL_X509*)x509);
  16699. if (subjectName != NULL) {
  16700. #ifndef NO_SHA
  16701. retHash = wc_ShaHash((const byte*)subjectName->name,
  16702. (word32)subjectName->sz, digest);
  16703. #elif !defined(NO_SHA256)
  16704. retHash = wc_Sha256Hash((const byte*)subjectName->name,
  16705. (word32)subjectName->sz, digest);
  16706. #endif
  16707. if (retHash == 0) {
  16708. ret = (unsigned long)MakeWordFromHash(digest);
  16709. }
  16710. }
  16711. return ret;
  16712. }
  16713. unsigned long wolfSSL_X509_issuer_name_hash(const WOLFSSL_X509* x509)
  16714. {
  16715. unsigned long ret = 0;
  16716. int retHash = NOT_COMPILED_IN;
  16717. WOLFSSL_X509_NAME *issuerName = NULL;
  16718. byte digest[WC_MAX_DIGEST_SIZE];
  16719. if (x509 == NULL) {
  16720. return ret;
  16721. }
  16722. issuerName = wolfSSL_X509_get_issuer_name((WOLFSSL_X509*)x509);
  16723. if (issuerName != NULL) {
  16724. #ifndef NO_SHA
  16725. retHash = wc_ShaHash((const byte*)issuerName->name,
  16726. (word32)issuerName->sz, digest);
  16727. #elif !defined(NO_SHA256)
  16728. retHash = wc_Sha256Hash((const byte*)issuerName->name,
  16729. (word32)issuerName->sz, digest);
  16730. #endif
  16731. if (retHash == 0) {
  16732. ret = (unsigned long)MakeWordFromHash(digest);
  16733. }
  16734. }
  16735. return ret;
  16736. }
  16737. #endif /* OPENSSL_EXTRA && (!NO_SHA || !NO_SHA256) */
  16738. WOLFSSL_ABI
  16739. WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509* cert)
  16740. {
  16741. WOLFSSL_ENTER("X509_get_issuer_name");
  16742. if (cert && cert->issuer.sz != 0)
  16743. return &cert->issuer;
  16744. return NULL;
  16745. }
  16746. int wolfSSL_X509_get_signature_type(WOLFSSL_X509* x509)
  16747. {
  16748. int type = 0;
  16749. WOLFSSL_ENTER("wolfSSL_X509_get_signature_type");
  16750. if (x509 != NULL)
  16751. type = x509->sigOID;
  16752. return type;
  16753. }
  16754. #if defined(OPENSSL_EXTRA_X509_SMALL)
  16755. /* Searches for the first ENTRY of type NID
  16756. * idx is the location to start searching from, the value at when the entry was
  16757. * found is stored into idx
  16758. * returns a pointer to the entry on success and null on fail */
  16759. static WOLFSSL_X509_NAME_ENTRY* GetEntryByNID(WOLFSSL_X509_NAME* name, int nid,
  16760. int* idx)
  16761. {
  16762. int i;
  16763. WOLFSSL_X509_NAME_ENTRY* ret = NULL;
  16764. /* and index of less than 0 is assumed to be starting from 0 */
  16765. if (*idx < 0) {
  16766. *idx = 0;
  16767. }
  16768. for (i = *idx; i < MAX_NAME_ENTRIES; i++) {
  16769. if (name->entry[i].nid == nid) {
  16770. ret = &name->entry[i];
  16771. *idx = i;
  16772. break;
  16773. }
  16774. }
  16775. return ret;
  16776. }
  16777. /* Used to get a string from the WOLFSSL_X509_NAME structure that
  16778. * corresponds with the NID value passed in. This finds the first entry with
  16779. * matching NID value, if searching for the case where there is multiple
  16780. * entries with the same NID value than other functions should be used
  16781. * (i.e. wolfSSL_X509_NAME_get_index_by_NID, wolfSSL_X509_NAME_get_entry)
  16782. *
  16783. * name structure to get string from
  16784. * nid NID value to search for
  16785. * buf [out] buffer to hold results. If NULL then the buffer size minus the
  16786. * null char is returned.
  16787. * len size of "buf" passed in
  16788. *
  16789. * returns the length of string found, not including the NULL terminator.
  16790. * It's possible the function could return a negative value in the
  16791. * case that len is less than or equal to 0. A negative value is
  16792. * considered an error case.
  16793. */
  16794. int wolfSSL_X509_NAME_get_text_by_NID(WOLFSSL_X509_NAME* name,
  16795. int nid, char* buf, int len)
  16796. {
  16797. WOLFSSL_X509_NAME_ENTRY* e;
  16798. unsigned char *text = NULL;
  16799. int textSz = 0;
  16800. int idx = 0;
  16801. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_text_by_NID");
  16802. if (name == NULL) {
  16803. WOLFSSL_MSG("NULL argument passed in");
  16804. return WOLFSSL_FATAL_ERROR;
  16805. }
  16806. e = GetEntryByNID(name, nid, &idx);
  16807. if (e == NULL) {
  16808. WOLFSSL_MSG("Entry type not found");
  16809. return WOLFSSL_FATAL_ERROR;
  16810. }
  16811. text = wolfSSL_ASN1_STRING_data(e->value);
  16812. textSz = wolfSSL_ASN1_STRING_length(e->value);
  16813. if (text == NULL) {
  16814. WOLFSSL_MSG("Unable to get entry text");
  16815. return WOLFSSL_FATAL_ERROR;
  16816. }
  16817. /* if buf is NULL return size of buffer needed (minus null char) */
  16818. if (buf == NULL) {
  16819. WOLFSSL_MSG("Buffer is NULL, returning buffer size only");
  16820. return textSz;
  16821. }
  16822. if (buf != NULL && text != NULL) {
  16823. textSz = min(textSz + 1, len); /* + 1 to account for null char */
  16824. if (textSz > 0) {
  16825. XMEMCPY(buf, text, textSz - 1);
  16826. buf[textSz - 1] = '\0';
  16827. }
  16828. }
  16829. WOLFSSL_LEAVE("wolfSSL_X509_NAME_get_text_by_NID", textSz);
  16830. return (textSz - 1); /* do not include null character in size */
  16831. }
  16832. /* Creates a new WOLFSSL_EVP_PKEY structure that has the public key from x509
  16833. *
  16834. * returns a pointer to the created WOLFSSL_EVP_PKEY on success and NULL on fail
  16835. */
  16836. WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
  16837. {
  16838. WOLFSSL_EVP_PKEY* key = NULL;
  16839. WOLFSSL_ENTER("X509_get_pubkey");
  16840. if (x509 != NULL) {
  16841. key = wolfSSL_EVP_PKEY_new_ex(x509->heap);
  16842. if (key != NULL) {
  16843. if (x509->pubKeyOID == RSAk) {
  16844. key->type = EVP_PKEY_RSA;
  16845. }
  16846. else if (x509->pubKeyOID == DSAk) {
  16847. key->type = EVP_PKEY_DSA;
  16848. }
  16849. else {
  16850. key->type = EVP_PKEY_EC;
  16851. }
  16852. key->save_type = 0;
  16853. key->pkey.ptr = (char*)XMALLOC(
  16854. x509->pubKey.length, x509->heap,
  16855. DYNAMIC_TYPE_PUBLIC_KEY);
  16856. if (key->pkey.ptr == NULL) {
  16857. wolfSSL_EVP_PKEY_free(key);
  16858. return NULL;
  16859. }
  16860. XMEMCPY(key->pkey.ptr, x509->pubKey.buffer, x509->pubKey.length);
  16861. key->pkey_sz = x509->pubKey.length;
  16862. #ifdef HAVE_ECC
  16863. key->pkey_curve = (int)x509->pkCurveOID;
  16864. #endif /* HAVE_ECC */
  16865. /* decode RSA key */
  16866. #ifndef NO_RSA
  16867. if (key->type == EVP_PKEY_RSA) {
  16868. key->ownRsa = 1;
  16869. key->rsa = wolfSSL_RSA_new();
  16870. if (key->rsa == NULL) {
  16871. wolfSSL_EVP_PKEY_free(key);
  16872. return NULL;
  16873. }
  16874. if (wolfSSL_RSA_LoadDer_ex(key->rsa,
  16875. (const unsigned char*)key->pkey.ptr, key->pkey_sz,
  16876. WOLFSSL_RSA_LOAD_PUBLIC) != SSL_SUCCESS) {
  16877. wolfSSL_EVP_PKEY_free(key);
  16878. return NULL;
  16879. }
  16880. }
  16881. #endif /* NO_RSA */
  16882. /* decode ECC key */
  16883. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  16884. if (key->type == EVP_PKEY_EC) {
  16885. word32 idx = 0;
  16886. key->ownEcc = 1;
  16887. key->ecc = wolfSSL_EC_KEY_new();
  16888. if (key->ecc == NULL || key->ecc->internal == NULL) {
  16889. wolfSSL_EVP_PKEY_free(key);
  16890. return NULL;
  16891. }
  16892. /* not using wolfSSL_EC_KEY_LoadDer because public key in x509
  16893. * is in the format of x963 (no sequence at start of buffer) */
  16894. if (wc_EccPublicKeyDecode((const unsigned char*)key->pkey.ptr,
  16895. &idx, (ecc_key*)key->ecc->internal, key->pkey_sz) < 0) {
  16896. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  16897. wolfSSL_EVP_PKEY_free(key);
  16898. return NULL;
  16899. }
  16900. if (SetECKeyExternal(key->ecc) != SSL_SUCCESS) {
  16901. WOLFSSL_MSG("SetECKeyExternal failed");
  16902. wolfSSL_EVP_PKEY_free(key);
  16903. return NULL;
  16904. }
  16905. key->ecc->inSet = 1;
  16906. }
  16907. #endif /* HAVE_ECC */
  16908. #ifndef NO_DSA
  16909. if (key->type == EVP_PKEY_DSA) {
  16910. key->ownDsa = 1;
  16911. key->dsa = wolfSSL_DSA_new();
  16912. if (key->dsa == NULL) {
  16913. wolfSSL_EVP_PKEY_free(key);
  16914. return NULL;
  16915. }
  16916. if (wolfSSL_DSA_LoadDer_ex(key->dsa,
  16917. (const unsigned char*)key->pkey.ptr, key->pkey_sz, \
  16918. WOLFSSL_DSA_LOAD_PUBLIC) != SSL_SUCCESS) {
  16919. wolfSSL_DSA_free(key->dsa);
  16920. key->dsa = NULL;
  16921. wolfSSL_EVP_PKEY_free(key);
  16922. return NULL;
  16923. }
  16924. }
  16925. #endif /* NO_DSA */
  16926. }
  16927. }
  16928. return key;
  16929. }
  16930. #endif /* OPENSSL_EXTRA_X509_SMALL */
  16931. #endif /* !NO_CERTS */
  16932. /* End of smaller subset of X509 compatibility functions. Avoid increasing the
  16933. * size of this subset and its memory usage */
  16934. #endif /* OPENSSL_EXTRA_X509_SMALL || KEEP_PEER_CERT || SESSION_CERTS */
  16935. #if defined(OPENSSL_ALL)
  16936. /* Takes two WOLFSSL_X509* certificates and performs a Sha hash of each, if the
  16937. * hash values are the same, then it will do an XMEMCMP to confirm they are
  16938. * identical. Returns a 0 when certificates match, returns a negative number
  16939. * when certificates are not a match.
  16940. */
  16941. int wolfSSL_X509_cmp(const WOLFSSL_X509 *a, const WOLFSSL_X509 *b)
  16942. {
  16943. const byte* derA;
  16944. const byte* derB;
  16945. int outSzA = 0;
  16946. int outSzB = 0;
  16947. if (a == NULL || b == NULL){
  16948. return BAD_FUNC_ARG;
  16949. }
  16950. derA = wolfSSL_X509_get_der((WOLFSSL_X509*)a, &outSzA);
  16951. if (derA == NULL){
  16952. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate A has failed");
  16953. return WOLFSSL_FATAL_ERROR;
  16954. }
  16955. derB = wolfSSL_X509_get_der((WOLFSSL_X509*)b, &outSzB);
  16956. if (derB == NULL){
  16957. WOLFSSL_MSG("wolfSSL_X509_get_der - certificate B has failed");
  16958. return WOLFSSL_FATAL_ERROR;
  16959. }
  16960. if (outSzA != outSzB || XMEMCMP(derA, derB, outSzA) != 0) {
  16961. WOLFSSL_LEAVE("wolfSSL_X509_cmp", WOLFSSL_FATAL_ERROR);
  16962. return WOLFSSL_FATAL_ERROR;
  16963. }
  16964. WOLFSSL_LEAVE("wolfSSL_X509_cmp", 0);
  16965. return 0;
  16966. }
  16967. #endif /* OPENSSL_ALL */
  16968. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS)
  16969. int wolfSSL_X509_ext_isSet_by_NID(WOLFSSL_X509* x509, int nid)
  16970. {
  16971. int isSet = 0;
  16972. WOLFSSL_ENTER("wolfSSL_X509_ext_isSet_by_NID");
  16973. if (x509 != NULL) {
  16974. switch (nid) {
  16975. case BASIC_CA_OID: isSet = x509->basicConstSet; break;
  16976. case ALT_NAMES_OID: isSet = x509->subjAltNameSet; break;
  16977. case AUTH_KEY_OID: isSet = x509->authKeyIdSet; break;
  16978. case SUBJ_KEY_OID: isSet = x509->subjKeyIdSet; break;
  16979. case KEY_USAGE_OID: isSet = x509->keyUsageSet; break;
  16980. case CRL_DIST_OID: isSet = x509->CRLdistSet; break;
  16981. case EXT_KEY_USAGE_OID: isSet = ((x509->extKeyUsageSrc) ? 1 : 0);
  16982. break;
  16983. case AUTH_INFO_OID: isSet = x509->authInfoSet; break;
  16984. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  16985. case CERT_POLICY_OID: isSet = x509->certPolicySet; break;
  16986. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  16987. default:
  16988. WOLFSSL_MSG("NID not in table");
  16989. }
  16990. }
  16991. WOLFSSL_LEAVE("wolfSSL_X509_ext_isSet_by_NID", isSet);
  16992. return isSet;
  16993. }
  16994. int wolfSSL_X509_ext_get_critical_by_NID(WOLFSSL_X509* x509, int nid)
  16995. {
  16996. int crit = 0;
  16997. WOLFSSL_ENTER("wolfSSL_X509_ext_get_critical_by_NID");
  16998. if (x509 != NULL) {
  16999. switch (nid) {
  17000. case BASIC_CA_OID: crit = x509->basicConstCrit; break;
  17001. case ALT_NAMES_OID: crit = x509->subjAltNameCrit; break;
  17002. case AUTH_KEY_OID: crit = x509->authKeyIdCrit; break;
  17003. case SUBJ_KEY_OID: crit = x509->subjKeyIdCrit; break;
  17004. case KEY_USAGE_OID: crit = x509->keyUsageCrit; break;
  17005. case CRL_DIST_OID: crit= x509->CRLdistCrit; break;
  17006. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  17007. case CERT_POLICY_OID: crit = x509->certPolicyCrit; break;
  17008. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  17009. }
  17010. }
  17011. WOLFSSL_LEAVE("wolfSSL_X509_ext_get_critical_by_NID", crit);
  17012. return crit;
  17013. }
  17014. int wolfSSL_X509_get_isSet_pathLength(WOLFSSL_X509* x509)
  17015. {
  17016. int isSet = 0;
  17017. WOLFSSL_ENTER("wolfSSL_X509_get_isSet_pathLength");
  17018. if (x509 != NULL)
  17019. isSet = x509->basicConstPlSet;
  17020. WOLFSSL_LEAVE("wolfSSL_X509_get_isSet_pathLength", isSet);
  17021. return isSet;
  17022. }
  17023. word32 wolfSSL_X509_get_pathLength(WOLFSSL_X509* x509)
  17024. {
  17025. word32 pathLength = 0;
  17026. WOLFSSL_ENTER("wolfSSL_X509_get_pathLength");
  17027. if (x509 != NULL)
  17028. pathLength = x509->pathLength;
  17029. WOLFSSL_LEAVE("wolfSSL_X509_get_pathLength", pathLength);
  17030. return pathLength;
  17031. }
  17032. unsigned int wolfSSL_X509_get_keyUsage(WOLFSSL_X509* x509)
  17033. {
  17034. word16 usage = 0;
  17035. WOLFSSL_ENTER("wolfSSL_X509_get_keyUsage");
  17036. if (x509 != NULL)
  17037. usage = x509->keyUsage;
  17038. WOLFSSL_LEAVE("wolfSSL_X509_get_keyUsage", usage);
  17039. return usage;
  17040. }
  17041. byte* wolfSSL_X509_get_authorityKeyID(WOLFSSL_X509* x509,
  17042. byte* dst, int* dstLen)
  17043. {
  17044. byte *id = NULL;
  17045. int copySz = 0;
  17046. WOLFSSL_ENTER("wolfSSL_X509_get_authorityKeyID");
  17047. if (x509 != NULL) {
  17048. if (x509->authKeyIdSet) {
  17049. copySz = min(dstLen != NULL ? *dstLen : 0,
  17050. (int)x509->authKeyIdSz);
  17051. id = x509->authKeyId;
  17052. }
  17053. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  17054. XMEMCPY(dst, id, copySz);
  17055. id = dst;
  17056. *dstLen = copySz;
  17057. }
  17058. }
  17059. WOLFSSL_LEAVE("wolfSSL_X509_get_authorityKeyID", copySz);
  17060. return id;
  17061. }
  17062. byte* wolfSSL_X509_get_subjectKeyID(WOLFSSL_X509* x509,
  17063. byte* dst, int* dstLen)
  17064. {
  17065. byte *id = NULL;
  17066. int copySz = 0;
  17067. WOLFSSL_ENTER("wolfSSL_X509_get_subjectKeyID");
  17068. if (x509 != NULL) {
  17069. if (x509->subjKeyIdSet) {
  17070. copySz = min(dstLen != NULL ? *dstLen : 0,
  17071. (int)x509->subjKeyIdSz);
  17072. id = x509->subjKeyId;
  17073. }
  17074. if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
  17075. XMEMCPY(dst, id, copySz);
  17076. id = dst;
  17077. *dstLen = copySz;
  17078. }
  17079. }
  17080. WOLFSSL_LEAVE("wolfSSL_X509_get_subjectKeyID", copySz);
  17081. return id;
  17082. }
  17083. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  17084. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  17085. defined(OPENSSL_EXTRA_X509_SMALL)
  17086. /* Looks up the index of the first entry encountered with matching NID
  17087. * The search starts from index 'pos'
  17088. * returns a negative value on failure and positive index value on success*/
  17089. int wolfSSL_X509_NAME_get_index_by_NID(WOLFSSL_X509_NAME* name,
  17090. int nid, int pos)
  17091. {
  17092. int value = nid, i;
  17093. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_index_by_NID");
  17094. if (name == NULL) {
  17095. return BAD_FUNC_ARG;
  17096. }
  17097. i = pos + 1; /* start search after index passed in */
  17098. if (i < 0) {
  17099. i = 0;
  17100. }
  17101. for (;i < name->entrySz && i < MAX_NAME_ENTRIES; i++) {
  17102. if (name->entry[i].nid == value) {
  17103. return i;
  17104. }
  17105. }
  17106. return WOLFSSL_FATAL_ERROR;
  17107. }
  17108. WOLFSSL_ASN1_STRING* wolfSSL_X509_NAME_ENTRY_get_data(
  17109. WOLFSSL_X509_NAME_ENTRY* in)
  17110. {
  17111. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_data");
  17112. if (in == NULL)
  17113. return NULL;
  17114. return in->value;
  17115. }
  17116. /* Creates a new WOLFSSL_ASN1_STRING structure.
  17117. *
  17118. * returns a pointer to the new structure created on success or NULL if fail
  17119. */
  17120. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_new(void)
  17121. {
  17122. WOLFSSL_ASN1_STRING* asn1;
  17123. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_new");
  17124. asn1 = (WOLFSSL_ASN1_STRING*)XMALLOC(sizeof(WOLFSSL_ASN1_STRING), NULL,
  17125. DYNAMIC_TYPE_OPENSSL);
  17126. if (asn1 != NULL) {
  17127. XMEMSET(asn1, 0, sizeof(WOLFSSL_ASN1_STRING));
  17128. }
  17129. return asn1; /* no check for null because error case is returning null*/
  17130. }
  17131. /**
  17132. * Used to duplicate a passed in WOLFSSL_ASN1_STRING*
  17133. * @param asn1 WOLFSSL_ASN1_STRING* to be duplicated
  17134. * @return WOLFSSL_ASN1_STRING* the duplicate struct or NULL on error
  17135. */
  17136. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_dup(WOLFSSL_ASN1_STRING* asn1)
  17137. {
  17138. WOLFSSL_ASN1_STRING* dup = NULL;
  17139. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_dup");
  17140. if (!asn1) {
  17141. WOLFSSL_MSG("Bad parameter");
  17142. return NULL;
  17143. }
  17144. dup = wolfSSL_ASN1_STRING_new();
  17145. if (!dup) {
  17146. WOLFSSL_MSG("wolfSSL_ASN1_STRING_new error");
  17147. return NULL;
  17148. }
  17149. dup->type = asn1->type;
  17150. dup->flags = asn1->flags;
  17151. if (wolfSSL_ASN1_STRING_set(dup, asn1->data, asn1->length)
  17152. != WOLFSSL_SUCCESS) {
  17153. WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
  17154. wolfSSL_ASN1_STRING_free(dup);
  17155. return NULL;
  17156. }
  17157. return dup;
  17158. }
  17159. /* used to free a WOLFSSL_ASN1_STRING structure */
  17160. void wolfSSL_ASN1_STRING_free(WOLFSSL_ASN1_STRING* asn1)
  17161. {
  17162. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_free");
  17163. if (asn1 != NULL) {
  17164. if (asn1->length > 0 && asn1->data != NULL && asn1->isDynamic) {
  17165. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  17166. }
  17167. XFREE(asn1, NULL, DYNAMIC_TYPE_OPENSSL);
  17168. }
  17169. }
  17170. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  17171. #if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || \
  17172. defined(OPENSSL_EXTRA_X509_SMALL))
  17173. /* Creates a new WOLFSSL_ASN1_STRING structure given the input type.
  17174. *
  17175. * type is the type of set when WOLFSSL_ASN1_STRING is created
  17176. *
  17177. * returns a pointer to the new structure created on success or NULL if fail
  17178. */
  17179. WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_type_new(int type)
  17180. {
  17181. WOLFSSL_ASN1_STRING* asn1;
  17182. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type_new");
  17183. asn1 = wolfSSL_ASN1_STRING_new();
  17184. if (asn1 == NULL) {
  17185. return NULL;
  17186. }
  17187. asn1->type = type;
  17188. return asn1;
  17189. }
  17190. /******************************************************************************
  17191. * wolfSSL_ASN1_STRING_type - returns the type of <asn1>
  17192. *
  17193. * RETURNS:
  17194. * returns the type set for <asn1>. Otherwise, returns WOLFSSL_FAILURE.
  17195. */
  17196. int wolfSSL_ASN1_STRING_type(const WOLFSSL_ASN1_STRING* asn1)
  17197. {
  17198. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_type");
  17199. if (asn1 == NULL) {
  17200. return WOLFSSL_FAILURE;
  17201. }
  17202. return asn1->type;
  17203. }
  17204. #endif /* !NO_CERTS && OPENSSL_EXTRA */
  17205. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  17206. defined(OPENSSL_EXTRA_X509_SMALL)
  17207. /* if dataSz is negative then use XSTRLEN to find length of data
  17208. * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
  17209. /* `data` can be NULL and only buffer will be allocated */
  17210. int wolfSSL_ASN1_STRING_set(WOLFSSL_ASN1_STRING* asn1, const void* data,
  17211. int dataSz)
  17212. {
  17213. int sz;
  17214. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_set");
  17215. if (asn1 == NULL || (data == NULL && dataSz < 0)) {
  17216. return WOLFSSL_FAILURE;
  17217. }
  17218. if (dataSz < 0) {
  17219. sz = (int)XSTRLEN((const char*)data);
  17220. }
  17221. else {
  17222. sz = dataSz;
  17223. }
  17224. if (sz < 0) {
  17225. return WOLFSSL_FAILURE;
  17226. }
  17227. /* free any existing data before copying */
  17228. if (asn1->data != NULL && asn1->isDynamic) {
  17229. XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
  17230. asn1->data = NULL;
  17231. }
  17232. if (sz + 1 > CTC_NAME_SIZE) { /* account for null char */
  17233. /* create new data buffer and copy over */
  17234. asn1->data = (char*)XMALLOC(sz + 1, NULL, DYNAMIC_TYPE_OPENSSL);
  17235. if (asn1->data == NULL) {
  17236. return WOLFSSL_FAILURE;
  17237. }
  17238. asn1->isDynamic = 1;
  17239. }
  17240. else {
  17241. XMEMSET(asn1->strData, 0, CTC_NAME_SIZE);
  17242. asn1->data = asn1->strData;
  17243. asn1->isDynamic = 0;
  17244. }
  17245. if (data != NULL) {
  17246. XMEMCPY(asn1->data, data, sz);
  17247. asn1->data[sz] = '\0';
  17248. }
  17249. asn1->length = sz;
  17250. return WOLFSSL_SUCCESS;
  17251. }
  17252. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  17253. #ifndef NO_CERTS
  17254. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  17255. unsigned char* wolfSSL_ASN1_STRING_data(WOLFSSL_ASN1_STRING* asn)
  17256. {
  17257. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_data");
  17258. if (asn) {
  17259. return (unsigned char*)asn->data;
  17260. }
  17261. else {
  17262. return NULL;
  17263. }
  17264. }
  17265. int wolfSSL_ASN1_STRING_length(WOLFSSL_ASN1_STRING* asn)
  17266. {
  17267. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_length");
  17268. if (asn) {
  17269. return asn->length;
  17270. }
  17271. else {
  17272. return 0;
  17273. }
  17274. }
  17275. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  17276. #ifdef OPENSSL_EXTRA
  17277. #ifndef NO_WOLFSSL_STUB
  17278. WOLFSSL_ASN1_STRING* wolfSSL_d2i_DISPLAYTEXT(WOLFSSL_ASN1_STRING **asn,
  17279. const unsigned char **in, long len)
  17280. {
  17281. WOLFSSL_STUB("d2i_DISPLAYTEXT");
  17282. (void)asn;
  17283. (void)in;
  17284. (void)len;
  17285. return NULL;
  17286. }
  17287. #endif
  17288. #ifdef XSNPRINTF /* a snprintf function needs to be available */
  17289. /* Writes the human readable form of x509 to bio.
  17290. *
  17291. * bio WOLFSSL_BIO to write to.
  17292. * x509 Certificate to write.
  17293. *
  17294. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  17295. */
  17296. int wolfSSL_X509_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509* x509,
  17297. unsigned long nmflags, unsigned long cflag)
  17298. {
  17299. WOLFSSL_ENTER("wolfSSL_X509_print_ex");
  17300. #ifndef NO_WOLFSSL_STUB
  17301. /* flags currently not supported */
  17302. (void)nmflags;
  17303. (void)cflag;
  17304. #endif
  17305. if (bio == NULL || x509 == NULL) {
  17306. return WOLFSSL_FAILURE;
  17307. }
  17308. if (wolfSSL_BIO_write(bio, "Certificate:\n",
  17309. (int)XSTRLEN("Certificate:\n")) <= 0) {
  17310. return WOLFSSL_FAILURE;
  17311. }
  17312. if (wolfSSL_BIO_write(bio, " Data:\n",
  17313. (int)XSTRLEN(" Data:\n")) <= 0) {
  17314. return WOLFSSL_FAILURE;
  17315. }
  17316. /* print version of cert */
  17317. {
  17318. int version;
  17319. char tmp[20];
  17320. if ((version = wolfSSL_X509_version(x509)) < 0) {
  17321. WOLFSSL_MSG("Error getting X509 version");
  17322. return WOLFSSL_FAILURE;
  17323. }
  17324. if (wolfSSL_BIO_write(bio, " Version:",
  17325. (int)XSTRLEN(" Version:")) <= 0) {
  17326. return WOLFSSL_FAILURE;
  17327. }
  17328. XSNPRINTF(tmp, sizeof(tmp), " %d (0x%x)\n", version, (byte)version-1);
  17329. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17330. return WOLFSSL_FAILURE;
  17331. }
  17332. }
  17333. /* print serial number out */
  17334. {
  17335. unsigned char serial[32];
  17336. int sz = sizeof(serial);
  17337. XMEMSET(serial, 0, sz);
  17338. if (wolfSSL_X509_get_serial_number(x509, serial, &sz)
  17339. != WOLFSSL_SUCCESS) {
  17340. WOLFSSL_MSG("Error getting x509 serial number");
  17341. return WOLFSSL_FAILURE;
  17342. }
  17343. if (wolfSSL_BIO_write(bio, " Serial Number:",
  17344. (int)XSTRLEN(" Serial Number:")) <= 0) {
  17345. return WOLFSSL_FAILURE;
  17346. }
  17347. /* if serial can fit into byte than print on the same line */
  17348. if (sz <= (int)sizeof(byte)) {
  17349. char tmp[17];
  17350. XSNPRINTF(tmp, sizeof(tmp), " %d (0x%x)\n", serial[0],serial[0]);
  17351. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17352. return WOLFSSL_FAILURE;
  17353. }
  17354. }
  17355. else {
  17356. int i;
  17357. char tmp[100];
  17358. int tmpSz = 100;
  17359. char val[5];
  17360. int valSz = 5;
  17361. /* serial is larger than int size so print off hex values */
  17362. if (wolfSSL_BIO_write(bio, "\n ",
  17363. (int)XSTRLEN("\n ")) <= 0) {
  17364. return WOLFSSL_FAILURE;
  17365. }
  17366. tmp[0] = '\0';
  17367. for (i = 0; i < sz - 1 && (3 * i) < tmpSz - valSz; i++) {
  17368. XSNPRINTF(val, sizeof(val) - 1, "%02x:", serial[i]);
  17369. val[3] = '\0'; /* make sure is null terminated */
  17370. XSTRNCAT(tmp, val, valSz);
  17371. }
  17372. XSNPRINTF(val, sizeof(val) - 1, "%02x\n", serial[i]);
  17373. val[3] = '\0'; /* make sure is null terminated */
  17374. XSTRNCAT(tmp, val, valSz);
  17375. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17376. return WOLFSSL_FAILURE;
  17377. }
  17378. }
  17379. }
  17380. /* print signature algo */
  17381. {
  17382. int oid;
  17383. const char* sig;
  17384. if ((oid = wolfSSL_X509_get_signature_type(x509)) <= 0) {
  17385. WOLFSSL_MSG("Error getting x509 signature type");
  17386. return WOLFSSL_FAILURE;
  17387. }
  17388. if (wolfSSL_BIO_write(bio, " Signature Algorithm: ",
  17389. (int)XSTRLEN(" Signature Algorithm: ")) <= 0) {
  17390. return WOLFSSL_FAILURE;
  17391. }
  17392. sig = GetSigName(oid);
  17393. if (wolfSSL_BIO_write(bio, sig, (int)XSTRLEN(sig)) <= 0) {
  17394. return WOLFSSL_FAILURE;
  17395. }
  17396. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  17397. return WOLFSSL_FAILURE;
  17398. }
  17399. }
  17400. /* print issuer */
  17401. {
  17402. char* issuer;
  17403. #ifdef WOLFSSL_SMALL_STACK
  17404. char* buff = NULL;
  17405. int issSz = 0;
  17406. #else
  17407. char buff[256];
  17408. int issSz = 256;
  17409. #endif
  17410. #if defined(WOLFSSL_QT)
  17411. issuer = wolfSSL_X509_get_name_oneline(
  17412. wolfSSL_X509_get_issuer_name(x509), buff, issSz);
  17413. #else
  17414. issuer = wolfSSL_X509_NAME_oneline(
  17415. wolfSSL_X509_get_issuer_name(x509), buff, issSz);
  17416. #endif
  17417. if (wolfSSL_BIO_write(bio, " Issuer: ",
  17418. (int)XSTRLEN(" Issuer: ")) <= 0) {
  17419. #ifdef WOLFSSL_SMALL_STACK
  17420. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  17421. #endif
  17422. return WOLFSSL_FAILURE;
  17423. }
  17424. if (issuer != NULL) {
  17425. if (wolfSSL_BIO_write(bio, issuer, (int)XSTRLEN(issuer)) <= 0) {
  17426. #ifdef WOLFSSL_SMALL_STACK
  17427. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  17428. #endif
  17429. return WOLFSSL_FAILURE;
  17430. }
  17431. }
  17432. #ifdef WOLFSSL_SMALL_STACK
  17433. XFREE(issuer, NULL, DYNAMIC_TYPE_OPENSSL);
  17434. #endif
  17435. if (wolfSSL_BIO_write(bio, "\n", (int)XSTRLEN("\n")) <= 0) {
  17436. return WOLFSSL_FAILURE;
  17437. }
  17438. }
  17439. #ifndef NO_ASN_TIME
  17440. /* print validity */
  17441. {
  17442. char tmp[80];
  17443. if (wolfSSL_BIO_write(bio, " Validity\n",
  17444. (int)XSTRLEN(" Validity\n")) <= 0) {
  17445. return WOLFSSL_FAILURE;
  17446. }
  17447. if (wolfSSL_BIO_write(bio, " Not Before: ",
  17448. (int)XSTRLEN(" Not Before: ")) <= 0) {
  17449. return WOLFSSL_FAILURE;
  17450. }
  17451. if (x509->notBefore.length > 0) {
  17452. if (GetTimeString(x509->notBefore.data, ASN_UTC_TIME,
  17453. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  17454. if (GetTimeString(x509->notBefore.data, ASN_GENERALIZED_TIME,
  17455. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  17456. WOLFSSL_MSG("Error getting not before date");
  17457. return WOLFSSL_FAILURE;
  17458. }
  17459. }
  17460. }
  17461. else {
  17462. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  17463. }
  17464. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  17465. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17466. return WOLFSSL_FAILURE;
  17467. }
  17468. if (wolfSSL_BIO_write(bio, "\n Not After : ",
  17469. (int)XSTRLEN("\n Not After : ")) <= 0) {
  17470. return WOLFSSL_FAILURE;
  17471. }
  17472. if (x509->notAfter.length > 0) {
  17473. if (GetTimeString(x509->notAfter.data, ASN_UTC_TIME,
  17474. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  17475. if (GetTimeString(x509->notAfter.data, ASN_GENERALIZED_TIME,
  17476. tmp, sizeof(tmp)) != WOLFSSL_SUCCESS) {
  17477. WOLFSSL_MSG("Error getting not after date");
  17478. return WOLFSSL_FAILURE;
  17479. }
  17480. }
  17481. }
  17482. else {
  17483. XSTRNCPY(tmp, "Not Set", sizeof(tmp)-1);
  17484. }
  17485. tmp[sizeof(tmp) - 1] = '\0'; /* make sure null terminated */
  17486. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17487. return WOLFSSL_FAILURE;
  17488. }
  17489. }
  17490. #endif
  17491. /* print subject */
  17492. {
  17493. char* subject;
  17494. #ifdef WOLFSSL_SMALL_STACK
  17495. char* buff = NULL;
  17496. int subSz = 0;
  17497. #else
  17498. char buff[256];
  17499. int subSz = 256;
  17500. #endif
  17501. #if defined(WOLFSSL_QT)
  17502. subject = wolfSSL_X509_get_name_oneline(
  17503. wolfSSL_X509_get_subject_name(x509), buff, subSz);
  17504. #else
  17505. subject = wolfSSL_X509_NAME_oneline(
  17506. wolfSSL_X509_get_subject_name(x509), buff, subSz);
  17507. #endif
  17508. if (wolfSSL_BIO_write(bio, "\n Subject: ",
  17509. (int)XSTRLEN("\n Subject: ")) <= 0) {
  17510. #ifdef WOLFSSL_SMALL_STACK
  17511. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  17512. #endif
  17513. return WOLFSSL_FAILURE;
  17514. }
  17515. if (subject != NULL) {
  17516. if (wolfSSL_BIO_write(bio, subject, (int)XSTRLEN(subject)) <= 0) {
  17517. #ifdef WOLFSSL_SMALL_STACK
  17518. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  17519. #endif
  17520. return WOLFSSL_FAILURE;
  17521. }
  17522. }
  17523. #ifdef WOLFSSL_SMALL_STACK
  17524. XFREE(subject, NULL, DYNAMIC_TYPE_OPENSSL);
  17525. #endif
  17526. }
  17527. /* get and print public key */
  17528. if (wolfSSL_BIO_write(bio, "\n Subject Public Key Info:\n",
  17529. (int)XSTRLEN("\n Subject Public Key Info:\n")) <= 0) {
  17530. return WOLFSSL_FAILURE;
  17531. }
  17532. {
  17533. #if (!defined(NO_RSA) && !defined(HAVE_USER_RSA)) || defined(HAVE_ECC)
  17534. char tmp[100];
  17535. #endif
  17536. switch (x509->pubKeyOID) {
  17537. #ifndef NO_RSA
  17538. case RSAk:
  17539. if (wolfSSL_BIO_write(bio,
  17540. " Public Key Algorithm: rsaEncryption\n",
  17541. (int)XSTRLEN(" Public Key Algorithm: rsaEncryption\n")) <= 0) {
  17542. return WOLFSSL_FAILURE;
  17543. }
  17544. #ifdef HAVE_USER_RSA
  17545. if (wolfSSL_BIO_write(bio,
  17546. " Build without user RSA to print key\n",
  17547. (int)XSTRLEN(" Build without user RSA to print key\n"))
  17548. <= 0) {
  17549. return WOLFSSL_FAILURE;
  17550. }
  17551. #else
  17552. {
  17553. RsaKey rsa;
  17554. word32 idx = 0;
  17555. int sz;
  17556. byte lbit = 0;
  17557. int rawLen;
  17558. unsigned char* rawKey;
  17559. if (wc_InitRsaKey(&rsa, NULL) != 0) {
  17560. WOLFSSL_MSG("wc_InitRsaKey failure");
  17561. return WOLFSSL_FAILURE;
  17562. }
  17563. if (wc_RsaPublicKeyDecode(x509->pubKey.buffer,
  17564. &idx, &rsa, x509->pubKey.length) != 0) {
  17565. WOLFSSL_MSG("Error decoding RSA key");
  17566. wc_FreeRsaKey(&rsa);
  17567. return WOLFSSL_FAILURE;
  17568. }
  17569. if ((sz = wc_RsaEncryptSize(&rsa)) < 0) {
  17570. WOLFSSL_MSG("Error getting RSA key size");
  17571. wc_FreeRsaKey(&rsa);
  17572. return WOLFSSL_FAILURE;
  17573. }
  17574. XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
  17575. " ", "Public-Key", 8 * sz,
  17576. " Modulus:");
  17577. tmp[sizeof(tmp) - 1] = '\0';
  17578. if (wolfSSL_BIO_write(bio, tmp,
  17579. (int)XSTRLEN(tmp)) <= 0) {
  17580. wc_FreeRsaKey(&rsa);
  17581. return WOLFSSL_FAILURE;
  17582. }
  17583. /* print out modulus */
  17584. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  17585. tmp[sizeof(tmp) - 1] = '\0';
  17586. if (mp_leading_bit(&rsa.n)) {
  17587. lbit = 1;
  17588. XSTRNCAT(tmp, "00", 3);
  17589. }
  17590. rawLen = mp_unsigned_bin_size(&rsa.n);
  17591. rawKey = (unsigned char*)XMALLOC(rawLen, NULL,
  17592. DYNAMIC_TYPE_TMP_BUFFER);
  17593. if (rawKey == NULL) {
  17594. WOLFSSL_MSG("Memory error");
  17595. wc_FreeRsaKey(&rsa);
  17596. return WOLFSSL_FAILURE;
  17597. }
  17598. mp_to_unsigned_bin(&rsa.n, rawKey);
  17599. for (idx = 0; idx < (word32)rawLen; idx++) {
  17600. char val[5];
  17601. int valSz = 5;
  17602. if ((idx == 0) && !lbit) {
  17603. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  17604. }
  17605. else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
  17606. tmp[sizeof(tmp) - 1] = '\0';
  17607. if (wolfSSL_BIO_write(bio, tmp,
  17608. (int)XSTRLEN(tmp)) <= 0) {
  17609. XFREE(rawKey, NULL,
  17610. DYNAMIC_TYPE_TMP_BUFFER);
  17611. wc_FreeRsaKey(&rsa);
  17612. return WOLFSSL_FAILURE;
  17613. }
  17614. XSNPRINTF(tmp, sizeof(tmp) - 1,
  17615. ":\n ");
  17616. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  17617. }
  17618. else {
  17619. XSNPRINTF(val, valSz - 1, ":%02x", rawKey[idx]);
  17620. }
  17621. XSTRNCAT(tmp, val, valSz);
  17622. }
  17623. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17624. /* print out remaining modulus values */
  17625. if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
  17626. tmp[sizeof(tmp) - 1] = '\0';
  17627. if (wolfSSL_BIO_write(bio, tmp,
  17628. (int)XSTRLEN(tmp)) <= 0) {
  17629. return WOLFSSL_FAILURE;
  17630. }
  17631. }
  17632. /* print out exponent values */
  17633. rawLen = mp_unsigned_bin_size(&rsa.e);
  17634. if (rawLen < 0) {
  17635. WOLFSSL_MSG("Error getting exponent size");
  17636. wc_FreeRsaKey(&rsa);
  17637. return WOLFSSL_FAILURE;
  17638. }
  17639. if ((word32)rawLen < sizeof(word32)) {
  17640. rawLen = sizeof(word32);
  17641. }
  17642. rawKey = (unsigned char*)XMALLOC(rawLen, NULL,
  17643. DYNAMIC_TYPE_TMP_BUFFER);
  17644. if (rawKey == NULL) {
  17645. WOLFSSL_MSG("Memory error");
  17646. wc_FreeRsaKey(&rsa);
  17647. return WOLFSSL_FAILURE;
  17648. }
  17649. XMEMSET(rawKey, 0, rawLen);
  17650. mp_to_unsigned_bin(&rsa.e, rawKey);
  17651. if ((word32)rawLen <= sizeof(word32)) {
  17652. idx = *(word32*)rawKey;
  17653. #ifdef BIG_ENDIAN_ORDER
  17654. idx = ByteReverseWord32(idx);
  17655. #endif
  17656. }
  17657. XSNPRINTF(tmp, sizeof(tmp) - 1,
  17658. "\n Exponent: %d (0x%x)\n",idx, idx);
  17659. if (wolfSSL_BIO_write(bio, tmp,
  17660. (int)XSTRLEN(tmp)) <= 0) {
  17661. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17662. wc_FreeRsaKey(&rsa);
  17663. return WOLFSSL_FAILURE;
  17664. }
  17665. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17666. wc_FreeRsaKey(&rsa);
  17667. }
  17668. #endif /* HAVE_USER_RSA */
  17669. break;
  17670. #endif /* NO_RSA */
  17671. #ifdef HAVE_ECC
  17672. case ECDSAk:
  17673. {
  17674. word32 i;
  17675. ecc_key ecc;
  17676. if (wolfSSL_BIO_write(bio,
  17677. " Public Key Algorithm: EC\n",
  17678. (int)XSTRLEN(" Public Key Algorithm: EC\n")) <= 0) {
  17679. return WOLFSSL_FAILURE;
  17680. }
  17681. if (wc_ecc_init_ex(&ecc, x509->heap, INVALID_DEVID)
  17682. != 0) {
  17683. return WOLFSSL_FAILURE;
  17684. }
  17685. i = 0;
  17686. if (wc_EccPublicKeyDecode(x509->pubKey.buffer, &i,
  17687. &ecc, x509->pubKey.length) != 0) {
  17688. wc_ecc_free(&ecc);
  17689. return WOLFSSL_FAILURE;
  17690. }
  17691. XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
  17692. " ", "Public-Key",
  17693. 8 * wc_ecc_size(&ecc),
  17694. " pub:");
  17695. tmp[sizeof(tmp) - 1] = '\0';
  17696. if (wolfSSL_BIO_write(bio, tmp,
  17697. (int)XSTRLEN(tmp)) <= 0) {
  17698. wc_ecc_free(&ecc);
  17699. return WOLFSSL_FAILURE;
  17700. }
  17701. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  17702. {
  17703. word32 derSz;
  17704. byte* der;
  17705. derSz = wc_ecc_size(&ecc) * WOLFSSL_BIT_SIZE;
  17706. der = (byte*)XMALLOC(derSz, x509->heap,
  17707. DYNAMIC_TYPE_TMP_BUFFER);
  17708. if (der == NULL) {
  17709. wc_ecc_free(&ecc);
  17710. return WOLFSSL_FAILURE;
  17711. }
  17712. if (wc_ecc_export_x963(&ecc, der, &derSz) != 0) {
  17713. wc_ecc_free(&ecc);
  17714. XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  17715. return WOLFSSL_FAILURE;
  17716. }
  17717. for (i = 0; i < derSz; i++) {
  17718. char val[5];
  17719. int valSz = 5;
  17720. if (i == 0) {
  17721. XSNPRINTF(val, valSz - 1, "%02x", der[i]);
  17722. }
  17723. else if ((i % 15) == 0) {
  17724. tmp[sizeof(tmp) - 1] = '\0';
  17725. if (wolfSSL_BIO_write(bio, tmp,
  17726. (int)XSTRLEN(tmp)) <= 0) {
  17727. wc_ecc_free(&ecc);
  17728. XFREE(der, x509->heap,
  17729. DYNAMIC_TYPE_TMP_BUFFER);
  17730. return WOLFSSL_FAILURE;
  17731. }
  17732. XSNPRINTF(tmp, sizeof(tmp) - 1,
  17733. ":\n ");
  17734. XSNPRINTF(val, valSz - 1, "%02x", der[i]);
  17735. }
  17736. else {
  17737. XSNPRINTF(val, valSz - 1, ":%02x", der[i]);
  17738. }
  17739. XSTRNCAT(tmp, val, valSz);
  17740. }
  17741. /* print out remaining modulus values */
  17742. if ((i > 0) && (((i - 1) % 15) != 0)) {
  17743. tmp[sizeof(tmp) - 1] = '\0';
  17744. if (wolfSSL_BIO_write(bio, tmp,
  17745. (int)XSTRLEN(tmp)) <= 0) {
  17746. wc_ecc_free(&ecc);
  17747. XFREE(der, x509->heap,
  17748. DYNAMIC_TYPE_TMP_BUFFER);
  17749. return WOLFSSL_FAILURE;
  17750. }
  17751. }
  17752. XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
  17753. }
  17754. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s%s: %s\n",
  17755. " ", "ASN1 OID",
  17756. ecc.dp->name);
  17757. if (wolfSSL_BIO_write(bio, tmp,
  17758. (int)XSTRLEN(tmp)) <= 0) {
  17759. wc_ecc_free(&ecc);
  17760. return WOLFSSL_FAILURE;
  17761. }
  17762. wc_ecc_free(&ecc);
  17763. }
  17764. break;
  17765. #endif /* HAVE_ECC */
  17766. default:
  17767. WOLFSSL_MSG("Unknown key type");
  17768. return WOLFSSL_FAILURE;
  17769. }
  17770. }
  17771. /* print out extensions */
  17772. if (wolfSSL_BIO_write(bio, " X509v3 extensions:\n",
  17773. (int)XSTRLEN(" X509v3 extensions:\n")) <= 0) {
  17774. return WOLFSSL_FAILURE;
  17775. }
  17776. /* print subject key id */
  17777. if (x509->subjKeyIdSet && x509->subjKeyId != NULL &&
  17778. x509->subjKeyIdSz > 0) {
  17779. char tmp[100];
  17780. word32 i;
  17781. char val[5];
  17782. int valSz = 5;
  17783. if (wolfSSL_BIO_write(bio,
  17784. " X509v3 Subject Key Identifier: \n",
  17785. (int)XSTRLEN(" X509v3 Subject Key Identifier: \n"))
  17786. <= 0) {
  17787. return WOLFSSL_FAILURE;
  17788. }
  17789. XSNPRINTF(tmp, sizeof(tmp) - 1, " ");
  17790. for (i = 0; i < sizeof(tmp) && i < (x509->subjKeyIdSz - 1); i++) {
  17791. XSNPRINTF(val, valSz - 1, "%02X:", x509->subjKeyId[i]);
  17792. XSTRNCAT(tmp, val, valSz);
  17793. }
  17794. XSNPRINTF(val, valSz - 1, "%02X\n", x509->subjKeyId[i]);
  17795. XSTRNCAT(tmp, val, valSz);
  17796. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17797. return WOLFSSL_FAILURE;
  17798. }
  17799. }
  17800. /* printf out authority key id */
  17801. if (x509->authKeyIdSet && x509->authKeyId != NULL &&
  17802. x509->authKeyIdSz > 0) {
  17803. char tmp[100];
  17804. word32 i;
  17805. char val[5];
  17806. int valSz = 5;
  17807. int len = 0;
  17808. if (wolfSSL_BIO_write(bio,
  17809. " X509v3 Authority Key Identifier: \n",
  17810. (int)XSTRLEN(" X509v3 Authority Key Identifier: \n"))
  17811. <= 0) {
  17812. return WOLFSSL_FAILURE;
  17813. }
  17814. XSNPRINTF(tmp, sizeof(tmp) - 1, " keyid");
  17815. for (i = 0; i < x509->authKeyIdSz; i++) {
  17816. /* check if buffer is almost full */
  17817. if (XSTRLEN(tmp) >= sizeof(tmp) - valSz) {
  17818. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17819. return WOLFSSL_FAILURE;
  17820. }
  17821. tmp[0] = '\0';
  17822. }
  17823. XSNPRINTF(val, valSz - 1, ":%02X", x509->authKeyId[i]);
  17824. XSTRNCAT(tmp, val, valSz);
  17825. }
  17826. len = (int)XSTRLEN("\n");
  17827. XSTRNCAT(tmp, "\n", len + 1);
  17828. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17829. return WOLFSSL_FAILURE;
  17830. }
  17831. }
  17832. /* print basic constraint */
  17833. if (x509->basicConstSet) {
  17834. char tmp[100];
  17835. if (wolfSSL_BIO_write(bio,
  17836. "\n X509v3 Basic Constraints: \n",
  17837. (int)XSTRLEN("\n X509v3 Basic Constraints: \n"))
  17838. <= 0) {
  17839. return WOLFSSL_FAILURE;
  17840. }
  17841. XSNPRINTF(tmp, sizeof(tmp),
  17842. " CA:%s\n",
  17843. (x509->isCa)? "TRUE": "FALSE");
  17844. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17845. return WOLFSSL_FAILURE;
  17846. }
  17847. }
  17848. /* print out signature */
  17849. if (x509->sig.length > 0) {
  17850. unsigned char* sig;
  17851. int sigSz;
  17852. int i;
  17853. char tmp[100];
  17854. int sigOid = wolfSSL_X509_get_signature_type(x509);
  17855. if (wolfSSL_BIO_write(bio,
  17856. " Signature Algorithm: ",
  17857. (int)XSTRLEN(" Signature Algorithm: ")) <= 0) {
  17858. return WOLFSSL_FAILURE;
  17859. }
  17860. XSNPRINTF(tmp, sizeof(tmp) - 1,"%s\n", GetSigName(sigOid));
  17861. tmp[sizeof(tmp) - 1] = '\0';
  17862. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  17863. return WOLFSSL_FAILURE;
  17864. }
  17865. sigSz = (int)x509->sig.length;
  17866. sig = (unsigned char*)XMALLOC(sigSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17867. if (sig == NULL) {
  17868. return WOLFSSL_FAILURE;
  17869. }
  17870. if (wolfSSL_X509_get_signature(x509, sig, &sigSz) <= 0) {
  17871. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17872. return WOLFSSL_FAILURE;
  17873. }
  17874. XSNPRINTF(tmp, sizeof(tmp) - 1," ");
  17875. tmp[sizeof(tmp) - 1] = '\0';
  17876. for (i = 0; i < sigSz; i++) {
  17877. char val[5];
  17878. int valSz = 5;
  17879. if (i == 0) {
  17880. XSNPRINTF(val, valSz - 1, "%02x", sig[i]);
  17881. }
  17882. else if (((i % 18) == 0)) {
  17883. tmp[sizeof(tmp) - 1] = '\0';
  17884. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
  17885. <= 0) {
  17886. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17887. return WOLFSSL_FAILURE;
  17888. }
  17889. XSNPRINTF(tmp, sizeof(tmp) - 1,
  17890. ":\n ");
  17891. XSNPRINTF(val, valSz - 1, "%02x", sig[i]);
  17892. }
  17893. else {
  17894. XSNPRINTF(val, valSz - 1, ":%02x", sig[i]);
  17895. }
  17896. XSTRNCAT(tmp, val, valSz);
  17897. }
  17898. XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  17899. /* print out remaining sig values */
  17900. if ((i > 0) && (((i - 1) % 18) != 0)) {
  17901. tmp[sizeof(tmp) - 1] = '\0';
  17902. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
  17903. <= 0) {
  17904. return WOLFSSL_FAILURE;
  17905. }
  17906. }
  17907. }
  17908. /* done with print out */
  17909. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  17910. return WOLFSSL_FAILURE;
  17911. }
  17912. return WOLFSSL_SUCCESS;
  17913. }
  17914. int wolfSSL_X509_print(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  17915. {
  17916. return wolfSSL_X509_print_ex(bio, x509, 0, 0);
  17917. }
  17918. #endif /* XSNPRINTF */
  17919. #endif /* OPENSSL_EXTRA */
  17920. #endif /* !NO_CERTS */
  17921. #ifdef OPENSSL_EXTRA
  17922. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17923. /* Creates cipher->description based on cipher->offset
  17924. * cipher->offset is set in wolfSSL_get_ciphers_compat when it is added
  17925. * to a stack of ciphers.
  17926. * @param [in] cipher: A cipher from a stack of ciphers.
  17927. * return WOLFSSL_SUCCESS if cipher->description is set, else WOLFSSL_FAILURE
  17928. */
  17929. int wolfSSL_sk_CIPHER_description(WOLFSSL_CIPHER* cipher)
  17930. {
  17931. int ret = WOLFSSL_FAILURE;
  17932. int i,j,k;
  17933. int strLen;
  17934. unsigned long offset;
  17935. char* dp;
  17936. const char* name;
  17937. const char *keaStr, *authStr, *encStr, *macStr, *protocol;
  17938. char n[MAX_SEGMENTS][MAX_SEGMENT_SZ] = {{0}};
  17939. unsigned char len = MAX_DESCRIPTION_SZ-1;
  17940. const CipherSuiteInfo* cipher_names;
  17941. ProtocolVersion pv;
  17942. WOLFSSL_ENTER("wolfSSL_sk_CIPHER_description");
  17943. if (cipher == NULL)
  17944. return WOLFSSL_FAILURE;
  17945. dp = cipher->description;
  17946. if (dp == NULL)
  17947. return WOLFSSL_FAILURE;
  17948. cipher_names = GetCipherNames();
  17949. offset = cipher->offset;
  17950. if (offset >= (unsigned long)GetCipherNamesSize())
  17951. return WOLFSSL_FAILURE;
  17952. pv.major = cipher_names[offset].major;
  17953. pv.minor = cipher_names[offset].minor;
  17954. protocol = wolfSSL_internal_get_version(&pv);
  17955. name = cipher_names[offset].name;
  17956. if (name == NULL)
  17957. return ret;
  17958. /* Segment cipher name into n[n0,n1,n2,n4]
  17959. * These are used later for comparisons to create:
  17960. * keaStr, authStr, encStr, macStr
  17961. *
  17962. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  17963. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  17964. * and n = [n0,n1,n2,n3,0]
  17965. */
  17966. strLen = (int)XSTRLEN(name);
  17967. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  17968. if (k > MAX_SEGMENTS || j > MAX_SEGMENT_SZ)
  17969. break;
  17970. if (name[i] != '-' && name[i] != '\0') {
  17971. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  17972. j++;
  17973. }
  17974. else {
  17975. n[k][j] = '\0';
  17976. j = 0;
  17977. k++;
  17978. }
  17979. }
  17980. /* keaStr */
  17981. keaStr = GetCipherKeaStr(n);
  17982. /* authStr */
  17983. authStr = GetCipherAuthStr(n);
  17984. /* encStr */
  17985. encStr = GetCipherEncStr(n);
  17986. if ((cipher->bits = SetCipherBits(encStr)) == WOLFSSL_FAILURE) {
  17987. WOLFSSL_MSG("Cipher Bits Not Set.");
  17988. }
  17989. /* macStr */
  17990. macStr = GetCipherMacStr(n);
  17991. /* Build up the string by copying onto the end. */
  17992. XSTRNCPY(dp, name, len);
  17993. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17994. len -= (int)strLen; dp += strLen;
  17995. XSTRNCPY(dp, " ", len);
  17996. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  17997. len -= (int)strLen; dp += strLen;
  17998. XSTRNCPY(dp, protocol, len);
  17999. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18000. len -= (int)strLen; dp += strLen;
  18001. XSTRNCPY(dp, " Kx=", len);
  18002. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18003. len -= (int)strLen; dp += strLen;
  18004. XSTRNCPY(dp, keaStr, len);
  18005. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18006. len -= (int)strLen; dp += strLen;
  18007. XSTRNCPY(dp, " Au=", len);
  18008. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18009. len -= (int)strLen; dp += strLen;
  18010. XSTRNCPY(dp, authStr, len);
  18011. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18012. len -= (int)strLen; dp += strLen;
  18013. XSTRNCPY(dp, " Enc=", len);
  18014. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18015. len -= (int)strLen; dp += strLen;
  18016. XSTRNCPY(dp, encStr, len);
  18017. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18018. len -= (int)strLen; dp += strLen;
  18019. XSTRNCPY(dp, " Mac=", len);
  18020. dp[len-1] = '\0'; strLen = (int)XSTRLEN(dp);
  18021. len -= (int)strLen; dp += strLen;
  18022. XSTRNCPY(dp, macStr, len);
  18023. dp[len-1] = '\0';
  18024. return WOLFSSL_SUCCESS;
  18025. }
  18026. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  18027. char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in,
  18028. int len)
  18029. {
  18030. char *ret = in;
  18031. const char *keaStr, *authStr, *encStr, *macStr;
  18032. size_t strLen;
  18033. WOLFSSL_ENTER("wolfSSL_CIPHER_description");
  18034. if (cipher == NULL || in == NULL)
  18035. return NULL;
  18036. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  18037. /* if cipher is in the stack from wolfSSL_get_ciphers_compat then
  18038. * Return the description based on cipher_names[cipher->offset]
  18039. */
  18040. if (cipher->in_stack == TRUE) {
  18041. wolfSSL_sk_CIPHER_description((WOLFSSL_CIPHER*)cipher);
  18042. XSTRNCPY(in,cipher->description,len);
  18043. return ret;
  18044. }
  18045. #endif
  18046. /* Get the cipher description based on the SSL session cipher */
  18047. switch (cipher->ssl->specs.kea) {
  18048. case no_kea:
  18049. keaStr = "None";
  18050. break;
  18051. #ifndef NO_RSA
  18052. case rsa_kea:
  18053. keaStr = "RSA";
  18054. break;
  18055. #endif
  18056. #ifndef NO_DH
  18057. case diffie_hellman_kea:
  18058. keaStr = "DHE";
  18059. break;
  18060. #endif
  18061. case fortezza_kea:
  18062. keaStr = "FZ";
  18063. break;
  18064. #ifndef NO_PSK
  18065. case psk_kea:
  18066. keaStr = "PSK";
  18067. break;
  18068. #ifndef NO_DH
  18069. case dhe_psk_kea:
  18070. keaStr = "DHEPSK";
  18071. break;
  18072. #endif
  18073. #ifdef HAVE_ECC
  18074. case ecdhe_psk_kea:
  18075. keaStr = "ECDHEPSK";
  18076. break;
  18077. #endif
  18078. #endif
  18079. #ifdef HAVE_NTRU
  18080. case ntru_kea:
  18081. keaStr = "NTRU";
  18082. break;
  18083. #endif
  18084. #ifdef HAVE_ECC
  18085. case ecc_diffie_hellman_kea:
  18086. keaStr = "ECDHE";
  18087. break;
  18088. case ecc_static_diffie_hellman_kea:
  18089. keaStr = "ECDH";
  18090. break;
  18091. #endif
  18092. default:
  18093. keaStr = "unknown";
  18094. break;
  18095. }
  18096. switch (cipher->ssl->specs.sig_algo) {
  18097. case anonymous_sa_algo:
  18098. authStr = "None";
  18099. break;
  18100. #ifndef NO_RSA
  18101. case rsa_sa_algo:
  18102. authStr = "RSA";
  18103. break;
  18104. #endif
  18105. #ifndef NO_DSA
  18106. case dsa_sa_algo:
  18107. authStr = "DSA";
  18108. break;
  18109. #endif
  18110. #ifdef HAVE_ECC
  18111. case ecc_dsa_sa_algo:
  18112. authStr = "ECDSA";
  18113. break;
  18114. #endif
  18115. default:
  18116. authStr = "unknown";
  18117. break;
  18118. }
  18119. switch (cipher->ssl->specs.bulk_cipher_algorithm) {
  18120. case wolfssl_cipher_null:
  18121. encStr = "None";
  18122. break;
  18123. #ifndef NO_RC4
  18124. case wolfssl_rc4:
  18125. encStr = "RC4(128)";
  18126. break;
  18127. #endif
  18128. #ifndef NO_DES3
  18129. case wolfssl_triple_des:
  18130. encStr = "3DES(168)";
  18131. break;
  18132. #endif
  18133. #ifdef HAVE_IDEA
  18134. case wolfssl_idea:
  18135. encStr = "IDEA(128)";
  18136. break;
  18137. #endif
  18138. #ifndef NO_AES
  18139. case wolfssl_aes:
  18140. if (cipher->ssl->specs.key_size == 128)
  18141. encStr = "AES(128)";
  18142. else if (cipher->ssl->specs.key_size == 256)
  18143. encStr = "AES(256)";
  18144. else
  18145. encStr = "AES(?)";
  18146. break;
  18147. #ifdef HAVE_AESGCM
  18148. case wolfssl_aes_gcm:
  18149. if (cipher->ssl->specs.key_size == 128)
  18150. encStr = "AESGCM(128)";
  18151. else if (cipher->ssl->specs.key_size == 256)
  18152. encStr = "AESGCM(256)";
  18153. else
  18154. encStr = "AESGCM(?)";
  18155. break;
  18156. #endif
  18157. #ifdef HAVE_AESCCM
  18158. case wolfssl_aes_ccm:
  18159. if (cipher->ssl->specs.key_size == 128)
  18160. encStr = "AESCCM(128)";
  18161. else if (cipher->ssl->specs.key_size == 256)
  18162. encStr = "AESCCM(256)";
  18163. else
  18164. encStr = "AESCCM(?)";
  18165. break;
  18166. #endif
  18167. #endif
  18168. #ifdef HAVE_CHACHA
  18169. case wolfssl_chacha:
  18170. encStr = "CHACHA20/POLY1305(256)";
  18171. break;
  18172. #endif
  18173. #ifdef HAVE_CAMELLIA
  18174. case wolfssl_camellia:
  18175. if (cipher->ssl->specs.key_size == 128)
  18176. encStr = "Camellia(128)";
  18177. else if (cipher->ssl->specs.key_size == 256)
  18178. encStr = "Camellia(256)";
  18179. else
  18180. encStr = "Camellia(?)";
  18181. break;
  18182. #endif
  18183. #if defined(HAVE_HC128) && !defined(NO_HC128)
  18184. case wolfssl_hc128:
  18185. encStr = "HC128(128)";
  18186. break;
  18187. #endif
  18188. #if defined(HAVE_RABBIT) && !defined(NO_RABBIT)
  18189. case wolfssl_rabbit:
  18190. encStr = "RABBIT(128)";
  18191. break;
  18192. #endif
  18193. default:
  18194. encStr = "unknown";
  18195. break;
  18196. }
  18197. switch (cipher->ssl->specs.mac_algorithm) {
  18198. case no_mac:
  18199. macStr = "None";
  18200. break;
  18201. #ifndef NO_MD5
  18202. case md5_mac:
  18203. macStr = "MD5";
  18204. break;
  18205. #endif
  18206. #ifndef NO_SHA
  18207. case sha_mac:
  18208. macStr = "SHA1";
  18209. break;
  18210. #endif
  18211. #ifdef HAVE_SHA224
  18212. case sha224_mac:
  18213. macStr = "SHA224";
  18214. break;
  18215. #endif
  18216. #ifndef NO_SHA256
  18217. case sha256_mac:
  18218. macStr = "SHA256";
  18219. break;
  18220. #endif
  18221. #ifdef HAVE_SHA384
  18222. case sha384_mac:
  18223. macStr = "SHA384";
  18224. break;
  18225. #endif
  18226. #ifdef HAVE_SHA512
  18227. case sha512_mac:
  18228. macStr = "SHA512";
  18229. break;
  18230. #endif
  18231. default:
  18232. macStr = "unknown";
  18233. break;
  18234. }
  18235. /* Build up the string by copying onto the end. */
  18236. XSTRNCPY(in, wolfSSL_CIPHER_get_name(cipher), len);
  18237. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18238. XSTRNCPY(in, " ", len);
  18239. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18240. XSTRNCPY(in, wolfSSL_get_version(cipher->ssl), len);
  18241. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18242. XSTRNCPY(in, " Kx=", len);
  18243. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18244. XSTRNCPY(in, keaStr, len);
  18245. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18246. XSTRNCPY(in, " Au=", len);
  18247. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18248. XSTRNCPY(in, authStr, len);
  18249. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18250. XSTRNCPY(in, " Enc=", len);
  18251. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18252. XSTRNCPY(in, encStr, len);
  18253. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18254. XSTRNCPY(in, " Mac=", len);
  18255. in[len-1] = '\0'; strLen = XSTRLEN(in); len -= (int)strLen; in += strLen;
  18256. XSTRNCPY(in, macStr, len);
  18257. in[len-1] = '\0';
  18258. return ret;
  18259. }
  18260. #ifndef NO_SESSION_CACHE
  18261. WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl)
  18262. {
  18263. if (ssl == NULL) {
  18264. return NULL;
  18265. }
  18266. /* sessions are stored statically, no need for reference count */
  18267. return wolfSSL_get_session(ssl);
  18268. }
  18269. #endif /* NO_SESSION_CACHE */
  18270. /* was do nothing */
  18271. /*
  18272. void OPENSSL_free(void* buf)
  18273. {
  18274. (void)buf;
  18275. }
  18276. */
  18277. #ifndef NO_WOLFSSL_STUB
  18278. int wolfSSL_OCSP_parse_url(char* url, char** host, char** port, char** path,
  18279. int* ssl)
  18280. {
  18281. (void)url;
  18282. (void)host;
  18283. (void)port;
  18284. (void)path;
  18285. (void)ssl;
  18286. WOLFSSL_STUB("OCSP_parse_url");
  18287. return 0;
  18288. }
  18289. #endif
  18290. #ifndef NO_MD4
  18291. void wolfSSL_MD4_Init(WOLFSSL_MD4_CTX* md4)
  18292. {
  18293. /* make sure we have a big enough buffer */
  18294. typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1];
  18295. (void) sizeof(ok);
  18296. WOLFSSL_ENTER("MD4_Init");
  18297. wc_InitMd4((Md4*)md4);
  18298. }
  18299. void wolfSSL_MD4_Update(WOLFSSL_MD4_CTX* md4, const void* data,
  18300. unsigned long len)
  18301. {
  18302. WOLFSSL_ENTER("MD4_Update");
  18303. wc_Md4Update((Md4*)md4, (const byte*)data, (word32)len);
  18304. }
  18305. void wolfSSL_MD4_Final(unsigned char* digest, WOLFSSL_MD4_CTX* md4)
  18306. {
  18307. WOLFSSL_ENTER("MD4_Final");
  18308. wc_Md4Final((Md4*)md4, digest);
  18309. }
  18310. #endif /* NO_MD4 */
  18311. /* Removes a WOLFSSL_BIO struct from the WOLFSSL_BIO linked list.
  18312. *
  18313. * bio is the WOLFSSL_BIO struct in the list and removed.
  18314. *
  18315. * The return WOLFSSL_BIO struct is the next WOLFSSL_BIO in the list or NULL if
  18316. * there is none.
  18317. */
  18318. WOLFSSL_BIO* wolfSSL_BIO_pop(WOLFSSL_BIO* bio)
  18319. {
  18320. if (bio == NULL) {
  18321. WOLFSSL_MSG("Bad argument passed in");
  18322. return NULL;
  18323. }
  18324. if (bio->prev != NULL) {
  18325. bio->prev->next = bio->next;
  18326. }
  18327. if (bio->next != NULL) {
  18328. bio->next->prev = bio->prev;
  18329. }
  18330. return bio->next;
  18331. }
  18332. WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_mem(void)
  18333. {
  18334. static WOLFSSL_BIO_METHOD meth;
  18335. WOLFSSL_ENTER("wolfSSL_BIO_s_mem");
  18336. meth.type = WOLFSSL_BIO_MEMORY;
  18337. return &meth;
  18338. }
  18339. WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_base64(void)
  18340. {
  18341. static WOLFSSL_BIO_METHOD meth;
  18342. WOLFSSL_ENTER("wolfSSL_BIO_f_base64");
  18343. meth.type = WOLFSSL_BIO_BASE64;
  18344. return &meth;
  18345. }
  18346. /* Set the flag for the bio.
  18347. *
  18348. * bio the structure to set the flag in
  18349. * flags the flag to use
  18350. */
  18351. void wolfSSL_BIO_set_flags(WOLFSSL_BIO* bio, int flags)
  18352. {
  18353. WOLFSSL_ENTER("wolfSSL_BIO_set_flags");
  18354. if (bio != NULL) {
  18355. bio->flags |= flags;
  18356. }
  18357. }
  18358. void wolfSSL_BIO_clear_flags(WOLFSSL_BIO *bio, int flags)
  18359. {
  18360. WOLFSSL_ENTER("wolfSSL_BIO_clear_flags");
  18361. if (bio != NULL) {
  18362. bio->flags &= ~flags;
  18363. }
  18364. }
  18365. /* Set ex_data for WOLFSSL_BIO
  18366. *
  18367. * bio : BIO structure to set ex_data in
  18368. * idx : Index of ex_data to set
  18369. * data : Data to set in ex_data
  18370. *
  18371. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE on failure
  18372. */
  18373. int wolfSSL_BIO_set_ex_data(WOLFSSL_BIO *bio, int idx, void *data)
  18374. {
  18375. WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data");
  18376. #ifdef HAVE_EX_DATA
  18377. if (bio != NULL && idx < MAX_EX_DATA) {
  18378. return wolfSSL_CRYPTO_set_ex_data(&bio->ex_data, idx, data);
  18379. }
  18380. #else
  18381. (void)bio;
  18382. (void)idx;
  18383. (void)data;
  18384. #endif
  18385. return WOLFSSL_FAILURE;
  18386. }
  18387. /* Get ex_data in WOLFSSL_BIO at given index
  18388. *
  18389. * bio : BIO structure to get ex_data from
  18390. * idx : Index of ex_data to get data from
  18391. *
  18392. * Returns void pointer to ex_data on success or NULL on failure
  18393. */
  18394. void *wolfSSL_BIO_get_ex_data(WOLFSSL_BIO *bio, int idx)
  18395. {
  18396. WOLFSSL_ENTER("wolfSSL_BIO_get_ex_data");
  18397. #ifdef HAVE_EX_DATA
  18398. if (bio != NULL && idx < MAX_EX_DATA && idx >= 0) {
  18399. return wolfSSL_CRYPTO_get_ex_data(&bio->ex_data, idx);
  18400. }
  18401. #else
  18402. (void)bio;
  18403. (void)idx;
  18404. #endif
  18405. return NULL;
  18406. }
  18407. #ifndef NO_WOLFSSL_STUB
  18408. void wolfSSL_RAND_screen(void)
  18409. {
  18410. WOLFSSL_STUB("RAND_screen");
  18411. }
  18412. #endif
  18413. int wolfSSL_RAND_load_file(const char* fname, long len)
  18414. {
  18415. (void)fname;
  18416. /* wolfCrypt provides enough entropy internally or will report error */
  18417. if (len == -1)
  18418. return 1024;
  18419. else
  18420. return (int)len;
  18421. }
  18422. #ifndef NO_WOLFSSL_STUB
  18423. WOLFSSL_COMP_METHOD* wolfSSL_COMP_zlib(void)
  18424. {
  18425. WOLFSSL_STUB("COMP_zlib");
  18426. return 0;
  18427. }
  18428. #endif
  18429. #ifndef NO_WOLFSSL_STUB
  18430. WOLFSSL_COMP_METHOD* wolfSSL_COMP_rle(void)
  18431. {
  18432. WOLFSSL_STUB("COMP_rle");
  18433. return 0;
  18434. }
  18435. #endif
  18436. #ifndef NO_WOLFSSL_STUB
  18437. int wolfSSL_COMP_add_compression_method(int method, void* data)
  18438. {
  18439. (void)method;
  18440. (void)data;
  18441. WOLFSSL_STUB("COMP_add_compression_method");
  18442. return 0;
  18443. }
  18444. #endif
  18445. #ifndef NO_WOLFSSL_STUB
  18446. void wolfSSL_set_dynlock_create_callback(WOLFSSL_dynlock_value* (*f)(
  18447. const char*, int))
  18448. {
  18449. WOLFSSL_STUB("CRYPTO_set_dynlock_create_callback");
  18450. (void)f;
  18451. }
  18452. #endif
  18453. #ifndef NO_WOLFSSL_STUB
  18454. void wolfSSL_set_dynlock_lock_callback(
  18455. void (*f)(int, WOLFSSL_dynlock_value*, const char*, int))
  18456. {
  18457. WOLFSSL_STUB("CRYPTO_set_set_dynlock_lock_callback");
  18458. (void)f;
  18459. }
  18460. #endif
  18461. #ifndef NO_WOLFSSL_STUB
  18462. void wolfSSL_set_dynlock_destroy_callback(
  18463. void (*f)(WOLFSSL_dynlock_value*, const char*, int))
  18464. {
  18465. WOLFSSL_STUB("CRYPTO_set_set_dynlock_destroy_callback");
  18466. (void)f;
  18467. }
  18468. #endif
  18469. #endif /* OPENSSL_EXTRA */
  18470. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  18471. const char* wolfSSL_X509_verify_cert_error_string(long err)
  18472. {
  18473. return wolfSSL_ERR_reason_error_string(err);
  18474. }
  18475. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  18476. #ifdef OPENSSL_EXTRA
  18477. #ifndef NO_WOLFSSL_STUB
  18478. int wolfSSL_X509_LOOKUP_add_dir(WOLFSSL_X509_LOOKUP* lookup, const char* dir,
  18479. long len)
  18480. {
  18481. (void)lookup;
  18482. (void)dir;
  18483. (void)len;
  18484. WOLFSSL_STUB("X509_LOOKUP_add_dir");
  18485. return 0;
  18486. }
  18487. #endif
  18488. int wolfSSL_X509_LOOKUP_load_file(WOLFSSL_X509_LOOKUP* lookup,
  18489. const char* file, long type)
  18490. {
  18491. #if !defined(NO_FILESYSTEM) && \
  18492. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  18493. int ret = WOLFSSL_FAILURE;
  18494. XFILE fp;
  18495. long sz;
  18496. byte* pem = NULL;
  18497. byte* curr = NULL;
  18498. byte* prev = NULL;
  18499. WOLFSSL_X509* x509;
  18500. const char* header = NULL;
  18501. const char* footer = NULL;
  18502. if (type != X509_FILETYPE_PEM)
  18503. return BAD_FUNC_ARG;
  18504. fp = XFOPEN(file, "r");
  18505. if (fp == XBADFILE)
  18506. return BAD_FUNC_ARG;
  18507. if(XFSEEK(fp, 0, XSEEK_END) != 0) {
  18508. XFCLOSE(fp);
  18509. return WOLFSSL_BAD_FILE;
  18510. }
  18511. sz = XFTELL(fp);
  18512. XREWIND(fp);
  18513. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  18514. WOLFSSL_MSG("X509_LOOKUP_load_file size error");
  18515. goto end;
  18516. }
  18517. pem = (byte*)XMALLOC(sz, 0, DYNAMIC_TYPE_PEM);
  18518. if (pem == NULL) {
  18519. ret = MEMORY_ERROR;
  18520. goto end;
  18521. }
  18522. /* Read in file which may be CRLs or certificates. */
  18523. if (XFREAD(pem, (size_t)sz, 1, fp) != 1)
  18524. goto end;
  18525. prev = curr = pem;
  18526. do {
  18527. /* get PEM header and footer based on type */
  18528. if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 &&
  18529. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  18530. #ifdef HAVE_CRL
  18531. WOLFSSL_CERT_MANAGER* cm = lookup->store->cm;
  18532. if (cm->crl == NULL) {
  18533. if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
  18534. WOLFSSL_MSG("Enable CRL failed");
  18535. goto end;
  18536. }
  18537. }
  18538. ret = BufferLoadCRL(cm->crl, curr, sz, WOLFSSL_FILETYPE_PEM,
  18539. NO_VERIFY);
  18540. if (ret != WOLFSSL_SUCCESS)
  18541. goto end;
  18542. #endif
  18543. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  18544. }
  18545. else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 &&
  18546. XSTRNSTR((char*)curr, header, (unsigned int)sz) != NULL) {
  18547. x509 = wolfSSL_X509_load_certificate_buffer(curr, (int)sz,
  18548. WOLFSSL_FILETYPE_PEM);
  18549. if (x509 == NULL)
  18550. goto end;
  18551. ret = wolfSSL_X509_STORE_add_cert(lookup->store, x509);
  18552. wolfSSL_X509_free(x509);
  18553. if (ret != WOLFSSL_SUCCESS)
  18554. goto end;
  18555. curr = (byte*)XSTRNSTR((char*)curr, footer, (unsigned int)sz);
  18556. }
  18557. else
  18558. goto end;
  18559. if (curr == NULL)
  18560. goto end;
  18561. curr++;
  18562. sz -= (long)(curr - prev);
  18563. prev = curr;
  18564. }
  18565. while (ret == WOLFSSL_SUCCESS);
  18566. end:
  18567. if (pem != NULL)
  18568. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  18569. XFCLOSE(fp);
  18570. return ret;
  18571. #else
  18572. (void)lookup;
  18573. (void)file;
  18574. (void)type;
  18575. return WOLFSSL_FAILURE;
  18576. #endif
  18577. }
  18578. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_hash_dir(void)
  18579. {
  18580. /* Method implementation in functions. */
  18581. static WOLFSSL_X509_LOOKUP_METHOD meth = { 1 };
  18582. return &meth;
  18583. }
  18584. WOLFSSL_X509_LOOKUP_METHOD* wolfSSL_X509_LOOKUP_file(void)
  18585. {
  18586. /* Method implementation in functions. */
  18587. static WOLFSSL_X509_LOOKUP_METHOD meth = { 0 };
  18588. return &meth;
  18589. }
  18590. WOLFSSL_X509_LOOKUP* wolfSSL_X509_STORE_add_lookup(WOLFSSL_X509_STORE* store,
  18591. WOLFSSL_X509_LOOKUP_METHOD* m)
  18592. {
  18593. WOLFSSL_ENTER("SSL_X509_STORE_add_lookup");
  18594. if (store == NULL)
  18595. return NULL;
  18596. /* Method is a dummy value and is not needed. */
  18597. (void)m;
  18598. /* Make sure the lookup has a back reference to the store. */
  18599. store->lookup.store = store;
  18600. return &store->lookup;
  18601. }
  18602. #ifndef NO_CERTS
  18603. /* Converts the X509 to DER format and outputs it into bio.
  18604. *
  18605. * bio is the structure to hold output DER
  18606. * x509 certificate to create DER from
  18607. *
  18608. * returns WOLFSSL_SUCCESS on success
  18609. */
  18610. int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
  18611. {
  18612. WOLFSSL_ENTER("wolfSSL_i2d_X509_bio");
  18613. if (bio == NULL || x509 == NULL) {
  18614. return WOLFSSL_FAILURE;
  18615. }
  18616. if (x509->derCert != NULL) {
  18617. word32 len = x509->derCert->length;
  18618. byte* der = x509->derCert->buffer;
  18619. if (wolfSSL_BIO_write(bio, der, len) == (int)len) {
  18620. return SSL_SUCCESS;
  18621. }
  18622. }
  18623. return WOLFSSL_FAILURE;
  18624. }
  18625. /* Converts an internal structure to a DER buffer
  18626. *
  18627. * x509 structure to get DER buffer from
  18628. * out buffer to hold result. If NULL then *out is NULL then a new buffer is
  18629. * created.
  18630. *
  18631. * returns the size of the DER result on success
  18632. */
  18633. int wolfSSL_i2d_X509(WOLFSSL_X509* x509, unsigned char** out)
  18634. {
  18635. const unsigned char* der;
  18636. int derSz = 0;
  18637. WOLFSSL_ENTER("wolfSSL_i2d_X509");
  18638. if (x509 == NULL) {
  18639. WOLFSSL_LEAVE("wolfSSL_i2d_X509", BAD_FUNC_ARG);
  18640. return BAD_FUNC_ARG;
  18641. }
  18642. der = wolfSSL_X509_get_der(x509, &derSz);
  18643. if (der == NULL) {
  18644. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  18645. return MEMORY_E;
  18646. }
  18647. if (out != NULL && *out == NULL) {
  18648. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  18649. if (*out == NULL) {
  18650. WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E);
  18651. return MEMORY_E;
  18652. }
  18653. }
  18654. if (out != NULL)
  18655. XMEMCPY(*out, der, derSz);
  18656. WOLFSSL_LEAVE("wolfSSL_i2d_X509", derSz);
  18657. return derSz;
  18658. }
  18659. /* Converts the DER from bio and creates a WOLFSSL_X509 structure from it.
  18660. *
  18661. * bio is the structure holding DER
  18662. * x509 certificate to create from DER. Can be NULL
  18663. *
  18664. * returns pointer to WOLFSSL_X509 structure on success and NULL on fail
  18665. */
  18666. WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
  18667. {
  18668. WOLFSSL_X509* localX509 = NULL;
  18669. unsigned char* mem = NULL;
  18670. int ret;
  18671. word32 size;
  18672. WOLFSSL_ENTER("wolfSSL_d2i_X509_bio");
  18673. if (bio == NULL) {
  18674. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  18675. return NULL;
  18676. }
  18677. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  18678. if (mem == NULL || ret <= 0) {
  18679. WOLFSSL_MSG("Failed to get data from bio struct");
  18680. return NULL;
  18681. }
  18682. size = ret;
  18683. localX509 = wolfSSL_X509_d2i(NULL, mem, size);
  18684. if (localX509 == NULL) {
  18685. return NULL;
  18686. }
  18687. if (x509 != NULL) {
  18688. *x509 = localX509;
  18689. }
  18690. return localX509;
  18691. }
  18692. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  18693. WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12)
  18694. {
  18695. WC_PKCS12* localPkcs12 = NULL;
  18696. unsigned char* mem = NULL;
  18697. int ret;
  18698. word32 size;
  18699. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio");
  18700. if (bio == NULL) {
  18701. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  18702. return NULL;
  18703. }
  18704. localPkcs12 = wc_PKCS12_new();
  18705. if (localPkcs12 == NULL) {
  18706. WOLFSSL_MSG("Memory error");
  18707. return NULL;
  18708. }
  18709. if (pkcs12 != NULL) {
  18710. *pkcs12 = localPkcs12;
  18711. }
  18712. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  18713. if (mem == NULL || ret <= 0) {
  18714. WOLFSSL_MSG("Failed to get data from bio struct");
  18715. wc_PKCS12_free(localPkcs12);
  18716. if (pkcs12 != NULL) {
  18717. *pkcs12 = NULL;
  18718. }
  18719. return NULL;
  18720. }
  18721. size = ret;
  18722. ret = wc_d2i_PKCS12(mem, size, localPkcs12);
  18723. if (ret < 0) {
  18724. WOLFSSL_MSG("Failed to get PKCS12 sequence");
  18725. wc_PKCS12_free(localPkcs12);
  18726. if (pkcs12 != NULL) {
  18727. *pkcs12 = NULL;
  18728. }
  18729. return NULL;
  18730. }
  18731. return localPkcs12;
  18732. }
  18733. /* Converts the PKCS12 to DER format and outputs it into bio.
  18734. *
  18735. * bio is the structure to hold output DER
  18736. * pkcs12 structure to create DER from
  18737. *
  18738. * return 1 for success or 0 if an error occurs
  18739. */
  18740. int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12)
  18741. {
  18742. int ret = WOLFSSL_FAILURE;
  18743. WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio");
  18744. if ((bio != NULL) && (pkcs12 != NULL)) {
  18745. word32 certSz = 0;
  18746. byte *certDer = NULL;
  18747. certSz = wc_i2d_PKCS12(pkcs12, &certDer, NULL);
  18748. if ((certSz > 0) && (certDer != NULL)) {
  18749. if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) {
  18750. ret = SSL_SUCCESS;
  18751. }
  18752. }
  18753. if (certDer != NULL) {
  18754. XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS);
  18755. }
  18756. }
  18757. return ret;
  18758. }
  18759. /* Copies unencrypted DER key buffer into "der". If "der" is null then the size
  18760. * of buffer needed is returned. If *der == NULL then it allocates a buffer.
  18761. * NOTE: This also advances the "der" pointer to be at the end of buffer.
  18762. *
  18763. * Returns size of key buffer on success
  18764. */
  18765. int wolfSSL_i2d_PrivateKey(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
  18766. {
  18767. return wolfSSL_EVP_PKEY_get_der(key, der);
  18768. }
  18769. /* Creates a new WC_PKCS12 structure
  18770. *
  18771. * pass password to use
  18772. * name friendlyName to use
  18773. * pkey private key to go into PKCS12 bundle
  18774. * cert certificate to go into PKCS12 bundle
  18775. * ca extra certificates that can be added to bundle. Can be NULL
  18776. * keyNID type of encryption to use on the key (-1 means no encryption)
  18777. * certNID type of encryption to use on the certificate
  18778. * itt number of iterations with encryption
  18779. * macItt number of iterations with mac creation
  18780. * keyType flag for signature and/or encryption key
  18781. *
  18782. * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail
  18783. */
  18784. WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name,
  18785. WOLFSSL_EVP_PKEY* pkey, WOLFSSL_X509* cert,
  18786. WOLF_STACK_OF(WOLFSSL_X509)* ca,
  18787. int keyNID, int certNID, int itt, int macItt, int keyType)
  18788. {
  18789. WC_PKCS12* pkcs12;
  18790. WC_DerCertList* list = NULL;
  18791. word32 passSz;
  18792. byte* keyDer = NULL;
  18793. word32 keyDerSz;
  18794. byte* certDer;
  18795. int certDerSz;
  18796. WOLFSSL_ENTER("wolfSSL_PKCS12_create()");
  18797. if (pass == NULL || pkey == NULL || cert == NULL) {
  18798. WOLFSSL_LEAVE("wolfSSL_PKCS12_create()", BAD_FUNC_ARG);
  18799. return NULL;
  18800. }
  18801. passSz = (word32)XSTRLEN(pass);
  18802. keyDer = (byte*)pkey->pkey.ptr;
  18803. keyDerSz = pkey->pkey_sz;
  18804. certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz);
  18805. if (certDer == NULL) {
  18806. return NULL;
  18807. }
  18808. if (ca != NULL) {
  18809. WC_DerCertList* cur;
  18810. unsigned long numCerts = ca->num;
  18811. byte* curDer;
  18812. int curDerSz = 0;
  18813. WOLFSSL_STACK* sk = ca;
  18814. while (numCerts > 0 && sk != NULL) {
  18815. cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL,
  18816. DYNAMIC_TYPE_PKCS);
  18817. if (cur == NULL) {
  18818. wc_FreeCertList(list, NULL);
  18819. return NULL;
  18820. }
  18821. curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz);
  18822. if (curDer == NULL || curDerSz < 0) {
  18823. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  18824. wc_FreeCertList(list, NULL);
  18825. return NULL;
  18826. }
  18827. cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS);
  18828. if (cur->buffer == NULL) {
  18829. XFREE(cur, NULL, DYNAMIC_TYPE_PKCS);
  18830. wc_FreeCertList(list, NULL);
  18831. return NULL;
  18832. }
  18833. XMEMCPY(cur->buffer, curDer, curDerSz);
  18834. cur->bufferSz = curDerSz;
  18835. cur->next = list;
  18836. list = cur;
  18837. sk = sk->next;
  18838. numCerts--;
  18839. }
  18840. }
  18841. pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz,
  18842. certDer, certDerSz, list, keyNID, certNID, itt, macItt,
  18843. keyType, NULL);
  18844. if (ca != NULL) {
  18845. wc_FreeCertList(list, NULL);
  18846. }
  18847. return pkcs12;
  18848. }
  18849. /* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */
  18850. int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw,
  18851. WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert, WOLF_STACK_OF(WOLFSSL_X509)** ca)
  18852. {
  18853. DecodedCert DeCert;
  18854. void* heap = NULL;
  18855. int ret;
  18856. byte* certData = NULL;
  18857. word32 certDataSz;
  18858. byte* pk = NULL;
  18859. word32 pkSz;
  18860. WC_DerCertList* certList = NULL;
  18861. WOLFSSL_ENTER("wolfSSL_PKCS12_parse");
  18862. /* make sure we init return args */
  18863. if (pkey) *pkey = NULL;
  18864. if (cert) *cert = NULL;
  18865. if (ca) *ca = NULL;
  18866. if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) {
  18867. WOLFSSL_MSG("Bad argument value");
  18868. return WOLFSSL_FAILURE;
  18869. }
  18870. heap = wc_PKCS12_GetHeap(pkcs12);
  18871. if (ca == NULL) {
  18872. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  18873. NULL);
  18874. }
  18875. else {
  18876. ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz,
  18877. &certList);
  18878. }
  18879. if (ret < 0) {
  18880. WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret);
  18881. return WOLFSSL_FAILURE;
  18882. }
  18883. /* Decode cert and place in X509 stack struct */
  18884. if (certList != NULL) {
  18885. WC_DerCertList* current = certList;
  18886. *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC(sizeof(WOLF_STACK_OF(WOLFSSL_X509)),
  18887. heap, DYNAMIC_TYPE_X509);
  18888. if (*ca == NULL) {
  18889. if (pk != NULL) {
  18890. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18891. }
  18892. if (certData != NULL) {
  18893. XFREE(*cert, heap, DYNAMIC_TYPE_PKCS); *cert = NULL;
  18894. }
  18895. /* Free up WC_DerCertList and move on */
  18896. while (current != NULL) {
  18897. WC_DerCertList* next = current->next;
  18898. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  18899. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  18900. current = next;
  18901. }
  18902. return WOLFSSL_FAILURE;
  18903. }
  18904. XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509)));
  18905. /* add list of DER certs as X509's to stack */
  18906. while (current != NULL) {
  18907. WC_DerCertList* toFree = current;
  18908. WOLFSSL_X509* x509;
  18909. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  18910. DYNAMIC_TYPE_X509);
  18911. InitX509(x509, 1, heap);
  18912. InitDecodedCert(&DeCert, current->buffer, current->bufferSz, heap);
  18913. if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  18914. WOLFSSL_MSG("Issue with parsing certificate");
  18915. FreeDecodedCert(&DeCert);
  18916. wolfSSL_X509_free(x509);
  18917. }
  18918. else {
  18919. if ((ret = CopyDecodedToX509(x509, &DeCert)) != 0) {
  18920. WOLFSSL_MSG("Failed to copy decoded cert");
  18921. FreeDecodedCert(&DeCert);
  18922. wolfSSL_X509_free(x509);
  18923. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18924. if (pk != NULL) {
  18925. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18926. }
  18927. if (certData != NULL) {
  18928. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  18929. }
  18930. /* Free up WC_DerCertList */
  18931. while (current != NULL) {
  18932. WC_DerCertList* next = current->next;
  18933. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  18934. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  18935. current = next;
  18936. }
  18937. return WOLFSSL_FAILURE;
  18938. }
  18939. FreeDecodedCert(&DeCert);
  18940. if (wolfSSL_sk_X509_push(*ca, x509) != 1) {
  18941. WOLFSSL_MSG("Failed to push x509 onto stack");
  18942. wolfSSL_X509_free(x509);
  18943. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18944. if (pk != NULL) {
  18945. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18946. }
  18947. if (certData != NULL) {
  18948. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  18949. }
  18950. /* Free up WC_DerCertList */
  18951. while (current != NULL) {
  18952. WC_DerCertList* next = current->next;
  18953. XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS);
  18954. XFREE(current, heap, DYNAMIC_TYPE_PKCS);
  18955. current = next;
  18956. }
  18957. return WOLFSSL_FAILURE;
  18958. }
  18959. }
  18960. current = current->next;
  18961. XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS);
  18962. XFREE(toFree, heap, DYNAMIC_TYPE_PKCS);
  18963. }
  18964. }
  18965. /* Decode cert and place in X509 struct */
  18966. if (certData != NULL) {
  18967. *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  18968. DYNAMIC_TYPE_X509);
  18969. if (*cert == NULL) {
  18970. if (pk != NULL) {
  18971. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18972. }
  18973. if (ca != NULL) {
  18974. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18975. }
  18976. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  18977. return WOLFSSL_FAILURE;
  18978. }
  18979. InitX509(*cert, 1, heap);
  18980. InitDecodedCert(&DeCert, certData, certDataSz, heap);
  18981. if (ParseCertRelative(&DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) {
  18982. WOLFSSL_MSG("Issue with parsing certificate");
  18983. }
  18984. if ((ret = CopyDecodedToX509(*cert, &DeCert)) != 0) {
  18985. WOLFSSL_MSG("Failed to copy decoded cert");
  18986. FreeDecodedCert(&DeCert);
  18987. if (pk != NULL) {
  18988. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18989. }
  18990. if (ca != NULL) {
  18991. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  18992. }
  18993. wolfSSL_X509_free(*cert); *cert = NULL;
  18994. return WOLFSSL_FAILURE;
  18995. }
  18996. FreeDecodedCert(&DeCert);
  18997. XFREE(certData, heap, DYNAMIC_TYPE_PKCS);
  18998. }
  18999. /* get key type */
  19000. ret = BAD_STATE_E;
  19001. if (pk != NULL) { /* decode key if present */
  19002. *pkey = wolfSSL_EVP_PKEY_new_ex(heap);
  19003. if (*pkey == NULL) {
  19004. wolfSSL_X509_free(*cert); *cert = NULL;
  19005. if (ca != NULL) {
  19006. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  19007. }
  19008. XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  19009. return WOLFSSL_FAILURE;
  19010. }
  19011. #ifndef NO_RSA
  19012. {
  19013. word32 keyIdx = 0;
  19014. RsaKey key;
  19015. if (wc_InitRsaKey(&key, heap) != 0) {
  19016. ret = BAD_STATE_E;
  19017. }
  19018. else {
  19019. if ((ret = wc_RsaPrivateKeyDecode(pk, &keyIdx, &key, pkSz))
  19020. == 0) {
  19021. (*pkey)->type = EVP_PKEY_RSA;
  19022. (*pkey)->rsa = wolfSSL_RSA_new();
  19023. (*pkey)->ownRsa = 1; /* we own RSA */
  19024. if ((*pkey)->rsa == NULL) {
  19025. WOLFSSL_MSG("issue creating EVP RSA key");
  19026. wolfSSL_X509_free(*cert); *cert = NULL;
  19027. if (ca != NULL) {
  19028. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  19029. }
  19030. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  19031. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  19032. return WOLFSSL_FAILURE;
  19033. }
  19034. if ((ret = wolfSSL_RSA_LoadDer_ex((*pkey)->rsa, pk, pkSz,
  19035. WOLFSSL_RSA_LOAD_PRIVATE)) != SSL_SUCCESS) {
  19036. WOLFSSL_MSG("issue loading RSA key");
  19037. wolfSSL_X509_free(*cert); *cert = NULL;
  19038. if (ca != NULL) {
  19039. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  19040. }
  19041. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  19042. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  19043. return WOLFSSL_FAILURE;
  19044. }
  19045. WOLFSSL_MSG("Found PKCS12 RSA key");
  19046. ret = 0; /* set in success state for upcoming ECC check */
  19047. }
  19048. wc_FreeRsaKey(&key);
  19049. }
  19050. }
  19051. #endif /* NO_RSA */
  19052. #ifdef HAVE_ECC
  19053. {
  19054. word32 keyIdx = 0;
  19055. ecc_key key;
  19056. if (ret != 0) { /* if is in fail state check if ECC key */
  19057. if (wc_ecc_init(&key) != 0) {
  19058. wolfSSL_X509_free(*cert); *cert = NULL;
  19059. if (ca != NULL) {
  19060. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  19061. }
  19062. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  19063. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  19064. return WOLFSSL_FAILURE;
  19065. }
  19066. if ((ret = wc_EccPrivateKeyDecode(pk, &keyIdx, &key, pkSz))
  19067. != 0) {
  19068. wolfSSL_X509_free(*cert); *cert = NULL;
  19069. if (ca != NULL) {
  19070. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  19071. }
  19072. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  19073. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  19074. WOLFSSL_MSG("Bad PKCS12 key format");
  19075. return WOLFSSL_FAILURE;
  19076. }
  19077. (*pkey)->type = EVP_PKEY_EC;
  19078. (*pkey)->pkey_curve = key.dp->oidSum;
  19079. wc_ecc_free(&key);
  19080. WOLFSSL_MSG("Found PKCS12 ECC key");
  19081. }
  19082. }
  19083. #else
  19084. if (ret != 0) { /* if is in fail state and no ECC then fail */
  19085. wolfSSL_X509_free(*cert); *cert = NULL;
  19086. if (ca != NULL) {
  19087. wolfSSL_sk_X509_free(*ca); *ca = NULL;
  19088. }
  19089. wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL;
  19090. XFREE(pk, heap, DYNAMIC_TYPE_PKCS);
  19091. WOLFSSL_MSG("Bad PKCS12 key format");
  19092. return WOLFSSL_FAILURE;
  19093. }
  19094. #endif /* HAVE_ECC */
  19095. (*pkey)->save_type = 0;
  19096. (*pkey)->pkey_sz = pkSz;
  19097. (*pkey)->pkey.ptr = (char*)pk;
  19098. }
  19099. (void)ret;
  19100. (void)ca;
  19101. return WOLFSSL_SUCCESS;
  19102. }
  19103. #endif /* !NO_ASN && !NO_PWDBASED */
  19104. /* no-op function. Was initially used for adding encryption algorithms available
  19105. * for PKCS12 */
  19106. void wolfSSL_PKCS12_PBE_add(void)
  19107. {
  19108. WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add");
  19109. }
  19110. WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get_chain(WOLFSSL_X509_STORE_CTX* ctx)
  19111. {
  19112. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_chain");
  19113. if (ctx == NULL) {
  19114. return NULL;
  19115. }
  19116. #ifdef SESSION_CERTS
  19117. /* if chain is null but sesChain is available then populate stack */
  19118. if (ctx->chain == NULL && ctx->sesChain != NULL) {
  19119. int i;
  19120. WOLFSSL_X509_CHAIN* c = ctx->sesChain;
  19121. WOLFSSL_STACK* sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK),
  19122. NULL, DYNAMIC_TYPE_X509);
  19123. if (sk == NULL) {
  19124. return NULL;
  19125. }
  19126. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  19127. ctx->chain = sk;
  19128. for (i = 0; i < c->count && i < MAX_CHAIN_DEPTH; i++) {
  19129. WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, i);
  19130. if (x509 == NULL) {
  19131. WOLFSSL_MSG("Unable to get x509 from chain");
  19132. wolfSSL_sk_X509_free(sk);
  19133. return NULL;
  19134. }
  19135. if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
  19136. WOLFSSL_MSG("Unable to load x509 into stack");
  19137. wolfSSL_sk_X509_free(sk);
  19138. wolfSSL_X509_free(x509);
  19139. return NULL;
  19140. }
  19141. }
  19142. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA)
  19143. /* add CA used to verify top of chain to the list */
  19144. if (c->count > 0) {
  19145. WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, c->count - 1);
  19146. if (x509 != NULL) {
  19147. WOLFSSL_X509* issuer = NULL;
  19148. if (wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, x509)
  19149. == WOLFSSL_SUCCESS) {
  19150. /* check that the certificate being looked up is not self
  19151. * signed and that a issuer was found */
  19152. if (issuer != NULL && wolfSSL_X509_NAME_cmp(&x509->issuer,
  19153. &x509->subject) != 0) {
  19154. if (wolfSSL_sk_X509_push(sk, issuer) != SSL_SUCCESS) {
  19155. WOLFSSL_MSG("Unable to load CA x509 into stack");
  19156. wolfSSL_sk_X509_free(sk);
  19157. wolfSSL_X509_free(issuer);
  19158. return NULL;
  19159. }
  19160. }
  19161. else {
  19162. WOLFSSL_MSG("Certificate is self signed");
  19163. if (issuer != NULL)
  19164. wolfSSL_X509_free(issuer);
  19165. }
  19166. }
  19167. else {
  19168. WOLFSSL_MSG("Could not find CA for certificate");
  19169. }
  19170. }
  19171. }
  19172. #endif
  19173. }
  19174. #endif /* SESSION_CERTS */
  19175. return ctx->chain;
  19176. }
  19177. /* like X509_STORE_CTX_get_chain(), but return a copy with data reference
  19178. counts increased */
  19179. WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain(WOLFSSL_X509_STORE_CTX* ctx)
  19180. {
  19181. WOLFSSL_STACK* ref;
  19182. if (ctx == NULL) {
  19183. return NULL;
  19184. }
  19185. /* get chain in ctx */
  19186. ref = wolfSSL_X509_STORE_CTX_get_chain(ctx);
  19187. if (ref == NULL) {
  19188. return ref;
  19189. }
  19190. /* create duplicate of ctx chain */
  19191. return wolfSSL_sk_dup(ref);
  19192. }
  19193. int wolfSSL_X509_STORE_add_cert(WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509)
  19194. {
  19195. int result = WOLFSSL_FATAL_ERROR;
  19196. WOLFSSL_ENTER("wolfSSL_X509_STORE_add_cert");
  19197. if (store != NULL && store->cm != NULL && x509 != NULL
  19198. && x509->derCert != NULL) {
  19199. DerBuffer* derCert = NULL;
  19200. result = AllocDer(&derCert, x509->derCert->length,
  19201. x509->derCert->type, NULL);
  19202. if (result == 0) {
  19203. /* AddCA() frees the buffer. */
  19204. XMEMCPY(derCert->buffer,
  19205. x509->derCert->buffer, x509->derCert->length);
  19206. result = AddCA(store->cm, &derCert, WOLFSSL_USER_CA, VERIFY);
  19207. }
  19208. }
  19209. WOLFSSL_LEAVE("wolfSSL_X509_STORE_add_cert", result);
  19210. if (result != WOLFSSL_SUCCESS) {
  19211. result = WOLFSSL_FATAL_ERROR;
  19212. }
  19213. return result;
  19214. }
  19215. #endif /* !NO_CERTS */
  19216. #endif /* OPENSSL_EXTRA */
  19217. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19218. WOLFSSL_X509_STORE* wolfSSL_X509_STORE_new(void)
  19219. {
  19220. WOLFSSL_X509_STORE* store = NULL;
  19221. WOLFSSL_ENTER("SSL_X509_STORE_new");
  19222. if ((store = (WOLFSSL_X509_STORE*)XMALLOC(sizeof(WOLFSSL_X509_STORE), NULL,
  19223. DYNAMIC_TYPE_X509_STORE)) == NULL)
  19224. goto err_exit;
  19225. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE));
  19226. store->isDynamic = 1;
  19227. if ((store->cm = wolfSSL_CertManagerNew()) == NULL)
  19228. goto err_exit;
  19229. #ifdef HAVE_CRL
  19230. store->crl = store->cm->crl;
  19231. #endif
  19232. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19233. if ((store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  19234. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  19235. NULL, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  19236. goto err_exit;
  19237. }
  19238. #endif
  19239. return store;
  19240. err_exit:
  19241. if (store == NULL)
  19242. return NULL;
  19243. wolfSSL_X509_STORE_free(store);
  19244. return NULL;
  19245. }
  19246. void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store)
  19247. {
  19248. if (store != NULL && store->isDynamic) {
  19249. if (store->cm != NULL) {
  19250. wolfSSL_CertManagerFree(store->cm);
  19251. store->cm = NULL;
  19252. }
  19253. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  19254. if (store->param != NULL) {
  19255. XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL);
  19256. store->param = NULL;
  19257. }
  19258. #endif
  19259. XFREE(store, NULL, DYNAMIC_TYPE_X509_STORE);
  19260. }
  19261. }
  19262. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  19263. #ifdef OPENSSL_EXTRA
  19264. #ifndef NO_CERTS
  19265. int wolfSSL_X509_STORE_set_flags(WOLFSSL_X509_STORE* store, unsigned long flag)
  19266. {
  19267. int ret = WOLFSSL_SUCCESS;
  19268. WOLFSSL_ENTER("wolfSSL_X509_STORE_set_flags");
  19269. if (store == NULL)
  19270. return WOLFSSL_FAILURE;
  19271. if ((flag & WOLFSSL_CRL_CHECKALL) || (flag & WOLFSSL_CRL_CHECK)) {
  19272. ret = wolfSSL_CertManagerEnableCRL(store->cm, (int)flag);
  19273. }
  19274. (void)store;
  19275. (void)flag;
  19276. return ret;
  19277. }
  19278. int wolfSSL_X509_STORE_set_default_paths(WOLFSSL_X509_STORE* store)
  19279. {
  19280. (void)store;
  19281. return WOLFSSL_SUCCESS;
  19282. }
  19283. #ifndef NO_WOLFSSL_STUB
  19284. int wolfSSL_X509_STORE_get_by_subject(WOLFSSL_X509_STORE_CTX* ctx, int idx,
  19285. WOLFSSL_X509_NAME* name, WOLFSSL_X509_OBJECT* obj)
  19286. {
  19287. (void)ctx;
  19288. (void)idx;
  19289. (void)name;
  19290. (void)obj;
  19291. WOLFSSL_STUB("X509_STORE_get_by_subject");
  19292. return 0;
  19293. }
  19294. #endif
  19295. WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new(void)
  19296. {
  19297. WOLFSSL_X509_STORE_CTX* ctx;
  19298. WOLFSSL_ENTER("X509_STORE_CTX_new");
  19299. ctx = (WOLFSSL_X509_STORE_CTX*)XMALLOC(sizeof(WOLFSSL_X509_STORE_CTX), NULL,
  19300. DYNAMIC_TYPE_X509_CTX);
  19301. if (ctx != NULL) {
  19302. ctx->param = NULL;
  19303. wolfSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
  19304. }
  19305. return ctx;
  19306. }
  19307. int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx,
  19308. WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509, WOLF_STACK_OF(WOLFSSL_X509)* sk)
  19309. {
  19310. WOLFSSL_X509* x509_cert;
  19311. int ret = 0;
  19312. (void)sk;
  19313. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_init");
  19314. if (ctx != NULL) {
  19315. ctx->store = store;
  19316. #ifndef WOLFSSL_X509_STORE_CERTS
  19317. ctx->current_cert = x509;
  19318. #else
  19319. if(x509 != NULL){
  19320. ctx->current_cert = wolfSSL_X509_d2i(NULL, x509->derCert->buffer,x509->derCert->length);
  19321. if(ctx->current_cert == NULL)
  19322. return WOLFSSL_FATAL_ERROR;
  19323. } else
  19324. ctx->current_cert = NULL;
  19325. #endif
  19326. ctx->chain = sk;
  19327. /* Add intermediate certificates from stack to store */
  19328. while (sk != NULL) {
  19329. x509_cert = sk->data.x509;
  19330. if (x509_cert != NULL && x509_cert->isCa) {
  19331. ret = wolfSSL_X509_STORE_add_cert(store, x509_cert);
  19332. if (ret < 0) {
  19333. return WOLFSSL_FATAL_ERROR;
  19334. }
  19335. }
  19336. sk = sk->next;
  19337. }
  19338. ctx->sesChain = NULL;
  19339. ctx->domain = NULL;
  19340. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  19341. XMEMSET(&ctx->ex_data, 0, sizeof(ctx->ex_data));
  19342. #endif
  19343. ctx->userCtx = NULL;
  19344. ctx->error = 0;
  19345. ctx->error_depth = 0;
  19346. ctx->discardSessionCerts = 0;
  19347. #ifdef OPENSSL_EXTRA
  19348. if (ctx->param == NULL) {
  19349. ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  19350. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  19351. NULL,DYNAMIC_TYPE_OPENSSL);
  19352. if (ctx->param == NULL){
  19353. WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init failed");
  19354. return SSL_FATAL_ERROR;
  19355. }
  19356. }
  19357. #endif
  19358. return SSL_SUCCESS;
  19359. }
  19360. return WOLFSSL_FATAL_ERROR;
  19361. }
  19362. /* free's own cert chain holding and extra data */
  19363. void wolfSSL_X509_STORE_CTX_free(WOLFSSL_X509_STORE_CTX* ctx)
  19364. {
  19365. WOLFSSL_ENTER("X509_STORE_CTX_free");
  19366. if (ctx != NULL) {
  19367. #ifdef OPENSSL_EXTRA
  19368. wolfSSL_sk_free(ctx->chain);
  19369. if (ctx->param != NULL){
  19370. XFREE(ctx->param,NULL,DYNAMIC_TYPE_OPENSSL);
  19371. ctx->param = NULL;
  19372. }
  19373. #endif
  19374. XFREE(ctx, NULL, DYNAMIC_TYPE_X509_CTX);
  19375. }
  19376. }
  19377. void wolfSSL_X509_STORE_CTX_cleanup(WOLFSSL_X509_STORE_CTX* ctx)
  19378. {
  19379. (void)ctx;
  19380. /* Do nothing */
  19381. }
  19382. /* Returns corresponding X509 error from internal ASN error <e> */
  19383. static int GetX509Error(int e)
  19384. {
  19385. switch (e) {
  19386. case ASN_BEFORE_DATE_E:
  19387. return X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
  19388. case ASN_AFTER_DATE_E:
  19389. return X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
  19390. case ASN_NO_SIGNER_E:
  19391. return X509_V_ERR_INVALID_CA;
  19392. case ASN_SELF_SIGNED_E:
  19393. return X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
  19394. case ASN_PATHLEN_INV_E:
  19395. case ASN_PATHLEN_SIZE_E:
  19396. return X509_V_ERR_PATH_LENGTH_EXCEEDED;
  19397. case ASN_SIG_OID_E:
  19398. case ASN_SIG_CONFIRM_E:
  19399. case ASN_SIG_HASH_E:
  19400. case ASN_SIG_KEY_E:
  19401. return X509_V_ERR_CERT_SIGNATURE_FAILURE;
  19402. default:
  19403. WOLFSSL_MSG("Error not configured or implemented yet");
  19404. return e;
  19405. }
  19406. }
  19407. /* Verifies certificate chain using WOLFSSL_X509_STORE_CTX
  19408. * returns 0 on success or < 0 on failure.
  19409. */
  19410. int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx)
  19411. {
  19412. int ret = 0;
  19413. int depth = 0;
  19414. int error;
  19415. byte *afterDate, *beforeDate;
  19416. WOLFSSL_ENTER("wolfSSL_X509_verify_cert");
  19417. if (ctx != NULL && ctx->store != NULL && ctx->store->cm != NULL
  19418. && ctx->current_cert != NULL && ctx->current_cert->derCert != NULL) {
  19419. ret = wolfSSL_CertManagerVerifyBuffer(ctx->store->cm,
  19420. ctx->current_cert->derCert->buffer,
  19421. ctx->current_cert->derCert->length,
  19422. WOLFSSL_FILETYPE_ASN1);
  19423. /* If there was an error, process it and add it to CTX */
  19424. if (ret < 0) {
  19425. /* Get corresponding X509 error */
  19426. error = GetX509Error(ret);
  19427. /* Set error depth */
  19428. if (ctx->chain)
  19429. depth = (int)ctx->chain->num;
  19430. wolfSSL_X509_STORE_CTX_set_error(ctx, error);
  19431. wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
  19432. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  19433. if (ctx->store && ctx->store->verify_cb)
  19434. ctx->store->verify_cb(0, ctx);
  19435. #endif
  19436. }
  19437. error = 0;
  19438. /* wolfSSL_CertManagerVerifyBuffer only returns ASN_AFTER_DATE_E or
  19439. ASN_BEFORE_DATE_E if there are no additional errors found in the
  19440. cert. Therefore, check if the cert is expired or not yet valid
  19441. in order to return the correct expected error. */
  19442. afterDate = ctx->current_cert->notAfter.data;
  19443. beforeDate = ctx->current_cert->notBefore.data;
  19444. if (XVALIDATE_DATE(afterDate, (byte)ctx->current_cert->notAfter.type,
  19445. AFTER) < 1) {
  19446. error = X509_V_ERR_CERT_HAS_EXPIRED;
  19447. }
  19448. else if (XVALIDATE_DATE(beforeDate,
  19449. (byte)ctx->current_cert->notBefore.type, BEFORE) < 1) {
  19450. error = X509_V_ERR_CERT_NOT_YET_VALID;
  19451. }
  19452. if (error != 0 ) {
  19453. wolfSSL_X509_STORE_CTX_set_error(ctx, error);
  19454. wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
  19455. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  19456. if (ctx->store && ctx->store->verify_cb)
  19457. ctx->store->verify_cb(0, ctx);
  19458. #endif
  19459. }
  19460. return ret;
  19461. }
  19462. return WOLFSSL_FATAL_ERROR;
  19463. }
  19464. /* Use the public key to verify the signature. Note: this only verifies
  19465. * the certificate signature.
  19466. * returns WOLFSSL_SUCCESS on successful signature verification */
  19467. int wolfSSL_X509_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
  19468. {
  19469. int ret;
  19470. const byte* der;
  19471. int derSz = 0;
  19472. int type;
  19473. if (x509 == NULL || pkey == NULL) {
  19474. return WOLFSSL_FATAL_ERROR;
  19475. }
  19476. der = wolfSSL_X509_get_der(x509, &derSz);
  19477. if (der == NULL) {
  19478. WOLFSSL_MSG("Error getting WOLFSSL_X509 DER");
  19479. return WOLFSSL_FATAL_ERROR;
  19480. }
  19481. switch (pkey->type) {
  19482. case EVP_PKEY_RSA:
  19483. type = RSAk;
  19484. break;
  19485. case EVP_PKEY_EC:
  19486. type = ECDSAk;
  19487. break;
  19488. case EVP_PKEY_DSA:
  19489. type = DSAk;
  19490. break;
  19491. default:
  19492. WOLFSSL_MSG("Unknown pkey key type");
  19493. return WOLFSSL_FATAL_ERROR;
  19494. }
  19495. ret = CheckCertSignaturePubKey(der, derSz, x509->heap,
  19496. (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
  19497. if (ret == 0) {
  19498. return WOLFSSL_SUCCESS;
  19499. }
  19500. return WOLFSSL_FAILURE;
  19501. }
  19502. #endif /* !NO_CERTS */
  19503. #if !defined(NO_FILESYSTEM)
  19504. static void *wolfSSL_d2i_X509_fp_ex(XFILE file, void **x509, int type)
  19505. {
  19506. void *newx509 = NULL;
  19507. byte *fileBuffer = NULL;
  19508. long sz = 0;
  19509. /* init variable */
  19510. if (x509)
  19511. *x509 = NULL;
  19512. /* argument check */
  19513. if (file == XBADFILE) {
  19514. return NULL;
  19515. }
  19516. /* determine file size */
  19517. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  19518. return NULL;
  19519. }
  19520. sz = XFTELL(file);
  19521. XREWIND(file);
  19522. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
  19523. WOLFSSL_MSG("d2i_X509_fp_ex file size error");
  19524. return NULL;
  19525. }
  19526. fileBuffer = (byte *)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE);
  19527. if (fileBuffer != NULL) {
  19528. if ((long)XFREAD(fileBuffer, 1, sz, file) != sz) {
  19529. WOLFSSL_MSG("File read failed");
  19530. goto err_exit;
  19531. }
  19532. if (type == CERT_TYPE) {
  19533. newx509 = (void *)wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz);
  19534. }
  19535. #ifdef HAVE_CRL
  19536. else if (type == CRL_TYPE) {
  19537. newx509 = (void *)wolfSSL_d2i_X509_CRL(NULL, fileBuffer, (int)sz);
  19538. }
  19539. #endif
  19540. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  19541. else if (type == PKCS12_TYPE) {
  19542. if ((newx509 = wc_PKCS12_new()) == NULL) {
  19543. goto err_exit;
  19544. }
  19545. if (wc_d2i_PKCS12(fileBuffer, (int)sz, (WC_PKCS12*)newx509) < 0) {
  19546. goto err_exit;
  19547. }
  19548. }
  19549. #endif
  19550. else {
  19551. goto err_exit;
  19552. }
  19553. if (newx509 == NULL) {
  19554. WOLFSSL_MSG("X509 failed");
  19555. goto err_exit;
  19556. }
  19557. }
  19558. if (x509)
  19559. *x509 = newx509;
  19560. goto _exit;
  19561. err_exit:
  19562. #if !defined(NO_ASN) && !defined(NO_PWDBASED)
  19563. if ((newx509 != NULL) && (type == PKCS12_TYPE)) {
  19564. wc_PKCS12_free((WC_PKCS12*)newx509);
  19565. newx509 = NULL;
  19566. }
  19567. #endif
  19568. _exit:
  19569. if (fileBuffer != NULL)
  19570. XFREE(fileBuffer, NULL, DYNAMIC_TYPE_FILE);
  19571. return newx509;
  19572. }
  19573. WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp, WOLFSSL_X509_PKCS12 **pkcs12)
  19574. {
  19575. WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp");
  19576. return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12, PKCS12_TYPE);
  19577. }
  19578. WOLFSSL_X509 *wolfSSL_d2i_X509_fp(XFILE fp, WOLFSSL_X509 **x509)
  19579. {
  19580. WOLFSSL_ENTER("wolfSSL_d2i_X509_fp");
  19581. return (WOLFSSL_X509 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)x509, CERT_TYPE);
  19582. }
  19583. #endif /* !NO_FILESYSTEM */
  19584. #ifdef HAVE_CRL
  19585. #ifndef NO_FILESYSTEM
  19586. WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_fp(XFILE fp, WOLFSSL_X509_CRL **crl)
  19587. {
  19588. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL_fp");
  19589. return (WOLFSSL_X509_CRL *)wolfSSL_d2i_X509_fp_ex(fp, (void **)crl, CRL_TYPE);
  19590. }
  19591. #endif /* !NO_FILESYSTEM */
  19592. WOLFSSL_X509_CRL* wolfSSL_d2i_X509_CRL(WOLFSSL_X509_CRL** crl,
  19593. const unsigned char* in, int len)
  19594. {
  19595. WOLFSSL_X509_CRL *newcrl = NULL;
  19596. int ret = WOLFSSL_SUCCESS;
  19597. WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL");
  19598. if (in == NULL) {
  19599. WOLFSSL_MSG("Bad argument value");
  19600. } else {
  19601. newcrl =(WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL,
  19602. DYNAMIC_TYPE_CRL);
  19603. if (newcrl == NULL){
  19604. WOLFSSL_MSG("New CRL allocation failed");
  19605. } else {
  19606. ret = InitCRL(newcrl, NULL);
  19607. if (ret < 0) {
  19608. WOLFSSL_MSG("Init tmp CRL failed");
  19609. } else {
  19610. ret = BufferLoadCRL(newcrl, in, len, WOLFSSL_FILETYPE_ASN1,
  19611. NO_VERIFY);
  19612. if (ret != WOLFSSL_SUCCESS) {
  19613. WOLFSSL_MSG("Buffer Load CRL failed");
  19614. } else {
  19615. if (crl) {
  19616. *crl = newcrl;
  19617. }
  19618. }
  19619. }
  19620. }
  19621. }
  19622. if((ret != WOLFSSL_SUCCESS) && (newcrl != NULL)) {
  19623. wolfSSL_X509_CRL_free(newcrl);
  19624. newcrl = NULL;
  19625. }
  19626. return newcrl;
  19627. }
  19628. #endif /* HAVE_CRL */
  19629. #endif /* OPENSSL_EXTRA */
  19630. #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  19631. void wolfSSL_X509_CRL_free(WOLFSSL_X509_CRL *crl)
  19632. {
  19633. WOLFSSL_ENTER("wolfSSL_X509_CRL_free");
  19634. FreeCRL(crl, 1);
  19635. return;
  19636. }
  19637. #endif /* HAVE_CRL && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
  19638. #ifdef OPENSSL_EXTRA
  19639. #ifndef NO_WOLFSSL_STUB
  19640. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_lastUpdate(WOLFSSL_X509_CRL* crl)
  19641. {
  19642. (void)crl;
  19643. WOLFSSL_STUB("X509_CRL_get_lastUpdate");
  19644. return 0;
  19645. }
  19646. #endif
  19647. #ifndef NO_WOLFSSL_STUB
  19648. WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_nextUpdate(WOLFSSL_X509_CRL* crl)
  19649. {
  19650. (void)crl;
  19651. WOLFSSL_STUB("X509_CRL_get_nextUpdate");
  19652. return 0;
  19653. }
  19654. #endif
  19655. #ifndef NO_WOLFSSL_STUB
  19656. int wolfSSL_X509_CRL_verify(WOLFSSL_X509_CRL* crl, WOLFSSL_EVP_PKEY* key)
  19657. {
  19658. (void)crl;
  19659. (void)key;
  19660. WOLFSSL_STUB("X509_CRL_verify");
  19661. return 0;
  19662. }
  19663. #endif
  19664. #endif /* OPENSSL_EXTRA */
  19665. #ifdef OPENSSL_EXTRA
  19666. /* Gets pointer to X509_STORE that was used to create context.
  19667. *
  19668. * Return valid pointer on success, NULL if ctx was NULL or not initialized
  19669. */
  19670. WOLFSSL_X509_STORE* wolfSSL_X509_STORE_CTX_get0_store(
  19671. WOLFSSL_X509_STORE_CTX* ctx)
  19672. {
  19673. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get0_store");
  19674. if (ctx == NULL)
  19675. return NULL;
  19676. return ctx->store;
  19677. }
  19678. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_cert(WOLFSSL_X509_STORE_CTX* ctx)
  19679. {
  19680. if (ctx == NULL)
  19681. return NULL;
  19682. return ctx->current_cert;
  19683. }
  19684. void wolfSSL_X509_STORE_CTX_set_time(WOLFSSL_X509_STORE_CTX* ctx,
  19685. unsigned long flags,
  19686. time_t t)
  19687. {
  19688. (void)flags;
  19689. if (ctx == NULL || ctx->param == NULL)
  19690. return;
  19691. ctx->param->check_time = t;
  19692. ctx->param->flags |= WOLFSSL_USE_CHECK_TIME;
  19693. }
  19694. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  19695. #ifndef NO_WOLFSSL_STUB
  19696. int wolfSSL_X509_STORE_CTX_set_purpose(WOLFSSL_X509_STORE_CTX *ctx,
  19697. int purpose)
  19698. {
  19699. (void)ctx;
  19700. (void)purpose;
  19701. WOLFSSL_STUB("wolfSSL_X509_STORE_CTX_set_purpose");
  19702. return 0;
  19703. }
  19704. #endif
  19705. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  19706. #ifndef NO_WOLFSSL_STUB
  19707. /* Returns default file name and path of config file. However
  19708. a wolfssl.cnf file is not currently supported */
  19709. char* wolfSSL_CONF_get1_default_config_file(void)
  19710. {
  19711. WOLFSSL_ENTER("wolfSSL_CONF_get1_default_config_file");
  19712. WOLFSSL_STUB("CONF_get1_default_config_file");
  19713. return NULL;
  19714. }
  19715. #endif
  19716. /******************************************************************************
  19717. * wolfSSL_X509_VERIFY_PARAM_set1_host - sets the DNS hostname to name
  19718. * hostnames is cleared if name is NULL or empty.
  19719. *
  19720. * RETURNS:
  19721. *
  19722. */
  19723. int wolfSSL_X509_VERIFY_PARAM_set1_host(WOLFSSL_X509_VERIFY_PARAM* pParam,
  19724. const char* name,
  19725. unsigned int nameSz)
  19726. {
  19727. unsigned int sz = 0;
  19728. if (pParam == NULL)
  19729. return WOLFSSL_FAILURE;
  19730. XMEMSET(pParam->hostName, 0, WOLFSSL_HOST_NAME_MAX);
  19731. if (name == NULL)
  19732. return WOLFSSL_SUCCESS;
  19733. sz = (unsigned int)XSTRLEN(name);
  19734. /* If name is NUL-terminated, namelen can be set to zero. */
  19735. if(nameSz == 0 || nameSz > sz)
  19736. nameSz = sz;
  19737. if (nameSz > 0 && name[nameSz - 1] == '\0')
  19738. nameSz--;
  19739. if (nameSz > WOLFSSL_HOST_NAME_MAX-1)
  19740. nameSz = WOLFSSL_HOST_NAME_MAX-1;
  19741. if (nameSz > 0)
  19742. XMEMCPY(pParam->hostName, name, nameSz);
  19743. pParam->hostName[nameSz] = '\0';
  19744. return WOLFSSL_SUCCESS;
  19745. }
  19746. /******************************************************************************
  19747. * wolfSSL_get0_param - return a pointer to the SSL verification parameters
  19748. *
  19749. * RETURNS:
  19750. * returns pointer to the SSL verification parameters on success,
  19751. * otherwise returns NULL
  19752. */
  19753. WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl)
  19754. {
  19755. if (ssl == NULL) {
  19756. return NULL;
  19757. }
  19758. return ssl->param;
  19759. }
  19760. /* Set the host flag in the X509_VERIFY_PARAM structure */
  19761. void wolfSSL_X509_VERIFY_PARAM_set_hostflags(WOLFSSL_X509_VERIFY_PARAM* param,
  19762. unsigned int flags)
  19763. {
  19764. if (param != NULL) {
  19765. param->hostFlags = flags;
  19766. }
  19767. }
  19768. /* Sets the expected IP address to ipasc.
  19769. *
  19770. * param is a pointer to the X509_VERIFY_PARAM structure
  19771. * ipasc is a NULL-terminated string with N.N.N.N for IPv4 and
  19772. * HH:HH ... HH:HH for IPv6. There is no validation performed on the
  19773. * parameter, and it must be an exact match with the IP in the cert.
  19774. *
  19775. * return 1 for success and 0 for failure*/
  19776. int wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(WOLFSSL_X509_VERIFY_PARAM *param,
  19777. const char *ipasc)
  19778. {
  19779. int ret = WOLFSSL_FAILURE;
  19780. if (param != NULL) {
  19781. if (ipasc == NULL) {
  19782. param->ipasc[0] = '\0';
  19783. }
  19784. else {
  19785. XSTRNCPY(param->ipasc, ipasc, WOLFSSL_MAX_IPSTR-1);
  19786. param->ipasc[WOLFSSL_MAX_IPSTR-1] = '\0';
  19787. }
  19788. ret = WOLFSSL_SUCCESS;
  19789. }
  19790. return ret;
  19791. }
  19792. #ifndef NO_WOLFSSL_STUB
  19793. void wolfSSL_X509_OBJECT_free_contents(WOLFSSL_X509_OBJECT* obj)
  19794. {
  19795. (void)obj;
  19796. WOLFSSL_STUB("X509_OBJECT_free_contents");
  19797. }
  19798. #endif
  19799. #ifndef NO_ASN_TIME
  19800. int wolfSSL_X509_cmp_current_time(const WOLFSSL_ASN1_TIME* asnTime)
  19801. {
  19802. return wolfSSL_X509_cmp_time(asnTime, NULL);
  19803. }
  19804. /* return -1 if asnTime is earlier than or equal to cmpTime, and 1 otherwise
  19805. * return 0 on error
  19806. */
  19807. int wolfSSL_X509_cmp_time(const WOLFSSL_ASN1_TIME* asnTime, time_t* cmpTime)
  19808. {
  19809. int ret = WOLFSSL_FAILURE, i = 0;
  19810. time_t tmpTime, *pTime = &tmpTime;
  19811. byte data_ptr[MAX_TIME_STRING_SZ], inv = 0;
  19812. struct tm ts, *tmpTs, *ct;
  19813. #if defined(NEED_TMP_TIME)
  19814. /* for use with gmtime_r */
  19815. struct tm tmpTimeStorage;
  19816. tmpTs = &tmpTimeStorage;
  19817. #else
  19818. tmpTs = NULL;
  19819. #endif
  19820. (void)tmpTs;
  19821. if (asnTime == NULL) {
  19822. return WOLFSSL_FAILURE;
  19823. }
  19824. if (cmpTime == NULL) {
  19825. /* Use current time */
  19826. *pTime = XTIME(0);
  19827. }
  19828. else {
  19829. pTime = cmpTime;
  19830. }
  19831. /* Convert ASN1_time to time_t */
  19832. XMEMSET(&ts, 0, sizeof(struct tm));
  19833. /* Check type */
  19834. if (asnTime->type == ASN_UTC_TIME) {
  19835. /* 2-digit year */
  19836. XMEMCPY(data_ptr, &asnTime->data[i], ASN_UTC_TIME_SIZE);
  19837. ts.tm_year = (data_ptr[i] - '0') * 10; i++;
  19838. ts.tm_year += data_ptr[i] - '0'; i++;
  19839. if (ts.tm_year < 70) {
  19840. ts.tm_year += 100;
  19841. }
  19842. }
  19843. else if (asnTime->type == ASN_GENERALIZED_TIME) {
  19844. /* 4-digit year */
  19845. XMEMCPY(data_ptr, &asnTime->data[i], ASN_GENERALIZED_TIME_SIZE);
  19846. ts.tm_year = (data_ptr[i] - '0') * 1000; i++;
  19847. ts.tm_year += (data_ptr[i] - '0') * 100; i++;
  19848. ts.tm_year += (data_ptr[i] - '0') * 10; i++;
  19849. ts.tm_year += data_ptr[i] - '0'; i++;
  19850. ts.tm_year -= 1900;
  19851. }
  19852. else {
  19853. /* Invalid type */
  19854. inv = 1;
  19855. }
  19856. if (inv != 1) {
  19857. ts.tm_mon = (data_ptr[i] - '0') * 10; i++;
  19858. ts.tm_mon += (data_ptr[i] - '0') - 1; i++; /* January is 0 not 1 */
  19859. ts.tm_mday = (data_ptr[i] - '0') * 10; i++;
  19860. ts.tm_mday += (data_ptr[i] - '0'); i++;
  19861. ts.tm_hour = (data_ptr[i] - '0') * 10; i++;
  19862. ts.tm_hour += (data_ptr[i] - '0'); i++;
  19863. ts.tm_min = (data_ptr[i] - '0') * 10; i++;
  19864. ts.tm_min += (data_ptr[i] - '0'); i++;
  19865. ts.tm_sec = (data_ptr[i] - '0') * 10; i++;
  19866. ts.tm_sec += (data_ptr[i] - '0');
  19867. /* Convert to time struct*/
  19868. ct = XGMTIME(pTime, tmpTs);
  19869. if (ct == NULL)
  19870. return GETTIME_ERROR;
  19871. /* DateGreaterThan returns 1 for >; 0 for <= */
  19872. ret = DateGreaterThan(&ts, ct) ? 1 : -1;
  19873. }
  19874. return ret;
  19875. }
  19876. #endif /* !NO_ASN_TIME */
  19877. #if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) && !defined(USER_TIME) && \
  19878. !defined(TIME_OVERRIDES)
  19879. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj_ex(WOLFSSL_ASN1_TIME *asnTime,
  19880. int offset_day, long offset_sec, time_t *in_tm)
  19881. {
  19882. /* get current time if in_tm is null */
  19883. time_t t = in_tm ? *in_tm : XTIME(0);
  19884. return wolfSSL_ASN1_TIME_adj(asnTime, t, offset_day, offset_sec);
  19885. }
  19886. WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj(WOLFSSL_ASN1_TIME *asnTime,
  19887. long offset_sec, time_t *in_tm)
  19888. {
  19889. return wolfSSL_X509_time_adj_ex(asnTime, 0, offset_sec, in_tm);
  19890. }
  19891. #endif
  19892. #ifndef NO_WOLFSSL_STUB
  19893. int wolfSSL_sk_X509_REVOKED_num(WOLFSSL_X509_REVOKED* revoked)
  19894. {
  19895. (void)revoked;
  19896. WOLFSSL_STUB("sk_X509_REVOKED_num");
  19897. return 0;
  19898. }
  19899. #endif
  19900. #ifndef NO_WOLFSSL_STUB
  19901. WOLFSSL_X509_REVOKED* wolfSSL_X509_CRL_get_REVOKED(WOLFSSL_X509_CRL* crl)
  19902. {
  19903. (void)crl;
  19904. WOLFSSL_STUB("X509_CRL_get_REVOKED");
  19905. return 0;
  19906. }
  19907. #endif
  19908. #ifndef NO_WOLFSSL_STUB
  19909. WOLFSSL_X509_REVOKED* wolfSSL_sk_X509_REVOKED_value(
  19910. WOLFSSL_X509_REVOKED* revoked, int value)
  19911. {
  19912. (void)revoked;
  19913. (void)value;
  19914. WOLFSSL_STUB("sk_X509_REVOKED_value");
  19915. return 0;
  19916. }
  19917. #endif
  19918. /* Used to create a new WOLFSSL_ASN1_INTEGER structure.
  19919. * returns a pointer to new structure on success and NULL on failure
  19920. */
  19921. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_new(void)
  19922. {
  19923. WOLFSSL_ASN1_INTEGER* a;
  19924. a = (WOLFSSL_ASN1_INTEGER*)XMALLOC(sizeof(WOLFSSL_ASN1_INTEGER), NULL,
  19925. DYNAMIC_TYPE_OPENSSL);
  19926. if (a == NULL) {
  19927. return NULL;
  19928. }
  19929. XMEMSET(a, 0, sizeof(WOLFSSL_ASN1_INTEGER));
  19930. a->data = a->intData;
  19931. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  19932. a->length = 0;
  19933. return a;
  19934. }
  19935. /* free's internal elements of WOLFSSL_ASN1_INTEGER and free's "in" itself */
  19936. void wolfSSL_ASN1_INTEGER_free(WOLFSSL_ASN1_INTEGER* in)
  19937. {
  19938. if (in != NULL) {
  19939. if (in->isDynamic) {
  19940. XFREE(in->data, NULL, DYNAMIC_TYPE_OPENSSL);
  19941. }
  19942. XFREE(in, NULL, DYNAMIC_TYPE_OPENSSL);
  19943. }
  19944. }
  19945. /* Duplicate all WOLFSSL_ASN1_INTEGER members from src to dup
  19946. * src : WOLFSSL_ASN1_INTEGER to duplicate
  19947. * Returns pointer to duplicate WOLFSSL_ASN1_INTEGER
  19948. */
  19949. WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_dup(const WOLFSSL_ASN1_INTEGER* src)
  19950. {
  19951. WOLFSSL_ASN1_INTEGER* copy;
  19952. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_dup");
  19953. if (!src)
  19954. return NULL;
  19955. copy = wolfSSL_ASN1_INTEGER_new();
  19956. if (copy == NULL)
  19957. return NULL;
  19958. copy->negative = src->negative;
  19959. copy->dataMax = src->dataMax;
  19960. copy->isDynamic = src->isDynamic;
  19961. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  19962. copy->length = src->length;
  19963. #endif
  19964. XSTRNCPY((char*)copy->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX);
  19965. if (copy->isDynamic && src->data && copy->dataMax) {
  19966. copy->data = (unsigned char*)
  19967. XMALLOC(src->dataMax,NULL,DYNAMIC_TYPE_OPENSSL);
  19968. if (copy->data == NULL) {
  19969. wolfSSL_ASN1_INTEGER_free(copy);
  19970. return NULL;
  19971. }
  19972. XMEMCPY(copy->data, src->data, copy->dataMax);
  19973. }
  19974. return copy;
  19975. }
  19976. /* sets the value of WOLFSSL_ASN1_INTEGER a to the long value v. */
  19977. int wolfSSL_ASN1_INTEGER_set(WOLFSSL_ASN1_INTEGER *a, long v)
  19978. {
  19979. int ret = WOLFSSL_SUCCESS; /* return 1 for success and 0 for failure */
  19980. int j;
  19981. unsigned int i = 0;
  19982. unsigned char tmp[sizeof(long)+1] = {0};
  19983. if (a != NULL) {
  19984. /* dynamically create data buffer, +2 for type and length */
  19985. a->data = (unsigned char*)XMALLOC((sizeof(long)+1) + 2, NULL,
  19986. DYNAMIC_TYPE_OPENSSL);
  19987. if (a->data == NULL) {
  19988. wolfSSL_ASN1_INTEGER_free(a);
  19989. ret = WOLFSSL_FAILURE;
  19990. }
  19991. else {
  19992. a->dataMax = (int)(sizeof(long)+1) + 2;
  19993. a->isDynamic = 1;
  19994. }
  19995. }
  19996. else {
  19997. /* Invalid parameter */
  19998. ret = WOLFSSL_FAILURE;
  19999. }
  20000. if (ret != WOLFSSL_FAILURE) {
  20001. /* Set type */
  20002. a->data[i++] = ASN_INTEGER;
  20003. /* Check for negative */
  20004. if (v < 0) {
  20005. a->negative = 1;
  20006. v *= -1;
  20007. }
  20008. /* Create char buffer */
  20009. for (j = 0; j < (int)sizeof(long); j++) {
  20010. if (v == 0) {
  20011. break;
  20012. }
  20013. tmp[j] = (unsigned char)(v & 0xff);
  20014. v >>= 8;
  20015. }
  20016. /* Set length */
  20017. a->data[i++] = (unsigned char)((j == 0) ? ++j : j);
  20018. /* +2 for type and length */
  20019. a->length = j + 2;
  20020. /* Copy to data */
  20021. for (; j > 0; j--) {
  20022. a->data[i++] = tmp[j-1];
  20023. }
  20024. }
  20025. return ret;
  20026. }
  20027. WOLFSSL_ASN1_INTEGER* wolfSSL_X509_get_serialNumber(WOLFSSL_X509* x509)
  20028. {
  20029. WOLFSSL_ASN1_INTEGER* a;
  20030. int i = 0;
  20031. WOLFSSL_ENTER("wolfSSL_X509_get_serialNumber");
  20032. a = wolfSSL_ASN1_INTEGER_new();
  20033. if (a == NULL)
  20034. return NULL;
  20035. /* Make sure there is space for the data, ASN.1 type and length. */
  20036. if (x509->serialSz > (WOLFSSL_ASN1_INTEGER_MAX - 2)) {
  20037. /* dynamically create data buffer, +2 for type and length */
  20038. a->data = (unsigned char*)XMALLOC(x509->serialSz + 2, NULL,
  20039. DYNAMIC_TYPE_OPENSSL);
  20040. if (a->data == NULL) {
  20041. wolfSSL_ASN1_INTEGER_free(a);
  20042. return NULL;
  20043. }
  20044. a->dataMax = x509->serialSz + 2;
  20045. a->isDynamic = 1;
  20046. } else {
  20047. /* Use array instead of dynamic memory */
  20048. a->data = a->intData;
  20049. a->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
  20050. }
  20051. #ifdef WOLFSSL_QT
  20052. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  20053. a->length = x509->serialSz;
  20054. #else
  20055. a->data[i++] = ASN_INTEGER;
  20056. i += SetLength(x509->serialSz, a->data + i);
  20057. XMEMCPY(&a->data[i], x509->serial, x509->serialSz);
  20058. a->length = x509->serialSz + 2;
  20059. #endif
  20060. x509->serialNumber = a;
  20061. return a;
  20062. }
  20063. #endif /* OPENSSL_EXTRA */
  20064. #if defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \
  20065. defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  20066. #ifndef NO_ASN_TIME
  20067. int wolfSSL_ASN1_TIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_TIME* asnTime)
  20068. {
  20069. char buf[MAX_TIME_STRING_SZ];
  20070. int ret = WOLFSSL_SUCCESS;
  20071. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_print");
  20072. if (bio == NULL || asnTime == NULL) {
  20073. WOLFSSL_MSG("NULL function argument");
  20074. return WOLFSSL_FAILURE;
  20075. }
  20076. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)asnTime, buf,
  20077. sizeof(buf)) == NULL) {
  20078. XMEMSET(buf, 0, MAX_TIME_STRING_SZ);
  20079. XSTRNCPY(buf, "Bad time value", sizeof(buf)-1);
  20080. ret = WOLFSSL_FAILURE;
  20081. }
  20082. if (wolfSSL_BIO_write(bio, buf, (int)XSTRLEN(buf)) <= 0) {
  20083. WOLFSSL_MSG("Unable to write to bio");
  20084. return WOLFSSL_FAILURE;
  20085. }
  20086. return ret;
  20087. }
  20088. char* wolfSSL_ASN1_TIME_to_string(WOLFSSL_ASN1_TIME* t, char* buf, int len)
  20089. {
  20090. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_string");
  20091. if (t == NULL || buf == NULL || len < 5) {
  20092. WOLFSSL_MSG("Bad argument");
  20093. return NULL;
  20094. }
  20095. if (t->length > len) {
  20096. WOLFSSL_MSG("Length of date is longer then buffer");
  20097. return NULL;
  20098. }
  20099. if (!GetTimeString(t->data, t->type, buf, len)) {
  20100. return NULL;
  20101. }
  20102. return buf;
  20103. }
  20104. #endif /* !NO_ASN_TIME */
  20105. #endif /* WOLFSSL_MYSQL_COMPATIBLE || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  20106. OPENSSL_EXTRA*/
  20107. #ifdef OPENSSL_EXTRA
  20108. #ifndef NO_WOLFSSL_STUB
  20109. int wolfSSL_ASN1_INTEGER_cmp(const WOLFSSL_ASN1_INTEGER* a,
  20110. const WOLFSSL_ASN1_INTEGER* b)
  20111. {
  20112. (void)a;
  20113. (void)b;
  20114. WOLFSSL_STUB("ASN1_INTEGER_cmp");
  20115. return 0;
  20116. }
  20117. #endif
  20118. #ifndef NO_WOLFSSL_STUB
  20119. long wolfSSL_ASN1_INTEGER_get(const WOLFSSL_ASN1_INTEGER* i)
  20120. {
  20121. (void)i;
  20122. WOLFSSL_STUB("ASN1_INTEGER_get");
  20123. return 0;
  20124. }
  20125. #endif
  20126. #endif /* OPENSSL_EXTRA */
  20127. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  20128. /* get X509_STORE_CTX ex_data, max idx is MAX_EX_DATA */
  20129. void* wolfSSL_X509_STORE_CTX_get_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx)
  20130. {
  20131. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_ex_data");
  20132. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  20133. if (ctx != NULL) {
  20134. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  20135. }
  20136. #else
  20137. (void)ctx;
  20138. (void)idx;
  20139. #endif
  20140. return NULL;
  20141. }
  20142. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  20143. #ifdef OPENSSL_EXTRA
  20144. /* set X509_STORE_CTX ex_data, max idx is MAX_EX_DATA. Return WOLFSSL_SUCCESS
  20145. * on success, WOLFSSL_FAILURE on error. */
  20146. int wolfSSL_X509_STORE_CTX_set_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx,
  20147. void *data)
  20148. {
  20149. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_ex_data");
  20150. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  20151. if (ctx != NULL)
  20152. {
  20153. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  20154. }
  20155. #else
  20156. (void)ctx;
  20157. (void)idx;
  20158. (void)data;
  20159. #endif
  20160. return WOLFSSL_FAILURE;
  20161. }
  20162. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL)
  20163. void wolfSSL_X509_STORE_CTX_set_depth(WOLFSSL_X509_STORE_CTX* ctx, int depth)
  20164. {
  20165. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_depth");
  20166. if (ctx)
  20167. ctx->depth = depth;
  20168. }
  20169. #endif
  20170. WOLFSSL_X509* wolfSSL_X509_STORE_CTX_get0_current_issuer(
  20171. WOLFSSL_X509_STORE_CTX* ctx)
  20172. {
  20173. int ret;
  20174. WOLFSSL_X509* issuer;
  20175. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get0_current_issuer");
  20176. if (ctx == NULL) {
  20177. return NULL;
  20178. }
  20179. ret = wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, ctx->current_cert);
  20180. if (ret == WOLFSSL_SUCCESS) {
  20181. return issuer;
  20182. }
  20183. return NULL;
  20184. }
  20185. #endif /* OPENSSL_EXTRA */
  20186. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  20187. /* Gets an index to store SSL structure at.
  20188. *
  20189. * Returns positive index on success and negative values on failure
  20190. */
  20191. int wolfSSL_get_ex_data_X509_STORE_CTX_idx(void)
  20192. {
  20193. WOLFSSL_ENTER("wolfSSL_get_ex_data_X509_STORE_CTX_idx");
  20194. /* store SSL at index 0 */
  20195. return 0;
  20196. }
  20197. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  20198. #ifdef OPENSSL_EXTRA
  20199. /* Set an error stat in the X509 STORE CTX
  20200. *
  20201. */
  20202. void wolfSSL_X509_STORE_CTX_set_error(WOLFSSL_X509_STORE_CTX* ctx, int er)
  20203. {
  20204. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_error");
  20205. if (ctx != NULL) {
  20206. ctx->error = er;
  20207. }
  20208. }
  20209. /* Set the error depth in the X509 STORE CTX */
  20210. void wolfSSL_X509_STORE_CTX_set_error_depth(WOLFSSL_X509_STORE_CTX* ctx,
  20211. int depth)
  20212. {
  20213. WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_error_depth");
  20214. if (ctx != NULL) {
  20215. ctx->error_depth = depth;
  20216. }
  20217. }
  20218. /* Sets a function callback that will send information about the state of all
  20219. * WOLFSSL objects that have been created by the WOLFSSL_CTX structure passed
  20220. * in.
  20221. *
  20222. * ctx WOLFSSL_CTX structure to set callback function in
  20223. * f callback function to use
  20224. */
  20225. void wolfSSL_CTX_set_info_callback(WOLFSSL_CTX* ctx,
  20226. void (*f)(const WOLFSSL* ssl, int type, int val))
  20227. {
  20228. WOLFSSL_ENTER("wolfSSL_CTX_set_info_callback");
  20229. if (ctx == NULL) {
  20230. WOLFSSL_MSG("Bad function argument");
  20231. }
  20232. else {
  20233. ctx->CBIS = f;
  20234. }
  20235. }
  20236. unsigned long wolfSSL_ERR_peek_error(void)
  20237. {
  20238. WOLFSSL_ENTER("wolfSSL_ERR_peek_error");
  20239. return wolfSSL_ERR_peek_error_line_data(NULL, NULL, NULL, NULL);
  20240. }
  20241. int wolfSSL_ERR_GET_LIB(unsigned long err)
  20242. {
  20243. unsigned long value;
  20244. value = (err & 0xFFFFFFL);
  20245. switch (value) {
  20246. case PEM_R_NO_START_LINE:
  20247. case PEM_R_PROBLEMS_GETTING_PASSWORD:
  20248. case PEM_R_BAD_PASSWORD_READ:
  20249. case PEM_R_BAD_DECRYPT:
  20250. return ERR_LIB_PEM;
  20251. case EVP_R_BAD_DECRYPT:
  20252. case EVP_R_BN_DECODE_ERROR:
  20253. case EVP_R_DECODE_ERROR:
  20254. case EVP_R_PRIVATE_KEY_DECODE_ERROR:
  20255. return ERR_LIB_EVP;
  20256. default:
  20257. return 0;
  20258. }
  20259. }
  20260. /* This function is to find global error values that are the same through out
  20261. * all library version. With wolfSSL having only one set of error codes the
  20262. * return value is pretty straight forward. The only thing needed is all wolfSSL
  20263. * error values are typically negative.
  20264. *
  20265. * Returns the error reason
  20266. */
  20267. int wolfSSL_ERR_GET_REASON(unsigned long err)
  20268. {
  20269. int ret = (int)err;
  20270. WOLFSSL_ENTER("wolfSSL_ERR_GET_REASON");
  20271. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  20272. /* Nginx looks for this error to know to stop parsing certificates. */
  20273. if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE))
  20274. return PEM_R_NO_START_LINE;
  20275. #endif
  20276. /* check if error value is in range of wolfSSL errors */
  20277. ret = 0 - ret; /* setting as negative value */
  20278. /* wolfCrypt range is less than MAX (-100)
  20279. wolfSSL range is MIN (-300) and lower */
  20280. if (ret < MAX_CODE_E && ret > MIN_CODE_E) {
  20281. return ret;
  20282. }
  20283. else {
  20284. WOLFSSL_MSG("Not in range of typical error values");
  20285. ret = (int)err;
  20286. }
  20287. return ret;
  20288. }
  20289. /* returns a string that describes the alert
  20290. *
  20291. * alertID the alert value to look up
  20292. */
  20293. const char* wolfSSL_alert_type_string_long(int alertID)
  20294. {
  20295. WOLFSSL_ENTER("wolfSSL_alert_type_string_long");
  20296. switch (alertID) {
  20297. case close_notify:
  20298. {
  20299. static const char close_notify_str[] =
  20300. "close_notify";
  20301. return close_notify_str;
  20302. }
  20303. case unexpected_message:
  20304. {
  20305. static const char unexpected_message_str[] =
  20306. "unexpected_message";
  20307. return unexpected_message_str;
  20308. }
  20309. case bad_record_mac:
  20310. {
  20311. static const char bad_record_mac_str[] =
  20312. "bad_record_mac";
  20313. return bad_record_mac_str;
  20314. }
  20315. case record_overflow:
  20316. {
  20317. static const char record_overflow_str[] =
  20318. "record_overflow";
  20319. return record_overflow_str;
  20320. }
  20321. case decompression_failure:
  20322. {
  20323. static const char decompression_failure_str[] =
  20324. "decompression_failure";
  20325. return decompression_failure_str;
  20326. }
  20327. case handshake_failure:
  20328. {
  20329. static const char handshake_failure_str[] =
  20330. "handshake_failure";
  20331. return handshake_failure_str;
  20332. }
  20333. case no_certificate:
  20334. {
  20335. static const char no_certificate_str[] =
  20336. "no_certificate";
  20337. return no_certificate_str;
  20338. }
  20339. case bad_certificate:
  20340. {
  20341. static const char bad_certificate_str[] =
  20342. "bad_certificate";
  20343. return bad_certificate_str;
  20344. }
  20345. case unsupported_certificate:
  20346. {
  20347. static const char unsupported_certificate_str[] =
  20348. "unsupported_certificate";
  20349. return unsupported_certificate_str;
  20350. }
  20351. case certificate_revoked:
  20352. {
  20353. static const char certificate_revoked_str[] =
  20354. "certificate_revoked";
  20355. return certificate_revoked_str;
  20356. }
  20357. case certificate_expired:
  20358. {
  20359. static const char certificate_expired_str[] =
  20360. "certificate_expired";
  20361. return certificate_expired_str;
  20362. }
  20363. case certificate_unknown:
  20364. {
  20365. static const char certificate_unknown_str[] =
  20366. "certificate_unknown";
  20367. return certificate_unknown_str;
  20368. }
  20369. case illegal_parameter:
  20370. {
  20371. static const char illegal_parameter_str[] =
  20372. "illegal_parameter";
  20373. return illegal_parameter_str;
  20374. }
  20375. case unknown_ca:
  20376. {
  20377. static const char unknown_ca_str[] =
  20378. "unknown_ca";
  20379. return unknown_ca_str;
  20380. }
  20381. case decode_error:
  20382. {
  20383. static const char decode_error_str[] =
  20384. "decode_error";
  20385. return decode_error_str;
  20386. }
  20387. case decrypt_error:
  20388. {
  20389. static const char decrypt_error_str[] =
  20390. "decrypt_error";
  20391. return decrypt_error_str;
  20392. }
  20393. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  20394. /* catch name conflict for enum protocol with MYSQL build */
  20395. case wc_protocol_version:
  20396. {
  20397. static const char wc_protocol_version_str[] =
  20398. "wc_protocol_version";
  20399. return wc_protocol_version_str;
  20400. }
  20401. #else
  20402. case protocol_version:
  20403. {
  20404. static const char protocol_version_str[] =
  20405. "protocol_version";
  20406. return protocol_version_str;
  20407. }
  20408. #endif
  20409. case no_renegotiation:
  20410. {
  20411. static const char no_renegotiation_str[] =
  20412. "no_renegotiation";
  20413. return no_renegotiation_str;
  20414. }
  20415. case unrecognized_name:
  20416. {
  20417. static const char unrecognized_name_str[] =
  20418. "unrecognized_name";
  20419. return unrecognized_name_str;
  20420. }
  20421. case bad_certificate_status_response:
  20422. {
  20423. static const char bad_certificate_status_response_str[] =
  20424. "bad_certificate_status_response";
  20425. return bad_certificate_status_response_str;
  20426. }
  20427. case no_application_protocol:
  20428. {
  20429. static const char no_application_protocol_str[] =
  20430. "no_application_protocol";
  20431. return no_application_protocol_str;
  20432. }
  20433. default:
  20434. WOLFSSL_MSG("Unknown Alert");
  20435. return NULL;
  20436. }
  20437. }
  20438. const char* wolfSSL_alert_desc_string_long(int alertID)
  20439. {
  20440. WOLFSSL_ENTER("wolfSSL_alert_desc_string_long");
  20441. return wolfSSL_alert_type_string_long(alertID);
  20442. }
  20443. /* Gets the current state of the WOLFSSL structure
  20444. *
  20445. * ssl WOLFSSL structure to get state of
  20446. *
  20447. * Returns a human readable string of the WOLFSSL structure state
  20448. */
  20449. const char* wolfSSL_state_string_long(const WOLFSSL* ssl)
  20450. {
  20451. static const char* OUTPUT_STR[14][6][3] = {
  20452. {
  20453. {"SSLv3 Initialization","SSLv3 Initialization","SSLv3 Initialization"},
  20454. {"TLSv1 Initialization","TLSv2 Initialization","TLSv2 Initialization"},
  20455. {"TLSv1_1 Initialization","TLSv1_1 Initialization","TLSv1_1 Initialization"},
  20456. {"TLSv1_2 Initialization","TLSv1_2 Initialization","TLSv1_2 Initialization"},
  20457. {"DTLSv1 Initialization","DTLSv1 Initialization","DTLSv1 Initialization"},
  20458. {"DTLSv1_2 Initialization","DTLSv1_2 Initialization","DTLSv1_2 Initialization"},
  20459. },
  20460. {
  20461. {"SSLv3 read Server Hello Verify Request",
  20462. "SSLv3 write Server Hello Verify Request",
  20463. "SSLv3 Server Hello Verify Request"},
  20464. {"TLSv1 read Server Hello Verify Request",
  20465. "TLSv1 write Server Hello Verify Request",
  20466. "TLSv1 Server Hello Verify Request"},
  20467. {"TLSv1_1 read Server Hello Verify Request",
  20468. "TLSv1_1 write Server Hello Verify Request",
  20469. "TLSv1_1 Server Hello Verify Request"},
  20470. {"TLSv1_2 read Server Hello Verify Request",
  20471. "TLSv1_2 write Server Hello Verify Request",
  20472. "TLSv1_2 Server Hello Verify Request"},
  20473. {"DTLSv1 read Server Hello Verify Request",
  20474. "DTLSv1 write Server Hello Verify Request",
  20475. "DTLSv1 Server Hello Verify Request"},
  20476. {"DTLSv1_2 read Server Hello Verify Request",
  20477. "DTLSv1_2 write Server Hello Verify Request",
  20478. "DTLSv1_2 Server Hello Verify Request"},
  20479. },
  20480. {
  20481. {"SSLv3 read Server Hello",
  20482. "SSLv3 write Server Hello",
  20483. "SSLv3 Server Hello"},
  20484. {"TLSv1 read Server Hello",
  20485. "TLSv1 write Server Hello",
  20486. "TLSv1 Server Hello"},
  20487. {"TLSv1_1 read Server Hello",
  20488. "TLSv1_1 write Server Hello",
  20489. "TLSv1_1 Server Hello"},
  20490. {"TLSv1_2 read Server Hello",
  20491. "TLSv1_2 write Server Hello",
  20492. "TLSv1_2 Server Hello"},
  20493. {"DTLSv1 read Server Hello",
  20494. "DTLSv1 write Server Hello",
  20495. "DTLSv1 Server Hello"},
  20496. {"DTLSv1_2 read Server Hello"
  20497. "DTLSv1_2 write Server Hello",
  20498. "DTLSv1_2 Server Hello",
  20499. },
  20500. },
  20501. {
  20502. {"SSLv3 read Server Session Ticket",
  20503. "SSLv3 write Server Session Ticket",
  20504. "SSLv3 Server Session Ticket"},
  20505. {"TLSv1 read Server Session Ticket",
  20506. "TLSv1 write Server Session Ticket",
  20507. "TLSv1 Server Session Ticket"},
  20508. {"TLSv1_1 read Server Session Ticket",
  20509. "TLSv1_1 write Server Session Ticket",
  20510. "TLSv1_1 Server Session Ticket"},
  20511. {"TLSv1_2 read Server Session Ticket",
  20512. "TLSv1_2 write Server Session Ticket",
  20513. "TLSv1_2 Server Session Ticket"},
  20514. {"DTLSv1 read Server Session Ticket",
  20515. "DTLSv1 write Server Session Ticket",
  20516. "DTLSv1 Server Session Ticket"},
  20517. {"DTLSv1_2 read Server Session Ticket",
  20518. "DTLSv1_2 write Server Session Ticket",
  20519. "DTLSv1_2 Server Session Ticket"},
  20520. },
  20521. {
  20522. {"SSLv3 read Server Cert",
  20523. "SSLv3 write Server Cert",
  20524. "SSLv3 Server Cert"},
  20525. {"TLSv1 read Server Cert",
  20526. "TLSv1 write Server Cert",
  20527. "TLSv1 Server Cert"},
  20528. {"TLSv1_1 read Server Cert",
  20529. "TLSv1_1 write Server Cert",
  20530. "TLSv1_1 Server Cert"},
  20531. {"TLSv1_2 read Server Cert",
  20532. "TLSv1_2 write Server Cert",
  20533. "TLSv1_2 Server Cert"},
  20534. {"DTLSv1 read Server Cert",
  20535. "DTLSv1 write Server Cert",
  20536. "DTLSv1 Server Cert"},
  20537. {"DTLSv1_2 read Server Cert",
  20538. "DTLSv1_2 write Server Cert",
  20539. "DTLSv1_2 Server Cert"},
  20540. },
  20541. {
  20542. {"SSLv3 read Server Key Exchange",
  20543. "SSLv3 write Server Key Exchange",
  20544. "SSLv3 Server Key Exchange"},
  20545. {"TLSv1 read Server Key Exchange",
  20546. "TLSv1 write Server Key Exchange",
  20547. "TLSv1 Server Key Exchange"},
  20548. {"TLSv1_1 read Server Key Exchange",
  20549. "TLSv1_1 write Server Key Exchange",
  20550. "TLSv1_1 Server Key Exchange"},
  20551. {"TLSv1_2 read Server Key Exchange",
  20552. "TLSv1_2 write Server Key Exchange",
  20553. "TLSv1_2 Server Key Exchange"},
  20554. {"DTLSv1 read Server Key Exchange",
  20555. "DTLSv1 write Server Key Exchange",
  20556. "DTLSv1 Server Key Exchange"},
  20557. {"DTLSv1_2 read Server Key Exchange",
  20558. "DTLSv1_2 write Server Key Exchange",
  20559. "DTLSv1_2 Server Key Exchange"},
  20560. },
  20561. {
  20562. {"SSLv3 read Server Hello Done",
  20563. "SSLv3 write Server Hello Done",
  20564. "SSLv3 Server Hello Done"},
  20565. {"TLSv1 read Server Hello Done",
  20566. "TLSv1 write Server Hello Done",
  20567. "TLSv1 Server Hello Done"},
  20568. {"TLSv1_1 read Server Hello Done",
  20569. "TLSv1_1 write Server Hello Done",
  20570. "TLSv1_1 Server Hello Done"},
  20571. {"TLSv1_2 read Server Hello Done",
  20572. "TLSv1_2 write Server Hello Done",
  20573. "TLSv1_2 Server Hello Done"},
  20574. {"DTLSv1 read Server Hello Done",
  20575. "DTLSv1 write Server Hello Done",
  20576. "DTLSv1 Server Hello Done"},
  20577. {"DTLSv1_2 read Server Hello Done",
  20578. "DTLSv1_2 write Server Hello Done",
  20579. "DTLSv1_2 Server Hello Done"},
  20580. },
  20581. {
  20582. {"SSLv3 read Server Change CipherSpec",
  20583. "SSLv3 write Server Change CipherSpec",
  20584. "SSLv3 Server Change CipherSpec"},
  20585. {"TLSv1 read Server Change CipherSpec",
  20586. "TLSv1 write Server Change CipherSpec",
  20587. "TLSv1 Server Change CipherSpec"},
  20588. {"TLSv1_1 read Server Change CipherSpec",
  20589. "TLSv1_1 write Server Change CipherSpec",
  20590. "TLSv1_1 Server Change CipherSpec"},
  20591. {"TLSv1_2 read Server Change CipherSpec",
  20592. "TLSv1_2 write Server Change CipherSpec",
  20593. "TLSv1_2 Server Change CipherSpec"},
  20594. {"DTLSv1 read Server Change CipherSpec",
  20595. "DTLSv1 write Server Change CipherSpec",
  20596. "DTLSv1 Server Change CipherSpec"},
  20597. {"DTLSv1_2 read Server Change CipherSpec",
  20598. "DTLSv1_2 write Server Change CipherSpec",
  20599. "DTLSv1_2 Server Change CipherSpec"},
  20600. },
  20601. {
  20602. {"SSLv3 read Server Finished",
  20603. "SSLv3 write Server Finished",
  20604. "SSLv3 Server Finished"},
  20605. {"TLSv1 read Server Finished",
  20606. "TLSv1 write Server Finished",
  20607. "TLSv1 Server Finished"},
  20608. {"TLSv1_1 read Server Finished",
  20609. "TLSv1_1 write Server Finished",
  20610. "TLSv1_1 Server Finished"},
  20611. {"TLSv1_2 read Server Finished",
  20612. "TLSv1_2 write Server Finished",
  20613. "TLSv1_2 Server Finished"},
  20614. {"DTLSv1 read Server Finished",
  20615. "DTLSv1 write Server Finished",
  20616. "DTLSv1 Server Finished"},
  20617. {"DTLSv1_2 read Server Finished",
  20618. "DTLSv1_2 write Server Finished",
  20619. "DTLSv1_2 Server Finished"},
  20620. },
  20621. {
  20622. {"SSLv3 read Client Hello",
  20623. "SSLv3 write Client Hello",
  20624. "SSLv3 Client Hello"},
  20625. {"TLSv1 read Client Hello",
  20626. "TLSv1 write Client Hello",
  20627. "TLSv1 Client Hello"},
  20628. {"TLSv1_1 read Client Hello",
  20629. "TLSv1_1 write Client Hello",
  20630. "TLSv1_1 Client Hello"},
  20631. {"TLSv1_2 read Client Hello",
  20632. "TLSv1_2 write Client Hello",
  20633. "TLSv1_2 Client Hello"},
  20634. {"DTLSv1 read Client Hello",
  20635. "DTLSv1 write Client Hello",
  20636. "DTLSv1 Client Hello"},
  20637. {"DTLSv1_2 read Client Hello",
  20638. "DTLSv1_2 write Client Hello",
  20639. "DTLSv1_2 Client Hello"},
  20640. },
  20641. {
  20642. {"SSLv3 read Client Key Exchange",
  20643. "SSLv3 write Client Key Exchange",
  20644. "SSLv3 Client Key Exchange"},
  20645. {"TLSv1 read Client Key Exchange",
  20646. "TLSv1 write Client Key Exchange",
  20647. "TLSv1 Client Key Exchange"},
  20648. {"TLSv1_1 read Client Key Exchange",
  20649. "TLSv1_1 write Client Key Exchange",
  20650. "TLSv1_1 Client Key Exchange"},
  20651. {"TLSv1_2 read Client Key Exchange",
  20652. "TLSv1_2 write Client Key Exchange",
  20653. "TLSv1_2 Client Key Exchange"},
  20654. {"DTLSv1 read Client Key Exchange",
  20655. "DTLSv1 write Client Key Exchange",
  20656. "DTLSv1 Client Key Exchange"},
  20657. {"DTLSv1_2 read Client Key Exchange",
  20658. "DTLSv1_2 write Client Key Exchange",
  20659. "DTLSv1_2 Client Key Exchange"},
  20660. },
  20661. {
  20662. {"SSLv3 read Client Change CipherSpec",
  20663. "SSLv3 write Client Change CipherSpec",
  20664. "SSLv3 Client Change CipherSpec"},
  20665. {"TLSv1 read Client Change CipherSpec",
  20666. "TLSv1 write Client Change CipherSpec",
  20667. "TLSv1 Client Change CipherSpec"},
  20668. {"TLSv1_1 read Client Change CipherSpec",
  20669. "TLSv1_1 write Client Change CipherSpec",
  20670. "TLSv1_1 Client Change CipherSpec"},
  20671. {"TLSv1_2 read Client Change CipherSpec",
  20672. "TLSv1_2 write Client Change CipherSpec",
  20673. "TLSv1_2 Client Change CipherSpec"},
  20674. {"DTLSv1 read Client Change CipherSpec",
  20675. "DTLSv1 write Client Change CipherSpec",
  20676. "DTLSv1 Client Change CipherSpec"},
  20677. {"DTLSv1_2 read Client Change CipherSpec",
  20678. "DTLSv1_2 write Client Change CipherSpec",
  20679. "DTLSv1_2 Client Change CipherSpec"},
  20680. },
  20681. {
  20682. {"SSLv3 read Client Finished",
  20683. "SSLv3 write Client Finished",
  20684. "SSLv3 Client Finished"},
  20685. {"TLSv1 read Client Finished",
  20686. "TLSv1 write Client Finished",
  20687. "TLSv1 Client Finished"},
  20688. {"TLSv1_1 read Client Finished",
  20689. "TLSv1_1 write Client Finished",
  20690. "TLSv1_1 Client Finished"},
  20691. {"TLSv1_2 read Client Finished",
  20692. "TLSv1_2 write Client Finished",
  20693. "TLSv1_2 Client Finished"},
  20694. {"DTLSv1 read Client Finished",
  20695. "DTLSv1 write Client Finished",
  20696. "DTLSv1 Client Finished"},
  20697. {"DTLSv1_2 read Client Finished",
  20698. "DTLSv1_2 write Client Finished",
  20699. "DTLSv1_2 Client Finished"},
  20700. },
  20701. {
  20702. {"SSLv3 Handshake Done",
  20703. "SSLv3 Handshake Done",
  20704. "SSLv3 Handshake Done"},
  20705. {"TLSv1 Handshake Done",
  20706. "TLSv1 Handshake Done",
  20707. "TLSv1 Handshake Done"},
  20708. {"TLSv1_1 Handshake Done",
  20709. "TLSv1_1 Handshake Done",
  20710. "TLSv1_1 Handshake Done"},
  20711. {"TLSv1_2 Handshake Done",
  20712. "TLSv1_2 Handshake Done",
  20713. "TLSv1_2 Handshake Done"},
  20714. {"DTLSv1 Handshake Done",
  20715. "DTLSv1 Handshake Done",
  20716. "DTLSv1 Handshake Done"},
  20717. {"DTLSv1_2 Handshake Done"
  20718. "DTLSv1_2 Handshake Done"
  20719. "DTLSv1_2 Handshake Done"}
  20720. }
  20721. };
  20722. enum ProtocolVer {
  20723. SSL_V3 = 0,
  20724. TLS_V1,
  20725. TLS_V1_1,
  20726. TLS_V1_2,
  20727. DTLS_V1,
  20728. DTLS_V1_2,
  20729. UNKNOWN = 100
  20730. };
  20731. enum IOMode {
  20732. SS_READ = 0,
  20733. SS_WRITE,
  20734. SS_NEITHER
  20735. };
  20736. enum SslState {
  20737. ss_null_state = 0,
  20738. ss_server_helloverify,
  20739. ss_server_hello,
  20740. ss_sessionticket,
  20741. ss_server_cert,
  20742. ss_server_keyexchange,
  20743. ss_server_hellodone,
  20744. ss_server_changecipherspec,
  20745. ss_server_finished,
  20746. ss_client_hello,
  20747. ss_client_keyexchange,
  20748. ss_client_changecipherspec,
  20749. ss_client_finished,
  20750. ss_handshake_done
  20751. };
  20752. int protocol = 0;
  20753. int cbmode = 0;
  20754. int state = 0;
  20755. WOLFSSL_ENTER("wolfSSL_state_string_long");
  20756. if (ssl == NULL) {
  20757. WOLFSSL_MSG("Null argument passed in");
  20758. return NULL;
  20759. }
  20760. /* Get state of callback */
  20761. if (ssl->cbmode == SSL_CB_MODE_WRITE){
  20762. cbmode = SS_WRITE;
  20763. } else if (ssl->cbmode == SSL_CB_MODE_READ){
  20764. cbmode = SS_READ;
  20765. } else {
  20766. cbmode = SS_NEITHER;
  20767. }
  20768. /* Get protocol version */
  20769. switch (ssl->version.major){
  20770. case SSLv3_MAJOR:
  20771. switch (ssl->version.minor){
  20772. case TLSv1_MINOR:
  20773. protocol = TLS_V1;
  20774. break;
  20775. case TLSv1_1_MINOR:
  20776. protocol = TLS_V1_1;
  20777. break;
  20778. case TLSv1_2_MINOR:
  20779. protocol = TLS_V1_2;
  20780. break;
  20781. case SSLv3_MINOR:
  20782. protocol = SSL_V3;
  20783. break;
  20784. default:
  20785. protocol = UNKNOWN;
  20786. }
  20787. break;
  20788. case DTLS_MAJOR:
  20789. switch (ssl->version.minor){
  20790. case DTLS_MINOR:
  20791. protocol = DTLS_V1;
  20792. break;
  20793. case DTLSv1_2_MINOR:
  20794. protocol = DTLS_V1_2;
  20795. break;
  20796. default:
  20797. protocol = UNKNOWN;
  20798. }
  20799. break;
  20800. default:
  20801. protocol = UNKNOWN;
  20802. }
  20803. /* accept process */
  20804. if (ssl->cbmode == SSL_CB_MODE_READ){
  20805. state = ssl->cbtype;
  20806. switch (state) {
  20807. case hello_verify_request:
  20808. state = ss_server_helloverify;
  20809. break;
  20810. case session_ticket:
  20811. state = ss_sessionticket;
  20812. break;
  20813. case server_hello:
  20814. state = ss_server_hello;
  20815. break;
  20816. case server_hello_done:
  20817. state = ss_server_hellodone;
  20818. break;
  20819. case certificate:
  20820. state = ss_server_cert;
  20821. break;
  20822. case server_key_exchange:
  20823. state = ss_server_keyexchange;
  20824. break;
  20825. case client_hello:
  20826. state = ss_client_hello;
  20827. break;
  20828. case client_key_exchange:
  20829. state = ss_client_keyexchange;
  20830. break;
  20831. case finished:
  20832. if (ssl->options.side == WOLFSSL_SERVER_END)
  20833. state = ss_client_finished;
  20834. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  20835. state = ss_server_finished;
  20836. else {
  20837. WOLFSSL_MSG("Unknown State");
  20838. state = ss_null_state;
  20839. }
  20840. break;
  20841. default:
  20842. WOLFSSL_MSG("Unknown State");
  20843. state = ss_null_state;
  20844. }
  20845. } else {
  20846. /* Send process */
  20847. if (ssl->options.side == WOLFSSL_SERVER_END)
  20848. state = ssl->options.serverState;
  20849. else
  20850. state = ssl->options.clientState;
  20851. switch(state){
  20852. case SERVER_HELLOVERIFYREQUEST_COMPLETE:
  20853. state = ss_server_helloverify;
  20854. break;
  20855. case SERVER_HELLO_COMPLETE:
  20856. state = ss_server_hello;
  20857. break;
  20858. case SERVER_CERT_COMPLETE:
  20859. state = ss_server_cert;
  20860. break;
  20861. case SERVER_KEYEXCHANGE_COMPLETE:
  20862. state = ss_server_keyexchange;
  20863. break;
  20864. case SERVER_HELLODONE_COMPLETE:
  20865. state = ss_server_hellodone;
  20866. break;
  20867. case SERVER_CHANGECIPHERSPEC_COMPLETE:
  20868. state = ss_server_changecipherspec;
  20869. break;
  20870. case SERVER_FINISHED_COMPLETE:
  20871. state = ss_server_finished;
  20872. break;
  20873. case CLIENT_HELLO_COMPLETE:
  20874. state = ss_client_hello;
  20875. break;
  20876. case CLIENT_KEYEXCHANGE_COMPLETE:
  20877. state = ss_client_keyexchange;
  20878. break;
  20879. case CLIENT_CHANGECIPHERSPEC_COMPLETE:
  20880. state = ss_client_changecipherspec;
  20881. break;
  20882. case CLIENT_FINISHED_COMPLETE:
  20883. state = ss_client_finished;
  20884. break;
  20885. case HANDSHAKE_DONE:
  20886. state = ss_handshake_done;
  20887. break;
  20888. default:
  20889. WOLFSSL_MSG("Unknown State");
  20890. state = ss_null_state;
  20891. }
  20892. }
  20893. if (protocol == UNKNOWN)
  20894. return NULL;
  20895. else
  20896. return OUTPUT_STR[state][protocol][cbmode];
  20897. }
  20898. /*
  20899. * Sets default PEM callback password if null is passed into
  20900. * the callback parameter of a PEM_read_bio_* function.
  20901. *
  20902. * Returns callback phrase size on success or WOLFSSL_FAILURE otherwise.
  20903. */
  20904. int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key)
  20905. {
  20906. int sz;
  20907. (void)w;
  20908. WOLFSSL_ENTER("wolfSSL_PEM_def_callback");
  20909. /* We assume that the user passes a default password as userdata */
  20910. if (key) {
  20911. sz = (int)XSTRLEN((const char*)key);
  20912. sz = (sz > num) ? num : sz;
  20913. XMEMCPY(name, key, sz);
  20914. return sz;
  20915. } else {
  20916. WOLFSSL_MSG("Error, default password cannot be created.");
  20917. return WOLFSSL_FAILURE;
  20918. }
  20919. }
  20920. #endif /* OPENSSL_EXTRA */
  20921. static long wolf_set_options(long old_op, long op)
  20922. {
  20923. /* if SSL_OP_ALL then turn all bug workarounds on */
  20924. if ((op & SSL_OP_ALL) == SSL_OP_ALL) {
  20925. WOLFSSL_MSG("\tSSL_OP_ALL");
  20926. }
  20927. /* by default cookie exchange is on with DTLS */
  20928. if ((op & SSL_OP_COOKIE_EXCHANGE) == SSL_OP_COOKIE_EXCHANGE) {
  20929. WOLFSSL_MSG("\tSSL_OP_COOKIE_EXCHANGE : on by default");
  20930. }
  20931. if ((op & WOLFSSL_OP_NO_SSLv2) == WOLFSSL_OP_NO_SSLv2) {
  20932. WOLFSSL_MSG("\tWOLFSSL_OP_NO_SSLv2 : wolfSSL does not support SSLv2");
  20933. }
  20934. #ifdef SSL_OP_NO_TLSv1_3
  20935. if ((op & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  20936. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_3");
  20937. }
  20938. #endif
  20939. if ((op & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
  20940. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_2");
  20941. }
  20942. if ((op & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
  20943. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_1");
  20944. }
  20945. if ((op & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
  20946. WOLFSSL_MSG("\tSSL_OP_NO_TLSv1");
  20947. }
  20948. if ((op & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
  20949. WOLFSSL_MSG("\tSSL_OP_NO_SSLv3");
  20950. }
  20951. if ((op & SSL_OP_CIPHER_SERVER_PREFERENCE) == SSL_OP_CIPHER_SERVER_PREFERENCE) {
  20952. WOLFSSL_MSG("\tSSL_OP_CIPHER_SERVER_PREFERENCE");
  20953. }
  20954. if ((op & SSL_OP_NO_COMPRESSION) == SSL_OP_NO_COMPRESSION) {
  20955. #ifdef HAVE_LIBZ
  20956. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION");
  20957. #else
  20958. WOLFSSL_MSG("SSL_OP_NO_COMPRESSION: compression not compiled in");
  20959. #endif
  20960. }
  20961. return old_op | op;
  20962. }
  20963. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  20964. long wolfSSL_set_options(WOLFSSL* ssl, long op)
  20965. {
  20966. word16 haveRSA = 1;
  20967. word16 havePSK = 0;
  20968. int keySz = 0;
  20969. WOLFSSL_ENTER("wolfSSL_set_options");
  20970. if (ssl == NULL) {
  20971. return 0;
  20972. }
  20973. ssl->options.mask = wolf_set_options(ssl->options.mask, op);
  20974. #ifdef SSL_OP_NO_TLSv1_3
  20975. if ((ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  20976. if (ssl->version.minor == TLSv1_3_MINOR)
  20977. ssl->version.minor = TLSv1_2_MINOR;
  20978. }
  20979. #endif
  20980. if ((ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  20981. if (ssl->version.minor == TLSv1_2_MINOR)
  20982. ssl->version.minor = TLSv1_1_MINOR;
  20983. }
  20984. if ((ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  20985. if (ssl->version.minor == TLSv1_1_MINOR)
  20986. ssl->version.minor = TLSv1_MINOR;
  20987. }
  20988. if ((ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  20989. if (ssl->version.minor == TLSv1_MINOR)
  20990. ssl->version.minor = SSLv3_MINOR;
  20991. }
  20992. if ((ssl->options.mask & SSL_OP_NO_COMPRESSION) == SSL_OP_NO_COMPRESSION) {
  20993. #ifdef HAVE_LIBZ
  20994. ssl->options.usingCompression = 0;
  20995. #endif
  20996. }
  20997. /* in the case of a version change the cipher suites should be reset */
  20998. #ifndef NO_PSK
  20999. havePSK = ssl->options.havePSK;
  21000. #endif
  21001. #ifdef NO_RSA
  21002. haveRSA = 0;
  21003. #endif
  21004. #ifndef NO_CERTS
  21005. keySz = ssl->buffers.keySz;
  21006. #endif
  21007. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  21008. ssl->options.haveDH, ssl->options.haveNTRU,
  21009. ssl->options.haveECDSAsig, ssl->options.haveECC,
  21010. ssl->options.haveStaticECC, ssl->options.side);
  21011. return ssl->options.mask;
  21012. }
  21013. long wolfSSL_get_options(const WOLFSSL* ssl)
  21014. {
  21015. WOLFSSL_ENTER("wolfSSL_get_options");
  21016. if(ssl == NULL)
  21017. return WOLFSSL_FAILURE;
  21018. return ssl->options.mask;
  21019. }
  21020. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  21021. #ifdef OPENSSL_EXTRA
  21022. long wolfSSL_clear_options(WOLFSSL* ssl, long opt)
  21023. {
  21024. WOLFSSL_ENTER("SSL_clear_options");
  21025. if(ssl == NULL)
  21026. return WOLFSSL_FAILURE;
  21027. ssl->options.mask &= ~opt;
  21028. return ssl->options.mask;
  21029. }
  21030. #if defined(HAVE_SECURE_RENEGOTIATION) \
  21031. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  21032. /* clears the counter for number of renegotiations done
  21033. * returns the current count before it is cleared */
  21034. long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
  21035. {
  21036. long total;
  21037. WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
  21038. if (s == NULL)
  21039. return 0;
  21040. total = s->secure_rene_count;
  21041. s->secure_rene_count = 0;
  21042. return total;
  21043. }
  21044. /* return the number of renegotiations since wolfSSL_new */
  21045. long wolfSSL_total_renegotiations(WOLFSSL *s)
  21046. {
  21047. WOLFSSL_ENTER("wolfSSL_total_renegotiations");
  21048. return wolfSSL_num_renegotiations(s);
  21049. }
  21050. /* return the number of renegotiations since wolfSSL_new */
  21051. long wolfSSL_num_renegotiations(WOLFSSL* s)
  21052. {
  21053. if (s == NULL) {
  21054. return 0;
  21055. }
  21056. return s->secure_rene_count;
  21057. }
  21058. /* Is there a renegotiation currently in progress? */
  21059. int wolfSSL_SSL_renegotiate_pending(WOLFSSL *s)
  21060. {
  21061. return s && s->options.handShakeDone &&
  21062. s->options.handShakeState != HANDSHAKE_DONE ? 1 : 0;
  21063. }
  21064. #endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
  21065. #ifndef NO_DH
  21066. long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh)
  21067. {
  21068. int pSz, gSz;
  21069. byte *p, *g;
  21070. int ret = 0;
  21071. WOLFSSL_ENTER("wolfSSL_set_tmp_dh");
  21072. if (!ssl || !dh)
  21073. return BAD_FUNC_ARG;
  21074. /* Get needed size for p and g */
  21075. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  21076. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  21077. if (pSz <= 0 || gSz <= 0)
  21078. return WOLFSSL_FATAL_ERROR;
  21079. p = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21080. if (!p)
  21081. return MEMORY_E;
  21082. g = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21083. if (!g) {
  21084. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21085. return MEMORY_E;
  21086. }
  21087. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  21088. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  21089. if (pSz >= 0 && gSz >= 0) /* Conversion successful */
  21090. ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz);
  21091. XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21092. XFREE(g, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21093. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  21094. }
  21095. #endif /* !NO_DH */
  21096. #ifdef HAVE_PK_CALLBACKS
  21097. long wolfSSL_set_tlsext_debug_arg(WOLFSSL* ssl, void *arg)
  21098. {
  21099. if (ssl == NULL) {
  21100. return WOLFSSL_FAILURE;
  21101. }
  21102. ssl->loggingCtx = arg;
  21103. return WOLFSSL_SUCCESS;
  21104. }
  21105. #endif /* HAVE_PK_CALLBACKS */
  21106. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  21107. const unsigned char *SSL_SESSION_get0_id_context(const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length)
  21108. {
  21109. const byte *c = wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length);
  21110. return c;
  21111. }
  21112. #endif
  21113. /*** TBD ***/
  21114. #ifndef NO_WOLFSSL_STUB
  21115. WOLFSSL_API int wolfSSL_sk_SSL_COMP_zero(WOLFSSL_STACK* st)
  21116. {
  21117. (void)st;
  21118. WOLFSSL_STUB("wolfSSL_sk_SSL_COMP_zero");
  21119. /* wolfSSL_set_options(ssl, SSL_OP_NO_COMPRESSION); */
  21120. return WOLFSSL_FAILURE;
  21121. }
  21122. #endif
  21123. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  21124. long wolfSSL_set_tlsext_status_type(WOLFSSL *s, int type)
  21125. {
  21126. WOLFSSL_ENTER("wolfSSL_set_tlsext_status_type");
  21127. if (s == NULL){
  21128. return BAD_FUNC_ARG;
  21129. }
  21130. if (type == TLSEXT_STATUSTYPE_ocsp){
  21131. int r = 0;
  21132. r = TLSX_UseCertificateStatusRequest(&s->extensions, type, 0, s,
  21133. s->heap, s->devId);
  21134. return (long)r;
  21135. } else {
  21136. WOLFSSL_MSG(
  21137. "SSL_set_tlsext_status_type only supports TLSEXT_STATUSTYPE_ocsp type.");
  21138. return SSL_FAILURE;
  21139. }
  21140. }
  21141. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  21142. #ifndef NO_WOLFSSL_STUB
  21143. WOLFSSL_API long wolfSSL_get_tlsext_status_exts(WOLFSSL *s, void *arg)
  21144. {
  21145. (void)s;
  21146. (void)arg;
  21147. WOLFSSL_STUB("wolfSSL_get_tlsext_status_exts");
  21148. return WOLFSSL_FAILURE;
  21149. }
  21150. #endif
  21151. /*** TBD ***/
  21152. #ifndef NO_WOLFSSL_STUB
  21153. WOLFSSL_API long wolfSSL_set_tlsext_status_exts(WOLFSSL *s, void *arg)
  21154. {
  21155. (void)s;
  21156. (void)arg;
  21157. WOLFSSL_STUB("wolfSSL_set_tlsext_status_exts");
  21158. return WOLFSSL_FAILURE;
  21159. }
  21160. #endif
  21161. /*** TBD ***/
  21162. #ifndef NO_WOLFSSL_STUB
  21163. WOLFSSL_API long wolfSSL_get_tlsext_status_ids(WOLFSSL *s, void *arg)
  21164. {
  21165. (void)s;
  21166. (void)arg;
  21167. WOLFSSL_STUB("wolfSSL_get_tlsext_status_ids");
  21168. return WOLFSSL_FAILURE;
  21169. }
  21170. #endif
  21171. /*** TBD ***/
  21172. #ifndef NO_WOLFSSL_STUB
  21173. WOLFSSL_API long wolfSSL_set_tlsext_status_ids(WOLFSSL *s, void *arg)
  21174. {
  21175. (void)s;
  21176. (void)arg;
  21177. WOLFSSL_STUB("wolfSSL_set_tlsext_status_ids");
  21178. return WOLFSSL_FAILURE;
  21179. }
  21180. #endif
  21181. /*** TBD ***/
  21182. #ifndef NO_WOLFSSL_STUB
  21183. WOLFSSL_API int SSL_SESSION_set1_id(WOLFSSL_SESSION *s, const unsigned char *sid, unsigned int sid_len)
  21184. {
  21185. (void)s;
  21186. (void)sid;
  21187. (void)sid_len;
  21188. WOLFSSL_STUB("SSL_SESSION_set1_id");
  21189. return WOLFSSL_FAILURE;
  21190. }
  21191. #endif
  21192. #ifndef NO_WOLFSSL_STUB
  21193. /*** TBD ***/
  21194. WOLFSSL_API int SSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, const unsigned char *sid_ctx, unsigned int sid_ctx_len)
  21195. {
  21196. (void)s;
  21197. (void)sid_ctx;
  21198. (void)sid_ctx_len;
  21199. WOLFSSL_STUB("SSL_SESSION_set1_id_context");
  21200. return WOLFSSL_FAILURE;
  21201. }
  21202. #endif
  21203. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) \
  21204. || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  21205. WOLFSSL_X509_ALGOR* wolfSSL_X509_ALGOR_new(void)
  21206. {
  21207. WOLFSSL_X509_ALGOR* ret;
  21208. ret = (WOLFSSL_X509_ALGOR*)XMALLOC(sizeof(WOLFSSL_X509_ALGOR), NULL,
  21209. DYNAMIC_TYPE_OPENSSL);
  21210. if (ret) {
  21211. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ALGOR));
  21212. }
  21213. return ret;
  21214. }
  21215. void wolfSSL_X509_ALGOR_free(WOLFSSL_X509_ALGOR *alg)
  21216. {
  21217. if (alg) {
  21218. wolfSSL_ASN1_OBJECT_free(alg->algorithm);
  21219. wolfSSL_ASN1_TYPE_free(alg->parameter);
  21220. XFREE(alg, NULL, DYNAMIC_TYPE_OPENSSL);
  21221. }
  21222. }
  21223. /* Returns X509_ALGOR struct with signature algorithm */
  21224. const WOLFSSL_X509_ALGOR* wolfSSL_X509_get0_tbs_sigalg(const WOLFSSL_X509 *x509)
  21225. {
  21226. WOLFSSL_ENTER("X509_get0_tbs_sigalg");
  21227. if (x509 == NULL) {
  21228. WOLFSSL_MSG("x509 struct NULL error");
  21229. return NULL;
  21230. }
  21231. return &x509->algor;
  21232. }
  21233. /* Sets paobj pointer to X509_ALGOR signature algorithm */
  21234. void wolfSSL_X509_ALGOR_get0(const WOLFSSL_ASN1_OBJECT **paobj, int *pptype,
  21235. const void **ppval, const WOLFSSL_X509_ALGOR *algor)
  21236. {
  21237. WOLFSSL_ENTER("X509_ALGOR_get0");
  21238. if (!algor) {
  21239. WOLFSSL_MSG("algor object is NULL");
  21240. return;
  21241. }
  21242. if (paobj)
  21243. *paobj = algor->algorithm;
  21244. if (ppval)
  21245. *ppval = algor->algorithm;
  21246. if (pptype) {
  21247. if (algor->parameter) {
  21248. *pptype = algor->parameter->type;
  21249. }
  21250. else {
  21251. /* Default to V_ASN1_OBJECT */
  21252. *pptype = V_ASN1_OBJECT;
  21253. }
  21254. }
  21255. }
  21256. /**
  21257. * Populate algor members.
  21258. *
  21259. * @param algor The object to be set
  21260. * @param aobj The value to be set in algor->algorithm
  21261. * @param ptype The type of algor->parameter
  21262. * @param pval The value of algor->parameter
  21263. * @return WOLFSSL_SUCCESS on success
  21264. * WOLFSSL_FAILURE on missing parameters or bad malloc
  21265. */
  21266. int wolfSSL_X509_ALGOR_set0(WOLFSSL_X509_ALGOR *algor, WOLFSSL_ASN1_OBJECT *aobj,
  21267. int ptype, void *pval)
  21268. {
  21269. if (!algor) {
  21270. return WOLFSSL_FAILURE;
  21271. }
  21272. if (aobj) {
  21273. algor->algorithm = aobj;
  21274. }
  21275. if (pval) {
  21276. if (!algor->parameter) {
  21277. algor->parameter = wolfSSL_ASN1_TYPE_new();
  21278. if (!algor->parameter) {
  21279. return WOLFSSL_FAILURE;
  21280. }
  21281. }
  21282. wolfSSL_ASN1_TYPE_set(algor->parameter, ptype, pval);
  21283. }
  21284. return WOLFSSL_SUCCESS;
  21285. }
  21286. /**
  21287. * Set `a` in a smart way.
  21288. *
  21289. * @param a Object to set
  21290. * @param type The type of object in value
  21291. * @param value Object to set
  21292. */
  21293. void wolfSSL_ASN1_TYPE_set(WOLFSSL_ASN1_TYPE *a, int type, void *value)
  21294. {
  21295. if (!a || !value) {
  21296. return;
  21297. }
  21298. switch (type) {
  21299. case V_ASN1_OBJECT:
  21300. a->value.object = (WOLFSSL_ASN1_OBJECT*)value;
  21301. break;
  21302. case V_ASN1_UTCTIME:
  21303. a->value.utctime = (WOLFSSL_ASN1_TIME*)value;
  21304. break;
  21305. case V_ASN1_GENERALIZEDTIME:
  21306. a->value.generalizedtime = (WOLFSSL_ASN1_TIME*)value;
  21307. break;
  21308. default:
  21309. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  21310. return;
  21311. }
  21312. a->type = type;
  21313. }
  21314. /**
  21315. * Allocate a new WOLFSSL_ASN1_TYPE object.
  21316. *
  21317. * @return New zero'ed WOLFSSL_ASN1_TYPE object
  21318. */
  21319. WOLFSSL_ASN1_TYPE* wolfSSL_ASN1_TYPE_new(void)
  21320. {
  21321. WOLFSSL_ASN1_TYPE* ret = (WOLFSSL_ASN1_TYPE*)XMALLOC(sizeof(WOLFSSL_ASN1_TYPE),
  21322. NULL, DYNAMIC_TYPE_OPENSSL);
  21323. if (!ret)
  21324. return NULL;
  21325. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TYPE));
  21326. return ret;
  21327. }
  21328. /**
  21329. * Free WOLFSSL_ASN1_TYPE and all its members.
  21330. *
  21331. * @param at Object to free
  21332. */
  21333. void wolfSSL_ASN1_TYPE_free(WOLFSSL_ASN1_TYPE* at)
  21334. {
  21335. if (at) {
  21336. switch (at->type) {
  21337. case V_ASN1_OBJECT:
  21338. wolfSSL_ASN1_OBJECT_free(at->value.object);
  21339. break;
  21340. case V_ASN1_UTCTIME:
  21341. wolfSSL_ASN1_TIME_free(at->value.utctime);
  21342. break;
  21343. case V_ASN1_GENERALIZEDTIME:
  21344. wolfSSL_ASN1_TIME_free(at->value.generalizedtime);
  21345. break;
  21346. default:
  21347. WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
  21348. break;
  21349. }
  21350. XFREE(at, NULL, DYNAMIC_TYPE_OPENSSL);
  21351. }
  21352. }
  21353. /**
  21354. * Allocate a new WOLFSSL_X509_PUBKEY object.
  21355. *
  21356. * @return New zero'ed WOLFSSL_X509_PUBKEY object
  21357. */
  21358. WOLFSSL_X509_PUBKEY *wolfSSL_X509_PUBKEY_new(void)
  21359. {
  21360. WOLFSSL_X509_PUBKEY *ret;
  21361. ret = (WOLFSSL_X509_PUBKEY*)XMALLOC(sizeof(WOLFSSL_X509_PUBKEY), NULL,
  21362. DYNAMIC_TYPE_OPENSSL);
  21363. if (!ret) {
  21364. return NULL;
  21365. }
  21366. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PUBKEY));
  21367. ret->algor = wolfSSL_X509_ALGOR_new();
  21368. if (!ret->algor) {
  21369. wolfSSL_X509_PUBKEY_free(ret);
  21370. return NULL;
  21371. }
  21372. return ret;
  21373. }
  21374. /**
  21375. * Free WOLFSSL_X509_PUBKEY and all its members.
  21376. *
  21377. * @param at Object to free
  21378. */
  21379. void wolfSSL_X509_PUBKEY_free(WOLFSSL_X509_PUBKEY *x)
  21380. {
  21381. if (x) {
  21382. if (x->algor) {
  21383. wolfSSL_X509_ALGOR_free(x->algor);
  21384. }
  21385. if (x->pkey) {
  21386. wolfSSL_EVP_PKEY_free(x->pkey);
  21387. }
  21388. XFREE(x, NULL, DYNAMIC_TYPE_OPENSSL);
  21389. }
  21390. }
  21391. /* Returns X509_PUBKEY structure containing X509_ALGOR and EVP_PKEY */
  21392. WOLFSSL_X509_PUBKEY* wolfSSL_X509_get_X509_PUBKEY(const WOLFSSL_X509* x509)
  21393. {
  21394. WOLFSSL_ENTER("X509_get_X509_PUBKEY");
  21395. if (x509 == NULL) {
  21396. WOLFSSL_MSG("x509 struct NULL error");
  21397. return NULL;
  21398. }
  21399. return (WOLFSSL_X509_PUBKEY*)&x509->key;
  21400. }
  21401. /* Sets ppkalg pointer to X509_PUBKEY algorithm. Returns WOLFSSL_SUCCESS on
  21402. success or WOLFSSL_FAILURE on error. */
  21403. int wolfSSL_X509_PUBKEY_get0_param(WOLFSSL_ASN1_OBJECT **ppkalg,
  21404. const unsigned char **pk, int *ppklen, WOLFSSL_X509_ALGOR **pa,
  21405. WOLFSSL_X509_PUBKEY *pub)
  21406. {
  21407. WOLFSSL_ENTER("X509_PUBKEY_get0_param");
  21408. if (!pub || !pub->pubKeyOID) {
  21409. WOLFSSL_MSG("X509_PUBKEY struct not populated");
  21410. return WOLFSSL_FAILURE;
  21411. }
  21412. if (!pub->algor) {
  21413. if (!(pub->algor = wolfSSL_X509_ALGOR_new())) {
  21414. return WOLFSSL_FAILURE;
  21415. }
  21416. pub->algor->algorithm = wolfSSL_OBJ_nid2obj(pub->pubKeyOID);
  21417. if (pub->algor->algorithm == NULL) {
  21418. WOLFSSL_MSG("Failed to create object from NID");
  21419. return WOLFSSL_FAILURE;
  21420. }
  21421. }
  21422. if (pa)
  21423. *pa = pub->algor;
  21424. if (ppkalg)
  21425. *ppkalg = pub->algor->algorithm;
  21426. if (pk)
  21427. *pk = (unsigned char*)pub->pkey->pkey.ptr;
  21428. if (ppklen)
  21429. *ppklen = pub->pkey->pkey_sz;
  21430. return WOLFSSL_SUCCESS;
  21431. }
  21432. /* Returns a pointer to the pkey when passed a key */
  21433. WOLFSSL_EVP_PKEY* wolfSSL_X509_PUBKEY_get(WOLFSSL_X509_PUBKEY* key)
  21434. {
  21435. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_get");
  21436. if(key == NULL || key->pkey == NULL){
  21437. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_FUNC_ARG);
  21438. return NULL;
  21439. }
  21440. WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", WOLFSSL_SUCCESS);
  21441. return key->pkey;
  21442. }
  21443. int wolfSSL_X509_PUBKEY_set(WOLFSSL_X509_PUBKEY **x, WOLFSSL_EVP_PKEY *key)
  21444. {
  21445. WOLFSSL_X509_PUBKEY *pk = NULL;
  21446. WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_set");
  21447. if (!x || !key) {
  21448. return WOLFSSL_FAILURE;
  21449. }
  21450. if (!(pk = wolfSSL_X509_PUBKEY_new())) {
  21451. return WOLFSSL_FAILURE;
  21452. }
  21453. switch (key->type) {
  21454. #ifndef NO_RSA
  21455. case EVP_PKEY_RSA:
  21456. pk->algor->algorithm= wolfSSL_OBJ_nid2obj(RSAk);
  21457. break;
  21458. #endif
  21459. #ifndef NO_DSA
  21460. case EVP_PKEY_DSA:
  21461. pk->algor->algorithm = wolfSSL_OBJ_nid2obj(DSAk);
  21462. break;
  21463. #endif
  21464. #ifdef HAVE_ECC
  21465. case EVP_PKEY_EC:
  21466. pk->algor->algorithm = wolfSSL_OBJ_nid2obj(ECDSAk);
  21467. break;
  21468. #endif
  21469. default:
  21470. WOLFSSL_MSG("Unknown key type");
  21471. goto error;
  21472. }
  21473. if (!pk->algor->algorithm) {
  21474. WOLFSSL_MSG("Failed to create algorithm object");
  21475. goto error;
  21476. }
  21477. if (!wolfSSL_EVP_PKEY_up_ref(key)) {
  21478. WOLFSSL_MSG("Failed to up key reference");
  21479. goto error;
  21480. }
  21481. pk->pkey = key;
  21482. wolfSSL_X509_PUBKEY_free(*x);
  21483. *x = pk;
  21484. return WOLFSSL_SUCCESS;
  21485. error:
  21486. if (pk) {
  21487. wolfSSL_X509_PUBKEY_free(pk);
  21488. }
  21489. return WOLFSSL_FAILURE;
  21490. }
  21491. #endif /* OPENSSL_ALL || WOLFSSL_APACHE_HTTPD || WOLFSSL_HAPROXY*/
  21492. #ifndef NO_WOLFSSL_STUB
  21493. /*** TBD ***/
  21494. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_get_privatekey(const WOLFSSL *ssl)
  21495. {
  21496. (void)ssl;
  21497. WOLFSSL_STUB("SSL_get_privatekey");
  21498. return NULL;
  21499. }
  21500. #endif
  21501. #ifndef NO_WOLFSSL_STUB
  21502. /*** TBD ***/
  21503. WOLFSSL_API int i2t_ASN1_OBJECT(char *buf, int buf_len, WOLFSSL_ASN1_OBJECT *a)
  21504. {
  21505. (void)buf;
  21506. (void)buf_len;
  21507. (void)a;
  21508. WOLFSSL_STUB("i2t_ASN1_OBJECT");
  21509. return -1;
  21510. }
  21511. #endif
  21512. /* Return number of bytes written to BIO on success. 0 on failure. */
  21513. WOLFSSL_API int wolfSSL_i2a_ASN1_OBJECT(WOLFSSL_BIO *bp,
  21514. WOLFSSL_ASN1_OBJECT *a)
  21515. {
  21516. int length = 0;
  21517. word32 idx = 0;
  21518. const char null_str[] = "NULL";
  21519. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_OBJECT");
  21520. if (bp == NULL)
  21521. return WOLFSSL_FAILURE;
  21522. if (a == NULL) {
  21523. /* Write "NULL" */
  21524. if (wolfSSL_BIO_write(bp, null_str, (int)XSTRLEN(null_str)) ==
  21525. (int)XSTRLEN(null_str)) {
  21526. return (int)XSTRLEN(null_str);
  21527. }
  21528. else {
  21529. return WOLFSSL_FAILURE;
  21530. }
  21531. }
  21532. if ((a->obj == NULL) || (a->obj[idx++] != ASN_OBJECT_ID)) {
  21533. WOLFSSL_MSG("Bad ASN1 Object");
  21534. return WOLFSSL_FAILURE;
  21535. }
  21536. if (GetLength((const byte*)a->obj, &idx, &length,
  21537. a->objSz) < 0 || length < 0) {
  21538. return WOLFSSL_FAILURE;
  21539. }
  21540. if (wolfSSL_BIO_write(bp, a->obj + idx, length) == (int)length) {
  21541. return length;
  21542. }
  21543. return WOLFSSL_FAILURE;
  21544. }
  21545. int wolfSSL_i2d_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT *a, unsigned char **pp)
  21546. {
  21547. byte *p;
  21548. WOLFSSL_ENTER("wolfSSL_i2d_ASN1_OBJECT");
  21549. if (!a || !a->obj) {
  21550. WOLFSSL_MSG("Bad parameters");
  21551. return WOLFSSL_FAILURE;
  21552. }
  21553. if (!pp)
  21554. return a->objSz;
  21555. if (*pp)
  21556. p = *pp;
  21557. else {
  21558. p = (byte*)XMALLOC(a->objSz, NULL, DYNAMIC_TYPE_OPENSSL);
  21559. if (!p) {
  21560. WOLFSSL_MSG("Bad malloc");
  21561. return WOLFSSL_FAILURE;
  21562. }
  21563. }
  21564. XMEMCPY(p, a->obj, a->objSz);
  21565. *pp = p + a->objSz;
  21566. return a->objSz;
  21567. }
  21568. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
  21569. #ifndef NO_WOLFSSL_STUB
  21570. /*** TBD ***/
  21571. WOLFSSL_API size_t SSL_get_finished(const WOLFSSL *s, void *buf, size_t count)
  21572. {
  21573. (void)s;
  21574. (void)buf;
  21575. (void)count;
  21576. WOLFSSL_STUB("SSL_get_finished");
  21577. return WOLFSSL_FAILURE;
  21578. }
  21579. #endif
  21580. #ifndef NO_WOLFSSL_STUB
  21581. /*** TBD ***/
  21582. WOLFSSL_API size_t SSL_get_peer_finished(const WOLFSSL *s, void *buf, size_t count)
  21583. {
  21584. (void)s;
  21585. (void)buf;
  21586. (void)count;
  21587. WOLFSSL_STUB("SSL_get_peer_finished");
  21588. return WOLFSSL_FAILURE;
  21589. }
  21590. #endif
  21591. #endif /* WOLFSSL_HAPROXY */
  21592. #ifndef NO_WOLFSSL_STUB
  21593. /*** TBD ***/
  21594. WOLFSSL_API void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx, WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength))
  21595. {
  21596. (void)ctx;
  21597. (void)dh;
  21598. WOLFSSL_STUB("SSL_CTX_set_tmp_dh_callback");
  21599. }
  21600. #endif
  21601. #ifndef NO_WOLFSSL_STUB
  21602. /*** TBD ***/
  21603. WOLFSSL_API WOLF_STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
  21604. {
  21605. WOLFSSL_STUB("SSL_COMP_get_compression_methods");
  21606. return NULL;
  21607. }
  21608. #endif
  21609. int wolfSSL_sk_SSL_CIPHER_num(const WOLF_STACK_OF(WOLFSSL_CIPHER)* p)
  21610. {
  21611. WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_num");
  21612. if (p == NULL) {
  21613. return WOLFSSL_FATAL_ERROR;
  21614. }
  21615. return (int)p->num;
  21616. }
  21617. #if !defined(NO_FILESYSTEM)
  21618. #ifndef NO_WOLFSSL_STUB
  21619. /*** TBD ***/
  21620. WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PrivateKey(XFILE fp, WOLFSSL_EVP_PKEY **x, pem_password_cb *cb, void *u)
  21621. {
  21622. (void)fp;
  21623. (void)x;
  21624. (void)cb;
  21625. (void)u;
  21626. WOLFSSL_STUB("PEM_read_PrivateKey");
  21627. return NULL;
  21628. }
  21629. #endif
  21630. #endif
  21631. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  21632. /* Loads certificate(s) files in pem format into X509_STORE struct from either
  21633. * a file or directory.
  21634. * Returns WOLFSSL_SUCCESS on success or WOLFSSL_FAILURE if an error occurs.
  21635. */
  21636. WOLFSSL_API int wolfSSL_X509_STORE_load_locations(WOLFSSL_X509_STORE *str,
  21637. const char *file, const char *dir)
  21638. {
  21639. WOLFSSL_CTX* ctx;
  21640. char *name = NULL;
  21641. int ret = WOLFSSL_SUCCESS;
  21642. int successes = 0;
  21643. #ifdef WOLFSSL_SMALL_STACK
  21644. ReadDirCtx* readCtx = NULL;
  21645. #else
  21646. ReadDirCtx readCtx[1];
  21647. #endif
  21648. WOLFSSL_ENTER("X509_STORE_load_locations");
  21649. if (str == NULL || str->cm == NULL || (file == NULL && dir == NULL))
  21650. return WOLFSSL_FAILURE;
  21651. /* tmp ctx for setting our cert manager */
  21652. ctx = wolfSSL_CTX_new(cm_pick_method());
  21653. if (ctx == NULL)
  21654. return WOLFSSL_FAILURE;
  21655. wolfSSL_CertManagerFree(ctx->cm);
  21656. ctx->cm = str->cm;
  21657. #ifdef HAVE_CRL
  21658. if (str->cm->crl == NULL) {
  21659. if (wolfSSL_CertManagerEnableCRL(str->cm, 0) != WOLFSSL_SUCCESS) {
  21660. WOLFSSL_MSG("Enable CRL failed");
  21661. wolfSSL_CTX_free(ctx);
  21662. return WOLFSSL_FAILURE;
  21663. }
  21664. }
  21665. #endif
  21666. /* Load individual file */
  21667. if (file) {
  21668. /* Try to process file with type DETECT_CERT_TYPE to parse the
  21669. correct certificate header and footer type */
  21670. ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, DETECT_CERT_TYPE,
  21671. NULL, 0, str->cm->crl, 0);
  21672. if (ret != WOLFSSL_SUCCESS) {
  21673. WOLFSSL_MSG("Failed to load file");
  21674. ret = WOLFSSL_FAILURE;
  21675. }
  21676. }
  21677. /* Load files in dir */
  21678. if (dir && ret == WOLFSSL_SUCCESS) {
  21679. #ifdef WOLFSSL_SMALL_STACK
  21680. readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap,
  21681. DYNAMIC_TYPE_TMP_BUFFER);
  21682. if (readCtx == NULL) {
  21683. WOLFSSL_MSG("Memory error");
  21684. wolfSSL_CTX_free(ctx);
  21685. return WOLFSSL_FAILURE;
  21686. }
  21687. #endif
  21688. /* try to load each regular file in dir */
  21689. ret = wc_ReadDirFirst(readCtx, dir, &name);
  21690. while (ret == 0 && name) {
  21691. WOLFSSL_MSG(name);
  21692. /* Try to process file with type DETECT_CERT_TYPE to parse the
  21693. correct certificate header and footer type */
  21694. ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, DETECT_CERT_TYPE,
  21695. NULL, 0, str->cm->crl, 0);
  21696. /* Not failing on load errors */
  21697. if (ret != WOLFSSL_SUCCESS)
  21698. WOLFSSL_MSG("Failed to load file in path, continuing");
  21699. else
  21700. successes++;
  21701. ret = wc_ReadDirNext(readCtx, dir, &name);
  21702. }
  21703. wc_ReadDirClose(readCtx);
  21704. /* Success if at least one file in dir was loaded */
  21705. if (successes > 0)
  21706. ret = WOLFSSL_SUCCESS;
  21707. else {
  21708. WOLFSSL_ERROR(ret);
  21709. ret = WOLFSSL_FAILURE;
  21710. }
  21711. #ifdef WOLFSSL_SMALL_STACK
  21712. XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX);
  21713. #endif
  21714. }
  21715. ctx->cm = NULL;
  21716. wolfSSL_CTX_free(ctx);
  21717. return ret;
  21718. }
  21719. #endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */
  21720. #ifndef NO_WOLFSSL_STUB
  21721. /*** TBD ***/
  21722. WOLFSSL_API WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(void *ciphers, int idx)
  21723. {
  21724. (void)ciphers;
  21725. (void)idx;
  21726. WOLFSSL_STUB("wolfSSL_sk_SSL_CIPHER_value");
  21727. return NULL;
  21728. }
  21729. #endif
  21730. WOLFSSL_API void ERR_load_SSL_strings(void)
  21731. {
  21732. }
  21733. #ifdef HAVE_OCSP
  21734. WOLFSSL_API long wolfSSL_get_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char **resp)
  21735. {
  21736. if (s == NULL || resp == NULL)
  21737. return 0;
  21738. *resp = s->ocspResp;
  21739. return s->ocspRespSz;
  21740. }
  21741. WOLFSSL_API long wolfSSL_set_tlsext_status_ocsp_resp(WOLFSSL *s, unsigned char *resp, int len)
  21742. {
  21743. if (s == NULL)
  21744. return WOLFSSL_FAILURE;
  21745. s->ocspResp = resp;
  21746. s->ocspRespSz = len;
  21747. return WOLFSSL_SUCCESS;
  21748. }
  21749. #endif /* HAVE_OCSP */
  21750. #endif /* OPENSSL_EXTRA */
  21751. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  21752. long wolfSSL_get_verify_result(const WOLFSSL *ssl)
  21753. {
  21754. if (ssl == NULL) {
  21755. return WOLFSSL_FAILURE;
  21756. }
  21757. return ssl->peerVerifyRet;
  21758. }
  21759. #endif
  21760. #ifdef OPENSSL_EXTRA
  21761. #ifndef NO_WOLFSSL_STUB
  21762. /* shows the number of accepts attempted by CTX in it's lifetime */
  21763. long wolfSSL_CTX_sess_accept(WOLFSSL_CTX* ctx)
  21764. {
  21765. WOLFSSL_STUB("wolfSSL_CTX_sess_accept");
  21766. (void)ctx;
  21767. return 0;
  21768. }
  21769. #endif
  21770. #ifndef NO_WOLFSSL_STUB
  21771. /* shows the number of connects attempted CTX in it's lifetime */
  21772. long wolfSSL_CTX_sess_connect(WOLFSSL_CTX* ctx)
  21773. {
  21774. WOLFSSL_STUB("wolfSSL_CTX_sess_connect");
  21775. (void)ctx;
  21776. return 0;
  21777. }
  21778. #endif
  21779. #ifndef NO_WOLFSSL_STUB
  21780. /* shows the number of accepts completed by CTX in it's lifetime */
  21781. long wolfSSL_CTX_sess_accept_good(WOLFSSL_CTX* ctx)
  21782. {
  21783. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_good");
  21784. (void)ctx;
  21785. return 0;
  21786. }
  21787. #endif
  21788. #ifndef NO_WOLFSSL_STUB
  21789. /* shows the number of connects completed by CTX in it's lifetime */
  21790. long wolfSSL_CTX_sess_connect_good(WOLFSSL_CTX* ctx)
  21791. {
  21792. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_good");
  21793. (void)ctx;
  21794. return 0;
  21795. }
  21796. #endif
  21797. #ifndef NO_WOLFSSL_STUB
  21798. /* shows the number of renegotiation accepts attempted by CTX */
  21799. long wolfSSL_CTX_sess_accept_renegotiate(WOLFSSL_CTX* ctx)
  21800. {
  21801. WOLFSSL_STUB("wolfSSL_CTX_sess_accept_renegotiate");
  21802. (void)ctx;
  21803. return 0;
  21804. }
  21805. #endif
  21806. #ifndef NO_WOLFSSL_STUB
  21807. /* shows the number of renegotiation accepts attempted by CTX */
  21808. long wolfSSL_CTX_sess_connect_renegotiate(WOLFSSL_CTX* ctx)
  21809. {
  21810. WOLFSSL_STUB("wolfSSL_CTX_sess_connect_renegotiate");
  21811. (void)ctx;
  21812. return 0;
  21813. }
  21814. #endif
  21815. #ifndef NO_WOLFSSL_STUB
  21816. long wolfSSL_CTX_sess_hits(WOLFSSL_CTX* ctx)
  21817. {
  21818. WOLFSSL_STUB("wolfSSL_CTX_sess_hits");
  21819. (void)ctx;
  21820. return 0;
  21821. }
  21822. #endif
  21823. #ifndef NO_WOLFSSL_STUB
  21824. long wolfSSL_CTX_sess_cb_hits(WOLFSSL_CTX* ctx)
  21825. {
  21826. WOLFSSL_STUB("wolfSSL_CTX_sess_cb_hits");
  21827. (void)ctx;
  21828. return 0;
  21829. }
  21830. #endif
  21831. #ifndef NO_WOLFSSL_STUB
  21832. long wolfSSL_CTX_sess_cache_full(WOLFSSL_CTX* ctx)
  21833. {
  21834. WOLFSSL_STUB("wolfSSL_CTX_sess_cache_full");
  21835. (void)ctx;
  21836. return 0;
  21837. }
  21838. #endif
  21839. #ifndef NO_WOLFSSL_STUB
  21840. long wolfSSL_CTX_sess_misses(WOLFSSL_CTX* ctx)
  21841. {
  21842. WOLFSSL_STUB("wolfSSL_CTX_sess_misses");
  21843. (void)ctx;
  21844. return 0;
  21845. }
  21846. #endif
  21847. #ifndef NO_WOLFSSL_STUB
  21848. long wolfSSL_CTX_sess_timeouts(WOLFSSL_CTX* ctx)
  21849. {
  21850. WOLFSSL_STUB("wolfSSL_CTX_sess_timeouts");
  21851. (void)ctx;
  21852. return 0;
  21853. }
  21854. #endif
  21855. /* Return the total number of sessions */
  21856. long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx)
  21857. {
  21858. word32 total = 0;
  21859. WOLFSSL_ENTER("wolfSSL_CTX_sess_number");
  21860. (void)ctx;
  21861. #ifdef WOLFSSL_SESSION_STATS
  21862. if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != SSL_SUCCESS) {
  21863. WOLFSSL_MSG("Error getting session stats");
  21864. }
  21865. #else
  21866. WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats");
  21867. #endif
  21868. return (long)total;
  21869. }
  21870. #ifndef NO_CERTS
  21871. long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  21872. {
  21873. byte* chain = NULL;
  21874. long chainSz = 0;
  21875. int derSz;
  21876. const byte* der;
  21877. int ret;
  21878. int idx = 0;
  21879. DerBuffer *derBuffer = NULL;
  21880. WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert");
  21881. if (ctx == NULL || x509 == NULL) {
  21882. WOLFSSL_MSG("Bad Argument");
  21883. return WOLFSSL_FAILURE;
  21884. }
  21885. der = wolfSSL_X509_get_der(x509, &derSz);
  21886. if (der == NULL || derSz <= 0) {
  21887. WOLFSSL_MSG("Error getting X509 DER");
  21888. return WOLFSSL_FAILURE;
  21889. }
  21890. if (ctx->certificate == NULL) {
  21891. WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format");
  21892. /* Process buffer makes first certificate the leaf. */
  21893. ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE,
  21894. NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx));
  21895. if (ret != WOLFSSL_SUCCESS) {
  21896. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  21897. return WOLFSSL_FAILURE;
  21898. }
  21899. }
  21900. else {
  21901. /* TODO: Do this elsewhere. */
  21902. ret = AllocDer(&derBuffer, derSz, CERT_TYPE, ctx->heap);
  21903. if (ret != 0) {
  21904. WOLFSSL_MSG("Memory Error");
  21905. return WOLFSSL_FAILURE;
  21906. }
  21907. XMEMCPY(derBuffer->buffer, der, derSz);
  21908. ret = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA,
  21909. GET_VERIFY_SETTING_CTX(ctx));
  21910. if (ret != WOLFSSL_SUCCESS) {
  21911. WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret);
  21912. return WOLFSSL_FAILURE;
  21913. }
  21914. /* adding cert to existing chain */
  21915. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  21916. chainSz += ctx->certChain->length;
  21917. }
  21918. chainSz += OPAQUE24_LEN + derSz;
  21919. chain = (byte*)XMALLOC(chainSz, ctx->heap, DYNAMIC_TYPE_DER);
  21920. if (chain == NULL) {
  21921. WOLFSSL_MSG("Memory Error");
  21922. return WOLFSSL_FAILURE;
  21923. }
  21924. if (ctx->certChain != NULL && ctx->certChain->length > 0) {
  21925. XMEMCPY(chain, ctx->certChain->buffer, ctx->certChain->length);
  21926. idx = ctx->certChain->length;
  21927. }
  21928. c32to24(derSz, chain + idx);
  21929. idx += OPAQUE24_LEN,
  21930. XMEMCPY(chain + idx, der, derSz);
  21931. idx += derSz;
  21932. #ifdef WOLFSSL_TLS13
  21933. ctx->certChainCnt++;
  21934. #endif
  21935. FreeDer(&ctx->certChain);
  21936. ret = AllocDer(&ctx->certChain, idx, CERT_TYPE, ctx->heap);
  21937. if (ret == 0) {
  21938. XMEMCPY(ctx->certChain->buffer, chain, idx);
  21939. }
  21940. }
  21941. /* on success WOLFSSL_X509 memory is responsibility of ctx */
  21942. wolfSSL_X509_free(x509);
  21943. if (chain != NULL)
  21944. XFREE(chain, ctx->heap, DYNAMIC_TYPE_DER);
  21945. return WOLFSSL_SUCCESS;
  21946. }
  21947. long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg)
  21948. {
  21949. if (ctx == NULL || ctx->cm == NULL) {
  21950. return WOLFSSL_FAILURE;
  21951. }
  21952. ctx->cm->ocspIOCtx = arg;
  21953. return WOLFSSL_SUCCESS;
  21954. }
  21955. #endif /* NO_CERTS */
  21956. /* Get the session cache mode for CTX
  21957. *
  21958. * ctx WOLFSSL_CTX struct to get cache mode from
  21959. *
  21960. * Returns a bit mask that has the session cache mode */
  21961. WOLFSSL_API long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx)
  21962. {
  21963. long m = 0;
  21964. WOLFSSL_ENTER("SSL_CTX_set_session_cache_mode");
  21965. if (ctx == NULL) {
  21966. return m;
  21967. }
  21968. if (ctx->sessionCacheOff != 1) {
  21969. m |= SSL_SESS_CACHE_SERVER;
  21970. }
  21971. if (ctx->sessionCacheFlushOff == 1) {
  21972. m |= SSL_SESS_CACHE_NO_AUTO_CLEAR;
  21973. }
  21974. #ifdef HAVE_EXT_CACHE
  21975. if (ctx->internalCacheOff == 1) {
  21976. m |= SSL_SESS_CACHE_NO_INTERNAL_STORE;
  21977. }
  21978. #endif
  21979. return m;
  21980. }
  21981. int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx)
  21982. {
  21983. if (ctx == NULL) {
  21984. return WOLFSSL_FAILURE;
  21985. }
  21986. return ctx->readAhead;
  21987. }
  21988. int wolfSSL_CTX_set_read_ahead(WOLFSSL_CTX* ctx, int v)
  21989. {
  21990. if (ctx == NULL) {
  21991. return WOLFSSL_FAILURE;
  21992. }
  21993. ctx->readAhead = (byte)v;
  21994. return WOLFSSL_SUCCESS;
  21995. }
  21996. long wolfSSL_CTX_set_tlsext_opaque_prf_input_callback_arg(WOLFSSL_CTX* ctx,
  21997. void* arg)
  21998. {
  21999. if (ctx == NULL) {
  22000. return WOLFSSL_FAILURE;
  22001. }
  22002. ctx->userPRFArg = arg;
  22003. return WOLFSSL_SUCCESS;
  22004. }
  22005. #ifndef NO_DES3
  22006. /* 0 on success */
  22007. int wolfSSL_DES_set_key(WOLFSSL_const_DES_cblock* myDes,
  22008. WOLFSSL_DES_key_schedule* key)
  22009. {
  22010. #ifdef WOLFSSL_CHECK_DESKEY
  22011. return wolfSSL_DES_set_key_checked(myDes, key);
  22012. #else
  22013. wolfSSL_DES_set_key_unchecked(myDes, key);
  22014. return 0;
  22015. #endif
  22016. }
  22017. /* return true in fail case (1) */
  22018. static int DES_check(word32 mask, word32 mask2, unsigned char* key)
  22019. {
  22020. word32 value[2];
  22021. /* sanity check on length made in wolfSSL_DES_set_key_checked */
  22022. value[0] = mask;
  22023. value[1] = mask2;
  22024. return (XMEMCMP(value, key, sizeof(value)) == 0)? 1: 0;
  22025. }
  22026. /* check that the key is odd parity and is not a weak key
  22027. * returns -1 if parity is wrong, -2 if weak/null key and 0 on success */
  22028. int wolfSSL_DES_set_key_checked(WOLFSSL_const_DES_cblock* myDes,
  22029. WOLFSSL_DES_key_schedule* key)
  22030. {
  22031. if (myDes == NULL || key == NULL) {
  22032. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_set_key_checked");
  22033. return -2;
  22034. }
  22035. else {
  22036. word32 sz = sizeof(WOLFSSL_DES_key_schedule);
  22037. /* sanity check before call to DES_check */
  22038. if (sz != (sizeof(word32) * 2)) {
  22039. WOLFSSL_MSG("Unexpected WOLFSSL_DES_key_schedule size");
  22040. return -2;
  22041. }
  22042. /* check odd parity */
  22043. if (wolfSSL_DES_check_key_parity(myDes) != 1) {
  22044. WOLFSSL_MSG("Odd parity test fail");
  22045. return -1;
  22046. }
  22047. if (wolfSSL_DES_is_weak_key(myDes) == 1) {
  22048. WOLFSSL_MSG("Weak key found");
  22049. return -2;
  22050. }
  22051. /* passed tests, now copy over key */
  22052. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  22053. return 0;
  22054. }
  22055. }
  22056. /* check is not weak. Weak key list from Nist "Recommendation for the Triple
  22057. * Data Encryption Algorithm (TDEA) Block Cipher"
  22058. *
  22059. * returns 1 if is weak 0 if not
  22060. */
  22061. int wolfSSL_DES_is_weak_key(WOLFSSL_const_DES_cblock* key)
  22062. {
  22063. word32 mask, mask2;
  22064. WOLFSSL_ENTER("wolfSSL_DES_is_weak_key");
  22065. if (key == NULL) {
  22066. WOLFSSL_MSG("NULL key passed in");
  22067. return 1;
  22068. }
  22069. mask = 0x01010101; mask2 = 0x01010101;
  22070. if (DES_check(mask, mask2, *key)) {
  22071. WOLFSSL_MSG("Weak key found");
  22072. return 1;
  22073. }
  22074. mask = 0xFEFEFEFE; mask2 = 0xFEFEFEFE;
  22075. if (DES_check(mask, mask2, *key)) {
  22076. WOLFSSL_MSG("Weak key found");
  22077. return 1;
  22078. }
  22079. mask = 0xE0E0E0E0; mask2 = 0xF1F1F1F1;
  22080. if (DES_check(mask, mask2, *key)) {
  22081. WOLFSSL_MSG("Weak key found");
  22082. return 1;
  22083. }
  22084. mask = 0x1F1F1F1F; mask2 = 0x0E0E0E0E;
  22085. if (DES_check(mask, mask2, *key)) {
  22086. WOLFSSL_MSG("Weak key found");
  22087. return 1;
  22088. }
  22089. /* semi-weak *key check (list from same Nist paper) */
  22090. mask = 0x011F011F; mask2 = 0x010E010E;
  22091. if (DES_check(mask, mask2, *key) ||
  22092. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  22093. WOLFSSL_MSG("Weak key found");
  22094. return 1;
  22095. }
  22096. mask = 0x01E001E0; mask2 = 0x01F101F1;
  22097. if (DES_check(mask, mask2, *key) ||
  22098. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  22099. WOLFSSL_MSG("Weak key found");
  22100. return 1;
  22101. }
  22102. mask = 0x01FE01FE; mask2 = 0x01FE01FE;
  22103. if (DES_check(mask, mask2, *key) ||
  22104. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  22105. WOLFSSL_MSG("Weak key found");
  22106. return 1;
  22107. }
  22108. mask = 0x1FE01FE0; mask2 = 0x0EF10EF1;
  22109. if (DES_check(mask, mask2, *key) ||
  22110. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  22111. WOLFSSL_MSG("Weak key found");
  22112. return 1;
  22113. }
  22114. mask = 0x1FFE1FFE; mask2 = 0x0EFE0EFE;
  22115. if (DES_check(mask, mask2, *key) ||
  22116. DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) {
  22117. WOLFSSL_MSG("Weak key found");
  22118. return 1;
  22119. }
  22120. return 0;
  22121. }
  22122. void wolfSSL_DES_set_key_unchecked(WOLFSSL_const_DES_cblock* myDes,
  22123. WOLFSSL_DES_key_schedule* key)
  22124. {
  22125. if (myDes != NULL && key != NULL) {
  22126. XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock));
  22127. }
  22128. }
  22129. /* Sets the parity of the DES key for use */
  22130. void wolfSSL_DES_set_odd_parity(WOLFSSL_DES_cblock* myDes)
  22131. {
  22132. word32 i;
  22133. word32 sz = sizeof(WOLFSSL_DES_cblock);
  22134. WOLFSSL_ENTER("wolfSSL_DES_set_odd_parity");
  22135. for (i = 0; i < sz; i++) {
  22136. unsigned char c = (*myDes)[i];
  22137. if ((
  22138. ((c >> 1) & 0x01) ^
  22139. ((c >> 2) & 0x01) ^
  22140. ((c >> 3) & 0x01) ^
  22141. ((c >> 4) & 0x01) ^
  22142. ((c >> 5) & 0x01) ^
  22143. ((c >> 6) & 0x01) ^
  22144. ((c >> 7) & 0x01)) == (c & 0x01)) {
  22145. WOLFSSL_MSG("Flipping parity bit");
  22146. (*myDes)[i] = c ^ 0x01;
  22147. }
  22148. }
  22149. }
  22150. int wolfSSL_DES_check_key_parity(WOLFSSL_DES_cblock *myDes)
  22151. {
  22152. word32 i;
  22153. word32 sz = sizeof(WOLFSSL_DES_cblock);
  22154. WOLFSSL_ENTER("wolfSSL_DES_check_key_parity");
  22155. for (i = 0; i < sz; i++) {
  22156. unsigned char c = (*myDes)[i];
  22157. if ((
  22158. ((c >> 1) & 0x01) ^
  22159. ((c >> 2) & 0x01) ^
  22160. ((c >> 3) & 0x01) ^
  22161. ((c >> 4) & 0x01) ^
  22162. ((c >> 5) & 0x01) ^
  22163. ((c >> 6) & 0x01) ^
  22164. ((c >> 7) & 0x01)) == (c & 0x01)) {
  22165. return 0;
  22166. }
  22167. }
  22168. return 1;
  22169. }
  22170. #ifdef WOLFSSL_DES_ECB
  22171. /* Encrypt or decrypt input message desa with key and get output in desb.
  22172. * if enc is DES_ENCRYPT,input message is encrypted or
  22173. * if enc is DES_DECRYPT,input message is decrypted.
  22174. * */
  22175. void wolfSSL_DES_ecb_encrypt(WOLFSSL_DES_cblock* desa,
  22176. WOLFSSL_DES_cblock* desb, WOLFSSL_DES_key_schedule* key, int enc)
  22177. {
  22178. Des myDes;
  22179. WOLFSSL_ENTER("wolfSSL_DES_ecb_encrypt");
  22180. if (desa == NULL || key == NULL || desb == NULL ||
  22181. (enc != DES_ENCRYPT && enc != DES_DECRYPT)) {
  22182. WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_ecb_encrypt");
  22183. } else {
  22184. if (wc_Des_SetKey(&myDes, (const byte*) key,
  22185. (const byte*) NULL, !enc) != 0) {
  22186. WOLFSSL_MSG("wc_Des_SetKey return error.");
  22187. return;
  22188. }
  22189. if (enc){
  22190. if (wc_Des_EcbEncrypt(&myDes, (byte*) desb, (const byte*) desa,
  22191. sizeof(WOLFSSL_DES_cblock)) != 0){
  22192. WOLFSSL_MSG("wc_Des_EcbEncrypt return error.");
  22193. }
  22194. } else {
  22195. if (wc_Des_EcbDecrypt(&myDes, (byte*) desb, (const byte*) desa,
  22196. sizeof(WOLFSSL_DES_cblock)) != 0){
  22197. WOLFSSL_MSG("wc_Des_EcbDecrpyt return error.");
  22198. }
  22199. }
  22200. }
  22201. }
  22202. #endif
  22203. #endif /* NO_DES3 */
  22204. #ifndef NO_RC4
  22205. /* Set the key state for Arc4 structure.
  22206. *
  22207. * key Arc4 structure to use
  22208. * len length of data buffer
  22209. * data initial state to set Arc4 structure
  22210. */
  22211. void wolfSSL_RC4_set_key(WOLFSSL_RC4_KEY* key, int len,
  22212. const unsigned char* data)
  22213. {
  22214. typedef char rc4_test[sizeof(WOLFSSL_RC4_KEY) >= sizeof(Arc4) ? 1 : -1];
  22215. (void)sizeof(rc4_test);
  22216. WOLFSSL_ENTER("wolfSSL_RC4_set_key");
  22217. if (key == NULL || len < 0) {
  22218. WOLFSSL_MSG("bad argument passed in");
  22219. return;
  22220. }
  22221. XMEMSET(key, 0, sizeof(WOLFSSL_RC4_KEY));
  22222. wc_Arc4SetKey((Arc4*)key, data, (word32)len);
  22223. }
  22224. /* Encrypt/decrypt with Arc4 structure.
  22225. *
  22226. * len length of buffer to encrypt/decrypt (in/out)
  22227. * in buffer to encrypt/decrypt
  22228. * out results of encryption/decryption
  22229. */
  22230. void wolfSSL_RC4(WOLFSSL_RC4_KEY* key, size_t len,
  22231. const unsigned char* in, unsigned char* out)
  22232. {
  22233. WOLFSSL_ENTER("wolfSSL_RC4");
  22234. if (key == NULL || in == NULL || out == NULL) {
  22235. WOLFSSL_MSG("Bad argument passed in");
  22236. return;
  22237. }
  22238. wc_Arc4Process((Arc4*)key, out, in, (word32)len);
  22239. }
  22240. #endif /* NO_RC4 */
  22241. #ifndef NO_AES
  22242. #ifdef WOLFSSL_AES_DIRECT
  22243. /* AES encrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  22244. *
  22245. * input Data to encrypt
  22246. * output Encrypted data after done
  22247. * key AES key to use for encryption
  22248. */
  22249. void wolfSSL_AES_encrypt(const unsigned char* input, unsigned char* output,
  22250. AES_KEY *key)
  22251. {
  22252. WOLFSSL_ENTER("wolfSSL_AES_encrypt");
  22253. if (input == NULL || output == NULL || key == NULL) {
  22254. WOLFSSL_MSG("Null argument passed in");
  22255. return;
  22256. }
  22257. wc_AesEncryptDirect((Aes*)key, output, input);
  22258. }
  22259. /* AES decrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input.
  22260. *
  22261. * input Data to decrypt
  22262. * output Decrypted data after done
  22263. * key AES key to use for encryption
  22264. */
  22265. void wolfSSL_AES_decrypt(const unsigned char* input, unsigned char* output,
  22266. AES_KEY *key)
  22267. {
  22268. WOLFSSL_ENTER("wolfSSL_AES_decrypt");
  22269. if (input == NULL || output == NULL || key == NULL) {
  22270. WOLFSSL_MSG("Null argument passed in");
  22271. return;
  22272. }
  22273. wc_AesDecryptDirect((Aes*)key, output, input);
  22274. }
  22275. #endif /* WOLFSSL_AES_DIRECT */
  22276. /* Setup of an AES key to use for encryption.
  22277. *
  22278. * key key in bytes to use for encryption
  22279. * bits size of key in bits
  22280. * aes AES structure to initialize
  22281. */
  22282. int wolfSSL_AES_set_encrypt_key(const unsigned char *key, const int bits,
  22283. AES_KEY *aes)
  22284. {
  22285. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  22286. (void)sizeof(aes_test);
  22287. WOLFSSL_ENTER("wolfSSL_AES_set_encrypt_key");
  22288. if (key == NULL || aes == NULL) {
  22289. WOLFSSL_MSG("Null argument passed in");
  22290. return -1;
  22291. }
  22292. XMEMSET(aes, 0, sizeof(AES_KEY));
  22293. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_ENCRYPTION) != 0) {
  22294. WOLFSSL_MSG("Error in setting AES key");
  22295. return -1;
  22296. }
  22297. return 0;
  22298. }
  22299. /* Setup of an AES key to use for decryption.
  22300. *
  22301. * key key in bytes to use for decryption
  22302. * bits size of key in bits
  22303. * aes AES structure to initialize
  22304. */
  22305. int wolfSSL_AES_set_decrypt_key(const unsigned char *key, const int bits,
  22306. AES_KEY *aes)
  22307. {
  22308. typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1];
  22309. (void)sizeof(aes_test);
  22310. WOLFSSL_ENTER("wolfSSL_AES_set_decrypt_key");
  22311. if (key == NULL || aes == NULL) {
  22312. WOLFSSL_MSG("Null argument passed in");
  22313. return -1;
  22314. }
  22315. XMEMSET(aes, 0, sizeof(AES_KEY));
  22316. if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_DECRYPTION) != 0) {
  22317. WOLFSSL_MSG("Error in setting AES key");
  22318. return -1;
  22319. }
  22320. return 0;
  22321. }
  22322. #ifdef HAVE_AES_ECB
  22323. /* Encrypt/decrypt a 16 byte block of data using the key passed in.
  22324. *
  22325. * in buffer to encrypt/decrypt
  22326. * out buffer to hold result of encryption/decryption
  22327. * key AES structure to use with encryption/decryption
  22328. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  22329. */
  22330. void wolfSSL_AES_ecb_encrypt(const unsigned char *in, unsigned char* out,
  22331. AES_KEY *key, const int enc)
  22332. {
  22333. Aes* aes;
  22334. WOLFSSL_ENTER("wolfSSL_AES_ecb_encrypt");
  22335. if (key == NULL || in == NULL || out == NULL) {
  22336. WOLFSSL_MSG("Error, Null argument passed in");
  22337. return;
  22338. }
  22339. aes = (Aes*)key;
  22340. if (enc == AES_ENCRYPT) {
  22341. if (wc_AesEcbEncrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  22342. WOLFSSL_MSG("Error with AES CBC encrypt");
  22343. }
  22344. }
  22345. else {
  22346. #ifdef HAVE_AES_DECRYPT
  22347. if (wc_AesEcbDecrypt(aes, out, in, AES_BLOCK_SIZE) != 0) {
  22348. WOLFSSL_MSG("Error with AES CBC decrypt");
  22349. }
  22350. #else
  22351. WOLFSSL_MSG("AES decryption not compiled in");
  22352. #endif
  22353. }
  22354. }
  22355. #endif /* HAVE_AES_ECB */
  22356. #ifdef HAVE_AES_CBC
  22357. /* Encrypt data using key and iv passed in. iv gets updated to most recent iv
  22358. * state after encryption/decryption.
  22359. *
  22360. * in buffer to encrypt/decrypt
  22361. * out buffer to hold result of encryption/decryption
  22362. * len length of input buffer
  22363. * key AES structure to use with encryption/decryption
  22364. * iv iv to use with operation
  22365. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  22366. */
  22367. void wolfSSL_AES_cbc_encrypt(const unsigned char *in, unsigned char* out,
  22368. size_t len, AES_KEY *key, unsigned char* iv, const int enc)
  22369. {
  22370. Aes* aes;
  22371. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  22372. if (key == NULL || in == NULL || out == NULL || iv == NULL || len == 0) {
  22373. WOLFSSL_MSG("Error, Null argument passed in");
  22374. return;
  22375. }
  22376. aes = (Aes*)key;
  22377. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  22378. WOLFSSL_MSG("Error with setting iv");
  22379. return;
  22380. }
  22381. if (enc == AES_ENCRYPT) {
  22382. if (wc_AesCbcEncrypt(aes, out, in, (word32)len) != 0) {
  22383. WOLFSSL_MSG("Error with AES CBC encrypt");
  22384. }
  22385. }
  22386. else {
  22387. if (wc_AesCbcDecrypt(aes, out, in, (word32)len) != 0) {
  22388. WOLFSSL_MSG("Error with AES CBC decrypt");
  22389. }
  22390. }
  22391. /* to be compatible copy iv to iv buffer after completing operation */
  22392. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  22393. }
  22394. #endif /* HAVE_AES_CBC */
  22395. /* Encrypt data using CFB mode with key and iv passed in. iv gets updated to
  22396. * most recent iv state after encryption/decryption.
  22397. *
  22398. * in buffer to encrypt/decrypt
  22399. * out buffer to hold result of encryption/decryption
  22400. * len length of input buffer
  22401. * key AES structure to use with encryption/decryption
  22402. * iv iv to use with operation
  22403. * num contains the amount of block used
  22404. * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption
  22405. */
  22406. void wolfSSL_AES_cfb128_encrypt(const unsigned char *in, unsigned char* out,
  22407. size_t len, AES_KEY *key, unsigned char* iv, int* num,
  22408. const int enc)
  22409. {
  22410. #ifndef WOLFSSL_AES_CFB
  22411. WOLFSSL_MSG("CFB mode not enabled please use macro WOLFSSL_AES_CFB");
  22412. (void)in;
  22413. (void)out;
  22414. (void)len;
  22415. (void)key;
  22416. (void)iv;
  22417. (void)num;
  22418. (void)enc;
  22419. return;
  22420. #else
  22421. Aes* aes;
  22422. WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt");
  22423. if (key == NULL || in == NULL || out == NULL || iv == NULL) {
  22424. WOLFSSL_MSG("Error, Null argument passed in");
  22425. return;
  22426. }
  22427. aes = (Aes*)key;
  22428. if (wc_AesSetIV(aes, (const byte*)iv) != 0) {
  22429. WOLFSSL_MSG("Error with setting iv");
  22430. return;
  22431. }
  22432. if (enc == AES_ENCRYPT) {
  22433. if (wc_AesCfbEncrypt(aes, out, in, (word32)len) != 0) {
  22434. WOLFSSL_MSG("Error with AES CBC encrypt");
  22435. }
  22436. }
  22437. else {
  22438. if (wc_AesCfbDecrypt(aes, out, in, (word32)len) != 0) {
  22439. WOLFSSL_MSG("Error with AES CBC decrypt");
  22440. }
  22441. }
  22442. /* to be compatible copy iv to iv buffer after completing operation */
  22443. XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE);
  22444. /* store number of left over bytes to num */
  22445. *num = (aes->left)? AES_BLOCK_SIZE - aes->left : 0;
  22446. #endif /* WOLFSSL_AES_CFB */
  22447. }
  22448. #endif /* NO_AES */
  22449. #ifndef NO_FILESYSTEM
  22450. #ifdef __clang__
  22451. #pragma clang diagnostic push
  22452. #pragma clang diagnostic ignored "-Wformat-nonliteral"
  22453. #endif
  22454. #endif
  22455. #if !defined(NO_FILESYSTEM) && defined (OPENSSL_EXTRA)
  22456. /* returns amount printed on success, negative in fail case */
  22457. int wolfSSL_BIO_vprintf(WOLFSSL_BIO* bio, const char* format, va_list args)
  22458. {
  22459. int ret = -1;
  22460. if (bio == NULL)
  22461. return WOLFSSL_FATAL_ERROR;
  22462. switch (bio->type) {
  22463. case WOLFSSL_BIO_FILE:
  22464. if (bio->ptr == NULL) {
  22465. va_end(args);
  22466. return -1;
  22467. }
  22468. ret = vfprintf((XFILE)bio->ptr, format, args);
  22469. break;
  22470. case WOLFSSL_BIO_MEMORY:
  22471. #if defined(OPENSSL_EXTRA) && (!defined(_WIN32) || defined(HAVE_VA_COPY))
  22472. case WOLFSSL_BIO_SSL:
  22473. {
  22474. int count;
  22475. char* pt = NULL;
  22476. va_list copy;
  22477. va_copy(copy, args);
  22478. count = vsnprintf(NULL, 0, format, args);
  22479. if (count >= 0)
  22480. {
  22481. pt = (char*)XMALLOC(count + 1, bio->heap,
  22482. DYNAMIC_TYPE_TMP_BUFFER);
  22483. if (pt != NULL)
  22484. {
  22485. count = vsnprintf(pt, count + 1, format, copy);
  22486. if (count >= 0)
  22487. {
  22488. ret = wolfSSL_BIO_write(bio, pt, count);
  22489. }
  22490. XFREE(pt, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  22491. }
  22492. }
  22493. va_end(copy);
  22494. }
  22495. break;
  22496. #endif
  22497. default:
  22498. WOLFSSL_MSG("Unsupported WOLFSSL_BIO type for wolfSSL_BIO_printf");
  22499. break;
  22500. }
  22501. return ret;
  22502. }
  22503. /* returns amount printed on success, negative in fail case */
  22504. int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...)
  22505. {
  22506. int ret;
  22507. va_list args;
  22508. va_start(args, format);
  22509. ret = wolfSSL_BIO_vprintf(bio, format, args);
  22510. va_end(args);
  22511. return ret;
  22512. }
  22513. #endif /* !NO_FILESYSTEM && OPENSSL_EXTRA */
  22514. #if !defined(NO_FILESYSTEM) && defined(__clang__)
  22515. #pragma clang diagnostic pop
  22516. #endif
  22517. #undef LINE_LEN
  22518. #define LINE_LEN 16
  22519. int wolfSSL_BIO_dump(WOLFSSL_BIO *bio, const char *buf, int length)
  22520. {
  22521. int ret = 0;
  22522. if (bio == NULL)
  22523. return 0;
  22524. #ifndef NO_FILESYSTEM
  22525. if (bio->type == WOLFSSL_BIO_FILE) {
  22526. int i;
  22527. char line[80];
  22528. if (!buf) {
  22529. return fputs("\tNULL", (XFILE)bio->ptr);
  22530. }
  22531. sprintf(line, "\t");
  22532. for (i = 0; i < LINE_LEN; i++) {
  22533. if (i < length)
  22534. sprintf(line + 1 + i * 3,"%02x ", buf[i]);
  22535. else
  22536. sprintf(line + 1 + i * 3, " ");
  22537. }
  22538. sprintf(line + 1 + LINE_LEN * 3, "| ");
  22539. for (i = 0; i < LINE_LEN; i++) {
  22540. if (i < length) {
  22541. sprintf(line + 3 + LINE_LEN * 3 + i,
  22542. "%c", 31 < buf[i] && buf[i] < 127 ? buf[i] : '.');
  22543. }
  22544. }
  22545. ret += fputs(line, (XFILE)bio->ptr);
  22546. if (length > LINE_LEN)
  22547. ret += wolfSSL_BIO_dump(bio, buf + LINE_LEN, length - LINE_LEN);
  22548. }
  22549. #else
  22550. (void)buf;
  22551. (void)length;
  22552. #endif
  22553. return ret;
  22554. }
  22555. #ifndef NO_ASN_TIME
  22556. int wolfSSL_ASN1_UTCTIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_UTCTIME* a)
  22557. {
  22558. WOLFSSL_ENTER("ASN1_UTCTIME_print");
  22559. if (bio == NULL || a == NULL) {
  22560. return WOLFSSL_FAILURE;
  22561. }
  22562. if (a->type != ASN_UTC_TIME) {
  22563. WOLFSSL_MSG("Error, not UTC_TIME");
  22564. return WOLFSSL_FAILURE;
  22565. }
  22566. return wolfSSL_ASN1_TIME_print(bio, a);
  22567. }
  22568. /* Checks the ASN1 syntax of "a"
  22569. * returns WOLFSSL_SUCCESS (1) if correct otherwise WOLFSSL_FAILURE (0) */
  22570. int wolfSSL_ASN1_TIME_check(const WOLFSSL_ASN1_TIME* a)
  22571. {
  22572. char buf[MAX_TIME_STRING_SZ];
  22573. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_check");
  22574. /* if can parse the WOLFSSL_ASN1_TIME passed in then consider syntax good */
  22575. if (wolfSSL_ASN1_TIME_to_string((WOLFSSL_ASN1_TIME*)a, buf,
  22576. MAX_TIME_STRING_SZ) == NULL) {
  22577. return WOLFSSL_FAILURE;
  22578. }
  22579. return WOLFSSL_SUCCESS;
  22580. }
  22581. #endif /* !NO_ASN_TIME */
  22582. #ifndef NO_WOLFSSL_STUB
  22583. int wolfSSL_ASN1_TIME_diff(int *pday, int *psec,
  22584. const WOLFSSL_ASN1_TIME *from, const WOLFSSL_ASN1_TIME *to)
  22585. {
  22586. WOLFSSL_STUB("wolfSSL_ASN1_TIME_diff");
  22587. (void)pday;
  22588. (void)psec;
  22589. (void)from;
  22590. (void)to;
  22591. return 0;
  22592. }
  22593. WOLFSSL_API WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t)
  22594. {
  22595. WOLFSSL_STUB("wolfSSL_ASN1_TIME_set");
  22596. (void)s;
  22597. (void)t;
  22598. return s;
  22599. }
  22600. #endif /* !NO_WOLFSSL_STUB */
  22601. /* Return the month as a string.
  22602. *
  22603. * n The number of the month as a two characters (1 based).
  22604. * returns the month as a string.
  22605. */
  22606. static WC_INLINE const char* MonthStr(const char* n)
  22607. {
  22608. static const char monthStr[12][4] = {
  22609. "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  22610. "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  22611. return monthStr[(n[0] - '0') * 10 + (n[1] - '0') - 1];
  22612. }
  22613. int wolfSSL_ASN1_GENERALIZEDTIME_print(WOLFSSL_BIO* bio,
  22614. const WOLFSSL_ASN1_GENERALIZEDTIME* asnTime)
  22615. {
  22616. const char* p;
  22617. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_print");
  22618. if (bio == NULL || asnTime == NULL)
  22619. return BAD_FUNC_ARG;
  22620. if (asnTime->type != ASN_GENERALIZED_TIME) {
  22621. WOLFSSL_MSG("Error, not GENERALIZED_TIME");
  22622. return WOLFSSL_FAILURE;
  22623. }
  22624. p = (const char *)(asnTime->data);
  22625. /* GetTimeString not always available. */
  22626. wolfSSL_BIO_write(bio, MonthStr(p + 4), 3);
  22627. wolfSSL_BIO_write(bio, " ", 1);
  22628. /* Day */
  22629. wolfSSL_BIO_write(bio, p + 6, 2);
  22630. wolfSSL_BIO_write(bio, " ", 1);
  22631. /* Hour */
  22632. wolfSSL_BIO_write(bio, p + 8, 2);
  22633. wolfSSL_BIO_write(bio, ":", 1);
  22634. /* Min */
  22635. wolfSSL_BIO_write(bio, p + 10, 2);
  22636. wolfSSL_BIO_write(bio, ":", 1);
  22637. /* Secs */
  22638. wolfSSL_BIO_write(bio, p + 12, 2);
  22639. wolfSSL_BIO_write(bio, " ", 1);
  22640. wolfSSL_BIO_write(bio, p, 4);
  22641. return 0;
  22642. }
  22643. void wolfSSL_ASN1_GENERALIZEDTIME_free(WOLFSSL_ASN1_TIME* asn1Time)
  22644. {
  22645. WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_free");
  22646. if (asn1Time == NULL)
  22647. return;
  22648. XMEMSET(asn1Time->data, 0, sizeof(asn1Time->data));
  22649. }
  22650. #endif /* OPENSSL_EXTRA */
  22651. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  22652. int wolfSSL_sk_num(WOLFSSL_STACK* sk)
  22653. {
  22654. WOLFSSL_ENTER("wolfSSL_sk_num");
  22655. if (sk == NULL)
  22656. return 0;
  22657. return (int)sk->num;
  22658. }
  22659. void* wolfSSL_sk_value(WOLFSSL_STACK* sk, int i)
  22660. {
  22661. WOLFSSL_ENTER("wolfSSL_sk_value");
  22662. for (; sk != NULL && i > 0; i--)
  22663. sk = sk->next;
  22664. if (sk == NULL)
  22665. return NULL;
  22666. switch (sk->type) {
  22667. case STACK_TYPE_X509:
  22668. return (void*)sk->data.x509;
  22669. case STACK_TYPE_CIPHER:
  22670. return (void*)&sk->data.cipher;
  22671. case STACK_TYPE_GEN_NAME:
  22672. return (void*)sk->data.gn;
  22673. case STACK_TYPE_ACCESS_DESCRIPTION:
  22674. return (void*)sk->data.access;
  22675. case STACK_TYPE_OBJ:
  22676. return (void*)sk->data.obj;
  22677. case STACK_TYPE_X509_EXT:
  22678. return (void*)sk->data.ext;
  22679. case STACK_TYPE_CONF_VALUE:
  22680. return (void*)sk->data.conf->value;
  22681. case STACK_TYPE_NULL:
  22682. default:
  22683. return (void*)sk->data.generic;
  22684. }
  22685. }
  22686. /* copies over data of "in" to "out" */
  22687. static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
  22688. {
  22689. if (in == NULL || out == NULL)
  22690. return;
  22691. *out = *in;
  22692. }
  22693. WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk)
  22694. {
  22695. WOLFSSL_STACK* ret = NULL;
  22696. WOLFSSL_STACK* last = NULL;
  22697. WOLFSSL_ENTER("wolfSSL_sk_dup");
  22698. while (sk) {
  22699. WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
  22700. if (!cur) {
  22701. WOLFSSL_MSG("wolfSSL_sk_new_node error");
  22702. goto error;
  22703. }
  22704. if (!ret) {
  22705. /* Set first node */
  22706. ret = cur;
  22707. }
  22708. if (last) {
  22709. last->next = cur;
  22710. }
  22711. XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
  22712. /* We will allocate new memory for this */
  22713. XMEMSET(&cur->data, 0, sizeof(cur->data));
  22714. cur->next = NULL;
  22715. switch (sk->type) {
  22716. case STACK_TYPE_X509:
  22717. cur->data.x509 = wolfSSL_X509_dup(sk->data.x509);
  22718. if (!cur->data.x509) {
  22719. WOLFSSL_MSG("wolfSSL_X509_dup error");
  22720. goto error;
  22721. }
  22722. break;
  22723. case STACK_TYPE_CIPHER:
  22724. wolfSSL_CIPHER_copy(&sk->data.cipher, &cur->data.cipher);
  22725. break;
  22726. case STACK_TYPE_GEN_NAME:
  22727. cur->data.gn = wolfSSL_GENERAL_NAME_dup(sk->data.gn);
  22728. if (!cur->data.gn) {
  22729. WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
  22730. goto error;
  22731. }
  22732. break;
  22733. case STACK_TYPE_OBJ:
  22734. cur->data.obj = wolfSSL_ASN1_OBJECT_dup(sk->data.obj);
  22735. if (!cur->data.obj) {
  22736. WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup error");
  22737. goto error;
  22738. }
  22739. break;
  22740. case STACK_TYPE_ACCESS_DESCRIPTION:
  22741. case STACK_TYPE_X509_EXT:
  22742. case STACK_TYPE_CONF_VALUE:
  22743. case STACK_TYPE_NULL:
  22744. default:
  22745. WOLFSSL_MSG("Unsupported stack type");
  22746. goto error;
  22747. }
  22748. sk = sk->next;
  22749. last = cur;
  22750. }
  22751. return ret;
  22752. error:
  22753. if (ret) {
  22754. wolfSSL_sk_GENERAL_NAME_free(ret);
  22755. }
  22756. return NULL;
  22757. }
  22758. /* Free the structure for ASN1_OBJECT stack */
  22759. void wolfSSL_sk_free(WOLFSSL_STACK* sk)
  22760. {
  22761. WOLFSSL_ENTER("wolfSSL_sk_free");
  22762. if (sk == NULL) {
  22763. WOLFSSL_MSG("Error, BAD_FUNC_ARG");
  22764. return;
  22765. }
  22766. switch (sk->type) {
  22767. case STACK_TYPE_X509:
  22768. wolfSSL_sk_X509_free(sk);
  22769. break;
  22770. #if defined(OPENSSL_ALL)
  22771. case STACK_TYPE_CIPHER:
  22772. wolfSSL_sk_CIPHER_free(sk);
  22773. break;
  22774. #endif
  22775. case STACK_TYPE_GEN_NAME:
  22776. wolfSSL_sk_GENERAL_NAME_free(sk);
  22777. break;
  22778. #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
  22779. case STACK_TYPE_ACCESS_DESCRIPTION:
  22780. wolfSSL_sk_ACCESS_DESCRIPTION_free(sk);
  22781. break;
  22782. #endif
  22783. case STACK_TYPE_OBJ:
  22784. wolfSSL_sk_ASN1_OBJECT_free(sk);
  22785. break;
  22786. #ifdef OPENSSL_ALL
  22787. case STACK_TYPE_X509_INFO:
  22788. wolfSSL_sk_X509_INFO_free(sk);
  22789. break;
  22790. case STACK_TYPE_X509_NAME:
  22791. wolfSSL_sk_X509_NAME_free(sk);
  22792. break;
  22793. case STACK_TYPE_CONF_VALUE:
  22794. wolfSSL_sk_CONF_VALUE_free(sk);
  22795. break;
  22796. #endif
  22797. case STACK_TYPE_NULL:
  22798. default:
  22799. wolfSSL_sk_GENERIC_free(sk);
  22800. }
  22801. }
  22802. /* Frees each node in the stack and frees the stack.
  22803. * Does not free any internal members of the stack nodes.
  22804. */
  22805. void wolfSSL_sk_GENERIC_pop_free(WOLFSSL_STACK* sk,
  22806. void (*f) (void*))
  22807. {
  22808. WOLFSSL_STACK* node;
  22809. WOLFSSL_STACK* tmp;
  22810. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_pop_free");
  22811. if (sk == NULL)
  22812. return;
  22813. /* parse through stack freeing each node */
  22814. node = sk->next;
  22815. while (node) {
  22816. tmp = node;
  22817. node = node->next;
  22818. if (f)
  22819. f(tmp->data.generic);
  22820. tmp->data.generic = NULL;
  22821. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  22822. }
  22823. /* free head of stack */
  22824. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  22825. }
  22826. /* return 1 on success 0 on fail */
  22827. int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK* sk, void* generic)
  22828. {
  22829. WOLFSSL_STACK* node;
  22830. WOLFSSL_ENTER("wolfSSL_sk_GENERIC_push");
  22831. if (sk == NULL || generic == NULL) {
  22832. return WOLFSSL_FAILURE;
  22833. }
  22834. /* no previous values in stack */
  22835. if (sk->data.generic == NULL) {
  22836. sk->data.generic = generic;
  22837. sk->num += 1;
  22838. return WOLFSSL_SUCCESS;
  22839. }
  22840. /* stack already has value(s) create a new node and add more */
  22841. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK),NULL,DYNAMIC_TYPE_SSL);
  22842. if (node == NULL) {
  22843. WOLFSSL_MSG("Memory error");
  22844. return WOLFSSL_FAILURE;
  22845. }
  22846. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  22847. /* push new node onto head of stack */
  22848. node->type = sk->type;
  22849. node->data.generic = sk->data.generic;
  22850. node->next = sk->next;
  22851. sk->next = node;
  22852. sk->data.generic = generic;
  22853. sk->num += 1;
  22854. return WOLFSSL_SUCCESS;
  22855. }
  22856. void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk)
  22857. {
  22858. wolfSSL_sk_GENERIC_pop_free(sk, NULL);
  22859. }
  22860. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  22861. #ifdef OPENSSL_EXTRA
  22862. /* Free all nodes in a stack */
  22863. void wolfSSL_sk_pop_free(WOLF_STACK_OF(WOLFSSL_ASN1_OBJECT)* sk,
  22864. wolfSSL_sk_freefunc func)
  22865. {
  22866. WOLFSSL_ENTER("wolfSSL_sk_pop_free");
  22867. if (sk == NULL) {
  22868. WOLFSSL_MSG("Error, BAD_FUNC_ARG");
  22869. return;
  22870. }
  22871. switch(sk->type) {
  22872. #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
  22873. case STACK_TYPE_ACCESS_DESCRIPTION:
  22874. wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(sk,
  22875. wolfSSL_ACCESS_DESCRIPTION_free);
  22876. break;
  22877. #endif
  22878. case STACK_TYPE_X509:
  22879. wolfSSL_sk_X509_pop_free(sk,(void (*)(WOLFSSL_X509*))func);
  22880. break;
  22881. case STACK_TYPE_OBJ:
  22882. wolfSSL_sk_ASN1_OBJECT_pop_free(sk,
  22883. (void (*)(WOLFSSL_ASN1_OBJECT*))func);
  22884. break;
  22885. case STACK_TYPE_GEN_NAME:
  22886. wolfSSL_sk_GENERAL_NAME_pop_free(sk,
  22887. (void (*)(WOLFSSL_GENERAL_NAME*))func);
  22888. break;
  22889. #ifdef OPENSSL_ALL
  22890. case STACK_TYPE_X509_NAME:
  22891. wolfSSL_sk_X509_NAME_pop_free(sk,
  22892. (void (*)(WOLFSSL_X509_NAME*))func);
  22893. break;
  22894. case STACK_TYPE_X509_EXT:
  22895. wolfSSL_sk_X509_EXTENSION_pop_free(sk,
  22896. (void (*)(WOLFSSL_X509_EXTENSION*))func);
  22897. break;
  22898. #endif
  22899. #if defined(OPENSSL_ALL)
  22900. case STACK_TYPE_X509_INFO:
  22901. wolfSSL_sk_X509_INFO_pop_free(sk,
  22902. (void (*)(WOLFSSL_X509_INFO*))func);
  22903. break;
  22904. #endif
  22905. default:
  22906. wolfSSL_sk_GENERIC_pop_free(sk,
  22907. (void (*)(void*))func);
  22908. break;
  22909. }
  22910. }
  22911. #if defined(OPENSSL_ALL)
  22912. /* Free the structure for WOLFSSL_CONF_VALUE stack
  22913. *
  22914. * sk stack to free nodes in
  22915. */
  22916. void wolfSSL_sk_CONF_VALUE_free(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk)
  22917. {
  22918. WOLFSSL_STACK* node;
  22919. WOLFSSL_STACK* tmp;
  22920. WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_free");
  22921. if (sk == NULL)
  22922. return;
  22923. /* parse through stack freeing each node */
  22924. node = sk->next;
  22925. while (node) {
  22926. tmp = node;
  22927. node = node->next;
  22928. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  22929. }
  22930. /* free head of stack */
  22931. XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
  22932. }
  22933. #endif /* OPENSSL_ALL */
  22934. #endif /* OPENSSL_EXTRA */
  22935. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  22936. /* Creates and returns a new null stack. */
  22937. WOLFSSL_STACK* wolfSSL_sk_new_null(void)
  22938. {
  22939. WOLFSSL_STACK* sk;
  22940. WOLFSSL_ENTER("wolfSSL_sk_new_null");
  22941. sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  22942. DYNAMIC_TYPE_OPENSSL);
  22943. if (sk == NULL) {
  22944. WOLFSSL_MSG("WOLFSSL_STACK memory error");
  22945. return NULL;
  22946. }
  22947. XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
  22948. sk->type = STACK_TYPE_NULL;
  22949. return sk;
  22950. }
  22951. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  22952. #ifdef OPENSSL_EXTRA
  22953. WOLFSSL_BASIC_CONSTRAINTS* wolfSSL_BASIC_CONSTRAINTS_new(void)
  22954. {
  22955. WOLFSSL_BASIC_CONSTRAINTS* bc;
  22956. bc = (WOLFSSL_BASIC_CONSTRAINTS*)
  22957. XMALLOC(sizeof(WOLFSSL_BASIC_CONSTRAINTS), NULL,
  22958. DYNAMIC_TYPE_X509_EXT);
  22959. if (bc == NULL) {
  22960. WOLFSSL_MSG("Failed to malloc basic constraints");
  22961. return NULL;
  22962. }
  22963. XMEMSET(bc, 0, sizeof(WOLFSSL_BASIC_CONSTRAINTS));
  22964. return bc;
  22965. }
  22966. /* frees the wolfSSL_BASIC_CONSTRAINTS object */
  22967. void wolfSSL_BASIC_CONSTRAINTS_free(WOLFSSL_BASIC_CONSTRAINTS *bc)
  22968. {
  22969. WOLFSSL_ENTER("wolfSSL_BASIC_CONSTRAINTS_free");
  22970. if (bc == NULL) {
  22971. WOLFSSL_MSG("Argument is NULL");
  22972. return;
  22973. }
  22974. if (bc->pathlen) {
  22975. wolfSSL_ASN1_INTEGER_free(bc->pathlen);
  22976. }
  22977. XFREE(bc, NULL, DYNAMIC_TYPE_OPENSSL);
  22978. }
  22979. WOLFSSL_AUTHORITY_KEYID* wolfSSL_AUTHORITY_KEYID_new(void)
  22980. {
  22981. WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)XMALLOC(
  22982. sizeof(WOLFSSL_AUTHORITY_KEYID), NULL, DYNAMIC_TYPE_OPENSSL);
  22983. if (!akey) {
  22984. WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
  22985. return NULL;
  22986. }
  22987. XMEMSET(akey, 0, sizeof(WOLFSSL_AUTHORITY_KEYID));
  22988. return akey;
  22989. }
  22990. /* frees the wolfSSL_AUTHORITY_KEYID object */
  22991. void wolfSSL_AUTHORITY_KEYID_free(WOLFSSL_AUTHORITY_KEYID *id)
  22992. {
  22993. WOLFSSL_ENTER("wolfSSL_AUTHORITY_KEYID_free");
  22994. if(id == NULL) {
  22995. WOLFSSL_MSG("Argument is NULL");
  22996. return;
  22997. }
  22998. if (id->keyid) {
  22999. wolfSSL_ASN1_STRING_free(id->keyid);
  23000. }
  23001. if (id->issuer) {
  23002. wolfSSL_ASN1_OBJECT_free(id->issuer);
  23003. }
  23004. if (id->serial) {
  23005. wolfSSL_ASN1_INTEGER_free(id->serial);
  23006. }
  23007. XFREE(id, NULL, DYNAMIC_TYPE_OPENSSL);
  23008. }
  23009. int wolfSSL_sk_SSL_COMP_num(WOLF_STACK_OF(WOLFSSL_COMP)* sk)
  23010. {
  23011. if (sk == NULL)
  23012. return 0;
  23013. return (int)sk->num;
  23014. }
  23015. #endif /* OPENSSL_EXTRA */
  23016. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  23017. defined(HAVE_EXT_CACHE))
  23018. /* stunnel 4.28 needs
  23019. *
  23020. * Callback that is called if a session tries to resume but could not find
  23021. * the session to resume it.
  23022. */
  23023. void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx,
  23024. WOLFSSL_SESSION*(*f)(WOLFSSL*, unsigned char*, int, int*))
  23025. {
  23026. if (ctx == NULL)
  23027. return;
  23028. #ifdef HAVE_EXT_CACHE
  23029. ctx->get_sess_cb = f;
  23030. #else
  23031. (void)f;
  23032. #endif
  23033. }
  23034. void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx,
  23035. int (*f)(WOLFSSL*, WOLFSSL_SESSION*))
  23036. {
  23037. if (ctx == NULL)
  23038. return;
  23039. #ifdef HAVE_EXT_CACHE
  23040. ctx->new_sess_cb = f;
  23041. #else
  23042. (void)f;
  23043. #endif
  23044. }
  23045. void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*,
  23046. WOLFSSL_SESSION*))
  23047. {
  23048. if (ctx == NULL)
  23049. return;
  23050. #ifdef HAVE_EXT_CACHE
  23051. ctx->rem_sess_cb = f;
  23052. #else
  23053. (void)f;
  23054. #endif
  23055. }
  23056. /*
  23057. *
  23058. * Note: It is expected that the importing and exporting function have been
  23059. * built with the same settings. For example if session tickets was
  23060. * enabled with the wolfSSL library exporting a session then it is
  23061. * expected to be turned on with the wolfSSL library importing the session.
  23062. */
  23063. int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p)
  23064. {
  23065. int size = 0;
  23066. #ifdef HAVE_EXT_CACHE
  23067. int idx = 0;
  23068. #ifdef SESSION_CERTS
  23069. int i;
  23070. #endif
  23071. unsigned char *data;
  23072. if (sess == NULL) {
  23073. return BAD_FUNC_ARG;
  23074. }
  23075. /* bornOn | timeout | sessionID len | sessionID | masterSecret | haveEMS */
  23076. size += OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN + sess->sessionIDSz +
  23077. SECRET_LEN + OPAQUE8_LEN;
  23078. #ifdef SESSION_CERTS
  23079. /* Peer chain */
  23080. size += OPAQUE8_LEN;
  23081. for (i = 0; i < sess->chain.count; i++)
  23082. size += OPAQUE16_LEN + sess->chain.certs[i].length;
  23083. #endif
  23084. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  23085. defined(HAVE_SESSION_TICKET))
  23086. /* Protocol version */
  23087. size += OPAQUE16_LEN;
  23088. #endif
  23089. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  23090. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  23091. /* cipher suite */
  23092. size += OPAQUE16_LEN;
  23093. #endif
  23094. #ifndef NO_CLIENT_CACHE
  23095. /* ServerID len | ServerID */
  23096. size += OPAQUE16_LEN + sess->idLen;
  23097. #endif
  23098. #ifdef OPENSSL_EXTRA
  23099. /* session context ID len | session context ID */
  23100. size += OPAQUE8_LEN + sess->sessionCtxSz;
  23101. #endif
  23102. #ifdef WOLFSSL_TLS13
  23103. /* namedGroup */
  23104. size += OPAQUE16_LEN;
  23105. #endif
  23106. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  23107. #ifdef WOLFSSL_TLS13
  23108. /* ticketSeen | ticketAdd */
  23109. size += OPAQUE32_LEN + OPAQUE32_LEN;
  23110. /* ticketNonce */
  23111. size += OPAQUE8_LEN + sess->ticketNonce.len;
  23112. #endif
  23113. #ifdef WOLFSSL_EARLY_DATA
  23114. size += OPAQUE32_LEN;
  23115. #endif
  23116. #endif
  23117. #ifdef HAVE_SESSION_TICKET
  23118. /* ticket len | ticket */
  23119. size += OPAQUE16_LEN + sess->ticketLen;
  23120. #endif
  23121. if (p != NULL) {
  23122. if (*p == NULL)
  23123. *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL);
  23124. if (*p == NULL)
  23125. return 0;
  23126. data = *p;
  23127. c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN;
  23128. c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN;
  23129. data[idx++] = sess->sessionIDSz;
  23130. XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz);
  23131. idx += sess->sessionIDSz;
  23132. XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN;
  23133. data[idx++] = (byte)sess->haveEMS;
  23134. #ifdef SESSION_CERTS
  23135. data[idx++] = (byte)sess->chain.count;
  23136. for (i = 0; i < sess->chain.count; i++) {
  23137. c16toa((word16)sess->chain.certs[i].length, data + idx);
  23138. idx += OPAQUE16_LEN;
  23139. XMEMCPY(data + idx, sess->chain.certs[i].buffer,
  23140. sess->chain.certs[i].length);
  23141. idx += sess->chain.certs[i].length;
  23142. }
  23143. #endif
  23144. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  23145. defined(HAVE_SESSION_TICKET))
  23146. data[idx++] = sess->version.major;
  23147. data[idx++] = sess->version.minor;
  23148. #endif
  23149. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  23150. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  23151. data[idx++] = sess->cipherSuite0;
  23152. data[idx++] = sess->cipherSuite;
  23153. #endif
  23154. #ifndef NO_CLIENT_CACHE
  23155. c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN;
  23156. XMEMCPY(data + idx, sess->serverID, sess->idLen);
  23157. idx += sess->idLen;
  23158. #endif
  23159. #ifdef OPENSSL_EXTRA
  23160. data[idx++] = sess->sessionCtxSz;
  23161. XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz);
  23162. idx += sess->sessionCtxSz;
  23163. #endif
  23164. #ifdef WOLFSSL_TLS13
  23165. c16toa(sess->namedGroup, data + idx);
  23166. idx += OPAQUE16_LEN;
  23167. #endif
  23168. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  23169. #ifdef WOLFSSL_TLS13
  23170. c32toa(sess->ticketSeen, data + idx);
  23171. idx += OPAQUE32_LEN;
  23172. c32toa(sess->ticketAdd, data + idx);
  23173. idx += OPAQUE32_LEN;
  23174. data[idx++] = sess->ticketNonce.len;
  23175. XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len);
  23176. idx += sess->ticketNonce.len;
  23177. #endif
  23178. #ifdef WOLFSSL_EARLY_DATA
  23179. c32toa(sess->maxEarlyDataSz, data + idx);
  23180. idx += OPAQUE32_LEN;
  23181. #endif
  23182. #endif
  23183. #ifdef HAVE_SESSION_TICKET
  23184. c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN;
  23185. XMEMCPY(data + idx, sess->ticket, sess->ticketLen);
  23186. idx += sess->ticketLen;
  23187. #endif
  23188. }
  23189. #endif
  23190. (void)sess;
  23191. (void)p;
  23192. #ifdef HAVE_EXT_CACHE
  23193. (void)idx;
  23194. #endif
  23195. return size;
  23196. }
  23197. /* TODO: no function to free new session.
  23198. *
  23199. * Note: It is expected that the importing and exporting function have been
  23200. * built with the same settings. For example if session tickets was
  23201. * enabled with the wolfSSL library exporting a session then it is
  23202. * expected to be turned on with the wolfSSL library importing the session.
  23203. */
  23204. WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess,
  23205. const unsigned char** p, long i)
  23206. {
  23207. WOLFSSL_SESSION* s = NULL;
  23208. int ret = 0;
  23209. #if defined(HAVE_EXT_CACHE)
  23210. int idx;
  23211. byte* data;
  23212. #ifdef SESSION_CERTS
  23213. int j;
  23214. word16 length;
  23215. #endif
  23216. #endif
  23217. (void)p;
  23218. (void)i;
  23219. (void)ret;
  23220. if (sess != NULL)
  23221. s = *sess;
  23222. #ifdef HAVE_EXT_CACHE
  23223. if (p == NULL || *p == NULL)
  23224. return NULL;
  23225. if (s == NULL) {
  23226. s = wolfSSL_SESSION_new();
  23227. if (s == NULL)
  23228. return NULL;
  23229. #ifdef HAVE_SESSION_TICKET
  23230. s->isDynamic = 0;
  23231. #endif
  23232. }
  23233. idx = 0;
  23234. data = (byte*)*p;
  23235. /* bornOn | timeout | sessionID len */
  23236. if (i < OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
  23237. ret = BUFFER_ERROR;
  23238. goto end;
  23239. }
  23240. ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN;
  23241. ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN;
  23242. s->sessionIDSz = data[idx++];
  23243. /* sessionID | secret | haveEMS */
  23244. if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN) {
  23245. ret = BUFFER_ERROR;
  23246. goto end;
  23247. }
  23248. XMEMCPY(s->sessionID, data + idx, s->sessionIDSz);
  23249. idx += s->sessionIDSz;
  23250. XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN;
  23251. s->haveEMS = data[idx++];
  23252. #ifdef SESSION_CERTS
  23253. /* Certificate chain */
  23254. if (i - idx == 0) {
  23255. ret = BUFFER_ERROR;
  23256. goto end;
  23257. }
  23258. s->chain.count = data[idx++];
  23259. for (j = 0; j < s->chain.count; j++) {
  23260. if (i - idx < OPAQUE16_LEN) {
  23261. ret = BUFFER_ERROR;
  23262. goto end;
  23263. }
  23264. ato16(data + idx, &length); idx += OPAQUE16_LEN;
  23265. s->chain.certs[j].length = length;
  23266. if (i - idx < length) {
  23267. ret = BUFFER_ERROR;
  23268. goto end;
  23269. }
  23270. XMEMCPY(s->chain.certs[j].buffer, data + idx, length);
  23271. idx += length;
  23272. }
  23273. #endif
  23274. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  23275. defined(HAVE_SESSION_TICKET))
  23276. /* Protocol Version */
  23277. if (i - idx < OPAQUE16_LEN) {
  23278. ret = BUFFER_ERROR;
  23279. goto end;
  23280. }
  23281. s->version.major = data[idx++];
  23282. s->version.minor = data[idx++];
  23283. #endif
  23284. #if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \
  23285. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  23286. /* Cipher suite */
  23287. if (i - idx < OPAQUE16_LEN) {
  23288. ret = BUFFER_ERROR;
  23289. goto end;
  23290. }
  23291. s->cipherSuite0 = data[idx++];
  23292. s->cipherSuite = data[idx++];
  23293. #endif
  23294. #ifndef NO_CLIENT_CACHE
  23295. /* ServerID len */
  23296. if (i - idx < OPAQUE16_LEN) {
  23297. ret = BUFFER_ERROR;
  23298. goto end;
  23299. }
  23300. ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN;
  23301. /* ServerID */
  23302. if (i - idx < s->idLen) {
  23303. ret = BUFFER_ERROR;
  23304. goto end;
  23305. }
  23306. XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen;
  23307. #endif
  23308. #ifdef OPENSSL_EXTRA
  23309. /* byte for length of session context ID */
  23310. if (i - idx < OPAQUE8_LEN) {
  23311. ret = BUFFER_ERROR;
  23312. goto end;
  23313. }
  23314. s->sessionCtxSz = data[idx++];
  23315. /* app session context ID */
  23316. if (i - idx < s->sessionCtxSz) {
  23317. ret = BUFFER_ERROR;
  23318. goto end;
  23319. }
  23320. XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz;
  23321. #endif
  23322. #ifdef WOLFSSL_TLS13
  23323. if (i - idx < OPAQUE16_LEN) {
  23324. ret = BUFFER_ERROR;
  23325. goto end;
  23326. }
  23327. ato16(data + idx, &s->namedGroup);
  23328. idx += OPAQUE16_LEN;
  23329. #endif
  23330. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  23331. #ifdef WOLFSSL_TLS13
  23332. if (i - idx < (OPAQUE32_LEN * 2)) {
  23333. ret = BUFFER_ERROR;
  23334. goto end;
  23335. }
  23336. ato32(data + idx, &s->ticketSeen);
  23337. idx += OPAQUE32_LEN;
  23338. ato32(data + idx, &s->ticketAdd);
  23339. idx += OPAQUE32_LEN;
  23340. if (i - idx < OPAQUE8_LEN) {
  23341. ret = BUFFER_ERROR;
  23342. goto end;
  23343. }
  23344. s->ticketNonce.len = data[idx++];
  23345. if (i - idx < s->ticketNonce.len) {
  23346. ret = BUFFER_ERROR;
  23347. goto end;
  23348. }
  23349. XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len);
  23350. idx += s->ticketNonce.len;
  23351. #endif
  23352. #ifdef WOLFSSL_EARLY_DATA
  23353. if (i - idx < OPAQUE32_LEN) {
  23354. ret = BUFFER_ERROR;
  23355. goto end;
  23356. }
  23357. ato32(data + idx, &s->maxEarlyDataSz);
  23358. idx += OPAQUE32_LEN;
  23359. #endif
  23360. #endif
  23361. #ifdef HAVE_SESSION_TICKET
  23362. /* ticket len */
  23363. if (i - idx < OPAQUE16_LEN) {
  23364. ret = BUFFER_ERROR;
  23365. goto end;
  23366. }
  23367. ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN;
  23368. /* Dispose of ol dynamic ticket and ensure space for new ticket. */
  23369. if (s->isDynamic)
  23370. XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  23371. if (s->ticketLen <= SESSION_TICKET_LEN)
  23372. s->ticket = s->staticTicket;
  23373. else {
  23374. s->ticket = (byte*)XMALLOC(s->ticketLen, NULL,
  23375. DYNAMIC_TYPE_SESSION_TICK);
  23376. if (s->ticket == NULL) {
  23377. ret = MEMORY_ERROR;
  23378. goto end;
  23379. }
  23380. s->isDynamic = 1;
  23381. }
  23382. /* ticket */
  23383. if (i - idx < s->ticketLen) {
  23384. ret = BUFFER_ERROR;
  23385. goto end;
  23386. }
  23387. XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen;
  23388. #endif
  23389. (void)idx;
  23390. if (sess != NULL)
  23391. *sess = s;
  23392. *p += idx;
  23393. end:
  23394. if (ret != 0 && (sess == NULL || *sess != s))
  23395. wolfSSL_SESSION_free(s);
  23396. #endif
  23397. return s;
  23398. }
  23399. long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess)
  23400. {
  23401. long timeout = 0;
  23402. WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout");
  23403. if (sess)
  23404. timeout = sess->timeout;
  23405. return timeout;
  23406. }
  23407. long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess)
  23408. {
  23409. long bornOn = 0;
  23410. WOLFSSL_ENTER("wolfSSL_SESSION_get_time");
  23411. if (sess)
  23412. bornOn = sess->bornOn;
  23413. return bornOn;
  23414. }
  23415. long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
  23416. {
  23417. word32 tmptime;
  23418. if (!ses || t < 0)
  23419. return BAD_FUNC_ARG;
  23420. tmptime = t & 0xFFFFFFFF;
  23421. ses->timeout = tmptime;
  23422. return WOLFSSL_SUCCESS;
  23423. }
  23424. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  23425. #ifdef KEEP_PEER_CERT
  23426. char* wolfSSL_X509_get_subjectCN(WOLFSSL_X509* x509)
  23427. {
  23428. if (x509 == NULL)
  23429. return NULL;
  23430. return x509->subjectCN;
  23431. }
  23432. #endif /* KEEP_PEER_CERT */
  23433. #ifdef OPENSSL_EXTRA
  23434. #if defined(FORTRESS) && !defined(NO_FILESYSTEM)
  23435. int wolfSSL_cmp_peer_cert_to_file(WOLFSSL* ssl, const char *fname)
  23436. {
  23437. int ret = WOLFSSL_FATAL_ERROR;
  23438. WOLFSSL_ENTER("wolfSSL_cmp_peer_cert_to_file");
  23439. if (ssl != NULL && fname != NULL)
  23440. {
  23441. #ifdef WOLFSSL_SMALL_STACK
  23442. byte staticBuffer[1]; /* force heap usage */
  23443. #else
  23444. byte staticBuffer[FILE_BUFFER_SIZE];
  23445. #endif
  23446. byte* myBuffer = staticBuffer;
  23447. int dynamic = 0;
  23448. XFILE file;
  23449. long sz = 0;
  23450. WOLFSSL_CTX* ctx = ssl->ctx;
  23451. WOLFSSL_X509* peer_cert = &ssl->peerCert;
  23452. DerBuffer* fileDer = NULL;
  23453. file = XFOPEN(fname, "rb");
  23454. if (file == XBADFILE)
  23455. return WOLFSSL_BAD_FILE;
  23456. if (XFSEEK(file, 0, XSEEK_END) != 0) {
  23457. XFCLOSE(file);
  23458. return WOLFSSL_BAD_FILE;
  23459. }
  23460. sz = XFTELL(file);
  23461. XREWIND(file);
  23462. if (sz > MAX_WOLFSSL_FILE_SIZE || sz < 0) {
  23463. WOLFSSL_MSG("cmp_peer_cert_to_file size error");
  23464. XFCLOSE(file);
  23465. return WOLFSSL_BAD_FILE;
  23466. }
  23467. if (sz > (long)sizeof(staticBuffer)) {
  23468. WOLFSSL_MSG("Getting dynamic buffer");
  23469. myBuffer = (byte*)XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
  23470. dynamic = 1;
  23471. }
  23472. if ((myBuffer != NULL) &&
  23473. (sz > 0) &&
  23474. (XFREAD(myBuffer, 1, sz, file) == (size_t)sz) &&
  23475. (PemToDer(myBuffer, (long)sz, CERT_TYPE,
  23476. &fileDer, ctx->heap, NULL, NULL) == 0) &&
  23477. (fileDer->length != 0) &&
  23478. (fileDer->length == peer_cert->derCert->length) &&
  23479. (XMEMCMP(peer_cert->derCert->buffer, fileDer->buffer,
  23480. fileDer->length) == 0))
  23481. {
  23482. ret = 0;
  23483. }
  23484. FreeDer(&fileDer);
  23485. if (dynamic)
  23486. XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
  23487. XFCLOSE(file);
  23488. }
  23489. return ret;
  23490. }
  23491. #endif
  23492. #endif /* OPENSSL_EXTRA */
  23493. #endif /* !WOLFCRYPT_ONLY */
  23494. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  23495. const WOLFSSL_ObjectInfo wolfssl_object_info[] = {
  23496. #ifndef NO_CERTS
  23497. /* oidCertExtType */
  23498. { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints",
  23499. "X509v3 Basic Constraints"},
  23500. { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName",
  23501. "X509v3 Subject Alternative Name"},
  23502. { CRL_DIST_OID, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints",
  23503. "X509v3 CRL Distribution Points"},
  23504. { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess",
  23505. "Authority Information Access"},
  23506. { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType,
  23507. "authorityKeyIdentifier", "X509v3 Authority Key Identifier"},
  23508. { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType,
  23509. "subjectKeyIdentifier", "X509v3 Subject Key Identifier"},
  23510. { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage",
  23511. "X509v3 Key Usage"},
  23512. { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType,
  23513. "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"},
  23514. { NID_ext_key_usage, KEY_USAGE_OID, oidCertExtType,
  23515. "extendedKeyUsage", "X509v3 Extended Key Usage"},
  23516. { NID_name_constraints, NAME_CONS_OID, oidCertExtType,
  23517. "nameConstraints", "X509v3 Name Constraints"},
  23518. { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType,
  23519. "certificatePolicies", "X509v3 Certificate Policies"},
  23520. /* oidCertAuthInfoType */
  23521. { AIA_OCSP_OID, AIA_OCSP_OID, oidCertAuthInfoType, "authorityInfoAccess",
  23522. "Authority Information Access"},
  23523. { AIA_CA_ISSUER_OID, AIA_CA_ISSUER_OID, oidCertAuthInfoType,
  23524. "caIssuers", "CA Issuers"},
  23525. /* oidCertPolicyType */
  23526. { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy",
  23527. "X509v3 Any Policy"},
  23528. /* oidCertAltNameType */
  23529. { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""},
  23530. /* oidCertKeyUseType */
  23531. { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType,
  23532. "anyExtendedKeyUsage", "Any Extended Key Usage"},
  23533. { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType,
  23534. "serverAuth", "TLS Web Server Authentication"},
  23535. { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType,
  23536. "clientAuth", "TLS Web Client Authentication"},
  23537. { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType,
  23538. "OCSPSigning", "OCSP Signing"},
  23539. /* oidCertNameType */
  23540. { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"},
  23541. { NID_surname, NID_surname, oidCertNameType, "SN", "surname"},
  23542. { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber",
  23543. "serialNumber"},
  23544. { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"},
  23545. { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"},
  23546. { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST",
  23547. "stateOrProvinceName"},
  23548. { NID_organizationName, NID_organizationName, oidCertNameType, "O",
  23549. "organizationName"},
  23550. { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType,
  23551. "OU", "organizationalUnitName"},
  23552. { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress",
  23553. "emailAddress"},
  23554. { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC",
  23555. "domainComponent"},
  23556. { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory",
  23557. "businessCategory"},
  23558. { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC",
  23559. "jurisdictionCountryName"},
  23560. { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName,
  23561. oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"},
  23562. #endif
  23563. #ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */
  23564. /* oidHashType */
  23565. #ifdef WOLFSSL_MD2
  23566. { NID_md2, MD2h, oidHashType, "MD2", "md2"},
  23567. #endif
  23568. #ifdef WOLFSSL_MD5
  23569. { NID_md5, MD5h, oidHashType, "MD5", "md5"},
  23570. #endif
  23571. #ifndef NO_SHA
  23572. { NID_sha1, SHAh, oidHashType, "SHA1", "sha1"},
  23573. #endif
  23574. #ifdef WOLFSSL_SHA224
  23575. { NID_sha224, SHA224h, oidHashType, "SHA224", "sha224"},
  23576. #endif
  23577. #ifndef NO_SHA256
  23578. { NID_sha256, SHA256h, oidHashType, "SHA256", "sha256"},
  23579. #endif
  23580. #ifdef WOLFSSL_SHA384
  23581. { NID_sha384, SHA384h, oidHashType, "SHA384", "sha384"},
  23582. #endif
  23583. #ifdef WOLFSSL_SHA512
  23584. { NID_sha512, SHA512h, oidHashType, "SHA512", "sha512"},
  23585. #endif
  23586. /* oidSigType */
  23587. #ifndef NO_DSA
  23588. #ifndef NO_SHA
  23589. { CTC_SHAwDSA, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"},
  23590. #endif
  23591. #endif /* NO_DSA */
  23592. #ifndef NO_RSA
  23593. #ifdef WOLFSSL_MD2
  23594. { CTC_MD2wRSA, CTC_MD2wRSA, oidSigType, "RSA-MD2",
  23595. "md2WithRSAEncryption"},
  23596. #endif
  23597. #ifndef NO_MD5
  23598. { CTC_MD5wRSA, CTC_MD5wRSA, oidSigType, "RSA-MD5",
  23599. "md5WithRSAEncryption"},
  23600. #endif
  23601. #ifndef NO_SHA
  23602. { CTC_SHAwRSA, CTC_SHAwRSA, oidSigType, "RSA-SHA1",
  23603. "sha1WithRSAEncryption"},
  23604. #endif
  23605. #ifdef WOLFSSL_SHA224
  23606. { CTC_SHA224wRSA, CTC_SHA224wRSA, oidSigType, "RSA-SHA224",
  23607. "sha224WithRSAEncryption"},
  23608. #endif
  23609. #ifndef NO_SHA256
  23610. { CTC_SHA256wRSA, CTC_SHA256wRSA, oidSigType, "RSA-SHA256",
  23611. "sha256WithRSAEncryption"},
  23612. #endif
  23613. #ifdef WOLFSSL_SHA384
  23614. { CTC_SHA384wRSA, CTC_SHA384wRSA, oidSigType, "RSA-SHA384",
  23615. "sha384WithRSAEncryption"},
  23616. #endif
  23617. #ifdef WOLFSSL_SHA512
  23618. { CTC_SHA512wRSA, CTC_SHA512wRSA, oidSigType, "RSA-SHA512",
  23619. "sha512WithRSAEncryption"},
  23620. #endif
  23621. #endif /* NO_RSA */
  23622. #ifdef HAVE_ECC
  23623. #ifndef NO_SHA
  23624. { CTC_SHAwECDSA, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"},
  23625. #endif
  23626. #ifdef WOLFSSL_SHA224
  23627. { CTC_SHA224wECDSA, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"},
  23628. #endif
  23629. #ifndef NO_SHA256
  23630. { CTC_SHA256wECDSA, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"},
  23631. #endif
  23632. #ifdef WOLFSSL_SHA384
  23633. { CTC_SHA384wECDSA, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"},
  23634. #endif
  23635. #ifdef WOLFSSL_SHA512
  23636. { CTC_SHA512wECDSA, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"},
  23637. #endif
  23638. #endif /* HAVE_ECC */
  23639. /* oidKeyType */
  23640. #ifndef NO_DSA
  23641. { DSAk, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  23642. { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"},
  23643. #endif /* NO_DSA */
  23644. #ifndef NO_RSA
  23645. { RSAk, RSAk, oidKeyType, "RSA", "rsaEncryption"},
  23646. { NID_rsaEncryption, RSAk, oidKeyType, "RSA", "rsaEncryption"},
  23647. #endif /* NO_RSA */
  23648. #ifdef HAVE_NTRU
  23649. { NTRUk, NTRUk, oidKeyType, "NTRU", "ntruEncryption"},
  23650. #endif /* HAVE_NTRU */
  23651. #ifdef HAVE_ECC
  23652. { ECDSAk, ECDSAk, oidKeyType, "ECDSA", "ecdsaEncryption"},
  23653. { NID_X9_62_id_ecPublicKey, ECDSAk, oidKeyType, "id-ecPublicKey",
  23654. "id-ecPublicKey"},
  23655. #endif /* HAVE_ECC */
  23656. #ifndef NO_DH
  23657. { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"},
  23658. #endif
  23659. /* oidCurveType */
  23660. #ifdef HAVE_ECC
  23661. { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"},
  23662. { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"},
  23663. { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"},
  23664. { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"},
  23665. { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"},
  23666. { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"},
  23667. { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"},
  23668. { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"},
  23669. { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"},
  23670. { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"},
  23671. { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"},
  23672. { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"},
  23673. { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"},
  23674. { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"},
  23675. { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"},
  23676. { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"},
  23677. { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"},
  23678. { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"},
  23679. { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"},
  23680. { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"},
  23681. { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"},
  23682. { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"},
  23683. { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"},
  23684. { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"},
  23685. { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"},
  23686. { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"},
  23687. { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"},
  23688. #endif /* HAVE_ECC */
  23689. /* oidBlkType */
  23690. #ifdef WOLFSSL_AES_128
  23691. { AES128CBCb, AES128CBCb, oidBlkType, "AES-128-CBC", "aes-128-cbc"},
  23692. #endif
  23693. #ifdef WOLFSSL_AES_192
  23694. { AES192CBCb, AES192CBCb, oidBlkType, "AES-192-CBC", "aes-192-cbc"},
  23695. #endif
  23696. #ifdef WOLFSSL_AES_256
  23697. { AES256CBCb, AES256CBCb, oidBlkType, "AES-256-CBC", "aes-256-cbc"},
  23698. #endif
  23699. #ifndef NO_DES3
  23700. { NID_des, DESb, oidBlkType, "DES-CBC", "des-cbc"},
  23701. { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"},
  23702. #endif /* !NO_DES3 */
  23703. /* oidOcspType */
  23704. #ifdef HAVE_OCSP
  23705. { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse",
  23706. "Basic OCSP Response"},
  23707. { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce",
  23708. "OCSP Nonce"},
  23709. #endif /* HAVE_OCSP */
  23710. #ifndef NO_PWDBASED
  23711. /* oidKdfType */
  23712. { PBKDF2_OID, PBKDF2_OID, oidKdfType, "PBKDFv2", "PBKDF2"},
  23713. /* oidPBEType */
  23714. { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType,
  23715. "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"},
  23716. { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES",
  23717. "pbeWithSHA1AndDES-CBC"},
  23718. { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES",
  23719. "pbeWithSHA1And3-KeyTripleDES-CBC"},
  23720. #endif
  23721. /* oidKeyWrapType */
  23722. #ifdef WOLFSSL_AES_128
  23723. { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"},
  23724. #endif
  23725. #ifdef WOLFSSL_AES_192
  23726. { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"},
  23727. #endif
  23728. #ifdef WOLFSSL_AES_256
  23729. { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"},
  23730. #endif
  23731. #ifndef NO_PKCS7
  23732. #ifndef NO_DH
  23733. /* oidCmsKeyAgreeType */
  23734. #ifndef NO_SHA
  23735. { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme,
  23736. oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"},
  23737. #endif
  23738. #ifdef WOLFSSL_SHA224
  23739. { dhSinglePass_stdDH_sha224kdf_scheme,
  23740. dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType,
  23741. "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"},
  23742. #endif
  23743. #ifndef NO_SHA256
  23744. { dhSinglePass_stdDH_sha256kdf_scheme,
  23745. dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType,
  23746. "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"},
  23747. #endif
  23748. #ifdef WOLFSSL_SHA384
  23749. { dhSinglePass_stdDH_sha384kdf_scheme,
  23750. dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType,
  23751. "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"},
  23752. #endif
  23753. #ifdef WOLFSSL_SHA512
  23754. { dhSinglePass_stdDH_sha512kdf_scheme,
  23755. dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType,
  23756. "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"},
  23757. #endif
  23758. #endif
  23759. #endif
  23760. #if defined(WOLFSSL_APACHE_HTTPD)
  23761. /* "1.3.6.1.5.5.7.8.7" */
  23762. { NID_id_on_dnsSRV, NID_id_on_dnsSRV, oidCertNameType,
  23763. WOLFSSL_SN_DNS_SRV, WOLFSSL_LN_DNS_SRV },
  23764. /* "1.3.6.1.4.1.311.20.2.3" */
  23765. { NID_ms_upn, WOLFSSL_MS_UPN_SUM, oidCertExtType, WOLFSSL_SN_MS_UPN,
  23766. WOLFSSL_LN_MS_UPN },
  23767. /* "1.3.6.1.5.5.7.1.24" */
  23768. { NID_tlsfeature, WOLFSSL_TLS_FEATURE_SUM, oidTlsExtType,
  23769. WOLFSSL_SN_TLS_FEATURE, WOLFSSL_LN_TLS_FEATURE },
  23770. #endif
  23771. #endif /* OPENSSL_EXTRA */
  23772. };
  23773. #define WOLFSSL_OBJECT_INFO_SZ \
  23774. (sizeof(wolfssl_object_info) / sizeof(*wolfssl_object_info))
  23775. const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ;
  23776. #endif
  23777. #if defined(OPENSSL_EXTRA) || \
  23778. (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA))
  23779. static WC_RNG globalRNG;
  23780. static int initGlobalRNG = 0;
  23781. #endif
  23782. #if defined(OPENSSL_EXTRA) && \
  23783. !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  23784. WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, int *initTmpRng)
  23785. {
  23786. WC_RNG* rng = NULL;
  23787. if (!rsa || !initTmpRng) {
  23788. return NULL;
  23789. }
  23790. *initTmpRng = 0;
  23791. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  23792. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  23793. rng = ((RsaKey*)rsa->internal)->rng;
  23794. #endif
  23795. if (rng == NULL && tmpRNG) {
  23796. if (!*tmpRNG) {
  23797. #ifdef WOLFSSL_SMALL_STACK
  23798. *tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23799. if (*tmpRNG == NULL)
  23800. return NULL;
  23801. #else
  23802. WOLFSSL_MSG("*tmpRNG is null");
  23803. return NULL;
  23804. #endif
  23805. }
  23806. if (wc_InitRng(*tmpRNG) == 0) {
  23807. rng = *tmpRNG;
  23808. *initTmpRng = 1;
  23809. }
  23810. else {
  23811. WOLFSSL_MSG("Bad RNG Init, trying global");
  23812. if (initGlobalRNG == 0)
  23813. WOLFSSL_MSG("Global RNG no Init");
  23814. else
  23815. rng = &globalRNG;
  23816. #ifdef WOLFSSL_SMALL_STACK
  23817. if (*tmpRNG)
  23818. XFREE(*tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23819. *tmpRNG = NULL;
  23820. #endif
  23821. }
  23822. }
  23823. return rng;
  23824. }
  23825. #endif
  23826. #ifndef WOLFCRYPT_ONLY
  23827. #ifdef OPENSSL_EXTRA
  23828. /* Not thread safe! Can be called multiple times.
  23829. * Checks if the global RNG has been created. If not then one is created.
  23830. *
  23831. * Returns SSL_SUCCESS when no error is encountered.
  23832. */
  23833. static int wolfSSL_RAND_Init(void)
  23834. {
  23835. if (initGlobalRNG == 0) {
  23836. if (wc_InitRng(&globalRNG) < 0) {
  23837. WOLFSSL_MSG("wolfSSL Init Global RNG failed");
  23838. return 0;
  23839. }
  23840. initGlobalRNG = 1;
  23841. }
  23842. return SSL_SUCCESS;
  23843. }
  23844. /* SSL_SUCCESS on ok */
  23845. int wolfSSL_RAND_seed(const void* seed, int len)
  23846. {
  23847. WOLFSSL_MSG("wolfSSL_RAND_seed");
  23848. (void)seed;
  23849. (void)len;
  23850. return wolfSSL_RAND_Init();
  23851. }
  23852. /* Returns the path for reading seed data from.
  23853. * Uses the env variable $RANDFILE first if set, if not then used $HOME/.rnd
  23854. *
  23855. * Note uses stdlib by default unless XGETENV macro is overwritten
  23856. *
  23857. * fname buffer to hold path
  23858. * len length of fname buffer
  23859. *
  23860. * Returns a pointer to fname on success and NULL on failure
  23861. */
  23862. const char* wolfSSL_RAND_file_name(char* fname, unsigned long len)
  23863. {
  23864. #ifndef NO_FILESYSTEM
  23865. char* rt;
  23866. char ap[] = "/.rnd";
  23867. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  23868. if (fname == NULL) {
  23869. return NULL;
  23870. }
  23871. XMEMSET(fname, 0, len);
  23872. /* if access to stdlib.h */
  23873. if ((rt = XGETENV("RANDFILE")) != NULL) {
  23874. if (len > XSTRLEN(rt)) {
  23875. XMEMCPY(fname, rt, XSTRLEN(rt));
  23876. }
  23877. else {
  23878. WOLFSSL_MSG("RANDFILE too large for buffer");
  23879. rt = NULL;
  23880. }
  23881. }
  23882. /* $RANDFILE was not set or is too large, check $HOME */
  23883. if (rt == NULL) {
  23884. WOLFSSL_MSG("Environment variable RANDFILE not set");
  23885. if ((rt = XGETENV("HOME")) == NULL) {
  23886. WOLFSSL_MSG("Environment variable HOME not set");
  23887. return NULL;
  23888. }
  23889. if (len > XSTRLEN(rt) + XSTRLEN(ap)) {
  23890. fname[0] = '\0';
  23891. XSTRNCAT(fname, rt, len);
  23892. XSTRNCAT(fname, ap, len - XSTRLEN(rt));
  23893. return fname;
  23894. }
  23895. else {
  23896. WOLFSSL_MSG("HOME too large for buffer");
  23897. return NULL;
  23898. }
  23899. }
  23900. return fname;
  23901. #else
  23902. /* no filesystem defined */
  23903. WOLFSSL_ENTER("wolfSSL_RAND_file_name");
  23904. WOLFSSL_MSG("No filesystem feature enabled, not compiled in");
  23905. (void)fname;
  23906. (void)len;
  23907. return NULL;
  23908. #endif
  23909. }
  23910. /* Writes 1024 bytes from the RNG to the given file name.
  23911. *
  23912. * fname name of file to write to
  23913. *
  23914. * Returns the number of bytes written
  23915. */
  23916. int wolfSSL_RAND_write_file(const char* fname)
  23917. {
  23918. int bytes = 0;
  23919. WOLFSSL_ENTER("RAND_write_file");
  23920. if (fname == NULL) {
  23921. return SSL_FAILURE;
  23922. }
  23923. #ifndef NO_FILESYSTEM
  23924. {
  23925. #ifndef WOLFSSL_SMALL_STACK
  23926. unsigned char buf[1024];
  23927. #else
  23928. unsigned char* buf = (unsigned char *)XMALLOC(1024, NULL,
  23929. DYNAMIC_TYPE_TMP_BUFFER);
  23930. if (buf == NULL) {
  23931. WOLFSSL_MSG("malloc failed");
  23932. return SSL_FAILURE;
  23933. }
  23934. #endif
  23935. bytes = 1024; /* default size of buf */
  23936. if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != SSL_SUCCESS) {
  23937. WOLFSSL_MSG("No RNG to use");
  23938. #ifdef WOLFSSL_SMALL_STACK
  23939. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23940. #endif
  23941. return 0;
  23942. }
  23943. if (wc_RNG_GenerateBlock(&globalRNG, buf, bytes) != 0) {
  23944. WOLFSSL_MSG("Error generating random buffer");
  23945. bytes = 0;
  23946. }
  23947. else {
  23948. XFILE f;
  23949. f = XFOPEN(fname, "wb");
  23950. if (f == XBADFILE) {
  23951. WOLFSSL_MSG("Error opening the file");
  23952. bytes = 0;
  23953. }
  23954. else {
  23955. XFWRITE(buf, 1, bytes, f);
  23956. XFCLOSE(f);
  23957. }
  23958. }
  23959. ForceZero(buf, bytes);
  23960. #ifdef WOLFSSL_SMALL_STACK
  23961. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23962. #endif
  23963. }
  23964. #endif
  23965. return bytes;
  23966. }
  23967. #ifndef FREERTOS_TCP
  23968. /* These constant values are protocol values made by egd */
  23969. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API)
  23970. #define WOLFSSL_EGD_NBLOCK 0x01
  23971. #include <sys/un.h>
  23972. #endif
  23973. /* This collects entropy from the path nm and seeds the global PRNG with it.
  23974. * Makes a call to wolfSSL_RAND_Init which is not thread safe.
  23975. *
  23976. * nm is the file path to the egd server
  23977. *
  23978. * Returns the number of bytes read.
  23979. */
  23980. int wolfSSL_RAND_egd(const char* nm)
  23981. {
  23982. #if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(HAVE_FIPS) && \
  23983. defined(HAVE_HASHDRBG)
  23984. struct sockaddr_un rem;
  23985. int fd;
  23986. int ret = WOLFSSL_SUCCESS;
  23987. word32 bytes = 0;
  23988. word32 idx = 0;
  23989. #ifndef WOLFSSL_SMALL_STACK
  23990. unsigned char buf[256];
  23991. #else
  23992. unsigned char* buf;
  23993. buf = (unsigned char*)XMALLOC(256, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23994. if (buf == NULL) {
  23995. WOLFSSL_MSG("Not enough memory");
  23996. return WOLFSSL_FATAL_ERROR;
  23997. }
  23998. #endif
  23999. if (nm == NULL) {
  24000. #ifdef WOLFSSL_SMALL_STACK
  24001. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24002. #endif
  24003. return WOLFSSL_FATAL_ERROR;
  24004. }
  24005. fd = socket(AF_UNIX, SOCK_STREAM, 0);
  24006. if (fd < 0) {
  24007. WOLFSSL_MSG("Error creating socket");
  24008. #ifdef WOLFSSL_SMALL_STACK
  24009. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24010. #endif
  24011. return WOLFSSL_FATAL_ERROR;
  24012. }
  24013. if (ret == WOLFSSL_SUCCESS) {
  24014. rem.sun_family = AF_UNIX;
  24015. XSTRNCPY(rem.sun_path, nm, sizeof(rem.sun_path) - 1);
  24016. rem.sun_path[sizeof(rem.sun_path)-1] = '\0';
  24017. }
  24018. /* connect to egd server */
  24019. if (ret == WOLFSSL_SUCCESS) {
  24020. if (connect(fd, (struct sockaddr*)&rem, sizeof(struct sockaddr_un))
  24021. == -1) {
  24022. WOLFSSL_MSG("error connecting to egd server");
  24023. ret = WOLFSSL_FATAL_ERROR;
  24024. }
  24025. }
  24026. while (ret == WOLFSSL_SUCCESS && bytes < 255 && idx + 2 < 256) {
  24027. if (ret == WOLFSSL_SUCCESS) {
  24028. buf[idx] = WOLFSSL_EGD_NBLOCK;
  24029. buf[idx + 1] = 255 - bytes; /* request 255 bytes from server */
  24030. ret = (int)write(fd, buf + idx, 2);
  24031. if (ret <= 0 || ret != 2) {
  24032. if (errno == EAGAIN) {
  24033. ret = WOLFSSL_SUCCESS;
  24034. continue;
  24035. }
  24036. WOLFSSL_MSG("error requesting entropy from egd server");
  24037. ret = WOLFSSL_FATAL_ERROR;
  24038. break;
  24039. }
  24040. }
  24041. /* attempting to read */
  24042. buf[idx] = 0;
  24043. ret = (int)read(fd, buf + idx, 256 - bytes);
  24044. if (ret == 0) {
  24045. WOLFSSL_MSG("error reading entropy from egd server");
  24046. ret = WOLFSSL_FATAL_ERROR;
  24047. break;
  24048. }
  24049. if (ret > 0 && buf[idx] > 0) {
  24050. bytes += buf[idx]; /* egd stores amount sent in first byte */
  24051. if (bytes + idx > 255 || buf[idx] > ret) {
  24052. WOLFSSL_MSG("Buffer error");
  24053. ret = WOLFSSL_FATAL_ERROR;
  24054. break;
  24055. }
  24056. XMEMMOVE(buf + idx, buf + idx + 1, buf[idx]);
  24057. idx = bytes;
  24058. ret = WOLFSSL_SUCCESS;
  24059. if (bytes >= 255) {
  24060. break;
  24061. }
  24062. }
  24063. else {
  24064. if (errno == EAGAIN || errno == EINTR) {
  24065. WOLFSSL_MSG("EGD would read");
  24066. ret = WOLFSSL_SUCCESS; /* try again */
  24067. }
  24068. else if (buf[idx] == 0) {
  24069. /* if egd returned 0 then there is no more entropy to be had.
  24070. Do not try more reads. */
  24071. ret = WOLFSSL_SUCCESS;
  24072. break;
  24073. }
  24074. else {
  24075. WOLFSSL_MSG("Error with read");
  24076. ret = WOLFSSL_FATAL_ERROR;
  24077. }
  24078. }
  24079. }
  24080. if (bytes > 0 && ret == WOLFSSL_SUCCESS) {
  24081. wolfSSL_RAND_Init(); /* call to check global RNG is created */
  24082. if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
  24083. != 0) {
  24084. WOLFSSL_MSG("Error with reseeding DRBG structure");
  24085. ret = WOLFSSL_FATAL_ERROR;
  24086. }
  24087. #ifdef SHOW_SECRETS
  24088. { /* print out entropy found */
  24089. word32 i;
  24090. printf("EGD Entropy = ");
  24091. for (i = 0; i < bytes; i++) {
  24092. printf("%02X", buf[i]);
  24093. }
  24094. printf("\n");
  24095. }
  24096. #endif
  24097. }
  24098. ForceZero(buf, bytes);
  24099. #ifdef WOLFSSL_SMALL_STACK
  24100. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24101. #endif
  24102. close(fd);
  24103. if (ret == WOLFSSL_SUCCESS) {
  24104. return bytes;
  24105. }
  24106. else {
  24107. return ret;
  24108. }
  24109. #else
  24110. WOLFSSL_MSG("Type of socket needed is not available");
  24111. WOLFSSL_MSG("\tor using mode where DRBG API is not available");
  24112. (void)nm;
  24113. return WOLFSSL_FATAL_ERROR;
  24114. #endif /* USE_WOLFSSL_IO && !USE_WINDOWS_API && !HAVE_FIPS && HAVE_HASHDRBG */
  24115. }
  24116. #endif /* !FREERTOS_TCP */
  24117. void wolfSSL_RAND_Cleanup(void)
  24118. {
  24119. WOLFSSL_ENTER("wolfSSL_RAND_Cleanup()");
  24120. if (initGlobalRNG != 0) {
  24121. wc_FreeRng(&globalRNG);
  24122. initGlobalRNG = 0;
  24123. }
  24124. }
  24125. int wolfSSL_RAND_pseudo_bytes(unsigned char* buf, int num)
  24126. {
  24127. return wolfSSL_RAND_bytes(buf, num);
  24128. }
  24129. /* SSL_SUCCESS on ok */
  24130. int wolfSSL_RAND_bytes(unsigned char* buf, int num)
  24131. {
  24132. int ret = 0;
  24133. int initTmpRng = 0;
  24134. WC_RNG* rng = NULL;
  24135. #ifdef WOLFSSL_SMALL_STACK
  24136. WC_RNG* tmpRNG;
  24137. #else
  24138. WC_RNG tmpRNG[1];
  24139. #endif
  24140. WOLFSSL_ENTER("wolfSSL_RAND_bytes");
  24141. #ifdef WOLFSSL_SMALL_STACK
  24142. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  24143. if (tmpRNG == NULL)
  24144. return ret;
  24145. #endif
  24146. if (initGlobalRNG)
  24147. rng = &globalRNG;
  24148. else if(wc_InitRng(tmpRNG) == 0) {
  24149. rng = tmpRNG;
  24150. initTmpRng = 1;
  24151. }
  24152. if (rng) {
  24153. if (wc_RNG_GenerateBlock(rng, buf, num) != 0)
  24154. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  24155. else
  24156. ret = WOLFSSL_SUCCESS;
  24157. }
  24158. if (initTmpRng)
  24159. wc_FreeRng(tmpRNG);
  24160. #ifdef WOLFSSL_SMALL_STACK
  24161. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  24162. #endif
  24163. return ret;
  24164. }
  24165. int wolfSSL_RAND_poll(void)
  24166. {
  24167. byte entropy[16];
  24168. int ret = 0;
  24169. word32 entropy_sz = 16;
  24170. WOLFSSL_ENTER("wolfSSL_RAND_poll");
  24171. if (initGlobalRNG == 0){
  24172. WOLFSSL_MSG("Global RNG no Init");
  24173. return WOLFSSL_FAILURE;
  24174. }
  24175. ret = wc_GenerateSeed(&globalRNG.seed, entropy, entropy_sz);
  24176. if (ret != 0){
  24177. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  24178. ret = WOLFSSL_FAILURE;
  24179. }else
  24180. ret = WOLFSSL_SUCCESS;
  24181. return ret;
  24182. }
  24183. #endif /* OPENSSL_EXTRA */
  24184. #ifdef OPENSSL_EXTRA
  24185. WOLFSSL_ASN1_INTEGER* wolfSSL_BN_to_ASN1_INTEGER(const WOLFSSL_BIGNUM *bn, WOLFSSL_ASN1_INTEGER *ai)
  24186. {
  24187. WOLFSSL_ASN1_INTEGER* a;
  24188. int len;
  24189. WOLFSSL_ENTER("wolfSSL_BN_to_ASN1_INTEGER");
  24190. if (ai == NULL) {
  24191. a = wolfSSL_ASN1_INTEGER_new();
  24192. if (a == NULL)
  24193. return NULL;
  24194. a->type = V_ASN1_INTEGER;
  24195. }
  24196. else {
  24197. a = ai;
  24198. }
  24199. if (a) {
  24200. if (wolfSSL_BN_is_negative(bn) && !wolfSSL_BN_is_zero(bn)) {
  24201. a->type |= V_ASN1_NEG_INTEGER;
  24202. a->negative = 1;
  24203. }
  24204. len = wolfSSL_BN_num_bytes(bn);
  24205. if (len == 0)
  24206. len = 1;
  24207. /* allocate buffer */
  24208. if (len > (int)sizeof(a->intData)) {
  24209. /* create new data buffer and copy over */
  24210. a->data = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  24211. if (a->data == NULL) {
  24212. if (a != ai)
  24213. wolfSSL_ASN1_INTEGER_free(a);
  24214. return NULL;
  24215. }
  24216. a->isDynamic = 1;
  24217. }
  24218. else {
  24219. XMEMSET(a->intData, 0, sizeof(a->intData));
  24220. a->data = a->intData;
  24221. }
  24222. a->length = len;
  24223. /* populate data */
  24224. if (wolfSSL_BN_is_zero(bn)) {
  24225. a->data[0] = 0;
  24226. }
  24227. else {
  24228. len = wolfSSL_BN_bn2bin(bn, a->data);
  24229. }
  24230. a->length = len;
  24231. }
  24232. return a;
  24233. }
  24234. #ifdef OPENSSL_ALL
  24235. void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl)
  24236. {
  24237. void *ret = NULL;
  24238. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  24239. size_t i;
  24240. WOLFSSL_ENTER("wolfSSL_ASN1_item_new");
  24241. if (!tpl) {
  24242. return NULL;
  24243. }
  24244. if (!(ret = XMALLOC(tpl->size, NULL, DYNAMIC_TYPE_OPENSSL))) {
  24245. return NULL;
  24246. }
  24247. XMEMSET(ret, 0, tpl->size);
  24248. for (member = tpl->members, i = 0; i < tpl->mcount;
  24249. member++, i++) {
  24250. switch (member->type) {
  24251. case WOLFSSL_X509_ALGOR_ASN1:
  24252. {
  24253. WOLFSSL_X509_ALGOR* algor = wolfSSL_X509_ALGOR_new();
  24254. if (!algor) {
  24255. goto error;
  24256. }
  24257. *(WOLFSSL_X509_ALGOR**)(((byte*)ret) + member->offset) = algor;
  24258. break;
  24259. }
  24260. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  24261. {
  24262. WOLFSSL_ASN1_BIT_STRING* bit_str = wolfSSL_ASN1_BIT_STRING_new();
  24263. if (!bit_str) {
  24264. goto error;
  24265. }
  24266. *(WOLFSSL_ASN1_BIT_STRING**)(((byte*)ret) + member->offset) = bit_str;
  24267. break;
  24268. }
  24269. default:
  24270. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_new");
  24271. goto error;
  24272. }
  24273. }
  24274. return ret;
  24275. error:
  24276. wolfSSL_ASN1_item_free(ret, tpl);
  24277. return NULL;
  24278. }
  24279. void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *tpl)
  24280. {
  24281. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  24282. size_t i;
  24283. WOLFSSL_ENTER("wolfSSL_ASN1_item_free");
  24284. if (val) {
  24285. for (member = tpl->members, i = 0; i < tpl->mcount;
  24286. member++, i++) {
  24287. switch (member->type) {
  24288. case WOLFSSL_X509_ALGOR_ASN1:
  24289. {
  24290. WOLFSSL_X509_ALGOR* algor = *(WOLFSSL_X509_ALGOR**)
  24291. (((byte*)val) + member->offset);
  24292. if (algor) {
  24293. wolfSSL_X509_ALGOR_free(algor);
  24294. }
  24295. break;
  24296. }
  24297. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  24298. {
  24299. WOLFSSL_ASN1_BIT_STRING* bit_str = *(WOLFSSL_ASN1_BIT_STRING**)
  24300. (((byte*)val) + member->offset);
  24301. if (bit_str) {
  24302. wolfSSL_ASN1_BIT_STRING_free(bit_str);
  24303. }
  24304. break;
  24305. }
  24306. default:
  24307. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_free");
  24308. }
  24309. }
  24310. XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
  24311. }
  24312. }
  24313. #define bufLenOrNull(buf, len) (buf ? buf + len : NULL)
  24314. static int i2dProcessMembers(const void *src, byte *buf,
  24315. const WOLFSSL_ASN1_TEMPLATE *members, size_t mcount)
  24316. {
  24317. const WOLFSSL_ASN1_TEMPLATE *member = NULL;
  24318. int len = 0, ret;
  24319. size_t i;
  24320. WOLFSSL_ENTER("processMembers");
  24321. for (member = members, i = 0; i < mcount; member++, i++) {
  24322. switch (member->type) {
  24323. case WOLFSSL_X509_ALGOR_ASN1:
  24324. {
  24325. word32 oid = 0;
  24326. word32 idx = 0;
  24327. const WOLFSSL_X509_ALGOR* algor = *(const WOLFSSL_X509_ALGOR**)
  24328. (((byte*)src) + member->offset);
  24329. if (!algor->algorithm) {
  24330. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  24331. return WOLFSSL_FAILURE;
  24332. }
  24333. if (GetObjectId(algor->algorithm->obj, &idx, &oid,
  24334. algor->algorithm->grp, algor->algorithm->objSz) < 0) {
  24335. WOLFSSL_MSG("Issue getting OID of object");
  24336. return -1;
  24337. }
  24338. ret = SetAlgoID(oid, bufLenOrNull(buf, len),
  24339. algor->algorithm->grp, 0);
  24340. if (!ret) {
  24341. return WOLFSSL_FAILURE;
  24342. }
  24343. len += ret;
  24344. break;
  24345. }
  24346. case WOLFSSL_ASN1_BIT_STRING_ASN1:
  24347. {
  24348. const WOLFSSL_ASN1_BIT_STRING* bit_str;
  24349. bit_str = *(const WOLFSSL_ASN1_BIT_STRING**)
  24350. (((byte*)src) + member->offset);
  24351. len += SetBitString(bit_str->length, 0, bufLenOrNull(buf, len));
  24352. if (buf && bit_str->data) {
  24353. XMEMCPY(buf + len, bit_str->data, bit_str->length);
  24354. }
  24355. len += bit_str->length;
  24356. break;
  24357. }
  24358. default:
  24359. WOLFSSL_MSG("Type not support in processMembers");
  24360. WOLFSSL_LEAVE("processMembers", WOLFSSL_FAILURE);
  24361. return WOLFSSL_FAILURE;
  24362. }
  24363. }
  24364. WOLFSSL_LEAVE("processMembers", len);
  24365. return len;
  24366. }
  24367. int wolfSSL_ASN1_item_i2d(const void *src, byte **dest,
  24368. const WOLFSSL_ASN1_ITEM *tpl)
  24369. {
  24370. int len = 0;
  24371. byte *buf = NULL;
  24372. WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d");
  24373. if (!src || !tpl) {
  24374. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  24375. return WOLFSSL_FAILURE;
  24376. }
  24377. if (dest && !*dest) {
  24378. len = wolfSSL_ASN1_item_i2d(src, NULL, tpl);
  24379. if (!len) {
  24380. goto error;
  24381. }
  24382. buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
  24383. if (!buf) {
  24384. goto error;
  24385. }
  24386. len = 0;
  24387. }
  24388. switch (tpl->type) {
  24389. case ASN_SEQUENCE:
  24390. {
  24391. int seq_len = i2dProcessMembers(src, NULL, tpl->members,
  24392. tpl->mcount);
  24393. if (!seq_len) {
  24394. goto error;
  24395. }
  24396. len += SetSequence(seq_len, bufLenOrNull(buf, len));
  24397. if (buf &&
  24398. i2dProcessMembers(src, bufLenOrNull(buf, len), tpl->members,
  24399. tpl->mcount) != seq_len) {
  24400. WOLFSSL_MSG("Inconsistent sequence length");
  24401. goto error;
  24402. }
  24403. len += seq_len;
  24404. break;
  24405. }
  24406. default:
  24407. WOLFSSL_MSG("Type not supported in wolfSSL_ASN1_item_i2d");
  24408. goto error;
  24409. }
  24410. if (dest && !*dest) {
  24411. *dest = buf;
  24412. }
  24413. else if (dest && *dest && buf) {
  24414. /* *dest length is not checked because the user is responsible
  24415. * for providing a long enough buffer */
  24416. XMEMCPY(*dest, buf, len);
  24417. }
  24418. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", len);
  24419. return len;
  24420. error:
  24421. if (buf) {
  24422. XFREE(buf, NULL, DYNAMIC_TYPE_ASN1);
  24423. }
  24424. WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
  24425. return WOLFSSL_FAILURE;
  24426. }
  24427. #endif /* OPENSSL_ALL */
  24428. #ifndef NO_DH
  24429. static void InitwolfSSL_DH(WOLFSSL_DH* dh)
  24430. {
  24431. if (dh) {
  24432. XMEMSET(dh, 0, sizeof(WOLFSSL_DH));
  24433. }
  24434. }
  24435. WOLFSSL_DH* wolfSSL_DH_new(void)
  24436. {
  24437. WOLFSSL_DH* external;
  24438. DhKey* key;
  24439. WOLFSSL_MSG("wolfSSL_DH_new");
  24440. key = (DhKey*) XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
  24441. if (key == NULL) {
  24442. WOLFSSL_MSG("wolfSSL_DH_new malloc DhKey failure");
  24443. return NULL;
  24444. }
  24445. external = (WOLFSSL_DH*) XMALLOC(sizeof(WOLFSSL_DH), NULL,
  24446. DYNAMIC_TYPE_DH);
  24447. if (external == NULL) {
  24448. WOLFSSL_MSG("wolfSSL_DH_new malloc WOLFSSL_DH failure");
  24449. XFREE(key, NULL, DYNAMIC_TYPE_DH);
  24450. return NULL;
  24451. }
  24452. InitwolfSSL_DH(external);
  24453. if (wc_InitDhKey(key) != 0) {
  24454. WOLFSSL_MSG("wolfSSL_DH_new InitDhKey failure");
  24455. XFREE(key, NULL, DYNAMIC_TYPE_DH);
  24456. XFREE(external, NULL, DYNAMIC_TYPE_DH);
  24457. return NULL;
  24458. }
  24459. external->internal = key;
  24460. return external;
  24461. }
  24462. void wolfSSL_DH_free(WOLFSSL_DH* dh)
  24463. {
  24464. WOLFSSL_MSG("wolfSSL_DH_free");
  24465. if (dh) {
  24466. if (dh->internal) {
  24467. wc_FreeDhKey((DhKey*)dh->internal);
  24468. XFREE(dh->internal, NULL, DYNAMIC_TYPE_DH);
  24469. dh->internal = NULL;
  24470. }
  24471. wolfSSL_BN_free(dh->priv_key);
  24472. wolfSSL_BN_free(dh->pub_key);
  24473. wolfSSL_BN_free(dh->g);
  24474. wolfSSL_BN_free(dh->p);
  24475. wolfSSL_BN_free(dh->q);
  24476. InitwolfSSL_DH(dh); /* set back to NULLs for safety */
  24477. XFREE(dh, NULL, DYNAMIC_TYPE_DH);
  24478. }
  24479. }
  24480. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  24481. int SetDhInternal(WOLFSSL_DH* dh)
  24482. {
  24483. int ret = WOLFSSL_FATAL_ERROR;
  24484. int pSz = 1024;
  24485. int gSz = 1024;
  24486. #ifdef WOLFSSL_DH_EXTRA
  24487. int privSz = 256; /* Up to 2048-bit */
  24488. int pubSz = 256;
  24489. #endif
  24490. #ifdef WOLFSSL_SMALL_STACK
  24491. unsigned char* p = NULL;
  24492. unsigned char* g = NULL;
  24493. #ifdef WOLFSSL_DH_EXTRA
  24494. unsigned char* priv_key = NULL;
  24495. unsigned char* pub_key = NULL;
  24496. #endif
  24497. #else
  24498. unsigned char p[1024];
  24499. unsigned char g[1024];
  24500. #ifdef WOLFSSL_DH_EXTRA
  24501. unsigned char priv_key[256];
  24502. unsigned char pub_key[256];
  24503. #endif
  24504. #endif
  24505. WOLFSSL_ENTER("SetDhInternal");
  24506. if (dh == NULL || dh->p == NULL || dh->g == NULL)
  24507. WOLFSSL_MSG("Bad function arguments");
  24508. else if (wolfSSL_BN_bn2bin(dh->p, NULL) > pSz)
  24509. WOLFSSL_MSG("Bad p internal size");
  24510. else if (wolfSSL_BN_bn2bin(dh->g, NULL) > gSz)
  24511. WOLFSSL_MSG("Bad g internal size");
  24512. #ifdef WOLFSSL_DH_EXTRA
  24513. else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > privSz)
  24514. WOLFSSL_MSG("Bad private key internal size");
  24515. else if (wolfSSL_BN_bn2bin(dh->pub_key, NULL) > privSz)
  24516. WOLFSSL_MSG("Bad public key internal size");
  24517. #endif
  24518. else {
  24519. #ifdef WOLFSSL_SMALL_STACK
  24520. p = (unsigned char*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24521. g = (unsigned char*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24522. #ifdef WOLFSSL_DH_EXTRA
  24523. priv_key = (unsigned char*)XMALLOC(privSz, NULL,
  24524. DYNAMIC_TYPE_PRIVATE_KEY);
  24525. pub_key = (unsigned char*)XMALLOC(pubSz, NULL,
  24526. DYNAMIC_TYPE_PUBLIC_KEY);
  24527. #endif
  24528. if (p == NULL || g == NULL) {
  24529. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24530. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24531. return ret;
  24532. }
  24533. #endif /* WOLFSSL_SMALL_STACK */
  24534. #ifdef WOLFSSL_DH_EXTRA
  24535. privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv_key);
  24536. pubSz = wolfSSL_BN_bn2bin(dh->pub_key, pub_key);
  24537. if (privSz <= 0) {
  24538. WOLFSSL_MSG("No private key size.");
  24539. }
  24540. if (pubSz <= 0) {
  24541. WOLFSSL_MSG("No public key size.");
  24542. }
  24543. if (privSz > 0 || pubSz > 0) {
  24544. ret = wc_DhImportKeyPair((DhKey*)dh->internal, priv_key, privSz,
  24545. pub_key, pubSz);
  24546. if (ret == 0) {
  24547. ret = WOLFSSL_SUCCESS;
  24548. }
  24549. else {
  24550. WOLFSSL_MSG("Failed setting private or public key.");
  24551. ret = WOLFSSL_FAILURE;
  24552. }
  24553. }
  24554. #endif /* WOLFSSL_DH_EXTRA */
  24555. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  24556. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  24557. if (pSz <= 0 || gSz <= 0)
  24558. WOLFSSL_MSG("Bad BN2bin set");
  24559. else if (wc_DhSetKey((DhKey*)dh->internal, p, pSz, g, gSz) < 0)
  24560. WOLFSSL_MSG("Bad DH SetKey");
  24561. else {
  24562. dh->inSet = 1;
  24563. ret = WOLFSSL_SUCCESS;
  24564. }
  24565. #ifdef WOLFSSL_SMALL_STACK
  24566. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24567. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24568. #ifdef WOLFSSL_DH_EXTRA
  24569. XFREE(priv_key, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  24570. XFREE(pub_key, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  24571. #endif
  24572. #endif
  24573. }
  24574. return ret;
  24575. }
  24576. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH))
  24577. /* Set the members of DhKey into WOLFSSL_DH
  24578. * DhKey was populated from wc_DhKeyDecode
  24579. */
  24580. int SetDhExternal(WOLFSSL_DH *dh)
  24581. {
  24582. DhKey *key;
  24583. WOLFSSL_MSG("Entering SetDhExternal");
  24584. if (dh == NULL || dh->internal == NULL) {
  24585. WOLFSSL_MSG("dh key NULL error");
  24586. }
  24587. key = (DhKey*)dh->internal;
  24588. if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) {
  24589. WOLFSSL_MSG("dh param p error");
  24590. return WOLFSSL_FATAL_ERROR;
  24591. }
  24592. if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) {
  24593. WOLFSSL_MSG("dh param g error");
  24594. return WOLFSSL_FATAL_ERROR;
  24595. }
  24596. if (SetIndividualExternal(&dh->priv_key, &key->priv) != WOLFSSL_SUCCESS) {
  24597. WOLFSSL_MSG("No DH Private Key");
  24598. return WOLFSSL_FATAL_ERROR;
  24599. }
  24600. if (SetIndividualExternal(&dh->pub_key, &key->pub) != WOLFSSL_SUCCESS) {
  24601. WOLFSSL_MSG("No DH Public Key");
  24602. return WOLFSSL_FATAL_ERROR;
  24603. }
  24604. dh->exSet = 1;
  24605. return WOLFSSL_SUCCESS;
  24606. }
  24607. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  24608. #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
  24609. /* return code compliant with OpenSSL :
  24610. * DH prime size in bytes if success, 0 if error
  24611. */
  24612. int wolfSSL_DH_size(WOLFSSL_DH* dh)
  24613. {
  24614. WOLFSSL_MSG("wolfSSL_DH_size");
  24615. if (dh == NULL)
  24616. return WOLFSSL_FATAL_ERROR;
  24617. return wolfSSL_BN_num_bytes(dh->p);
  24618. }
  24619. /* This sets a big number with the 768-bit prime from RFC 2409.
  24620. *
  24621. * bn if not NULL then the big number structure is used. If NULL then a new
  24622. * big number structure is created.
  24623. *
  24624. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24625. */
  24626. WOLFSSL_BIGNUM* wolfSSL_DH_768_prime(WOLFSSL_BIGNUM* bn)
  24627. {
  24628. const char prm[] = {
  24629. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24630. "C4C6628B80DC1CD129024E088A67CC74"
  24631. "020BBEA63B139B22514A08798E3404DD"
  24632. "EF9519B3CD3A431B302B0A6DF25F1437"
  24633. "4FE1356D6D51C245E485B576625E7EC6"
  24634. "F44C42E9A63A3620FFFFFFFFFFFFFFFF"
  24635. };
  24636. WOLFSSL_ENTER("wolfSSL_DH_768_prime");
  24637. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24638. WOLFSSL_MSG("Error converting DH 768 prime to big number");
  24639. return NULL;
  24640. }
  24641. return bn;
  24642. }
  24643. /* This sets a big number with the 1024-bit prime from RFC 2409.
  24644. *
  24645. * bn if not NULL then the big number structure is used. If NULL then a new
  24646. * big number structure is created.
  24647. *
  24648. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24649. */
  24650. WOLFSSL_BIGNUM* wolfSSL_DH_1024_prime(WOLFSSL_BIGNUM* bn)
  24651. {
  24652. const char prm[] = {
  24653. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24654. "C4C6628B80DC1CD129024E088A67CC74"
  24655. "020BBEA63B139B22514A08798E3404DD"
  24656. "EF9519B3CD3A431B302B0A6DF25F1437"
  24657. "4FE1356D6D51C245E485B576625E7EC6"
  24658. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24659. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24660. "49286651ECE65381FFFFFFFFFFFFFFFF"
  24661. };
  24662. WOLFSSL_ENTER("wolfSSL_DH_1024_prime");
  24663. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24664. WOLFSSL_MSG("Error converting DH 1024 prime to big number");
  24665. return NULL;
  24666. }
  24667. return bn;
  24668. }
  24669. /* This sets a big number with the 1536-bit prime from RFC 3526.
  24670. *
  24671. * bn if not NULL then the big number structure is used. If NULL then a new
  24672. * big number structure is created.
  24673. *
  24674. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24675. */
  24676. WOLFSSL_BIGNUM* wolfSSL_DH_1536_prime(WOLFSSL_BIGNUM* bn)
  24677. {
  24678. const char prm[] = {
  24679. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24680. "C4C6628B80DC1CD129024E088A67CC74"
  24681. "020BBEA63B139B22514A08798E3404DD"
  24682. "EF9519B3CD3A431B302B0A6DF25F1437"
  24683. "4FE1356D6D51C245E485B576625E7EC6"
  24684. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24685. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24686. "49286651ECE45B3DC2007CB8A163BF05"
  24687. "98DA48361C55D39A69163FA8FD24CF5F"
  24688. "83655D23DCA3AD961C62F356208552BB"
  24689. "9ED529077096966D670C354E4ABC9804"
  24690. "F1746C08CA237327FFFFFFFFFFFFFFFF"
  24691. };
  24692. WOLFSSL_ENTER("wolfSSL_DH_1536_prime");
  24693. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24694. WOLFSSL_MSG("Error converting DH 1536 prime to big number");
  24695. return NULL;
  24696. }
  24697. return bn;
  24698. }
  24699. /* This sets a big number with the 2048-bit prime from RFC 3526.
  24700. *
  24701. * bn if not NULL then the big number structure is used. If NULL then a new
  24702. * big number structure is created.
  24703. *
  24704. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24705. */
  24706. WOLFSSL_BIGNUM* wolfSSL_DH_2048_prime(WOLFSSL_BIGNUM* bn)
  24707. {
  24708. const char prm[] = {
  24709. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24710. "C4C6628B80DC1CD129024E088A67CC74"
  24711. "020BBEA63B139B22514A08798E3404DD"
  24712. "EF9519B3CD3A431B302B0A6DF25F1437"
  24713. "4FE1356D6D51C245E485B576625E7EC6"
  24714. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24715. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24716. "49286651ECE45B3DC2007CB8A163BF05"
  24717. "98DA48361C55D39A69163FA8FD24CF5F"
  24718. "83655D23DCA3AD961C62F356208552BB"
  24719. "9ED529077096966D670C354E4ABC9804"
  24720. "F1746C08CA18217C32905E462E36CE3B"
  24721. "E39E772C180E86039B2783A2EC07A28F"
  24722. "B5C55DF06F4C52C9DE2BCBF695581718"
  24723. "3995497CEA956AE515D2261898FA0510"
  24724. "15728E5A8AACAA68FFFFFFFFFFFFFFFF"
  24725. };
  24726. WOLFSSL_ENTER("wolfSSL_DH_2048_prime");
  24727. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24728. WOLFSSL_MSG("Error converting DH 2048 prime to big number");
  24729. return NULL;
  24730. }
  24731. return bn;
  24732. }
  24733. /* This sets a big number with the 3072-bit prime from RFC 3526.
  24734. *
  24735. * bn if not NULL then the big number structure is used. If NULL then a new
  24736. * big number structure is created.
  24737. *
  24738. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24739. */
  24740. WOLFSSL_BIGNUM* wolfSSL_DH_3072_prime(WOLFSSL_BIGNUM* bn)
  24741. {
  24742. const char prm[] = {
  24743. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24744. "C4C6628B80DC1CD129024E088A67CC74"
  24745. "020BBEA63B139B22514A08798E3404DD"
  24746. "EF9519B3CD3A431B302B0A6DF25F1437"
  24747. "4FE1356D6D51C245E485B576625E7EC6"
  24748. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24749. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24750. "49286651ECE45B3DC2007CB8A163BF05"
  24751. "98DA48361C55D39A69163FA8FD24CF5F"
  24752. "83655D23DCA3AD961C62F356208552BB"
  24753. "9ED529077096966D670C354E4ABC9804"
  24754. "F1746C08CA18217C32905E462E36CE3B"
  24755. "E39E772C180E86039B2783A2EC07A28F"
  24756. "B5C55DF06F4C52C9DE2BCBF695581718"
  24757. "3995497CEA956AE515D2261898FA0510"
  24758. "15728E5A8AAAC42DAD33170D04507A33"
  24759. "A85521ABDF1CBA64ECFB850458DBEF0A"
  24760. "8AEA71575D060C7DB3970F85A6E1E4C7"
  24761. "ABF5AE8CDB0933D71E8C94E04A25619D"
  24762. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  24763. "D87602733EC86A64521F2B18177B200C"
  24764. "BBE117577A615D6C770988C0BAD946E2"
  24765. "08E24FA074E5AB3143DB5BFCE0FD108E"
  24766. "4B82D120A93AD2CAFFFFFFFFFFFFFFFF"
  24767. };
  24768. WOLFSSL_ENTER("wolfSSL_DH_3072_prime");
  24769. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24770. WOLFSSL_MSG("Error converting DH 3072 prime to big number");
  24771. return NULL;
  24772. }
  24773. return bn;
  24774. }
  24775. /* This sets a big number with the 4096-bit prime from RFC 3526.
  24776. *
  24777. * bn if not NULL then the big number structure is used. If NULL then a new
  24778. * big number structure is created.
  24779. *
  24780. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24781. */
  24782. WOLFSSL_BIGNUM* wolfSSL_DH_4096_prime(WOLFSSL_BIGNUM* bn)
  24783. {
  24784. const char prm[] = {
  24785. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24786. "C4C6628B80DC1CD129024E088A67CC74"
  24787. "020BBEA63B139B22514A08798E3404DD"
  24788. "EF9519B3CD3A431B302B0A6DF25F1437"
  24789. "4FE1356D6D51C245E485B576625E7EC6"
  24790. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24791. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24792. "49286651ECE45B3DC2007CB8A163BF05"
  24793. "98DA48361C55D39A69163FA8FD24CF5F"
  24794. "83655D23DCA3AD961C62F356208552BB"
  24795. "9ED529077096966D670C354E4ABC9804"
  24796. "F1746C08CA18217C32905E462E36CE3B"
  24797. "E39E772C180E86039B2783A2EC07A28F"
  24798. "B5C55DF06F4C52C9DE2BCBF695581718"
  24799. "3995497CEA956AE515D2261898FA0510"
  24800. "15728E5A8AAAC42DAD33170D04507A33"
  24801. "A85521ABDF1CBA64ECFB850458DBEF0A"
  24802. "8AEA71575D060C7DB3970F85A6E1E4C7"
  24803. "ABF5AE8CDB0933D71E8C94E04A25619D"
  24804. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  24805. "D87602733EC86A64521F2B18177B200C"
  24806. "BBE117577A615D6C770988C0BAD946E2"
  24807. "08E24FA074E5AB3143DB5BFCE0FD108E"
  24808. "4B82D120A92108011A723C12A787E6D7"
  24809. "88719A10BDBA5B2699C327186AF4E23C"
  24810. "1A946834B6150BDA2583E9CA2AD44CE8"
  24811. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  24812. "287C59474E6BC05D99B2964FA090C3A2"
  24813. "233BA186515BE7ED1F612970CEE2D7AF"
  24814. "B81BDD762170481CD0069127D5B05AA9"
  24815. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  24816. "4DF435C934063199FFFFFFFFFFFFFFFF"
  24817. };
  24818. WOLFSSL_ENTER("wolfSSL_DH_4096_prime");
  24819. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24820. WOLFSSL_MSG("Error converting DH 4096 prime to big number");
  24821. return NULL;
  24822. }
  24823. return bn;
  24824. }
  24825. /* This sets a big number with the 6144-bit prime from RFC 3526.
  24826. *
  24827. * bn if not NULL then the big number structure is used. If NULL then a new
  24828. * big number structure is created.
  24829. *
  24830. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24831. */
  24832. WOLFSSL_BIGNUM* wolfSSL_DH_6144_prime(WOLFSSL_BIGNUM* bn)
  24833. {
  24834. const char prm[] = {
  24835. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24836. "C4C6628B80DC1CD129024E088A67CC74"
  24837. "020BBEA63B139B22514A08798E3404DD"
  24838. "EF9519B3CD3A431B302B0A6DF25F1437"
  24839. "4FE1356D6D51C245E485B576625E7EC6"
  24840. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24841. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24842. "49286651ECE45B3DC2007CB8A163BF05"
  24843. "98DA48361C55D39A69163FA8FD24CF5F"
  24844. "83655D23DCA3AD961C62F356208552BB"
  24845. "9ED529077096966D670C354E4ABC9804"
  24846. "F1746C08CA18217C32905E462E36CE3B"
  24847. "E39E772C180E86039B2783A2EC07A28F"
  24848. "B5C55DF06F4C52C9DE2BCBF695581718"
  24849. "3995497CEA956AE515D2261898FA0510"
  24850. "15728E5A8AAAC42DAD33170D04507A33"
  24851. "A85521ABDF1CBA64ECFB850458DBEF0A"
  24852. "8AEA71575D060C7DB3970F85A6E1E4C7"
  24853. "ABF5AE8CDB0933D71E8C94E04A25619D"
  24854. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  24855. "D87602733EC86A64521F2B18177B200C"
  24856. "BBE117577A615D6C770988C0BAD946E2"
  24857. "08E24FA074E5AB3143DB5BFCE0FD108E"
  24858. "4B82D120A92108011A723C12A787E6D7"
  24859. "88719A10BDBA5B2699C327186AF4E23C"
  24860. "1A946834B6150BDA2583E9CA2AD44CE8"
  24861. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  24862. "287C59474E6BC05D99B2964FA090C3A2"
  24863. "233BA186515BE7ED1F612970CEE2D7AF"
  24864. "B81BDD762170481CD0069127D5B05AA9"
  24865. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  24866. "4DF435C93402849236C3FAB4D27C7026"
  24867. "C1D4DCB2602646DEC9751E763DBA37BD"
  24868. "F8FF9406AD9E530EE5DB382F413001AE"
  24869. "B06A53ED9027D831179727B0865A8918"
  24870. "DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
  24871. "DB7F1447E6CC254B332051512BD7AF42"
  24872. "6FB8F401378CD2BF5983CA01C64B92EC"
  24873. "F032EA15D1721D03F482D7CE6E74FEF6"
  24874. "D55E702F46980C82B5A84031900B1C9E"
  24875. "59E7C97FBEC7E8F323A97A7E36CC88BE"
  24876. "0F1D45B7FF585AC54BD407B22B4154AA"
  24877. "CC8F6D7EBF48E1D814CC5ED20F8037E0"
  24878. "A79715EEF29BE32806A1D58BB7C5DA76"
  24879. "F550AA3D8A1FBFF0EB19CCB1A313D55C"
  24880. "DA56C9EC2EF29632387FE8D76E3C0468"
  24881. "043E8F663F4860EE12BF2D5B0B7474D6"
  24882. "E694F91E6DCC4024FFFFFFFFFFFFFFFF"
  24883. };
  24884. WOLFSSL_ENTER("wolfSSL_DH_6144_prime");
  24885. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24886. WOLFSSL_MSG("Error converting DH 6144 prime to big number");
  24887. return NULL;
  24888. }
  24889. return bn;
  24890. }
  24891. /* This sets a big number with the 8192-bit prime from RFC 3526.
  24892. *
  24893. * bn if not NULL then the big number structure is used. If NULL then a new
  24894. * big number structure is created.
  24895. *
  24896. * Returns a WOLFSSL_BIGNUM structure on success and NULL with failure.
  24897. */
  24898. WOLFSSL_BIGNUM* wolfSSL_DH_8192_prime(WOLFSSL_BIGNUM* bn)
  24899. {
  24900. const char prm[] = {
  24901. "FFFFFFFFFFFFFFFFC90FDAA22168C234"
  24902. "C4C6628B80DC1CD129024E088A67CC74"
  24903. "020BBEA63B139B22514A08798E3404DD"
  24904. "EF9519B3CD3A431B302B0A6DF25F1437"
  24905. "4FE1356D6D51C245E485B576625E7EC6"
  24906. "F44C42E9A637ED6B0BFF5CB6F406B7ED"
  24907. "EE386BFB5A899FA5AE9F24117C4B1FE6"
  24908. "49286651ECE45B3DC2007CB8A163BF05"
  24909. "98DA48361C55D39A69163FA8FD24CF5F"
  24910. "83655D23DCA3AD961C62F356208552BB"
  24911. "9ED529077096966D670C354E4ABC9804"
  24912. "F1746C08CA18217C32905E462E36CE3B"
  24913. "E39E772C180E86039B2783A2EC07A28F"
  24914. "B5C55DF06F4C52C9DE2BCBF695581718"
  24915. "3995497CEA956AE515D2261898FA0510"
  24916. "15728E5A8AAAC42DAD33170D04507A33"
  24917. "A85521ABDF1CBA64ECFB850458DBEF0A"
  24918. "8AEA71575D060C7DB3970F85A6E1E4C7"
  24919. "ABF5AE8CDB0933D71E8C94E04A25619D"
  24920. "CEE3D2261AD2EE6BF12FFA06D98A0864"
  24921. "D87602733EC86A64521F2B18177B200C"
  24922. "BBE117577A615D6C770988C0BAD946E2"
  24923. "08E24FA074E5AB3143DB5BFCE0FD108E"
  24924. "4B82D120A92108011A723C12A787E6D7"
  24925. "88719A10BDBA5B2699C327186AF4E23C"
  24926. "1A946834B6150BDA2583E9CA2AD44CE8"
  24927. "DBBBC2DB04DE8EF92E8EFC141FBECAA6"
  24928. "287C59474E6BC05D99B2964FA090C3A2"
  24929. "233BA186515BE7ED1F612970CEE2D7AF"
  24930. "B81BDD762170481CD0069127D5B05AA9"
  24931. "93B4EA988D8FDDC186FFB7DC90A6C08F"
  24932. "4DF435C93402849236C3FAB4D27C7026"
  24933. "C1D4DCB2602646DEC9751E763DBA37BD"
  24934. "F8FF9406AD9E530EE5DB382F413001AE"
  24935. "B06A53ED9027D831179727B0865A8918"
  24936. "DA3EDBEBCF9B14ED44CE6CBACED4BB1B"
  24937. "DB7F1447E6CC254B332051512BD7AF42"
  24938. "6FB8F401378CD2BF5983CA01C64B92EC"
  24939. "F032EA15D1721D03F482D7CE6E74FEF6"
  24940. "D55E702F46980C82B5A84031900B1C9E"
  24941. "59E7C97FBEC7E8F323A97A7E36CC88BE"
  24942. "0F1D45B7FF585AC54BD407B22B4154AA"
  24943. "CC8F6D7EBF48E1D814CC5ED20F8037E0"
  24944. "A79715EEF29BE32806A1D58BB7C5DA76"
  24945. "F550AA3D8A1FBFF0EB19CCB1A313D55C"
  24946. "DA56C9EC2EF29632387FE8D76E3C0468"
  24947. "043E8F663F4860EE12BF2D5B0B7474D6"
  24948. "E694F91E6DBE115974A3926F12FEE5E4"
  24949. "38777CB6A932DF8CD8BEC4D073B931BA"
  24950. "3BC832B68D9DD300741FA7BF8AFC47ED"
  24951. "2576F6936BA424663AAB639C5AE4F568"
  24952. "3423B4742BF1C978238F16CBE39D652D"
  24953. "E3FDB8BEFC848AD922222E04A4037C07"
  24954. "13EB57A81A23F0C73473FC646CEA306B"
  24955. "4BCBC8862F8385DDFA9D4B7FA2C087E8"
  24956. "79683303ED5BDD3A062B3CF5B3A278A6"
  24957. "6D2A13F83F44F82DDF310EE074AB6A36"
  24958. "4597E899A0255DC164F31CC50846851D"
  24959. "F9AB48195DED7EA1B1D510BD7EE74D73"
  24960. "FAF36BC31ECFA268359046F4EB879F92"
  24961. "4009438B481C6CD7889A002ED5EE382B"
  24962. "C9190DA6FC026E479558E4475677E9AA"
  24963. "9E3050E2765694DFC81F56E880B96E71"
  24964. "60C980DD98EDD3DFFFFFFFFFFFFFFFFF"
  24965. };
  24966. WOLFSSL_ENTER("wolfSSL_DH_8192_prime");
  24967. if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
  24968. WOLFSSL_MSG("Error converting DH 8192 prime to big number");
  24969. return NULL;
  24970. }
  24971. return bn;
  24972. }
  24973. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  24974. /* return code compliant with OpenSSL :
  24975. * 1 if success, 0 if error
  24976. */
  24977. int wolfSSL_DH_generate_key(WOLFSSL_DH* dh)
  24978. {
  24979. int ret = WOLFSSL_FAILURE;
  24980. word32 pubSz = 0;
  24981. word32 privSz = 0;
  24982. int initTmpRng = 0;
  24983. WC_RNG* rng = NULL;
  24984. #ifdef WOLFSSL_SMALL_STACK
  24985. WC_RNG* tmpRNG;
  24986. #else
  24987. WC_RNG tmpRNG[1];
  24988. #endif
  24989. unsigned char* pub = NULL;
  24990. unsigned char* priv = NULL;
  24991. WOLFSSL_MSG("wolfSSL_DH_generate_key");
  24992. #ifdef WOLFSSL_SMALL_STACK
  24993. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  24994. if (tmpRNG == NULL) {
  24995. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  24996. return ret;
  24997. }
  24998. #endif
  24999. if (dh == NULL || dh->p == NULL || dh->g == NULL)
  25000. WOLFSSL_MSG("Bad function arguments");
  25001. else if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS)
  25002. WOLFSSL_MSG("Bad DH set internal");
  25003. else if (wc_InitRng(tmpRNG) == 0) {
  25004. rng = tmpRNG;
  25005. initTmpRng = 1;
  25006. }
  25007. else {
  25008. WOLFSSL_MSG("Bad RNG Init, trying global");
  25009. if (initGlobalRNG == 0)
  25010. WOLFSSL_MSG("Global RNG no Init");
  25011. else
  25012. rng = &globalRNG;
  25013. }
  25014. if (rng) {
  25015. pubSz = wolfSSL_BN_num_bytes(dh->p);
  25016. if (dh->length) {
  25017. privSz = dh->length/8; /* to bytes */
  25018. } else {
  25019. privSz = pubSz;
  25020. }
  25021. pub = (unsigned char*)XMALLOC(pubSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  25022. priv = (unsigned char*)XMALLOC(privSz, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  25023. if (pub == NULL || priv == NULL) {
  25024. WOLFSSL_MSG("Unable to malloc memory");
  25025. }
  25026. else if (wc_DhGenerateKeyPair((DhKey*)dh->internal, rng, priv, &privSz,
  25027. pub, &pubSz) < 0)
  25028. WOLFSSL_MSG("Bad wc_DhGenerateKeyPair");
  25029. else {
  25030. if (dh->pub_key)
  25031. wolfSSL_BN_free(dh->pub_key);
  25032. dh->pub_key = wolfSSL_BN_new();
  25033. if (dh->pub_key == NULL) {
  25034. WOLFSSL_MSG("Bad DH new pub");
  25035. }
  25036. if (dh->priv_key)
  25037. wolfSSL_BN_free(dh->priv_key);
  25038. dh->priv_key = wolfSSL_BN_new();
  25039. if (dh->priv_key == NULL) {
  25040. WOLFSSL_MSG("Bad DH new priv");
  25041. }
  25042. if (dh->pub_key && dh->priv_key) {
  25043. if (wolfSSL_BN_bin2bn(pub, pubSz, dh->pub_key) == NULL)
  25044. WOLFSSL_MSG("Bad DH bn2bin error pub");
  25045. else if (wolfSSL_BN_bin2bn(priv, privSz, dh->priv_key) == NULL)
  25046. WOLFSSL_MSG("Bad DH bn2bin error priv");
  25047. else
  25048. ret = WOLFSSL_SUCCESS;
  25049. }
  25050. }
  25051. }
  25052. if (initTmpRng)
  25053. wc_FreeRng(tmpRNG);
  25054. #ifdef WOLFSSL_SMALL_STACK
  25055. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25056. #endif
  25057. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  25058. XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  25059. return ret;
  25060. }
  25061. /* return code compliant with OpenSSL :
  25062. * size of shared secret if success, -1 if error
  25063. */
  25064. int wolfSSL_DH_compute_key(unsigned char* key, WOLFSSL_BIGNUM* otherPub,
  25065. WOLFSSL_DH* dh)
  25066. {
  25067. int ret = WOLFSSL_FATAL_ERROR;
  25068. word32 keySz = 0;
  25069. int pubSz = 1024;
  25070. int privSz = 1024;
  25071. #ifdef WOLFSSL_SMALL_STACK
  25072. unsigned char* pub;
  25073. unsigned char* priv = NULL;
  25074. #else
  25075. unsigned char pub [1024];
  25076. unsigned char priv[1024];
  25077. #endif
  25078. WOLFSSL_MSG("wolfSSL_DH_compute_key");
  25079. #ifdef WOLFSSL_SMALL_STACK
  25080. pub = (unsigned char*)XMALLOC(pubSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  25081. if (pub == NULL)
  25082. return ret;
  25083. priv = (unsigned char*)XMALLOC(privSz, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  25084. if (priv == NULL) {
  25085. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  25086. return ret;
  25087. }
  25088. #endif
  25089. if (dh == NULL || dh->priv_key == NULL || otherPub == NULL)
  25090. WOLFSSL_MSG("Bad function arguments");
  25091. else if ((keySz = (word32)DH_size(dh)) == 0)
  25092. WOLFSSL_MSG("Bad DH_size");
  25093. else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > (int)privSz)
  25094. WOLFSSL_MSG("Bad priv internal size");
  25095. else if (wolfSSL_BN_bn2bin(otherPub, NULL) > (int)pubSz)
  25096. WOLFSSL_MSG("Bad otherPub size");
  25097. else {
  25098. privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv);
  25099. pubSz = wolfSSL_BN_bn2bin(otherPub, pub);
  25100. if (dh->inSet == 0 && SetDhInternal(dh) != SSL_SUCCESS){
  25101. WOLFSSL_MSG("Bad DH set internal");
  25102. }
  25103. if (privSz <= 0 || pubSz <= 0)
  25104. WOLFSSL_MSG("Bad BN2bin set");
  25105. else if (wc_DhAgree((DhKey*)dh->internal, key, &keySz,
  25106. priv, privSz, pub, pubSz) < 0)
  25107. WOLFSSL_MSG("wc_DhAgree failed");
  25108. else
  25109. ret = (int)keySz;
  25110. }
  25111. #ifdef WOLFSSL_SMALL_STACK
  25112. XFREE(pub, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  25113. XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
  25114. #endif
  25115. return ret;
  25116. }
  25117. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  25118. /* ownership of p,q,and g get taken over by "dh" on success and should be free'd
  25119. * with a call to wolfSSL_DH_free -- not individually.
  25120. *
  25121. * returns WOLFSSL_SUCCESS on success
  25122. */
  25123. int wolfSSL_DH_set0_pqg(WOLFSSL_DH *dh, WOLFSSL_BIGNUM *p,
  25124. WOLFSSL_BIGNUM *q, WOLFSSL_BIGNUM *g)
  25125. {
  25126. int ret;
  25127. WOLFSSL_ENTER("wolfSSL_DH_set0_pqg");
  25128. /* q can be NULL */
  25129. if (dh == NULL || p == NULL || g == NULL) {
  25130. WOLFSSL_MSG("Bad function arguments");
  25131. return WOLFSSL_FAILURE;
  25132. }
  25133. /* free existing internal DH structure and recreate with new p / g */
  25134. if (dh->inSet) {
  25135. ret = wc_FreeDhKey((DhKey*)dh->internal);
  25136. if (ret != 0) {
  25137. WOLFSSL_MSG("Unable to free internal DH key");
  25138. return WOLFSSL_FAILURE;
  25139. }
  25140. }
  25141. wolfSSL_BN_free(dh->p);
  25142. wolfSSL_BN_free(dh->q);
  25143. wolfSSL_BN_free(dh->g);
  25144. wolfSSL_BN_free(dh->pub_key);
  25145. wolfSSL_BN_free(dh->priv_key);
  25146. dh->p = p;
  25147. dh->q = q;
  25148. dh->g = g;
  25149. ret = SetDhInternal(dh);
  25150. if (ret != WOLFSSL_SUCCESS) {
  25151. WOLFSSL_MSG("Unable to set internal DH key");
  25152. dh->p = NULL;
  25153. dh->q = NULL;
  25154. dh->g = NULL;
  25155. dh->inSet = 0;
  25156. return WOLFSSL_FAILURE;
  25157. }
  25158. return WOLFSSL_SUCCESS;
  25159. }
  25160. #endif /* v1.1.0 or later */
  25161. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  25162. #endif /* NO_DH */
  25163. #endif /* OPENSSL_EXTRA */
  25164. #if !defined(NO_DSA) && \
  25165. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  25166. static void InitwolfSSL_DSA(WOLFSSL_DSA* dsa)
  25167. {
  25168. if (dsa) {
  25169. dsa->p = NULL;
  25170. dsa->q = NULL;
  25171. dsa->g = NULL;
  25172. dsa->pub_key = NULL;
  25173. dsa->priv_key = NULL;
  25174. dsa->internal = NULL;
  25175. dsa->inSet = 0;
  25176. dsa->exSet = 0;
  25177. }
  25178. }
  25179. WOLFSSL_DSA* wolfSSL_DSA_new(void)
  25180. {
  25181. WOLFSSL_DSA* external;
  25182. DsaKey* key;
  25183. WOLFSSL_MSG("wolfSSL_DSA_new");
  25184. key = (DsaKey*) XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA);
  25185. if (key == NULL) {
  25186. WOLFSSL_MSG("wolfSSL_DSA_new malloc DsaKey failure");
  25187. return NULL;
  25188. }
  25189. external = (WOLFSSL_DSA*) XMALLOC(sizeof(WOLFSSL_DSA), NULL,
  25190. DYNAMIC_TYPE_DSA);
  25191. if (external == NULL) {
  25192. WOLFSSL_MSG("wolfSSL_DSA_new malloc WOLFSSL_DSA failure");
  25193. XFREE(key, NULL, DYNAMIC_TYPE_DSA);
  25194. return NULL;
  25195. }
  25196. InitwolfSSL_DSA(external);
  25197. if (wc_InitDsaKey(key) != 0) {
  25198. WOLFSSL_MSG("wolfSSL_DSA_new InitDsaKey failure");
  25199. XFREE(key, NULL, DYNAMIC_TYPE_DSA);
  25200. wolfSSL_DSA_free(external);
  25201. return NULL;
  25202. }
  25203. external->internal = key;
  25204. return external;
  25205. }
  25206. void wolfSSL_DSA_free(WOLFSSL_DSA* dsa)
  25207. {
  25208. WOLFSSL_MSG("wolfSSL_DSA_free");
  25209. if (dsa) {
  25210. if (dsa->internal) {
  25211. FreeDsaKey((DsaKey*)dsa->internal);
  25212. XFREE(dsa->internal, NULL, DYNAMIC_TYPE_DSA);
  25213. dsa->internal = NULL;
  25214. }
  25215. wolfSSL_BN_free(dsa->priv_key);
  25216. wolfSSL_BN_free(dsa->pub_key);
  25217. wolfSSL_BN_free(dsa->g);
  25218. wolfSSL_BN_free(dsa->q);
  25219. wolfSSL_BN_free(dsa->p);
  25220. InitwolfSSL_DSA(dsa); /* set back to NULLs for safety */
  25221. XFREE(dsa, NULL, DYNAMIC_TYPE_DSA);
  25222. /* dsa = NULL, don't try to access or double free it */
  25223. }
  25224. }
  25225. /* wolfSSL -> OpenSSL */
  25226. int SetDsaExternal(WOLFSSL_DSA* dsa)
  25227. {
  25228. DsaKey* key;
  25229. WOLFSSL_MSG("Entering SetDsaExternal");
  25230. if (dsa == NULL || dsa->internal == NULL) {
  25231. WOLFSSL_MSG("dsa key NULL error");
  25232. return WOLFSSL_FATAL_ERROR;
  25233. }
  25234. key = (DsaKey*)dsa->internal;
  25235. if (SetIndividualExternal(&dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  25236. WOLFSSL_MSG("dsa p key error");
  25237. return WOLFSSL_FATAL_ERROR;
  25238. }
  25239. if (SetIndividualExternal(&dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  25240. WOLFSSL_MSG("dsa q key error");
  25241. return WOLFSSL_FATAL_ERROR;
  25242. }
  25243. if (SetIndividualExternal(&dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  25244. WOLFSSL_MSG("dsa g key error");
  25245. return WOLFSSL_FATAL_ERROR;
  25246. }
  25247. if (SetIndividualExternal(&dsa->pub_key, &key->y) != WOLFSSL_SUCCESS) {
  25248. WOLFSSL_MSG("dsa y key error");
  25249. return WOLFSSL_FATAL_ERROR;
  25250. }
  25251. if (SetIndividualExternal(&dsa->priv_key, &key->x) != WOLFSSL_SUCCESS) {
  25252. WOLFSSL_MSG("dsa x key error");
  25253. return WOLFSSL_FATAL_ERROR;
  25254. }
  25255. dsa->exSet = 1;
  25256. return WOLFSSL_SUCCESS;
  25257. }
  25258. #endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  25259. #if !defined(NO_DSA) && defined(OPENSSL_EXTRA)
  25260. /* Openssl -> WolfSSL */
  25261. int SetDsaInternal(WOLFSSL_DSA* dsa)
  25262. {
  25263. DsaKey* key;
  25264. WOLFSSL_MSG("Entering SetDsaInternal");
  25265. if (dsa == NULL || dsa->internal == NULL) {
  25266. WOLFSSL_MSG("dsa key NULL error");
  25267. return WOLFSSL_FATAL_ERROR;
  25268. }
  25269. key = (DsaKey*)dsa->internal;
  25270. if (dsa->p != NULL &&
  25271. SetIndividualInternal(dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  25272. WOLFSSL_MSG("rsa p key error");
  25273. return WOLFSSL_FATAL_ERROR;
  25274. }
  25275. if (dsa->q != NULL &&
  25276. SetIndividualInternal(dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  25277. WOLFSSL_MSG("rsa q key error");
  25278. return WOLFSSL_FATAL_ERROR;
  25279. }
  25280. if (dsa->g != NULL &&
  25281. SetIndividualInternal(dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  25282. WOLFSSL_MSG("rsa g key error");
  25283. return WOLFSSL_FATAL_ERROR;
  25284. }
  25285. if (dsa->pub_key != NULL) {
  25286. if (SetIndividualInternal(dsa->pub_key, &key->y) != WOLFSSL_SUCCESS) {
  25287. WOLFSSL_MSG("rsa pub_key error");
  25288. return WOLFSSL_FATAL_ERROR;
  25289. }
  25290. /* public key */
  25291. key->type = DSA_PUBLIC;
  25292. }
  25293. if (dsa->priv_key != NULL) {
  25294. if (SetIndividualInternal(dsa->priv_key, &key->x) != WOLFSSL_SUCCESS) {
  25295. WOLFSSL_MSG("rsa priv_key error");
  25296. return WOLFSSL_FATAL_ERROR;
  25297. }
  25298. /* private key */
  25299. key->type = DSA_PRIVATE;
  25300. }
  25301. dsa->inSet = 1;
  25302. return WOLFSSL_SUCCESS;
  25303. }
  25304. #endif /* !NO_DSA && OPENSSL_EXTRA */
  25305. #ifdef OPENSSL_EXTRA
  25306. #if !defined(NO_RSA)
  25307. /* Generates a RSA key of length len
  25308. *
  25309. * len length of RSA key i.e. 2048
  25310. * e e to use when generating RSA key
  25311. * f callback function for generation details
  25312. * data user callback argument
  25313. *
  25314. * Note: Because of wc_MakeRsaKey an RSA key size generated can be slightly
  25315. * rounded down. For example generating a key of size 2999 with e =
  25316. * 65537 will make a key of size 374 instead of 375.
  25317. * Returns a new RSA key on success and NULL on failure
  25318. */
  25319. WOLFSSL_RSA* wolfSSL_RSA_generate_key(int len, unsigned long e,
  25320. void(*f)(int, int, void*), void* data)
  25321. {
  25322. WOLFSSL_RSA* rsa = NULL;
  25323. WOLFSSL_BIGNUM* bn = NULL;
  25324. WOLFSSL_ENTER("wolfSSL_RSA_generate_key");
  25325. (void)f;
  25326. (void)data;
  25327. if (len < 0) {
  25328. WOLFSSL_MSG("Bad argument: length was less than 0");
  25329. return NULL;
  25330. }
  25331. bn = wolfSSL_BN_new();
  25332. if (bn == NULL) {
  25333. WOLFSSL_MSG("Error creating big number");
  25334. return NULL;
  25335. }
  25336. if (wolfSSL_BN_set_word(bn, (WOLFSSL_BN_ULONG)e) != SSL_SUCCESS) {
  25337. WOLFSSL_MSG("Error using e value");
  25338. wolfSSL_BN_free(bn);
  25339. return NULL;
  25340. }
  25341. rsa = wolfSSL_RSA_new();
  25342. if (rsa == NULL) {
  25343. WOLFSSL_MSG("memory error");
  25344. }
  25345. else {
  25346. if (wolfSSL_RSA_generate_key_ex(rsa, len, bn, NULL) != SSL_SUCCESS){
  25347. wolfSSL_RSA_free(rsa);
  25348. rsa = NULL;
  25349. }
  25350. }
  25351. wolfSSL_BN_free(bn);
  25352. return rsa;
  25353. }
  25354. /* return compliant with OpenSSL
  25355. * 1 if success, 0 if error
  25356. */
  25357. int wolfSSL_RSA_generate_key_ex(WOLFSSL_RSA* rsa, int bits, WOLFSSL_BIGNUM* bn,
  25358. void* cb)
  25359. {
  25360. int ret = WOLFSSL_FAILURE;
  25361. (void)cb;
  25362. (void)bn;
  25363. (void)bits;
  25364. WOLFSSL_ENTER("wolfSSL_RSA_generate_key_ex");
  25365. if (rsa == NULL || rsa->internal == NULL) {
  25366. /* bit size checked during make key call */
  25367. WOLFSSL_MSG("bad arguments");
  25368. return WOLFSSL_FAILURE;
  25369. }
  25370. #ifdef WOLFSSL_KEY_GEN
  25371. {
  25372. #ifdef WOLFSSL_SMALL_STACK
  25373. WC_RNG* rng;
  25374. #else
  25375. WC_RNG rng[1];
  25376. #endif
  25377. #ifdef WOLFSSL_SMALL_STACK
  25378. rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25379. if (rng == NULL)
  25380. return WOLFSSL_FAILURE;
  25381. #endif
  25382. if (wc_InitRng(rng) < 0)
  25383. WOLFSSL_MSG("RNG init failed");
  25384. else if (wc_MakeRsaKey((RsaKey*)rsa->internal, bits,
  25385. wolfSSL_BN_get_word(bn), rng) != MP_OKAY)
  25386. WOLFSSL_MSG("wc_MakeRsaKey failed");
  25387. else if (SetRsaExternal(rsa) != WOLFSSL_SUCCESS)
  25388. WOLFSSL_MSG("SetRsaExternal failed");
  25389. else {
  25390. rsa->inSet = 1;
  25391. ret = WOLFSSL_SUCCESS;
  25392. }
  25393. wc_FreeRng(rng);
  25394. #ifdef WOLFSSL_SMALL_STACK
  25395. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  25396. #endif
  25397. }
  25398. #else
  25399. WOLFSSL_MSG("No Key Gen built in");
  25400. #endif
  25401. return ret;
  25402. }
  25403. #endif /* NO_RSA */
  25404. #ifndef NO_DSA
  25405. /* return code compliant with OpenSSL :
  25406. * 1 if success, 0 if error
  25407. */
  25408. int wolfSSL_DSA_generate_key(WOLFSSL_DSA* dsa)
  25409. {
  25410. int ret = WOLFSSL_FAILURE;
  25411. WOLFSSL_ENTER("wolfSSL_DSA_generate_key");
  25412. if (dsa == NULL || dsa->internal == NULL) {
  25413. WOLFSSL_MSG("Bad arguments");
  25414. return WOLFSSL_FAILURE;
  25415. }
  25416. if (dsa->inSet == 0) {
  25417. WOLFSSL_MSG("No DSA internal set, do it");
  25418. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  25419. WOLFSSL_MSG("SetDsaInternal failed");
  25420. return ret;
  25421. }
  25422. }
  25423. #ifdef WOLFSSL_KEY_GEN
  25424. {
  25425. int initTmpRng = 0;
  25426. WC_RNG *rng = NULL;
  25427. #ifdef WOLFSSL_SMALL_STACK
  25428. WC_RNG *tmpRNG;
  25429. #else
  25430. WC_RNG tmpRNG[1];
  25431. #endif
  25432. #ifdef WOLFSSL_SMALL_STACK
  25433. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25434. if (tmpRNG == NULL)
  25435. return WOLFSSL_FATAL_ERROR;
  25436. #endif
  25437. if (wc_InitRng(tmpRNG) == 0) {
  25438. rng = tmpRNG;
  25439. initTmpRng = 1;
  25440. }
  25441. else {
  25442. WOLFSSL_MSG("Bad RNG Init, trying global");
  25443. if (initGlobalRNG == 0)
  25444. WOLFSSL_MSG("Global RNG no Init");
  25445. else
  25446. rng = &globalRNG;
  25447. }
  25448. if (rng) {
  25449. if (wc_MakeDsaKey(rng, (DsaKey*)dsa->internal) != MP_OKAY)
  25450. WOLFSSL_MSG("wc_MakeDsaKey failed");
  25451. else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
  25452. WOLFSSL_MSG("SetDsaExternal failed");
  25453. else
  25454. ret = WOLFSSL_SUCCESS;
  25455. }
  25456. if (initTmpRng)
  25457. wc_FreeRng(tmpRNG);
  25458. #ifdef WOLFSSL_SMALL_STACK
  25459. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25460. #endif
  25461. }
  25462. #else /* WOLFSSL_KEY_GEN */
  25463. WOLFSSL_MSG("No Key Gen built in");
  25464. #endif
  25465. return ret;
  25466. }
  25467. /* Returns a pointer to a new WOLFSSL_DSA structure on success and NULL on fail
  25468. */
  25469. WOLFSSL_DSA* wolfSSL_DSA_generate_parameters(int bits, unsigned char* seed,
  25470. int seedLen, int* counterRet, unsigned long* hRet,
  25471. WOLFSSL_BN_CB cb, void* CBArg)
  25472. {
  25473. WOLFSSL_DSA* dsa;
  25474. WOLFSSL_ENTER("wolfSSL_DSA_generate_parameters()");
  25475. (void)cb;
  25476. (void)CBArg;
  25477. dsa = wolfSSL_DSA_new();
  25478. if (dsa == NULL) {
  25479. return NULL;
  25480. }
  25481. if (wolfSSL_DSA_generate_parameters_ex(dsa, bits, seed, seedLen,
  25482. counterRet, hRet, NULL) != SSL_SUCCESS) {
  25483. wolfSSL_DSA_free(dsa);
  25484. return NULL;
  25485. }
  25486. return dsa;
  25487. }
  25488. /* return code compliant with OpenSSL :
  25489. * 1 if success, 0 if error
  25490. */
  25491. int wolfSSL_DSA_generate_parameters_ex(WOLFSSL_DSA* dsa, int bits,
  25492. unsigned char* seed, int seedLen,
  25493. int* counterRet,
  25494. unsigned long* hRet, void* cb)
  25495. {
  25496. int ret = WOLFSSL_FAILURE;
  25497. (void)bits;
  25498. (void)seed;
  25499. (void)seedLen;
  25500. (void)counterRet;
  25501. (void)hRet;
  25502. (void)cb;
  25503. WOLFSSL_ENTER("wolfSSL_DSA_generate_parameters_ex");
  25504. if (dsa == NULL || dsa->internal == NULL) {
  25505. WOLFSSL_MSG("Bad arguments");
  25506. return WOLFSSL_FAILURE;
  25507. }
  25508. #ifdef WOLFSSL_KEY_GEN
  25509. {
  25510. int initTmpRng = 0;
  25511. WC_RNG *rng = NULL;
  25512. #ifdef WOLFSSL_SMALL_STACK
  25513. WC_RNG *tmpRNG;
  25514. #else
  25515. WC_RNG tmpRNG[1];
  25516. #endif
  25517. #ifdef WOLFSSL_SMALL_STACK
  25518. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25519. if (tmpRNG == NULL)
  25520. return WOLFSSL_FATAL_ERROR;
  25521. #endif
  25522. if (wc_InitRng(tmpRNG) == 0) {
  25523. rng = tmpRNG;
  25524. initTmpRng = 1;
  25525. }
  25526. else {
  25527. WOLFSSL_MSG("Bad RNG Init, trying global");
  25528. if (initGlobalRNG == 0)
  25529. WOLFSSL_MSG("Global RNG no Init");
  25530. else
  25531. rng = &globalRNG;
  25532. }
  25533. if (rng) {
  25534. if (wc_MakeDsaParameters(rng, bits,
  25535. (DsaKey*)dsa->internal) != MP_OKAY)
  25536. WOLFSSL_MSG("wc_MakeDsaParameters failed");
  25537. else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
  25538. WOLFSSL_MSG("SetDsaExternal failed");
  25539. else
  25540. ret = WOLFSSL_SUCCESS;
  25541. }
  25542. if (initTmpRng)
  25543. wc_FreeRng(tmpRNG);
  25544. #ifdef WOLFSSL_SMALL_STACK
  25545. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25546. #endif
  25547. }
  25548. #else /* WOLFSSL_KEY_GEN */
  25549. WOLFSSL_MSG("No Key Gen built in");
  25550. #endif
  25551. return ret;
  25552. }
  25553. WOLFSSL_DSA_SIG* wolfSSL_DSA_SIG_new(void)
  25554. {
  25555. WOLFSSL_DSA_SIG* sig;
  25556. WOLFSSL_ENTER("wolfSSL_DSA_SIG_new");
  25557. sig = (WOLFSSL_DSA_SIG*)XMALLOC(sizeof(WOLFSSL_DSA_SIG), NULL, DYNAMIC_TYPE_OPENSSL);
  25558. if (sig)
  25559. XMEMSET(sig, 0, sizeof(WOLFSSL_DSA_SIG));
  25560. return sig;
  25561. }
  25562. void wolfSSL_DSA_SIG_free(WOLFSSL_DSA_SIG *sig)
  25563. {
  25564. WOLFSSL_ENTER("wolfSSL_DSA_SIG_free");
  25565. if (sig) {
  25566. if (sig->r) {
  25567. wolfSSL_BN_free(sig->r);
  25568. }
  25569. if (sig->s) {
  25570. wolfSSL_BN_free(sig->s);
  25571. }
  25572. XFREE(sig, NULL, DYNAMIC_TYPE_OPENSSL);
  25573. }
  25574. }
  25575. /* return WOLFSSL_SUCCESS on success, < 0 otherwise */
  25576. int wolfSSL_DSA_do_sign(const unsigned char* d, unsigned char* sigRet,
  25577. WOLFSSL_DSA* dsa)
  25578. {
  25579. int ret = WOLFSSL_FATAL_ERROR;
  25580. int initTmpRng = 0;
  25581. WC_RNG* rng = NULL;
  25582. #ifdef WOLFSSL_SMALL_STACK
  25583. WC_RNG* tmpRNG = NULL;
  25584. #else
  25585. WC_RNG tmpRNG[1];
  25586. #endif
  25587. WOLFSSL_ENTER("wolfSSL_DSA_do_sign");
  25588. if (d == NULL || sigRet == NULL || dsa == NULL) {
  25589. WOLFSSL_MSG("Bad function arguments");
  25590. return ret;
  25591. }
  25592. if (dsa->inSet == 0)
  25593. {
  25594. WOLFSSL_MSG("No DSA internal set, do it");
  25595. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  25596. WOLFSSL_MSG("SetDsaInternal failed");
  25597. return ret;
  25598. }
  25599. }
  25600. #ifdef WOLFSSL_SMALL_STACK
  25601. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25602. if (tmpRNG == NULL)
  25603. return WOLFSSL_FATAL_ERROR;
  25604. #endif
  25605. if (wc_InitRng(tmpRNG) == 0) {
  25606. rng = tmpRNG;
  25607. initTmpRng = 1;
  25608. }
  25609. else {
  25610. WOLFSSL_MSG("Bad RNG Init, trying global");
  25611. if (initGlobalRNG == 0)
  25612. WOLFSSL_MSG("Global RNG no Init");
  25613. else
  25614. rng = &globalRNG;
  25615. }
  25616. if (rng) {
  25617. if (DsaSign(d, sigRet, (DsaKey*)dsa->internal, rng) < 0)
  25618. WOLFSSL_MSG("DsaSign failed");
  25619. else
  25620. ret = WOLFSSL_SUCCESS;
  25621. }
  25622. if (initTmpRng)
  25623. wc_FreeRng(tmpRNG);
  25624. #ifdef WOLFSSL_SMALL_STACK
  25625. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25626. #endif
  25627. return ret;
  25628. }
  25629. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  25630. WOLFSSL_DSA_SIG* wolfSSL_DSA_do_sign_ex(const unsigned char* digest,
  25631. int outLen, WOLFSSL_DSA* dsa)
  25632. {
  25633. WOLFSSL_DSA_SIG* sig = NULL;
  25634. byte sigBin[DSA_SIG_SIZE];
  25635. WOLFSSL_ENTER("wolfSSL_DSA_do_sign_ex");
  25636. if (!digest || !dsa || outLen != WC_SHA_DIGEST_SIZE) {
  25637. WOLFSSL_MSG("Bad function arguments");
  25638. return NULL;
  25639. }
  25640. if (wolfSSL_DSA_do_sign(digest, sigBin, dsa) != WOLFSSL_SUCCESS) {
  25641. return NULL;
  25642. }
  25643. if (!(sig = wolfSSL_DSA_SIG_new())) {
  25644. goto error;
  25645. }
  25646. if (!(sig->r = wolfSSL_BN_bin2bn(sigBin, DSA_HALF_SIZE, NULL))) {
  25647. goto error;
  25648. }
  25649. if (!(sig->s = wolfSSL_BN_bin2bn(sigBin + DSA_HALF_SIZE, DSA_HALF_SIZE, NULL))) {
  25650. goto error;
  25651. }
  25652. return sig;
  25653. error:
  25654. if (sig) {
  25655. wolfSSL_DSA_SIG_free(sig);
  25656. }
  25657. return NULL;
  25658. }
  25659. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  25660. int wolfSSL_DSA_do_verify(const unsigned char* d, unsigned char* sig,
  25661. WOLFSSL_DSA* dsa, int *dsacheck)
  25662. {
  25663. int ret = WOLFSSL_FATAL_ERROR;
  25664. WOLFSSL_ENTER("wolfSSL_DSA_do_verify");
  25665. if (d == NULL || sig == NULL || dsa == NULL) {
  25666. WOLFSSL_MSG("Bad function arguments");
  25667. return WOLFSSL_FATAL_ERROR;
  25668. }
  25669. if (dsa->inSet == 0)
  25670. {
  25671. WOLFSSL_MSG("No DSA internal set, do it");
  25672. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  25673. WOLFSSL_MSG("SetDsaInternal failed");
  25674. return WOLFSSL_FATAL_ERROR;
  25675. }
  25676. }
  25677. ret = DsaVerify(d, sig, (DsaKey*)dsa->internal, dsacheck);
  25678. if (ret != 0 || *dsacheck != 1) {
  25679. WOLFSSL_MSG("DsaVerify failed");
  25680. return ret;
  25681. }
  25682. return WOLFSSL_SUCCESS;
  25683. }
  25684. int wolfSSL_DSA_bits(const WOLFSSL_DSA *d)
  25685. {
  25686. if (!d)
  25687. return WOLFSSL_FAILURE;
  25688. if (!d->exSet && SetDsaExternal((WOLFSSL_DSA*)d) != WOLFSSL_SUCCESS)
  25689. return WOLFSSL_FAILURE;
  25690. return wolfSSL_BN_num_bits(d->p);
  25691. }
  25692. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  25693. int wolfSSL_DSA_do_verify_ex(const unsigned char* digest, int digest_len,
  25694. WOLFSSL_DSA_SIG* sig, WOLFSSL_DSA* dsa)
  25695. {
  25696. int dsacheck, sz;
  25697. byte sigBin[DSA_SIG_SIZE];
  25698. byte* sigBinPtr = sigBin;
  25699. WOLFSSL_ENTER("wolfSSL_DSA_do_verify_ex");
  25700. if (!digest || !sig || !dsa || digest_len != WC_SHA_DIGEST_SIZE) {
  25701. WOLFSSL_MSG("Bad function arguments");
  25702. return WOLFSSL_FAILURE;
  25703. }
  25704. if (!sig->r || !sig->s) {
  25705. WOLFSSL_MSG("No signature found in DSA_SIG");
  25706. return WOLFSSL_FAILURE;
  25707. }
  25708. /* front pad with zeros */
  25709. if (!(sz = wolfSSL_BN_num_bytes(sig->r))) {
  25710. return WOLFSSL_FAILURE;
  25711. }
  25712. while (sz++ < DSA_HALF_SIZE) {
  25713. *sigBinPtr++ = 0;
  25714. }
  25715. if (wolfSSL_BN_bn2bin(sig->r, sigBinPtr) == WOLFSSL_FATAL_ERROR) {
  25716. return WOLFSSL_FAILURE;
  25717. }
  25718. /* Move to s */
  25719. sigBinPtr = sigBin + DSA_HALF_SIZE;
  25720. /* front pad with zeros */
  25721. if (!(sz = wolfSSL_BN_num_bytes(sig->s))) {
  25722. return WOLFSSL_FAILURE;
  25723. }
  25724. while (sz++ < DSA_HALF_SIZE) {
  25725. *sigBinPtr++ = 0;
  25726. }
  25727. if (wolfSSL_BN_bn2bin(sig->s, sigBinPtr) == WOLFSSL_FATAL_ERROR) {
  25728. return WOLFSSL_FAILURE;
  25729. }
  25730. if (wolfSSL_DSA_do_verify(digest, sigBin, dsa, &dsacheck) != WOLFSSL_SUCCESS ||
  25731. dsacheck != 1) {
  25732. return WOLFSSL_FAILURE;
  25733. }
  25734. return WOLFSSL_SUCCESS;
  25735. }
  25736. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  25737. #endif /* NO_DSA */
  25738. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  25739. #ifdef DEBUG_SIGN
  25740. static void show(const char *title, const unsigned char *out, unsigned int outlen)
  25741. {
  25742. const unsigned char *pt;
  25743. printf("%s[%d] = \n", title, (int)outlen);
  25744. outlen = outlen>100?100:outlen;
  25745. for (pt = out; pt < out + outlen;
  25746. printf("%c", ((*pt)&0x6f)>='A'?((*pt)&0x6f):'.'), pt++);
  25747. printf("\n");
  25748. }
  25749. #else
  25750. #define show(a,b,c)
  25751. #endif
  25752. /* return SSL_SUCCESS on ok, 0 otherwise */
  25753. int wolfSSL_RSA_sign(int type, const unsigned char* m,
  25754. unsigned int mLen, unsigned char* sigRet,
  25755. unsigned int* sigLen, WOLFSSL_RSA* rsa)
  25756. {
  25757. return wolfSSL_RSA_sign_ex(type, m, mLen, sigRet, sigLen, rsa, 1);
  25758. }
  25759. int wolfSSL_RSA_sign_ex(int type, const unsigned char* m,
  25760. unsigned int mLen, unsigned char* sigRet,
  25761. unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag)
  25762. {
  25763. word32 outLen;
  25764. word32 signSz;
  25765. int initTmpRng = 0;
  25766. WC_RNG* rng = NULL;
  25767. int ret = 0;
  25768. #ifdef WOLFSSL_SMALL_STACK
  25769. WC_RNG* tmpRNG = NULL;
  25770. byte* encodedSig = NULL;
  25771. #else
  25772. WC_RNG tmpRNG[1];
  25773. byte encodedSig[MAX_ENCODED_SIG_SZ];
  25774. #endif
  25775. WOLFSSL_ENTER("wolfSSL_RSA_sign");
  25776. if (m == NULL || sigRet == NULL || sigLen == NULL || rsa == NULL) {
  25777. WOLFSSL_MSG("Bad function arguments");
  25778. return 0;
  25779. }
  25780. show("Message to Sign", m, mLen);
  25781. switch (type) {
  25782. #ifdef WOLFSSL_MD2
  25783. case NID_md2: type = MD2h; break;
  25784. #endif
  25785. #ifndef NO_MD5
  25786. case NID_md5: type = MD5h; break;
  25787. #endif
  25788. #ifndef NO_SHA
  25789. case NID_sha1: type = SHAh; break;
  25790. #endif
  25791. #ifndef NO_SHA256
  25792. case NID_sha256: type = SHA256h; break;
  25793. #endif
  25794. #ifdef WOLFSSL_SHA384
  25795. case NID_sha384: type = SHA384h; break;
  25796. #endif
  25797. #ifdef WOLFSSL_SHA512
  25798. case NID_sha512: type = SHA512h; break;
  25799. #endif
  25800. #ifndef WOLFSSL_NOSHA3_224
  25801. case NID_sha3_224: type = SHA3_224h; break;
  25802. #endif
  25803. #ifndef WOLFSSL_NOSHA3_256
  25804. case NID_sha3_256: type = SHA3_256h; break;
  25805. #endif
  25806. #ifndef WOLFSSL_NOSHA3_384
  25807. case NID_sha3_384: type = SHA3_384h; break;
  25808. #endif
  25809. #ifndef WOLFSSL_NOSHA3_512
  25810. case NID_sha3_512: type = SHA3_512h; break;
  25811. #endif
  25812. default:
  25813. WOLFSSL_MSG("This NID (md type) not configured or not implemented");
  25814. return 0;
  25815. }
  25816. if (rsa->inSet == 0)
  25817. {
  25818. WOLFSSL_MSG("No RSA internal set, do it");
  25819. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  25820. WOLFSSL_MSG("SetRsaInternal failed");
  25821. return 0;
  25822. }
  25823. }
  25824. outLen = (word32)wolfSSL_BN_num_bytes(rsa->n);
  25825. #ifdef WOLFSSL_SMALL_STACK
  25826. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  25827. if (tmpRNG == NULL)
  25828. return 0;
  25829. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ, NULL,
  25830. DYNAMIC_TYPE_SIGNATURE);
  25831. if (encodedSig == NULL) {
  25832. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25833. return 0;
  25834. }
  25835. #endif
  25836. if (outLen == 0)
  25837. WOLFSSL_MSG("Bad RSA size");
  25838. else if (wc_InitRng(tmpRNG) == 0) {
  25839. rng = tmpRNG;
  25840. initTmpRng = 1;
  25841. }
  25842. else {
  25843. WOLFSSL_MSG("Bad RNG Init, trying global");
  25844. if (initGlobalRNG == 0)
  25845. WOLFSSL_MSG("Global RNG no Init");
  25846. else
  25847. rng = &globalRNG;
  25848. }
  25849. if (rng) {
  25850. signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
  25851. if (signSz == 0) {
  25852. WOLFSSL_MSG("Bad Encode Signature");
  25853. }
  25854. else {
  25855. show("Encoded Message", encodedSig, signSz);
  25856. if (flag != 0) {
  25857. ret = wc_RsaSSL_Sign(encodedSig, signSz, sigRet, outLen,
  25858. (RsaKey*)rsa->internal, rng);
  25859. if (ret <= 0) {
  25860. WOLFSSL_MSG("Bad Rsa Sign");
  25861. ret = 0;
  25862. }
  25863. else {
  25864. *sigLen = (unsigned int)ret;
  25865. ret = SSL_SUCCESS;
  25866. show("Signature", sigRet, *sigLen);
  25867. }
  25868. } else {
  25869. ret = SSL_SUCCESS;
  25870. XMEMCPY(sigRet, encodedSig, signSz);
  25871. *sigLen = signSz;
  25872. }
  25873. }
  25874. }
  25875. if (initTmpRng)
  25876. wc_FreeRng(tmpRNG);
  25877. #ifdef WOLFSSL_SMALL_STACK
  25878. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  25879. XFREE(encodedSig, NULL, DYNAMIC_TYPE_SIGNATURE);
  25880. #endif
  25881. if (ret == WOLFSSL_SUCCESS)
  25882. WOLFSSL_MSG("wolfSSL_RSA_sign success");
  25883. else {
  25884. WOLFSSL_MSG("wolfSSL_RSA_sign failed");
  25885. }
  25886. return ret;
  25887. }
  25888. /* returns WOLFSSL_SUCCESS on successful verify and WOLFSSL_FAILURE on fail */
  25889. int wolfSSL_RSA_verify(int type, const unsigned char* m,
  25890. unsigned int mLen, const unsigned char* sig,
  25891. unsigned int sigLen, WOLFSSL_RSA* rsa)
  25892. {
  25893. int ret;
  25894. unsigned char *sigRet ;
  25895. unsigned char *sigDec ;
  25896. unsigned int len;
  25897. WOLFSSL_ENTER("wolfSSL_RSA_verify");
  25898. if ((m == NULL) || (sig == NULL)) {
  25899. WOLFSSL_MSG("Bad function arguments");
  25900. return WOLFSSL_FAILURE;
  25901. }
  25902. sigRet = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25903. if (sigRet == NULL) {
  25904. WOLFSSL_MSG("Memory failure");
  25905. return WOLFSSL_FAILURE;
  25906. }
  25907. sigDec = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25908. if (sigDec == NULL) {
  25909. WOLFSSL_MSG("Memory failure");
  25910. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25911. return WOLFSSL_FAILURE;
  25912. }
  25913. /* get non-encrypted signature to be compared with decrypted signature */
  25914. ret = wolfSSL_RSA_sign_ex(type, m, mLen, sigRet, &len, rsa, 0);
  25915. if (ret <= 0) {
  25916. WOLFSSL_MSG("Message Digest Error");
  25917. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25918. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25919. return WOLFSSL_FAILURE;
  25920. }
  25921. show("Encoded Message", sigRet, len);
  25922. /* decrypt signature */
  25923. ret = wc_RsaSSL_Verify(sig, sigLen, (unsigned char *)sigDec, sigLen,
  25924. (RsaKey*)rsa->internal);
  25925. if (ret <= 0) {
  25926. WOLFSSL_MSG("RSA Decrypt error");
  25927. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25928. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25929. return WOLFSSL_FAILURE;
  25930. }
  25931. show("Decrypted Signature", sigDec, ret);
  25932. if ((int)len == ret && XMEMCMP(sigRet, sigDec, ret) == 0) {
  25933. WOLFSSL_MSG("wolfSSL_RSA_verify success");
  25934. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25935. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25936. return WOLFSSL_SUCCESS;
  25937. }
  25938. else {
  25939. WOLFSSL_MSG("wolfSSL_RSA_verify failed");
  25940. XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25941. XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  25942. return WOLFSSL_FAILURE;
  25943. }
  25944. }
  25945. void wolfSSL_RSA_get0_key(const WOLFSSL_RSA *r, const WOLFSSL_BIGNUM **n,
  25946. const WOLFSSL_BIGNUM **e, const WOLFSSL_BIGNUM **d)
  25947. {
  25948. WOLFSSL_ENTER("wolfSSL_RSA_get0_key");
  25949. if (r != NULL) {
  25950. if (n != NULL)
  25951. *n = r->n;
  25952. if (e != NULL)
  25953. *e = r->e;
  25954. if (d != NULL)
  25955. *d = r->d;
  25956. } else {
  25957. if (n != NULL)
  25958. *n = NULL;
  25959. if (e != NULL)
  25960. *e = NULL;
  25961. if (d != NULL)
  25962. *d = NULL;
  25963. }
  25964. }
  25965. /* generate p-1 and q-1, WOLFSSL_SUCCESS on ok */
  25966. int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
  25967. {
  25968. int err;
  25969. mp_int tmp;
  25970. WOLFSSL_MSG("wolfSSL_RsaGenAdd");
  25971. if (rsa == NULL || rsa->p == NULL || rsa->q == NULL || rsa->d == NULL ||
  25972. rsa->dmp1 == NULL || rsa->dmq1 == NULL) {
  25973. WOLFSSL_MSG("rsa no init error");
  25974. return WOLFSSL_FATAL_ERROR;
  25975. }
  25976. if (mp_init(&tmp) != MP_OKAY) {
  25977. WOLFSSL_MSG("mp_init error");
  25978. return WOLFSSL_FATAL_ERROR;
  25979. }
  25980. err = mp_sub_d((mp_int*)rsa->p->internal, 1, &tmp);
  25981. if (err != MP_OKAY) {
  25982. WOLFSSL_MSG("mp_sub_d error");
  25983. }
  25984. else
  25985. err = mp_mod((mp_int*)rsa->d->internal, &tmp,
  25986. (mp_int*)rsa->dmp1->internal);
  25987. if (err != MP_OKAY) {
  25988. WOLFSSL_MSG("mp_mod error");
  25989. }
  25990. else
  25991. err = mp_sub_d((mp_int*)rsa->q->internal, 1, &tmp);
  25992. if (err != MP_OKAY) {
  25993. WOLFSSL_MSG("mp_sub_d error");
  25994. }
  25995. else
  25996. err = mp_mod((mp_int*)rsa->d->internal, &tmp,
  25997. (mp_int*)rsa->dmq1->internal);
  25998. mp_clear(&tmp);
  25999. if (err == MP_OKAY)
  26000. return WOLFSSL_SUCCESS;
  26001. else
  26002. return WOLFSSL_FATAL_ERROR;
  26003. }
  26004. #endif /* !NO_RSA && !HAVE_USER_RSA */
  26005. WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void)
  26006. {
  26007. return (WOLFSSL_HMAC_CTX*)XMALLOC(sizeof(WOLFSSL_HMAC_CTX), NULL,
  26008. DYNAMIC_TYPE_OPENSSL);
  26009. }
  26010. int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx)
  26011. {
  26012. WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init");
  26013. if (ctx != NULL) {
  26014. /* wc_HmacSetKey sets up ctx->hmac */
  26015. XMEMSET(ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
  26016. }
  26017. return WOLFSSL_SUCCESS;
  26018. }
  26019. int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key,
  26020. int keylen, const EVP_MD* type, WOLFSSL_ENGINE* e)
  26021. {
  26022. WOLFSSL_ENTER("wolfSSL_HMAC_Init_ex");
  26023. /* WOLFSSL_ENGINE not used, call wolfSSL_HMAC_Init */
  26024. (void)e;
  26025. return wolfSSL_HMAC_Init(ctx, key, keylen, type);
  26026. }
  26027. /* helper function for Deep copy of internal wolfSSL hmac structure
  26028. * returns WOLFSSL_SUCCESS on success */
  26029. int wolfSSL_HmacCopy(Hmac* des, Hmac* src)
  26030. {
  26031. void* heap;
  26032. int ret;
  26033. #ifndef HAVE_FIPS
  26034. heap = src->heap;
  26035. #else
  26036. heap = NULL;
  26037. #endif
  26038. if (wc_HmacInit(des, heap, 0) != 0) {
  26039. return WOLFSSL_FAILURE;
  26040. }
  26041. /* requires that hash structures have no dynamic parts to them */
  26042. switch (src->macType) {
  26043. #ifndef NO_MD5
  26044. case WC_MD5:
  26045. ret = wc_Md5Copy(&src->hash.md5, &des->hash.md5);
  26046. break;
  26047. #endif /* !NO_MD5 */
  26048. #ifndef NO_SHA
  26049. case WC_SHA:
  26050. ret = wc_ShaCopy(&src->hash.sha, &des->hash.sha);
  26051. break;
  26052. #endif /* !NO_SHA */
  26053. #ifdef WOLFSSL_SHA224
  26054. case WC_SHA224:
  26055. ret = wc_Sha224Copy(&src->hash.sha224, &des->hash.sha224);
  26056. break;
  26057. #endif /* WOLFSSL_SHA224 */
  26058. #ifndef NO_SHA256
  26059. case WC_SHA256:
  26060. ret = wc_Sha256Copy(&src->hash.sha256, &des->hash.sha256);
  26061. break;
  26062. #endif /* !NO_SHA256 */
  26063. #ifdef WOLFSSL_SHA384
  26064. case WC_SHA384:
  26065. ret = wc_Sha384Copy(&src->hash.sha384, &des->hash.sha384);
  26066. break;
  26067. #endif /* WOLFSSL_SHA384 */
  26068. #ifdef WOLFSSL_SHA512
  26069. case WC_SHA512:
  26070. ret = wc_Sha512Copy(&src->hash.sha512, &des->hash.sha512);
  26071. break;
  26072. #endif /* WOLFSSL_SHA512 */
  26073. default:
  26074. return WOLFSSL_FAILURE;
  26075. }
  26076. if (ret != 0)
  26077. return WOLFSSL_FAILURE;
  26078. XMEMCPY((byte*)des->ipad, (byte*)src->ipad, WC_HMAC_BLOCK_SIZE);
  26079. XMEMCPY((byte*)des->opad, (byte*)src->opad, WC_HMAC_BLOCK_SIZE);
  26080. XMEMCPY((byte*)des->innerHash, (byte*)src->innerHash, WC_MAX_DIGEST_SIZE);
  26081. #ifndef HAVE_FIPS
  26082. des->heap = heap;
  26083. #endif
  26084. des->macType = src->macType;
  26085. des->innerHashKeyed = src->innerHashKeyed;
  26086. #ifdef WOLFSSL_ASYNC_CRYPT
  26087. XMEMCPY(&des->asyncDev, &src->asyncDev, sizeof(WC_ASYNC_DEV));
  26088. des->keyLen = src->keyLen;
  26089. #ifdef HAVE_CAVIUM
  26090. des->data = (byte*)XMALLOC(src->dataLen, des->heap,
  26091. DYNAMIC_TYPE_HMAC);
  26092. if (des->data == NULL) {
  26093. return BUFFER_E;
  26094. }
  26095. XMEMCPY(des->data, src->data, src->dataLen);
  26096. des->dataLen = src->dataLen;
  26097. #endif /* HAVE_CAVIUM */
  26098. #endif /* WOLFSSL_ASYNC_CRYPT */
  26099. return WOLFSSL_SUCCESS;
  26100. }
  26101. /* Deep copy of information from src to des structure
  26102. *
  26103. * des destination to copy information to
  26104. * src structure to get information from
  26105. *
  26106. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
  26107. */
  26108. int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des, WOLFSSL_HMAC_CTX* src)
  26109. {
  26110. WOLFSSL_ENTER("wolfSSL_HMAC_CTX_copy");
  26111. if (des == NULL || src == NULL) {
  26112. return WOLFSSL_FAILURE;
  26113. }
  26114. des->type = src->type;
  26115. XMEMCPY((byte *)&des->save_ipad, (byte *)&src->hmac.ipad,
  26116. WC_HMAC_BLOCK_SIZE);
  26117. XMEMCPY((byte *)&des->save_opad, (byte *)&src->hmac.opad,
  26118. WC_HMAC_BLOCK_SIZE);
  26119. return wolfSSL_HmacCopy(&des->hmac, &src->hmac);
  26120. }
  26121. #if defined(HAVE_FIPS) && \
  26122. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))
  26123. static int _HMAC_Init(Hmac* hmac, int type, void* heap)
  26124. {
  26125. int ret = 0;
  26126. switch (type) {
  26127. #ifndef NO_MD5
  26128. case WC_MD5:
  26129. ret = wc_InitMd5(&hmac->hash.md5);
  26130. break;
  26131. #endif /* !NO_MD5 */
  26132. #ifndef NO_SHA
  26133. case WC_SHA:
  26134. ret = wc_InitSha(&hmac->hash.sha);
  26135. break;
  26136. #endif /* !NO_SHA */
  26137. #ifdef WOLFSSL_SHA224
  26138. case WC_SHA224:
  26139. ret = wc_InitSha224(&hmac->hash.sha224);
  26140. break;
  26141. #endif /* WOLFSSL_SHA224 */
  26142. #ifndef NO_SHA256
  26143. case WC_SHA256:
  26144. ret = wc_InitSha256(&hmac->hash.sha256);
  26145. break;
  26146. #endif /* !NO_SHA256 */
  26147. #ifdef WOLFSSL_SHA384
  26148. case WC_SHA384:
  26149. ret = wc_InitSha384(&hmac->hash.sha384);
  26150. break;
  26151. #endif /* WOLFSSL_SHA384 */
  26152. #ifdef WOLFSSL_SHA512
  26153. case WC_SHA512:
  26154. ret = wc_InitSha512(&hmac->hash.sha512);
  26155. break;
  26156. #endif /* WOLFSSL_SHA512 */
  26157. #ifdef WOLFSSL_SHA3
  26158. case WC_SHA3_224:
  26159. ret = wc_InitSha3_224(&hmac->hash.sha3, heap, INVALID_DEVID);
  26160. break;
  26161. case WC_SHA3_256:
  26162. ret = wc_InitSha3_256(&hmac->hash.sha3, heap, INVALID_DEVID);
  26163. break;
  26164. case WC_SHA3_384:
  26165. ret = wc_InitSha3_384(&hmac->hash.sha3, heap, INVALID_DEVID);
  26166. break;
  26167. case WC_SHA3_512:
  26168. ret = wc_InitSha3_512(&hmac->hash.sha3, heap, INVALID_DEVID);
  26169. break;
  26170. #endif
  26171. default:
  26172. ret = BAD_FUNC_ARG;
  26173. break;
  26174. }
  26175. (void)heap;
  26176. return ret;
  26177. }
  26178. #else
  26179. #define _HMAC_Init _InitHmac
  26180. #endif
  26181. int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen,
  26182. const EVP_MD* type)
  26183. {
  26184. int hmac_error = 0;
  26185. void* heap = NULL;
  26186. WOLFSSL_MSG("wolfSSL_HMAC_Init");
  26187. if (ctx == NULL) {
  26188. WOLFSSL_MSG("no ctx on init");
  26189. return WOLFSSL_FAILURE;
  26190. }
  26191. #ifndef HAVE_FIPS
  26192. heap = ctx->hmac.heap;
  26193. #endif
  26194. if (type) {
  26195. WOLFSSL_MSG("init has type");
  26196. #ifndef NO_MD5
  26197. if (XSTRNCMP(type, "MD5", 3) == 0) {
  26198. WOLFSSL_MSG("md5 hmac");
  26199. ctx->type = WC_MD5;
  26200. }
  26201. else
  26202. #endif
  26203. #ifdef WOLFSSL_SHA224
  26204. if (XSTRNCMP(type, "SHA224", 6) == 0) {
  26205. WOLFSSL_MSG("sha224 hmac");
  26206. ctx->type = WC_SHA224;
  26207. }
  26208. else
  26209. #endif
  26210. #ifndef NO_SHA256
  26211. if (XSTRNCMP(type, "SHA256", 6) == 0) {
  26212. WOLFSSL_MSG("sha256 hmac");
  26213. ctx->type = WC_SHA256;
  26214. }
  26215. else
  26216. #endif
  26217. #ifdef WOLFSSL_SHA384
  26218. if (XSTRNCMP(type, "SHA384", 6) == 0) {
  26219. WOLFSSL_MSG("sha384 hmac");
  26220. ctx->type = WC_SHA384;
  26221. }
  26222. else
  26223. #endif
  26224. #ifdef WOLFSSL_SHA512
  26225. if (XSTRNCMP(type, "SHA512", 6) == 0) {
  26226. WOLFSSL_MSG("sha512 hmac");
  26227. ctx->type = WC_SHA512;
  26228. }
  26229. else
  26230. #endif
  26231. #ifndef NO_SHA
  26232. /* has to be last since would pick or 256, 384, or 512 too */
  26233. if (XSTRNCMP(type, "SHA", 3) == 0) {
  26234. WOLFSSL_MSG("sha hmac");
  26235. ctx->type = WC_SHA;
  26236. }
  26237. else
  26238. #endif
  26239. {
  26240. WOLFSSL_MSG("bad init type");
  26241. return WOLFSSL_FAILURE;
  26242. }
  26243. }
  26244. if (key && keylen) {
  26245. WOLFSSL_MSG("keying hmac");
  26246. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  26247. hmac_error = wc_HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key,
  26248. (word32)keylen);
  26249. if (hmac_error < 0){
  26250. wc_HmacFree(&ctx->hmac);
  26251. return WOLFSSL_FAILURE;
  26252. }
  26253. XMEMCPY((byte *)&ctx->save_ipad, (byte *)&ctx->hmac.ipad,
  26254. WC_HMAC_BLOCK_SIZE);
  26255. XMEMCPY((byte *)&ctx->save_opad, (byte *)&ctx->hmac.opad,
  26256. WC_HMAC_BLOCK_SIZE);
  26257. }
  26258. /* OpenSSL compat, no error */
  26259. } else if(ctx->type >= 0) { /* MD5 == 0 */
  26260. WOLFSSL_MSG("recover hmac");
  26261. wc_HmacFree(&ctx->hmac);
  26262. if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
  26263. ctx->hmac.macType = (byte)ctx->type;
  26264. ctx->hmac.innerHashKeyed = 0;
  26265. XMEMCPY((byte *)&ctx->hmac.ipad, (byte *)&ctx->save_ipad,
  26266. WC_HMAC_BLOCK_SIZE);
  26267. XMEMCPY((byte *)&ctx->hmac.opad, (byte *)&ctx->save_opad,
  26268. WC_HMAC_BLOCK_SIZE);
  26269. if ((hmac_error = _HMAC_Init(&ctx->hmac, ctx->hmac.macType, heap))
  26270. !=0) {
  26271. return hmac_error;
  26272. }
  26273. }
  26274. }
  26275. (void)hmac_error;
  26276. return WOLFSSL_SUCCESS;
  26277. }
  26278. int wolfSSL_HMAC_Update(WOLFSSL_HMAC_CTX* ctx, const unsigned char* data,
  26279. int len)
  26280. {
  26281. int hmac_error = 0;
  26282. WOLFSSL_MSG("wolfSSL_HMAC_Update");
  26283. if (ctx == NULL) {
  26284. WOLFSSL_MSG("no ctx");
  26285. return WOLFSSL_FAILURE;
  26286. }
  26287. if (data) {
  26288. WOLFSSL_MSG("updating hmac");
  26289. hmac_error = wc_HmacUpdate(&ctx->hmac, data, (word32)len);
  26290. if (hmac_error < 0){
  26291. WOLFSSL_MSG("hmac update error");
  26292. return WOLFSSL_FAILURE;
  26293. }
  26294. }
  26295. return WOLFSSL_SUCCESS;
  26296. }
  26297. int wolfSSL_HMAC_Final(WOLFSSL_HMAC_CTX* ctx, unsigned char* hash,
  26298. unsigned int* len)
  26299. {
  26300. int hmac_error;
  26301. WOLFSSL_MSG("wolfSSL_HMAC_Final");
  26302. /* "len" parameter is optional. */
  26303. if (ctx == NULL || hash == NULL) {
  26304. WOLFSSL_MSG("invalid parameter");
  26305. return WOLFSSL_FAILURE;
  26306. }
  26307. WOLFSSL_MSG("final hmac");
  26308. hmac_error = wc_HmacFinal(&ctx->hmac, hash);
  26309. if (hmac_error < 0){
  26310. WOLFSSL_MSG("final hmac error");
  26311. return WOLFSSL_FAILURE;
  26312. }
  26313. if (len) {
  26314. WOLFSSL_MSG("setting output len");
  26315. switch (ctx->type) {
  26316. #ifndef NO_MD5
  26317. case WC_MD5:
  26318. *len = WC_MD5_DIGEST_SIZE;
  26319. break;
  26320. #endif
  26321. #ifndef NO_SHA
  26322. case WC_SHA:
  26323. *len = WC_SHA_DIGEST_SIZE;
  26324. break;
  26325. #endif
  26326. #ifdef WOLFSSL_SHA224
  26327. case WC_SHA224:
  26328. *len = WC_SHA224_DIGEST_SIZE;
  26329. break;
  26330. #endif
  26331. #ifndef NO_SHA256
  26332. case WC_SHA256:
  26333. *len = WC_SHA256_DIGEST_SIZE;
  26334. break;
  26335. #endif
  26336. #ifdef WOLFSSL_SHA384
  26337. case WC_SHA384:
  26338. *len = WC_SHA384_DIGEST_SIZE;
  26339. break;
  26340. #endif
  26341. #ifdef WOLFSSL_SHA512
  26342. case WC_SHA512:
  26343. *len = WC_SHA512_DIGEST_SIZE;
  26344. break;
  26345. #endif
  26346. default:
  26347. WOLFSSL_MSG("bad hmac type");
  26348. return WOLFSSL_FAILURE;
  26349. }
  26350. }
  26351. return WOLFSSL_SUCCESS;
  26352. }
  26353. int wolfSSL_HMAC_cleanup(WOLFSSL_HMAC_CTX* ctx)
  26354. {
  26355. WOLFSSL_MSG("wolfSSL_HMAC_cleanup");
  26356. if (ctx)
  26357. wc_HmacFree(&ctx->hmac);
  26358. return SSL_SUCCESS;
  26359. }
  26360. void wolfSSL_HMAC_CTX_free(WOLFSSL_HMAC_CTX* ctx)
  26361. {
  26362. if (!ctx) {
  26363. return;
  26364. }
  26365. wolfSSL_HMAC_cleanup(ctx);
  26366. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  26367. }
  26368. size_t wolfSSL_HMAC_size(const WOLFSSL_HMAC_CTX *ctx)
  26369. {
  26370. if (!ctx) {
  26371. return 0;
  26372. }
  26373. return (size_t)wc_HashGetDigestSize((enum wc_HashType)ctx->hmac.macType);
  26374. }
  26375. #ifndef NO_DES3
  26376. void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  26377. unsigned char* iv, int len)
  26378. {
  26379. (void)len;
  26380. WOLFSSL_MSG("wolfSSL_3des_iv");
  26381. if (ctx == NULL || iv == NULL) {
  26382. WOLFSSL_MSG("Bad function argument");
  26383. return;
  26384. }
  26385. if (doset)
  26386. wc_Des3_SetIV(&ctx->cipher.des3, iv); /* OpenSSL compat, no ret */
  26387. else
  26388. XMEMCPY(iv, &ctx->cipher.des3.reg, DES_BLOCK_SIZE);
  26389. }
  26390. #endif /* NO_DES3 */
  26391. #ifndef NO_AES
  26392. void wolfSSL_aes_ctr_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset,
  26393. unsigned char* iv, int len)
  26394. {
  26395. (void)len;
  26396. WOLFSSL_MSG("wolfSSL_aes_ctr_iv");
  26397. if (ctx == NULL || iv == NULL) {
  26398. WOLFSSL_MSG("Bad function argument");
  26399. return;
  26400. }
  26401. if (doset)
  26402. (void)wc_AesSetIV(&ctx->cipher.aes, iv); /* OpenSSL compat, no ret */
  26403. else
  26404. XMEMCPY(iv, &ctx->cipher.aes.reg, AES_BLOCK_SIZE);
  26405. }
  26406. #endif /* NO_AES */
  26407. /* Free the dynamically allocated data.
  26408. *
  26409. * p Pointer to dynamically allocated memory.
  26410. */
  26411. void wolfSSL_OPENSSL_free(void* p)
  26412. {
  26413. WOLFSSL_MSG("wolfSSL_OPENSSL_free");
  26414. XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL);
  26415. }
  26416. void *wolfSSL_OPENSSL_malloc(size_t a)
  26417. {
  26418. return XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
  26419. }
  26420. #if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
  26421. static int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
  26422. unsigned char* passwd, int passwdSz, byte **cipherInfo,
  26423. int maxDerSz)
  26424. {
  26425. int ret, paddingSz;
  26426. word32 idx, cipherInfoSz;
  26427. #ifdef WOLFSSL_SMALL_STACK
  26428. EncryptedInfo* info = NULL;
  26429. #else
  26430. EncryptedInfo info[1];
  26431. #endif
  26432. WOLFSSL_ENTER("EncryptDerKey");
  26433. if (der == NULL || derSz == NULL || cipher == NULL ||
  26434. passwd == NULL || cipherInfo == NULL)
  26435. return BAD_FUNC_ARG;
  26436. #ifdef WOLFSSL_SMALL_STACK
  26437. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  26438. DYNAMIC_TYPE_ENCRYPTEDINFO);
  26439. if (info == NULL) {
  26440. WOLFSSL_MSG("malloc failed");
  26441. return WOLFSSL_FAILURE;
  26442. }
  26443. #endif
  26444. XMEMSET(info, 0, sizeof(EncryptedInfo));
  26445. /* set the cipher name on info */
  26446. XSTRNCPY(info->name, cipher, NAME_SZ-1);
  26447. info->name[NAME_SZ-1] = '\0'; /* null term */
  26448. ret = wc_EncryptedInfoGet(info, info->name);
  26449. if (ret != 0) {
  26450. WOLFSSL_MSG("unsupported cipher");
  26451. #ifdef WOLFSSL_SMALL_STACK
  26452. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26453. #endif
  26454. return WOLFSSL_FAILURE;
  26455. }
  26456. /* Generate a random salt */
  26457. if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != WOLFSSL_SUCCESS) {
  26458. WOLFSSL_MSG("generate iv failed");
  26459. #ifdef WOLFSSL_SMALL_STACK
  26460. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26461. #endif
  26462. return WOLFSSL_FAILURE;
  26463. }
  26464. /* add the padding before encryption */
  26465. paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
  26466. if (paddingSz == 0)
  26467. paddingSz = info->ivSz;
  26468. if (maxDerSz < *derSz + paddingSz) {
  26469. WOLFSSL_MSG("not enough DER buffer allocated");
  26470. #ifdef WOLFSSL_SMALL_STACK
  26471. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26472. #endif
  26473. return WOLFSSL_FAILURE;
  26474. }
  26475. XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
  26476. (*derSz) += paddingSz;
  26477. /* encrypt buffer */
  26478. if (wc_BufferKeyEncrypt(info, der, *derSz, passwd, passwdSz, WC_MD5) != 0) {
  26479. WOLFSSL_MSG("encrypt key failed");
  26480. #ifdef WOLFSSL_SMALL_STACK
  26481. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26482. #endif
  26483. return WOLFSSL_FAILURE;
  26484. }
  26485. /* create cipher info : 'cipher_name,Salt(hex)' */
  26486. cipherInfoSz = (word32)(2*info->ivSz + XSTRLEN(info->name) + 2);
  26487. *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL,
  26488. DYNAMIC_TYPE_STRING);
  26489. if (*cipherInfo == NULL) {
  26490. WOLFSSL_MSG("malloc failed");
  26491. #ifdef WOLFSSL_SMALL_STACK
  26492. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26493. #endif
  26494. return WOLFSSL_FAILURE;
  26495. }
  26496. XSTRNCPY((char*)*cipherInfo, info->name, cipherInfoSz);
  26497. XSTRNCAT((char*)*cipherInfo, ",", 2);
  26498. idx = (word32)XSTRLEN((char*)*cipherInfo);
  26499. cipherInfoSz -= idx;
  26500. ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo+idx, &cipherInfoSz);
  26501. #ifdef WOLFSSL_SMALL_STACK
  26502. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  26503. #endif
  26504. if (ret != 0) {
  26505. WOLFSSL_MSG("Base16_Encode failed");
  26506. XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  26507. return WOLFSSL_FAILURE;
  26508. }
  26509. return WOLFSSL_SUCCESS;
  26510. }
  26511. #endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */
  26512. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  26513. static int wolfSSL_RSA_To_Der(WOLFSSL_RSA* rsa, byte** outBuf, int publicKey)
  26514. {
  26515. int derSz = 0;
  26516. int ret;
  26517. byte* derBuf;
  26518. WOLFSSL_ENTER("wolfSSL_RSA_To_Der");
  26519. if (!rsa || (publicKey != 0 && publicKey != 1)) {
  26520. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", BAD_FUNC_ARG);
  26521. return BAD_FUNC_ARG;
  26522. }
  26523. if (rsa->inSet == 0) {
  26524. if ((ret = SetRsaInternal(rsa)) != WOLFSSL_SUCCESS) {
  26525. WOLFSSL_MSG("SetRsaInternal() Failed");
  26526. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", ret);
  26527. return ret;
  26528. }
  26529. }
  26530. if (publicKey) {
  26531. if ((derSz = wc_RsaPublicKeyDerSize((RsaKey *)rsa->internal, 1)) < 0) {
  26532. WOLFSSL_MSG("wc_RsaPublicKeyDerSize failed");
  26533. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  26534. return derSz;
  26535. }
  26536. }
  26537. else {
  26538. if ((derSz = wc_RsaKeyToDer((RsaKey*)rsa->internal, NULL, 0)) < 0) {
  26539. WOLFSSL_MSG("wc_RsaKeyToDer failed");
  26540. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  26541. return derSz;
  26542. }
  26543. }
  26544. if (outBuf) {
  26545. if (!(derBuf = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  26546. WOLFSSL_MSG("malloc failed");
  26547. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", MEMORY_ERROR);
  26548. return MEMORY_ERROR;
  26549. }
  26550. /* Key to DER */
  26551. if (publicKey) {
  26552. derSz = wc_RsaKeyToPublicDer((RsaKey*)rsa->internal, derBuf, derSz);
  26553. }
  26554. else {
  26555. derSz = wc_RsaKeyToDer((RsaKey*)rsa->internal, derBuf, derSz);
  26556. }
  26557. if (derSz < 0) {
  26558. WOLFSSL_MSG("wc_RsaKeyToPublicDer failed");
  26559. XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26560. }
  26561. else {
  26562. if (*outBuf) {
  26563. XMEMCPY(*outBuf, derBuf, derSz);
  26564. XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  26565. }
  26566. else {
  26567. *outBuf = derBuf;
  26568. }
  26569. }
  26570. }
  26571. WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", derSz);
  26572. return derSz;
  26573. }
  26574. #endif
  26575. #if defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN)
  26576. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
  26577. /* Takes a WOLFSSL_RSA key and writes it out to a WOLFSSL_BIO
  26578. *
  26579. * bio the WOLFSSL_BIO to write to
  26580. * key the WOLFSSL_RSA key to write out
  26581. * cipher cipher used
  26582. * passwd password string if used
  26583. * len length of password string
  26584. * cb password callback to use
  26585. * arg null terminated string for passphrase
  26586. */
  26587. int wolfSSL_PEM_write_bio_RSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_RSA* key,
  26588. const WOLFSSL_EVP_CIPHER* cipher,
  26589. unsigned char* passwd, int len,
  26590. pem_password_cb* cb, void* arg)
  26591. {
  26592. int ret;
  26593. WOLFSSL_EVP_PKEY* pkey;
  26594. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_RSAPrivateKey");
  26595. if (bio == NULL || key == NULL) {
  26596. WOLFSSL_MSG("Bad Function Arguments");
  26597. return WOLFSSL_FAILURE;
  26598. }
  26599. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  26600. if (pkey == NULL) {
  26601. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  26602. return WOLFSSL_FAILURE;
  26603. }
  26604. pkey->type = EVP_PKEY_RSA;
  26605. pkey->rsa = key;
  26606. pkey->ownRsa = 0;
  26607. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  26608. /* similar to how wolfSSL_PEM_write_mem_RSAPrivateKey finds DER of key */
  26609. {
  26610. int derSz;
  26611. byte* derBuf = NULL;
  26612. if ((derSz = wolfSSL_RSA_To_Der(key, &derBuf, 0)) < 0) {
  26613. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  26614. return WOLFSSL_FAILURE;
  26615. }
  26616. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
  26617. DYNAMIC_TYPE_TMP_BUFFER);
  26618. if (pkey->pkey.ptr == NULL) {
  26619. WOLFSSL_MSG("key malloc failed");
  26620. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26621. wolfSSL_EVP_PKEY_free(pkey);
  26622. return WOLFSSL_FAILURE;
  26623. }
  26624. pkey->pkey_sz = derSz;
  26625. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  26626. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26627. }
  26628. #endif
  26629. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  26630. cb, arg);
  26631. wolfSSL_EVP_PKEY_free(pkey);
  26632. return ret;
  26633. }
  26634. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  26635. /* Takes an RSA public key and writes it out to a WOLFSSL_BIO
  26636. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  26637. */
  26638. int wolfSSL_PEM_write_bio_RSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa)
  26639. {
  26640. int ret = 0, derSz = 0;
  26641. byte *derBuf = NULL;
  26642. WOLFSSL_EVP_PKEY* pkey = NULL;
  26643. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_RSA_PUBKEY");
  26644. if (bio == NULL || rsa == NULL) {
  26645. WOLFSSL_MSG("Bad Function Arguments");
  26646. return WOLFSSL_FAILURE;
  26647. }
  26648. /* Initialize pkey structure */
  26649. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  26650. if (pkey == NULL) {
  26651. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  26652. return WOLFSSL_FAILURE;
  26653. }
  26654. pkey->type = EVP_PKEY_RSA;
  26655. pkey->rsa = rsa;
  26656. pkey->ownRsa = 0;
  26657. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 1)) < 0) {
  26658. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  26659. return WOLFSSL_FAILURE;
  26660. }
  26661. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
  26662. DYNAMIC_TYPE_TMP_BUFFER);
  26663. if (pkey->pkey.ptr == NULL) {
  26664. WOLFSSL_MSG("key malloc failed");
  26665. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26666. wolfSSL_EVP_PKEY_free(pkey);
  26667. return WOLFSSL_FAILURE;
  26668. }
  26669. pkey->pkey_sz = derSz;
  26670. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  26671. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  26672. ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey);
  26673. wolfSSL_EVP_PKEY_free(pkey);
  26674. return ret;
  26675. }
  26676. #endif
  26677. /* Reads an RSA public key from a WOLFSSL_BIO into a WOLFSSL_RSA
  26678. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  26679. */
  26680. WOLFSSL_RSA *wolfSSL_PEM_read_bio_RSA_PUBKEY(WOLFSSL_BIO* bio,WOLFSSL_RSA** rsa,
  26681. pem_password_cb* cb, void *pass)
  26682. {
  26683. WOLFSSL_EVP_PKEY* pkey;
  26684. WOLFSSL_RSA* local;
  26685. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_RSA_PUBKEY");
  26686. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  26687. if (pkey == NULL) {
  26688. return NULL;
  26689. }
  26690. /* Since the WOLFSSL_RSA structure is being taken from WOLFSSL_EVP_PKEY the
  26691. * flag indicating that the WOLFSSL_RSA structure is owned should be FALSE
  26692. * to avoid having it free'd */
  26693. pkey->ownRsa = 0;
  26694. local = pkey->rsa;
  26695. if (rsa != NULL){
  26696. *rsa = local;
  26697. }
  26698. wolfSSL_EVP_PKEY_free(pkey);
  26699. return local;
  26700. }
  26701. #endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) && !defined(NO_RSA) */
  26702. /* Takes a public key and writes it out to a WOLFSSL_BIO
  26703. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  26704. */
  26705. int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
  26706. {
  26707. byte* keyDer;
  26708. int pemSz;
  26709. int ret;
  26710. byte* tmp;
  26711. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY");
  26712. if (bio == NULL || key == NULL) {
  26713. return WOLFSSL_FAILURE;
  26714. }
  26715. keyDer = (byte*)key->pkey.ptr;
  26716. pemSz = wc_DerToPem(keyDer, key->pkey_sz, NULL, 0, PUBLICKEY_TYPE);
  26717. if (pemSz < 0) {
  26718. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PUBKEY", pemSz);
  26719. return WOLFSSL_FAILURE;
  26720. }
  26721. tmp = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26722. if (tmp == NULL) {
  26723. return MEMORY_E;
  26724. }
  26725. ret = wc_DerToPemEx(keyDer, key->pkey_sz, tmp, pemSz,
  26726. NULL, PUBLICKEY_TYPE);
  26727. if (ret < 0) {
  26728. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PUBKEY", ret);
  26729. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26730. return WOLFSSL_FAILURE;
  26731. }
  26732. ret = wolfSSL_BIO_write(bio, tmp, pemSz);
  26733. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26734. if (ret != pemSz) {
  26735. WOLFSSL_MSG("Unable to write full PEM to BIO");
  26736. return WOLFSSL_FAILURE;
  26737. }
  26738. return WOLFSSL_SUCCESS;
  26739. }
  26740. /* Takes a private key and writes it out to a WOLFSSL_BIO
  26741. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  26742. */
  26743. int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key,
  26744. const WOLFSSL_EVP_CIPHER* cipher,
  26745. unsigned char* passwd, int len,
  26746. pem_password_cb* cb, void* arg)
  26747. {
  26748. byte* keyDer;
  26749. int pemSz;
  26750. int type;
  26751. int ret;
  26752. byte* tmp;
  26753. (void)cipher;
  26754. (void)passwd;
  26755. (void)len;
  26756. (void)cb;
  26757. (void)arg;
  26758. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey");
  26759. if (bio == NULL || key == NULL) {
  26760. WOLFSSL_MSG("Bad Function Arguments");
  26761. return WOLFSSL_FAILURE;
  26762. }
  26763. keyDer = (byte*)key->pkey.ptr;
  26764. switch (key->type) {
  26765. #ifndef NO_RSA
  26766. case EVP_PKEY_RSA:
  26767. type = PRIVATEKEY_TYPE;
  26768. break;
  26769. #endif
  26770. #ifndef NO_DSA
  26771. case EVP_PKEY_DSA:
  26772. type = DSA_PRIVATEKEY_TYPE;
  26773. break;
  26774. #endif
  26775. #ifdef HAVE_ECC
  26776. case EVP_PKEY_EC:
  26777. type = ECC_PRIVATEKEY_TYPE;
  26778. break;
  26779. #endif
  26780. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
  26781. case EVP_PKEY_DH:
  26782. type = DH_PRIVATEKEY_TYPE;
  26783. break;
  26784. #endif
  26785. default:
  26786. WOLFSSL_MSG("Unknown Key type!");
  26787. type = PRIVATEKEY_TYPE;
  26788. }
  26789. pemSz = wc_DerToPem(keyDer, key->pkey_sz, NULL, 0, type);
  26790. if (pemSz < 0) {
  26791. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", pemSz);
  26792. return WOLFSSL_FAILURE;
  26793. }
  26794. tmp = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26795. if (tmp == NULL) {
  26796. return MEMORY_E;
  26797. }
  26798. ret = wc_DerToPemEx(keyDer, key->pkey_sz, tmp, pemSz,
  26799. NULL, type);
  26800. if (ret < 0) {
  26801. WOLFSSL_LEAVE("wolfSSL_PEM_write_bio_PrivateKey", ret);
  26802. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26803. return WOLFSSL_FAILURE;
  26804. }
  26805. ret = wolfSSL_BIO_write(bio, tmp, pemSz);
  26806. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  26807. if (ret != pemSz) {
  26808. WOLFSSL_MSG("Unable to write full PEM to BIO");
  26809. return WOLFSSL_FAILURE;
  26810. }
  26811. return WOLFSSL_SUCCESS;
  26812. }
  26813. #endif /* defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN) */
  26814. #if (defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)) && \
  26815. (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM))
  26816. /* return code compliant with OpenSSL :
  26817. * 1 if success, 0 if error
  26818. */
  26819. int wolfSSL_PEM_write_mem_RSAPrivateKey(RSA* rsa, const EVP_CIPHER* cipher,
  26820. unsigned char* passwd, int passwdSz,
  26821. unsigned char **pem, int *plen)
  26822. {
  26823. byte *derBuf = NULL, *tmp, *cipherInfo = NULL;
  26824. int derSz = 0;
  26825. const int type = PRIVATEKEY_TYPE;
  26826. const char* header = NULL;
  26827. const char* footer = NULL;
  26828. WOLFSSL_ENTER("wolfSSL_PEM_write_mem_RSAPrivateKey");
  26829. if (pem == NULL || plen == NULL || rsa == NULL || rsa->internal == NULL) {
  26830. WOLFSSL_MSG("Bad function arguments");
  26831. return WOLFSSL_FAILURE;
  26832. }
  26833. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  26834. return WOLFSSL_FAILURE;
  26835. if (rsa->inSet == 0) {
  26836. WOLFSSL_MSG("No RSA internal set, do it");
  26837. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  26838. WOLFSSL_MSG("SetRsaInternal failed");
  26839. return WOLFSSL_FAILURE;
  26840. }
  26841. }
  26842. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 0)) < 0) {
  26843. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  26844. return WOLFSSL_FAILURE;
  26845. }
  26846. /* encrypt DER buffer if required */
  26847. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  26848. int ret;
  26849. int blockSz = wolfSSL_EVP_CIPHER_block_size(cipher);
  26850. byte *tmpBuf;
  26851. /* Add space for padding */
  26852. if (!(tmpBuf = (byte*)XREALLOC(derBuf, derSz + blockSz, NULL,
  26853. DYNAMIC_TYPE_TMP_BUFFER))) {
  26854. WOLFSSL_MSG("Extending DER buffer failed");
  26855. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  26856. return WOLFSSL_FAILURE;
  26857. }
  26858. derBuf = tmpBuf;
  26859. ret = EncryptDerKey(derBuf, &derSz, cipher,
  26860. passwd, passwdSz, &cipherInfo, derSz + blockSz);
  26861. if (ret != WOLFSSL_SUCCESS) {
  26862. WOLFSSL_MSG("EncryptDerKey failed");
  26863. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  26864. return ret;
  26865. }
  26866. /* tmp buffer with a max size */
  26867. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  26868. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  26869. }
  26870. else {
  26871. /* tmp buffer with a max size */
  26872. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  26873. (int)XSTRLEN(footer) + 1;
  26874. }
  26875. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  26876. if (tmp == NULL) {
  26877. WOLFSSL_MSG("malloc failed");
  26878. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  26879. if (cipherInfo != NULL)
  26880. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  26881. return WOLFSSL_FAILURE;
  26882. }
  26883. /* DER to PEM */
  26884. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  26885. if (*plen <= 0) {
  26886. WOLFSSL_MSG("wc_DerToPemEx failed");
  26887. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  26888. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  26889. if (cipherInfo != NULL)
  26890. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  26891. return WOLFSSL_FAILURE;
  26892. }
  26893. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  26894. if (cipherInfo != NULL)
  26895. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  26896. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  26897. if (*pem == NULL) {
  26898. WOLFSSL_MSG("malloc failed");
  26899. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  26900. return WOLFSSL_FAILURE;
  26901. }
  26902. XMEMSET(*pem, 0, (*plen)+1);
  26903. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  26904. WOLFSSL_MSG("XMEMCPY failed");
  26905. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  26906. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  26907. return WOLFSSL_FAILURE;
  26908. }
  26909. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  26910. return WOLFSSL_SUCCESS;
  26911. }
  26912. #ifndef NO_FILESYSTEM
  26913. /* return code compliant with OpenSSL :
  26914. * 1 if success, 0 if error
  26915. */
  26916. int wolfSSL_PEM_write_RSAPrivateKey(XFILE fp, WOLFSSL_RSA *rsa,
  26917. const EVP_CIPHER *enc,
  26918. unsigned char *kstr, int klen,
  26919. pem_password_cb *cb, void *u)
  26920. {
  26921. byte *pem;
  26922. int plen, ret;
  26923. (void)cb;
  26924. (void)u;
  26925. WOLFSSL_MSG("wolfSSL_PEM_write_RSAPrivateKey");
  26926. if (fp == XBADFILE || rsa == NULL || rsa->internal == NULL)
  26927. {
  26928. WOLFSSL_MSG("Bad function arguments");
  26929. return WOLFSSL_FAILURE;
  26930. }
  26931. ret = wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, enc, kstr, klen, &pem, &plen);
  26932. if (ret != WOLFSSL_SUCCESS) {
  26933. WOLFSSL_MSG("wolfSSL_PEM_write_mem_RSAPrivateKey failed");
  26934. return WOLFSSL_FAILURE;
  26935. }
  26936. ret = (int)XFWRITE(pem, plen, 1, fp);
  26937. if (ret != 1) {
  26938. WOLFSSL_MSG("RSA private key file write failed");
  26939. return WOLFSSL_FAILURE;
  26940. }
  26941. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  26942. return WOLFSSL_SUCCESS;
  26943. }
  26944. #endif /* NO_FILESYSTEM */
  26945. #endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA && WOLFSSL_PEM_TO_DER */
  26946. #ifdef HAVE_ECC
  26947. #ifdef ALT_ECC_SIZE
  26948. static int SetIndividualInternalEcc(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  26949. {
  26950. WOLFSSL_MSG("Entering SetIndividualInternal");
  26951. if (bn == NULL || bn->internal == NULL) {
  26952. WOLFSSL_MSG("bn NULL error");
  26953. return WOLFSSL_FATAL_ERROR;
  26954. }
  26955. if (mpi == NULL) {
  26956. WOLFSSL_MSG("mpi NULL error");
  26957. return WOLFSSL_FATAL_ERROR;
  26958. }
  26959. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  26960. WOLFSSL_MSG("mp_copy error");
  26961. return WOLFSSL_FATAL_ERROR;
  26962. }
  26963. return WOLFSSL_SUCCESS;
  26964. }
  26965. #endif /* ALT_ECC_SIZE */
  26966. /* EC_POINT Openssl -> WolfSSL */
  26967. static int SetECPointInternal(WOLFSSL_EC_POINT *p)
  26968. {
  26969. ecc_point* point;
  26970. WOLFSSL_ENTER("SetECPointInternal");
  26971. if (p == NULL || p->internal == NULL) {
  26972. WOLFSSL_MSG("ECPoint NULL error");
  26973. return WOLFSSL_FATAL_ERROR;
  26974. }
  26975. point = (ecc_point*)p->internal;
  26976. #ifndef ALT_ECC_SIZE
  26977. if (p->X != NULL && SetIndividualInternal(p->X, point->x) != WOLFSSL_SUCCESS) {
  26978. WOLFSSL_MSG("ecc point X error");
  26979. return WOLFSSL_FATAL_ERROR;
  26980. }
  26981. if (p->Y != NULL && SetIndividualInternal(p->Y, point->y) != WOLFSSL_SUCCESS) {
  26982. WOLFSSL_MSG("ecc point Y error");
  26983. return WOLFSSL_FATAL_ERROR;
  26984. }
  26985. if (p->Z != NULL && SetIndividualInternal(p->Z, point->z) != WOLFSSL_SUCCESS) {
  26986. WOLFSSL_MSG("ecc point Z error");
  26987. return WOLFSSL_FATAL_ERROR;
  26988. }
  26989. #else
  26990. if (p->X != NULL && SetIndividualInternalEcc(p->X, point->x) != WOLFSSL_SUCCESS) {
  26991. WOLFSSL_MSG("ecc point X error");
  26992. return WOLFSSL_FATAL_ERROR;
  26993. }
  26994. if (p->Y != NULL && SetIndividualInternalEcc(p->Y, point->y) != WOLFSSL_SUCCESS) {
  26995. WOLFSSL_MSG("ecc point Y error");
  26996. return WOLFSSL_FATAL_ERROR;
  26997. }
  26998. if (p->Z != NULL && SetIndividualInternalEcc(p->Z, point->z) != WOLFSSL_SUCCESS) {
  26999. WOLFSSL_MSG("ecc point Z error");
  27000. return WOLFSSL_FATAL_ERROR;
  27001. }
  27002. #endif
  27003. p->inSet = 1;
  27004. return WOLFSSL_SUCCESS;
  27005. }
  27006. /* EC_POINT WolfSSL -> OpenSSL */
  27007. static int SetECPointExternal(WOLFSSL_EC_POINT *p)
  27008. {
  27009. ecc_point* point;
  27010. WOLFSSL_ENTER("SetECPointExternal");
  27011. if (p == NULL || p->internal == NULL) {
  27012. WOLFSSL_MSG("ECPoint NULL error");
  27013. return WOLFSSL_FATAL_ERROR;
  27014. }
  27015. point = (ecc_point*)p->internal;
  27016. if (SetIndividualExternal(&p->X, point->x) != WOLFSSL_SUCCESS) {
  27017. WOLFSSL_MSG("ecc point X error");
  27018. return WOLFSSL_FATAL_ERROR;
  27019. }
  27020. if (SetIndividualExternal(&p->Y, point->y) != WOLFSSL_SUCCESS) {
  27021. WOLFSSL_MSG("ecc point Y error");
  27022. return WOLFSSL_FATAL_ERROR;
  27023. }
  27024. if (SetIndividualExternal(&p->Z, point->z) != WOLFSSL_SUCCESS) {
  27025. WOLFSSL_MSG("ecc point Z error");
  27026. return WOLFSSL_FATAL_ERROR;
  27027. }
  27028. p->exSet = 1;
  27029. return WOLFSSL_SUCCESS;
  27030. }
  27031. /* EC_KEY wolfSSL -> OpenSSL */
  27032. int SetECKeyExternal(WOLFSSL_EC_KEY* eckey)
  27033. {
  27034. ecc_key* key;
  27035. WOLFSSL_ENTER("SetECKeyExternal");
  27036. if (eckey == NULL || eckey->internal == NULL) {
  27037. WOLFSSL_MSG("ec key NULL error");
  27038. return WOLFSSL_FATAL_ERROR;
  27039. }
  27040. key = (ecc_key*)eckey->internal;
  27041. /* set group (OID, nid and idx) */
  27042. eckey->group->curve_oid = ecc_sets[key->idx].oidSum;
  27043. eckey->group->curve_nid = EccEnumToNID(ecc_sets[key->idx].id);
  27044. eckey->group->curve_idx = key->idx;
  27045. if (eckey->pub_key->internal != NULL) {
  27046. /* set the internal public key */
  27047. if (wc_ecc_copy_point(&key->pubkey,
  27048. (ecc_point*)eckey->pub_key->internal) != MP_OKAY) {
  27049. WOLFSSL_MSG("SetECKeyExternal ecc_copy_point failed");
  27050. return WOLFSSL_FATAL_ERROR;
  27051. }
  27052. /* set the external pubkey (point) */
  27053. if (SetECPointExternal(eckey->pub_key) != WOLFSSL_SUCCESS) {
  27054. WOLFSSL_MSG("SetECKeyExternal SetECPointExternal failed");
  27055. return WOLFSSL_FATAL_ERROR;
  27056. }
  27057. }
  27058. /* set the external privkey */
  27059. if (key->type == ECC_PRIVATEKEY) {
  27060. if (SetIndividualExternal(&eckey->priv_key, &key->k) != WOLFSSL_SUCCESS) {
  27061. WOLFSSL_MSG("ec priv key error");
  27062. return WOLFSSL_FATAL_ERROR;
  27063. }
  27064. }
  27065. eckey->exSet = 1;
  27066. return WOLFSSL_SUCCESS;
  27067. }
  27068. /* EC_KEY Openssl -> WolfSSL */
  27069. int SetECKeyInternal(WOLFSSL_EC_KEY* eckey)
  27070. {
  27071. ecc_key* key;
  27072. WOLFSSL_ENTER("SetECKeyInternal");
  27073. if (eckey == NULL || eckey->internal == NULL || eckey->group == NULL) {
  27074. WOLFSSL_MSG("ec key NULL error");
  27075. return WOLFSSL_FATAL_ERROR;
  27076. }
  27077. key = (ecc_key*)eckey->internal;
  27078. /* validate group */
  27079. if ((eckey->group->curve_idx < 0) ||
  27080. (wc_ecc_is_valid_idx(eckey->group->curve_idx) == 0)) {
  27081. WOLFSSL_MSG("invalid curve idx");
  27082. return WOLFSSL_FATAL_ERROR;
  27083. }
  27084. /* set group (idx of curve and corresponding domain parameters) */
  27085. key->idx = eckey->group->curve_idx;
  27086. key->dp = &ecc_sets[key->idx];
  27087. /* set pubkey (point) */
  27088. if (eckey->pub_key != NULL) {
  27089. if (SetECPointInternal(eckey->pub_key) != WOLFSSL_SUCCESS) {
  27090. WOLFSSL_MSG("ec key pub error");
  27091. return WOLFSSL_FATAL_ERROR;
  27092. }
  27093. /* copy over the public point to key */
  27094. if (wc_ecc_copy_point((ecc_point*)eckey->pub_key->internal, &key->pubkey) != MP_OKAY) {
  27095. WOLFSSL_MSG("wc_ecc_copy_point error");
  27096. return WOLFSSL_FATAL_ERROR;
  27097. }
  27098. /* public key */
  27099. key->type = ECC_PUBLICKEY;
  27100. }
  27101. /* set privkey */
  27102. if (eckey->priv_key != NULL) {
  27103. if (SetIndividualInternal(eckey->priv_key, &key->k) != WOLFSSL_SUCCESS) {
  27104. WOLFSSL_MSG("ec key priv error");
  27105. return WOLFSSL_FATAL_ERROR;
  27106. }
  27107. /* private key */
  27108. key->type = ECC_PRIVATEKEY;
  27109. }
  27110. eckey->inSet = 1;
  27111. return WOLFSSL_SUCCESS;
  27112. }
  27113. WOLFSSL_EC_POINT *wolfSSL_EC_KEY_get0_public_key(const WOLFSSL_EC_KEY *key)
  27114. {
  27115. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_public_key");
  27116. if (key == NULL) {
  27117. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_public_key Bad arguments");
  27118. return NULL;
  27119. }
  27120. return key->pub_key;
  27121. }
  27122. const WOLFSSL_EC_GROUP *wolfSSL_EC_KEY_get0_group(const WOLFSSL_EC_KEY *key)
  27123. {
  27124. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_group");
  27125. if (key == NULL) {
  27126. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_group Bad arguments");
  27127. return NULL;
  27128. }
  27129. return key->group;
  27130. }
  27131. /* return code compliant with OpenSSL :
  27132. * 1 if success, 0 if error
  27133. */
  27134. int wolfSSL_EC_KEY_set_private_key(WOLFSSL_EC_KEY *key,
  27135. const WOLFSSL_BIGNUM *priv_key)
  27136. {
  27137. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_private_key");
  27138. if (key == NULL || priv_key == NULL) {
  27139. WOLFSSL_MSG("Bad arguments");
  27140. return WOLFSSL_FAILURE;
  27141. }
  27142. /* free key if previously set */
  27143. if (key->priv_key != NULL)
  27144. wolfSSL_BN_free(key->priv_key);
  27145. key->priv_key = wolfSSL_BN_dup(priv_key);
  27146. if (key->priv_key == NULL) {
  27147. WOLFSSL_MSG("key ecc priv key NULL");
  27148. return WOLFSSL_FAILURE;
  27149. }
  27150. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  27151. WOLFSSL_MSG("SetECKeyInternal failed");
  27152. wolfSSL_BN_free(key->priv_key);
  27153. return WOLFSSL_FAILURE;
  27154. }
  27155. return WOLFSSL_SUCCESS;
  27156. }
  27157. WOLFSSL_BIGNUM *wolfSSL_EC_KEY_get0_private_key(const WOLFSSL_EC_KEY *key)
  27158. {
  27159. WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_private_key");
  27160. if (key == NULL) {
  27161. WOLFSSL_MSG("wolfSSL_EC_KEY_get0_private_key Bad arguments");
  27162. return NULL;
  27163. }
  27164. if (wolfSSL_BN_is_zero(key->priv_key)) {
  27165. /* return NULL if not set */
  27166. return NULL;
  27167. }
  27168. return key->priv_key;
  27169. }
  27170. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid)
  27171. {
  27172. WOLFSSL_EC_KEY *key;
  27173. int x;
  27174. int eccEnum = NIDToEccEnum(nid);
  27175. WOLFSSL_ENTER("wolfSSL_EC_KEY_new_by_curve_name");
  27176. key = wolfSSL_EC_KEY_new();
  27177. if (key == NULL) {
  27178. WOLFSSL_MSG("wolfSSL_EC_KEY_new failure");
  27179. return NULL;
  27180. }
  27181. /* set the nid of the curve */
  27182. key->group->curve_nid = nid;
  27183. if (eccEnum != -1) {
  27184. /* search and set the corresponding internal curve idx */
  27185. for (x = 0; ecc_sets[x].size != 0; x++)
  27186. if (ecc_sets[x].id == eccEnum) {
  27187. key->group->curve_idx = x;
  27188. key->group->curve_oid = ecc_sets[x].oidSum;
  27189. break;
  27190. }
  27191. }
  27192. return key;
  27193. }
  27194. const char* wolfSSL_EC_curve_nid2nist(int nid)
  27195. {
  27196. const WOLF_EC_NIST_NAME* nist_name;
  27197. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  27198. if (nist_name->nid == nid) {
  27199. return kNistCurves->name;
  27200. }
  27201. }
  27202. return NULL;
  27203. }
  27204. #ifdef WOLFSSL_TLS13
  27205. static int populate_groups(int* groups, int max_count, char *list)
  27206. {
  27207. char *end;
  27208. int len;
  27209. int count = 0;
  27210. const WOLF_EC_NIST_NAME* nist_name;
  27211. if (!groups || !list) {
  27212. return -1;
  27213. }
  27214. for (end = list; ; list = ++end) {
  27215. if (count > max_count) {
  27216. WOLFSSL_MSG("Too many curves in list");
  27217. return -1;
  27218. }
  27219. while (*end != ':' && *end != '\0') end++;
  27220. len = (int)(end - list); /* end points to char after end
  27221. * of curve name so no need for -1 */
  27222. if ((len < kNistCurves_MIN_NAME_LEN) ||
  27223. (len > kNistCurves_MAX_NAME_LEN)) {
  27224. WOLFSSL_MSG("Unrecognized curve name in list");
  27225. return -1;
  27226. }
  27227. for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  27228. if (len == nist_name->name_len &&
  27229. XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) {
  27230. break;
  27231. }
  27232. }
  27233. if (!nist_name->name) {
  27234. WOLFSSL_MSG("Unrecognized curve name in list");
  27235. return -1;
  27236. }
  27237. groups[count++] = nist_name->nid;
  27238. if (*end == '\0') break;
  27239. }
  27240. return count;
  27241. }
  27242. int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list)
  27243. {
  27244. int groups[WOLFSSL_MAX_GROUP_COUNT];
  27245. int count;
  27246. if (!ctx || !list) {
  27247. return WOLFSSL_FAILURE;
  27248. }
  27249. if ((count = populate_groups(groups,
  27250. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  27251. return WOLFSSL_FAILURE;
  27252. }
  27253. return wolfSSL_CTX_set_groups(ctx, groups, count) == WOLFSSL_SUCCESS ?
  27254. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  27255. }
  27256. int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list)
  27257. {
  27258. int groups[WOLFSSL_MAX_GROUP_COUNT];
  27259. int count;
  27260. if (!ssl || !list) {
  27261. return WOLFSSL_FAILURE;
  27262. }
  27263. if ((count = populate_groups(groups,
  27264. WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
  27265. return WOLFSSL_FAILURE;
  27266. }
  27267. return wolfSSL_set_groups(ssl, groups, count) == WOLFSSL_SUCCESS ?
  27268. WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  27269. }
  27270. #endif /* WOLFSSL_TLS13 */
  27271. static void InitwolfSSL_ECKey(WOLFSSL_EC_KEY* key)
  27272. {
  27273. if (key) {
  27274. key->group = NULL;
  27275. key->pub_key = NULL;
  27276. key->priv_key = NULL;
  27277. key->internal = NULL;
  27278. key->inSet = 0;
  27279. key->exSet = 0;
  27280. }
  27281. }
  27282. WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void)
  27283. {
  27284. WOLFSSL_EC_KEY *external;
  27285. WOLFSSL_ENTER("wolfSSL_EC_KEY_new");
  27286. external = (WOLFSSL_EC_KEY*)XMALLOC(sizeof(WOLFSSL_EC_KEY), NULL,
  27287. DYNAMIC_TYPE_ECC);
  27288. if (external == NULL) {
  27289. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_KEY failure");
  27290. return NULL;
  27291. }
  27292. XMEMSET(external, 0, sizeof(WOLFSSL_EC_KEY));
  27293. InitwolfSSL_ECKey(external);
  27294. external->internal = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL,
  27295. DYNAMIC_TYPE_ECC);
  27296. if (external->internal == NULL) {
  27297. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc ecc key failure");
  27298. goto error;
  27299. }
  27300. XMEMSET(external->internal, 0, sizeof(ecc_key));
  27301. if (wc_ecc_init((ecc_key*)external->internal) != 0) {
  27302. WOLFSSL_MSG("wolfSSL_EC_KEY_new init ecc key failure");
  27303. goto error;
  27304. }
  27305. /* curve group */
  27306. external->group = wolfSSL_EC_GROUP_new_by_curve_name(ECC_CURVE_DEF);
  27307. if (external->group == NULL) {
  27308. WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_GROUP failure");
  27309. goto error;
  27310. }
  27311. /* public key */
  27312. external->pub_key = wolfSSL_EC_POINT_new(external->group);
  27313. if (external->pub_key == NULL) {
  27314. WOLFSSL_MSG("wolfSSL_EC_POINT_new failure");
  27315. goto error;
  27316. }
  27317. /* private key */
  27318. external->priv_key = wolfSSL_BN_new();
  27319. if (external->priv_key == NULL) {
  27320. WOLFSSL_MSG("wolfSSL_BN_new failure");
  27321. goto error;
  27322. }
  27323. return external;
  27324. error:
  27325. wolfSSL_EC_KEY_free(external);
  27326. return NULL;
  27327. }
  27328. void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key)
  27329. {
  27330. WOLFSSL_ENTER("wolfSSL_EC_KEY_free");
  27331. if (key != NULL) {
  27332. if (key->internal != NULL) {
  27333. wc_ecc_free((ecc_key*)key->internal);
  27334. XFREE(key->internal, NULL, DYNAMIC_TYPE_ECC);
  27335. }
  27336. wolfSSL_BN_free(key->priv_key);
  27337. wolfSSL_EC_POINT_free(key->pub_key);
  27338. wolfSSL_EC_GROUP_free(key->group);
  27339. InitwolfSSL_ECKey(key); /* set back to NULLs for safety */
  27340. XFREE(key, NULL, DYNAMIC_TYPE_ECC);
  27341. /* key = NULL, don't try to access or double free it */
  27342. }
  27343. }
  27344. #ifndef NO_WOLFSSL_STUB
  27345. int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group)
  27346. {
  27347. (void)key;
  27348. (void)group;
  27349. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_group");
  27350. WOLFSSL_STUB("EC_KEY_set_group");
  27351. return -1;
  27352. }
  27353. #endif
  27354. int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key)
  27355. {
  27356. int initTmpRng = 0;
  27357. int eccEnum;
  27358. WC_RNG* rng = NULL;
  27359. #ifdef WOLFSSL_SMALL_STACK
  27360. WC_RNG* tmpRNG = NULL;
  27361. #else
  27362. WC_RNG tmpRNG[1];
  27363. #endif
  27364. WOLFSSL_ENTER("wolfSSL_EC_KEY_generate_key");
  27365. if (key == NULL || key->internal == NULL ||
  27366. key->group == NULL || key->group->curve_idx < 0) {
  27367. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key Bad arguments");
  27368. return 0;
  27369. }
  27370. #ifdef WOLFSSL_SMALL_STACK
  27371. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27372. if (tmpRNG == NULL)
  27373. return 0;
  27374. #endif
  27375. if (wc_InitRng(tmpRNG) == 0) {
  27376. rng = tmpRNG;
  27377. initTmpRng = 1;
  27378. }
  27379. else {
  27380. WOLFSSL_MSG("Bad RNG Init, trying global");
  27381. if (initGlobalRNG == 0)
  27382. WOLFSSL_MSG("Global RNG no Init");
  27383. else
  27384. rng = &globalRNG;
  27385. }
  27386. if (rng == NULL) {
  27387. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to set RNG");
  27388. #ifdef WOLFSSL_SMALL_STACK
  27389. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27390. #endif
  27391. return 0;
  27392. }
  27393. /* NIDToEccEnum returns -1 for invalid NID so if key->group->curve_nid
  27394. * is 0 then pass ECC_CURVE_DEF as arg */
  27395. eccEnum = key->group->curve_nid ?
  27396. NIDToEccEnum(key->group->curve_nid) : ECC_CURVE_DEF;
  27397. if (wc_ecc_make_key_ex(rng, 0, (ecc_key*)key->internal, eccEnum) != MP_OKAY) {
  27398. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key wc_ecc_make_key failed");
  27399. #ifdef WOLFSSL_SMALL_STACK
  27400. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27401. #endif
  27402. return 0;
  27403. }
  27404. if (initTmpRng)
  27405. wc_FreeRng(tmpRNG);
  27406. #ifdef WOLFSSL_SMALL_STACK
  27407. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27408. #endif
  27409. if (SetECKeyExternal(key) != WOLFSSL_SUCCESS) {
  27410. WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key SetECKeyExternal failed");
  27411. return 0;
  27412. }
  27413. return 1;
  27414. }
  27415. #ifndef NO_WOLFSSL_STUB
  27416. void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag)
  27417. {
  27418. (void)key;
  27419. (void)asn1_flag;
  27420. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_asn1_flag");
  27421. WOLFSSL_STUB("EC_KEY_set_asn1_flag");
  27422. }
  27423. #endif
  27424. static int setupPoint(const WOLFSSL_EC_POINT *p) {
  27425. if (!p) {
  27426. return WOLFSSL_FAILURE;
  27427. }
  27428. if (p->inSet == 0) {
  27429. WOLFSSL_MSG("No ECPoint internal set, do it");
  27430. if (SetECPointInternal((WOLFSSL_EC_POINT *)p) != WOLFSSL_SUCCESS) {
  27431. WOLFSSL_MSG("SetECPointInternal SetECPointInternal failed");
  27432. return WOLFSSL_FAILURE;
  27433. }
  27434. }
  27435. return WOLFSSL_SUCCESS;
  27436. }
  27437. /* return code compliant with OpenSSL :
  27438. * 1 if success, 0 if error
  27439. */
  27440. int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key,
  27441. const WOLFSSL_EC_POINT *pub)
  27442. {
  27443. ecc_point *pub_p, *key_p;
  27444. WOLFSSL_ENTER("wolfSSL_EC_KEY_set_public_key");
  27445. if (key == NULL || key->internal == NULL ||
  27446. pub == NULL || pub->internal == NULL) {
  27447. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order Bad arguments");
  27448. return WOLFSSL_FAILURE;
  27449. }
  27450. if (key->inSet == 0) {
  27451. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  27452. WOLFSSL_MSG("SetECKeyInternal failed");
  27453. return WOLFSSL_FAILURE;
  27454. }
  27455. }
  27456. if (setupPoint(pub) != WOLFSSL_SUCCESS) {
  27457. return WOLFSSL_FAILURE;
  27458. }
  27459. pub_p = (ecc_point*)pub->internal;
  27460. key_p = (ecc_point*)key->pub_key->internal;
  27461. /* create new point if required */
  27462. if (key_p == NULL)
  27463. key_p = wc_ecc_new_point();
  27464. if (key_p == NULL) {
  27465. WOLFSSL_MSG("key ecc point NULL");
  27466. return WOLFSSL_FAILURE;
  27467. }
  27468. if (wc_ecc_copy_point(pub_p, key_p) != MP_OKAY) {
  27469. WOLFSSL_MSG("ecc_copy_point failure");
  27470. return WOLFSSL_FAILURE;
  27471. }
  27472. if (SetECPointExternal(key->pub_key) != WOLFSSL_SUCCESS) {
  27473. WOLFSSL_MSG("SetECKeyInternal failed");
  27474. return WOLFSSL_FAILURE;
  27475. }
  27476. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  27477. WOLFSSL_MSG("SetECKeyInternal failed");
  27478. return WOLFSSL_FAILURE;
  27479. }
  27480. wolfSSL_EC_POINT_dump("pub", pub);
  27481. wolfSSL_EC_POINT_dump("key->pub_key", key->pub_key);
  27482. return WOLFSSL_SUCCESS;
  27483. }
  27484. /* End EC_KEY */
  27485. int wolfSSL_ECDSA_size(const WOLFSSL_EC_KEY *key)
  27486. {
  27487. const EC_GROUP *group;
  27488. int bits, bytes;
  27489. word32 headerSz = 4; /* 2*ASN_TAG + 2*LEN(ENUM) */
  27490. if (!key) {
  27491. return WOLFSSL_FAILURE;
  27492. }
  27493. if (!(group = wolfSSL_EC_KEY_get0_group(key))) {
  27494. return WOLFSSL_FAILURE;
  27495. }
  27496. if ((bits = wolfSSL_EC_GROUP_order_bits(group)) == 0) {
  27497. return WOLFSSL_FAILURE;
  27498. }
  27499. bytes = (bits + 7) / 8; /* bytes needed to hold bits */
  27500. return headerSz +
  27501. 2 + /* possible leading zeroes in r and s */
  27502. bytes + bytes + /* r and s */
  27503. 2;
  27504. }
  27505. int wolfSSL_ECDSA_sign(int type, const unsigned char *digest,
  27506. int digestSz, unsigned char *sig,
  27507. unsigned int *sigSz, WOLFSSL_EC_KEY *key)
  27508. {
  27509. int ret = WOLFSSL_SUCCESS;
  27510. WC_RNG* rng = NULL;
  27511. #ifdef WOLFSSL_SMALL_STACK
  27512. WC_RNG* tmpRNG = NULL;
  27513. #else
  27514. WC_RNG tmpRNG[1];
  27515. #endif
  27516. int initTmpRng = 0;
  27517. WOLFSSL_ENTER("wolfSSL_ECDSA_sign");
  27518. if (!key) {
  27519. return WOLFSSL_FAILURE;
  27520. }
  27521. #ifdef WOLFSSL_SMALL_STACK
  27522. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  27523. if (tmpRNG == NULL)
  27524. return WOLFSSL_FAILURE;
  27525. #endif
  27526. if (wc_InitRng(tmpRNG) == 0) {
  27527. rng = tmpRNG;
  27528. initTmpRng = 1;
  27529. }
  27530. else {
  27531. WOLFSSL_MSG("Bad RNG Init, trying global");
  27532. if (initGlobalRNG == 0) {
  27533. WOLFSSL_MSG("Global RNG no Init");
  27534. }
  27535. else {
  27536. rng = &globalRNG;
  27537. }
  27538. }
  27539. if (rng) {
  27540. if (wc_ecc_sign_hash(digest, digestSz, sig, sigSz, rng, (ecc_key*)key->internal) != MP_OKAY) {
  27541. ret = WOLFSSL_FAILURE;
  27542. }
  27543. if (initTmpRng) {
  27544. wc_FreeRng(tmpRNG);
  27545. }
  27546. } else {
  27547. ret = WOLFSSL_FAILURE;
  27548. }
  27549. #ifdef WOLFSSL_SMALL_STACK
  27550. if (tmpRNG)
  27551. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  27552. #endif
  27553. (void)type;
  27554. return ret;
  27555. }
  27556. #ifndef HAVE_SELFTEST
  27557. /* ECC point compression types were not included in selftest ecc.h */
  27558. char* wolfSSL_EC_POINT_point2hex(const WOLFSSL_EC_GROUP* group,
  27559. const WOLFSSL_EC_POINT* point, int form,
  27560. WOLFSSL_BN_CTX* ctx)
  27561. {
  27562. static const char* hexDigit = "0123456789ABCDEF";
  27563. char* hex = NULL;
  27564. int id;
  27565. int i, sz, len;
  27566. (void)ctx;
  27567. if (group == NULL || point == NULL)
  27568. return NULL;
  27569. id = wc_ecc_get_curve_id(group->curve_idx);
  27570. if ((sz = wc_ecc_get_curve_size_from_id(id)) < 0)
  27571. return NULL;
  27572. len = sz + 1;
  27573. if (form == POINT_CONVERSION_UNCOMPRESSED)
  27574. len += sz;
  27575. hex = (char*)XMALLOC(2 * len + 1, NULL, DYNAMIC_TYPE_ECC);
  27576. if (hex == NULL)
  27577. return NULL;
  27578. XMEMSET(hex, 0, 2 * len + 1);
  27579. /* Put in x-ordinate after format byte. */
  27580. i = sz - mp_unsigned_bin_size((mp_int*)point->X->internal) + 1;
  27581. if (mp_to_unsigned_bin((mp_int*)point->X->internal, (byte*)(hex + i)) < 0) {
  27582. XFREE(hex, NULL, DYNAMIC_TYPE_ECC);
  27583. return NULL;
  27584. }
  27585. if (form == POINT_CONVERSION_COMPRESSED) {
  27586. hex[0] = mp_isodd((mp_int*)point->Y->internal) ? ECC_POINT_COMP_ODD :
  27587. ECC_POINT_COMP_EVEN;
  27588. }
  27589. else {
  27590. hex[0] = ECC_POINT_UNCOMP;
  27591. /* Put in y-ordinate after x-ordinate */
  27592. i = 1 + 2 * sz - mp_unsigned_bin_size((mp_int*)point->Y->internal);
  27593. if (mp_to_unsigned_bin((mp_int*)point->Y->internal,
  27594. (byte*)(hex + i)) < 0) {
  27595. XFREE(hex, NULL, DYNAMIC_TYPE_ECC);
  27596. return NULL;
  27597. }
  27598. }
  27599. for (i = len-1; i >= 0; i--) {
  27600. byte b = hex[i];
  27601. hex[i * 2 + 1] = hexDigit[b & 0xf];
  27602. hex[i * 2 ] = hexDigit[b >> 4];
  27603. }
  27604. return hex;
  27605. }
  27606. #endif /* HAVE_SELFTEST */
  27607. void wolfSSL_EC_POINT_dump(const char *msg, const WOLFSSL_EC_POINT *p)
  27608. {
  27609. #if defined(DEBUG_WOLFSSL)
  27610. char *num;
  27611. WOLFSSL_ENTER("wolfSSL_EC_POINT_dump");
  27612. if (!WOLFSSL_IS_DEBUG_ON() || wolfSSL_GetLoggingCb()) {
  27613. return;
  27614. }
  27615. if (p == NULL) {
  27616. printf("%s = NULL", msg);
  27617. return;
  27618. }
  27619. printf("%s:\n\tinSet=%d, exSet=%d\n", msg, p->inSet, p->exSet);
  27620. num = wolfSSL_BN_bn2hex(p->X);
  27621. printf("\tX = %s\n", num);
  27622. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  27623. num = wolfSSL_BN_bn2hex(p->Y);
  27624. printf("\tY = %s\n", num);
  27625. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  27626. num = wolfSSL_BN_bn2hex(p->Z);
  27627. printf("\tZ = %s\n", num);
  27628. XFREE(num, NULL, DYNAMIC_TYPE_ECC);
  27629. #else
  27630. (void)msg;
  27631. (void)p;
  27632. #endif
  27633. }
  27634. /* Start EC_GROUP */
  27635. /* return code compliant with OpenSSL :
  27636. * 0 if equal, 1 if not and -1 in case of error
  27637. */
  27638. int wolfSSL_EC_GROUP_cmp(const WOLFSSL_EC_GROUP *a, const WOLFSSL_EC_GROUP *b,
  27639. WOLFSSL_BN_CTX *ctx)
  27640. {
  27641. (void)ctx;
  27642. WOLFSSL_ENTER("wolfSSL_EC_GROUP_cmp");
  27643. if (a == NULL || b == NULL) {
  27644. WOLFSSL_MSG("wolfSSL_EC_GROUP_cmp Bad arguments");
  27645. return WOLFSSL_FATAL_ERROR;
  27646. }
  27647. /* ok */
  27648. if ((a->curve_idx == b->curve_idx) && (a->curve_nid == b->curve_nid))
  27649. return 0;
  27650. /* ko */
  27651. return 1;
  27652. }
  27653. WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_dup(const WOLFSSL_EC_GROUP *src)
  27654. {
  27655. if (!src)
  27656. return NULL;
  27657. return wolfSSL_EC_GROUP_new_by_curve_name(src->curve_nid);
  27658. }
  27659. #endif /* HAVE_ECC */
  27660. #endif /* OPENSSL_EXTRA */
  27661. #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  27662. const WOLFSSL_EC_METHOD* wolfSSL_EC_GROUP_method_of(
  27663. const WOLFSSL_EC_GROUP *group)
  27664. {
  27665. return group;
  27666. }
  27667. int wolfSSL_EC_METHOD_get_field_type(const WOLFSSL_EC_METHOD *meth)
  27668. {
  27669. if (meth) {
  27670. return NID_X9_62_prime_field;
  27671. }
  27672. return WOLFSSL_FAILURE;
  27673. }
  27674. void wolfSSL_EC_GROUP_free(WOLFSSL_EC_GROUP *group)
  27675. {
  27676. WOLFSSL_ENTER("wolfSSL_EC_GROUP_free");
  27677. XFREE(group, NULL, DYNAMIC_TYPE_ECC);
  27678. /* group = NULL, don't try to access or double free it */
  27679. }
  27680. #endif
  27681. #ifdef OPENSSL_EXTRA
  27682. #ifdef HAVE_ECC
  27683. #ifndef NO_WOLFSSL_STUB
  27684. void wolfSSL_EC_GROUP_set_asn1_flag(WOLFSSL_EC_GROUP *group, int flag)
  27685. {
  27686. (void)group;
  27687. (void)flag;
  27688. WOLFSSL_ENTER("wolfSSL_EC_GROUP_set_asn1_flag");
  27689. WOLFSSL_STUB("EC_GROUP_set_asn1_flag");
  27690. }
  27691. #endif
  27692. WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid)
  27693. {
  27694. WOLFSSL_EC_GROUP *g;
  27695. int x;
  27696. int eccEnum;
  27697. WOLFSSL_ENTER("wolfSSL_EC_GROUP_new_by_curve_name");
  27698. /* If NID passed in is OpenSSL type, convert it to ecc_curve_id enum */
  27699. eccEnum = NIDToEccEnum(nid);
  27700. /* curve group */
  27701. g = (WOLFSSL_EC_GROUP*) XMALLOC(sizeof(WOLFSSL_EC_GROUP), NULL,
  27702. DYNAMIC_TYPE_ECC);
  27703. if (g == NULL) {
  27704. WOLFSSL_MSG("wolfSSL_EC_GROUP_new_by_curve_name malloc failure");
  27705. return NULL;
  27706. }
  27707. XMEMSET(g, 0, sizeof(WOLFSSL_EC_GROUP));
  27708. /* set the nid of the curve */
  27709. g->curve_nid = nid;
  27710. if (eccEnum != -1) {
  27711. /* search and set the corresponding internal curve idx */
  27712. for (x = 0; ecc_sets[x].size != 0; x++)
  27713. if (ecc_sets[x].id == eccEnum) {
  27714. g->curve_idx = x;
  27715. g->curve_oid = ecc_sets[x].oidSum;
  27716. break;
  27717. }
  27718. }
  27719. return g;
  27720. }
  27721. /* return code compliant with OpenSSL :
  27722. * the curve nid if success, 0 if error
  27723. */
  27724. int wolfSSL_EC_GROUP_get_curve_name(const WOLFSSL_EC_GROUP *group)
  27725. {
  27726. int nid;
  27727. WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_curve_name");
  27728. if (group == NULL) {
  27729. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_curve_name Bad arguments");
  27730. return WOLFSSL_FAILURE;
  27731. }
  27732. /* If curve_nid is ECC Enum type, return corresponding OpenSSL nid */
  27733. if ((nid = EccEnumToNID(group->curve_nid)) != -1)
  27734. return nid;
  27735. return group->curve_nid;
  27736. }
  27737. /* return code compliant with OpenSSL :
  27738. * the degree of the curve if success, 0 if error
  27739. */
  27740. int wolfSSL_EC_GROUP_get_degree(const WOLFSSL_EC_GROUP *group)
  27741. {
  27742. int nid;
  27743. int tmp;
  27744. WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_degree");
  27745. if (group == NULL || group->curve_idx < 0) {
  27746. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_degree Bad arguments");
  27747. return WOLFSSL_FAILURE;
  27748. }
  27749. /* If curve_nid passed in is an ecc_curve_id enum, convert it to the
  27750. corresponding OpenSSL NID */
  27751. tmp = EccEnumToNID(group->curve_nid);
  27752. if (tmp != -1){
  27753. nid = tmp;
  27754. }
  27755. else{
  27756. nid = group->curve_nid;
  27757. }
  27758. switch(nid) {
  27759. case NID_secp112r1:
  27760. case NID_secp112r2:
  27761. return 112;
  27762. case NID_secp128r1:
  27763. case NID_secp128r2:
  27764. return 128;
  27765. case NID_secp160k1:
  27766. case NID_secp160r1:
  27767. case NID_secp160r2:
  27768. case NID_brainpoolP160r1:
  27769. return 160;
  27770. case NID_secp192k1:
  27771. case NID_brainpoolP192r1:
  27772. case NID_X9_62_prime192v1:
  27773. return 192;
  27774. case NID_secp224k1:
  27775. case NID_secp224r1:
  27776. case NID_brainpoolP224r1:
  27777. return 224;
  27778. case NID_secp256k1:
  27779. case NID_brainpoolP256r1:
  27780. case NID_X9_62_prime256v1:
  27781. return 256;
  27782. case NID_brainpoolP320r1:
  27783. return 320;
  27784. case NID_secp384r1:
  27785. case NID_brainpoolP384r1:
  27786. return 384;
  27787. case NID_secp521r1:
  27788. return 521;
  27789. case NID_brainpoolP512r1:
  27790. return 512;
  27791. default:
  27792. return WOLFSSL_FAILURE;
  27793. }
  27794. }
  27795. /* Converts OpenSSL NID value of ECC curves to the associated enum values in
  27796. ecc_curve_id, used by ecc_sets[].*/
  27797. int NIDToEccEnum(int n)
  27798. {
  27799. WOLFSSL_ENTER("NIDToEccEnum()");
  27800. switch(n) {
  27801. case NID_X9_62_prime192v1:
  27802. return ECC_SECP192R1;
  27803. case NID_X9_62_prime192v2:
  27804. return ECC_PRIME192V2;
  27805. case NID_X9_62_prime192v3:
  27806. return ECC_PRIME192V3;
  27807. case NID_X9_62_prime239v1:
  27808. return ECC_PRIME239V1;
  27809. case NID_X9_62_prime239v2:
  27810. return ECC_PRIME239V2;
  27811. case NID_X9_62_prime239v3:
  27812. return ECC_PRIME239V3;
  27813. case NID_X9_62_prime256v1:
  27814. return ECC_SECP256R1;
  27815. case NID_secp112r1:
  27816. return ECC_SECP112R1;
  27817. case NID_secp112r2:
  27818. return ECC_SECP112R2;
  27819. case NID_secp128r1:
  27820. return ECC_SECP128R1;
  27821. case NID_secp128r2:
  27822. return ECC_SECP128R2;
  27823. case NID_secp160r1:
  27824. return ECC_SECP160R1;
  27825. case NID_secp160r2:
  27826. return ECC_SECP160R2;
  27827. case NID_secp224r1:
  27828. return ECC_SECP224R1;
  27829. case NID_secp384r1:
  27830. return ECC_SECP384R1;
  27831. case NID_secp521r1:
  27832. return ECC_SECP521R1;
  27833. case NID_secp160k1:
  27834. return ECC_SECP160K1;
  27835. case NID_secp192k1:
  27836. return ECC_SECP192K1;
  27837. case NID_secp224k1:
  27838. return ECC_SECP224K1;
  27839. case NID_secp256k1:
  27840. return ECC_SECP256K1;
  27841. case NID_brainpoolP160r1:
  27842. return ECC_BRAINPOOLP160R1;
  27843. case NID_brainpoolP192r1:
  27844. return ECC_BRAINPOOLP192R1;
  27845. case NID_brainpoolP224r1:
  27846. return ECC_BRAINPOOLP224R1;
  27847. case NID_brainpoolP256r1:
  27848. return ECC_BRAINPOOLP256R1;
  27849. case NID_brainpoolP320r1:
  27850. return ECC_BRAINPOOLP320R1;
  27851. case NID_brainpoolP384r1:
  27852. return ECC_BRAINPOOLP384R1;
  27853. case NID_brainpoolP512r1:
  27854. return ECC_BRAINPOOLP512R1;
  27855. default:
  27856. WOLFSSL_MSG("NID not found");
  27857. return -1;
  27858. }
  27859. }
  27860. /* return code compliant with OpenSSL :
  27861. * 1 if success, 0 if error
  27862. */
  27863. int wolfSSL_EC_GROUP_get_order(const WOLFSSL_EC_GROUP *group,
  27864. WOLFSSL_BIGNUM *order, WOLFSSL_BN_CTX *ctx)
  27865. {
  27866. (void)ctx;
  27867. if (group == NULL || order == NULL || order->internal == NULL) {
  27868. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order NULL error");
  27869. return WOLFSSL_FAILURE;
  27870. }
  27871. if (mp_init((mp_int*)order->internal) != MP_OKAY) {
  27872. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_init failure");
  27873. return WOLFSSL_FAILURE;
  27874. }
  27875. if (mp_read_radix((mp_int*)order->internal,
  27876. ecc_sets[group->curve_idx].order, MP_RADIX_HEX) != MP_OKAY) {
  27877. WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_read order failure");
  27878. mp_clear((mp_int*)order->internal);
  27879. return WOLFSSL_FAILURE;
  27880. }
  27881. return WOLFSSL_SUCCESS;
  27882. }
  27883. int wolfSSL_EC_GROUP_order_bits(const WOLFSSL_EC_GROUP *group)
  27884. {
  27885. int ret;
  27886. mp_int order;
  27887. if (group == NULL || group->curve_idx < 0) {
  27888. WOLFSSL_MSG("wolfSSL_EC_GROUP_order_bits NULL error");
  27889. return 0;
  27890. }
  27891. ret = mp_init(&order);
  27892. if (ret == 0) {
  27893. ret = mp_read_radix(&order, ecc_sets[group->curve_idx].order,
  27894. MP_RADIX_HEX);
  27895. if (ret == 0)
  27896. ret = mp_count_bits(&order);
  27897. mp_clear(&order);
  27898. }
  27899. return ret;
  27900. }
  27901. /* End EC_GROUP */
  27902. /* Start EC_POINT */
  27903. /* return code compliant with OpenSSL :
  27904. * 1 if success, 0 if error
  27905. */
  27906. int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *group,
  27907. const WOLFSSL_EC_POINT *p,
  27908. unsigned char *out, unsigned int *len)
  27909. {
  27910. int err;
  27911. WOLFSSL_ENTER("wolfSSL_ECPoint_i2d");
  27912. if (group == NULL || p == NULL || len == NULL) {
  27913. WOLFSSL_MSG("wolfSSL_ECPoint_i2d NULL error");
  27914. return WOLFSSL_FAILURE;
  27915. }
  27916. if (setupPoint(p) != WOLFSSL_SUCCESS) {
  27917. return WOLFSSL_FAILURE;
  27918. }
  27919. if (out != NULL) {
  27920. wolfSSL_EC_POINT_dump("i2d p", p);
  27921. }
  27922. err = wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal,
  27923. out, len);
  27924. if (err != MP_OKAY && !(out == NULL && err == LENGTH_ONLY_E)) {
  27925. WOLFSSL_MSG("wolfSSL_ECPoint_i2d wc_ecc_export_point_der failed");
  27926. return WOLFSSL_FAILURE;
  27927. }
  27928. return WOLFSSL_SUCCESS;
  27929. }
  27930. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  27931. /* return code compliant with OpenSSL :
  27932. * 1 if success, 0 if error
  27933. */
  27934. int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len,
  27935. const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *p)
  27936. {
  27937. WOLFSSL_ENTER("wolfSSL_ECPoint_d2i");
  27938. if (group == NULL || p == NULL || p->internal == NULL || in == NULL) {
  27939. WOLFSSL_MSG("wolfSSL_ECPoint_d2i NULL error");
  27940. return WOLFSSL_FAILURE;
  27941. }
  27942. #ifndef HAVE_SELFTEST
  27943. if (wc_ecc_import_point_der_ex(in, len, group->curve_idx,
  27944. (ecc_point*)p->internal, 0) != MP_OKAY) {
  27945. WOLFSSL_MSG("wc_ecc_import_point_der_ex failed");
  27946. return WOLFSSL_FAILURE;
  27947. }
  27948. #else
  27949. /* ECC_POINT_UNCOMP is not defined CAVP self test so use magic number */
  27950. if (in[0] == 0x04) {
  27951. if (wc_ecc_import_point_der(in, len, group->curve_idx,
  27952. (ecc_point*)p->internal) != MP_OKAY) {
  27953. WOLFSSL_MSG("wc_ecc_import_point_der failed");
  27954. return WOLFSSL_FAILURE;
  27955. }
  27956. }
  27957. else {
  27958. WOLFSSL_MSG("Only uncompressed points supported with HAVE_SELFTEST");
  27959. return WOLFSSL_FAILURE;
  27960. }
  27961. #endif
  27962. /* Set new external point */
  27963. if (SetECPointExternal(p) != WOLFSSL_SUCCESS) {
  27964. WOLFSSL_MSG("SetECPointExternal failed");
  27965. return WOLFSSL_FAILURE;
  27966. }
  27967. wolfSSL_EC_POINT_dump("d2i p", p);
  27968. return WOLFSSL_SUCCESS;
  27969. }
  27970. size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group,
  27971. const WOLFSSL_EC_POINT *p,
  27972. char form,
  27973. byte *buf, size_t len, WOLFSSL_BN_CTX *ctx)
  27974. {
  27975. word32 min_len = (word32)len;
  27976. #ifndef HAVE_SELFTEST
  27977. int compressed = form == POINT_CONVERSION_COMPRESSED ? 1 : 0;
  27978. #endif /* !HAVE_SELFTEST */
  27979. WOLFSSL_ENTER("EC_POINT_point2oct");
  27980. if (!group || !p) {
  27981. return WOLFSSL_FAILURE;
  27982. }
  27983. if (setupPoint(p) != WOLFSSL_SUCCESS) {
  27984. return WOLFSSL_FAILURE;
  27985. }
  27986. if (wolfSSL_EC_POINT_is_at_infinity(group, p)) {
  27987. /* encodes to a single 0 octet */
  27988. if (buf != NULL) {
  27989. if (len < 1) {
  27990. ECerr(EC_F_EC_GFP_SIMPLE_POINT2OCT, EC_R_BUFFER_TOO_SMALL);
  27991. return WOLFSSL_FAILURE;
  27992. }
  27993. buf[0] = 0;
  27994. }
  27995. return 1;
  27996. }
  27997. if (form != POINT_CONVERSION_UNCOMPRESSED
  27998. #ifndef HAVE_SELFTEST
  27999. && form != POINT_CONVERSION_COMPRESSED
  28000. #endif /* !HAVE_SELFTEST */
  28001. ) {
  28002. WOLFSSL_MSG("Unsupported curve form");
  28003. return WOLFSSL_FAILURE;
  28004. }
  28005. #ifndef HAVE_SELFTEST
  28006. if (wc_ecc_export_point_der_ex(group->curve_idx, (ecc_point*)p->internal,
  28007. buf, &min_len, compressed) != (buf ? MP_OKAY : LENGTH_ONLY_E)) {
  28008. return WOLFSSL_FAILURE;
  28009. }
  28010. #else
  28011. if (wc_ecc_export_point_der(group->curve_idx, (ecc_point*)p->internal,
  28012. buf, &min_len) != (buf ? MP_OKAY : LENGTH_ONLY_E)) {
  28013. return WOLFSSL_FAILURE;
  28014. }
  28015. #endif /* !HAVE_SELFTEST */
  28016. (void)ctx;
  28017. return (size_t)min_len;
  28018. }
  28019. int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group,
  28020. WOLFSSL_EC_POINT *p, const unsigned char *buf,
  28021. size_t len, WOLFSSL_BN_CTX *ctx)
  28022. {
  28023. WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
  28024. if (!group || !p) {
  28025. return WOLFSSL_FAILURE;
  28026. }
  28027. (void)ctx;
  28028. return wolfSSL_ECPoint_d2i((unsigned char*)buf, (unsigned int)len, group, p);
  28029. }
  28030. int wolfSSL_i2o_ECPublicKey(const WOLFSSL_EC_KEY *in, unsigned char **out)
  28031. {
  28032. size_t len;
  28033. unsigned char *tmp = NULL;
  28034. char form;
  28035. WOLFSSL_ENTER("wolfSSL_i2o_ECPublicKey");
  28036. if (!in) {
  28037. WOLFSSL_MSG("wolfSSL_i2o_ECPublicKey Bad arguments");
  28038. return WOLFSSL_FAILURE;
  28039. }
  28040. #ifdef HAVE_COMP_KEY
  28041. /* Default to compressed form if not set */
  28042. form = in->form == POINT_CONVERSION_UNCOMPRESSED ?
  28043. POINT_CONVERSION_UNCOMPRESSED:
  28044. POINT_CONVERSION_COMPRESSED;
  28045. #else
  28046. form = POINT_CONVERSION_UNCOMPRESSED;
  28047. #endif
  28048. len = wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form,
  28049. NULL, 0, NULL);
  28050. if (len != WOLFSSL_FAILURE && out) {
  28051. if (!*out) {
  28052. if (!(tmp = (unsigned char*)XMALLOC(len, NULL,
  28053. DYNAMIC_TYPE_OPENSSL))) {
  28054. WOLFSSL_MSG("malloc failed");
  28055. return WOLFSSL_FAILURE;
  28056. }
  28057. *out = tmp;
  28058. }
  28059. if (wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form, *out,
  28060. len, NULL) == WOLFSSL_FAILURE) {
  28061. if (tmp) {
  28062. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  28063. *out = NULL;
  28064. }
  28065. return WOLFSSL_FAILURE;
  28066. }
  28067. if (!tmp) {
  28068. /* Move buffer forward if it was not alloced in this function */
  28069. *out += len;
  28070. }
  28071. }
  28072. return (int)len;
  28073. }
  28074. #ifdef HAVE_ECC_KEY_IMPORT
  28075. WOLFSSL_EC_KEY *wolfSSL_d2i_ECPrivateKey(WOLFSSL_EC_KEY **key, const unsigned char **in,
  28076. long len)
  28077. {
  28078. WOLFSSL_EC_KEY *eckey = NULL;
  28079. WOLFSSL_ENTER("wolfSSL_d2i_ECPrivateKey");
  28080. if (!in || !*in || len <= 0) {
  28081. WOLFSSL_MSG("wolfSSL_d2i_ECPrivateKey Bad arguments");
  28082. return NULL;
  28083. }
  28084. if (!(eckey = wolfSSL_EC_KEY_new())) {
  28085. WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
  28086. return NULL;
  28087. }
  28088. if (wc_ecc_import_private_key(*in, (word32)len, NULL, 0,
  28089. (ecc_key*)eckey->internal) != MP_OKAY) {
  28090. WOLFSSL_MSG("wc_ecc_import_private_key error");
  28091. goto error;
  28092. }
  28093. eckey->inSet = 1;
  28094. if (SetECKeyExternal(eckey) != WOLFSSL_SUCCESS) {
  28095. WOLFSSL_MSG("SetECKeyExternal error");
  28096. goto error;
  28097. }
  28098. if (key) {
  28099. *key = eckey;
  28100. }
  28101. return eckey;
  28102. error:
  28103. wolfSSL_EC_KEY_free(eckey);
  28104. return NULL;
  28105. }
  28106. #endif /* HAVE_ECC_KEY_IMPORT */
  28107. int wolfSSL_i2d_ECPrivateKey(const WOLFSSL_EC_KEY *in, unsigned char **out)
  28108. {
  28109. int len;
  28110. byte* buf = NULL;
  28111. WOLFSSL_ENTER("wolfSSL_i2d_ECPrivateKey");
  28112. if (!in) {
  28113. WOLFSSL_MSG("wolfSSL_i2d_ECPrivateKey Bad arguments");
  28114. return WOLFSSL_FAILURE;
  28115. }
  28116. if (!in->inSet && SetECKeyInternal((WOLFSSL_EC_KEY*)in) != WOLFSSL_SUCCESS) {
  28117. WOLFSSL_MSG("SetECKeyInternal error");
  28118. return WOLFSSL_FAILURE;
  28119. }
  28120. if ((len = wc_ecc_size((ecc_key*)in->internal)) <= 0) {
  28121. WOLFSSL_MSG("wc_ecc_size error");
  28122. return WOLFSSL_FAILURE;
  28123. }
  28124. if (out) {
  28125. if (!(buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  28126. WOLFSSL_MSG("tmp buffer malloc error");
  28127. return WOLFSSL_FAILURE;
  28128. }
  28129. if (wc_ecc_export_private_only((ecc_key*)in->internal, buf,
  28130. (word32*)&len) != MP_OKAY) {
  28131. WOLFSSL_MSG("wc_ecc_export_private_only error");
  28132. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28133. return WOLFSSL_FAILURE;
  28134. }
  28135. if (*out) {
  28136. XMEMCPY(*out, buf, len);
  28137. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28138. }
  28139. else {
  28140. *out = buf;
  28141. }
  28142. }
  28143. return len;
  28144. }
  28145. void wolfSSL_EC_KEY_set_conv_form(WOLFSSL_EC_KEY *eckey, char form)
  28146. {
  28147. if (eckey && (form == POINT_CONVERSION_UNCOMPRESSED
  28148. #ifdef HAVE_COMP_KEY
  28149. || form == POINT_CONVERSION_COMPRESSED
  28150. #endif
  28151. )) {
  28152. eckey->form = form;
  28153. } else {
  28154. WOLFSSL_MSG("Incorrect form or HAVE_COMP_KEY not compiled in");
  28155. }
  28156. }
  28157. /* wolfSSL_EC_POINT_point2bn should return "in" if not null */
  28158. WOLFSSL_BIGNUM *wolfSSL_EC_POINT_point2bn(const WOLFSSL_EC_GROUP *group,
  28159. const WOLFSSL_EC_POINT *p,
  28160. char form,
  28161. WOLFSSL_BIGNUM *in, WOLFSSL_BN_CTX *ctx)
  28162. {
  28163. size_t len;
  28164. byte *buf;
  28165. WOLFSSL_BIGNUM *ret = NULL;
  28166. WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
  28167. if (!group || !p) {
  28168. return NULL;
  28169. }
  28170. if ((len = wolfSSL_EC_POINT_point2oct(group, p, form,
  28171. NULL, 0, ctx)) == WOLFSSL_FAILURE) {
  28172. return NULL;
  28173. }
  28174. if (!(buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  28175. WOLFSSL_MSG("malloc failed");
  28176. return NULL;
  28177. }
  28178. if (wolfSSL_EC_POINT_point2oct(group, p, form,
  28179. buf, len, ctx) == len) {
  28180. ret = wolfSSL_BN_bin2bn(buf, (int)len, in);
  28181. }
  28182. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  28183. return ret;
  28184. }
  28185. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  28186. #ifdef USE_ECC_B_PARAM
  28187. int wolfSSL_EC_POINT_is_on_curve(const WOLFSSL_EC_GROUP *group,
  28188. const WOLFSSL_EC_POINT *point,
  28189. WOLFSSL_BN_CTX *ctx)
  28190. {
  28191. (void)ctx;
  28192. WOLFSSL_ENTER("wolfSSL_EC_POINT_is_on_curve");
  28193. if (!group || !point) {
  28194. WOLFSSL_MSG("Invalid arguments");
  28195. return WOLFSSL_FAILURE;
  28196. }
  28197. if (!point->inSet && SetECPointInternal((WOLFSSL_EC_POINT*)point)) {
  28198. WOLFSSL_MSG("SetECPointInternal error");
  28199. return WOLFSSL_FAILURE;
  28200. }
  28201. return wc_ecc_point_is_on_curve((ecc_point*)point->internal, group->curve_idx)
  28202. == MP_OKAY ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  28203. }
  28204. #endif /* USE_ECC_B_PARAM */
  28205. WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group)
  28206. {
  28207. WOLFSSL_EC_POINT *p;
  28208. WOLFSSL_ENTER("wolfSSL_EC_POINT_new");
  28209. if (group == NULL) {
  28210. WOLFSSL_MSG("wolfSSL_EC_POINT_new NULL error");
  28211. return NULL;
  28212. }
  28213. p = (WOLFSSL_EC_POINT *)XMALLOC(sizeof(WOLFSSL_EC_POINT), NULL,
  28214. DYNAMIC_TYPE_ECC);
  28215. if (p == NULL) {
  28216. WOLFSSL_MSG("wolfSSL_EC_POINT_new malloc ecc point failure");
  28217. return NULL;
  28218. }
  28219. XMEMSET(p, 0, sizeof(WOLFSSL_EC_POINT));
  28220. p->internal = wc_ecc_new_point();
  28221. if (p->internal == NULL) {
  28222. WOLFSSL_MSG("ecc_new_point failure");
  28223. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  28224. return NULL;
  28225. }
  28226. return p;
  28227. }
  28228. /* return code compliant with OpenSSL :
  28229. * 1 if success, 0 if error
  28230. */
  28231. int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
  28232. const WOLFSSL_EC_POINT *point,
  28233. WOLFSSL_BIGNUM *x,
  28234. WOLFSSL_BIGNUM *y,
  28235. WOLFSSL_BN_CTX *ctx)
  28236. {
  28237. mp_digit mp;
  28238. mp_int modulus;
  28239. (void)ctx;
  28240. WOLFSSL_ENTER("wolfSSL_EC_POINT_get_affine_coordinates_GFp");
  28241. if (group == NULL || point == NULL || point->internal == NULL ||
  28242. x == NULL || y == NULL || wolfSSL_EC_POINT_is_at_infinity(group, point)) {
  28243. WOLFSSL_MSG("wolfSSL_EC_POINT_get_affine_coordinates_GFp NULL error");
  28244. return WOLFSSL_FAILURE;
  28245. }
  28246. if (setupPoint(point) != WOLFSSL_SUCCESS) {
  28247. return WOLFSSL_FAILURE;
  28248. }
  28249. if (!wolfSSL_BN_is_one(point->Z)) {
  28250. if (mp_init(&modulus) != MP_OKAY) {
  28251. WOLFSSL_MSG("mp_init failed");
  28252. return WOLFSSL_FAILURE;
  28253. }
  28254. /* Map the Jacobian point back to affine space */
  28255. if (mp_read_radix(&modulus, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX) != MP_OKAY) {
  28256. WOLFSSL_MSG("mp_read_radix failed");
  28257. mp_clear(&modulus);
  28258. return WOLFSSL_FAILURE;
  28259. }
  28260. if (mp_montgomery_setup(&modulus, &mp) != MP_OKAY) {
  28261. WOLFSSL_MSG("mp_montgomery_setup failed");
  28262. mp_clear(&modulus);
  28263. return WOLFSSL_FAILURE;
  28264. }
  28265. if (ecc_map((ecc_point*)point->internal, &modulus, mp) != MP_OKAY) {
  28266. WOLFSSL_MSG("ecc_map failed");
  28267. mp_clear(&modulus);
  28268. return WOLFSSL_FAILURE;
  28269. }
  28270. if (SetECPointExternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) {
  28271. WOLFSSL_MSG("SetECPointExternal failed");
  28272. mp_clear(&modulus);
  28273. return WOLFSSL_FAILURE;
  28274. }
  28275. }
  28276. BN_copy(x, point->X);
  28277. BN_copy(y, point->Y);
  28278. mp_clear(&modulus);
  28279. return WOLFSSL_SUCCESS;
  28280. }
  28281. int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group,
  28282. WOLFSSL_EC_POINT *point,
  28283. const WOLFSSL_BIGNUM *x,
  28284. const WOLFSSL_BIGNUM *y,
  28285. WOLFSSL_BN_CTX *ctx)
  28286. {
  28287. (void)ctx;
  28288. WOLFSSL_ENTER("wolfSSL_EC_POINT_set_affine_coordinates_GFp");
  28289. if (group == NULL || point == NULL || point->internal == NULL ||
  28290. x == NULL || y == NULL) {
  28291. WOLFSSL_MSG("wolfSSL_EC_POINT_set_affine_coordinates_GFp NULL error");
  28292. return WOLFSSL_FAILURE;
  28293. }
  28294. if (!point->X) {
  28295. point->X = wolfSSL_BN_new();
  28296. }
  28297. if (!point->Y) {
  28298. point->Y = wolfSSL_BN_new();
  28299. }
  28300. if (!point->Z) {
  28301. point->Z = wolfSSL_BN_new();
  28302. }
  28303. if (!point->X || !point->Y || !point->Z) {
  28304. WOLFSSL_MSG("wolfSSL_BN_new failed");
  28305. return WOLFSSL_FAILURE;
  28306. }
  28307. BN_copy(point->X, x);
  28308. BN_copy(point->Y, y);
  28309. BN_copy(point->Z, wolfSSL_BN_value_one());
  28310. if (SetECPointInternal((WOLFSSL_EC_POINT *)point) != WOLFSSL_SUCCESS) {
  28311. WOLFSSL_MSG("SetECPointInternal failed");
  28312. return WOLFSSL_FAILURE;
  28313. }
  28314. return WOLFSSL_SUCCESS;
  28315. }
  28316. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  28317. !defined(HAVE_SELFTEST)
  28318. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  28319. int wolfSSL_EC_POINT_add(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
  28320. const WOLFSSL_EC_POINT *p1,
  28321. const WOLFSSL_EC_POINT *p2, WOLFSSL_BN_CTX *ctx)
  28322. {
  28323. mp_int a, prime, mu;
  28324. mp_digit mp = 0;
  28325. ecc_point* montP1 = NULL;
  28326. ecc_point* montP2 = NULL;
  28327. ecc_point* eccP1;
  28328. ecc_point* eccP2;
  28329. int ret = WOLFSSL_FAILURE;
  28330. (void)ctx;
  28331. if (!group || !r || !p1 || !p2) {
  28332. WOLFSSL_MSG("wolfSSL_EC_POINT_add error");
  28333. return WOLFSSL_FAILURE;
  28334. }
  28335. if (setupPoint(r) != WOLFSSL_SUCCESS ||
  28336. setupPoint(p1) != WOLFSSL_SUCCESS ||
  28337. setupPoint(p2) != WOLFSSL_SUCCESS) {
  28338. WOLFSSL_MSG("setupPoint error");
  28339. return WOLFSSL_FAILURE;
  28340. }
  28341. /* read the curve prime and a */
  28342. if (mp_init_multi(&prime, &a, &mu, NULL, NULL, NULL) != MP_OKAY) {
  28343. WOLFSSL_MSG("mp_init_multi error");
  28344. goto cleanup;
  28345. }
  28346. if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX)
  28347. != MP_OKAY) {
  28348. WOLFSSL_MSG("mp_read_radix a error");
  28349. goto cleanup;
  28350. }
  28351. if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX)
  28352. != MP_OKAY) {
  28353. WOLFSSL_MSG("mp_read_radix prime error");
  28354. goto cleanup;
  28355. }
  28356. if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) {
  28357. WOLFSSL_MSG("mp_montgomery_setup nqm error");
  28358. goto cleanup;
  28359. }
  28360. eccP1 = (ecc_point*)p1->internal;
  28361. eccP2 = (ecc_point*)p2->internal;
  28362. if (!(montP1 = wc_ecc_new_point_h(NULL)) ||
  28363. !(montP2 = wc_ecc_new_point_h(NULL))) {
  28364. WOLFSSL_MSG("wc_ecc_new_point_h nqm error");
  28365. goto cleanup;
  28366. }
  28367. if ((mp_montgomery_calc_normalization(&mu, &prime)) != MP_OKAY) {
  28368. WOLFSSL_MSG("mp_montgomery_calc_normalization error");
  28369. goto cleanup;
  28370. }
  28371. /* Convert to Montgomery form */
  28372. if (mp_cmp_d(&mu, 1) == MP_EQ) {
  28373. if (wc_ecc_copy_point(eccP1, montP1) != MP_OKAY ||
  28374. wc_ecc_copy_point(eccP2, montP2) != MP_OKAY) {
  28375. WOLFSSL_MSG("wc_ecc_copy_point error");
  28376. goto cleanup;
  28377. }
  28378. } else {
  28379. if (mp_mulmod(eccP1->x, &mu, &prime, montP1->x) != MP_OKAY ||
  28380. mp_mulmod(eccP1->y, &mu, &prime, montP1->y) != MP_OKAY ||
  28381. mp_mulmod(eccP1->z, &mu, &prime, montP1->z) != MP_OKAY) {
  28382. WOLFSSL_MSG("mp_mulmod error");
  28383. goto cleanup;
  28384. }
  28385. if (mp_mulmod(eccP2->x, &mu, &prime, montP2->x) != MP_OKAY ||
  28386. mp_mulmod(eccP2->y, &mu, &prime, montP2->y) != MP_OKAY ||
  28387. mp_mulmod(eccP2->z, &mu, &prime, montP2->z) != MP_OKAY) {
  28388. WOLFSSL_MSG("mp_mulmod error");
  28389. goto cleanup;
  28390. }
  28391. }
  28392. if (ecc_projective_add_point(montP1, montP2, (ecc_point*)r->internal,
  28393. &a, &prime, mp) != MP_OKAY) {
  28394. WOLFSSL_MSG("ecc_projective_add_point error");
  28395. goto cleanup;
  28396. }
  28397. if (ecc_map((ecc_point*)r->internal, &prime, mp) != MP_OKAY) {
  28398. WOLFSSL_MSG("ecc_map error");
  28399. goto cleanup;
  28400. }
  28401. ret = WOLFSSL_SUCCESS;
  28402. cleanup:
  28403. mp_clear(&a);
  28404. mp_clear(&prime);
  28405. mp_clear(&mu);
  28406. wc_ecc_del_point_h(montP1, NULL);
  28407. wc_ecc_del_point_h(montP2, NULL);
  28408. return ret;
  28409. }
  28410. /* Calculate the value: generator * n + q * m
  28411. * return code compliant with OpenSSL :
  28412. * 1 if success, 0 if error
  28413. */
  28414. int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
  28415. const WOLFSSL_BIGNUM *n, const WOLFSSL_EC_POINT *q,
  28416. const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  28417. {
  28418. mp_int a, prime;
  28419. int ret = WOLFSSL_FAILURE;
  28420. ecc_point* result = NULL;
  28421. ecc_point* tmp = NULL;
  28422. (void)ctx;
  28423. WOLFSSL_ENTER("wolfSSL_EC_POINT_mul");
  28424. if (!group || !r) {
  28425. WOLFSSL_MSG("wolfSSL_EC_POINT_mul NULL error");
  28426. return WOLFSSL_FAILURE;
  28427. }
  28428. if (!(result = wc_ecc_new_point())) {
  28429. WOLFSSL_MSG("wolfSSL_EC_POINT_new error");
  28430. return WOLFSSL_FAILURE;
  28431. }
  28432. /* read the curve prime and a */
  28433. if (mp_init_multi(&prime, &a, NULL, NULL, NULL, NULL) != MP_OKAY) {
  28434. WOLFSSL_MSG("mp_init_multi error");
  28435. goto cleanup;
  28436. }
  28437. if (q && setupPoint(q) != WOLFSSL_SUCCESS) {
  28438. WOLFSSL_MSG("setupPoint error");
  28439. goto cleanup;
  28440. }
  28441. if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX)
  28442. != MP_OKAY) {
  28443. WOLFSSL_MSG("mp_read_radix prime error");
  28444. goto cleanup;
  28445. }
  28446. if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX)
  28447. != MP_OKAY) {
  28448. WOLFSSL_MSG("mp_read_radix a error");
  28449. goto cleanup;
  28450. }
  28451. if (n) {
  28452. /* load generator */
  28453. if (wc_ecc_get_generator(result, group->curve_idx)
  28454. != MP_OKAY) {
  28455. WOLFSSL_MSG("wc_ecc_get_generator error");
  28456. goto cleanup;
  28457. }
  28458. }
  28459. if (n && q && m) {
  28460. /* r = generator * n + q * m */
  28461. #ifdef ECC_SHAMIR
  28462. if (ecc_mul2add(result, (mp_int*)n->internal,
  28463. (ecc_point*)q->internal, (mp_int*)m->internal,
  28464. result, &a, &prime, NULL)
  28465. != MP_OKAY) {
  28466. WOLFSSL_MSG("ecc_mul2add error");
  28467. goto cleanup;
  28468. }
  28469. #else
  28470. mp_digit mp = 0;
  28471. if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) {
  28472. WOLFSSL_MSG("mp_montgomery_setup nqm error");
  28473. goto cleanup;
  28474. }
  28475. if (!(tmp = wc_ecc_new_point())) {
  28476. WOLFSSL_MSG("wolfSSL_EC_POINT_new nqm error");
  28477. goto cleanup;
  28478. }
  28479. /* r = generator * n */
  28480. if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 0)
  28481. != MP_OKAY) {
  28482. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  28483. goto cleanup;
  28484. }
  28485. /* tmp = q * m */
  28486. if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
  28487. tmp, &a, &prime, 0) != MP_OKAY) {
  28488. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  28489. goto cleanup;
  28490. }
  28491. /* result = result + tmp */
  28492. if (ecc_projective_add_point(tmp, result, result, &a, &prime, mp)
  28493. != MP_OKAY) {
  28494. WOLFSSL_MSG("wc_ecc_mulmod nqm error");
  28495. goto cleanup;
  28496. }
  28497. if (ecc_map(result, &prime, mp) != MP_OKAY) {
  28498. WOLFSSL_MSG("ecc_map nqm error");
  28499. goto cleanup;
  28500. }
  28501. #endif
  28502. }
  28503. else if (n) {
  28504. /* r = generator * n */
  28505. if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 1)
  28506. != MP_OKAY) {
  28507. WOLFSSL_MSG("wc_ecc_mulmod gn error");
  28508. goto cleanup;
  28509. }
  28510. }
  28511. else if (q && m) {
  28512. /* r = q * m */
  28513. if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
  28514. result, &a, &prime, 1) != MP_OKAY) {
  28515. WOLFSSL_MSG("wc_ecc_mulmod qm error");
  28516. goto cleanup;
  28517. }
  28518. }
  28519. /* copy to destination */
  28520. if (wc_ecc_copy_point(result, (ecc_point*)r->internal)) {
  28521. WOLFSSL_MSG("wc_ecc_copy_point error");
  28522. goto cleanup;
  28523. }
  28524. r->inSet = 1;
  28525. if (SetECPointExternal(r) != WOLFSSL_SUCCESS) {
  28526. WOLFSSL_MSG("SetECPointExternal error");
  28527. goto cleanup;
  28528. }
  28529. ret = WOLFSSL_SUCCESS;
  28530. cleanup:
  28531. mp_clear(&a);
  28532. mp_clear(&prime);
  28533. wc_ecc_del_point(result);
  28534. wc_ecc_del_point(tmp);
  28535. return ret;
  28536. }
  28537. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  28538. #endif /* !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) &&
  28539. * !defined(HAVE_SELFTEST) */
  28540. /* (x, y) -> (x, -y) */
  28541. int wolfSSL_EC_POINT_invert(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *a,
  28542. WOLFSSL_BN_CTX *ctx)
  28543. {
  28544. ecc_point* p;
  28545. mp_int prime;
  28546. (void)ctx;
  28547. WOLFSSL_ENTER("wolfSSL_EC_POINT_invert");
  28548. if (!group || !a || !a->internal || setupPoint(a) != WOLFSSL_SUCCESS) {
  28549. return WOLFSSL_FAILURE;
  28550. }
  28551. p = (ecc_point*)a->internal;
  28552. /* read the curve prime and a */
  28553. if (mp_init_multi(&prime, NULL, NULL, NULL, NULL, NULL) != MP_OKAY) {
  28554. WOLFSSL_MSG("mp_init_multi error");
  28555. return WOLFSSL_FAILURE;
  28556. }
  28557. if (mp_sub(&prime, p->y, p->y) != MP_OKAY) {
  28558. WOLFSSL_MSG("mp_sub error");
  28559. return WOLFSSL_FAILURE;
  28560. }
  28561. if (SetECPointExternal(a) != WOLFSSL_SUCCESS) {
  28562. WOLFSSL_MSG("SetECPointExternal error");
  28563. return WOLFSSL_FAILURE;
  28564. }
  28565. return WOLFSSL_SUCCESS;
  28566. }
  28567. void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *p)
  28568. {
  28569. WOLFSSL_ENTER("wolfSSL_EC_POINT_clear_free");
  28570. wolfSSL_EC_POINT_free(p);
  28571. }
  28572. /* return code compliant with OpenSSL :
  28573. * 0 if equal, 1 if not and -1 in case of error
  28574. */
  28575. int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group,
  28576. const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b,
  28577. WOLFSSL_BN_CTX *ctx)
  28578. {
  28579. int ret;
  28580. (void)ctx;
  28581. WOLFSSL_ENTER("wolfSSL_EC_POINT_cmp");
  28582. if (group == NULL || a == NULL || a->internal == NULL || b == NULL ||
  28583. b->internal == NULL) {
  28584. WOLFSSL_MSG("wolfSSL_EC_POINT_cmp Bad arguments");
  28585. return WOLFSSL_FATAL_ERROR;
  28586. }
  28587. ret = wc_ecc_cmp_point((ecc_point*)a->internal, (ecc_point*)b->internal);
  28588. if (ret == MP_EQ)
  28589. return 0;
  28590. else if (ret == MP_LT || ret == MP_GT)
  28591. return 1;
  28592. return WOLFSSL_FATAL_ERROR;
  28593. }
  28594. int wolfSSL_EC_POINT_copy(WOLFSSL_EC_POINT *dest, const WOLFSSL_EC_POINT *src)
  28595. {
  28596. WOLFSSL_ENTER("wolfSSL_EC_POINT_copy");
  28597. if (!dest || !src) {
  28598. return WOLFSSL_FAILURE;
  28599. }
  28600. if (setupPoint(src) != WOLFSSL_SUCCESS) {
  28601. return WOLFSSL_FAILURE;
  28602. }
  28603. if (wc_ecc_copy_point((ecc_point*) dest->internal,
  28604. (ecc_point*) src->internal) != MP_OKAY) {
  28605. return WOLFSSL_FAILURE;
  28606. }
  28607. dest->inSet = 1;
  28608. if (SetECPointExternal(dest) != WOLFSSL_SUCCESS) {
  28609. return WOLFSSL_FAILURE;
  28610. }
  28611. return WOLFSSL_SUCCESS;
  28612. }
  28613. #endif /* HAVE_ECC */
  28614. #endif /* OPENSSL_EXTRA */
  28615. #if defined(HAVE_ECC) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  28616. void wolfSSL_EC_POINT_free(WOLFSSL_EC_POINT *p)
  28617. {
  28618. WOLFSSL_ENTER("wolfSSL_EC_POINT_free");
  28619. if (p != NULL) {
  28620. if (p->internal != NULL) {
  28621. wc_ecc_del_point((ecc_point*)p->internal);
  28622. p->internal = NULL;
  28623. }
  28624. wolfSSL_BN_free(p->X);
  28625. wolfSSL_BN_free(p->Y);
  28626. wolfSSL_BN_free(p->Z);
  28627. p->X = NULL;
  28628. p->Y = NULL;
  28629. p->Z = NULL;
  28630. p->inSet = p->exSet = 0;
  28631. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  28632. /* p = NULL, don't try to access or double free it */
  28633. }
  28634. }
  28635. #endif
  28636. #ifdef OPENSSL_EXTRA
  28637. #ifdef HAVE_ECC
  28638. /* return code compliant with OpenSSL :
  28639. * 1 if point at infinity, 0 else
  28640. */
  28641. int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group,
  28642. const WOLFSSL_EC_POINT *point)
  28643. {
  28644. int ret;
  28645. WOLFSSL_ENTER("wolfSSL_EC_POINT_is_at_infinity");
  28646. if (group == NULL || point == NULL || point->internal == NULL) {
  28647. WOLFSSL_MSG("wolfSSL_EC_POINT_is_at_infinity NULL error");
  28648. return WOLFSSL_FAILURE;
  28649. }
  28650. if (setupPoint(point) != WOLFSSL_SUCCESS) {
  28651. return WOLFSSL_FAILURE;
  28652. }
  28653. ret = wc_ecc_point_is_at_infinity((ecc_point*)point->internal);
  28654. if (ret < 0) {
  28655. WOLFSSL_MSG("ecc_point_is_at_infinity failure");
  28656. return WOLFSSL_FAILURE;
  28657. }
  28658. return ret;
  28659. }
  28660. /* End EC_POINT */
  28661. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  28662. size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems)
  28663. {
  28664. size_t i, min_nitems;
  28665. #ifdef HAVE_SELFTEST
  28666. size_t ecc_sets_count;
  28667. for (i = 0; ecc_sets[i].size != 0 && ecc_sets[i].name != NULL; i++);
  28668. ecc_sets_count = i;
  28669. #endif
  28670. if (r == NULL || nitems == 0)
  28671. return ecc_sets_count;
  28672. min_nitems = nitems < ecc_sets_count ? nitems : ecc_sets_count;
  28673. for (i = 0; i < min_nitems; i++) {
  28674. r[i].nid = EccEnumToNID(ecc_sets[i].id);
  28675. r[i].comment = wolfSSL_OBJ_nid2sn(r[i].nid);
  28676. }
  28677. return min_nitems;
  28678. }
  28679. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  28680. /* Start ECDSA_SIG */
  28681. void wolfSSL_ECDSA_SIG_free(WOLFSSL_ECDSA_SIG *sig)
  28682. {
  28683. WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_free");
  28684. if (sig) {
  28685. wolfSSL_BN_free(sig->r);
  28686. wolfSSL_BN_free(sig->s);
  28687. XFREE(sig, NULL, DYNAMIC_TYPE_ECC);
  28688. }
  28689. }
  28690. WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_SIG_new(void)
  28691. {
  28692. WOLFSSL_ECDSA_SIG *sig;
  28693. WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_new");
  28694. sig = (WOLFSSL_ECDSA_SIG*) XMALLOC(sizeof(WOLFSSL_ECDSA_SIG), NULL,
  28695. DYNAMIC_TYPE_ECC);
  28696. if (sig == NULL) {
  28697. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA signature failure");
  28698. return NULL;
  28699. }
  28700. sig->s = NULL;
  28701. sig->r = wolfSSL_BN_new();
  28702. if (sig->r == NULL) {
  28703. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA r failure");
  28704. wolfSSL_ECDSA_SIG_free(sig);
  28705. return NULL;
  28706. }
  28707. sig->s = wolfSSL_BN_new();
  28708. if (sig->s == NULL) {
  28709. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA s failure");
  28710. wolfSSL_ECDSA_SIG_free(sig);
  28711. return NULL;
  28712. }
  28713. return sig;
  28714. }
  28715. /* return signature structure on success, NULL otherwise */
  28716. WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_do_sign(const unsigned char *d, int dlen,
  28717. WOLFSSL_EC_KEY *key)
  28718. {
  28719. WOLFSSL_ECDSA_SIG *sig = NULL;
  28720. int initTmpRng = 0;
  28721. WC_RNG* rng = NULL;
  28722. #ifdef WOLFSSL_SMALL_STACK
  28723. WC_RNG* tmpRNG = NULL;
  28724. #else
  28725. WC_RNG tmpRNG[1];
  28726. #endif
  28727. WOLFSSL_ENTER("wolfSSL_ECDSA_do_sign");
  28728. if (d == NULL || key == NULL || key->internal == NULL) {
  28729. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad arguments");
  28730. return NULL;
  28731. }
  28732. /* set internal key if not done */
  28733. if (key->inSet == 0)
  28734. {
  28735. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign No EC key internal set, do it");
  28736. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  28737. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign SetECKeyInternal failed");
  28738. return NULL;
  28739. }
  28740. }
  28741. #ifdef WOLFSSL_SMALL_STACK
  28742. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  28743. if (tmpRNG == NULL)
  28744. return NULL;
  28745. #endif
  28746. if (wc_InitRng(tmpRNG) == 0) {
  28747. rng = tmpRNG;
  28748. initTmpRng = 1;
  28749. }
  28750. else {
  28751. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad RNG Init, trying global");
  28752. if (initGlobalRNG == 0)
  28753. WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Global RNG no Init");
  28754. else
  28755. rng = &globalRNG;
  28756. }
  28757. if (rng) {
  28758. mp_int sig_r, sig_s;
  28759. if (mp_init_multi(&sig_r, &sig_s, NULL, NULL, NULL, NULL) == MP_OKAY) {
  28760. if (wc_ecc_sign_hash_ex(d, dlen, rng, (ecc_key*)key->internal,
  28761. &sig_r, &sig_s) != MP_OKAY) {
  28762. WOLFSSL_MSG("wc_ecc_sign_hash_ex failed");
  28763. }
  28764. else {
  28765. /* put signature blob in ECDSA structure */
  28766. sig = wolfSSL_ECDSA_SIG_new();
  28767. if (sig == NULL)
  28768. WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new failed");
  28769. else if (SetIndividualExternal(&(sig->r), &sig_r)!=WOLFSSL_SUCCESS){
  28770. WOLFSSL_MSG("ecdsa r key error");
  28771. wolfSSL_ECDSA_SIG_free(sig);
  28772. sig = NULL;
  28773. }
  28774. else if (SetIndividualExternal(&(sig->s), &sig_s)!=WOLFSSL_SUCCESS){
  28775. WOLFSSL_MSG("ecdsa s key error");
  28776. wolfSSL_ECDSA_SIG_free(sig);
  28777. sig = NULL;
  28778. }
  28779. }
  28780. mp_free(&sig_r);
  28781. mp_free(&sig_s);
  28782. }
  28783. }
  28784. if (initTmpRng)
  28785. wc_FreeRng(tmpRNG);
  28786. #ifdef WOLFSSL_SMALL_STACK
  28787. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  28788. #endif
  28789. return sig;
  28790. }
  28791. /* return code compliant with OpenSSL :
  28792. * 1 for a valid signature, 0 for an invalid signature and -1 on error
  28793. */
  28794. int wolfSSL_ECDSA_do_verify(const unsigned char *d, int dlen,
  28795. const WOLFSSL_ECDSA_SIG *sig, WOLFSSL_EC_KEY *key)
  28796. {
  28797. int check_sign = 0;
  28798. WOLFSSL_ENTER("wolfSSL_ECDSA_do_verify");
  28799. if (d == NULL || sig == NULL || key == NULL || key->internal == NULL) {
  28800. WOLFSSL_MSG("wolfSSL_ECDSA_do_verify Bad arguments");
  28801. return WOLFSSL_FATAL_ERROR;
  28802. }
  28803. /* set internal key if not done */
  28804. if (key->inSet == 0)
  28805. {
  28806. WOLFSSL_MSG("No EC key internal set, do it");
  28807. if (SetECKeyInternal(key) != WOLFSSL_SUCCESS) {
  28808. WOLFSSL_MSG("SetECKeyInternal failed");
  28809. return WOLFSSL_FATAL_ERROR;
  28810. }
  28811. }
  28812. if (wc_ecc_verify_hash_ex((mp_int*)sig->r->internal,
  28813. (mp_int*)sig->s->internal, d, dlen, &check_sign,
  28814. (ecc_key *)key->internal) != MP_OKAY) {
  28815. WOLFSSL_MSG("wc_ecc_verify_hash failed");
  28816. return WOLFSSL_FATAL_ERROR;
  28817. }
  28818. else if (check_sign == 0) {
  28819. WOLFSSL_MSG("wc_ecc_verify_hash incorrect signature detected");
  28820. return WOLFSSL_FAILURE;
  28821. }
  28822. return WOLFSSL_SUCCESS;
  28823. }
  28824. WOLFSSL_ECDSA_SIG *wolfSSL_d2i_ECDSA_SIG(WOLFSSL_ECDSA_SIG **sig,
  28825. const unsigned char **pp, long len)
  28826. {
  28827. WOLFSSL_ECDSA_SIG *s = NULL;
  28828. if (pp == NULL)
  28829. return NULL;
  28830. if (sig != NULL)
  28831. s = *sig;
  28832. if (s == NULL) {
  28833. s = wolfSSL_ECDSA_SIG_new();
  28834. if (s == NULL)
  28835. return NULL;
  28836. }
  28837. /* DecodeECC_DSA_Sig calls mp_init, so free these */
  28838. mp_free((mp_int*)s->r->internal);
  28839. mp_free((mp_int*)s->s->internal);
  28840. if (DecodeECC_DSA_Sig(*pp, (word32)len, (mp_int*)s->r->internal,
  28841. (mp_int*)s->s->internal) != MP_OKAY) {
  28842. if (sig == NULL || *sig == NULL)
  28843. wolfSSL_ECDSA_SIG_free(s);
  28844. return NULL;
  28845. }
  28846. *pp += len;
  28847. if (sig != NULL)
  28848. *sig = s;
  28849. return s;
  28850. }
  28851. int wolfSSL_i2d_ECDSA_SIG(const WOLFSSL_ECDSA_SIG *sig, unsigned char **pp)
  28852. {
  28853. word32 len;
  28854. if (sig == NULL)
  28855. return 0;
  28856. /* ASN.1: SEQ + INT + INT
  28857. * ASN.1 Integer must be a positive value - prepend zero if number has
  28858. * top bit set.
  28859. */
  28860. len = 2 + mp_leading_bit((mp_int*)sig->r->internal) +
  28861. mp_unsigned_bin_size((mp_int*)sig->r->internal) +
  28862. 2 + mp_leading_bit((mp_int*)sig->s->internal) +
  28863. mp_unsigned_bin_size((mp_int*)sig->s->internal);
  28864. /* Two bytes required for length if ASN.1 SEQ data greater than 127 bytes
  28865. * and less than 256 bytes.
  28866. */
  28867. len = 1 + ((len > 127) ? 2 : 1) + len;
  28868. if (pp != NULL && *pp != NULL) {
  28869. if (StoreECC_DSA_Sig(*pp, &len, (mp_int*)sig->r->internal,
  28870. (mp_int*)sig->s->internal) != MP_OKAY) {
  28871. len = 0;
  28872. }
  28873. else
  28874. *pp += len;
  28875. }
  28876. return (int)len;
  28877. }
  28878. /* End ECDSA_SIG */
  28879. /* Start ECDH */
  28880. /* return code compliant with OpenSSL :
  28881. * length of computed key if success, -1 if error
  28882. */
  28883. int wolfSSL_ECDH_compute_key(void *out, size_t outlen,
  28884. const WOLFSSL_EC_POINT *pub_key,
  28885. WOLFSSL_EC_KEY *ecdh,
  28886. void *(*KDF) (const void *in, size_t inlen,
  28887. void *out, size_t *outlen))
  28888. {
  28889. word32 len;
  28890. (void)KDF;
  28891. (void)KDF;
  28892. WOLFSSL_ENTER("wolfSSL_ECDH_compute_key");
  28893. if (out == NULL || pub_key == NULL || pub_key->internal == NULL ||
  28894. ecdh == NULL || ecdh->internal == NULL) {
  28895. WOLFSSL_MSG("Bad function arguments");
  28896. return WOLFSSL_FATAL_ERROR;
  28897. }
  28898. /* set internal key if not done */
  28899. if (ecdh->inSet == 0)
  28900. {
  28901. WOLFSSL_MSG("No EC key internal set, do it");
  28902. if (SetECKeyInternal(ecdh) != WOLFSSL_SUCCESS) {
  28903. WOLFSSL_MSG("SetECKeyInternal failed");
  28904. return WOLFSSL_FATAL_ERROR;
  28905. }
  28906. }
  28907. len = (word32)outlen;
  28908. if (wc_ecc_shared_secret_ssh((ecc_key*)ecdh->internal,
  28909. (ecc_point*)pub_key->internal,
  28910. (byte *)out, &len) != MP_OKAY) {
  28911. WOLFSSL_MSG("wc_ecc_shared_secret failed");
  28912. return WOLFSSL_FATAL_ERROR;
  28913. }
  28914. return len;
  28915. }
  28916. /* End ECDH */
  28917. #if !defined(NO_FILESYSTEM)
  28918. /* return code compliant with OpenSSL :
  28919. * 1 if success, 0 if error
  28920. */
  28921. #ifndef NO_WOLFSSL_STUB
  28922. int wolfSSL_PEM_write_EC_PUBKEY(XFILE fp, WOLFSSL_EC_KEY *x)
  28923. {
  28924. (void)fp;
  28925. (void)x;
  28926. WOLFSSL_STUB("PEM_write_EC_PUBKEY");
  28927. WOLFSSL_MSG("wolfSSL_PEM_write_EC_PUBKEY not implemented");
  28928. return WOLFSSL_FAILURE;
  28929. }
  28930. #endif
  28931. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  28932. * the results to be an EC key.
  28933. *
  28934. * bio structure to read EC private key from
  28935. * ec if not null is then set to the result
  28936. * cb password callback for reading PEM
  28937. * pass password string
  28938. *
  28939. * returns a pointer to a new WOLFSSL_EC_KEY struct on success and NULL on fail
  28940. */
  28941. WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_EC_PUBKEY(WOLFSSL_BIO* bio,
  28942. WOLFSSL_EC_KEY** ec,
  28943. pem_password_cb* cb, void *pass)
  28944. {
  28945. WOLFSSL_EVP_PKEY* pkey;
  28946. WOLFSSL_EC_KEY* local;
  28947. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_EC_PUBKEY");
  28948. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  28949. if (pkey == NULL) {
  28950. return NULL;
  28951. }
  28952. /* Since the WOLFSSL_EC_KEY structure is being taken from WOLFSSL_EVP_PKEY the
  28953. * flag indicating that the WOLFSSL_EC_KEY structure is owned should be FALSE
  28954. * to avoid having it free'd */
  28955. pkey->ownEcc = 0;
  28956. local = pkey->ecc;
  28957. if (ec != NULL) {
  28958. *ec = local;
  28959. }
  28960. wolfSSL_EVP_PKEY_free(pkey);
  28961. return local;
  28962. }
  28963. /* Reads a private EC key from a WOLFSSL_BIO into a WOLFSSL_EC_KEY.
  28964. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  28965. */
  28966. WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_ECPrivateKey(WOLFSSL_BIO* bio,
  28967. WOLFSSL_EC_KEY** ec,
  28968. pem_password_cb* cb,
  28969. void *pass)
  28970. {
  28971. WOLFSSL_EVP_PKEY* pkey;
  28972. WOLFSSL_EC_KEY* local;
  28973. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_ECPrivateKey");
  28974. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  28975. if (pkey == NULL) {
  28976. return NULL;
  28977. }
  28978. /* Since the WOLFSSL_EC_KEY structure is being taken from WOLFSSL_EVP_PKEY the
  28979. * flag indicating that the WOLFSSL_EC_KEY structure is owned should be FALSE
  28980. * to avoid having it free'd */
  28981. pkey->ownEcc = 0;
  28982. local = pkey->ecc;
  28983. if (ec != NULL) {
  28984. *ec = local;
  28985. }
  28986. wolfSSL_EVP_PKEY_free(pkey);
  28987. return local;
  28988. }
  28989. #endif /* NO_FILESYSTEM */
  28990. #if defined(WOLFSSL_KEY_GEN)
  28991. /* Takes a public WOLFSSL_EC_KEY and writes it out to WOLFSSL_BIO
  28992. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  28993. */
  28994. int wolfSSL_PEM_write_bio_EC_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec)
  28995. {
  28996. int ret = 0, der_max_len = 0, derSz = 0;
  28997. byte *derBuf;
  28998. WOLFSSL_EVP_PKEY* pkey;
  28999. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_EC_PUBKEY");
  29000. if (bio == NULL || ec == NULL) {
  29001. WOLFSSL_MSG("Bad Function Arguments");
  29002. return WOLFSSL_FAILURE;
  29003. }
  29004. /* Initialize pkey structure */
  29005. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  29006. if (pkey == NULL) {
  29007. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  29008. return WOLFSSL_FAILURE;
  29009. }
  29010. /* Set pkey info */
  29011. pkey->ecc = ec;
  29012. pkey->ownEcc = 0; /* pkey does not own ECC */
  29013. pkey->type = EVP_PKEY_EC;
  29014. /* 4 > size of pub, priv + ASN.1 additional information */
  29015. der_max_len = 4 * wc_ecc_size((ecc_key*)ec->internal) + AES_BLOCK_SIZE;
  29016. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29017. if (derBuf == NULL) {
  29018. WOLFSSL_MSG("Malloc failed");
  29019. wolfSSL_EVP_PKEY_free(pkey);
  29020. return WOLFSSL_FAILURE;
  29021. }
  29022. /* convert key to der format */
  29023. derSz = wc_EccPublicKeyToDer((ecc_key*)ec->internal, derBuf, der_max_len, 1);
  29024. if (derSz < 0) {
  29025. WOLFSSL_MSG("wc_EccPublicKeyToDer failed");
  29026. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29027. wolfSSL_EVP_PKEY_free(pkey);
  29028. return WOLFSSL_FAILURE;
  29029. }
  29030. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29031. if (pkey->pkey.ptr == NULL) {
  29032. WOLFSSL_MSG("key malloc failed");
  29033. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29034. wolfSSL_EVP_PKEY_free(pkey);
  29035. return WOLFSSL_FAILURE;
  29036. }
  29037. /* add der info to the evp key */
  29038. pkey->pkey_sz = derSz;
  29039. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  29040. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29041. if((ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey)) != WOLFSSL_SUCCESS){
  29042. WOLFSSL_MSG("wolfSSL_PEM_write_bio_PUBKEY failed");
  29043. }
  29044. wolfSSL_EVP_PKEY_free(pkey);
  29045. return ret;
  29046. }
  29047. /* return code compliant with OpenSSL :
  29048. * 1 if success, 0 if error
  29049. */
  29050. int wolfSSL_PEM_write_bio_ECPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec,
  29051. const EVP_CIPHER* cipher,
  29052. unsigned char* passwd, int len,
  29053. pem_password_cb* cb, void* arg)
  29054. {
  29055. int ret = 0, der_max_len = 0, derSz = 0;
  29056. byte *derBuf;
  29057. WOLFSSL_EVP_PKEY* pkey;
  29058. WOLFSSL_ENTER("WOLFSSL_PEM_write_bio_ECPrivateKey");
  29059. if (bio == NULL || ec == NULL) {
  29060. WOLFSSL_MSG("Bad Function Arguments");
  29061. return WOLFSSL_FAILURE;
  29062. }
  29063. /* Initialize pkey structure */
  29064. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  29065. if (pkey == NULL) {
  29066. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  29067. return WOLFSSL_FAILURE;
  29068. }
  29069. /* Set pkey info */
  29070. pkey->ecc = ec;
  29071. pkey->ownEcc = 0; /* pkey does not own ECC */
  29072. pkey->type = EVP_PKEY_EC;
  29073. /* 4 > size of pub, priv + ASN.1 additional informations
  29074. */
  29075. der_max_len = 4 * wc_ecc_size((ecc_key*)ec->internal) + AES_BLOCK_SIZE;
  29076. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29077. if (derBuf == NULL) {
  29078. WOLFSSL_MSG("Malloc failed");
  29079. wolfSSL_EVP_PKEY_free(pkey);
  29080. return WOLFSSL_FAILURE;
  29081. }
  29082. /* convert key to der format */
  29083. derSz = wc_EccKeyToDer((ecc_key*)ec->internal, derBuf, der_max_len);
  29084. if (derSz < 0) {
  29085. WOLFSSL_MSG("wc_EccKeyToDer failed");
  29086. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29087. wolfSSL_EVP_PKEY_free(pkey);
  29088. return WOLFSSL_FAILURE;
  29089. }
  29090. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29091. if (pkey->pkey.ptr == NULL) {
  29092. WOLFSSL_MSG("key malloc failed");
  29093. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29094. wolfSSL_EVP_PKEY_free(pkey);
  29095. return WOLFSSL_FAILURE;
  29096. }
  29097. /* add der info to the evp key */
  29098. pkey->pkey_sz = derSz;
  29099. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  29100. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29101. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  29102. cb, arg);
  29103. wolfSSL_EVP_PKEY_free(pkey);
  29104. return ret;
  29105. }
  29106. /* return code compliant with OpenSSL :
  29107. * 1 if success, 0 if error
  29108. */
  29109. int wolfSSL_PEM_write_mem_ECPrivateKey(WOLFSSL_EC_KEY* ecc,
  29110. const EVP_CIPHER* cipher,
  29111. unsigned char* passwd, int passwdSz,
  29112. unsigned char **pem, int *plen)
  29113. {
  29114. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  29115. byte *derBuf, *tmp, *cipherInfo = NULL;
  29116. int der_max_len = 0, derSz = 0;
  29117. const int type = ECC_PRIVATEKEY_TYPE;
  29118. const char* header = NULL;
  29119. const char* footer = NULL;
  29120. WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey");
  29121. if (pem == NULL || plen == NULL || ecc == NULL || ecc->internal == NULL) {
  29122. WOLFSSL_MSG("Bad function arguments");
  29123. return WOLFSSL_FAILURE;
  29124. }
  29125. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  29126. return WOLFSSL_FAILURE;
  29127. if (ecc->inSet == 0) {
  29128. WOLFSSL_MSG("No ECC internal set, do it");
  29129. if (SetECKeyInternal(ecc) != WOLFSSL_SUCCESS) {
  29130. WOLFSSL_MSG("SetECKeyInternal failed");
  29131. return WOLFSSL_FAILURE;
  29132. }
  29133. }
  29134. /* 4 > size of pub, priv + ASN.1 additional information */
  29135. der_max_len = 4 * wc_ecc_size((ecc_key*)ecc->internal) + AES_BLOCK_SIZE;
  29136. derBuf = (byte*)XMALLOC(der_max_len, NULL, DYNAMIC_TYPE_DER);
  29137. if (derBuf == NULL) {
  29138. WOLFSSL_MSG("malloc failed");
  29139. return WOLFSSL_FAILURE;
  29140. }
  29141. /* Key to DER */
  29142. derSz = wc_EccKeyToDer((ecc_key*)ecc->internal, derBuf, der_max_len);
  29143. if (derSz < 0) {
  29144. WOLFSSL_MSG("wc_EccKeyToDer failed");
  29145. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29146. return WOLFSSL_FAILURE;
  29147. }
  29148. /* encrypt DER buffer if required */
  29149. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  29150. int ret;
  29151. ret = EncryptDerKey(derBuf, &derSz, cipher,
  29152. passwd, passwdSz, &cipherInfo, der_max_len);
  29153. if (ret != WOLFSSL_SUCCESS) {
  29154. WOLFSSL_MSG("EncryptDerKey failed");
  29155. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29156. return ret;
  29157. }
  29158. /* tmp buffer with a max size */
  29159. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  29160. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  29161. }
  29162. else { /* tmp buffer with a max size */
  29163. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  29164. (int)XSTRLEN(footer) + 1;
  29165. }
  29166. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  29167. if (tmp == NULL) {
  29168. WOLFSSL_MSG("malloc failed");
  29169. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29170. if (cipherInfo != NULL)
  29171. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29172. return WOLFSSL_FAILURE;
  29173. }
  29174. /* DER to PEM */
  29175. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  29176. if (*plen <= 0) {
  29177. WOLFSSL_MSG("wc_DerToPemEx failed");
  29178. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29179. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29180. if (cipherInfo != NULL)
  29181. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29182. return WOLFSSL_FAILURE;
  29183. }
  29184. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29185. if (cipherInfo != NULL)
  29186. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29187. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  29188. if (*pem == NULL) {
  29189. WOLFSSL_MSG("malloc failed");
  29190. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29191. return WOLFSSL_FAILURE;
  29192. }
  29193. XMEMSET(*pem, 0, (*plen)+1);
  29194. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  29195. WOLFSSL_MSG("XMEMCPY failed");
  29196. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  29197. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29198. return WOLFSSL_FAILURE;
  29199. }
  29200. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29201. return WOLFSSL_SUCCESS;
  29202. #else
  29203. (void)ecc;
  29204. (void)cipher;
  29205. (void)passwd;
  29206. (void)passwdSz;
  29207. (void)pem;
  29208. (void)plen;
  29209. return WOLFSSL_FAILURE;
  29210. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  29211. }
  29212. #ifndef NO_FILESYSTEM
  29213. /* return code compliant with OpenSSL :
  29214. * 1 if success, 0 if error
  29215. */
  29216. int wolfSSL_PEM_write_ECPrivateKey(XFILE fp, WOLFSSL_EC_KEY *ecc,
  29217. const EVP_CIPHER *enc,
  29218. unsigned char *kstr, int klen,
  29219. pem_password_cb *cb, void *u)
  29220. {
  29221. byte *pem;
  29222. int plen, ret;
  29223. (void)cb;
  29224. (void)u;
  29225. WOLFSSL_MSG("wolfSSL_PEM_write_ECPrivateKey");
  29226. if (fp == XBADFILE || ecc == NULL || ecc->internal == NULL) {
  29227. WOLFSSL_MSG("Bad function arguments");
  29228. return WOLFSSL_FAILURE;
  29229. }
  29230. ret = wolfSSL_PEM_write_mem_ECPrivateKey(ecc, enc, kstr, klen, &pem, &plen);
  29231. if (ret != WOLFSSL_SUCCESS) {
  29232. WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey failed");
  29233. return WOLFSSL_FAILURE;
  29234. }
  29235. ret = (int)XFWRITE(pem, plen, 1, fp);
  29236. if (ret != 1) {
  29237. WOLFSSL_MSG("ECC private key file write failed");
  29238. return WOLFSSL_FAILURE;
  29239. }
  29240. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  29241. return WOLFSSL_SUCCESS;
  29242. }
  29243. #endif /* NO_FILESYSTEM */
  29244. #endif /* defined(WOLFSSL_KEY_GEN) */
  29245. #endif /* HAVE_ECC */
  29246. #ifndef NO_DSA
  29247. #if defined(WOLFSSL_KEY_GEN)
  29248. /* Takes a DSA Privatekey and writes it out to a WOLFSSL_BIO
  29249. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  29250. */
  29251. int wolfSSL_PEM_write_bio_DSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa,
  29252. const EVP_CIPHER* cipher,
  29253. unsigned char* passwd, int len,
  29254. pem_password_cb* cb, void* arg)
  29255. {
  29256. int ret = 0, der_max_len = 0, derSz = 0;
  29257. byte *derBuf;
  29258. WOLFSSL_EVP_PKEY* pkey;
  29259. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSAPrivateKey");
  29260. if (bio == NULL || dsa == NULL) {
  29261. WOLFSSL_MSG("Bad Function Arguments");
  29262. return WOLFSSL_FAILURE;
  29263. }
  29264. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  29265. if (pkey == NULL) {
  29266. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  29267. return WOLFSSL_FAILURE;
  29268. }
  29269. pkey->type = EVP_PKEY_DSA;
  29270. pkey->dsa = dsa;
  29271. pkey->ownDsa = 0;
  29272. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  29273. der_max_len = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  29274. derBuf = (byte*)XMALLOC(der_max_len, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29275. if (derBuf == NULL) {
  29276. WOLFSSL_MSG("Malloc failed");
  29277. wolfSSL_EVP_PKEY_free(pkey);
  29278. return WOLFSSL_FAILURE;
  29279. }
  29280. /* convert key to der format */
  29281. derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, der_max_len);
  29282. if (derSz < 0) {
  29283. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  29284. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29285. wolfSSL_EVP_PKEY_free(pkey);
  29286. return WOLFSSL_FAILURE;
  29287. }
  29288. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29289. if (pkey->pkey.ptr == NULL) {
  29290. WOLFSSL_MSG("key malloc failed");
  29291. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29292. wolfSSL_EVP_PKEY_free(pkey);
  29293. return WOLFSSL_FAILURE;
  29294. }
  29295. /* add der info to the evp key */
  29296. pkey->pkey_sz = derSz;
  29297. XMEMCPY(pkey->pkey.ptr, derBuf, derSz);
  29298. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  29299. ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len,
  29300. cb, arg);
  29301. wolfSSL_EVP_PKEY_free(pkey);
  29302. return ret;
  29303. }
  29304. #ifndef HAVE_SELFTEST
  29305. /* Takes a DSA public key and writes it out to a WOLFSSL_BIO
  29306. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  29307. */
  29308. int wolfSSL_PEM_write_bio_DSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa)
  29309. {
  29310. int ret = 0, derMax = 0, derSz = 0;
  29311. byte *derBuf;
  29312. WOLFSSL_EVP_PKEY* pkey;
  29313. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSA_PUBKEY");
  29314. if (bio == NULL || dsa == NULL) {
  29315. WOLFSSL_MSG("Bad function arguements");
  29316. return WOLFSSL_FAILURE;
  29317. }
  29318. pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap);
  29319. if (pkey == NULL) {
  29320. WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed");
  29321. return WOLFSSL_FAILURE;
  29322. }
  29323. pkey->type = EVP_PKEY_DSA;
  29324. pkey->dsa = dsa;
  29325. pkey->ownDsa = 0;
  29326. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  29327. derMax = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  29328. derBuf = (byte*)XMALLOC(derMax, bio->heap, DYNAMIC_TYPE_DER);
  29329. if (derBuf == NULL) {
  29330. WOLFSSL_MSG("malloc failed");
  29331. wolfSSL_EVP_PKEY_free(pkey);
  29332. return WOLFSSL_FAILURE;
  29333. }
  29334. /* Key to DER */
  29335. derSz = wc_DsaKeyToPublicDer((DsaKey*)dsa->internal, derBuf, derMax);
  29336. if (derSz < 0) {
  29337. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  29338. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  29339. wolfSSL_EVP_PKEY_free(pkey);
  29340. return WOLFSSL_FAILURE;
  29341. }
  29342. pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap, DYNAMIC_TYPE_DER);
  29343. if (pkey->pkey.ptr == NULL) {
  29344. WOLFSSL_MSG("key malloc failed");
  29345. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  29346. wolfSSL_EVP_PKEY_free(pkey);
  29347. return WOLFSSL_FAILURE;
  29348. }
  29349. pkey->pkey_sz = derSz;
  29350. XMEMSET(pkey->pkey.ptr, 0, derSz);
  29351. if (XMEMCPY(pkey->pkey.ptr, derBuf, derSz) == NULL) {
  29352. WOLFSSL_MSG("XMEMCPY failed");
  29353. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  29354. XFREE(pkey->pkey.ptr, bio->heap, DYNAMIC_TYPE_DER);
  29355. wolfSSL_EVP_PKEY_free(pkey);
  29356. return WOLFSSL_FAILURE;
  29357. }
  29358. XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER);
  29359. ret = wolfSSL_PEM_write_bio_PUBKEY(bio, pkey);
  29360. wolfSSL_EVP_PKEY_free(pkey);
  29361. return ret;
  29362. }
  29363. #endif /* HAVE_SELFTEST */
  29364. /* return code compliant with OpenSSL :
  29365. * 1 if success, 0 if error
  29366. */
  29367. int wolfSSL_PEM_write_mem_DSAPrivateKey(WOLFSSL_DSA* dsa,
  29368. const EVP_CIPHER* cipher,
  29369. unsigned char* passwd, int passwdSz,
  29370. unsigned char **pem, int *plen)
  29371. {
  29372. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  29373. byte *derBuf, *tmp, *cipherInfo = NULL;
  29374. int der_max_len = 0, derSz = 0;
  29375. const int type = DSA_PRIVATEKEY_TYPE;
  29376. const char* header = NULL;
  29377. const char* footer = NULL;
  29378. WOLFSSL_MSG("wolfSSL_PEM_write_mem_DSAPrivateKey");
  29379. if (pem == NULL || plen == NULL || dsa == NULL || dsa->internal == NULL) {
  29380. WOLFSSL_MSG("Bad function arguments");
  29381. return WOLFSSL_FAILURE;
  29382. }
  29383. if (wc_PemGetHeaderFooter(type, &header, &footer) != 0)
  29384. return WOLFSSL_FAILURE;
  29385. if (dsa->inSet == 0) {
  29386. WOLFSSL_MSG("No DSA internal set, do it");
  29387. if (SetDsaInternal(dsa) != WOLFSSL_SUCCESS) {
  29388. WOLFSSL_MSG("SetDsaInternal failed");
  29389. return WOLFSSL_FAILURE;
  29390. }
  29391. }
  29392. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  29393. der_max_len = 4 * wolfSSL_BN_num_bytes(dsa->g) + AES_BLOCK_SIZE;
  29394. derBuf = (byte*)XMALLOC(der_max_len, NULL, DYNAMIC_TYPE_DER);
  29395. if (derBuf == NULL) {
  29396. WOLFSSL_MSG("malloc failed");
  29397. return WOLFSSL_FAILURE;
  29398. }
  29399. /* Key to DER */
  29400. derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, der_max_len);
  29401. if (derSz < 0) {
  29402. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  29403. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29404. return WOLFSSL_FAILURE;
  29405. }
  29406. /* encrypt DER buffer if required */
  29407. if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
  29408. int ret;
  29409. ret = EncryptDerKey(derBuf, &derSz, cipher,
  29410. passwd, passwdSz, &cipherInfo, der_max_len);
  29411. if (ret != WOLFSSL_SUCCESS) {
  29412. WOLFSSL_MSG("EncryptDerKey failed");
  29413. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29414. return ret;
  29415. }
  29416. /* tmp buffer with a max size */
  29417. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  29418. (int)XSTRLEN(footer) + 1 + HEADER_ENCRYPTED_KEY_SIZE;
  29419. }
  29420. else { /* tmp buffer with a max size */
  29421. *plen = (derSz * 2) + (int)XSTRLEN(header) + 1 +
  29422. (int)XSTRLEN(footer) + 1;
  29423. }
  29424. tmp = (byte*)XMALLOC(*plen, NULL, DYNAMIC_TYPE_PEM);
  29425. if (tmp == NULL) {
  29426. WOLFSSL_MSG("malloc failed");
  29427. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29428. if (cipherInfo != NULL)
  29429. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29430. return WOLFSSL_FAILURE;
  29431. }
  29432. /* DER to PEM */
  29433. *plen = wc_DerToPemEx(derBuf, derSz, tmp, *plen, cipherInfo, type);
  29434. if (*plen <= 0) {
  29435. WOLFSSL_MSG("wc_DerToPemEx failed");
  29436. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29437. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29438. if (cipherInfo != NULL)
  29439. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29440. return WOLFSSL_FAILURE;
  29441. }
  29442. XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
  29443. if (cipherInfo != NULL)
  29444. XFREE(cipherInfo, NULL, DYNAMIC_TYPE_STRING);
  29445. *pem = (byte*)XMALLOC((*plen)+1, NULL, DYNAMIC_TYPE_KEY);
  29446. if (*pem == NULL) {
  29447. WOLFSSL_MSG("malloc failed");
  29448. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29449. return WOLFSSL_FAILURE;
  29450. }
  29451. XMEMSET(*pem, 0, (*plen)+1);
  29452. if (XMEMCPY(*pem, tmp, *plen) == NULL) {
  29453. WOLFSSL_MSG("XMEMCPY failed");
  29454. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  29455. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29456. return WOLFSSL_FAILURE;
  29457. }
  29458. XFREE(tmp, NULL, DYNAMIC_TYPE_PEM);
  29459. return WOLFSSL_SUCCESS;
  29460. #else
  29461. (void)dsa;
  29462. (void)cipher;
  29463. (void)passwd;
  29464. (void)passwdSz;
  29465. (void)pem;
  29466. (void)plen;
  29467. return WOLFSSL_FAILURE;
  29468. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  29469. }
  29470. #ifndef NO_FILESYSTEM
  29471. /* return code compliant with OpenSSL :
  29472. * 1 if success, 0 if error
  29473. */
  29474. int wolfSSL_PEM_write_DSAPrivateKey(XFILE fp, WOLFSSL_DSA *dsa,
  29475. const EVP_CIPHER *enc,
  29476. unsigned char *kstr, int klen,
  29477. pem_password_cb *cb, void *u)
  29478. {
  29479. byte *pem;
  29480. int plen, ret;
  29481. (void)cb;
  29482. (void)u;
  29483. WOLFSSL_MSG("wolfSSL_PEM_write_DSAPrivateKey");
  29484. if (fp == XBADFILE || dsa == NULL || dsa->internal == NULL) {
  29485. WOLFSSL_MSG("Bad function arguments");
  29486. return WOLFSSL_FAILURE;
  29487. }
  29488. ret = wolfSSL_PEM_write_mem_DSAPrivateKey(dsa, enc, kstr, klen, &pem, &plen);
  29489. if (ret != WOLFSSL_SUCCESS) {
  29490. WOLFSSL_MSG("wolfSSL_PEM_write_mem_DSAPrivateKey failed");
  29491. return WOLFSSL_FAILURE;
  29492. }
  29493. ret = (int)XFWRITE(pem, plen, 1, fp);
  29494. if (ret != 1) {
  29495. WOLFSSL_MSG("DSA private key file write failed");
  29496. return WOLFSSL_FAILURE;
  29497. }
  29498. XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
  29499. return WOLFSSL_SUCCESS;
  29500. }
  29501. #endif /* NO_FILESYSTEM */
  29502. #endif /* defined(WOLFSSL_KEY_GEN) */
  29503. #ifndef NO_FILESYSTEM
  29504. /* return code compliant with OpenSSL :
  29505. * 1 if success, 0 if error
  29506. */
  29507. #ifndef NO_WOLFSSL_STUB
  29508. int wolfSSL_PEM_write_DSA_PUBKEY(XFILE fp, WOLFSSL_DSA *x)
  29509. {
  29510. (void)fp;
  29511. (void)x;
  29512. WOLFSSL_STUB("PEM_write_DSA_PUBKEY");
  29513. WOLFSSL_MSG("wolfSSL_PEM_write_DSA_PUBKEY not implemented");
  29514. return WOLFSSL_FAILURE;
  29515. }
  29516. #endif
  29517. #endif /* NO_FILESYSTEM */
  29518. #endif /* #ifndef NO_DSA */
  29519. static int pem_read_bio_key(WOLFSSL_BIO* bio, pem_password_cb* cb, void* pass,
  29520. int keyType, int* eccFlag, DerBuffer** der)
  29521. {
  29522. #ifdef WOLFSSL_SMALL_STACK
  29523. EncryptedInfo* info = NULL;
  29524. #else
  29525. EncryptedInfo info[1];
  29526. #endif /* WOLFSSL_SMALL_STACK */
  29527. pem_password_cb* localCb = NULL;
  29528. char* mem = NULL;
  29529. int memSz = 0;
  29530. int ret;
  29531. if(cb) {
  29532. localCb = cb;
  29533. } else {
  29534. if(pass) {
  29535. localCb = wolfSSL_PEM_def_callback;
  29536. }
  29537. }
  29538. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  29539. memSz = ret;
  29540. mem = (char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29541. if (mem == NULL) {
  29542. WOLFSSL_MSG("Memory error");
  29543. ret = MEMORY_E;
  29544. }
  29545. if (ret >= 0) {
  29546. if ((ret = wolfSSL_BIO_read(bio, mem, memSz)) <= 0) {
  29547. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29548. mem = NULL;
  29549. ret = MEMORY_E;
  29550. }
  29551. }
  29552. }
  29553. else if (bio->type == WOLFSSL_BIO_FILE) {
  29554. int sz = 100; /* read from file by 100 byte chunks */
  29555. int idx = 0;
  29556. char* tmp = (char*)XMALLOC(sz, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29557. memSz = 0;
  29558. if (tmp == NULL) {
  29559. WOLFSSL_MSG("Memory error");
  29560. ret = MEMORY_E;
  29561. }
  29562. while (ret >= 0 && (sz = wolfSSL_BIO_read(bio, tmp, sz)) > 0) {
  29563. char* newMem;
  29564. if (memSz + sz < 0) {
  29565. /* sanity check */
  29566. break;
  29567. }
  29568. newMem = (char*)XREALLOC(mem, memSz + sz, bio->heap,
  29569. DYNAMIC_TYPE_OPENSSL);
  29570. if (newMem == NULL) {
  29571. WOLFSSL_MSG("Memory error");
  29572. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29573. mem = NULL;
  29574. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29575. tmp = NULL;
  29576. ret = MEMORY_E;
  29577. break;
  29578. }
  29579. mem = newMem;
  29580. XMEMCPY(mem + idx, tmp, sz);
  29581. memSz += sz;
  29582. idx += sz;
  29583. sz = 100; /* read another 100 byte chunk from file */
  29584. }
  29585. XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29586. tmp = NULL;
  29587. if (memSz <= 0) {
  29588. WOLFSSL_MSG("No data to read from bio");
  29589. if (mem != NULL) {
  29590. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29591. mem = NULL;
  29592. }
  29593. ret = BUFFER_E;
  29594. }
  29595. }
  29596. else {
  29597. WOLFSSL_MSG("No data to read from bio");
  29598. ret = NOT_COMPILED_IN;
  29599. }
  29600. #ifdef WOLFSSL_SMALL_STACK
  29601. if (ret >= 0) {
  29602. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  29603. DYNAMIC_TYPE_TMP_BUFFER);
  29604. if (info == NULL) {
  29605. WOLFSSL_MSG("Error getting memory for EncryptedInfo structure");
  29606. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29607. mem = NULL;
  29608. ret = MEMORY_E;
  29609. }
  29610. }
  29611. #endif
  29612. if (ret >= 0) {
  29613. XMEMSET(info, 0, sizeof(EncryptedInfo));
  29614. info->passwd_cb = localCb;
  29615. info->passwd_userdata = pass;
  29616. ret = PemToDer((const unsigned char*)mem, memSz, keyType, der,
  29617. NULL, info, eccFlag);
  29618. if (ret < 0) {
  29619. WOLFSSL_MSG("Bad Pem To Der");
  29620. }
  29621. else {
  29622. /* write left over data back to bio */
  29623. if ((memSz - (int)info->consumed) > 0 &&
  29624. bio->type != WOLFSSL_BIO_FILE) {
  29625. if (wolfSSL_BIO_write(bio, mem + (int)info->consumed,
  29626. memSz - (int)info->consumed) <= 0) {
  29627. WOLFSSL_MSG("Unable to advance bio read pointer");
  29628. }
  29629. }
  29630. }
  29631. }
  29632. #ifdef WOLFSSL_SMALL_STACK
  29633. XFREE(info, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29634. #endif
  29635. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  29636. return ret;
  29637. }
  29638. WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio,
  29639. WOLFSSL_EVP_PKEY** key,
  29640. pem_password_cb* cb,
  29641. void* pass)
  29642. {
  29643. WOLFSSL_EVP_PKEY* pkey = NULL;
  29644. DerBuffer* der = NULL;
  29645. int keyFormat = 0;
  29646. int type = -1;
  29647. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey");
  29648. if (bio == NULL)
  29649. return pkey;
  29650. if (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE, &keyFormat,
  29651. &der) >= 0) {
  29652. const unsigned char* ptr = der->buffer;
  29653. if (keyFormat) {
  29654. /* keyFormat is Key_Sum enum */
  29655. if (keyFormat == RSAk)
  29656. type = EVP_PKEY_RSA;
  29657. else if (keyFormat == ECDSAk)
  29658. type = EVP_PKEY_EC;
  29659. else if (keyFormat == DSAk)
  29660. type = EVP_PKEY_DSA;
  29661. else if (keyFormat == DHk)
  29662. type = EVP_PKEY_DH;
  29663. }
  29664. else {
  29665. /* Default to RSA if format is not set */
  29666. type = EVP_PKEY_RSA;
  29667. }
  29668. /* handle case where reuse is attempted */
  29669. if (key != NULL && *key != NULL)
  29670. pkey = *key;
  29671. wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length);
  29672. if (pkey == NULL) {
  29673. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  29674. }
  29675. }
  29676. FreeDer(&der);
  29677. if (key != NULL && pkey != NULL)
  29678. *key = pkey;
  29679. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", 0);
  29680. return pkey;
  29681. }
  29682. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio,
  29683. WOLFSSL_EVP_PKEY **key,
  29684. pem_password_cb *cb, void *pass)
  29685. {
  29686. WOLFSSL_EVP_PKEY* pkey = NULL;
  29687. DerBuffer* der = NULL;
  29688. int keyFormat = 0;
  29689. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY");
  29690. if (bio == NULL)
  29691. return pkey;
  29692. if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der) >= 0) {
  29693. const unsigned char* ptr = der->buffer;
  29694. /* handle case where reuse is attempted */
  29695. if (key != NULL && *key != NULL)
  29696. pkey = *key;
  29697. wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length);
  29698. if (pkey == NULL) {
  29699. WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY");
  29700. }
  29701. }
  29702. FreeDer(&der);
  29703. if (key != NULL && pkey != NULL)
  29704. *key = pkey;
  29705. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0);
  29706. return pkey;
  29707. }
  29708. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
  29709. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  29710. * the results to be an RSA key.
  29711. *
  29712. * bio structure to read RSA private key from
  29713. * rsa if not null is then set to the result
  29714. * cb password callback for reading PEM
  29715. * pass password string
  29716. *
  29717. * returns a pointer to a new WOLFSSL_RSA structure on success and NULL on fail
  29718. */
  29719. WOLFSSL_RSA* wolfSSL_PEM_read_bio_RSAPrivateKey(WOLFSSL_BIO* bio,
  29720. WOLFSSL_RSA** rsa, pem_password_cb* cb, void* pass)
  29721. {
  29722. WOLFSSL_EVP_PKEY* pkey;
  29723. WOLFSSL_RSA* local;
  29724. WOLFSSL_ENTER("PEM_read_bio_RSAPrivateKey");
  29725. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  29726. if (pkey == NULL) {
  29727. return NULL;
  29728. }
  29729. /* Since the WOLFSSL_RSA structure is being taken from WOLFSSL_EVP_PEKY the
  29730. * flag indicating that the WOLFSSL_RSA structure is owned should be FALSE
  29731. * to avoid having it free'd */
  29732. pkey->ownRsa = 0;
  29733. local = pkey->rsa;
  29734. if (rsa != NULL) {
  29735. *rsa = local;
  29736. }
  29737. wolfSSL_EVP_PKEY_free(pkey);
  29738. return local;
  29739. }
  29740. #endif /* OPENSSL_EXTRA || OPENSSL_ALL || !NO_RSA */
  29741. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && (!defined(NO_CERTS) && \
  29742. !defined(NO_FILESYSTEM) && !defined(NO_DSA) && defined(WOLFSSL_KEY_GEN))
  29743. /* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
  29744. * the results to be an DSA key.
  29745. *
  29746. * bio structure to read DSA private key from
  29747. * dsa if not null is then set to the result
  29748. * cb password callback for reading PEM
  29749. * pass password string
  29750. *
  29751. * returns a pointer to a new WOLFSSL_DSA structure on success and NULL on fail
  29752. */
  29753. WOLFSSL_DSA* wolfSSL_PEM_read_bio_DSAPrivateKey(WOLFSSL_BIO* bio,
  29754. WOLFSSL_DSA** dsa,
  29755. pem_password_cb* cb,void *pass)
  29756. {
  29757. WOLFSSL_EVP_PKEY* pkey = NULL;
  29758. WOLFSSL_DSA* local;
  29759. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSAPrivateKey");
  29760. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  29761. if (pkey == NULL) {
  29762. WOLFSSL_MSG("Error in PEM_read_bio_PrivateKey");
  29763. return NULL;
  29764. }
  29765. /* Since the WOLFSSL_DSA structure is being taken from WOLFSSL_EVP_PKEY the
  29766. * flag indicating that the WOLFSSL_DSA structure is owned should be FALSE
  29767. * to avoid having it free'd */
  29768. pkey->ownDsa = 0;
  29769. local = pkey->dsa;
  29770. if (dsa != NULL) {
  29771. *dsa = local;
  29772. }
  29773. wolfSSL_EVP_PKEY_free(pkey);
  29774. return local;
  29775. }
  29776. /* Reads an DSA public key from a WOLFSSL_BIO into a WOLFSSL_DSA.
  29777. * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
  29778. */
  29779. WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSA_PUBKEY(WOLFSSL_BIO* bio,WOLFSSL_DSA** dsa,
  29780. pem_password_cb* cb, void *pass)
  29781. {
  29782. WOLFSSL_EVP_PKEY* pkey;
  29783. WOLFSSL_DSA* local;
  29784. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSA_PUBKEY");
  29785. pkey = wolfSSL_PEM_read_bio_PUBKEY(bio, NULL, cb, pass);
  29786. if (pkey == NULL) {
  29787. WOLFSSL_MSG("wolfSSL_PEM_read_bio_PUBKEY failed");
  29788. return NULL;
  29789. }
  29790. /* Since the WOLFSSL_DSA structure is being taken from WOLFSSL_EVP_PKEY the
  29791. * flag indicating that the WOLFSSL_DSA structure is owned should be FALSE
  29792. * to avoid having it free'd */
  29793. pkey->ownDsa = 0;
  29794. local = pkey->dsa;
  29795. if (dsa != NULL) {
  29796. *dsa = local;
  29797. }
  29798. wolfSSL_EVP_PKEY_free(pkey);
  29799. return local;
  29800. }
  29801. #endif
  29802. #ifdef HAVE_ECC
  29803. /* returns a new WOLFSSL_EC_GROUP structure on success and NULL on fail */
  29804. WOLFSSL_EC_GROUP* wolfSSL_PEM_read_bio_ECPKParameters(WOLFSSL_BIO* bio,
  29805. WOLFSSL_EC_GROUP** group, pem_password_cb* cb, void* pass)
  29806. {
  29807. WOLFSSL_EVP_PKEY* pkey;
  29808. WOLFSSL_EC_GROUP* ret = NULL;
  29809. /* check on if bio is null is done in wolfSSL_PEM_read_bio_PrivateKey */
  29810. pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, cb, pass);
  29811. if (pkey != NULL) {
  29812. if (pkey->type != EVP_PKEY_EC) {
  29813. WOLFSSL_MSG("Unexpected key type");
  29814. }
  29815. else {
  29816. ret = (WOLFSSL_EC_GROUP*)wolfSSL_EC_KEY_get0_group(pkey->ecc);
  29817. /* set ecc group to null so it is not free'd when pkey is free'd */
  29818. pkey->ecc->group = NULL;
  29819. }
  29820. }
  29821. (void)group;
  29822. wolfSSL_EVP_PKEY_free(pkey);
  29823. return ret;
  29824. }
  29825. #endif /* HAVE_ECC */
  29826. #if !defined(NO_FILESYSTEM)
  29827. WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, EVP_PKEY **x,
  29828. pem_password_cb *cb, void *u)
  29829. {
  29830. (void)fp;
  29831. (void)x;
  29832. (void)cb;
  29833. (void)u;
  29834. WOLFSSL_MSG("wolfSSL_PEM_read_PUBKEY not implemented");
  29835. return NULL;
  29836. }
  29837. #endif /* NO_FILESYSTEM */
  29838. #ifndef NO_RSA
  29839. #if defined(XSNPRINTF) && !defined(HAVE_FAST_RSA)
  29840. /* snprintf() must be available */
  29841. /******************************************************************************
  29842. * wolfSSL_RSA_print - writes the human readable form of RSA to bio
  29843. *
  29844. * RETURNS:
  29845. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  29846. */
  29847. int wolfSSL_RSA_print(WOLFSSL_BIO* bio, WOLFSSL_RSA* rsa, int offset)
  29848. {
  29849. char tmp[100] = {0};
  29850. word32 idx = 0;
  29851. int sz = 0;
  29852. byte lbit = 0;
  29853. int rawLen = 0;
  29854. byte* rawKey = NULL;
  29855. RsaKey* iRsa = NULL;
  29856. int i = 0;
  29857. mp_int *rsaElem = NULL;
  29858. const char *rsaStr[] = {
  29859. "Modulus:",
  29860. "PublicExponent:",
  29861. "PrivateExponent:",
  29862. "Prime1:",
  29863. "Prime2:",
  29864. "Exponent1:",
  29865. "Exponent2:",
  29866. "Coefficient:"
  29867. };
  29868. WOLFSSL_ENTER("wolfSSL_RSA_print");
  29869. (void)offset;
  29870. if (bio == NULL || rsa == NULL) {
  29871. return WOLFSSL_FATAL_ERROR;
  29872. }
  29873. if ((sz = wolfSSL_RSA_size(rsa)) < 0) {
  29874. WOLFSSL_MSG("Error getting RSA key size");
  29875. return WOLFSSL_FAILURE;
  29876. }
  29877. iRsa = (RsaKey*)rsa->internal;
  29878. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s: (%d bit)",
  29879. "RSA Private-Key", 8 * sz);
  29880. tmp[sizeof(tmp) - 1] = '\0';
  29881. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  29882. return WOLFSSL_FAILURE;
  29883. }
  29884. for (i=0; i<RSA_INTS; i++) {
  29885. switch(i) {
  29886. case 0:
  29887. /* Print out modulus */
  29888. rsaElem = &iRsa->n;
  29889. break;
  29890. case 1:
  29891. rsaElem = &iRsa->e;
  29892. break;
  29893. case 2:
  29894. rsaElem = &iRsa->d;
  29895. break;
  29896. case 3:
  29897. rsaElem = &iRsa->p;
  29898. break;
  29899. case 4:
  29900. rsaElem = &iRsa->q;
  29901. break;
  29902. case 5:
  29903. rsaElem = &iRsa->dP;
  29904. break;
  29905. case 6:
  29906. rsaElem = &iRsa->dQ;
  29907. break;
  29908. case 7:
  29909. rsaElem = &iRsa->u;
  29910. break;
  29911. default:
  29912. WOLFSSL_MSG("Bad index value");
  29913. }
  29914. if (i == 1) {
  29915. /* Print out exponent values */
  29916. rawLen = mp_unsigned_bin_size(rsaElem);
  29917. if (rawLen < 0) {
  29918. WOLFSSL_MSG("Error getting exponent size");
  29919. return WOLFSSL_FAILURE;
  29920. }
  29921. if ((word32)rawLen < sizeof(word32)) {
  29922. rawLen = sizeof(word32);
  29923. }
  29924. rawKey = (byte*)XMALLOC(rawLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29925. if (rawKey == NULL) {
  29926. WOLFSSL_MSG("Memory error");
  29927. return WOLFSSL_FAILURE;
  29928. }
  29929. XMEMSET(rawKey, 0, rawLen);
  29930. mp_to_unsigned_bin(rsaElem, rawKey);
  29931. if ((word32)rawLen <= sizeof(word32)) {
  29932. idx = *(word32*)rawKey;
  29933. #ifdef BIG_ENDIAN_ORDER
  29934. idx = ByteReverseWord32(idx);
  29935. #endif
  29936. }
  29937. XSNPRINTF(tmp, sizeof(tmp) - 1, "\nExponent: %d (0x%x)", idx, idx);
  29938. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  29939. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29940. return WOLFSSL_FAILURE;
  29941. }
  29942. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29943. }
  29944. else {
  29945. XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s\n ", rsaStr[i]);
  29946. tmp[sizeof(tmp) - 1] = '\0';
  29947. if (mp_leading_bit(rsaElem)) {
  29948. lbit = 1;
  29949. XSTRNCAT(tmp, "00", 3);
  29950. }
  29951. rawLen = mp_unsigned_bin_size(rsaElem);
  29952. rawKey = (byte*)XMALLOC(rawLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29953. if (rawKey == NULL) {
  29954. WOLFSSL_MSG("Memory error");
  29955. return WOLFSSL_FAILURE;
  29956. }
  29957. mp_to_unsigned_bin(rsaElem, rawKey);
  29958. for (idx = 0; idx < (word32)rawLen; idx++) {
  29959. char val[5];
  29960. int valSz = 5;
  29961. if ((idx == 0) && !lbit) {
  29962. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  29963. }
  29964. else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
  29965. tmp[sizeof(tmp) - 1] = '\0';
  29966. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  29967. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29968. return WOLFSSL_FAILURE;
  29969. }
  29970. XSNPRINTF(tmp, sizeof(tmp) - 1,
  29971. ":\n ");
  29972. XSNPRINTF(val, valSz - 1, "%02x", rawKey[idx]);
  29973. }
  29974. else {
  29975. XSNPRINTF(val, valSz - 1, ":%02x", rawKey[idx]);
  29976. }
  29977. XSTRNCAT(tmp, val, valSz);
  29978. }
  29979. XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29980. /* print out remaining values */
  29981. if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
  29982. tmp[sizeof(tmp) - 1] = '\0';
  29983. if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
  29984. return WOLFSSL_FAILURE;
  29985. }
  29986. }
  29987. lbit = 0;
  29988. }
  29989. }
  29990. /* done with print out */
  29991. if (wolfSSL_BIO_write(bio, "\n\0", (int)XSTRLEN("\n\0")) <= 0) {
  29992. return WOLFSSL_FAILURE;
  29993. }
  29994. return WOLFSSL_SUCCESS;
  29995. }
  29996. #endif /* XSNPRINTF */
  29997. #if !defined(NO_FILESYSTEM)
  29998. #ifndef NO_WOLFSSL_STUB
  29999. WOLFSSL_RSA *wolfSSL_PEM_read_RSAPublicKey(XFILE fp, WOLFSSL_RSA **x,
  30000. pem_password_cb *cb, void *u)
  30001. {
  30002. (void)fp;
  30003. (void)x;
  30004. (void)cb;
  30005. (void)u;
  30006. WOLFSSL_STUB("PEM_read_RSAPublicKey");
  30007. WOLFSSL_MSG("wolfSSL_PEM_read_RSAPublicKey not implemented");
  30008. return NULL;
  30009. }
  30010. #endif
  30011. /* return code compliant with OpenSSL :
  30012. * 1 if success, 0 if error
  30013. */
  30014. #ifndef NO_WOLFSSL_STUB
  30015. int wolfSSL_PEM_write_RSAPublicKey(XFILE fp, WOLFSSL_RSA *x)
  30016. {
  30017. (void)fp;
  30018. (void)x;
  30019. WOLFSSL_STUB("PEM_write_RSAPublicKey");
  30020. WOLFSSL_MSG("wolfSSL_PEM_write_RSAPublicKey not implemented");
  30021. return WOLFSSL_FAILURE;
  30022. }
  30023. #endif
  30024. /* return code compliant with OpenSSL :
  30025. * 1 if success, 0 if error
  30026. */
  30027. #ifndef NO_WOLFSSL_STUB
  30028. int wolfSSL_PEM_write_RSA_PUBKEY(XFILE fp, WOLFSSL_RSA *x)
  30029. {
  30030. (void)fp;
  30031. (void)x;
  30032. WOLFSSL_STUB("PEM_write_RSA_PUBKEY");
  30033. WOLFSSL_MSG("wolfSSL_PEM_write_RSA_PUBKEY not implemented");
  30034. return WOLFSSL_FAILURE;
  30035. }
  30036. #endif
  30037. #endif /* NO_FILESYSTEM */
  30038. WOLFSSL_RSA *wolfSSL_d2i_RSAPublicKey(WOLFSSL_RSA **r, const unsigned char **pp,
  30039. long len)
  30040. {
  30041. WOLFSSL_RSA *rsa = NULL;
  30042. WOLFSSL_ENTER("d2i_RSAPublicKey");
  30043. if (pp == NULL) {
  30044. WOLFSSL_MSG("Bad argument");
  30045. return NULL;
  30046. }
  30047. if ((rsa = wolfSSL_RSA_new()) == NULL) {
  30048. WOLFSSL_MSG("RSA_new failed");
  30049. return NULL;
  30050. }
  30051. if (wolfSSL_RSA_LoadDer_ex(rsa, *pp, (int)len, WOLFSSL_RSA_LOAD_PUBLIC)
  30052. != WOLFSSL_SUCCESS) {
  30053. WOLFSSL_MSG("RSA_LoadDer failed");
  30054. wolfSSL_RSA_free(rsa);
  30055. rsa = NULL;
  30056. }
  30057. if (r != NULL)
  30058. *r = rsa;
  30059. return rsa;
  30060. }
  30061. /* Converts an RSA private key from DER format to an RSA structure.
  30062. Returns pointer to the RSA structure on success and NULL if error. */
  30063. WOLFSSL_RSA *wolfSSL_d2i_RSAPrivateKey(WOLFSSL_RSA **r,
  30064. const unsigned char **derBuf, long derSz)
  30065. {
  30066. WOLFSSL_RSA *rsa = NULL;
  30067. WOLFSSL_ENTER("wolfSSL_d2i_RSAPrivateKey");
  30068. /* check for bad functions arguments */
  30069. if (derBuf == NULL) {
  30070. WOLFSSL_MSG("Bad argument");
  30071. return NULL;
  30072. }
  30073. if ((rsa = wolfSSL_RSA_new()) == NULL) {
  30074. WOLFSSL_MSG("RSA_new failed");
  30075. return NULL;
  30076. }
  30077. if (wolfSSL_RSA_LoadDer_ex(rsa, *derBuf, (int)derSz,
  30078. WOLFSSL_RSA_LOAD_PRIVATE) != WOLFSSL_SUCCESS) {
  30079. WOLFSSL_MSG("RSA_LoadDer failed");
  30080. wolfSSL_RSA_free(rsa);
  30081. rsa = NULL;
  30082. }
  30083. if (r != NULL)
  30084. *r = rsa;
  30085. return rsa;
  30086. }
  30087. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  30088. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  30089. /* Converts an internal RSA structure to DER format.
  30090. * If "pp" is null then buffer size only is returned.
  30091. * If "*pp" is null then a created buffer is set in *pp and the caller is
  30092. * responsible for free'ing it.
  30093. * Returns size of DER on success and WOLFSSL_FAILURE if error
  30094. */
  30095. int wolfSSL_i2d_RSAPrivateKey(WOLFSSL_RSA *rsa, unsigned char **pp)
  30096. {
  30097. int ret;
  30098. WOLFSSL_ENTER("wolfSSL_i2d_RSAPrivateKey");
  30099. /* check for bad functions arguments */
  30100. if (rsa == NULL) {
  30101. WOLFSSL_MSG("Bad Function Arguments");
  30102. return BAD_FUNC_ARG;
  30103. }
  30104. if ((ret = wolfSSL_RSA_To_Der(rsa, pp, 0)) < 0) {
  30105. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  30106. return WOLFSSL_FAILURE;
  30107. }
  30108. return ret; /* returns size of DER if successful */
  30109. }
  30110. int wolfSSL_i2d_RSAPublicKey(WOLFSSL_RSA *rsa, const unsigned char **pp)
  30111. {
  30112. int ret;
  30113. /* check for bad functions arguments */
  30114. if (rsa == NULL) {
  30115. WOLFSSL_MSG("Bad Function Arguments");
  30116. return BAD_FUNC_ARG;
  30117. }
  30118. if ((ret = wolfSSL_RSA_To_Der(rsa, (byte**)pp, 1)) < 0) {
  30119. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  30120. return WOLFSSL_FAILURE;
  30121. }
  30122. return ret;
  30123. }
  30124. #endif /* !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  30125. * !defined(NO_RSA) && !defined(HAVE_USER_RSA) */
  30126. #endif /* !NO_RSA */
  30127. #endif /* OPENSSL_EXTRA */
  30128. #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  30129. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  30130. int wolfSSL_RSA_LoadDer(WOLFSSL_RSA* rsa, const unsigned char* derBuf, int derSz)
  30131. {
  30132. return wolfSSL_RSA_LoadDer_ex(rsa, derBuf, derSz, WOLFSSL_RSA_LOAD_PRIVATE);
  30133. }
  30134. int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA* rsa, const unsigned char* derBuf,
  30135. int derSz, int opt)
  30136. {
  30137. word32 idx = 0;
  30138. int ret;
  30139. WOLFSSL_ENTER("wolfSSL_RSA_LoadDer");
  30140. if (rsa == NULL || rsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  30141. WOLFSSL_MSG("Bad function arguments");
  30142. return WOLFSSL_FATAL_ERROR;
  30143. }
  30144. if (opt == WOLFSSL_RSA_LOAD_PRIVATE) {
  30145. ret = wc_RsaPrivateKeyDecode(derBuf, &idx, (RsaKey*)rsa->internal, derSz);
  30146. }
  30147. else {
  30148. ret = wc_RsaPublicKeyDecode(derBuf, &idx, (RsaKey*)rsa->internal, derSz);
  30149. }
  30150. if (ret < 0) {
  30151. if (opt == WOLFSSL_RSA_LOAD_PRIVATE) {
  30152. WOLFSSL_MSG("RsaPrivateKeyDecode failed");
  30153. }
  30154. else {
  30155. WOLFSSL_MSG("RsaPublicKeyDecode failed");
  30156. }
  30157. return SSL_FATAL_ERROR;
  30158. }
  30159. if (SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  30160. WOLFSSL_MSG("SetRsaExternal failed");
  30161. return WOLFSSL_FATAL_ERROR;
  30162. }
  30163. rsa->inSet = 1;
  30164. return WOLFSSL_SUCCESS;
  30165. }
  30166. #if defined(WC_RSA_PSS) && (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \
  30167. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX))
  30168. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  30169. static int hash2mgf(enum wc_HashType hType)
  30170. {
  30171. switch (hType) {
  30172. #ifndef NO_SHA
  30173. case WC_HASH_TYPE_SHA:
  30174. return WC_MGF1SHA1;
  30175. #endif
  30176. #ifndef NO_SHA256
  30177. #ifdef WOLFSSL_SHA224
  30178. case WC_HASH_TYPE_SHA224:
  30179. return WC_MGF1SHA224;
  30180. #endif
  30181. case WC_HASH_TYPE_SHA256:
  30182. return WC_MGF1SHA256;
  30183. #endif
  30184. #ifdef WOLFSSL_SHA384
  30185. case WC_HASH_TYPE_SHA384:
  30186. return WC_MGF1SHA384;
  30187. #endif
  30188. #ifdef WOLFSSL_SHA512
  30189. case WC_HASH_TYPE_SHA512:
  30190. return WC_MGF1SHA512;
  30191. #endif
  30192. case WC_HASH_TYPE_NONE:
  30193. case WC_HASH_TYPE_MD2:
  30194. case WC_HASH_TYPE_MD4:
  30195. case WC_HASH_TYPE_MD5:
  30196. case WC_HASH_TYPE_MD5_SHA:
  30197. case WC_HASH_TYPE_SHA3_224:
  30198. case WC_HASH_TYPE_SHA3_256:
  30199. case WC_HASH_TYPE_SHA3_384:
  30200. case WC_HASH_TYPE_SHA3_512:
  30201. case WC_HASH_TYPE_BLAKE2B:
  30202. case WC_HASH_TYPE_BLAKE2S:
  30203. default:
  30204. WOLFSSL_MSG("Unrecognized or unsupported hash function");
  30205. return WC_MGF1NONE;
  30206. }
  30207. }
  30208. /*
  30209. * +-----------+
  30210. * | M |
  30211. * +-----------+
  30212. * |
  30213. * V
  30214. * Hash
  30215. * |
  30216. * V
  30217. * +--------+----------+----------+
  30218. * M' = |Padding1| mHash | salt |
  30219. * +--------+----------+----------+
  30220. * |
  30221. * +--------+----------+ V
  30222. * DB = |Padding2|maskedseed| Hash
  30223. * +--------+----------+ |
  30224. * | |
  30225. * V | +--+
  30226. * xor <--- MGF <---| |bc|
  30227. * | | +--+
  30228. * | | |
  30229. * V V V
  30230. * +-------------------+----------+--+
  30231. * EM = | maskedDB |maskedseed|bc|
  30232. * +-------------------+----------+--+
  30233. * Diagram taken from https://tools.ietf.org/html/rfc3447#section-9.1
  30234. */
  30235. int wolfSSL_RSA_padding_add_PKCS1_PSS(WOLFSSL_RSA *rsa, unsigned char *EM,
  30236. const unsigned char *mHash,
  30237. const WOLFSSL_EVP_MD *hashAlg, int saltLen)
  30238. {
  30239. int hashLen, emLen, mgf;
  30240. int ret = WOLFSSL_FAILURE;
  30241. int initTmpRng = 0;
  30242. WC_RNG *rng = NULL;
  30243. #ifdef WOLFSSL_SMALL_STACK
  30244. WC_RNG* tmpRNG = NULL;
  30245. #else
  30246. WC_RNG _tmpRNG[1];
  30247. WC_RNG* tmpRNG = _tmpRNG;
  30248. #endif
  30249. enum wc_HashType hashType;
  30250. WOLFSSL_ENTER("wolfSSL_RSA_padding_add_PKCS1_PSS");
  30251. if (!rsa || !EM || !mHash || !hashAlg) {
  30252. return WOLFSSL_FAILURE;
  30253. }
  30254. if (!(rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng))) {
  30255. WOLFSSL_MSG("WOLFSSL_RSA_GetRNG error");
  30256. goto cleanup;
  30257. }
  30258. if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  30259. WOLFSSL_MSG("SetRsaExternal error");
  30260. goto cleanup;
  30261. }
  30262. hashType = wolfSSL_EVP_md2macType(hashAlg);
  30263. if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) {
  30264. WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
  30265. goto cleanup;
  30266. }
  30267. if ((mgf = hash2mgf(hashType)) == WC_MGF1NONE) {
  30268. WOLFSSL_MSG("hash2mgf error");
  30269. goto cleanup;
  30270. }
  30271. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  30272. WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
  30273. goto cleanup;
  30274. }
  30275. if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
  30276. WOLFSSL_MSG("wolfSSL_RSA_size error");
  30277. goto cleanup;
  30278. }
  30279. switch (saltLen) {
  30280. /* Negative saltLen values are treated differently */
  30281. case RSA_PSS_SALTLEN_DIGEST:
  30282. saltLen = hashLen;
  30283. break;
  30284. case RSA_PSS_SALTLEN_MAX_SIGN:
  30285. case RSA_PSS_SALTLEN_MAX:
  30286. saltLen = emLen - hashLen - 2;
  30287. break;
  30288. default:
  30289. if (saltLen < 0) {
  30290. /* Not any currently implemented negative value */
  30291. WOLFSSL_MSG("invalid saltLen");
  30292. goto cleanup;
  30293. }
  30294. }
  30295. if (wc_RsaPad_ex(mHash, hashLen, EM, emLen,
  30296. RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD,
  30297. hashType, mgf, NULL, 0, saltLen,
  30298. wolfSSL_BN_num_bits(rsa->n), NULL) != MP_OKAY) {
  30299. WOLFSSL_MSG("wc_RsaPad_ex error");
  30300. goto cleanup;
  30301. }
  30302. ret = WOLFSSL_SUCCESS;
  30303. cleanup:
  30304. if (initTmpRng)
  30305. wc_FreeRng(tmpRNG);
  30306. #ifdef WOLFSSL_SMALL_STACK
  30307. if (tmpRNG)
  30308. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30309. #endif
  30310. return ret;
  30311. }
  30312. /*
  30313. * Refer to wolfSSL_RSA_padding_add_PKCS1_PSS
  30314. * for an explanation of the parameters.
  30315. */
  30316. int wolfSSL_RSA_verify_PKCS1_PSS(WOLFSSL_RSA *rsa, const unsigned char *mHash,
  30317. const WOLFSSL_EVP_MD *hashAlg,
  30318. const unsigned char *EM, int saltLen)
  30319. {
  30320. int hashLen, mgf, emLen, mPrimeLen;
  30321. enum wc_HashType hashType;
  30322. byte *mPrime = NULL;
  30323. byte *buf = NULL;
  30324. WOLFSSL_ENTER("wolfSSL_RSA_verify_PKCS1_PSS");
  30325. if (!rsa || !mHash || !hashAlg || !EM) {
  30326. return WOLFSSL_FAILURE;
  30327. }
  30328. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  30329. return WOLFSSL_FAILURE;
  30330. }
  30331. if ((emLen = wolfSSL_RSA_size(rsa)) <= 0) {
  30332. WOLFSSL_MSG("wolfSSL_RSA_size error");
  30333. return WOLFSSL_FAILURE;
  30334. }
  30335. switch (saltLen) {
  30336. /* Negative saltLen values are treated differently */
  30337. case RSA_PSS_SALTLEN_DIGEST:
  30338. saltLen = hashLen;
  30339. break;
  30340. case RSA_PSS_SALTLEN_MAX_SIGN:
  30341. case RSA_PSS_SALTLEN_MAX:
  30342. saltLen = emLen - hashLen - 2;
  30343. break;
  30344. default:
  30345. if (saltLen < 0) {
  30346. /* Not any currently implemented negative value */
  30347. WOLFSSL_MSG("invalid saltLen");
  30348. return WOLFSSL_FAILURE;
  30349. }
  30350. }
  30351. if (!rsa->exSet && SetRsaExternal(rsa) != WOLFSSL_SUCCESS) {
  30352. return WOLFSSL_FAILURE;
  30353. }
  30354. hashType = wolfSSL_EVP_md2macType(hashAlg);
  30355. if (hashType < WC_HASH_TYPE_NONE || hashType > WC_HASH_TYPE_MAX) {
  30356. WOLFSSL_MSG("wolfSSL_EVP_md2macType error");
  30357. return WOLFSSL_FAILURE;
  30358. }
  30359. if ((mgf = hash2mgf(hashType)) == WC_MGF1NONE) {
  30360. WOLFSSL_MSG("hash2mgf error");
  30361. return WOLFSSL_FAILURE;
  30362. }
  30363. if ((hashLen = wolfSSL_EVP_MD_size(hashAlg)) < 0) {
  30364. WOLFSSL_MSG("wolfSSL_EVP_MD_size error");
  30365. return WOLFSSL_FAILURE;
  30366. }
  30367. if (!(buf = (byte*)XMALLOC(emLen, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
  30368. WOLFSSL_MSG("malloc error");
  30369. return WOLFSSL_FAILURE;
  30370. }
  30371. XMEMCPY(buf, EM, emLen);
  30372. /* Remove and verify the PSS padding */
  30373. if ((mPrimeLen = wc_RsaUnPad_ex(buf, emLen, &mPrime,
  30374. RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD, hashType,
  30375. mgf, NULL, 0, saltLen,
  30376. wolfSSL_BN_num_bits(rsa->n), NULL)) < 0) {
  30377. WOLFSSL_MSG("wc_RsaPad_ex error");
  30378. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30379. return WOLFSSL_FAILURE;
  30380. }
  30381. /* Verify the hash is correct */
  30382. if (wc_RsaPSS_CheckPadding_ex(mHash, hashLen, mPrime, mPrimeLen, hashType,
  30383. saltLen, wolfSSL_BN_num_bits(rsa->n))
  30384. != MP_OKAY) {
  30385. WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error");
  30386. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30387. return WOLFSSL_FAILURE;
  30388. }
  30389. XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  30390. return WOLFSSL_SUCCESS;
  30391. }
  30392. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  30393. #endif /* WC_RSA_PSS && (OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY
  30394. * || WOLFSSL_NGINX)
  30395. */
  30396. #if defined(OPENSSL_EXTRA)
  30397. WOLFSSL_RSA_METHOD *wolfSSL_RSA_meth_new(const char *name, int flags)
  30398. {
  30399. int name_len;
  30400. WOLFSSL_RSA_METHOD* meth;
  30401. if (name == NULL) {
  30402. return NULL;
  30403. }
  30404. meth = (WOLFSSL_RSA_METHOD*)XMALLOC(sizeof(WOLFSSL_RSA_METHOD), NULL,
  30405. DYNAMIC_TYPE_OPENSSL);
  30406. name_len = (int)XSTRLEN(name);
  30407. if (!meth) {
  30408. return NULL;
  30409. }
  30410. meth->flags = flags;
  30411. meth->name = (char*)XMALLOC(name_len+1, NULL, DYNAMIC_TYPE_OPENSSL);
  30412. if (!meth->name) {
  30413. XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL);
  30414. return NULL;
  30415. }
  30416. XMEMCPY(meth->name, name, name_len+1);
  30417. return meth;
  30418. }
  30419. void wolfSSL_RSA_meth_free(WOLFSSL_RSA_METHOD *meth)
  30420. {
  30421. if (meth) {
  30422. XFREE(meth->name, NULL, DYNAMIC_TYPE_OPENSSL);
  30423. XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL);
  30424. }
  30425. }
  30426. #ifndef NO_WOLFSSL_STUB
  30427. int wolfSSL_RSA_meth_set(WOLFSSL_RSA_METHOD *rsa, void* p)
  30428. {
  30429. (void)rsa;
  30430. (void)p;
  30431. WOLFSSL_STUB("RSA_METHOD is not implemented.");
  30432. return 1;
  30433. }
  30434. #endif
  30435. int wolfSSL_RSA_set_method(WOLFSSL_RSA *rsa, WOLFSSL_RSA_METHOD *meth)
  30436. {
  30437. if (rsa)
  30438. rsa->meth = meth;
  30439. return 1;
  30440. }
  30441. const WOLFSSL_RSA_METHOD* wolfSSL_RSA_get_method(const WOLFSSL_RSA *rsa)
  30442. {
  30443. if (!rsa) {
  30444. return NULL;
  30445. }
  30446. return rsa->meth;
  30447. }
  30448. const WOLFSSL_RSA_METHOD* wolfSSL_RSA_get_default_method(void)
  30449. {
  30450. return wolfSSL_RSA_meth_new("wolfSSL RSA", 0);
  30451. }
  30452. int wolfSSL_RSA_flags(const WOLFSSL_RSA *r)
  30453. {
  30454. if (r && r->meth) {
  30455. return r->meth->flags;
  30456. } else {
  30457. return 0;
  30458. }
  30459. }
  30460. void wolfSSL_RSA_set_flags(WOLFSSL_RSA *r, int flags)
  30461. {
  30462. if (r && r->meth) {
  30463. r->meth->flags = flags;
  30464. }
  30465. }
  30466. #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  30467. WOLFSSL_RSA* wolfSSL_RSAPublicKey_dup(WOLFSSL_RSA *rsa)
  30468. {
  30469. int derSz = 0;
  30470. byte *derBuf = NULL;
  30471. WOLFSSL_RSA* local;
  30472. WOLFSSL_ENTER("wolfSSL_RSAPublicKey_dup");
  30473. if (!rsa) {
  30474. return NULL;
  30475. }
  30476. local = wolfSSL_RSA_new();
  30477. if (local == NULL) {
  30478. WOLFSSL_MSG("Error creating a new WOLFSSL_RSA structure");
  30479. return NULL;
  30480. }
  30481. if ((derSz = wolfSSL_RSA_To_Der(rsa, &derBuf, 1)) < 0) {
  30482. WOLFSSL_MSG("wolfSSL_RSA_To_Der failed");
  30483. return NULL;
  30484. }
  30485. if (wolfSSL_RSA_LoadDer_ex(local,
  30486. derBuf, derSz,
  30487. WOLFSSL_RSA_LOAD_PUBLIC) != SSL_SUCCESS) {
  30488. wolfSSL_RSA_free(local);
  30489. local = NULL;
  30490. }
  30491. XFREE(derBuf, NULL, DYNAMIC_TYPE_ASN1);
  30492. return local;
  30493. }
  30494. #endif
  30495. void* wolfSSL_RSA_get_ex_data(const WOLFSSL_RSA *rsa, int idx)
  30496. {
  30497. WOLFSSL_ENTER("wolfSSL_RSA_get_ex_data");
  30498. #ifdef HAVE_EX_DATA
  30499. if (rsa) {
  30500. return wolfSSL_CRYPTO_get_ex_data(&rsa->ex_data, idx);
  30501. }
  30502. #else
  30503. (void)rsa;
  30504. (void)idx;
  30505. #endif
  30506. return NULL;
  30507. }
  30508. int wolfSSL_RSA_set_ex_data(WOLFSSL_RSA *rsa, int idx, void *data)
  30509. {
  30510. WOLFSSL_ENTER("wolfSSL_RSA_set_ex_data");
  30511. #ifdef HAVE_EX_DATA
  30512. if (rsa) {
  30513. return wolfSSL_CRYPTO_set_ex_data(&rsa->ex_data, idx, data);
  30514. }
  30515. #else
  30516. (void)rsa;
  30517. (void)idx;
  30518. (void)data;
  30519. #endif
  30520. return WOLFSSL_FAILURE;
  30521. }
  30522. int wolfSSL_RSA_set0_key(WOLFSSL_RSA *r, WOLFSSL_BIGNUM *n, WOLFSSL_BIGNUM *e,
  30523. WOLFSSL_BIGNUM *d)
  30524. {
  30525. /* If the fields n and e in r are NULL, the corresponding input
  30526. * parameters MUST be non-NULL for n and e. d may be
  30527. * left NULL (in case only the public key is used).
  30528. */
  30529. if ((!r->n && !n) || (!r->e && !e))
  30530. return 0;
  30531. if (n) {
  30532. wolfSSL_BN_free(r->n);
  30533. r->n = n;
  30534. }
  30535. if (e) {
  30536. wolfSSL_BN_free(r->e);
  30537. r->e = e;
  30538. }
  30539. if (d) {
  30540. wolfSSL_BN_clear_free(r->d);
  30541. r->d = d;
  30542. }
  30543. return 1;
  30544. }
  30545. #endif /* OPENSSL_EXTRA */
  30546. #endif /* NO_RSA */
  30547. #if !defined(NO_DSA) && \
  30548. (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  30549. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  30550. int wolfSSL_DSA_LoadDer(WOLFSSL_DSA* dsa, const unsigned char* derBuf, int derSz)
  30551. {
  30552. word32 idx = 0;
  30553. int ret;
  30554. WOLFSSL_ENTER("wolfSSL_DSA_LoadDer");
  30555. if (dsa == NULL || dsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  30556. WOLFSSL_MSG("Bad function arguments");
  30557. return WOLFSSL_FATAL_ERROR;
  30558. }
  30559. ret = DsaPrivateKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  30560. if (ret < 0) {
  30561. WOLFSSL_MSG("DsaPrivateKeyDecode failed");
  30562. return WOLFSSL_FATAL_ERROR;
  30563. }
  30564. if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS) {
  30565. WOLFSSL_MSG("SetDsaExternal failed");
  30566. return WOLFSSL_FATAL_ERROR;
  30567. }
  30568. dsa->inSet = 1;
  30569. return WOLFSSL_SUCCESS;
  30570. }
  30571. /* Loads DSA key from DER buffer. opt = DSA_LOAD_PRIVATE or DSA_LOAD_PUBLIC.
  30572. returns 1 on success, or 0 on failure. */
  30573. int wolfSSL_DSA_LoadDer_ex(WOLFSSL_DSA* dsa, const unsigned char* derBuf,
  30574. int derSz, int opt)
  30575. {
  30576. word32 idx = 0;
  30577. int ret;
  30578. WOLFSSL_ENTER("wolfSSL_DSA_LoadDer");
  30579. if (dsa == NULL || dsa->internal == NULL || derBuf == NULL || derSz <= 0) {
  30580. WOLFSSL_MSG("Bad function arguments");
  30581. return WOLFSSL_FATAL_ERROR;
  30582. }
  30583. if (opt == WOLFSSL_DSA_LOAD_PRIVATE) {
  30584. ret = DsaPrivateKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  30585. }
  30586. else {
  30587. ret = DsaPublicKeyDecode(derBuf, &idx, (DsaKey*)dsa->internal, derSz);
  30588. }
  30589. if (ret < 0 && opt == WOLFSSL_DSA_LOAD_PRIVATE) {
  30590. WOLFSSL_MSG("DsaPrivateKeyDecode failed");
  30591. return WOLFSSL_FATAL_ERROR;
  30592. }
  30593. else if (ret < 0 && opt == WOLFSSL_DSA_LOAD_PUBLIC) {
  30594. WOLFSSL_MSG("DsaPublicKeyDecode failed");
  30595. return WOLFSSL_FATAL_ERROR;
  30596. }
  30597. if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS) {
  30598. WOLFSSL_MSG("SetDsaExternal failed");
  30599. return WOLFSSL_FATAL_ERROR;
  30600. }
  30601. dsa->inSet = 1;
  30602. return WOLFSSL_SUCCESS;
  30603. }
  30604. #endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  30605. #ifdef OPENSSL_EXTRA
  30606. #ifdef HAVE_ECC
  30607. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  30608. int wolfSSL_EC_KEY_LoadDer(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
  30609. int derSz)
  30610. {
  30611. return wolfSSL_EC_KEY_LoadDer_ex(key, derBuf, derSz,
  30612. WOLFSSL_EC_KEY_LOAD_PRIVATE);
  30613. }
  30614. int wolfSSL_EC_KEY_LoadDer_ex(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
  30615. int derSz, int opt)
  30616. {
  30617. word32 idx = 0;
  30618. int ret;
  30619. WOLFSSL_ENTER("wolfSSL_EC_KEY_LoadDer");
  30620. if (key == NULL || key->internal == NULL || derBuf == NULL || derSz <= 0) {
  30621. WOLFSSL_MSG("Bad function arguments");
  30622. return WOLFSSL_FATAL_ERROR;
  30623. }
  30624. if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
  30625. ret = wc_EccPrivateKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
  30626. derSz);
  30627. }
  30628. else {
  30629. ret = wc_EccPublicKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
  30630. derSz);
  30631. }
  30632. if (ret < 0) {
  30633. if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
  30634. WOLFSSL_MSG("wc_EccPrivateKeyDecode failed");
  30635. }
  30636. else {
  30637. WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
  30638. }
  30639. return WOLFSSL_FATAL_ERROR;
  30640. }
  30641. if (SetECKeyExternal(key) != WOLFSSL_SUCCESS) {
  30642. WOLFSSL_MSG("SetECKeyExternal failed");
  30643. return WOLFSSL_FATAL_ERROR;
  30644. }
  30645. key->inSet = 1;
  30646. return WOLFSSL_SUCCESS;
  30647. }
  30648. #endif /* HAVE_ECC */
  30649. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH))
  30650. /* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
  30651. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  30652. int wolfSSL_DH_LoadDer(WOLFSSL_DH* dh, const unsigned char* derBuf, int derSz)
  30653. {
  30654. word32 idx = 0;
  30655. int ret;
  30656. if (dh == NULL || dh->internal == NULL || derBuf == NULL || derSz <= 0) {
  30657. WOLFSSL_MSG("Bad function arguments");
  30658. return WOLFSSL_FATAL_ERROR;
  30659. }
  30660. ret = wc_DhKeyDecode(derBuf, &idx, (DhKey*)dh->internal, (word32)derSz);
  30661. if (ret < 0) {
  30662. WOLFSSL_MSG("wc_DhKeyDecode failed");
  30663. return WOLFSSL_FATAL_ERROR;
  30664. }
  30665. if (SetDhExternal(dh) != WOLFSSL_SUCCESS) {
  30666. WOLFSSL_MSG("SetDhExternal failed");
  30667. return WOLFSSL_FATAL_ERROR;
  30668. }
  30669. return WOLFSSL_SUCCESS;
  30670. }
  30671. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  30672. #endif /* ! NO_DH && WOLFSSL_QT || OPENSSL_ALL */
  30673. #endif /* OPENSSL_EXTRA */
  30674. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  30675. /* increments ref count of WOLFSSL_RSA. Return 1 on success, 0 on error */
  30676. int wolfSSL_RSA_up_ref(WOLFSSL_RSA* rsa)
  30677. {
  30678. if (rsa) {
  30679. if (wc_LockMutex(&rsa->refMutex) != 0) {
  30680. WOLFSSL_MSG("Failed to lock x509 mutex");
  30681. }
  30682. rsa->refCount++;
  30683. wc_UnLockMutex(&rsa->refMutex);
  30684. return 1;
  30685. }
  30686. return 0;
  30687. }
  30688. /* increments ref count of WOLFSSL_X509. Return 1 on success, 0 on error */
  30689. int wolfSSL_X509_up_ref(WOLFSSL_X509* x509)
  30690. {
  30691. if (x509) {
  30692. if (wc_LockMutex(&x509->refMutex) != 0) {
  30693. WOLFSSL_MSG("Failed to lock x509 mutex");
  30694. }
  30695. x509->refCount++;
  30696. wc_UnLockMutex(&x509->refMutex);
  30697. return 1;
  30698. }
  30699. return 0;
  30700. }
  30701. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  30702. #ifdef WOLFSSL_ALT_CERT_CHAINS
  30703. int wolfSSL_is_peer_alt_cert_chain(const WOLFSSL* ssl)
  30704. {
  30705. int isUsing = 0;
  30706. if (ssl)
  30707. isUsing = ssl->options.usingAltCertChain;
  30708. return isUsing;
  30709. }
  30710. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  30711. #ifdef SESSION_CERTS
  30712. #ifdef WOLFSSL_ALT_CERT_CHAINS
  30713. /* Get peer's alternate certificate chain */
  30714. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_alt_chain(WOLFSSL* ssl)
  30715. {
  30716. WOLFSSL_ENTER("wolfSSL_get_peer_alt_chain");
  30717. if (ssl)
  30718. return &ssl->session.altChain;
  30719. return 0;
  30720. }
  30721. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  30722. /* Get peer's certificate chain */
  30723. WOLFSSL_X509_CHAIN* wolfSSL_get_peer_chain(WOLFSSL* ssl)
  30724. {
  30725. WOLFSSL_ENTER("wolfSSL_get_peer_chain");
  30726. if (ssl)
  30727. return &ssl->session.chain;
  30728. return 0;
  30729. }
  30730. /* Get peer's certificate chain total count */
  30731. int wolfSSL_get_chain_count(WOLFSSL_X509_CHAIN* chain)
  30732. {
  30733. WOLFSSL_ENTER("wolfSSL_get_chain_count");
  30734. if (chain)
  30735. return chain->count;
  30736. return 0;
  30737. }
  30738. /* Get peer's ASN.1 DER certificate at index (idx) length in bytes */
  30739. int wolfSSL_get_chain_length(WOLFSSL_X509_CHAIN* chain, int idx)
  30740. {
  30741. WOLFSSL_ENTER("wolfSSL_get_chain_length");
  30742. if (chain)
  30743. return chain->certs[idx].length;
  30744. return 0;
  30745. }
  30746. /* Get peer's ASN.1 DER certificate at index (idx) */
  30747. byte* wolfSSL_get_chain_cert(WOLFSSL_X509_CHAIN* chain, int idx)
  30748. {
  30749. WOLFSSL_ENTER("wolfSSL_get_chain_cert");
  30750. if (chain)
  30751. return chain->certs[idx].buffer;
  30752. return 0;
  30753. }
  30754. /* Get peer's wolfSSL X509 certificate at index (idx) */
  30755. WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx)
  30756. {
  30757. int ret;
  30758. WOLFSSL_X509* x509 = NULL;
  30759. #ifdef WOLFSSL_SMALL_STACK
  30760. DecodedCert* cert = NULL;
  30761. #else
  30762. DecodedCert cert[1];
  30763. #endif
  30764. WOLFSSL_ENTER("wolfSSL_get_chain_X509");
  30765. if (chain != NULL) {
  30766. #ifdef WOLFSSL_SMALL_STACK
  30767. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL,
  30768. DYNAMIC_TYPE_DCERT);
  30769. if (cert != NULL)
  30770. #endif
  30771. {
  30772. InitDecodedCert(cert, chain->certs[idx].buffer,
  30773. chain->certs[idx].length, NULL);
  30774. if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) != 0) {
  30775. WOLFSSL_MSG("Failed to parse cert");
  30776. }
  30777. else {
  30778. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  30779. DYNAMIC_TYPE_X509);
  30780. if (x509 == NULL) {
  30781. WOLFSSL_MSG("Failed alloc X509");
  30782. }
  30783. else {
  30784. InitX509(x509, 1, NULL);
  30785. if ((ret = CopyDecodedToX509(x509, cert)) != 0) {
  30786. WOLFSSL_MSG("Failed to copy decoded");
  30787. wolfSSL_X509_free(x509);
  30788. x509 = NULL;
  30789. }
  30790. }
  30791. }
  30792. FreeDecodedCert(cert);
  30793. #ifdef WOLFSSL_SMALL_STACK
  30794. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  30795. #endif
  30796. }
  30797. }
  30798. (void)ret;
  30799. return x509;
  30800. }
  30801. /* Get peer's PEM certificate at index (idx), output to buffer if inLen big
  30802. enough else return error (-1). If buffer is NULL only calculate
  30803. outLen. Output length is in *outLen WOLFSSL_SUCCESS on ok */
  30804. int wolfSSL_get_chain_cert_pem(WOLFSSL_X509_CHAIN* chain, int idx,
  30805. unsigned char* buf, int inLen, int* outLen)
  30806. {
  30807. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  30808. const char* header = NULL;
  30809. const char* footer = NULL;
  30810. int headerLen;
  30811. int footerLen;
  30812. int i;
  30813. int err;
  30814. word32 szNeeded = 0;
  30815. WOLFSSL_ENTER("wolfSSL_get_chain_cert_pem");
  30816. if (!chain || !outLen || idx < 0 || idx >= wolfSSL_get_chain_count(chain))
  30817. return BAD_FUNC_ARG;
  30818. err = wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer);
  30819. if (err != 0)
  30820. return err;
  30821. headerLen = (int)XSTRLEN(header);
  30822. footerLen = (int)XSTRLEN(footer);
  30823. /* Null output buffer return size needed in outLen */
  30824. if(!buf) {
  30825. if(Base64_Encode(chain->certs[idx].buffer, chain->certs[idx].length,
  30826. NULL, &szNeeded) != LENGTH_ONLY_E)
  30827. return WOLFSSL_FAILURE;
  30828. *outLen = szNeeded + headerLen + footerLen;
  30829. return LENGTH_ONLY_E;
  30830. }
  30831. /* don't even try if inLen too short */
  30832. if (inLen < headerLen + footerLen + chain->certs[idx].length)
  30833. return BAD_FUNC_ARG;
  30834. /* header */
  30835. if (XMEMCPY(buf, header, headerLen) == NULL)
  30836. return WOLFSSL_FATAL_ERROR;
  30837. i = headerLen;
  30838. /* body */
  30839. *outLen = inLen; /* input to Base64_Encode */
  30840. if ( (err = Base64_Encode(chain->certs[idx].buffer,
  30841. chain->certs[idx].length, buf + i, (word32*)outLen)) < 0)
  30842. return err;
  30843. i += *outLen;
  30844. /* footer */
  30845. if ( (i + footerLen) > inLen)
  30846. return BAD_FUNC_ARG;
  30847. if (XMEMCPY(buf + i, footer, footerLen) == NULL)
  30848. return WOLFSSL_FATAL_ERROR;
  30849. *outLen += headerLen + footerLen;
  30850. return WOLFSSL_SUCCESS;
  30851. #else
  30852. (void)chain;
  30853. (void)idx;
  30854. (void)buf;
  30855. (void)inLen;
  30856. (void)outLen;
  30857. return WOLFSSL_FAILURE;
  30858. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  30859. }
  30860. /* get session ID */
  30861. WOLFSSL_ABI
  30862. const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session)
  30863. {
  30864. WOLFSSL_ENTER("wolfSSL_get_sessionID");
  30865. if (session)
  30866. return session->sessionID;
  30867. return NULL;
  30868. }
  30869. #endif /* SESSION_CERTS */
  30870. #ifdef HAVE_FUZZER
  30871. void wolfSSL_SetFuzzerCb(WOLFSSL* ssl, CallbackFuzzer cbf, void* fCtx)
  30872. {
  30873. if (ssl) {
  30874. ssl->fuzzerCb = cbf;
  30875. ssl->fuzzerCtx = fCtx;
  30876. }
  30877. }
  30878. #endif
  30879. #ifndef NO_CERTS
  30880. #ifdef HAVE_PK_CALLBACKS
  30881. #ifdef HAVE_ECC
  30882. void wolfSSL_CTX_SetEccKeyGenCb(WOLFSSL_CTX* ctx, CallbackEccKeyGen cb)
  30883. {
  30884. if (ctx)
  30885. ctx->EccKeyGenCb = cb;
  30886. }
  30887. void wolfSSL_SetEccKeyGenCtx(WOLFSSL* ssl, void *ctx)
  30888. {
  30889. if (ssl)
  30890. ssl->EccKeyGenCtx = ctx;
  30891. }
  30892. void* wolfSSL_GetEccKeyGenCtx(WOLFSSL* ssl)
  30893. {
  30894. if (ssl)
  30895. return ssl->EccKeyGenCtx;
  30896. return NULL;
  30897. }
  30898. WOLFSSL_ABI
  30899. void wolfSSL_CTX_SetEccSignCb(WOLFSSL_CTX* ctx, CallbackEccSign cb)
  30900. {
  30901. if (ctx)
  30902. ctx->EccSignCb = cb;
  30903. }
  30904. void wolfSSL_SetEccSignCtx(WOLFSSL* ssl, void *ctx)
  30905. {
  30906. if (ssl)
  30907. ssl->EccSignCtx = ctx;
  30908. }
  30909. void* wolfSSL_GetEccSignCtx(WOLFSSL* ssl)
  30910. {
  30911. if (ssl)
  30912. return ssl->EccSignCtx;
  30913. return NULL;
  30914. }
  30915. void wolfSSL_CTX_SetEccVerifyCb(WOLFSSL_CTX* ctx, CallbackEccVerify cb)
  30916. {
  30917. if (ctx)
  30918. ctx->EccVerifyCb = cb;
  30919. }
  30920. void wolfSSL_SetEccVerifyCtx(WOLFSSL* ssl, void *ctx)
  30921. {
  30922. if (ssl)
  30923. ssl->EccVerifyCtx = ctx;
  30924. }
  30925. void* wolfSSL_GetEccVerifyCtx(WOLFSSL* ssl)
  30926. {
  30927. if (ssl)
  30928. return ssl->EccVerifyCtx;
  30929. return NULL;
  30930. }
  30931. void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, CallbackEccSharedSecret cb)
  30932. {
  30933. if (ctx)
  30934. ctx->EccSharedSecretCb = cb;
  30935. }
  30936. void wolfSSL_SetEccSharedSecretCtx(WOLFSSL* ssl, void *ctx)
  30937. {
  30938. if (ssl)
  30939. ssl->EccSharedSecretCtx = ctx;
  30940. }
  30941. void* wolfSSL_GetEccSharedSecretCtx(WOLFSSL* ssl)
  30942. {
  30943. if (ssl)
  30944. return ssl->EccSharedSecretCtx;
  30945. return NULL;
  30946. }
  30947. #endif /* HAVE_ECC */
  30948. #ifdef HAVE_ED25519
  30949. void wolfSSL_CTX_SetEd25519SignCb(WOLFSSL_CTX* ctx, CallbackEd25519Sign cb)
  30950. {
  30951. if (ctx)
  30952. ctx->Ed25519SignCb = cb;
  30953. }
  30954. void wolfSSL_SetEd25519SignCtx(WOLFSSL* ssl, void *ctx)
  30955. {
  30956. if (ssl)
  30957. ssl->Ed25519SignCtx = ctx;
  30958. }
  30959. void* wolfSSL_GetEd25519SignCtx(WOLFSSL* ssl)
  30960. {
  30961. if (ssl)
  30962. return ssl->Ed25519SignCtx;
  30963. return NULL;
  30964. }
  30965. void wolfSSL_CTX_SetEd25519VerifyCb(WOLFSSL_CTX* ctx, CallbackEd25519Verify cb)
  30966. {
  30967. if (ctx)
  30968. ctx->Ed25519VerifyCb = cb;
  30969. }
  30970. void wolfSSL_SetEd25519VerifyCtx(WOLFSSL* ssl, void *ctx)
  30971. {
  30972. if (ssl)
  30973. ssl->Ed25519VerifyCtx = ctx;
  30974. }
  30975. void* wolfSSL_GetEd25519VerifyCtx(WOLFSSL* ssl)
  30976. {
  30977. if (ssl)
  30978. return ssl->Ed25519VerifyCtx;
  30979. return NULL;
  30980. }
  30981. #endif /* HAVE_ED25519 */
  30982. #ifdef HAVE_CURVE25519
  30983. void wolfSSL_CTX_SetX25519KeyGenCb(WOLFSSL_CTX* ctx,
  30984. CallbackX25519KeyGen cb)
  30985. {
  30986. if (ctx)
  30987. ctx->X25519KeyGenCb = cb;
  30988. }
  30989. void wolfSSL_SetX25519KeyGenCtx(WOLFSSL* ssl, void *ctx)
  30990. {
  30991. if (ssl)
  30992. ssl->X25519KeyGenCtx = ctx;
  30993. }
  30994. void* wolfSSL_GetX25519KeyGenCtx(WOLFSSL* ssl)
  30995. {
  30996. if (ssl)
  30997. return ssl->X25519KeyGenCtx;
  30998. return NULL;
  30999. }
  31000. void wolfSSL_CTX_SetX25519SharedSecretCb(WOLFSSL_CTX* ctx,
  31001. CallbackX25519SharedSecret cb)
  31002. {
  31003. if (ctx)
  31004. ctx->X25519SharedSecretCb = cb;
  31005. }
  31006. void wolfSSL_SetX25519SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  31007. {
  31008. if (ssl)
  31009. ssl->X25519SharedSecretCtx = ctx;
  31010. }
  31011. void* wolfSSL_GetX25519SharedSecretCtx(WOLFSSL* ssl)
  31012. {
  31013. if (ssl)
  31014. return ssl->X25519SharedSecretCtx;
  31015. return NULL;
  31016. }
  31017. #endif /* HAVE_CURVE25519 */
  31018. #ifdef HAVE_ED448
  31019. void wolfSSL_CTX_SetEd448SignCb(WOLFSSL_CTX* ctx, CallbackEd448Sign cb)
  31020. {
  31021. if (ctx)
  31022. ctx->Ed448SignCb = cb;
  31023. }
  31024. void wolfSSL_SetEd448SignCtx(WOLFSSL* ssl, void *ctx)
  31025. {
  31026. if (ssl)
  31027. ssl->Ed448SignCtx = ctx;
  31028. }
  31029. void* wolfSSL_GetEd448SignCtx(WOLFSSL* ssl)
  31030. {
  31031. if (ssl)
  31032. return ssl->Ed448SignCtx;
  31033. return NULL;
  31034. }
  31035. void wolfSSL_CTX_SetEd448VerifyCb(WOLFSSL_CTX* ctx, CallbackEd448Verify cb)
  31036. {
  31037. if (ctx)
  31038. ctx->Ed448VerifyCb = cb;
  31039. }
  31040. void wolfSSL_SetEd448VerifyCtx(WOLFSSL* ssl, void *ctx)
  31041. {
  31042. if (ssl)
  31043. ssl->Ed448VerifyCtx = ctx;
  31044. }
  31045. void* wolfSSL_GetEd448VerifyCtx(WOLFSSL* ssl)
  31046. {
  31047. if (ssl)
  31048. return ssl->Ed448VerifyCtx;
  31049. return NULL;
  31050. }
  31051. #endif /* HAVE_ED448 */
  31052. #ifdef HAVE_CURVE448
  31053. void wolfSSL_CTX_SetX448KeyGenCb(WOLFSSL_CTX* ctx,
  31054. CallbackX448KeyGen cb)
  31055. {
  31056. if (ctx)
  31057. ctx->X448KeyGenCb = cb;
  31058. }
  31059. void wolfSSL_SetX448KeyGenCtx(WOLFSSL* ssl, void *ctx)
  31060. {
  31061. if (ssl)
  31062. ssl->X448KeyGenCtx = ctx;
  31063. }
  31064. void* wolfSSL_GetX448KeyGenCtx(WOLFSSL* ssl)
  31065. {
  31066. if (ssl)
  31067. return ssl->X448KeyGenCtx;
  31068. return NULL;
  31069. }
  31070. void wolfSSL_CTX_SetX448SharedSecretCb(WOLFSSL_CTX* ctx,
  31071. CallbackX448SharedSecret cb)
  31072. {
  31073. if (ctx)
  31074. ctx->X448SharedSecretCb = cb;
  31075. }
  31076. void wolfSSL_SetX448SharedSecretCtx(WOLFSSL* ssl, void *ctx)
  31077. {
  31078. if (ssl)
  31079. ssl->X448SharedSecretCtx = ctx;
  31080. }
  31081. void* wolfSSL_GetX448SharedSecretCtx(WOLFSSL* ssl)
  31082. {
  31083. if (ssl)
  31084. return ssl->X448SharedSecretCtx;
  31085. return NULL;
  31086. }
  31087. #endif /* HAVE_CURVE448 */
  31088. #ifndef NO_RSA
  31089. void wolfSSL_CTX_SetRsaSignCb(WOLFSSL_CTX* ctx, CallbackRsaSign cb)
  31090. {
  31091. if (ctx)
  31092. ctx->RsaSignCb = cb;
  31093. }
  31094. void wolfSSL_CTX_SetRsaSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  31095. {
  31096. if (ctx)
  31097. ctx->RsaSignCheckCb = cb;
  31098. }
  31099. void wolfSSL_SetRsaSignCtx(WOLFSSL* ssl, void *ctx)
  31100. {
  31101. if (ssl)
  31102. ssl->RsaSignCtx = ctx;
  31103. }
  31104. void* wolfSSL_GetRsaSignCtx(WOLFSSL* ssl)
  31105. {
  31106. if (ssl)
  31107. return ssl->RsaSignCtx;
  31108. return NULL;
  31109. }
  31110. void wolfSSL_CTX_SetRsaVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaVerify cb)
  31111. {
  31112. if (ctx)
  31113. ctx->RsaVerifyCb = cb;
  31114. }
  31115. void wolfSSL_SetRsaVerifyCtx(WOLFSSL* ssl, void *ctx)
  31116. {
  31117. if (ssl)
  31118. ssl->RsaVerifyCtx = ctx;
  31119. }
  31120. void* wolfSSL_GetRsaVerifyCtx(WOLFSSL* ssl)
  31121. {
  31122. if (ssl)
  31123. return ssl->RsaVerifyCtx;
  31124. return NULL;
  31125. }
  31126. #ifdef WC_RSA_PSS
  31127. void wolfSSL_CTX_SetRsaPssSignCb(WOLFSSL_CTX* ctx, CallbackRsaPssSign cb)
  31128. {
  31129. if (ctx)
  31130. ctx->RsaPssSignCb = cb;
  31131. }
  31132. void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  31133. {
  31134. if (ctx)
  31135. ctx->RsaPssSignCheckCb = cb;
  31136. }
  31137. void wolfSSL_SetRsaPssSignCtx(WOLFSSL* ssl, void *ctx)
  31138. {
  31139. if (ssl)
  31140. ssl->RsaPssSignCtx = ctx;
  31141. }
  31142. void* wolfSSL_GetRsaPssSignCtx(WOLFSSL* ssl)
  31143. {
  31144. if (ssl)
  31145. return ssl->RsaPssSignCtx;
  31146. return NULL;
  31147. }
  31148. void wolfSSL_CTX_SetRsaPssVerifyCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb)
  31149. {
  31150. if (ctx)
  31151. ctx->RsaPssVerifyCb = cb;
  31152. }
  31153. void wolfSSL_SetRsaPssVerifyCtx(WOLFSSL* ssl, void *ctx)
  31154. {
  31155. if (ssl)
  31156. ssl->RsaPssVerifyCtx = ctx;
  31157. }
  31158. void* wolfSSL_GetRsaPssVerifyCtx(WOLFSSL* ssl)
  31159. {
  31160. if (ssl)
  31161. return ssl->RsaPssVerifyCtx;
  31162. return NULL;
  31163. }
  31164. #endif /* WC_RSA_PSS */
  31165. void wolfSSL_CTX_SetRsaEncCb(WOLFSSL_CTX* ctx, CallbackRsaEnc cb)
  31166. {
  31167. if (ctx)
  31168. ctx->RsaEncCb = cb;
  31169. }
  31170. void wolfSSL_SetRsaEncCtx(WOLFSSL* ssl, void *ctx)
  31171. {
  31172. if (ssl)
  31173. ssl->RsaEncCtx = ctx;
  31174. }
  31175. void* wolfSSL_GetRsaEncCtx(WOLFSSL* ssl)
  31176. {
  31177. if (ssl)
  31178. return ssl->RsaEncCtx;
  31179. return NULL;
  31180. }
  31181. void wolfSSL_CTX_SetRsaDecCb(WOLFSSL_CTX* ctx, CallbackRsaDec cb)
  31182. {
  31183. if (ctx)
  31184. ctx->RsaDecCb = cb;
  31185. }
  31186. void wolfSSL_SetRsaDecCtx(WOLFSSL* ssl, void *ctx)
  31187. {
  31188. if (ssl)
  31189. ssl->RsaDecCtx = ctx;
  31190. }
  31191. void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
  31192. {
  31193. if (ssl)
  31194. return ssl->RsaDecCtx;
  31195. return NULL;
  31196. }
  31197. #endif /* NO_RSA */
  31198. #endif /* HAVE_PK_CALLBACKS */
  31199. #endif /* NO_CERTS */
  31200. #if defined(HAVE_PK_CALLBACKS) && !defined(NO_DH)
  31201. void wolfSSL_CTX_SetDhAgreeCb(WOLFSSL_CTX* ctx, CallbackDhAgree cb)
  31202. {
  31203. if (ctx)
  31204. ctx->DhAgreeCb = cb;
  31205. }
  31206. void wolfSSL_SetDhAgreeCtx(WOLFSSL* ssl, void *ctx)
  31207. {
  31208. if (ssl)
  31209. ssl->DhAgreeCtx = ctx;
  31210. }
  31211. void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
  31212. {
  31213. if (ssl)
  31214. return ssl->DhAgreeCtx;
  31215. return NULL;
  31216. }
  31217. #endif /* HAVE_PK_CALLBACKS && !NO_DH */
  31218. #ifdef WOLFSSL_HAVE_WOLFSCEP
  31219. /* Used by autoconf to see if wolfSCEP is available */
  31220. void wolfSSL_wolfSCEP(void) {}
  31221. #endif
  31222. #ifdef WOLFSSL_HAVE_CERT_SERVICE
  31223. /* Used by autoconf to see if cert service is available */
  31224. void wolfSSL_cert_service(void) {}
  31225. #endif
  31226. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  31227. !defined(WOLFCRYPT_ONLY)
  31228. #ifndef NO_CERTS
  31229. void wolfSSL_X509_NAME_free(WOLFSSL_X509_NAME *name)
  31230. {
  31231. WOLFSSL_ENTER("wolfSSL_X509_NAME_free");
  31232. FreeX509Name(name);
  31233. XFREE(name, NULL, DYNAMIC_TYPE_X509);
  31234. }
  31235. /* Malloc's a new WOLFSSL_X509_NAME structure
  31236. *
  31237. * returns NULL on failure, otherwise returns a new structure.
  31238. */
  31239. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new(void)
  31240. {
  31241. WOLFSSL_X509_NAME* name;
  31242. WOLFSSL_ENTER("wolfSSL_X509_NAME_new");
  31243. name = (WOLFSSL_X509_NAME*)XMALLOC(sizeof(WOLFSSL_X509_NAME), NULL,
  31244. DYNAMIC_TYPE_X509);
  31245. if (name != NULL) {
  31246. InitX509Name(name, 1, NULL);
  31247. }
  31248. return name;
  31249. }
  31250. /* Creates a duplicate of a WOLFSSL_X509_NAME structure.
  31251. Returns a new WOLFSSL_X509_NAME structure or NULL on failure */
  31252. WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME *name)
  31253. {
  31254. WOLFSSL_X509_NAME* copy = NULL;
  31255. WOLFSSL_ENTER("wolfSSL_X509_NAME_dup");
  31256. if (name == NULL) {
  31257. WOLFSSL_MSG("NULL parameter");
  31258. return NULL;
  31259. }
  31260. if (!(copy = wolfSSL_X509_NAME_new())) {
  31261. return NULL;
  31262. }
  31263. /* copy contents */
  31264. InitX509Name(copy, 1, name->heap);
  31265. if (wolfSSL_X509_NAME_copy(name, copy) != WOLFSSL_SUCCESS) {
  31266. wolfSSL_X509_NAME_free(copy);
  31267. return NULL;
  31268. }
  31269. return copy;
  31270. }
  31271. #if defined(WOLFSSL_CERT_GEN)
  31272. /* helper function for CopyX509NameToCertName()
  31273. *
  31274. * returns WOLFSSL_SUCCESS on success
  31275. */
  31276. static int CopyX509NameEntry(char* out, int mx, WOLFSSL_X509_NAME* name,
  31277. int nid, byte* transfered)
  31278. {
  31279. int inLen = 0;
  31280. unsigned char* in = NULL;
  31281. int i;
  31282. if (nid == ASN_COUNTRY_NAME)
  31283. nid = NID_countryName;
  31284. if (nid == ASN_EMAIL_NAME)
  31285. nid = NID_emailAddress;
  31286. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  31287. if (name->entry[i].set && name->entry[i].nid == nid) {
  31288. in = wolfSSL_ASN1_STRING_data(name->entry[i].value);
  31289. inLen = wolfSSL_ASN1_STRING_length(name->entry[i].value);
  31290. transfered[i] = 1;
  31291. break;
  31292. }
  31293. }
  31294. if (in == NULL) {
  31295. /* entry type not found */
  31296. return WOLFSSL_FAILURE;
  31297. }
  31298. if (inLen > mx) {
  31299. WOLFSSL_MSG("Name too long");
  31300. XMEMCPY(out, in, mx);
  31301. }
  31302. else {
  31303. XMEMCPY(out, in, inLen);
  31304. out[inLen] = '\0';
  31305. }
  31306. /* make sure is null terminated */
  31307. out[mx-1] = '\0';
  31308. return WOLFSSL_SUCCESS;
  31309. }
  31310. #ifdef WOLFSSL_MULTI_ATTRIB
  31311. /* Converts from NID_* value to wolfSSL value if needed */
  31312. static int ConvertNIDToWolfSSL(int nid)
  31313. {
  31314. switch (nid) {
  31315. case NID_commonName : return ASN_COMMON_NAME;
  31316. case NID_surname : return ASN_SUR_NAME;
  31317. case NID_countryName: return ASN_COUNTRY_NAME;
  31318. case NID_localityName: return ASN_LOCALITY_NAME;
  31319. case NID_stateOrProvinceName: return ASN_STATE_NAME;
  31320. case NID_organizationName: return ASN_ORG_NAME;
  31321. case NID_organizationalUnitName: return ASN_ORGUNIT_NAME;
  31322. case NID_emailAddress: return ASN_EMAIL_NAME;
  31323. case NID_serialNumber: return ASN_SERIAL_NUMBER;
  31324. case NID_businessCategory: return ASN_BUS_CAT;
  31325. case NID_domainComponent: return ASN_DOMAIN_COMPONENT;
  31326. default:
  31327. WOLFSSL_MSG("Attribute NID not found");
  31328. return -1;
  31329. }
  31330. }
  31331. #endif /* WOLFSSL_MULTI_ATTRIB */
  31332. /* Helper function to copy cert name from a WOLFSSL_X509_NAME structure to
  31333. * a CertName structure.
  31334. *
  31335. * returns WOLFSSL_SUCCESS on success and a negative error value on failure
  31336. */
  31337. static int CopyX509NameToCertName(WOLFSSL_X509_NAME* n, CertName* cName)
  31338. {
  31339. int idx = 0;
  31340. #ifdef WOLFSSL_MULTI_ATTRIB
  31341. int i, j = 0;
  31342. #endif
  31343. int count = 0;
  31344. const char* current;
  31345. byte transferred[MAX_NAME_ENTRIES] = {0};
  31346. if (n == NULL || cName == NULL) {
  31347. return BAD_FUNC_ARG;
  31348. }
  31349. /* initialize cert name */
  31350. cName->country[0] = '\0';
  31351. cName->countryEnc = CTC_PRINTABLE;
  31352. cName->state[0] = '\0';
  31353. cName->stateEnc = CTC_UTF8;
  31354. cName->locality[0] = '\0';
  31355. cName->localityEnc = CTC_UTF8;
  31356. cName->sur[0] = '\0';
  31357. cName->surEnc = CTC_UTF8;
  31358. cName->org[0] = '\0';
  31359. cName->orgEnc = CTC_UTF8;
  31360. cName->unit[0] = '\0';
  31361. cName->unitEnc = CTC_UTF8;
  31362. cName->commonName[0] = '\0';
  31363. cName->commonNameEnc = CTC_UTF8;
  31364. cName->serialDev[0] = '\0';
  31365. cName->serialDevEnc = CTC_PRINTABLE;
  31366. #ifdef WOLFSSL_CERT_EXT
  31367. cName->busCat[0] = '\0';
  31368. cName->busCatEnc = CTC_UTF8;
  31369. cName->joiC[0] = '\0';
  31370. cName->joiCEnc = CTC_PRINTABLE;
  31371. cName->joiSt[0] = '\0';
  31372. cName->joiStEnc = CTC_PRINTABLE;
  31373. #endif
  31374. cName->email[0] = '\0';
  31375. current = GetOneCertName(cName, idx);
  31376. while (current != NULL) {
  31377. if (CopyX509NameEntry((char*)current, CTC_NAME_SIZE, n,
  31378. GetCertNameId(idx), transferred) == SSL_SUCCESS) {
  31379. count++;
  31380. }
  31381. idx++;
  31382. current = GetOneCertName(cName, idx);
  31383. }
  31384. #ifdef WOLFSSL_MULTI_ATTRIB
  31385. /* copy over multiple entries */
  31386. idx = wolfSSL_X509_NAME_entry_count(n);
  31387. for (i = 0; i < MAX_NAME_ENTRIES && count < idx; i++) {
  31388. /* entry is set but was not yet transferred over */
  31389. if (n->entry[i].set && transferred[i] == 0) {
  31390. unsigned char* data;
  31391. int length;
  31392. WOLFSSL_X509_NAME_ENTRY* e = &n->entry[i];
  31393. data = wolfSSL_ASN1_STRING_data(e->value);
  31394. length = wolfSSL_ASN1_STRING_length(e->value);
  31395. if (j >= CTC_MAX_ATTRIB) {
  31396. WOLFSSL_MSG("No more space left in CertName");
  31397. break;
  31398. }
  31399. cName->name[j].sz = length;
  31400. cName->name[j].type = CTC_UTF8;
  31401. cName->name[j].id = ConvertNIDToWolfSSL(e->nid);
  31402. XMEMCPY(cName->name[j].value, data, length);
  31403. j++;
  31404. count++;
  31405. }
  31406. }
  31407. #endif /* WOLFSSL_MULTI_ATTRIB */
  31408. return WOLFSSL_SUCCESS;
  31409. }
  31410. #ifdef WOLFSSL_CERT_REQ
  31411. static int ReqCertFromX509(Cert* cert, WOLFSSL_X509* req)
  31412. {
  31413. int ret;
  31414. if (wc_InitCert(cert) != 0)
  31415. return WOLFSSL_FAILURE;
  31416. ret = CopyX509NameToCertName(&req->subject, &cert->subject);
  31417. if (ret == WOLFSSL_SUCCESS) {
  31418. cert->version = req->version;
  31419. cert->isCA = req->isCa;
  31420. #ifdef WOLFSSL_CERT_EXT
  31421. if (req->subjKeyIdSz != 0) {
  31422. XMEMCPY(cert->skid, req->subjKeyId, req->subjKeyIdSz);
  31423. cert->skidSz = req->subjKeyIdSz;
  31424. }
  31425. if (req->keyUsageSet)
  31426. cert->keyUsage = req->keyUsage;
  31427. /* Extended Key Usage not supported. */
  31428. #endif
  31429. }
  31430. return ret;
  31431. }
  31432. #endif
  31433. /* convert a WOLFSSL_X509 to a Cert structure for writing out */
  31434. static int CertFromX509(Cert* cert, WOLFSSL_X509* x509)
  31435. {
  31436. int ret;
  31437. #ifdef WOLFSSL_CERT_EXT
  31438. int i;
  31439. #endif
  31440. WOLFSSL_ENTER("wolfSSL_X509_to_Cert()");
  31441. if (x509 == NULL || cert == NULL) {
  31442. return BAD_FUNC_ARG;
  31443. }
  31444. wc_InitCert(cert);
  31445. cert->version = (int)wolfSSL_X509_get_version(x509);
  31446. #ifdef WOLFSSL_ALT_NAMES
  31447. if (x509->notBefore.length > 0) {
  31448. if ((x509->notBefore.length + 2) < CTC_DATE_SIZE) {
  31449. cert->beforeDate[0] = x509->notBefore.type;
  31450. cert->beforeDate[1] = x509->notBefore.length;
  31451. XMEMCPY(&cert->beforeDate[2], x509->notBefore.data,
  31452. x509->notBefore.length);
  31453. cert->beforeDateSz = x509->notBefore.length + 2;
  31454. }
  31455. else {
  31456. WOLFSSL_MSG("Not before date too large");
  31457. return WOLFSSL_FAILURE;
  31458. }
  31459. }
  31460. else {
  31461. cert->beforeDateSz = 0;
  31462. }
  31463. if (x509->notAfter.length > 0) {
  31464. if ((x509->notAfter.length + 2) < CTC_DATE_SIZE) {
  31465. cert->afterDate[0] = x509->notAfter.type;
  31466. cert->afterDate[1] = x509->notAfter.length;
  31467. XMEMCPY(&cert->afterDate[2], x509->notAfter.data,
  31468. x509->notAfter.length);
  31469. cert->afterDateSz = x509->notAfter.length + 2;
  31470. }
  31471. else {
  31472. WOLFSSL_MSG("Not after date too large");
  31473. return WOLFSSL_FAILURE;
  31474. }
  31475. }
  31476. else {
  31477. cert->afterDateSz = 0;
  31478. }
  31479. cert->altNamesSz = FlattenAltNames(cert->altNames,
  31480. sizeof(cert->altNames), x509->altNames);
  31481. #endif /* WOLFSSL_ALT_NAMES */
  31482. cert->sigType = wolfSSL_X509_get_signature_type(x509);
  31483. cert->keyType = x509->pubKeyOID;
  31484. cert->isCA = wolfSSL_X509_get_isCA(x509);
  31485. #ifdef WOLFSSL_CERT_EXT
  31486. if (x509->subjKeyIdSz < CTC_MAX_SKID_SIZE) {
  31487. XMEMCPY(cert->skid, x509->subjKeyId, x509->subjKeyIdSz);
  31488. cert->skidSz = (int)x509->subjKeyIdSz;
  31489. }
  31490. else {
  31491. WOLFSSL_MSG("Subject Key ID too large");
  31492. return WOLFSSL_FAILURE;
  31493. }
  31494. if (x509->authKeyIdSz < CTC_MAX_AKID_SIZE) {
  31495. XMEMCPY(cert->akid, x509->authKeyId, x509->authKeyIdSz);
  31496. cert->akidSz = (int)x509->authKeyIdSz;
  31497. }
  31498. else {
  31499. WOLFSSL_MSG("Auth Key ID too large");
  31500. return WOLFSSL_FAILURE;
  31501. }
  31502. for (i = 0; i < x509->certPoliciesNb; i++) {
  31503. /* copy the smaller of MAX macros, by default they are currently equal*/
  31504. if ((int)CTC_MAX_CERTPOL_SZ <= (int)MAX_CERTPOL_SZ) {
  31505. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  31506. CTC_MAX_CERTPOL_SZ);
  31507. }
  31508. else {
  31509. XMEMCPY(cert->certPolicies[i], x509->certPolicies[i],
  31510. MAX_CERTPOL_SZ);
  31511. }
  31512. }
  31513. cert->certPoliciesNb = (word16)x509->certPoliciesNb;
  31514. cert->keyUsage = x509->keyUsage;
  31515. #endif /* WOLFSSL_CERT_EXT */
  31516. #ifdef WOLFSSL_CERT_REQ
  31517. /* copy over challenge password for REQ certs */
  31518. XMEMCPY(cert->challengePw, x509->challengePw, CTC_NAME_SIZE);
  31519. #endif
  31520. if (x509->serialSz <= CTC_SERIAL_SIZE) {
  31521. XMEMCPY(cert->serial, x509->serial, x509->serialSz);
  31522. }
  31523. else {
  31524. WOLFSSL_MSG("Serial size error");
  31525. return WOLFSSL_FAILURE;
  31526. }
  31527. /* copy over Name structures */
  31528. if (x509->issuerSet)
  31529. cert->selfSigned = 0;
  31530. if ((ret = CopyX509NameToCertName(&(x509->issuer), &(cert->issuer)))
  31531. != WOLFSSL_SUCCESS) {
  31532. WOLFSSL_MSG("Error copying over issuer names");
  31533. WOLFSSL_LEAVE("wolfSSL_X509_to_Cert()", ret);
  31534. return WOLFSSL_FAILURE;
  31535. }
  31536. if ((ret = CopyX509NameToCertName(&(x509->subject), &(cert->subject)))
  31537. != WOLFSSL_SUCCESS) {
  31538. WOLFSSL_MSG("Error copying over subject names");
  31539. WOLFSSL_LEAVE("wolfSSL_X509_to_Cert()", ret);
  31540. return WOLFSSL_FAILURE;
  31541. }
  31542. cert->heap = x509->heap;
  31543. return WOLFSSL_SUCCESS;
  31544. }
  31545. /* returns the sig type to use on success i.e CTC_SHAwRSA and WOLFSSL_FALURE
  31546. * on fail case */
  31547. static int wolfSSL_sigTypeFromPKEY(WOLFSSL_EVP_MD* md,
  31548. WOLFSSL_EVP_PKEY* pkey)
  31549. {
  31550. int hashType;
  31551. int sigType = WOLFSSL_FAILURE;
  31552. #if !defined(NO_PWDBASED)
  31553. /* Convert key type and hash algorithm to a signature algorithm */
  31554. if (wolfSSL_EVP_get_hashinfo(md, &hashType, NULL) == WOLFSSL_FAILURE) {
  31555. return WOLFSSL_FAILURE;
  31556. }
  31557. #else
  31558. (void)md;
  31559. WOLFSSL_MSG("Cannot get hashinfo when NO_PWDBASED is defined");
  31560. return WOLFSSL_FAILURE;
  31561. #endif /* !defined(NO_PWDBASED) */
  31562. if (pkey->type == EVP_PKEY_RSA) {
  31563. switch (hashType) {
  31564. case WC_HASH_TYPE_SHA:
  31565. sigType = CTC_SHAwRSA;
  31566. break;
  31567. case WC_HASH_TYPE_SHA224:
  31568. sigType = CTC_SHA224wRSA;
  31569. break;
  31570. case WC_HASH_TYPE_SHA256:
  31571. sigType = CTC_SHA256wRSA;
  31572. break;
  31573. case WC_HASH_TYPE_SHA384:
  31574. sigType = CTC_SHA384wRSA;
  31575. break;
  31576. case WC_HASH_TYPE_SHA512:
  31577. sigType = CTC_SHA512wRSA;
  31578. break;
  31579. default:
  31580. return WOLFSSL_FAILURE;
  31581. }
  31582. }
  31583. else if (pkey->type == EVP_PKEY_EC) {
  31584. switch (hashType) {
  31585. case WC_HASH_TYPE_SHA:
  31586. sigType = CTC_SHAwECDSA;
  31587. break;
  31588. case WC_HASH_TYPE_SHA224:
  31589. sigType = CTC_SHA224wECDSA;
  31590. break;
  31591. case WC_HASH_TYPE_SHA256:
  31592. sigType = CTC_SHA256wECDSA;
  31593. break;
  31594. case WC_HASH_TYPE_SHA384:
  31595. sigType = CTC_SHA384wECDSA;
  31596. break;
  31597. case WC_HASH_TYPE_SHA512:
  31598. sigType = CTC_SHA512wECDSA;
  31599. break;
  31600. default:
  31601. return WOLFSSL_FAILURE;
  31602. }
  31603. }
  31604. else
  31605. return WOLFSSL_FAILURE;
  31606. return sigType;
  31607. }
  31608. /* generates DER buffer from WOLFSSL_X509
  31609. * If req == 1 then creates a request DER buffer
  31610. *
  31611. * updates derSz with certificate body size on success
  31612. * return WOLFSSL_SUCCESS on success
  31613. */
  31614. static int wolfSSL_X509_make_der(WOLFSSL_X509* x509, int req,
  31615. unsigned char* der, int* derSz)
  31616. {
  31617. int ret;
  31618. Cert cert;
  31619. void* key = NULL;
  31620. int type = -1;
  31621. #ifndef NO_RSA
  31622. RsaKey rsa;
  31623. #endif
  31624. #ifdef HAVE_ECC
  31625. ecc_key ecc;
  31626. #endif
  31627. WC_RNG rng;
  31628. word32 idx = 0;
  31629. if (x509 == NULL || der == NULL || derSz == NULL)
  31630. return BAD_FUNC_ARG;
  31631. #ifndef WOLFSSL_CERT_REQ
  31632. if (req) {
  31633. WOLFSSL_MSG("WOLFSSL_CERT_REQ needed for certificate request");
  31634. return WOLFSSL_FAILURE;
  31635. }
  31636. #endif
  31637. #ifdef WOLFSSL_CERT_REQ
  31638. if (req) {
  31639. if (ReqCertFromX509(&cert, x509) != WOLFSSL_SUCCESS)
  31640. return WOLFSSL_FAILURE;
  31641. }
  31642. else
  31643. #endif
  31644. {
  31645. /* Create a Cert that has the certificate fields. */
  31646. if (CertFromX509(&cert, x509) != WOLFSSL_SUCCESS)
  31647. return WOLFSSL_FAILURE;
  31648. }
  31649. /* Create a public key object from requests public key. */
  31650. #ifndef NO_RSA
  31651. if (x509->pubKeyOID == RSAk) {
  31652. type = RSA_TYPE;
  31653. ret = wc_InitRsaKey(&rsa, x509->heap);
  31654. if (ret != 0)
  31655. return ret;
  31656. ret = wc_RsaPublicKeyDecode(x509->pubKey.buffer, &idx, &rsa,
  31657. x509->pubKey.length);
  31658. if (ret != 0) {
  31659. wc_FreeRsaKey(&rsa);
  31660. return ret;
  31661. }
  31662. key = (void*)&rsa;
  31663. }
  31664. #endif
  31665. #ifdef HAVE_ECC
  31666. if (x509->pubKeyOID == ECDSAk) {
  31667. type = ECC_TYPE;
  31668. ret = wc_ecc_init(&ecc);
  31669. if (ret != 0)
  31670. return ret;
  31671. ret = wc_EccPublicKeyDecode(x509->pubKey.buffer, &idx, &ecc,
  31672. x509->pubKey.length);
  31673. if (ret != 0) {
  31674. wc_ecc_free(&ecc);
  31675. return ret;
  31676. }
  31677. key = (void*)&ecc;
  31678. }
  31679. #endif
  31680. if (key == NULL)
  31681. return WOLFSSL_FAILURE;
  31682. /* Make the body of the certificate request. */
  31683. #ifdef WOLFSSL_CERT_REQ
  31684. if (req) {
  31685. ret = wc_MakeCertReq_ex(&cert, der, *derSz, type, key);
  31686. }
  31687. else
  31688. #endif
  31689. {
  31690. ret = wc_InitRng(&rng);
  31691. if (ret != 0)
  31692. return WOLFSSL_FAILURE;
  31693. ret = wc_MakeCert_ex(&cert, der, *derSz, type, key, &rng);
  31694. wc_FreeRng(&rng);
  31695. }
  31696. if (ret < 0) {
  31697. return ret;
  31698. }
  31699. if ((x509->serialSz == 0) && (cert.serialSz <= EXTERNAL_SERIAL_SIZE)) {
  31700. XMEMCPY(x509->serial, cert.serial, cert.serialSz);
  31701. x509->serialSz = cert.serialSz;
  31702. }
  31703. /* Dispose of the public key object. */
  31704. #ifndef NO_RSA
  31705. if (x509->pubKeyOID == RSAk)
  31706. wc_FreeRsaKey(&rsa);
  31707. #endif
  31708. #ifdef HAVE_ECC
  31709. if (x509->pubKeyOID == ECDSAk)
  31710. wc_ecc_free(&ecc);
  31711. #endif
  31712. *derSz = ret;
  31713. return WOLFSSL_SUCCESS;
  31714. }
  31715. /* signs a der buffer for the WOLFSSL_X509 structure using the PKEY and MD
  31716. * hash passed in
  31717. *
  31718. * WARNING: this free's and replaces the existing DER buffer in the
  31719. * WOLFSSL_X509 with the newly signed buffer.
  31720. * returns size of signed buffer on success and negative values on fail
  31721. */
  31722. static int wolfSSL_X509_resign_cert(WOLFSSL_X509* x509, int req,
  31723. unsigned char* der, int derSz, int certBodySz, WOLFSSL_EVP_MD* md,
  31724. WOLFSSL_EVP_PKEY* pkey)
  31725. {
  31726. int ret;
  31727. void* key = NULL;
  31728. int type = -1;
  31729. int sigType;
  31730. WC_RNG rng;
  31731. sigType = wolfSSL_sigTypeFromPKEY(md, pkey);
  31732. if (sigType == WOLFSSL_FAILURE)
  31733. return WOLFSSL_FATAL_ERROR;
  31734. /* Get the private key object and type from pkey. */
  31735. #ifndef NO_RSA
  31736. if (pkey->type == EVP_PKEY_RSA) {
  31737. type = RSA_TYPE;
  31738. key = pkey->rsa->internal;
  31739. }
  31740. #endif
  31741. #ifdef HAVE_ECC
  31742. if (pkey->type == EVP_PKEY_EC) {
  31743. type = ECC_TYPE;
  31744. key = pkey->ecc->internal;
  31745. }
  31746. #endif
  31747. /* Sign the certificate request body. */
  31748. ret = wc_InitRng(&rng);
  31749. if (ret != 0)
  31750. return ret;
  31751. ret = wc_SignCert_ex(certBodySz, sigType, der, derSz, type, key, &rng);
  31752. wc_FreeRng(&rng);
  31753. if (ret < 0)
  31754. return ret;
  31755. /* Put in the new certificate encoding into the x509 object. */
  31756. FreeDer(&x509->derCert);
  31757. type = CERT_TYPE;
  31758. #ifdef WOLFSSL_REQ_CERT
  31759. if (req) {
  31760. type = CERTREQ_TYPE;
  31761. }
  31762. #endif
  31763. if (AllocDer(&x509->derCert, ret, type, NULL) != 0)
  31764. return WOLFSSL_FATAL_ERROR;
  31765. XMEMCPY(x509->derCert->buffer, der, ret);
  31766. x509->derCert->length = ret;
  31767. (void)req;
  31768. return ret;
  31769. }
  31770. /* returns the size of signature on success */
  31771. int wolfSSL_X509_sign(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey,
  31772. const WOLFSSL_EVP_MD* md)
  31773. {
  31774. int ret;
  31775. byte der[4096]; /* @TODO dynamic set based on expected cert size */
  31776. int derSz = sizeof(der);
  31777. WOLFSSL_ENTER("wolfSSL_X509_sign");
  31778. if (x509 == NULL || pkey == NULL || md == NULL)
  31779. return WOLFSSL_FAILURE;
  31780. x509->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  31781. if ((ret = wolfSSL_X509_make_der(x509, 0, der, &derSz)) !=
  31782. WOLFSSL_SUCCESS) {
  31783. WOLFSSL_MSG("Unable to make DER for X509");
  31784. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  31785. return WOLFSSL_FAILURE;
  31786. }
  31787. ret = wolfSSL_X509_resign_cert(x509, 0, der, sizeof(der), derSz,
  31788. (WOLFSSL_EVP_MD*)md, pkey);
  31789. if (ret <= 0) {
  31790. WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
  31791. return WOLFSSL_FAILURE;
  31792. }
  31793. return ret;
  31794. }
  31795. /* Converts the x509 name structure into DER format.
  31796. *
  31797. * out pointer to either a pre setup buffer or a pointer to null for
  31798. * creating a dynamic buffer. In the case that a pre-existing buffer is
  31799. * used out will be incremented the size of the DER buffer on success.
  31800. *
  31801. * returns the size of the buffer on success, or negative value with failure
  31802. */
  31803. int wolfSSL_i2d_X509_NAME(WOLFSSL_X509_NAME* name, unsigned char** out)
  31804. {
  31805. CertName cName;
  31806. unsigned char buf[256]; /* ASN_MAX_NAME */
  31807. int sz;
  31808. WOLFSSL_ENTER("wolfSSL_i2d_X509_NAME");
  31809. if (out == NULL || name == NULL) {
  31810. return BAD_FUNC_ARG;
  31811. }
  31812. XMEMSET(&cName, 0, sizeof(CertName));
  31813. if (CopyX509NameToCertName(name, &cName) != SSL_SUCCESS) {
  31814. WOLFSSL_MSG("Error converting x509 name to internal CertName");
  31815. return SSL_FATAL_ERROR;
  31816. }
  31817. sz = SetName(buf, sizeof(buf), &cName);
  31818. if (sz < 0) {
  31819. return sz;
  31820. }
  31821. /* using buffer passed in */
  31822. if (*out != NULL) {
  31823. XMEMCPY(*out, buf, sz);
  31824. *out += sz;
  31825. }
  31826. else {
  31827. *out = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
  31828. if (*out == NULL) {
  31829. return MEMORY_E;
  31830. }
  31831. XMEMCPY(*out, buf, sz);
  31832. }
  31833. return sz;
  31834. }
  31835. #endif /* WOLFSSL_CERT_GEN */
  31836. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  31837. WOLFSSL_X509_NAME *wolfSSL_d2i_X509_NAME(WOLFSSL_X509_NAME **name,
  31838. unsigned char **in, long length)
  31839. {
  31840. WOLFSSL_X509_NAME* tmp = NULL;
  31841. DecodedCert cert;
  31842. WOLFSSL_ENTER("wolfSSL_d2i_X509_NAME");
  31843. if (!in || !*in || length <= 0) {
  31844. WOLFSSL_MSG("Bad argument");
  31845. return NULL;
  31846. }
  31847. /* Set the X509_NAME buffer as the input data for cert.
  31848. * in is NOT a full certificate. Just the name. */
  31849. InitDecodedCert(&cert, *in, (word32)length, NULL);
  31850. /* Parse the X509 subject name */
  31851. if (GetName(&cert, SUBJECT, (int)length) != 0) {
  31852. WOLFSSL_MSG("WOLFSSL_X509_NAME parse error");
  31853. goto cleanup;
  31854. }
  31855. if (!(tmp = wolfSSL_X509_NAME_new())) {
  31856. WOLFSSL_MSG("wolfSSL_X509_NAME_new error");
  31857. goto cleanup;
  31858. }
  31859. XSTRNCPY(tmp->staticName, cert.subject, ASN_NAME_MAX);
  31860. tmp->staticName[ASN_NAME_MAX - 1] = '\0';
  31861. tmp->sz = (int)XSTRLEN(tmp->staticName) + 1;
  31862. if (name)
  31863. *name = tmp;
  31864. cleanup:
  31865. FreeDecodedCert(&cert);
  31866. return tmp;
  31867. }
  31868. /* Compares the two X509 names. If the size of x is larger then y then a
  31869. * positive value is returned if x is smaller a negative value is returned.
  31870. * In the case that the sizes are equal a the value of strcmp between the
  31871. * two names is returned.
  31872. *
  31873. * x First name for comparison
  31874. * y Second name to compare with x
  31875. */
  31876. int wolfSSL_X509_NAME_cmp(const WOLFSSL_X509_NAME* x,
  31877. const WOLFSSL_X509_NAME* y)
  31878. {
  31879. const char* _x;
  31880. const char* _y;
  31881. WOLFSSL_ENTER("wolfSSL_X509_NAME_cmp");
  31882. if (x == NULL || y == NULL) {
  31883. WOLFSSL_MSG("Bad argument passed in");
  31884. return -2;
  31885. }
  31886. if (x == y) {
  31887. return 0; /* match */
  31888. }
  31889. if (x->sz != y->sz) {
  31890. return x->sz - y->sz;
  31891. }
  31892. /*
  31893. * If the name member is not set or is immediately null terminated then
  31894. * compare the staticName member
  31895. */
  31896. _x = (x->name && *x->name) ? x->name : x->staticName;
  31897. _y = (y->name && *y->name) ? y->name : y->staticName;
  31898. return XSTRNCMP(_x, _y, x->sz); /* y sz is the same */
  31899. }
  31900. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
  31901. pem_password_cb *cb, void *u)
  31902. {
  31903. WOLFSSL_X509* x509 = NULL;
  31904. #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
  31905. unsigned char* pem = NULL;
  31906. int pemSz;
  31907. long i = 0, l;
  31908. const char* footer = NULL;
  31909. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  31910. if (bp == NULL) {
  31911. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_X509", BAD_FUNC_ARG);
  31912. return NULL;
  31913. }
  31914. if ((l = wolfSSL_BIO_get_len(bp)) <= 0) {
  31915. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  31916. /* No certificate in buffer */
  31917. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  31918. #endif
  31919. return NULL;
  31920. }
  31921. pem = (unsigned char*)XMALLOC(l, 0, DYNAMIC_TYPE_PEM);
  31922. if (pem == NULL)
  31923. return NULL;
  31924. i = 0;
  31925. if (wc_PemGetHeaderFooter(CERT_TYPE, NULL, &footer) != 0) {
  31926. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  31927. return NULL;
  31928. }
  31929. /* TODO: Inefficient
  31930. * reading in one byte at a time until see "END CERTIFICATE"
  31931. */
  31932. while ((l = wolfSSL_BIO_read(bp, (char *)&pem[i], 1)) == 1) {
  31933. i++;
  31934. if (i > 26 && XMEMCMP((char *)&pem[i-26], footer, 25) == 0) {
  31935. if (pem[i-1] == '\r') {
  31936. /* found \r , Windows line ending is \r\n so try to read one
  31937. * more byte for \n, ignoring return value */
  31938. (void)wolfSSL_BIO_read(bp, (char *)&pem[i++], 1);
  31939. }
  31940. break;
  31941. }
  31942. }
  31943. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  31944. if (l == 0)
  31945. WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
  31946. #endif
  31947. pemSz = (int)i;
  31948. x509 = wolfSSL_X509_load_certificate_buffer(pem, pemSz,
  31949. WOLFSSL_FILETYPE_PEM);
  31950. if (x != NULL) {
  31951. *x = x509;
  31952. }
  31953. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  31954. #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
  31955. (void)bp;
  31956. (void)x;
  31957. (void)cb;
  31958. (void)u;
  31959. return x509;
  31960. }
  31961. WOLFSSL_X509_CRL *wolfSSL_PEM_read_bio_X509_CRL(WOLFSSL_BIO *bp,
  31962. WOLFSSL_X509_CRL **x, pem_password_cb *cb, void *u)
  31963. {
  31964. #if defined(WOLFSSL_PEM_TO_DER) && defined(HAVE_CRL)
  31965. unsigned char* pem = NULL;
  31966. int pemSz;
  31967. int derSz;
  31968. DerBuffer* der = NULL;
  31969. WOLFSSL_X509_CRL* crl = NULL;
  31970. if ((pemSz = wolfSSL_BIO_get_len(bp)) <= 0) {
  31971. goto err;
  31972. }
  31973. pem = (unsigned char*)XMALLOC(pemSz, 0, DYNAMIC_TYPE_PEM);
  31974. if (pem == NULL) {
  31975. goto err;
  31976. }
  31977. if (wolfSSL_BIO_read(bp, pem, pemSz) != pemSz) {
  31978. goto err;
  31979. }
  31980. if((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
  31981. goto err;
  31982. }
  31983. derSz = der->length;
  31984. if((crl = wolfSSL_d2i_X509_CRL(x, der->buffer, derSz)) == NULL) {
  31985. goto err;
  31986. }
  31987. err:
  31988. if(pem != NULL) {
  31989. XFREE(pem, 0, DYNAMIC_TYPE_PEM);
  31990. }
  31991. if(der != NULL) {
  31992. FreeDer(&der);
  31993. }
  31994. (void)cb;
  31995. (void)u;
  31996. return crl;
  31997. #else
  31998. (void)bp;
  31999. (void)x;
  32000. (void)cb;
  32001. (void)u;
  32002. return NULL;
  32003. #endif
  32004. }
  32005. #if !defined(NO_FILESYSTEM)
  32006. static void* wolfSSL_PEM_read_X509_ex(XFILE fp, void **x,
  32007. pem_password_cb *cb, void *u, int type)
  32008. {
  32009. unsigned char* pem = NULL;
  32010. int pemSz;
  32011. long i = 0, l;
  32012. void *newx509;
  32013. int derSz;
  32014. DerBuffer* der = NULL;
  32015. WOLFSSL_ENTER("wolfSSL_PEM_read_X509");
  32016. if (fp == XBADFILE) {
  32017. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  32018. return NULL;
  32019. }
  32020. /* Read cert from file */
  32021. i = XFTELL(fp);
  32022. if (i < 0) {
  32023. WOLFSSL_LEAVE("wolfSSL_PEM_read_X509", BAD_FUNC_ARG);
  32024. return NULL;
  32025. }
  32026. if (XFSEEK(fp, 0, XSEEK_END) != 0)
  32027. return NULL;
  32028. l = XFTELL(fp);
  32029. if (l < 0)
  32030. return NULL;
  32031. if (XFSEEK(fp, i, SEEK_SET) != 0)
  32032. return NULL;
  32033. pemSz = (int)(l - i);
  32034. /* check calculated length */
  32035. if (pemSz > MAX_WOLFSSL_FILE_SIZE || pemSz < 0) {
  32036. WOLFSSL_MSG("PEM_read_X509_ex file size error");
  32037. return NULL;
  32038. }
  32039. /* allocate pem buffer */
  32040. pem = (unsigned char*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_PEM);
  32041. if (pem == NULL)
  32042. return NULL;
  32043. if ((int)XFREAD((char *)pem, 1, pemSz, fp) != pemSz)
  32044. goto err_exit;
  32045. switch (type) {
  32046. case CERT_TYPE:
  32047. newx509 = (void *)wolfSSL_X509_load_certificate_buffer(pem,
  32048. pemSz, WOLFSSL_FILETYPE_PEM);
  32049. break;
  32050. #ifdef HAVE_CRL
  32051. case CRL_TYPE:
  32052. if ((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0)
  32053. goto err_exit;
  32054. derSz = der->length;
  32055. newx509 = (void*)wolfSSL_d2i_X509_CRL((WOLFSSL_X509_CRL **)x,
  32056. (const unsigned char *)der->buffer, derSz);
  32057. if (newx509 == NULL)
  32058. goto err_exit;
  32059. FreeDer(&der);
  32060. break;
  32061. #endif
  32062. default:
  32063. goto err_exit;
  32064. }
  32065. if (x != NULL) {
  32066. *x = newx509;
  32067. }
  32068. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  32069. return newx509;
  32070. err_exit:
  32071. if (pem != NULL)
  32072. XFREE(pem, NULL, DYNAMIC_TYPE_PEM);
  32073. if (der != NULL)
  32074. FreeDer(&der);
  32075. /* unused */
  32076. (void)cb;
  32077. (void)u;
  32078. (void)derSz;
  32079. return NULL;
  32080. }
  32081. WOLFSSL_API WOLFSSL_X509* wolfSSL_PEM_read_X509(XFILE fp, WOLFSSL_X509 **x,
  32082. pem_password_cb *cb, void *u)
  32083. {
  32084. return (WOLFSSL_X509* )wolfSSL_PEM_read_X509_ex(fp, (void **)x, cb, u, CERT_TYPE);
  32085. }
  32086. #if defined(HAVE_CRL)
  32087. WOLFSSL_API WOLFSSL_X509_CRL* wolfSSL_PEM_read_X509_CRL(XFILE fp, WOLFSSL_X509_CRL **crl,
  32088. pem_password_cb *cb, void *u)
  32089. {
  32090. return (WOLFSSL_X509_CRL* )wolfSSL_PEM_read_X509_ex(fp, (void **)crl, cb, u, CRL_TYPE);
  32091. }
  32092. #endif
  32093. int wolfSSL_PEM_write_X509(XFILE fp, WOLFSSL_X509* x)
  32094. {
  32095. int ret;
  32096. WOLFSSL_BIO* bio;
  32097. if (x == NULL)
  32098. return 0;
  32099. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  32100. if (bio == NULL)
  32101. return 0;
  32102. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  32103. wolfSSL_BIO_free(bio);
  32104. bio = NULL;
  32105. }
  32106. ret = wolfSSL_PEM_write_bio_X509(bio, x);
  32107. if (bio != NULL)
  32108. wolfSSL_BIO_free(bio);
  32109. return ret;
  32110. }
  32111. #endif /* !NO_FILESYSTEM */
  32112. #define PEM_BEGIN "-----BEGIN "
  32113. #define PEM_BEGIN_SZ 11
  32114. #define PEM_END "-----END "
  32115. #define PEM_END_SZ 9
  32116. #define PEM_HDR_FIN "-----"
  32117. #define PEM_HDR_FIN_SZ 5
  32118. #define PEM_HDR_FIN_EOL_NEWLINE "-----\n"
  32119. #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0"
  32120. #define PEM_HDR_FIN_EOL_SZ 6
  32121. int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header,
  32122. unsigned char **data, long *len)
  32123. {
  32124. int ret = WOLFSSL_SUCCESS;
  32125. char pem[256];
  32126. int pemLen;
  32127. char* p;
  32128. char* nameStr = NULL;
  32129. int nameLen = 0;
  32130. char* headerStr = NULL;
  32131. int headerLen;
  32132. int headerFound = 0;
  32133. unsigned char* der = NULL;
  32134. word32 derLen = 0;
  32135. if (bio == NULL || name == NULL || header == NULL || data == NULL ||
  32136. len == NULL) {
  32137. return WOLFSSL_FAILURE;
  32138. }
  32139. /* Find header line. */
  32140. pem[sizeof(pem) - 1] = '\0';
  32141. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  32142. if (XSTRNCMP(pem, PEM_BEGIN, PEM_BEGIN_SZ) == 0)
  32143. break;
  32144. }
  32145. if (pemLen <= 0)
  32146. ret = WOLFSSL_FAILURE;
  32147. /* Have a header line. */
  32148. if (ret == WOLFSSL_SUCCESS) {
  32149. while (pem[pemLen - 1] == '\r' || pem[pemLen - 1] == '\n')
  32150. pemLen--;
  32151. pem[pemLen] = '\0';
  32152. if (XSTRNCMP(pem + pemLen - PEM_HDR_FIN_SZ, PEM_HDR_FIN,
  32153. PEM_HDR_FIN_SZ) != 0) {
  32154. ret = WOLFSSL_FAILURE;
  32155. }
  32156. }
  32157. /* Get out name. */
  32158. if (ret == WOLFSSL_SUCCESS) {
  32159. nameLen = pemLen - PEM_BEGIN_SZ - PEM_HDR_FIN_SZ;
  32160. nameStr = (char*)XMALLOC(nameLen + 1, NULL,
  32161. DYNAMIC_TYPE_TMP_BUFFER);
  32162. if (nameStr == NULL)
  32163. ret = WOLFSSL_FAILURE;
  32164. }
  32165. if (ret == WOLFSSL_SUCCESS) {
  32166. XSTRNCPY(nameStr, pem + PEM_BEGIN_SZ, nameLen);
  32167. nameStr[nameLen] = '\0';
  32168. /* Get header of PEM - encryption header. */
  32169. headerLen = 0;
  32170. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  32171. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  32172. pem[pemLen - 1] == '\n')) {
  32173. pemLen--;
  32174. }
  32175. pem[pemLen++] = '\n';
  32176. pem[pemLen] = '\0';
  32177. /* Header separator is a blank line. */
  32178. if (pem[0] == '\n') {
  32179. headerFound = 1;
  32180. break;
  32181. }
  32182. /* Didn't find a blank line - no header. */
  32183. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) {
  32184. der = (unsigned char*)headerStr;
  32185. derLen = headerLen;
  32186. /* Empty header - empty string. */
  32187. headerStr = (char*)XMALLOC(1, NULL,
  32188. DYNAMIC_TYPE_TMP_BUFFER);
  32189. if (headerStr == NULL)
  32190. ret = WOLFSSL_FAILURE;
  32191. else
  32192. headerStr[0] = '\0';
  32193. break;
  32194. }
  32195. p = (char*)XREALLOC(headerStr, headerLen + pemLen + 1, NULL,
  32196. DYNAMIC_TYPE_TMP_BUFFER);
  32197. if (p == NULL) {
  32198. ret = WOLFSSL_FAILURE;
  32199. break;
  32200. }
  32201. headerStr = p;
  32202. XMEMCPY(headerStr + headerLen, pem, pemLen + 1);
  32203. headerLen += pemLen;
  32204. }
  32205. if (pemLen <= 0)
  32206. ret = WOLFSSL_FAILURE;
  32207. }
  32208. /* Get body of PEM - if there was a header */
  32209. if (ret == WOLFSSL_SUCCESS && headerFound) {
  32210. derLen = 0;
  32211. while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) {
  32212. while (pemLen > 0 && (pem[pemLen - 1] == '\r' ||
  32213. pem[pemLen - 1] == '\n')) {
  32214. pemLen--;
  32215. }
  32216. pem[pemLen++] = '\n';
  32217. pem[pemLen] = '\0';
  32218. if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0)
  32219. break;
  32220. p = (char*)XREALLOC(der, derLen + pemLen + 1, NULL,
  32221. DYNAMIC_TYPE_TMP_BUFFER);
  32222. if (p == NULL) {
  32223. ret = WOLFSSL_FAILURE;
  32224. break;
  32225. }
  32226. der = (unsigned char*)p;
  32227. XMEMCPY(der + derLen, pem, pemLen + 1);
  32228. derLen += pemLen;
  32229. }
  32230. if (pemLen <= 0)
  32231. ret = WOLFSSL_FAILURE;
  32232. }
  32233. /* Check trailer. */
  32234. if (ret == WOLFSSL_SUCCESS) {
  32235. if (XSTRNCMP(pem + PEM_END_SZ, nameStr, nameLen) != 0)
  32236. ret = WOLFSSL_FAILURE;
  32237. }
  32238. if (ret == WOLFSSL_SUCCESS) {
  32239. if (XSTRNCMP(pem + PEM_END_SZ + nameLen,
  32240. PEM_HDR_FIN_EOL_NEWLINE,
  32241. PEM_HDR_FIN_EOL_SZ) != 0 &&
  32242. XSTRNCMP(pem + PEM_END_SZ + nameLen,
  32243. PEM_HDR_FIN_EOL_NULL_TERM,
  32244. PEM_HDR_FIN_EOL_SZ) != 0) {
  32245. ret = WOLFSSL_FAILURE;
  32246. }
  32247. }
  32248. /* Base64 decode body. */
  32249. if (ret == WOLFSSL_SUCCESS) {
  32250. if (Base64_Decode(der, derLen, der, &derLen) != 0)
  32251. ret = WOLFSSL_FAILURE;
  32252. }
  32253. if (ret == WOLFSSL_SUCCESS) {
  32254. *name = nameStr;
  32255. *header = headerStr;
  32256. *data = der;
  32257. *len = derLen;
  32258. nameStr = NULL;
  32259. headerStr = NULL;
  32260. der = NULL;
  32261. }
  32262. if (nameStr != NULL)
  32263. XFREE(nameStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32264. if (headerStr != NULL)
  32265. XFREE(headerStr, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32266. if (der != NULL)
  32267. XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32268. return ret;
  32269. }
  32270. int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name,
  32271. const char *header, const unsigned char *data,
  32272. long len)
  32273. {
  32274. int err = 0;
  32275. int outSz = 0;
  32276. int nameLen;
  32277. int headerLen;
  32278. byte* pem = NULL;
  32279. word32 pemLen;
  32280. word32 derLen = (word32)len;
  32281. if (bio == NULL || name == NULL || header == NULL || data == NULL)
  32282. return 0;
  32283. nameLen = (int)XSTRLEN(name);
  32284. headerLen = (int)XSTRLEN(header);
  32285. pemLen = (derLen + 2) / 3 * 4;
  32286. pemLen += (pemLen + 63) / 64;
  32287. pem = (byte*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32288. err = pem == NULL;
  32289. if (!err)
  32290. err = Base64_Encode(data, derLen, pem, &pemLen) != 0;
  32291. if (!err) {
  32292. err = wolfSSL_BIO_write(bio, PEM_BEGIN, PEM_BEGIN_SZ) !=
  32293. (int)PEM_BEGIN_SZ;
  32294. }
  32295. if (!err)
  32296. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  32297. if (!err) {
  32298. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  32299. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  32300. }
  32301. if (!err && headerLen > 0) {
  32302. err = wolfSSL_BIO_write(bio, header, headerLen) != headerLen;
  32303. /* Blank line after a header and before body. */
  32304. if (!err)
  32305. err = wolfSSL_BIO_write(bio, "\n", 1) != 1;
  32306. headerLen++;
  32307. }
  32308. if (!err)
  32309. err = wolfSSL_BIO_write(bio, pem, pemLen) != (int)pemLen;
  32310. if (!err)
  32311. err = wolfSSL_BIO_write(bio, PEM_END, PEM_END_SZ) !=
  32312. (int)PEM_END_SZ;
  32313. if (!err)
  32314. err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen;
  32315. if (!err) {
  32316. err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE,
  32317. PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ;
  32318. }
  32319. if (!err) {
  32320. outSz = PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ + headerLen +
  32321. pemLen + PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ;
  32322. }
  32323. if (pem != NULL)
  32324. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32325. return outSz;
  32326. }
  32327. #if !defined(NO_FILESYSTEM)
  32328. int wolfSSL_PEM_read(XFILE fp, char **name, char **header,
  32329. unsigned char **data, long *len)
  32330. {
  32331. int ret;
  32332. WOLFSSL_BIO* bio;
  32333. if (name == NULL || header == NULL || data == NULL || len == NULL)
  32334. return WOLFSSL_FAILURE;
  32335. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  32336. if (bio == NULL)
  32337. return 0;
  32338. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  32339. wolfSSL_BIO_free(bio);
  32340. bio = NULL;
  32341. }
  32342. ret = wolfSSL_PEM_read_bio(bio, name, header, data, len);
  32343. if (bio != NULL)
  32344. wolfSSL_BIO_free(bio);
  32345. return ret;
  32346. }
  32347. int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header,
  32348. const unsigned char *data, long len)
  32349. {
  32350. int ret;
  32351. WOLFSSL_BIO* bio;
  32352. if (name == NULL || header == NULL || data == NULL)
  32353. return 0;
  32354. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  32355. if (bio == NULL)
  32356. return 0;
  32357. if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
  32358. wolfSSL_BIO_free(bio);
  32359. bio = NULL;
  32360. }
  32361. ret = wolfSSL_PEM_write_bio(bio, name, header, data, len);
  32362. if (bio != NULL)
  32363. wolfSSL_BIO_free(bio);
  32364. return ret;
  32365. }
  32366. #endif
  32367. int wolfSSL_PEM_get_EVP_CIPHER_INFO(char* header, EncryptedInfo* cipher)
  32368. {
  32369. if (header == NULL || cipher == NULL)
  32370. return WOLFSSL_FAILURE;
  32371. XMEMSET(cipher, 0, sizeof(*cipher));
  32372. if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0)
  32373. return WOLFSSL_FAILURE;
  32374. return WOLFSSL_SUCCESS;
  32375. }
  32376. int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data,
  32377. long* len, pem_password_cb* callback, void* ctx)
  32378. {
  32379. int ret = WOLFSSL_SUCCESS;
  32380. char password[NAME_SZ];
  32381. int passwordSz;
  32382. if (cipher == NULL || data == NULL || len == NULL || callback == NULL)
  32383. return WOLFSSL_FAILURE;
  32384. passwordSz = callback(password, sizeof(password), PEM_PASS_READ, ctx);
  32385. if (passwordSz < 0)
  32386. ret = WOLFSSL_FAILURE;
  32387. if (ret == WOLFSSL_SUCCESS) {
  32388. if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password,
  32389. passwordSz, WC_MD5) != 0) {
  32390. ret = WOLFSSL_FAILURE;
  32391. }
  32392. }
  32393. if (passwordSz > 0)
  32394. XMEMSET(password, 0, passwordSz);
  32395. return ret;
  32396. }
  32397. /*
  32398. * bp : bio to read X509 from
  32399. * x : x509 to write to
  32400. * cb : password call back for reading PEM
  32401. * u : password
  32402. * _AUX is for working with a trusted X509 certificate
  32403. */
  32404. WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp,
  32405. WOLFSSL_X509 **x, pem_password_cb *cb, void *u) {
  32406. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
  32407. /* AUX info is; trusted/rejected uses, friendly name, private key id,
  32408. * and potentially a stack of "other" info. wolfSSL does not store
  32409. * friendly name or private key id yet in WOLFSSL_X509 for human
  32410. * readability and does not support extra trusted/rejected uses for
  32411. * root CA. */
  32412. return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
  32413. }
  32414. #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
  32415. #ifdef OPENSSL_ALL
  32416. /* create and return a new WOLFSSL_X509_PKEY structure or NULL on failure */
  32417. static WOLFSSL_X509_PKEY* wolfSSL_X509_PKEY_new(void* heap)
  32418. {
  32419. WOLFSSL_X509_PKEY* ret;
  32420. ret = (WOLFSSL_X509_PKEY*)XMALLOC(sizeof(WOLFSSL_X509_PKEY), heap,
  32421. DYNAMIC_TYPE_KEY);
  32422. if (ret != NULL) {
  32423. XMEMSET(ret, 0, sizeof(WOLFSSL_X509_PKEY));
  32424. ret->heap = heap;
  32425. }
  32426. return ret;
  32427. }
  32428. /* sets the values of X509_PKEY based on certificate passed in
  32429. * return WOLFSSL_SUCCESS on success */
  32430. static int wolfSSL_X509_PKEY_set(WOLFSSL_X509_PKEY* xPkey,
  32431. WOLFSSL_X509* x509)
  32432. {
  32433. if (xPkey == NULL || x509 == NULL) {
  32434. return BAD_FUNC_ARG;
  32435. }
  32436. wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
  32437. xPkey->dec_pkey = wolfSSL_X509_get_pubkey(x509);
  32438. if (xPkey->dec_pkey == NULL) {
  32439. return WOLFSSL_FAILURE;
  32440. }
  32441. return WOLFSSL_SUCCESS;
  32442. }
  32443. /* free up all memory used by "xPkey" passed in */
  32444. static void wolfSSL_X509_PKEY_free(WOLFSSL_X509_PKEY* xPkey)
  32445. {
  32446. if (xPkey != NULL) {
  32447. wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
  32448. }
  32449. XFREE(xPkey, xPkey->heap, DYNAMIC_TYPE_KEY);
  32450. }
  32451. /* Takes control of x509 on success
  32452. * helper function to break out code needed to set WOLFSSL_X509_INFO up
  32453. * free's "info" passed in if is not defaults
  32454. *
  32455. * returns WOLFSSL_SUCCESS on success
  32456. */
  32457. static int wolfSSL_X509_INFO_set(WOLFSSL_X509_INFO* info,
  32458. WOLFSSL_X509* x509)
  32459. {
  32460. if (info == NULL || x509 == NULL) {
  32461. return BAD_FUNC_ARG;
  32462. }
  32463. /* check is fresh "info" passed in, if not free it */
  32464. if (info->x509 != NULL || info->x_pkey != NULL) {
  32465. WOLFSSL_X509_INFO* tmp;
  32466. tmp = wolfSSL_X509_INFO_new();
  32467. if (tmp == NULL) {
  32468. WOLFSSL_MSG("Unable to create new structure");
  32469. return MEMORY_E;
  32470. }
  32471. wolfSSL_X509_INFO_free(info);
  32472. info = tmp;
  32473. }
  32474. info->x509 = x509;
  32475. //@TODO info->num
  32476. //@TODO info->enc_cipher
  32477. //@TODO info->enc_len
  32478. //@TODO info->enc_data
  32479. //@TODO info->crl
  32480. info->x_pkey = wolfSSL_X509_PKEY_new(x509->heap);
  32481. return wolfSSL_X509_PKEY_set(info->x_pkey, x509);
  32482. }
  32483. /*
  32484. * bio WOLFSSL_BIO to read certificates from
  32485. * sk possible stack to push more X509_INFO structs to. Can be NULL
  32486. * cb callback password for encrypted PEM certificates
  32487. * u user input such as password
  32488. *
  32489. * returns stack on success and NULL or default stack passed in on fail
  32490. */
  32491. WOLF_STACK_OF(WOLFSSL_X509_INFO)* wolfSSL_PEM_X509_INFO_read_bio(
  32492. WOLFSSL_BIO* bio, WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  32493. pem_password_cb* cb, void* u)
  32494. {
  32495. WOLF_STACK_OF(WOLFSSL_X509_INFO)* localSk;
  32496. WOLFSSL_X509* x509 = NULL;
  32497. int ret = WOLFSSL_SUCCESS;
  32498. WOLFSSL_ENTER("wolfSSL_PEM_X509_INFO_read_bio");
  32499. /* attempt to used passed in stack or create a new one */
  32500. if (sk != NULL) {
  32501. localSk = sk;
  32502. }
  32503. else {
  32504. localSk = wolfSSL_sk_X509_INFO_new_null();
  32505. }
  32506. if (localSk == NULL) {
  32507. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", MEMORY_E);
  32508. return NULL;
  32509. }
  32510. /* parse through BIO and push new info's found onto stack */
  32511. do {
  32512. x509 = wolfSSL_PEM_read_bio_X509(bio, NULL, cb, u);
  32513. if (x509 != NULL) {
  32514. WOLFSSL_X509_INFO* current;
  32515. current = wolfSSL_X509_INFO_new();
  32516. if (current == NULL) {
  32517. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", MEMORY_E);
  32518. return NULL;
  32519. }
  32520. ret = wolfSSL_X509_INFO_set(current, x509);
  32521. if (ret != WOLFSSL_SUCCESS) {
  32522. wolfSSL_X509_free(x509);
  32523. }
  32524. else {
  32525. wolfSSL_sk_X509_INFO_push(localSk, current);
  32526. }
  32527. }
  32528. } while (x509 != NULL && ret == WOLFSSL_SUCCESS);
  32529. WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", ret);
  32530. return localSk;
  32531. }
  32532. #endif /* OPENSSL_ALL */
  32533. void wolfSSL_X509_NAME_ENTRY_free(WOLFSSL_X509_NAME_ENTRY* ne)
  32534. {
  32535. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_free");
  32536. if (ne != NULL) {
  32537. wolfSSL_ASN1_OBJECT_free(&ne->object);
  32538. if (ne->value != NULL) {
  32539. wolfSSL_ASN1_STRING_free(ne->value);
  32540. }
  32541. XFREE(ne, NULL, DYNAMIC_TYPE_NAME_ENTRY);
  32542. }
  32543. }
  32544. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_new(void)
  32545. {
  32546. WOLFSSL_X509_NAME_ENTRY* ne;
  32547. ne = (WOLFSSL_X509_NAME_ENTRY*)XMALLOC(sizeof(WOLFSSL_X509_NAME_ENTRY),
  32548. NULL, DYNAMIC_TYPE_NAME_ENTRY);
  32549. if (ne != NULL) {
  32550. XMEMSET(ne, 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  32551. }
  32552. return ne;
  32553. }
  32554. /* Create a new WOLFSSL_X509_NAME_ENTRY structure based on the text passed
  32555. * in. Returns NULL on failure */
  32556. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_txt(
  32557. WOLFSSL_X509_NAME_ENTRY **neIn, const char *txt, int type,
  32558. const unsigned char *data, int dataSz)
  32559. {
  32560. int nid = -1;
  32561. WOLFSSL_X509_NAME_ENTRY* ne = NULL;
  32562. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_txt()");
  32563. if (txt == NULL) {
  32564. return NULL;
  32565. }
  32566. if (neIn != NULL) {
  32567. ne = *neIn;
  32568. }
  32569. nid = wolfSSL_OBJ_txt2nid(txt);
  32570. if (nid == NID_undef) {
  32571. WOLFSSL_MSG("Unable to find text");
  32572. ne = NULL;
  32573. }
  32574. else {
  32575. if (ne == NULL) {
  32576. ne = wolfSSL_X509_NAME_ENTRY_new();
  32577. if (ne == NULL) {
  32578. return NULL;
  32579. }
  32580. }
  32581. ne->nid = nid;
  32582. wolfSSL_OBJ_nid2obj_ex(nid, &ne->object);
  32583. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  32584. if (ne->value != NULL) {
  32585. wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz);
  32586. ne->set = 1;
  32587. }
  32588. }
  32589. return ne;
  32590. }
  32591. /* Creates a new entry given the NID, type, and data
  32592. * "dataSz" is number of bytes in data, if set to -1 then XSTRLEN is used
  32593. * "out" can be used to store the new entry data in an existing structure
  32594. * if NULL then a new WOLFSSL_X509_NAME_ENTRY structure is created
  32595. * returns a pointer to WOLFSSL_X509_NAME_ENTRY on success and NULL on fail
  32596. */
  32597. WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_NID(
  32598. WOLFSSL_X509_NAME_ENTRY** out, int nid, int type,
  32599. const unsigned char* data, int dataSz)
  32600. {
  32601. WOLFSSL_X509_NAME_ENTRY* ne;
  32602. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_NID()");
  32603. if (out == NULL || *out == NULL) {
  32604. ne = wolfSSL_X509_NAME_ENTRY_new();
  32605. if (ne == NULL) {
  32606. return NULL;
  32607. }
  32608. if (out != NULL) {
  32609. *out = ne;
  32610. }
  32611. }
  32612. else {
  32613. ne = *out;
  32614. }
  32615. ne->nid = nid;
  32616. wolfSSL_OBJ_nid2obj_ex(nid, &ne->object);
  32617. ne->value = wolfSSL_ASN1_STRING_type_new(type);
  32618. if (ne->value != NULL) {
  32619. wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz);
  32620. ne->set = 1;
  32621. }
  32622. return ne;
  32623. }
  32624. /* add all entry of type "nid" to the buffer "fullName" and advance "idx"
  32625. * since number of entries is small, a brute force search is used here
  32626. * returns the number of entries added
  32627. */
  32628. static int AddAllEntry(WOLFSSL_X509_NAME* name, char* fullName,
  32629. int fullNameSz, int* idx)
  32630. {
  32631. int i;
  32632. int ret = 0;
  32633. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  32634. if (name->entry[i].set) {
  32635. WOLFSSL_X509_NAME_ENTRY* e;
  32636. WOLFSSL_ASN1_OBJECT* obj;
  32637. int sz;
  32638. unsigned char* data;
  32639. e = &name->entry[i];
  32640. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  32641. if (obj == NULL) {
  32642. return BAD_FUNC_ARG;
  32643. }
  32644. XMEMCPY(fullName + *idx, "/", 1); *idx = *idx + 1;
  32645. sz = (int)XSTRLEN(obj->sName);
  32646. XMEMCPY(fullName + *idx, obj->sName, sz);
  32647. *idx += sz;
  32648. XMEMCPY(fullName + *idx, "=", 1); *idx = *idx + 1;
  32649. data = wolfSSL_ASN1_STRING_data(e->value);
  32650. sz = (int)XSTRLEN((const char*)data);
  32651. XMEMCPY(fullName + *idx, data, sz);
  32652. *idx += sz;
  32653. ret++;
  32654. }
  32655. }
  32656. (void)fullNameSz;
  32657. return ret;
  32658. }
  32659. /* Converts a list of entries in WOLFSSL_X509_NAME struct into a string
  32660. * returns 0 on success */
  32661. static int RebuildFullName(WOLFSSL_X509_NAME* name)
  32662. {
  32663. int totalLen = 0, i, idx, entryCount = 0;
  32664. char* fullName;
  32665. if (name == NULL)
  32666. return BAD_FUNC_ARG;
  32667. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  32668. if (name->entry[i].set) {
  32669. WOLFSSL_X509_NAME_ENTRY* e;
  32670. WOLFSSL_ASN1_OBJECT* obj;
  32671. e = &name->entry[i];
  32672. obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
  32673. if (obj == NULL)
  32674. return BAD_FUNC_ARG;
  32675. totalLen += (int)XSTRLEN(obj->sName) + 2;/*+2 for '/' and '=' */
  32676. totalLen += wolfSSL_ASN1_STRING_length(e->value);
  32677. }
  32678. }
  32679. fullName = (char*)XMALLOC(totalLen + 1, name->heap, DYNAMIC_TYPE_X509);
  32680. if (fullName == NULL)
  32681. return MEMORY_E;
  32682. idx = 0;
  32683. entryCount = AddAllEntry(name, fullName, totalLen, &idx);
  32684. if (entryCount < 0) {
  32685. XFREE(fullName, name->heap, DYNAMIC_TYPE_X509);
  32686. return entryCount;
  32687. }
  32688. if (name->dynamicName) {
  32689. XFREE(name->name, name->heap, DYNAMIC_TYPE_X509);
  32690. }
  32691. fullName[idx] = '\0';
  32692. name->name = fullName;
  32693. name->dynamicName = 1;
  32694. name->sz = idx + 1; /* size includes null terminator */
  32695. name->entrySz = entryCount;
  32696. return 0;
  32697. }
  32698. /* Copies entry into name. With it being copied freeing entry becomes the
  32699. * callers responsibility.
  32700. * returns 1 for success and 0 for error */
  32701. int wolfSSL_X509_NAME_add_entry(WOLFSSL_X509_NAME* name,
  32702. WOLFSSL_X509_NAME_ENTRY* entry, int idx, int set)
  32703. {
  32704. WOLFSSL_X509_NAME_ENTRY* current = NULL;
  32705. int i;
  32706. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry()");
  32707. if (name == NULL || entry == NULL) {
  32708. WOLFSSL_MSG("NULL argument passed in");
  32709. return WOLFSSL_FAILURE;
  32710. }
  32711. if (idx >= 0) {
  32712. /* place in specific index */
  32713. if (idx >= MAX_NAME_ENTRIES) {
  32714. WOLFSSL_MSG("Error index to insert entry is larger than array");
  32715. return WOLFSSL_FAILURE;
  32716. }
  32717. i = idx;
  32718. }
  32719. else {
  32720. /* iterate through and find first open spot */
  32721. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  32722. if (name->entry[i].set != 1) { /* not set so overwritten */
  32723. WOLFSSL_MSG("Found place for name entry");
  32724. break;
  32725. }
  32726. }
  32727. if (i == MAX_NAME_ENTRIES) {
  32728. WOLFSSL_MSG("No spot found for name entry");
  32729. return WOLFSSL_FAILURE;
  32730. }
  32731. }
  32732. if (wolfSSL_ASN1_STRING_length(entry->value) == 0) {
  32733. WOLFSSL_MSG("Entry to add was empty");
  32734. return WOLFSSL_FAILURE;
  32735. }
  32736. current = &(name->entry[i]);
  32737. if (current->set == 0)
  32738. name->entrySz++;
  32739. if (wolfSSL_X509_NAME_ENTRY_create_by_NID(&current,
  32740. entry->nid,
  32741. wolfSSL_ASN1_STRING_type(entry->value),
  32742. wolfSSL_ASN1_STRING_data(entry->value),
  32743. wolfSSL_ASN1_STRING_length(entry->value))
  32744. == NULL) {
  32745. WOLFSSL_MSG("Issue adding the name entry");
  32746. if (current->set == 0)
  32747. name->entrySz--;
  32748. return WOLFSSL_FAILURE;
  32749. }
  32750. if (RebuildFullName(name) != 0)
  32751. return WOLFSSL_FAILURE;
  32752. (void)set;
  32753. return WOLFSSL_SUCCESS;
  32754. }
  32755. int wolfSSL_X509_NAME_add_entry_by_txt(WOLFSSL_X509_NAME *name,
  32756. const char *field, int type,
  32757. const unsigned char *bytes, int len,
  32758. int loc, int set)
  32759. {
  32760. int ret = WOLFSSL_FAILURE;
  32761. int nid;
  32762. WOLFSSL_X509_NAME_ENTRY* entry;
  32763. (void)type;
  32764. WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_txt");
  32765. if (name == NULL || field == NULL)
  32766. return WOLFSSL_FAILURE;
  32767. if ((nid = wolfSSL_OBJ_txt2nid(field)) == NID_undef) {
  32768. WOLFSSL_MSG("Unable convert text to NID");
  32769. return WOLFSSL_FAILURE;
  32770. }
  32771. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL,
  32772. nid, type, (unsigned char*)bytes, len);
  32773. if (entry == NULL)
  32774. return WOLFSSL_FAILURE;
  32775. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  32776. wolfSSL_X509_NAME_ENTRY_free(entry);
  32777. return ret;
  32778. }
  32779. int wolfSSL_X509_NAME_add_entry_by_NID(WOLFSSL_X509_NAME *name, int nid,
  32780. int type, const unsigned char *bytes,
  32781. int len, int loc, int set)
  32782. {
  32783. int ret;
  32784. WOLFSSL_X509_NAME_ENTRY* entry;
  32785. entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes,
  32786. len);
  32787. if (entry == NULL)
  32788. return WOLFSSL_FAILURE;
  32789. ret = wolfSSL_X509_NAME_add_entry(name, entry, loc, set);
  32790. wolfSSL_X509_NAME_ENTRY_free(entry);
  32791. return ret;
  32792. }
  32793. #endif /* !NO_CERTS */
  32794. /* NID variables are dependent on compatibility header files currently
  32795. *
  32796. * returns a pointer to a new WOLFSSL_ASN1_OBJECT struct on success and NULL
  32797. * on fail
  32798. */
  32799. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj(int id)
  32800. {
  32801. return wolfSSL_OBJ_nid2obj_ex(id, NULL);
  32802. }
  32803. WOLFSSL_LOCAL WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_nid2obj_ex(int id,
  32804. WOLFSSL_ASN1_OBJECT* arg_obj)
  32805. {
  32806. word32 oidSz = 0;
  32807. const byte* oid;
  32808. word32 type = 0;
  32809. WOLFSSL_ASN1_OBJECT* obj = arg_obj;
  32810. byte objBuf[MAX_OID_SZ + MAX_LENGTH_SZ + 1]; /* +1 for object tag */
  32811. word32 objSz = 0;
  32812. const char* sName = NULL;
  32813. int i;
  32814. WOLFSSL_ENTER("wolfSSL_OBJ_nid2obj()");
  32815. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  32816. if (wolfssl_object_info[i].nid == id) {
  32817. id = wolfssl_object_info[i].id;
  32818. sName = wolfssl_object_info[i].sName;
  32819. type = wolfssl_object_info[i].type;
  32820. break;
  32821. }
  32822. }
  32823. if (i == (int)WOLFSSL_OBJECT_INFO_SZ) {
  32824. WOLFSSL_MSG("NID not in table");
  32825. #ifdef WOLFSSL_QT
  32826. sName = NULL;
  32827. type = id;
  32828. #else
  32829. return NULL;
  32830. #endif
  32831. }
  32832. #ifdef HAVE_ECC
  32833. if (type == 0 && wc_ecc_get_oid(id, &oid, &oidSz) > 0) {
  32834. type = oidCurveType;
  32835. }
  32836. #endif /* HAVE_ECC */
  32837. if (sName != NULL) {
  32838. if (XSTRLEN(sName) > WOLFSSL_MAX_SNAME - 1) {
  32839. WOLFSSL_MSG("Attempted short name is too large");
  32840. return NULL;
  32841. }
  32842. }
  32843. oid = OidFromId(id, type, &oidSz);
  32844. /* set object ID to buffer */
  32845. if (obj == NULL){
  32846. obj = wolfSSL_ASN1_OBJECT_new();
  32847. if (obj == NULL) {
  32848. WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
  32849. return NULL;
  32850. }
  32851. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
  32852. } else {
  32853. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC;
  32854. }
  32855. obj->type = id;
  32856. obj->grp = type;
  32857. obj->sName[0] = '\0';
  32858. if (sName != NULL) {
  32859. XMEMCPY(obj->sName, (char*)sName, XSTRLEN((char*)sName));
  32860. }
  32861. objBuf[0] = ASN_OBJECT_ID; objSz++;
  32862. objSz += SetLength(oidSz, objBuf + 1);
  32863. XMEMCPY(objBuf + objSz, oid, oidSz);
  32864. objSz += oidSz;
  32865. if (obj->objSz == 0 || objSz != obj->objSz) {
  32866. obj->objSz = objSz;
  32867. if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
  32868. (obj->obj == NULL)) {
  32869. if (obj->obj != NULL)
  32870. XFREE((byte*)obj->obj, NULL, DYNAMIC_TYPE_ASN1);
  32871. obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
  32872. if (obj->obj == NULL) {
  32873. wolfSSL_ASN1_OBJECT_free(obj);
  32874. return NULL;
  32875. }
  32876. obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
  32877. }
  32878. else {
  32879. obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
  32880. }
  32881. }
  32882. XMEMCPY((byte*)obj->obj, objBuf, obj->objSz);
  32883. (void)type;
  32884. return obj;
  32885. }
  32886. static const char* oid_translate_num_to_str(const char* oid)
  32887. {
  32888. const struct oid_dict {
  32889. const char* num;
  32890. const char* desc;
  32891. } oid_dict[] = {
  32892. { "2.5.29.37.0", "Any Extended Key Usage" },
  32893. { "1.3.6.1.5.5.7.3.1", "TLS Web Server Authentication" },
  32894. { "1.3.6.1.5.5.7.3.2", "TLS Web Client Authentication" },
  32895. { "1.3.6.1.5.5.7.3.3", "Code Signing" },
  32896. { "1.3.6.1.5.5.7.3.4", "E-mail Protection" },
  32897. { "1.3.6.1.5.5.7.3.8", "Time Stamping" },
  32898. { "1.3.6.1.5.5.7.3.9", "OCSP Signing" },
  32899. { NULL, NULL }
  32900. };
  32901. const struct oid_dict* idx;
  32902. for (idx = oid_dict; idx->num != NULL; idx++) {
  32903. if (!XSTRNCMP(oid, idx->num, XSTRLEN(idx->num))) {
  32904. return idx->desc;
  32905. }
  32906. }
  32907. return NULL;
  32908. }
  32909. /* if no_name is one than use numerical form otherwise can be short name.
  32910. *
  32911. * returns the buffer size on success
  32912. */
  32913. int wolfSSL_OBJ_obj2txt(char *buf, int bufLen, WOLFSSL_ASN1_OBJECT *a, int no_name)
  32914. {
  32915. int bufSz;
  32916. const char* desc;
  32917. WOLFSSL_ENTER("wolfSSL_OBJ_obj2txt()");
  32918. if (buf == NULL || bufLen <= 1 || a == NULL) {
  32919. WOLFSSL_MSG("Bad input argument");
  32920. return WOLFSSL_FAILURE;
  32921. }
  32922. if (no_name == 1) {
  32923. int length;
  32924. word32 idx = 0;
  32925. byte tag;
  32926. if (GetASNTag(a->obj, &idx, &tag, a->objSz) != 0) {
  32927. return WOLFSSL_FAILURE;
  32928. }
  32929. if (tag != ASN_OBJECT_ID) {
  32930. WOLFSSL_MSG("Bad ASN1 Object");
  32931. return WOLFSSL_FAILURE;
  32932. }
  32933. if (GetLength((const byte*)a->obj, &idx, &length,
  32934. a->objSz) < 0 || length < 0) {
  32935. return ASN_PARSE_E;
  32936. }
  32937. if (bufLen < MAX_OID_STRING_SZ) {
  32938. bufSz = bufLen - 1;
  32939. }
  32940. else {
  32941. bufSz = MAX_OID_STRING_SZ;
  32942. }
  32943. if ((bufSz = DecodePolicyOID(buf, (word32)bufSz, a->obj + idx,
  32944. (word32)length)) <= 0) {
  32945. WOLFSSL_MSG("Error decoding OID");
  32946. return WOLFSSL_FAILURE;
  32947. }
  32948. }
  32949. else { /* return short name */
  32950. if (XSTRLEN(a->sName) + 1 < (word32)bufLen - 1) {
  32951. bufSz = (int)XSTRLEN(a->sName);
  32952. }
  32953. else {
  32954. bufSz = bufLen - 1;
  32955. }
  32956. if (bufSz) {
  32957. XMEMCPY(buf, a->sName, bufSz);
  32958. }
  32959. else if (wolfSSL_OBJ_obj2txt(buf, bufLen, a, 1)) {
  32960. if ((desc = oid_translate_num_to_str(buf))) {
  32961. bufSz = (int)XSTRLEN(desc);
  32962. XMEMCPY(buf, desc, min(bufSz, bufLen));
  32963. }
  32964. }
  32965. else if (a->type == GEN_DNS || a->type == GEN_EMAIL || a->type == GEN_URI) {
  32966. bufSz = (int)XSTRLEN((const char*)a->obj);
  32967. XMEMCPY(buf, a->obj, min(bufSz, bufLen));
  32968. }
  32969. }
  32970. buf[bufSz] = '\0';
  32971. #ifdef WOLFSSL_QT
  32972. /* For unknown extension types, QT expects the short name to be the
  32973. text representation of the oid */
  32974. if (XSTRLEN(a->sName) == 0) {
  32975. XMEMCPY(a->sName, buf, bufSz);
  32976. }
  32977. #endif
  32978. return bufSz;
  32979. }
  32980. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  32981. #if defined(OPENSSL_EXTRA) && !defined(NO_ASN)
  32982. int wolfSSL_X509_NAME_get_index_by_OBJ(WOLFSSL_X509_NAME *name,
  32983. const WOLFSSL_ASN1_OBJECT *obj,
  32984. int idx) {
  32985. if (!name || idx >= MAX_NAME_ENTRIES ||
  32986. !obj || !obj->obj) {
  32987. return -1;
  32988. }
  32989. if (idx < 0) {
  32990. idx = -1;
  32991. }
  32992. for (idx++; idx < MAX_NAME_ENTRIES; idx++) {
  32993. /* Find index of desired name */
  32994. if (name->entry[idx].set) {
  32995. if (XSTRLEN(obj->sName) == XSTRLEN(name->entry[idx].object.sName) &&
  32996. XSTRNCMP((const char*) obj->sName,
  32997. name->entry[idx].object.sName, obj->objSz - 1) == 0) {
  32998. return idx;
  32999. }
  33000. }
  33001. }
  33002. return -1;
  33003. }
  33004. #endif
  33005. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  33006. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  33007. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  33008. defined(WOLFSSL_HAPROXY)
  33009. #ifndef NO_SHA
  33010. /* One shot SHA1 hash of message.
  33011. *
  33012. * d message to hash
  33013. * n size of d buffer
  33014. * md buffer to hold digest. Should be SHA_DIGEST_SIZE.
  33015. *
  33016. * Note: if md is null then a static buffer of SHA_DIGEST_SIZE is used.
  33017. * When the static buffer is used this function is not thread safe.
  33018. *
  33019. * Returns a pointer to the message digest on success and NULL on failure.
  33020. */
  33021. unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n,
  33022. unsigned char *md)
  33023. {
  33024. static byte dig[WC_SHA_DIGEST_SIZE];
  33025. wc_Sha sha;
  33026. WOLFSSL_ENTER("wolfSSL_SHA1");
  33027. if (wc_InitSha_ex(&sha, NULL, 0) != 0) {
  33028. WOLFSSL_MSG("SHA1 Init failed");
  33029. return NULL;
  33030. }
  33031. if (wc_ShaUpdate(&sha, (const byte*)d, (word32)n) != 0) {
  33032. WOLFSSL_MSG("SHA1 Update failed");
  33033. return NULL;
  33034. }
  33035. if (wc_ShaFinal(&sha, dig) != 0) {
  33036. WOLFSSL_MSG("SHA1 Final failed");
  33037. return NULL;
  33038. }
  33039. wc_ShaFree(&sha);
  33040. if (md != NULL) {
  33041. XMEMCPY(md, dig, WC_SHA_DIGEST_SIZE);
  33042. return md;
  33043. }
  33044. else {
  33045. return (unsigned char*)dig;
  33046. }
  33047. }
  33048. #endif /* ! NO_SHA */
  33049. #ifndef NO_SHA256
  33050. /* One shot SHA256 hash of message.
  33051. *
  33052. * d message to hash
  33053. * n size of d buffer
  33054. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  33055. *
  33056. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  33057. * When the static buffer is used this function is not thread safe.
  33058. *
  33059. * Returns a pointer to the message digest on success and NULL on failure.
  33060. */
  33061. unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n,
  33062. unsigned char *md)
  33063. {
  33064. static byte dig[WC_SHA256_DIGEST_SIZE];
  33065. wc_Sha256 sha;
  33066. WOLFSSL_ENTER("wolfSSL_SHA256");
  33067. if (wc_InitSha256_ex(&sha, NULL, 0) != 0) {
  33068. WOLFSSL_MSG("SHA256 Init failed");
  33069. return NULL;
  33070. }
  33071. if (wc_Sha256Update(&sha, (const byte*)d, (word32)n) != 0) {
  33072. WOLFSSL_MSG("SHA256 Update failed");
  33073. return NULL;
  33074. }
  33075. if (wc_Sha256Final(&sha, dig) != 0) {
  33076. WOLFSSL_MSG("SHA256 Final failed");
  33077. return NULL;
  33078. }
  33079. wc_Sha256Free(&sha);
  33080. if (md != NULL) {
  33081. XMEMCPY(md, dig, WC_SHA256_DIGEST_SIZE);
  33082. return md;
  33083. }
  33084. else {
  33085. return (unsigned char*)dig;
  33086. }
  33087. }
  33088. #endif /* ! NO_SHA256 */
  33089. #ifdef WOLFSSL_SHA384
  33090. /* One shot SHA384 hash of message.
  33091. *
  33092. * d message to hash
  33093. * n size of d buffer
  33094. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  33095. *
  33096. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  33097. * When the static buffer is used this function is not thread safe.
  33098. *
  33099. * Returns a pointer to the message digest on success and NULL on failure.
  33100. */
  33101. unsigned char *wolfSSL_SHA384(const unsigned char *d, size_t n,
  33102. unsigned char *md)
  33103. {
  33104. static byte dig[WC_SHA384_DIGEST_SIZE];
  33105. wc_Sha384 sha;
  33106. WOLFSSL_ENTER("wolfSSL_SHA384");
  33107. if (wc_InitSha384_ex(&sha, NULL, 0) != 0) {
  33108. WOLFSSL_MSG("SHA384 Init failed");
  33109. return NULL;
  33110. }
  33111. if (wc_Sha384Update(&sha, (const byte*)d, (word32)n) != 0) {
  33112. WOLFSSL_MSG("SHA384 Update failed");
  33113. return NULL;
  33114. }
  33115. if (wc_Sha384Final(&sha, dig) != 0) {
  33116. WOLFSSL_MSG("SHA384 Final failed");
  33117. return NULL;
  33118. }
  33119. wc_Sha384Free(&sha);
  33120. if (md != NULL) {
  33121. XMEMCPY(md, dig, WC_SHA384_DIGEST_SIZE);
  33122. return md;
  33123. }
  33124. else {
  33125. return (unsigned char*)dig;
  33126. }
  33127. }
  33128. #endif /* WOLFSSL_SHA384 */
  33129. #if defined(WOLFSSL_SHA512)
  33130. /* One shot SHA512 hash of message.
  33131. *
  33132. * d message to hash
  33133. * n size of d buffer
  33134. * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE.
  33135. *
  33136. * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used.
  33137. * When the static buffer is used this function is not thread safe.
  33138. *
  33139. * Returns a pointer to the message digest on success and NULL on failure.
  33140. */
  33141. unsigned char *wolfSSL_SHA512(const unsigned char *d, size_t n,
  33142. unsigned char *md)
  33143. {
  33144. static byte dig[WC_SHA512_DIGEST_SIZE];
  33145. wc_Sha512 sha;
  33146. WOLFSSL_ENTER("wolfSSL_SHA512");
  33147. if (wc_InitSha512_ex(&sha, NULL, 0) != 0) {
  33148. WOLFSSL_MSG("SHA512 Init failed");
  33149. return NULL;
  33150. }
  33151. if (wc_Sha512Update(&sha, (const byte*)d, (word32)n) != 0) {
  33152. WOLFSSL_MSG("SHA512 Update failed");
  33153. return NULL;
  33154. }
  33155. if (wc_Sha512Final(&sha, dig) != 0) {
  33156. WOLFSSL_MSG("SHA512 Final failed");
  33157. return NULL;
  33158. }
  33159. wc_Sha512Free(&sha);
  33160. if (md != NULL) {
  33161. XMEMCPY(md, dig, WC_SHA512_DIGEST_SIZE);
  33162. return md;
  33163. }
  33164. else {
  33165. return (unsigned char*)dig;
  33166. }
  33167. }
  33168. #endif /* WOLFSSL_SHA512 */
  33169. #endif /* OPENSSL_EXTRA */
  33170. #ifndef WOLFCRYPT_ONLY
  33171. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  33172. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  33173. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  33174. defined(WOLFSSL_HAPROXY)
  33175. char wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x)
  33176. {
  33177. int ret;
  33178. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate");
  33179. FreeDer(&ctx->certificate); /* Make sure previous is free'd */
  33180. ret = AllocDer(&ctx->certificate, x->derCert->length, CERT_TYPE,
  33181. ctx->heap);
  33182. if (ret != 0)
  33183. return 0;
  33184. XMEMCPY(ctx->certificate->buffer, x->derCert->buffer,
  33185. x->derCert->length);
  33186. #ifdef KEEP_OUR_CERT
  33187. if (ctx->ourCert != NULL && ctx->ownOurCert) {
  33188. FreeX509(ctx->ourCert);
  33189. XFREE(ctx->ourCert, ctx->heap, DYNAMIC_TYPE_X509);
  33190. }
  33191. #ifndef WOLFSSL_X509_STORE_CERTS
  33192. ctx->ourCert = x;
  33193. #else
  33194. ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length);
  33195. if(ctx->ourCert == NULL){
  33196. return 0;
  33197. }
  33198. #endif
  33199. ctx->ownOurCert = 0;
  33200. #endif
  33201. /* Update the available options with public keys. */
  33202. switch (x->pubKeyOID) {
  33203. case RSAk:
  33204. ctx->haveRSA = 1;
  33205. break;
  33206. #ifdef HAVE_ED25519
  33207. case ED25519k:
  33208. #endif
  33209. #ifdef HAVE_ED448
  33210. case ED448k:
  33211. #endif
  33212. case ECDSAk:
  33213. ctx->haveECC = 1;
  33214. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  33215. ctx->pkCurveOID = x->pkCurveOID;
  33216. #endif
  33217. break;
  33218. }
  33219. return WOLFSSL_SUCCESS;
  33220. }
  33221. int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509)
  33222. {
  33223. int ret;
  33224. if (ctx == NULL || x509 == NULL || x509->derCert == NULL) {
  33225. return WOLFSSL_FAILURE;
  33226. }
  33227. ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer,
  33228. x509->derCert->length, WOLFSSL_FILETYPE_ASN1);
  33229. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  33230. }
  33231. int wolfSSL_BIO_read_filename(WOLFSSL_BIO *b, const char *name) {
  33232. #ifndef NO_FILESYSTEM
  33233. XFILE fp;
  33234. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  33235. if ((wolfSSL_BIO_get_fp(b, &fp) == WOLFSSL_SUCCESS) && (fp != XBADFILE))
  33236. {
  33237. XFCLOSE(fp);
  33238. }
  33239. fp = XFOPEN(name, "r");
  33240. if (fp == XBADFILE)
  33241. return WOLFSSL_BAD_FILE;
  33242. if (wolfSSL_BIO_set_fp(b, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  33243. XFCLOSE(fp);
  33244. return WOLFSSL_BAD_FILE;
  33245. }
  33246. /* file is closed when bio is free'd */
  33247. return WOLFSSL_SUCCESS;
  33248. #else
  33249. (void)name;
  33250. (void)b;
  33251. return WOLFSSL_NOT_IMPLEMENTED;
  33252. #endif
  33253. }
  33254. /* Return the corresponding short name for the nid <n>.
  33255. * or NULL if short name can't be found.
  33256. */
  33257. const char * wolfSSL_OBJ_nid2sn(int n) {
  33258. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  33259. size_t i;
  33260. WOLFSSL_ENTER("wolfSSL_OBJ_nid2sn");
  33261. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  33262. if (obj_info->nid == n) {
  33263. return obj_info->sName;
  33264. }
  33265. }
  33266. WOLFSSL_MSG("SN not found");
  33267. return NULL;
  33268. }
  33269. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  33270. int wolfSSL_OBJ_sn2nid(const char *sn) {
  33271. WOLFSSL_ENTER("wolfSSL_OBJ_sn2nid");
  33272. if (sn == NULL)
  33273. return NID_undef;
  33274. return wc_OBJ_sn2nid(sn);
  33275. }
  33276. #endif
  33277. /* Gets the NID value that corresponds with the ASN1 object.
  33278. *
  33279. * o ASN1 object to get NID of
  33280. *
  33281. * Return NID on success and a negative value on failure
  33282. */
  33283. int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o)
  33284. {
  33285. word32 oid = 0;
  33286. word32 idx = 0;
  33287. WOLFSSL_ENTER("wolfSSL_OBJ_obj2nid");
  33288. if (o == NULL) {
  33289. return -1;
  33290. }
  33291. #ifdef WOLFSSL_QT
  33292. if (o->grp == oidCertExtType) {
  33293. /* If nid is an unknown extension, return NID_undef */
  33294. if (wolfSSL_OBJ_nid2sn(o->nid) == NULL)
  33295. return NID_undef;
  33296. }
  33297. #endif
  33298. if (o->nid > 0)
  33299. return o->nid;
  33300. if (GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz) < 0) {
  33301. WOLFSSL_MSG("Issue getting OID of object");
  33302. return -1;
  33303. }
  33304. return oid2nid(oid, o->grp);
  33305. }
  33306. /* Returns the long name that corresponds with an ASN1_OBJECT nid value.
  33307. * n : NID value of ASN1_OBJECT to search */
  33308. const char* wolfSSL_OBJ_nid2ln(int n)
  33309. {
  33310. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  33311. size_t i;
  33312. WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln");
  33313. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  33314. if (obj_info->nid == n) {
  33315. return obj_info->lName;
  33316. }
  33317. }
  33318. WOLFSSL_MSG("NID not found in table");
  33319. return NULL;
  33320. }
  33321. /* Return the corresponding NID for the long name <ln>
  33322. * or NID_undef if NID can't be found.
  33323. */
  33324. int wolfSSL_OBJ_ln2nid(const char *ln)
  33325. {
  33326. const WOLFSSL_ObjectInfo *obj_info = wolfssl_object_info;
  33327. size_t i, lnlen;
  33328. WOLFSSL_ENTER("wolfSSL_OBJ_ln2nid");
  33329. if (ln && (lnlen = XSTRLEN(ln)) > 0) {
  33330. /* Accept input like "/commonName=" */
  33331. if (ln[0] == '/') {
  33332. ln++;
  33333. lnlen--;
  33334. }
  33335. if (lnlen) {
  33336. if (ln[lnlen-1] == '=') {
  33337. lnlen--;
  33338. }
  33339. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++, obj_info++) {
  33340. if (lnlen == XSTRLEN(obj_info->lName) &&
  33341. XSTRNCMP(ln, obj_info->lName, lnlen) == 0) {
  33342. return obj_info->nid;
  33343. }
  33344. }
  33345. }
  33346. }
  33347. return NID_undef;
  33348. }
  33349. /* compares two objects, return 0 if equal */
  33350. int wolfSSL_OBJ_cmp(const WOLFSSL_ASN1_OBJECT* a,
  33351. const WOLFSSL_ASN1_OBJECT* b)
  33352. {
  33353. WOLFSSL_ENTER("wolfSSL_OBJ_cmp");
  33354. if (a != NULL && b != NULL &&
  33355. a->obj != NULL && b->obj != NULL &&
  33356. a->objSz == b->objSz) {
  33357. return XMEMCMP(a->obj, b->obj, a->objSz);
  33358. }
  33359. return WOLFSSL_FATAL_ERROR;
  33360. }
  33361. #endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
  33362. WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */
  33363. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  33364. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  33365. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  33366. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  33367. /* Gets the NID value that is related to the OID string passed in. Example
  33368. * string would be "2.5.29.14" for subject key ID.
  33369. *
  33370. * returns NID value on success and NID_undef on error
  33371. */
  33372. int wolfSSL_OBJ_txt2nid(const char* s)
  33373. {
  33374. unsigned int i;
  33375. #ifdef WOLFSSL_CERT_EXT
  33376. int ret;
  33377. unsigned int sum = 0;
  33378. unsigned int outSz = MAX_OID_SZ;
  33379. unsigned char out[MAX_OID_SZ];
  33380. #endif
  33381. WOLFSSL_ENTER("OBJ_txt2nid");
  33382. if (s == NULL) {
  33383. return NID_undef;
  33384. }
  33385. #ifdef WOLFSSL_CERT_EXT
  33386. ret = EncodePolicyOID(out, &outSz, s, NULL);
  33387. if (ret == 0) {
  33388. /* sum OID */
  33389. for (i = 0; i < outSz; i++) {
  33390. sum += out[i];
  33391. }
  33392. }
  33393. #endif /* WOLFSSL_CERT_EXT */
  33394. /* get the group that the OID's sum is in
  33395. * @TODO possible conflict with multiples */
  33396. for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
  33397. int len;
  33398. #ifdef WOLFSSL_CERT_EXT
  33399. if (ret == 0) {
  33400. if (wolfssl_object_info[i].id == (int)sum) {
  33401. return wolfssl_object_info[i].nid;
  33402. }
  33403. }
  33404. #endif
  33405. /* try as a short name */
  33406. len = (int)XSTRLEN(s);
  33407. if ((int)XSTRLEN(wolfssl_object_info[i].sName) == len &&
  33408. XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
  33409. return wolfssl_object_info[i].nid;
  33410. }
  33411. /* try as a long name */
  33412. if ((int)XSTRLEN(wolfssl_object_info[i].lName) == len &&
  33413. XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
  33414. return wolfssl_object_info[i].nid;
  33415. }
  33416. }
  33417. return NID_undef;
  33418. }
  33419. #endif
  33420. #if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
  33421. defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
  33422. defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
  33423. defined(WOLFSSL_HAPROXY)
  33424. /* Creates new ASN1_OBJECT from short name, long name, or text
  33425. * representation of oid. If no_name is 0, then short name, long name, and
  33426. * numerical value of oid are interpreted. If no_name is 1, then only the
  33427. * numerical value of the oid is interpreted.
  33428. *
  33429. * Returns pointer to ASN1_OBJECT on success, or NULL on error.
  33430. */
  33431. #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)
  33432. WOLFSSL_ASN1_OBJECT* wolfSSL_OBJ_txt2obj(const char* s, int no_name)
  33433. {
  33434. int len, i, ret;
  33435. int nid = NID_undef;
  33436. unsigned int outSz = MAX_OID_SZ;
  33437. unsigned char out[MAX_OID_SZ];
  33438. unsigned int sum = 0;
  33439. WOLFSSL_ENTER("wolfSSL_OBJ_txt2obj");
  33440. if (s == NULL)
  33441. return NULL;
  33442. /* If s is numerical value, try to sum oid */
  33443. ret = EncodePolicyOID(out, &outSz, s, NULL);
  33444. if (ret == 0) {
  33445. for (i = 0; i < (int)outSz; i++) {
  33446. sum += out[i];
  33447. }
  33448. }
  33449. len = (int)XSTRLEN(s);
  33450. /* TODO: update short names in wolfssl_object_info and check OID sums
  33451. are correct */
  33452. for (i = 0; i < (int)WOLFSSL_OBJECT_INFO_SZ; i++) {
  33453. /* Short name, long name, and numerical value are interpreted */
  33454. if (no_name == 0 && ((XSTRNCMP(s, wolfssl_object_info[i].sName, len) == 0) ||
  33455. (XSTRNCMP(s, wolfssl_object_info[i].lName, len) == 0) ||
  33456. (wolfssl_object_info[i].id == (int)sum)))
  33457. nid = wolfssl_object_info[i].nid;
  33458. /* Only numerical value is interpreted */
  33459. else if (no_name == 1 && wolfssl_object_info[i].id == (int)sum)
  33460. nid = wolfssl_object_info[i].nid;
  33461. }
  33462. if (nid != NID_undef)
  33463. return wolfSSL_OBJ_nid2obj(nid);
  33464. return NULL;
  33465. }
  33466. #endif
  33467. /* compatibility function. Its intended use is to remove OID's from an
  33468. * internal table that have been added with OBJ_create. wolfSSL manages its
  33469. * own internal OID values and does not currently support OBJ_create. */
  33470. void wolfSSL_OBJ_cleanup(void)
  33471. {
  33472. WOLFSSL_ENTER("wolfSSL_OBJ_cleanup()");
  33473. }
  33474. #ifndef NO_WOLFSSL_STUB
  33475. int wolfSSL_OBJ_create(const char *oid, const char *sn, const char *ln)
  33476. {
  33477. (void)oid;
  33478. (void)sn;
  33479. (void)ln;
  33480. WOLFSSL_STUB("wolfSSL_OBJ_create");
  33481. return WOLFSSL_FAILURE;
  33482. }
  33483. #endif
  33484. void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth)
  33485. {
  33486. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  33487. WOLFSSL_ENTER("wolfSSL_set_verify_depth");
  33488. ssl->options.verifyDepth = (byte)depth;
  33489. #endif
  33490. }
  33491. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  33492. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  33493. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
  33494. defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
  33495. defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  33496. defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
  33497. WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne) {
  33498. WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_object");
  33499. if (ne == NULL) return NULL;
  33500. if (wolfSSL_OBJ_nid2obj_ex(ne->nid, &ne->object) != NULL) {
  33501. ne->object.nid = ne->nid;
  33502. return &ne->object;
  33503. }
  33504. return NULL;
  33505. }
  33506. #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
  33507. HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
  33508. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
  33509. defined(OPENSSL_EXTRA_X509_SMALL)
  33510. /* returns a pointer to the internal entry at location 'loc' on success,
  33511. * a null pointer is returned in fail cases */
  33512. WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_get_entry(
  33513. WOLFSSL_X509_NAME *name, int loc)
  33514. {
  33515. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_entry");
  33516. if (name == NULL) {
  33517. return NULL;
  33518. }
  33519. if (loc < 0 || loc >= MAX_NAME_ENTRIES) {
  33520. WOLFSSL_MSG("Bad argument");
  33521. return NULL;
  33522. }
  33523. if (name->entry[loc].set) {
  33524. return &name->entry[loc];
  33525. }
  33526. else {
  33527. return NULL;
  33528. }
  33529. }
  33530. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  33531. #ifdef OPENSSL_EXTRA
  33532. #ifndef NO_WOLFSSL_STUB
  33533. int wolfSSL_X509_check_private_key(WOLFSSL_X509 *x509, WOLFSSL_EVP_PKEY *key)
  33534. {
  33535. (void) x509;
  33536. (void) key;
  33537. WOLFSSL_ENTER("wolfSSL_X509_check_private_key");
  33538. WOLFSSL_STUB("X509_check_private_key");
  33539. return WOLFSSL_SUCCESS;
  33540. }
  33541. WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list(
  33542. WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk)
  33543. {
  33544. (void) sk;
  33545. WOLFSSL_ENTER("wolfSSL_dup_CA_list");
  33546. WOLFSSL_STUB("SSL_dup_CA_list");
  33547. return NULL;
  33548. }
  33549. #endif
  33550. /* wolfSSL uses negative values for error states. This function returns an
  33551. * unsigned type so the value returned is the absolute value of the error.
  33552. */
  33553. unsigned long wolfSSL_ERR_peek_last_error_line(const char **file, int *line)
  33554. {
  33555. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  33556. (void)line;
  33557. (void)file;
  33558. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(DEBUG_WOLFSSL) || \
  33559. defined(WOLFSSL_HAPROXY)
  33560. {
  33561. int ret;
  33562. if ((ret = wc_PeekErrorNode(-1, file, NULL, line)) < 0) {
  33563. WOLFSSL_MSG("Issue peeking at error node in queue");
  33564. return 0;
  33565. }
  33566. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  33567. if (ret == -ASN_NO_PEM_HEADER)
  33568. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  33569. #endif
  33570. return (unsigned long)ret;
  33571. }
  33572. #else
  33573. return (unsigned long)(0 - NOT_COMPILED_IN);
  33574. #endif
  33575. }
  33576. #ifndef NO_CERTS
  33577. int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey)
  33578. {
  33579. WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey");
  33580. if (ctx == NULL || pkey == NULL) {
  33581. return WOLFSSL_FAILURE;
  33582. }
  33583. if (pkey->pkey.ptr != NULL) {
  33584. /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */
  33585. return wolfSSL_CTX_use_PrivateKey_buffer(ctx,
  33586. (const unsigned char*)pkey->pkey.ptr,
  33587. pkey->pkey_sz, SSL_FILETYPE_ASN1);
  33588. }
  33589. WOLFSSL_MSG("wolfSSL private key not set");
  33590. return BAD_FUNC_ARG;
  33591. }
  33592. #endif /* !NO_CERTS */
  33593. #endif /* OPENSSL_EXTRA */
  33594. #if (defined(OPENSSL_EXTRA) && defined(HAVE_EX_DATA)) || defined(FORTRESS) || \
  33595. defined(WOLFSSL_WPAS_SMALL)
  33596. void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx)
  33597. {
  33598. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  33599. #ifdef HAVE_EX_DATA
  33600. if(ctx != NULL) {
  33601. return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
  33602. }
  33603. #else
  33604. (void)ctx;
  33605. (void)idx;
  33606. #endif
  33607. return NULL;
  33608. }
  33609. int wolfSSL_CTX_get_ex_new_index(long idx, void* arg, void* a, void* b,
  33610. void* c)
  33611. {
  33612. static int ctx_idx = 0;
  33613. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_new_index");
  33614. (void)idx;
  33615. (void)arg;
  33616. (void)a;
  33617. (void)b;
  33618. (void)c;
  33619. return ctx_idx++;
  33620. }
  33621. /* Return the index that can be used for the WOLFSSL structure to store
  33622. * application data.
  33623. *
  33624. */
  33625. int wolfSSL_get_ex_new_index(long argValue, void* arg,
  33626. WOLFSSL_CRYPTO_EX_new* cb1, WOLFSSL_CRYPTO_EX_dup* cb2,
  33627. WOLFSSL_CRYPTO_EX_free* cb3)
  33628. {
  33629. static int ssl_idx = 0;
  33630. WOLFSSL_ENTER("wolfSSL_get_ex_new_index");
  33631. (void)argValue;
  33632. (void)arg;
  33633. (void)cb1;
  33634. (void)cb2;
  33635. (void)cb3;
  33636. return ssl_idx++;
  33637. }
  33638. int wolfSSL_CTX_set_ex_data(WOLFSSL_CTX* ctx, int idx, void* data)
  33639. {
  33640. WOLFSSL_ENTER("wolfSSL_CTX_set_ex_data");
  33641. #ifdef HAVE_EX_DATA
  33642. if (ctx != NULL)
  33643. {
  33644. return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
  33645. }
  33646. #else
  33647. (void)ctx;
  33648. (void)idx;
  33649. (void)data;
  33650. #endif
  33651. return WOLFSSL_FAILURE;
  33652. }
  33653. #endif /* (OPENSSL_EXTRA && HAVE_EX_DATA) || FORTRESS || WOLFSSL_WPAS_SMALL */
  33654. #ifdef OPENSSL_EXTRA
  33655. /* Returns char* to app data stored in ex[0].
  33656. *
  33657. * ssl WOLFSSL structure to get app data from
  33658. */
  33659. void* wolfSSL_get_app_data(const WOLFSSL *ssl)
  33660. {
  33661. /* checkout exdata stuff... */
  33662. WOLFSSL_ENTER("wolfSSL_get_app_data");
  33663. return wolfSSL_get_ex_data(ssl, 0);
  33664. }
  33665. /* Set ex array 0 to have app data
  33666. *
  33667. * ssl WOLFSSL struct to set app data in
  33668. * arg data to be stored
  33669. *
  33670. * Returns SSL_SUCCESS on success and SSL_FAILURE on failure
  33671. */
  33672. int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) {
  33673. WOLFSSL_ENTER("wolfSSL_set_app_data");
  33674. return wolfSSL_set_ex_data(ssl, 0, arg);
  33675. }
  33676. #endif /* OPENSSL_EXTRA */
  33677. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  33678. int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data)
  33679. {
  33680. WOLFSSL_ENTER("wolfSSL_set_ex_data");
  33681. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  33682. if (ssl != NULL)
  33683. {
  33684. return wolfSSL_CRYPTO_set_ex_data(&ssl->ex_data, idx, data);
  33685. }
  33686. #else
  33687. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  33688. (void)ssl;
  33689. (void)idx;
  33690. (void)data;
  33691. #endif
  33692. return WOLFSSL_FAILURE;
  33693. }
  33694. void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx)
  33695. {
  33696. WOLFSSL_ENTER("wolfSSL_get_ex_data");
  33697. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  33698. if (ssl != NULL) {
  33699. return wolfSSL_CRYPTO_get_ex_data(&ssl->ex_data, idx);
  33700. }
  33701. #else
  33702. WOLFSSL_MSG("HAVE_EX_DATA macro is not defined");
  33703. (void)ssl;
  33704. (void)idx;
  33705. #endif
  33706. return 0;
  33707. }
  33708. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  33709. #ifdef OPENSSL_EXTRA
  33710. #ifndef NO_DSA
  33711. WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSAparams(WOLFSSL_BIO *bp, WOLFSSL_DSA **x,
  33712. pem_password_cb *cb, void *u)
  33713. {
  33714. WOLFSSL_DSA* dsa;
  33715. DsaKey* key;
  33716. int length;
  33717. unsigned char* buf;
  33718. word32 bufSz;
  33719. int ret;
  33720. word32 idx = 0;
  33721. DerBuffer* pDer;
  33722. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DSAparams");
  33723. ret = wolfSSL_BIO_get_mem_data(bp, &buf);
  33724. if (ret <= 0) {
  33725. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
  33726. return NULL;
  33727. }
  33728. bufSz = (word32)ret;
  33729. if (cb != NULL || u != NULL) {
  33730. /*
  33731. * cb is for a call back when encountering encrypted PEM files
  33732. * if cb == NULL and u != NULL then u = null terminated password string
  33733. */
  33734. WOLFSSL_MSG("Not yet supporting call back or password for encrypted PEM");
  33735. }
  33736. if ((ret = PemToDer(buf, (long)bufSz, DSA_PARAM_TYPE, &pDer, NULL, NULL,
  33737. NULL)) < 0 ) {
  33738. WOLFSSL_MSG("Issue converting from PEM to DER");
  33739. return NULL;
  33740. }
  33741. if ((ret = GetSequence(pDer->buffer, &idx, &length, pDer->length)) < 0) {
  33742. WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
  33743. FreeDer(&pDer);
  33744. return NULL;
  33745. }
  33746. dsa = wolfSSL_DSA_new();
  33747. if (dsa == NULL) {
  33748. FreeDer(&pDer);
  33749. WOLFSSL_MSG("Error creating DSA struct");
  33750. return NULL;
  33751. }
  33752. key = (DsaKey*)dsa->internal;
  33753. if (key == NULL) {
  33754. FreeDer(&pDer);
  33755. wolfSSL_DSA_free(dsa);
  33756. WOLFSSL_MSG("Error finding DSA key struct");
  33757. return NULL;
  33758. }
  33759. if (GetInt(&key->p, pDer->buffer, &idx, pDer->length) < 0 ||
  33760. GetInt(&key->q, pDer->buffer, &idx, pDer->length) < 0 ||
  33761. GetInt(&key->g, pDer->buffer, &idx, pDer->length) < 0 ) {
  33762. WOLFSSL_MSG("dsa key error");
  33763. FreeDer(&pDer);
  33764. wolfSSL_DSA_free(dsa);
  33765. return NULL;
  33766. }
  33767. if (SetIndividualExternal(&dsa->p, &key->p) != WOLFSSL_SUCCESS) {
  33768. WOLFSSL_MSG("dsa p key error");
  33769. FreeDer(&pDer);
  33770. wolfSSL_DSA_free(dsa);
  33771. return NULL;
  33772. }
  33773. if (SetIndividualExternal(&dsa->q, &key->q) != WOLFSSL_SUCCESS) {
  33774. WOLFSSL_MSG("dsa q key error");
  33775. FreeDer(&pDer);
  33776. wolfSSL_DSA_free(dsa);
  33777. return NULL;
  33778. }
  33779. if (SetIndividualExternal(&dsa->g, &key->g) != WOLFSSL_SUCCESS) {
  33780. WOLFSSL_MSG("dsa g key error");
  33781. FreeDer(&pDer);
  33782. wolfSSL_DSA_free(dsa);
  33783. return NULL;
  33784. }
  33785. if (x != NULL) {
  33786. *x = dsa;
  33787. }
  33788. FreeDer(&pDer);
  33789. return dsa;
  33790. }
  33791. #endif /* NO_DSA */
  33792. #endif /* OPENSSL_EXTRA */
  33793. #endif /* WOLFCRYPT_ONLY */
  33794. #if defined(OPENSSL_EXTRA)
  33795. /* Begin functions for openssl/buffer.h */
  33796. WOLFSSL_BUF_MEM* wolfSSL_BUF_MEM_new(void)
  33797. {
  33798. WOLFSSL_BUF_MEM* buf;
  33799. buf = (WOLFSSL_BUF_MEM*)XMALLOC(sizeof(WOLFSSL_BUF_MEM), NULL,
  33800. DYNAMIC_TYPE_OPENSSL);
  33801. if (buf) {
  33802. XMEMSET(buf, 0, sizeof(WOLFSSL_BUF_MEM));
  33803. }
  33804. return buf;
  33805. }
  33806. /* returns length of buffer on success */
  33807. int wolfSSL_BUF_MEM_grow(WOLFSSL_BUF_MEM* buf, size_t len)
  33808. {
  33809. int len_int = (int)len;
  33810. int mx;
  33811. /* verify provided arguments */
  33812. if (buf == NULL || len_int < 0) {
  33813. return 0; /* BAD_FUNC_ARG; */
  33814. }
  33815. /* check to see if fits in existing length */
  33816. if (buf->length > len) {
  33817. buf->length = len;
  33818. return len_int;
  33819. }
  33820. /* check to see if fits in max buffer */
  33821. if (buf->max >= len) {
  33822. if (buf->data != NULL) {
  33823. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  33824. }
  33825. buf->length = len;
  33826. return len_int;
  33827. }
  33828. /* expand size, to handle growth */
  33829. mx = (len_int + 3) / 3 * 4;
  33830. /* use realloc */
  33831. buf->data = (char*)XREALLOC(buf->data, mx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33832. if (buf->data == NULL) {
  33833. return 0; /* ERR_R_MALLOC_FAILURE; */
  33834. }
  33835. buf->max = mx;
  33836. XMEMSET(&buf->data[buf->length], 0, len - buf->length);
  33837. buf->length = len;
  33838. return len_int;
  33839. }
  33840. void wolfSSL_BUF_MEM_free(WOLFSSL_BUF_MEM* buf)
  33841. {
  33842. if (buf) {
  33843. if (buf->data) {
  33844. XFREE(buf->data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  33845. buf->data = NULL;
  33846. }
  33847. buf->max = 0;
  33848. buf->length = 0;
  33849. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  33850. }
  33851. }
  33852. /* End Functions for openssl/buffer.h */
  33853. #endif /* OPENSSL_EXTRA */
  33854. #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
  33855. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
  33856. WOLFSSL_BIO *wolfSSL_BIO_new_file(const char *filename, const char *mode)
  33857. {
  33858. #ifndef NO_FILESYSTEM
  33859. WOLFSSL_BIO* bio;
  33860. XFILE fp;
  33861. WOLFSSL_ENTER("wolfSSL_BIO_new_file");
  33862. fp = XFOPEN(filename, mode);
  33863. if (fp == XBADFILE)
  33864. return NULL;
  33865. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  33866. if (bio == NULL) {
  33867. XFCLOSE(fp);
  33868. return bio;
  33869. }
  33870. if (wolfSSL_BIO_set_fp(bio, fp, BIO_CLOSE) != WOLFSSL_SUCCESS) {
  33871. XFCLOSE(fp);
  33872. wolfSSL_BIO_free(bio);
  33873. bio = NULL;
  33874. }
  33875. /* file is closed when BIO is free'd */
  33876. return bio;
  33877. #else
  33878. (void)filename;
  33879. (void)mode;
  33880. return NULL;
  33881. #endif /* NO_FILESYSTEM */
  33882. }
  33883. #ifndef NO_FILESYSTEM
  33884. WOLFSSL_BIO* wolfSSL_BIO_new_fp(XFILE fp, int close_flag)
  33885. {
  33886. WOLFSSL_BIO* bio;
  33887. WOLFSSL_ENTER("wolfSSL_BIO_new_fp");
  33888. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
  33889. if (bio == NULL) {
  33890. return bio;
  33891. }
  33892. if (wolfSSL_BIO_set_fp(bio, fp, close_flag) != WOLFSSL_SUCCESS) {
  33893. wolfSSL_BIO_free(bio);
  33894. bio = NULL;
  33895. }
  33896. /* file is closed when BIO is free'd or by user depending on flag */
  33897. return bio;
  33898. }
  33899. #endif
  33900. #ifndef NO_DH
  33901. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  33902. WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x,
  33903. pem_password_cb *cb, void *u)
  33904. {
  33905. #ifndef NO_FILESYSTEM
  33906. WOLFSSL_DH* localDh = NULL;
  33907. unsigned char* mem = NULL;
  33908. word32 size;
  33909. long sz;
  33910. int ret;
  33911. DerBuffer *der = NULL;
  33912. byte* p = NULL;
  33913. byte* g = NULL;
  33914. word32 pSz = MAX_DH_SIZE;
  33915. word32 gSz = MAX_DH_SIZE;
  33916. int memAlloced = 0;
  33917. WOLFSSL_ENTER("wolfSSL_PEM_read_bio_DHparams");
  33918. (void)cb;
  33919. (void)u;
  33920. if (bio == NULL) {
  33921. WOLFSSL_MSG("Bad Function Argument bio is NULL");
  33922. return NULL;
  33923. }
  33924. if (bio->type == WOLFSSL_BIO_MEMORY) {
  33925. /* Use the buffer directly. */
  33926. ret = wolfSSL_BIO_get_mem_data(bio, &mem);
  33927. if (mem == NULL || ret <= 0) {
  33928. WOLFSSL_MSG("Failed to get data from bio struct");
  33929. goto end;
  33930. }
  33931. size = ret;
  33932. }
  33933. else if (bio->type == WOLFSSL_BIO_FILE) {
  33934. /* Read whole file into a new buffer. */
  33935. if (XFSEEK((XFILE)bio->ptr, 0, SEEK_END) != 0)
  33936. goto end;
  33937. sz = XFTELL((XFILE)bio->ptr);
  33938. if (XFSEEK((XFILE)bio->ptr, 0, SEEK_SET) != 0)
  33939. goto end;
  33940. if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0L) {
  33941. WOLFSSL_MSG("PEM_read_bio_DHparams file size error");
  33942. goto end;
  33943. }
  33944. mem = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_PEM);
  33945. if (mem == NULL)
  33946. goto end;
  33947. memAlloced = 1;
  33948. if (wolfSSL_BIO_read(bio, (char *)mem, (int)sz) <= 0)
  33949. goto end;
  33950. size = (word32)sz;
  33951. }
  33952. else {
  33953. WOLFSSL_MSG("BIO type not supported for reading DH parameters");
  33954. goto end;
  33955. }
  33956. ret = PemToDer(mem, size, DH_PARAM_TYPE, &der, NULL, NULL, NULL);
  33957. if (ret != 0)
  33958. goto end;
  33959. /* Use the object passed in, otherwise allocate a new object */
  33960. if (x != NULL)
  33961. localDh = *x;
  33962. if (localDh == NULL) {
  33963. localDh = wolfSSL_DH_new();
  33964. if (localDh == NULL)
  33965. goto end;
  33966. }
  33967. /* Load data in manually */
  33968. p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  33969. g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  33970. if (p == NULL || g == NULL)
  33971. goto end;
  33972. /* Extract the p and g as data from the DER encoded DH parameters. */
  33973. ret = wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz);
  33974. if (ret != 0) {
  33975. if (x != NULL && localDh != *x)
  33976. XFREE(localDh, NULL, DYNAMIC_TYPE_OPENSSL);
  33977. localDh = NULL;
  33978. goto end;
  33979. }
  33980. if (x != NULL)
  33981. *x = localDh;
  33982. /* Put p and g in as big numbers. */
  33983. if (localDh->p != NULL) {
  33984. wolfSSL_BN_free(localDh->p);
  33985. localDh->p = NULL;
  33986. }
  33987. if (localDh->g != NULL) {
  33988. wolfSSL_BN_free(localDh->g);
  33989. localDh->g = NULL;
  33990. }
  33991. localDh->p = wolfSSL_BN_bin2bn(p, pSz, NULL);
  33992. localDh->g = wolfSSL_BN_bin2bn(g, gSz, NULL);
  33993. if (localDh->p == NULL || localDh->g == NULL) {
  33994. if (x != NULL && localDh != *x)
  33995. wolfSSL_DH_free(localDh);
  33996. localDh = NULL;
  33997. }
  33998. if (localDh != NULL && localDh->inSet == 0) {
  33999. if (SetDhInternal(localDh) != WOLFSSL_SUCCESS) {
  34000. WOLFSSL_MSG("Unable to set internal DH structure");
  34001. wolfSSL_DH_free(localDh);
  34002. localDh = NULL;
  34003. }
  34004. }
  34005. end:
  34006. if (memAlloced) XFREE(mem, NULL, DYNAMIC_TYPE_PEM);
  34007. if (der != NULL) FreeDer(&der);
  34008. XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  34009. XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  34010. return localDh;
  34011. #else
  34012. (void)bio;
  34013. (void)x;
  34014. (void)cb;
  34015. (void)u;
  34016. return NULL;
  34017. #endif
  34018. }
  34019. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  34020. #ifndef NO_FILESYSTEM
  34021. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
  34022. /* Convert DH key parameters to DER format, write to output (outSz)
  34023. * If output is NULL then max expected size is set to outSz and LENGTH_ONLY_E is
  34024. * returned.
  34025. *
  34026. * Note : static function due to redefinition complications with DhKey and FIPS
  34027. * version 2 build.
  34028. *
  34029. * return bytes written on success */
  34030. int wc_DhParamsToDer(DhKey* key, byte* out, word32* outSz)
  34031. {
  34032. word32 sz = 0, idx = 0;
  34033. int pSz = 0, gSz = 0, ret;
  34034. byte scratch[MAX_LENGTH_SZ];
  34035. if (key == NULL || outSz == NULL) {
  34036. return BAD_FUNC_ARG;
  34037. }
  34038. pSz = mp_unsigned_bin_size(&key->p);
  34039. if (pSz < 0) {
  34040. return pSz;
  34041. }
  34042. if (mp_leading_bit(&key->p)) {
  34043. pSz++;
  34044. }
  34045. gSz = mp_unsigned_bin_size(&key->g);
  34046. if (gSz < 0) {
  34047. return gSz;
  34048. }
  34049. if (mp_leading_bit(&key->g)) {
  34050. gSz++;
  34051. }
  34052. sz = ASN_TAG_SZ; /* Integer */
  34053. sz += SetLength(pSz, scratch);
  34054. sz += ASN_TAG_SZ; /* Integer */
  34055. sz += SetLength(gSz, scratch);
  34056. sz += gSz + pSz;
  34057. if (out == NULL) {
  34058. byte seqScratch[MAX_SEQ_SZ];
  34059. *outSz = sz + SetSequence(sz, seqScratch);
  34060. return LENGTH_ONLY_E;
  34061. }
  34062. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  34063. return BUFFER_E;
  34064. }
  34065. idx += SetSequence(sz, out);
  34066. if (*outSz < idx + sz) {
  34067. return BUFFER_E;
  34068. }
  34069. out[idx++] = ASN_INTEGER;
  34070. idx += SetLength(pSz, out + idx);
  34071. if (mp_leading_bit(&key->p)) {
  34072. out[idx++] = 0x00;
  34073. pSz -= 1; /* subtract 1 from size to account for leading 0 */
  34074. }
  34075. ret = mp_to_unsigned_bin(&key->p, out + idx);
  34076. if (ret != MP_OKAY) {
  34077. return BUFFER_E;
  34078. }
  34079. idx += pSz;
  34080. out[idx++] = ASN_INTEGER;
  34081. idx += SetLength(gSz, out + idx);
  34082. if (mp_leading_bit(&key->g)) {
  34083. out[idx++] = 0x00;
  34084. gSz -= 1; /* subtract 1 from size to account for leading 0 */
  34085. }
  34086. ret = mp_to_unsigned_bin(&key->g, out + idx);
  34087. if (ret != MP_OKAY) {
  34088. return BUFFER_E;
  34089. }
  34090. idx += gSz;
  34091. return idx;
  34092. }
  34093. #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
  34094. int wc_DhPubKeyToDer(DhKey* key, byte* out, word32* outSz)
  34095. {
  34096. word32 sz = 0;
  34097. word32 paramSz = 0;
  34098. int ret;
  34099. int pubSz = 0;
  34100. int idx = 0;
  34101. byte scratch[MAX_ALGO_SZ];
  34102. /* Get size of entire key */
  34103. /* SEQUENCE <--| SetAlgoId
  34104. * OBJECT IDENTIFIER <--|
  34105. * SEQUENCE <--
  34106. * INTEGER | wc_DhParamsToDer
  34107. * INTEGER <--
  34108. */
  34109. ret = wc_DhParamsToDer(key, NULL, &paramSz);
  34110. if (ret != LENGTH_ONLY_E)
  34111. return ASN_PARSE_E;
  34112. sz += paramSz;
  34113. sz += SetAlgoID(DHk, scratch, oidKeyType, paramSz);
  34114. /* BIT STRING
  34115. * INTEGER
  34116. */
  34117. pubSz = mp_unsigned_bin_size(&key->pub);
  34118. if (pubSz < 0)
  34119. return pubSz;
  34120. if (mp_leading_bit(&key->pub))
  34121. pubSz++;
  34122. sz += ASN_TAG_SZ; /* Integer */
  34123. sz += SetLength(pubSz, scratch);
  34124. sz += pubSz;
  34125. sz += SetBitString(pubSz, 0, scratch);
  34126. if (out == NULL) {
  34127. /* Uppermost SEQUENCE */
  34128. *outSz = sz + SetSequence(sz, scratch);
  34129. return LENGTH_ONLY_E;
  34130. }
  34131. /* end get size of entire key */
  34132. /* Check for indexing errors */
  34133. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  34134. return BUFFER_E;
  34135. }
  34136. /* Build Up Entire Key */
  34137. idx += SetSequence(sz, out);
  34138. idx += SetAlgoID(DHk, out+idx, oidKeyType, paramSz);
  34139. ret = wc_DhParamsToDer(key, out+idx, &paramSz);
  34140. if (ret < 0)
  34141. return ret;
  34142. idx += ret;
  34143. /* BIT STRING
  34144. * INTEGER
  34145. */
  34146. idx += SetBitString(pubSz, 0, out+idx);
  34147. out[idx++] = ASN_INTEGER;
  34148. idx += SetLength(pubSz, out + idx);
  34149. if (mp_leading_bit(&key->pub)) {
  34150. out[idx++] = 0x00;
  34151. pubSz -= 1; /* subtract 1 from size to account for leading 0 */
  34152. }
  34153. ret = mp_to_unsigned_bin(&key->pub, out + idx);
  34154. if (ret != MP_OKAY) {
  34155. return BUFFER_E;
  34156. }
  34157. idx += pubSz;
  34158. return idx;
  34159. }
  34160. int wc_DhPrivKeyToDer(DhKey* key, byte* out, word32* outSz)
  34161. {
  34162. word32 sz = 0;
  34163. word32 paramSz = 0;
  34164. int ret;
  34165. int privSz = 0;
  34166. int idx = 0;
  34167. byte scratch[MAX_ALGO_SZ];
  34168. /* Get size of entire key */
  34169. /* INTEGER 0 */
  34170. sz += ASN_TAG_SZ; /* Integer */
  34171. sz += SetLength(1, scratch);
  34172. sz += 1;
  34173. /* SEQUENCE <--| SetAlgoId
  34174. * OBJECT IDENTIFIER <--|
  34175. * SEQUENCE <--
  34176. * INTEGER | wc_DhParamsToDer
  34177. * INTEGER <--
  34178. */
  34179. ret = wc_DhParamsToDer(key, NULL, &paramSz);
  34180. if (ret != LENGTH_ONLY_E)
  34181. return ASN_PARSE_E;
  34182. sz += paramSz;
  34183. sz += SetAlgoID(DHk, scratch, oidKeyType, paramSz);
  34184. /* OCTET STRING
  34185. * INTEGER
  34186. */
  34187. privSz = mp_unsigned_bin_size(&key->priv);
  34188. if (privSz < 0)
  34189. return privSz;
  34190. else if (privSz > 256) /* Key is larger than 2048 */
  34191. return ASN_VERSION_E;
  34192. if (mp_leading_bit(&key->priv))
  34193. privSz++;
  34194. sz += ASN_TAG_SZ; /* Integer */
  34195. sz += SetLength(privSz, scratch);
  34196. sz += privSz;
  34197. sz += SetOctetString(privSz + ASN_OCTET_STRING, scratch);
  34198. if (out == NULL) {
  34199. /* Uppermost SEQUENCE */
  34200. *outSz = sz + SetSequence(sz, scratch);
  34201. return LENGTH_ONLY_E;
  34202. }
  34203. /* end get size of entire key */
  34204. /* Check for indexing errors */
  34205. if (*outSz < MAX_SEQ_SZ || *outSz < sz) {
  34206. return BUFFER_E;
  34207. }
  34208. /* Build Up Entire Key */
  34209. idx += SetSequence(sz, out);
  34210. /* INTEGER 0 */
  34211. out[idx++] = ASN_INTEGER;
  34212. idx += SetLength(1, out+idx);
  34213. out[idx++] = 0;
  34214. idx += SetAlgoID(DHk, out+idx, oidKeyType, paramSz);
  34215. ret = wc_DhParamsToDer(key, out+idx, &paramSz);
  34216. if (ret < 0)
  34217. return ret;
  34218. idx += ret;
  34219. /* OCTET STRING
  34220. * INTEGER
  34221. */
  34222. if (privSz == 256) {
  34223. idx += SetOctetString(privSz + ASN_OCTET_STRING, out+idx);
  34224. } else if (privSz == 128) {
  34225. idx += SetOctetString(privSz + ASN_OCTET_STRING-1, out+idx);
  34226. } else if (privSz == 64) {
  34227. idx += SetOctetString(privSz + ASN_OCTET_STRING-2, out+idx);
  34228. } else {
  34229. WOLFSSL_MSG("Unsupported key size");
  34230. return ASN_VERSION_E;
  34231. }
  34232. out[idx++] = ASN_INTEGER;
  34233. idx += SetLength(privSz, out + idx);
  34234. if (mp_leading_bit(&key->priv)) {
  34235. out[idx++] = 0x00;
  34236. privSz -= 1; /* subtract 1 from size to account for leading 0 */
  34237. }
  34238. ret = mp_to_unsigned_bin(&key->priv, out + idx);
  34239. if (ret != MP_OKAY) {
  34240. return BUFFER_E;
  34241. }
  34242. idx += privSz;
  34243. return idx;
  34244. }
  34245. /* Writes the DH parameters in PEM format from "dh" out to the file pointer
  34246. * passed in.
  34247. *
  34248. * returns WOLFSSL_SUCCESS on success
  34249. */
  34250. int wolfSSL_PEM_write_DHparams(XFILE fp, WOLFSSL_DH* dh)
  34251. {
  34252. int ret;
  34253. word32 derSz = 0, pemSz = 0;
  34254. byte *der, *pem;
  34255. DhKey* key;
  34256. WOLFSSL_ENTER("wolfSSL_PEM_write_DHparams");
  34257. if (dh == NULL) {
  34258. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", BAD_FUNC_ARG);
  34259. return WOLFSSL_FAILURE;
  34260. }
  34261. if (dh->inSet == 0) {
  34262. if (SetDhInternal(dh) != WOLFSSL_SUCCESS) {
  34263. WOLFSSL_MSG("Unable to set internal DH structure");
  34264. return WOLFSSL_FAILURE;
  34265. }
  34266. }
  34267. key = (DhKey*)dh->internal;
  34268. ret = wc_DhParamsToDer(key, NULL, &derSz);
  34269. if (ret != LENGTH_ONLY_E) {
  34270. WOLFSSL_MSG("Failed to get size of DH params");
  34271. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  34272. return WOLFSSL_FAILURE;
  34273. }
  34274. der = (byte*)XMALLOC(derSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34275. if (der == NULL) {
  34276. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", MEMORY_E);
  34277. return WOLFSSL_FAILURE;
  34278. }
  34279. ret = wc_DhParamsToDer(key, der, &derSz);
  34280. if (ret <= 0) {
  34281. WOLFSSL_MSG("Failed to export DH params");
  34282. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  34283. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34284. return WOLFSSL_FAILURE;
  34285. }
  34286. /* convert to PEM */
  34287. ret = wc_DerToPem(der, derSz, NULL, 0, DH_PARAM_TYPE);
  34288. if (ret < 0) {
  34289. WOLFSSL_MSG("Failed to convert DH params to PEM");
  34290. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  34291. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34292. return ret;
  34293. }
  34294. pemSz = (word32)ret;
  34295. pem = (byte*)XMALLOC(pemSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34296. if (pem == NULL) {
  34297. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", MEMORY_E);
  34298. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34299. return ret;
  34300. }
  34301. ret = wc_DerToPem(der, derSz, pem, pemSz, DH_PARAM_TYPE);
  34302. XFREE(der, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34303. if (ret < 0) {
  34304. WOLFSSL_MSG("Failed to convert DH params to PEM");
  34305. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  34306. XFREE(pem, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34307. return ret;
  34308. }
  34309. ret = (int)XFWRITE(pem, 1, pemSz, fp);
  34310. XFREE(pem, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34311. if (ret <= 0) {
  34312. WOLFSSL_MSG("Failed to write to file");
  34313. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", ret);
  34314. return WOLFSSL_FAILURE;
  34315. }
  34316. WOLFSSL_LEAVE("wolfSSL_PEM_write_DHparams", WOLFSSL_SUCCESS);
  34317. return WOLFSSL_SUCCESS;
  34318. }
  34319. #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
  34320. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  34321. #endif /* !NO_FILESYSTEM */
  34322. #endif /* !NO_DH */
  34323. #ifdef WOLFSSL_CERT_GEN
  34324. #ifdef WOLFSSL_CERT_REQ
  34325. /* writes the x509 from x to the WOLFSSL_BIO bp
  34326. *
  34327. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  34328. */
  34329. int wolfSSL_PEM_write_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  34330. {
  34331. byte* pem;
  34332. int pemSz = 0;
  34333. const unsigned char* der;
  34334. int derSz;
  34335. int ret;
  34336. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_REQ()");
  34337. if (x == NULL || bp == NULL) {
  34338. return WOLFSSL_FAILURE;
  34339. }
  34340. der = wolfSSL_X509_get_der(x, &derSz);
  34341. if (der == NULL) {
  34342. return WOLFSSL_FAILURE;
  34343. }
  34344. /* get PEM size */
  34345. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERTREQ_TYPE);
  34346. if (pemSz < 0) {
  34347. return WOLFSSL_FAILURE;
  34348. }
  34349. /* create PEM buffer and convert from DER */
  34350. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34351. if (pem == NULL) {
  34352. return WOLFSSL_FAILURE;
  34353. }
  34354. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERTREQ_TYPE) < 0) {
  34355. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34356. return WOLFSSL_FAILURE;
  34357. }
  34358. /* write the PEM to BIO */
  34359. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  34360. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34361. if (ret <= 0) return WOLFSSL_FAILURE;
  34362. return WOLFSSL_SUCCESS;
  34363. }
  34364. #endif /* WOLFSSL_CERT_REQ */
  34365. /* writes the x509 from x to the WOLFSSL_BIO bp
  34366. *
  34367. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on fail
  34368. */
  34369. int wolfSSL_PEM_write_bio_X509_AUX(WOLFSSL_BIO *bp, WOLFSSL_X509 *x)
  34370. {
  34371. byte* pem;
  34372. int pemSz = 0;
  34373. const unsigned char* der;
  34374. int derSz;
  34375. int ret;
  34376. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX()");
  34377. if (bp == NULL || x == NULL) {
  34378. WOLFSSL_MSG("NULL argument passed in");
  34379. return WOLFSSL_FAILURE;
  34380. }
  34381. der = wolfSSL_X509_get_der(x, &derSz);
  34382. if (der == NULL) {
  34383. return WOLFSSL_FAILURE;
  34384. }
  34385. /* get PEM size */
  34386. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  34387. if (pemSz < 0) {
  34388. return WOLFSSL_FAILURE;
  34389. }
  34390. /* create PEM buffer and convert from DER */
  34391. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34392. if (pem == NULL) {
  34393. return WOLFSSL_FAILURE;
  34394. }
  34395. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  34396. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34397. return WOLFSSL_FAILURE;
  34398. }
  34399. /* write the PEM to BIO */
  34400. ret = wolfSSL_BIO_write(bp, pem, pemSz);
  34401. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34402. if (ret <= 0) return WOLFSSL_FAILURE;
  34403. return WOLFSSL_SUCCESS;
  34404. }
  34405. #endif /* WOLFSSL_CERT_GEN */
  34406. int wolfSSL_PEM_write_bio_X509(WOLFSSL_BIO *bio, WOLFSSL_X509 *cert)
  34407. {
  34408. byte* pem;
  34409. int pemSz = 0;
  34410. const unsigned char* der;
  34411. int derSz;
  34412. int ret;
  34413. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509_AUX()");
  34414. if (bio == NULL || cert == NULL) {
  34415. WOLFSSL_MSG("NULL argument passed in");
  34416. return WOLFSSL_FAILURE;
  34417. }
  34418. der = wolfSSL_X509_get_der(cert, &derSz);
  34419. if (der == NULL) {
  34420. return WOLFSSL_FAILURE;
  34421. }
  34422. /* get PEM size */
  34423. pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
  34424. if (pemSz < 0) {
  34425. return WOLFSSL_FAILURE;
  34426. }
  34427. /* create PEM buffer and convert from DER */
  34428. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34429. if (pem == NULL) {
  34430. return WOLFSSL_FAILURE;
  34431. }
  34432. if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  34433. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34434. return WOLFSSL_FAILURE;
  34435. }
  34436. /* write the PEM to BIO */
  34437. ret = wolfSSL_BIO_write(bio, pem, pemSz);
  34438. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  34439. if (ret <= 0) return WOLFSSL_FAILURE;
  34440. return WOLFSSL_SUCCESS;
  34441. }
  34442. #if defined(OPENSSL_EXTRA) && !defined(NO_DH)
  34443. /* Initialize ctx->dh with dh's params. Return WOLFSSL_SUCCESS on ok */
  34444. long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh)
  34445. {
  34446. int pSz, gSz;
  34447. byte *p, *g;
  34448. int ret=0;
  34449. WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh");
  34450. if(!ctx || !dh)
  34451. return BAD_FUNC_ARG;
  34452. /* Get needed size for p and g */
  34453. pSz = wolfSSL_BN_bn2bin(dh->p, NULL);
  34454. gSz = wolfSSL_BN_bn2bin(dh->g, NULL);
  34455. if(pSz <= 0 || gSz <= 0)
  34456. return WOLFSSL_FATAL_ERROR;
  34457. p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  34458. if(!p)
  34459. return MEMORY_E;
  34460. g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  34461. if(!g) {
  34462. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  34463. return MEMORY_E;
  34464. }
  34465. pSz = wolfSSL_BN_bn2bin(dh->p, p);
  34466. gSz = wolfSSL_BN_bn2bin(dh->g, g);
  34467. if(pSz >= 0 && gSz >= 0) /* Conversion successful */
  34468. ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz);
  34469. XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  34470. XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  34471. return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR;
  34472. }
  34473. #endif /* OPENSSL_EXTRA && !NO_DH */
  34474. /* returns the enum value associated with handshake state
  34475. *
  34476. * ssl the WOLFSSL structure to get state of
  34477. */
  34478. int wolfSSL_get_state(const WOLFSSL* ssl)
  34479. {
  34480. WOLFSSL_ENTER("wolfSSL_get_state");
  34481. if (ssl == NULL) {
  34482. WOLFSSL_MSG("Null argument passed in");
  34483. return SSL_FAILURE;
  34484. }
  34485. return ssl->options.handShakeState;
  34486. }
  34487. #endif /* HAVE_LIGHTY || HAVE_STUNNEL || WOLFSSL_MYSQL_COMPATIBLE */
  34488. #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \
  34489. || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT)
  34490. long wolfSSL_ctrl(WOLFSSL* ssl, int cmd, long opt, void* pt)
  34491. {
  34492. WOLFSSL_ENTER("wolfSSL_ctrl");
  34493. if (ssl == NULL)
  34494. return BAD_FUNC_ARG;
  34495. switch (cmd) {
  34496. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  34497. case SSL_CTRL_SET_TLSEXT_HOSTNAME:
  34498. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME.");
  34499. #ifdef HAVE_SNI
  34500. if (pt == NULL) {
  34501. WOLFSSL_MSG("Passed in NULL Host Name.");
  34502. break;
  34503. }
  34504. return wolfSSL_set_tlsext_host_name(ssl, (const char*) pt);
  34505. #else
  34506. WOLFSSL_MSG("SNI not enabled.");
  34507. break;
  34508. #endif /* HAVE_SNI */
  34509. #endif /* WOLFSSL_NGINX || WOLFSSL_QT || OPENSSL_ALL */
  34510. default:
  34511. WOLFSSL_MSG("Case not implemented.");
  34512. }
  34513. (void)opt;
  34514. (void)pt;
  34515. return WOLFSSL_FAILURE;
  34516. }
  34517. long wolfSSL_CTX_ctrl(WOLFSSL_CTX* ctx, int cmd, long opt, void* pt)
  34518. {
  34519. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  34520. long ctrl_opt;
  34521. #endif
  34522. long ret = WOLFSSL_SUCCESS;
  34523. WOLFSSL_ENTER("wolfSSL_CTX_ctrl");
  34524. if (ctx == NULL)
  34525. return WOLFSSL_FAILURE;
  34526. switch (cmd) {
  34527. case SSL_CTRL_CHAIN:
  34528. #ifdef SESSION_CERTS
  34529. {
  34530. /*
  34531. * We don't care about opt here because a copy of the certificate is
  34532. * stored anyway so increasing the reference counter is not necessary.
  34533. * Just check to make sure that it is set to one of the correct values.
  34534. */
  34535. WOLF_STACK_OF(WOLFSSL_X509)* sk = (WOLF_STACK_OF(WOLFSSL_X509)*) pt;
  34536. WOLFSSL_X509* x509;
  34537. int i;
  34538. if (opt != 0 && opt != 1) {
  34539. ret = WOLFSSL_FAILURE;
  34540. break;
  34541. }
  34542. /* Clear certificate chain */
  34543. FreeDer(&ctx->certChain);
  34544. if (sk) {
  34545. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  34546. x509 = wolfSSL_sk_X509_value(sk, i);
  34547. /* Prevent wolfSSL_CTX_add_extra_chain_cert from freeing cert */
  34548. if (wolfSSL_X509_up_ref(x509) != 1) {
  34549. WOLFSSL_MSG("Error increasing reference count");
  34550. continue;
  34551. }
  34552. if (wolfSSL_CTX_add_extra_chain_cert(ctx, x509) !=
  34553. WOLFSSL_SUCCESS) {
  34554. WOLFSSL_MSG("Error adding certificate to context");
  34555. /* Decrease reference count on failure */
  34556. wolfSSL_X509_free(x509);
  34557. }
  34558. }
  34559. }
  34560. /* Free previous chain */
  34561. wolfSSL_sk_X509_free(ctx->x509Chain);
  34562. ctx->x509Chain = sk;
  34563. if (sk && opt == 1) {
  34564. /* up all refs when opt == 1 */
  34565. for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
  34566. x509 = wolfSSL_sk_X509_value(sk, i);
  34567. if (wolfSSL_X509_up_ref(x509) != 1) {
  34568. WOLFSSL_MSG("Error increasing reference count");
  34569. continue;
  34570. }
  34571. }
  34572. }
  34573. }
  34574. #else
  34575. WOLFSSL_MSG("Session certificates not compiled in");
  34576. ret = WOLFSSL_FAILURE;
  34577. #endif
  34578. break;
  34579. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  34580. case SSL_CTRL_OPTIONS:
  34581. WOLFSSL_MSG("Entering Case: SSL_CTRL_OPTIONS.");
  34582. ctrl_opt = wolfSSL_CTX_set_options(ctx, opt);
  34583. #ifdef WOLFSSL_QT
  34584. /* Set whether to use client or server cipher preference */
  34585. if ((ctrl_opt & SSL_OP_CIPHER_SERVER_PREFERENCE)
  34586. == SSL_OP_CIPHER_SERVER_PREFERENCE) {
  34587. WOLFSSL_MSG("Using Server's Cipher Preference.");
  34588. ctx->useClientOrder = FALSE;
  34589. } else {
  34590. WOLFSSL_MSG("Using Client's Cipher Preference.");
  34591. ctx->useClientOrder = TRUE;
  34592. }
  34593. #endif /* WOLFSSL_QT */
  34594. return ctrl_opt;
  34595. #endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
  34596. case SSL_CTRL_EXTRA_CHAIN_CERT:
  34597. WOLFSSL_MSG("Entering Case: SSL_CTRL_EXTRA_CHAIN_CERT.");
  34598. if (pt == NULL) {
  34599. WOLFSSL_MSG("Passed in x509 pointer NULL.");
  34600. ret = WOLFSSL_FAILURE;
  34601. break;
  34602. }
  34603. return wolfSSL_CTX_add_extra_chain_cert(ctx, (WOLFSSL_X509*)pt);
  34604. #ifndef NO_DH
  34605. case SSL_CTRL_SET_TMP_DH:
  34606. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_DH.");
  34607. if (pt == NULL) {
  34608. WOLFSSL_MSG("Passed in DH pointer NULL.");
  34609. ret = WOLFSSL_FAILURE;
  34610. break;
  34611. }
  34612. return wolfSSL_CTX_set_tmp_dh(ctx, (WOLFSSL_DH*)pt);
  34613. #endif
  34614. #ifdef HAVE_ECC
  34615. case SSL_CTRL_SET_TMP_ECDH:
  34616. WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TMP_ECDH.");
  34617. if (pt == NULL) {
  34618. WOLFSSL_MSG("Passed in ECDH pointer NULL.");
  34619. ret = WOLFSSL_FAILURE;
  34620. break;
  34621. }
  34622. return wolfSSL_SSL_CTX_set_tmp_ecdh(ctx, (WOLFSSL_EC_KEY*)pt);
  34623. #endif
  34624. case SSL_CTRL_MODE:
  34625. wolfSSL_CTX_set_mode(ctx,opt);
  34626. break;
  34627. default:
  34628. WOLFSSL_MSG("CTX_ctrl cmd not implemented");
  34629. ret = WOLFSSL_FAILURE;
  34630. break;
  34631. }
  34632. (void)ctx;
  34633. (void)cmd;
  34634. (void)opt;
  34635. (void)pt;
  34636. WOLFSSL_LEAVE("wolfSSL_CTX_ctrl", (int)ret);
  34637. return ret;
  34638. }
  34639. #ifndef WOLFSSL_NO_STUB
  34640. long wolfSSL_CTX_callback_ctrl(WOLFSSL_CTX* ctx, int cmd, void (*fp)(void))
  34641. {
  34642. (void) ctx;
  34643. (void) cmd;
  34644. (void) fp;
  34645. WOLFSSL_STUB("wolfSSL_CTX_callback_ctrl");
  34646. return WOLFSSL_FAILURE;
  34647. }
  34648. #endif /* WOLFSSL_NO_STUB */
  34649. #ifndef NO_WOLFSSL_STUB
  34650. long wolfSSL_CTX_clear_extra_chain_certs(WOLFSSL_CTX* ctx)
  34651. {
  34652. return wolfSSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0l, NULL);
  34653. }
  34654. #endif
  34655. /* Returns the verifyCallback from the ssl structure if successful.
  34656. Returns NULL otherwise. */
  34657. VerifyCallback wolfSSL_get_verify_callback(WOLFSSL* ssl)
  34658. {
  34659. WOLFSSL_ENTER("wolfSSL_get_verify_callback()");
  34660. if (ssl) {
  34661. return ssl->verifyCallback;
  34662. }
  34663. return NULL;
  34664. }
  34665. /* Creates a new bio pair.
  34666. Returns WOLFSSL_SUCCESS if no error, WOLFSSL_FAILURE otherwise.*/
  34667. int wolfSSL_BIO_new_bio_pair(WOLFSSL_BIO **bio1_p, size_t writebuf1,
  34668. WOLFSSL_BIO **bio2_p, size_t writebuf2)
  34669. {
  34670. WOLFSSL_BIO *bio1 = NULL, *bio2 = NULL;
  34671. int ret = 1;
  34672. WOLFSSL_ENTER("wolfSSL_BIO_new_bio_pair()");
  34673. if (bio1_p == NULL || bio2_p == NULL) {
  34674. WOLFSSL_MSG("Bad Function Argument");
  34675. return BAD_FUNC_ARG;
  34676. }
  34677. /* set up the new bio structures and write buf sizes */
  34678. if ((bio1 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  34679. WOLFSSL_MSG("Bio allocation failed");
  34680. ret = WOLFSSL_FAILURE;
  34681. }
  34682. if (ret) {
  34683. if ((bio2 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio())) == NULL) {
  34684. WOLFSSL_MSG("Bio allocation failed");
  34685. ret = WOLFSSL_FAILURE;
  34686. }
  34687. }
  34688. if (ret && writebuf1) {
  34689. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio1, writebuf1))) {
  34690. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  34691. }
  34692. }
  34693. if (ret && writebuf2) {
  34694. if (!(ret = wolfSSL_BIO_set_write_buf_size(bio2, writebuf2))) {
  34695. WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
  34696. }
  34697. }
  34698. if (ret) {
  34699. if ((ret = wolfSSL_BIO_make_bio_pair(bio1, bio2))) {
  34700. *bio1_p = bio1;
  34701. *bio2_p = bio2;
  34702. }
  34703. }
  34704. if (!ret) {
  34705. wolfSSL_BIO_free(bio1);
  34706. bio1 = NULL;
  34707. wolfSSL_BIO_free(bio2);
  34708. bio2 = NULL;
  34709. }
  34710. return ret;
  34711. }
  34712. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  34713. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  34714. /* Converts an rsa key from a bio buffer into an internal rsa structure.
  34715. Returns a pointer to the new WOLFSSL_RSA structure. */
  34716. WOLFSSL_RSA* wolfSSL_d2i_RSAPrivateKey_bio(WOLFSSL_BIO *bio, WOLFSSL_RSA **out)
  34717. {
  34718. const unsigned char* bioMem = NULL;
  34719. int bioMemSz = 0;
  34720. WOLFSSL_RSA* key = NULL;
  34721. unsigned char maxKeyBuf[4096];
  34722. unsigned char* bufPtr = NULL;
  34723. unsigned char* extraBioMem = NULL;
  34724. int extraBioMemSz = 0;
  34725. int derLength = 0;
  34726. int j = 0, i = 0;
  34727. WOLFSSL_ENTER("wolfSSL_d2i_RSAPrivateKey_bio()");
  34728. if (bio == NULL) {
  34729. WOLFSSL_MSG("Bad Function Argument");
  34730. return NULL;
  34731. }
  34732. (void)out;
  34733. bioMemSz = wolfSSL_BIO_pending(bio);
  34734. if (bioMemSz <= 0) {
  34735. WOLFSSL_MSG("wolfSSL_BIO_pending() failure");
  34736. return NULL;
  34737. }
  34738. bioMem = (unsigned char*)XMALLOC(bioMemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34739. if (bioMem == NULL) {
  34740. WOLFSSL_MSG("Malloc failure");
  34741. return NULL;
  34742. }
  34743. bufPtr = maxKeyBuf;
  34744. if (wolfSSL_BIO_read(bio, (unsigned char*)bioMem, (int)bioMemSz) == bioMemSz) {
  34745. const byte* bioMemPt = bioMem; /* leave bioMem pointer unaltered */
  34746. if ((key = wolfSSL_d2i_RSAPrivateKey(NULL, &bioMemPt, bioMemSz)) == NULL) {
  34747. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34748. return NULL;
  34749. }
  34750. /* This function is used to get the total length of the rsa key. */
  34751. derLength = wolfSSL_i2d_RSAPrivateKey(key, &bufPtr);
  34752. /* Write extra data back into bio object if necessary. */
  34753. extraBioMemSz = (bioMemSz - derLength);
  34754. if (extraBioMemSz > 0) {
  34755. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  34756. DYNAMIC_TYPE_TMP_BUFFER);
  34757. if (extraBioMem == NULL) {
  34758. WOLFSSL_MSG("Malloc failure");
  34759. XFREE((unsigned char*)extraBioMem, bio->heap,
  34760. DYNAMIC_TYPE_TMP_BUFFER);
  34761. XFREE((unsigned char*)bioMem, bio->heap,
  34762. DYNAMIC_TYPE_TMP_BUFFER);
  34763. return NULL;
  34764. }
  34765. for (i = derLength; i < bioMemSz; i++) {
  34766. *(extraBioMem + j) = *(bioMem + i);
  34767. j++;
  34768. }
  34769. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  34770. if (wolfSSL_BIO_pending(bio) <= 0) {
  34771. WOLFSSL_MSG("Failed to write memory to bio");
  34772. XFREE((unsigned char*)extraBioMem, bio->heap,
  34773. DYNAMIC_TYPE_TMP_BUFFER);
  34774. XFREE((unsigned char*)bioMem, bio->heap,
  34775. DYNAMIC_TYPE_TMP_BUFFER);
  34776. return NULL;
  34777. }
  34778. XFREE((unsigned char*)extraBioMem, bio->heap,
  34779. DYNAMIC_TYPE_TMP_BUFFER);
  34780. }
  34781. if (out != NULL && key != NULL) {
  34782. *out = key;
  34783. }
  34784. }
  34785. XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34786. return key;
  34787. }
  34788. #endif
  34789. /* Adds the ASN1 certificate to the user ctx.
  34790. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  34791. int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz,
  34792. const unsigned char *der)
  34793. {
  34794. WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1()");
  34795. if (der != NULL && ctx != NULL) {
  34796. if (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz,
  34797. WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) {
  34798. return WOLFSSL_SUCCESS;
  34799. }
  34800. }
  34801. return WOLFSSL_FAILURE;
  34802. }
  34803. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  34804. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  34805. /* Adds the rsa private key to the user ctx.
  34806. Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/
  34807. int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa)
  34808. {
  34809. int ret;
  34810. int derSize;
  34811. unsigned char maxDerBuf[4096];
  34812. unsigned char* key = NULL;
  34813. WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey()");
  34814. if (ctx == NULL || rsa == NULL) {
  34815. WOLFSSL_MSG("one or more inputs were NULL");
  34816. return BAD_FUNC_ARG;
  34817. }
  34818. key = maxDerBuf;
  34819. /* convert RSA struct to der encoded buffer and get the size */
  34820. if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) {
  34821. WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure");
  34822. return WOLFSSL_FAILURE;
  34823. }
  34824. ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, (const unsigned char*)maxDerBuf,
  34825. derSize, SSL_FILETYPE_ASN1);
  34826. if (ret != WOLFSSL_SUCCESS) {
  34827. WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure");
  34828. return WOLFSSL_FAILURE;
  34829. }
  34830. return ret;
  34831. }
  34832. #endif /* NO_RSA && !HAVE_FAST_RSA */
  34833. /* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure.
  34834. Returns pointer to private EVP_PKEY struct upon success, NULL if there
  34835. is a failure.*/
  34836. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_bio(WOLFSSL_BIO* bio,
  34837. WOLFSSL_EVP_PKEY** out)
  34838. {
  34839. unsigned char* mem = NULL;
  34840. int memSz = 0;
  34841. WOLFSSL_EVP_PKEY* key = NULL;
  34842. int i = 0, j = 0;
  34843. unsigned char* extraBioMem = NULL;
  34844. int extraBioMemSz = 0;
  34845. int derLength = 0;
  34846. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_bio()");
  34847. if (bio == NULL) {
  34848. return NULL;
  34849. }
  34850. (void)out;
  34851. memSz = wolfSSL_BIO_pending(bio);
  34852. if (memSz <= 0) {
  34853. WOLFSSL_MSG("wolfSSL_BIO_pending() failure");
  34854. return NULL;
  34855. }
  34856. mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34857. if (mem == NULL) {
  34858. WOLFSSL_MSG("Malloc failure");
  34859. return NULL;
  34860. }
  34861. if (wolfSSL_BIO_read(bio, (unsigned char*)mem, memSz) == memSz) {
  34862. /* Determines key type and returns the new private EVP_PKEY object */
  34863. if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == NULL) {
  34864. WOLFSSL_MSG("wolfSSL_d2i_PrivateKey_EVP() failure");
  34865. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34866. return NULL;
  34867. }
  34868. /* Write extra data back into bio object if necessary. */
  34869. derLength = key->pkey_sz;
  34870. extraBioMemSz = (memSz - derLength);
  34871. if (extraBioMemSz > 0) {
  34872. extraBioMem = (unsigned char *)XMALLOC(extraBioMemSz, NULL,
  34873. DYNAMIC_TYPE_TMP_BUFFER);
  34874. if (extraBioMem == NULL) {
  34875. WOLFSSL_MSG("Malloc failure");
  34876. XFREE((unsigned char*)extraBioMem, bio->heap,
  34877. DYNAMIC_TYPE_TMP_BUFFER);
  34878. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34879. return NULL;
  34880. }
  34881. for (i = derLength; i < memSz; i++) {
  34882. *(extraBioMem + j) = *(mem + i);
  34883. j++;
  34884. }
  34885. wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
  34886. if (wolfSSL_BIO_pending(bio) <= 0) {
  34887. WOLFSSL_MSG("Failed to write memory to bio");
  34888. XFREE((unsigned char*)extraBioMem, bio->heap,
  34889. DYNAMIC_TYPE_TMP_BUFFER);
  34890. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34891. return NULL;
  34892. }
  34893. XFREE((unsigned char*)extraBioMem, bio->heap,
  34894. DYNAMIC_TYPE_TMP_BUFFER);
  34895. }
  34896. if (out != NULL) {
  34897. *out = key;
  34898. }
  34899. }
  34900. XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  34901. return key;
  34902. }
  34903. /* Converts a DER encoded private key to a WOLFSSL_EVP_PKEY structure.
  34904. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL
  34905. * on fail */
  34906. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PrivateKey_EVP(WOLFSSL_EVP_PKEY** out,
  34907. unsigned char** in, long inSz)
  34908. {
  34909. WOLFSSL_EVP_PKEY* pkey = NULL;
  34910. const unsigned char* mem;
  34911. long memSz = inSz;
  34912. WOLFSSL_ENTER("wolfSSL_d2i_PrivateKey_EVP()");
  34913. if (in == NULL || *in == NULL || inSz < 0) {
  34914. WOLFSSL_MSG("Bad argument");
  34915. return NULL;
  34916. }
  34917. mem = *in;
  34918. #if !defined(NO_RSA)
  34919. {
  34920. RsaKey rsa;
  34921. word32 keyIdx = 0;
  34922. /* test if RSA key */
  34923. if (wc_InitRsaKey(&rsa, NULL) == 0 &&
  34924. wc_RsaPrivateKeyDecode(mem, &keyIdx, &rsa, (word32)memSz) == 0) {
  34925. wc_FreeRsaKey(&rsa);
  34926. pkey = wolfSSL_EVP_PKEY_new();
  34927. if (pkey != NULL) {
  34928. pkey->pkey_sz = keyIdx;
  34929. pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL,
  34930. DYNAMIC_TYPE_PRIVATE_KEY);
  34931. if (pkey->pkey.ptr == NULL) {
  34932. wolfSSL_EVP_PKEY_free(pkey);
  34933. return NULL;
  34934. }
  34935. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  34936. pkey->type = EVP_PKEY_RSA;
  34937. if (out != NULL) {
  34938. *out = pkey;
  34939. }
  34940. pkey->ownRsa = 1;
  34941. pkey->rsa = wolfSSL_RSA_new();
  34942. if (pkey->rsa == NULL) {
  34943. wolfSSL_EVP_PKEY_free(pkey);
  34944. return NULL;
  34945. }
  34946. if (wolfSSL_RSA_LoadDer_ex(pkey->rsa,
  34947. (const unsigned char*)pkey->pkey.ptr,
  34948. pkey->pkey_sz, WOLFSSL_RSA_LOAD_PRIVATE) != 1) {
  34949. wolfSSL_EVP_PKEY_free(pkey);
  34950. return NULL;
  34951. }
  34952. return pkey;
  34953. }
  34954. }
  34955. wc_FreeRsaKey(&rsa);
  34956. }
  34957. #endif /* NO_RSA */
  34958. #ifdef HAVE_ECC
  34959. {
  34960. word32 keyIdx = 0;
  34961. ecc_key ecc;
  34962. /* test if ecc key */
  34963. if (wc_ecc_init(&ecc) == 0 &&
  34964. wc_EccPrivateKeyDecode(mem, &keyIdx, &ecc, (word32)memSz) == 0) {
  34965. wc_ecc_free(&ecc);
  34966. pkey = wolfSSL_EVP_PKEY_new();
  34967. if (pkey != NULL) {
  34968. pkey->pkey_sz = keyIdx;
  34969. pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL,
  34970. DYNAMIC_TYPE_PRIVATE_KEY);
  34971. if (pkey->pkey.ptr == NULL) {
  34972. wolfSSL_EVP_PKEY_free(pkey);
  34973. return NULL;
  34974. }
  34975. XMEMCPY(pkey->pkey.ptr, mem, keyIdx);
  34976. pkey->type = EVP_PKEY_EC;
  34977. if (out != NULL) {
  34978. *out = pkey;
  34979. }
  34980. return pkey;
  34981. }
  34982. }
  34983. wc_ecc_free(&ecc);
  34984. }
  34985. #endif /* HAVE_ECC */
  34986. return pkey;
  34987. }
  34988. #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */
  34989. /* stunnel compatibility functions*/
  34990. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  34991. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  34992. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  34993. void wolfSSL_ERR_remove_thread_state(void* pid)
  34994. {
  34995. (void) pid;
  34996. return;
  34997. }
  34998. #ifndef NO_FILESYSTEM
  34999. /***TBD ***/
  35000. void wolfSSL_print_all_errors_fp(XFILE fp)
  35001. {
  35002. (void)fp;
  35003. }
  35004. #endif /* !NO_FILESYSTEM */
  35005. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
  35006. HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */
  35007. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || defined(FORTRESS)
  35008. int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data)
  35009. {
  35010. WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data");
  35011. #ifdef HAVE_EX_DATA
  35012. if(session != NULL) {
  35013. return wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data);
  35014. }
  35015. #else
  35016. (void)session;
  35017. (void)idx;
  35018. (void)data;
  35019. #endif
  35020. return WOLFSSL_FAILURE;
  35021. }
  35022. void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
  35023. {
  35024. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
  35025. #ifdef HAVE_EX_DATA
  35026. if (session != NULL) {
  35027. return wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
  35028. }
  35029. #else
  35030. (void)session;
  35031. (void)idx;
  35032. #endif
  35033. return NULL;
  35034. }
  35035. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || FORTRESS */
  35036. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
  35037. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
  35038. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
  35039. int wolfSSL_SESSION_get_ex_new_index(long idx, void* data, void* cb1,
  35040. void* cb2, CRYPTO_free_func* cb3)
  35041. {
  35042. WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index");
  35043. (void)idx;
  35044. (void)cb1;
  35045. (void)cb2;
  35046. (void)cb3;
  35047. if (XSTRNCMP((const char*)data, "redirect index", 14) == 0) {
  35048. return 0;
  35049. }
  35050. else if (XSTRNCMP((const char*)data, "addr index", 10) == 0) {
  35051. return 1;
  35052. }
  35053. return WOLFSSL_FAILURE;
  35054. }
  35055. #ifndef NO_WOLFSSL_STUB
  35056. int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int),
  35057. void *(*r) (void *, size_t, const char *,
  35058. int), void (*f) (void *))
  35059. {
  35060. (void) m;
  35061. (void) r;
  35062. (void) f;
  35063. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_mem_ex_functions");
  35064. WOLFSSL_STUB("CRYPTO_set_mem_ex_functions");
  35065. return WOLFSSL_FAILURE;
  35066. }
  35067. #endif
  35068. void wolfSSL_CRYPTO_cleanup_all_ex_data(void){
  35069. WOLFSSL_ENTER("CRYPTO_cleanup_all_ex_data");
  35070. }
  35071. #ifndef NO_WOLFSSL_STUB
  35072. WOLFSSL_DH *wolfSSL_DH_generate_parameters(int prime_len, int generator,
  35073. void (*callback) (int, int, void *), void *cb_arg)
  35074. {
  35075. (void)prime_len;
  35076. (void)generator;
  35077. (void)callback;
  35078. (void)cb_arg;
  35079. WOLFSSL_ENTER("wolfSSL_DH_generate_parameters");
  35080. WOLFSSL_STUB("DH_generate_parameters");
  35081. return NULL;
  35082. }
  35083. #endif
  35084. #ifndef NO_WOLFSSL_STUB
  35085. int wolfSSL_DH_generate_parameters_ex(WOLFSSL_DH* dh, int prime_len, int generator,
  35086. void (*callback) (int, int, void *))
  35087. {
  35088. (void)prime_len;
  35089. (void)generator;
  35090. (void)callback;
  35091. (void)dh;
  35092. WOLFSSL_ENTER("wolfSSL_DH_generate_parameters_ex");
  35093. WOLFSSL_STUB("DH_generate_parameters_ex");
  35094. return -1;
  35095. }
  35096. #endif
  35097. void wolfSSL_ERR_load_crypto_strings(void)
  35098. {
  35099. WOLFSSL_ENTER("wolfSSL_ERR_load_crypto_strings");
  35100. /* Do nothing */
  35101. return;
  35102. }
  35103. #ifndef NO_WOLFSSL_STUB
  35104. int wolfSSL_FIPS_mode(void)
  35105. {
  35106. WOLFSSL_ENTER("wolfSSL_FIPS_mode");
  35107. WOLFSSL_STUB("FIPS_mode");
  35108. return WOLFSSL_FAILURE;
  35109. }
  35110. #endif
  35111. #ifndef NO_WOLFSSL_STUB
  35112. int wolfSSL_FIPS_mode_set(int r)
  35113. {
  35114. (void)r;
  35115. WOLFSSL_ENTER("wolfSSL_FIPS_mode_set");
  35116. WOLFSSL_STUB("FIPS_mode_set");
  35117. return WOLFSSL_FAILURE;
  35118. }
  35119. #endif
  35120. #ifndef NO_WOLFSSL_STUB
  35121. int wolfSSL_RAND_set_rand_method(const void *meth)
  35122. {
  35123. (void) meth;
  35124. WOLFSSL_ENTER("wolfSSL_RAND_set_rand_method");
  35125. WOLFSSL_STUB("RAND_set_rand_method");
  35126. /* if implemented RAND_bytes and RAND_pseudo_bytes need updated
  35127. * those two functions will call the respective functions from meth */
  35128. return SSL_FAILURE;
  35129. }
  35130. #endif
  35131. int wolfSSL_CIPHER_get_bits(const WOLFSSL_CIPHER *c, int *alg_bits)
  35132. {
  35133. int ret = WOLFSSL_FAILURE;
  35134. WOLFSSL_ENTER("wolfSSL_CIPHER_get_bits");
  35135. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  35136. (void)alg_bits;
  35137. if (c!= NULL)
  35138. ret = c->bits;
  35139. #else
  35140. if (c != NULL && c->ssl != NULL) {
  35141. ret = 8 * c->ssl->specs.key_size;
  35142. if (alg_bits != NULL) {
  35143. *alg_bits = ret;
  35144. }
  35145. }
  35146. #endif
  35147. return ret;
  35148. }
  35149. #if defined(OPENSSL_ALL)
  35150. WOLFSSL_X509_INFO* wolfSSL_X509_INFO_new(void)
  35151. {
  35152. WOLFSSL_X509_INFO* info;
  35153. info = (WOLFSSL_X509_INFO*)XMALLOC(sizeof(WOLFSSL_X509_INFO), NULL,
  35154. DYNAMIC_TYPE_X509);
  35155. if (info) {
  35156. XMEMSET(info, 0, sizeof(*info));
  35157. }
  35158. return info;
  35159. }
  35160. void wolfSSL_X509_INFO_free(WOLFSSL_X509_INFO* info)
  35161. {
  35162. if (info == NULL)
  35163. return;
  35164. if (info->x509) {
  35165. wolfSSL_X509_free(info->x509);
  35166. info->x509 = NULL;
  35167. }
  35168. #ifdef HAVE_CRL
  35169. if (info->crl) {
  35170. wolfSSL_X509_CRL_free(info->crl);
  35171. info->crl = NULL;
  35172. }
  35173. #endif
  35174. wolfSSL_X509_PKEY_free(info->x_pkey);
  35175. info->x_pkey = NULL;
  35176. XFREE(info, NULL, DYNAMIC_TYPE_X509);
  35177. }
  35178. #endif
  35179. WOLFSSL_STACK* wolfSSL_sk_X509_INFO_new_null(void)
  35180. {
  35181. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  35182. if (sk) {
  35183. sk->type = STACK_TYPE_X509_INFO;
  35184. }
  35185. return sk;
  35186. }
  35187. /* returns value less than 0 on fail to match
  35188. * On a successful match the priority level found is returned
  35189. */
  35190. int wolfSSL_sk_SSL_CIPHER_find(
  35191. WOLF_STACK_OF(WOLFSSL_CIPHER)* sk, const WOLFSSL_CIPHER* toFind)
  35192. {
  35193. WOLFSSL_STACK* next;
  35194. int i, sz;
  35195. if (sk == NULL || toFind == NULL) {
  35196. return WOLFSSL_FATAL_ERROR;
  35197. }
  35198. sz = wolfSSL_sk_SSL_CIPHER_num(sk);
  35199. next = sk;
  35200. for (i = 0; i < sz && next != NULL; i++) {
  35201. if (next->data.cipher.cipherSuite0 == toFind->cipherSuite0 &&
  35202. next->data.cipher.cipherSuite == toFind->cipherSuite) {
  35203. return sz - i; /* reverse because stack pushed highest on first */
  35204. }
  35205. next = next->next;
  35206. }
  35207. return WOLFSSL_FATAL_ERROR;
  35208. }
  35209. /* nothing to do yet */
  35210. static void wolfSSL_CIPHER_free(WOLFSSL_CIPHER* in)
  35211. {
  35212. (void)in;
  35213. }
  35214. /* free's all nodes in the stack and there data */
  35215. void wolfSSL_sk_SSL_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
  35216. {
  35217. WOLFSSL_STACK* current = sk;
  35218. while (current != NULL) {
  35219. WOLFSSL_STACK* toFree = current;
  35220. current = current->next;
  35221. wolfSSL_CIPHER_free(&(toFree->data.cipher));
  35222. wolfSSL_sk_free_node(toFree);
  35223. }
  35224. }
  35225. int wolfSSL_sk_X509_INFO_num(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  35226. {
  35227. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_num");
  35228. if (sk == NULL)
  35229. return -1;
  35230. return (int)sk->num;
  35231. }
  35232. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_value(const WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk, int i)
  35233. {
  35234. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_value");
  35235. for (; sk != NULL && i > 0; i--)
  35236. sk = sk->next;
  35237. if (i != 0 || sk == NULL)
  35238. return NULL;
  35239. return sk->data.info;
  35240. }
  35241. WOLFSSL_X509_INFO* wolfSSL_sk_X509_INFO_pop(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk)
  35242. {
  35243. WOLFSSL_STACK* node;
  35244. WOLFSSL_X509_INFO* info;
  35245. if (sk == NULL) {
  35246. return NULL;
  35247. }
  35248. node = sk->next;
  35249. info = sk->data.info;
  35250. if (node != NULL) { /* update sk and remove node from stack */
  35251. sk->data.info = node->data.info;
  35252. sk->next = node->next;
  35253. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  35254. }
  35255. else { /* last x509 in stack */
  35256. sk->data.info = NULL;
  35257. }
  35258. if (sk->num > 0) {
  35259. sk->num -= 1;
  35260. }
  35261. return info;
  35262. }
  35263. #if defined(OPENSSL_ALL)
  35264. void wolfSSL_sk_X509_INFO_pop_free(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  35265. void (*f) (WOLFSSL_X509_INFO*))
  35266. {
  35267. WOLFSSL_STACK* node;
  35268. WOLFSSL_ENTER("wolfSSL_sk_X509_INFO_pop_free");
  35269. if (sk == NULL) {
  35270. return;
  35271. }
  35272. /* parse through stack freeing each node */
  35273. node = sk->next;
  35274. while (node && sk->num > 1) {
  35275. WOLFSSL_STACK* tmp = node;
  35276. node = node->next;
  35277. if (f)
  35278. f(tmp->data.info);
  35279. else
  35280. wolfSSL_X509_INFO_free(tmp->data.info);
  35281. tmp->data.info = NULL;
  35282. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  35283. sk->num -= 1;
  35284. }
  35285. /* free head of stack */
  35286. if (sk->num == 1) {
  35287. if (f)
  35288. f(sk->data.info);
  35289. else
  35290. wolfSSL_X509_INFO_free(sk->data.info);
  35291. sk->data.info = NULL;
  35292. }
  35293. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  35294. }
  35295. void wolfSSL_sk_X509_INFO_free(WOLF_STACK_OF(WOLFSSL_X509_INFO) *sk)
  35296. {
  35297. wolfSSL_sk_X509_INFO_pop_free(sk, NULL);
  35298. }
  35299. /* Adds the WOLFSSL_X509_INFO to the stack "sk". "sk" takes control of "in" and
  35300. * tries to free it when the stack is free'd.
  35301. *
  35302. * return 1 on success 0 on fail
  35303. */
  35304. int wolfSSL_sk_X509_INFO_push(WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
  35305. WOLFSSL_X509_INFO* in)
  35306. {
  35307. WOLFSSL_STACK* node;
  35308. if (sk == NULL || in == NULL) {
  35309. return WOLFSSL_FAILURE;
  35310. }
  35311. /* no previous values in stack */
  35312. if (sk->data.info == NULL) {
  35313. sk->data.info = in;
  35314. sk->num += 1;
  35315. return WOLFSSL_SUCCESS;
  35316. }
  35317. /* stack already has value(s) create a new node and add more */
  35318. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  35319. DYNAMIC_TYPE_X509);
  35320. if (node == NULL) {
  35321. WOLFSSL_MSG("Memory error");
  35322. return WOLFSSL_FAILURE;
  35323. }
  35324. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  35325. /* push new obj onto head of stack */
  35326. node->data.info = sk->data.info;
  35327. node->next = sk->next;
  35328. node->type = sk->type;
  35329. sk->next = node;
  35330. sk->data.info = in;
  35331. sk->num += 1;
  35332. return WOLFSSL_SUCCESS;
  35333. }
  35334. WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_sk_X509_NAME_new(wolf_sk_compare_cb cb)
  35335. {
  35336. WOLFSSL_STACK* sk;
  35337. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_new");
  35338. sk = wolfSSL_sk_new_node(NULL);
  35339. if (sk != NULL) {
  35340. sk->type = STACK_TYPE_X509_NAME;
  35341. sk->comp = cb;
  35342. }
  35343. return sk;
  35344. }
  35345. int wolfSSL_sk_X509_NAME_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  35346. WOLFSSL_X509_NAME* name)
  35347. {
  35348. WOLFSSL_STACK* node;
  35349. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_push");
  35350. if (sk == NULL || name == NULL) {
  35351. return BAD_FUNC_ARG;
  35352. }
  35353. /* no previous values in stack */
  35354. if (sk->data.name == NULL) {
  35355. sk->data.name = name;
  35356. sk->num += 1;
  35357. return 0;
  35358. }
  35359. /* stack already has value(s) create a new node and add more */
  35360. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  35361. DYNAMIC_TYPE_OPENSSL);
  35362. if (node == NULL) {
  35363. WOLFSSL_MSG("Memory error");
  35364. return MEMORY_E;
  35365. }
  35366. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  35367. /* push new obj onto head of stack */
  35368. node->data.name = sk->data.name;
  35369. node->next = sk->next;
  35370. sk->type = STACK_TYPE_X509_NAME;
  35371. sk->next = node;
  35372. sk->data.name = name;
  35373. sk->num += 1;
  35374. return 0;
  35375. }
  35376. /* return index of found, or negative to indicate not found */
  35377. int wolfSSL_sk_X509_NAME_find(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk,
  35378. WOLFSSL_X509_NAME *name)
  35379. {
  35380. int i;
  35381. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_find");
  35382. if (sk == NULL)
  35383. return BAD_FUNC_ARG;
  35384. for (i = 0; sk; i++, sk = sk->next) {
  35385. if (wolfSSL_X509_NAME_cmp(sk->data.name, name) == 0) {
  35386. return i;
  35387. }
  35388. }
  35389. return -1;
  35390. }
  35391. int wolfSSL_sk_X509_OBJECT_num(const WOLF_STACK_OF(WOLFSSL_X509_OBJECT) *s)
  35392. {
  35393. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_num");
  35394. if (s) {
  35395. return (int)s->num;
  35396. } else {
  35397. return 0;
  35398. }
  35399. }
  35400. int wolfSSL_sk_X509_NAME_set_cmp_func(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  35401. wolf_sk_compare_cb cb)
  35402. {
  35403. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_set_cmp_func");
  35404. if (sk == NULL)
  35405. return BAD_FUNC_ARG;
  35406. sk->comp = cb;
  35407. return 0;
  35408. }
  35409. #endif /* OPENSSL_ALL */
  35410. int wolfSSL_sk_X509_NAME_num(const WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk)
  35411. {
  35412. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_num");
  35413. if (sk == NULL)
  35414. return BAD_FUNC_ARG;
  35415. return (int)sk->num;
  35416. }
  35417. /* Getter function for WOLFSSL_X509_NAME pointer
  35418. *
  35419. * sk is the stack to retrieve pointer from
  35420. * i is the index value in stack
  35421. *
  35422. * returns a pointer to a WOLFSSL_X509_NAME structure on success and NULL on
  35423. * fail
  35424. */
  35425. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_value(const STACK_OF(WOLFSSL_X509_NAME)* sk,
  35426. int i)
  35427. {
  35428. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_value");
  35429. for (; sk != NULL && i > 0; i--) {
  35430. sk = sk->next;
  35431. }
  35432. if (i != 0 || sk == NULL)
  35433. return NULL;
  35434. return sk->data.name;
  35435. }
  35436. WOLFSSL_X509_NAME* wolfSSL_sk_X509_NAME_pop(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  35437. {
  35438. WOLFSSL_STACK* node;
  35439. WOLFSSL_X509_NAME* name;
  35440. if (sk == NULL) {
  35441. return NULL;
  35442. }
  35443. node = sk->next;
  35444. name = sk->data.name;
  35445. if (node != NULL) { /* update sk and remove node from stack */
  35446. sk->data.name = node->data.name;
  35447. sk->next = node->next;
  35448. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  35449. }
  35450. else { /* last x509 in stack */
  35451. sk->data.name = NULL;
  35452. }
  35453. if (sk->num > 0) {
  35454. sk->num -= 1;
  35455. }
  35456. return name;
  35457. }
  35458. void wolfSSL_sk_X509_NAME_pop_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
  35459. void (*f) (WOLFSSL_X509_NAME*))
  35460. {
  35461. WOLFSSL_STACK* node;
  35462. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_pop_free");
  35463. if (sk == NULL)
  35464. return;
  35465. node = sk->next;
  35466. while (node && sk->num > 1) {
  35467. WOLFSSL_STACK* tmp = node;
  35468. node = node->next;
  35469. if (f)
  35470. f(tmp->data.name);
  35471. else
  35472. wolfSSL_X509_NAME_free(tmp->data.name);
  35473. tmp->data.name = NULL;
  35474. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  35475. sk->num -= 1;
  35476. }
  35477. /* free head of stack */
  35478. if (sk->num == 1) {
  35479. if (f)
  35480. f(sk->data.name);
  35481. else
  35482. wolfSSL_X509_NAME_free(sk->data.name);
  35483. sk->data.name = NULL;
  35484. }
  35485. XFREE(sk, sk->heap, DYNAMIC_TYPE_OPENSSL);
  35486. }
  35487. /* Free only the sk structure, NOT X509_NAME members */
  35488. void wolfSSL_sk_X509_NAME_free(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
  35489. {
  35490. WOLFSSL_STACK* node;
  35491. WOLFSSL_ENTER("wolfSSL_sk_X509_NAME_free");
  35492. if (sk == NULL)
  35493. return;
  35494. node = sk->next;
  35495. while (sk->num > 1) {
  35496. WOLFSSL_STACK* tmp = node;
  35497. node = node->next;
  35498. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  35499. sk->num -= 1;
  35500. }
  35501. XFREE(sk, sk->heap, DYNAMIC_TYPE_OPENSSL);
  35502. }
  35503. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  35504. /* Helper function for X509_NAME_print_ex. Sets *buf to string for domain
  35505. name attribute based on NID. Returns size of buf */
  35506. static int get_dn_attr_by_nid(int n, const char** buf)
  35507. {
  35508. int len = 0;
  35509. const char *str;
  35510. switch(n)
  35511. {
  35512. case NID_commonName :
  35513. str = "CN";
  35514. len = 2;
  35515. break;
  35516. case NID_countryName:
  35517. str = "C";
  35518. len = 1;
  35519. break;
  35520. case NID_localityName:
  35521. str = "L";
  35522. len = 1;
  35523. break;
  35524. case NID_stateOrProvinceName:
  35525. str = "ST";
  35526. len = 2;
  35527. break;
  35528. case NID_organizationName:
  35529. str = "O";
  35530. len = 1;
  35531. break;
  35532. case NID_organizationalUnitName:
  35533. str = "OU";
  35534. len = 2;
  35535. break;
  35536. case NID_emailAddress:
  35537. str = "emailAddress";
  35538. len = 12;
  35539. break;
  35540. default:
  35541. WOLFSSL_MSG("Attribute type not found");
  35542. str = NULL;
  35543. }
  35544. if (buf != NULL)
  35545. *buf = str;
  35546. return len;
  35547. }
  35548. #endif
  35549. /*
  35550. * The BIO output of wolfSSL_X509_NAME_print_ex does NOT include the null terminator
  35551. */
  35552. int wolfSSL_X509_NAME_print_ex(WOLFSSL_BIO* bio, WOLFSSL_X509_NAME* name,
  35553. int indent, unsigned long flags)
  35554. {
  35555. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  35556. int count = 0, len = 0, totalSz = 0, tmpSz = 0;
  35557. char tmp[ASN_NAME_MAX+1];
  35558. char fullName[ASN_NAME_MAX];
  35559. const char *buf = NULL;
  35560. WOLFSSL_X509_NAME_ENTRY* ne;
  35561. WOLFSSL_ASN1_STRING* str;
  35562. #endif
  35563. int i;
  35564. (void)flags;
  35565. WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex");
  35566. for (i = 0; i < indent; i++) {
  35567. if (wolfSSL_BIO_write(bio, " ", 1) != 1)
  35568. return WOLFSSL_FAILURE;
  35569. }
  35570. #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  35571. /* If XN_FLAG_DN_REV is present, print X509_NAME in reverse order */
  35572. if (flags == (XN_FLAG_RFC2253 & ~XN_FLAG_DN_REV)) {
  35573. fullName[0] = '\0';
  35574. count = wolfSSL_X509_NAME_entry_count(name);
  35575. for (i = 0; i < count; i++) {
  35576. ne = wolfSSL_X509_NAME_get_entry(name, count - i - 1);
  35577. if (ne == NULL)
  35578. return WOLFSSL_FAILURE;
  35579. str = wolfSSL_X509_NAME_ENTRY_get_data(ne);
  35580. if (str == NULL)
  35581. return WOLFSSL_FAILURE;
  35582. len = get_dn_attr_by_nid(ne->nid, &buf);
  35583. if (len == 0 || buf == NULL)
  35584. return WOLFSSL_FAILURE;
  35585. tmpSz = str->length + len + 2; /* + 2 for '=' and comma */
  35586. if (tmpSz > ASN_NAME_MAX) {
  35587. WOLFSSL_MSG("Size greater than ASN_NAME_MAX");
  35588. return WOLFSSL_FAILURE;
  35589. }
  35590. if (i < count - 1) {
  35591. /* tmpSz+1 for last null char */
  35592. XSNPRINTF(tmp, tmpSz+1, "%s=%s,", buf, str->data);
  35593. XSTRNCAT(fullName, tmp, tmpSz+1);
  35594. }
  35595. else {
  35596. XSNPRINTF(tmp, tmpSz, "%s=%s", buf, str->data);
  35597. XSTRNCAT(fullName, tmp, tmpSz-1);
  35598. tmpSz--; /* Don't include null char in tmpSz */
  35599. }
  35600. totalSz += tmpSz;
  35601. }
  35602. if (wolfSSL_BIO_write(bio, fullName, totalSz) != totalSz)
  35603. return WOLFSSL_FAILURE;
  35604. return WOLFSSL_SUCCESS;
  35605. }
  35606. #else
  35607. if (flags == XN_FLAG_RFC2253) {
  35608. if (wolfSSL_BIO_write(bio, name->name + 1, name->sz - 2)
  35609. != name->sz - 2)
  35610. return WOLFSSL_FAILURE;
  35611. }
  35612. #endif /* WOLFSSL_APACHE_HTTPD || OPENSSL_ALL || WOLFSSL_NGINX */
  35613. else if (wolfSSL_BIO_write(bio, name->name, name->sz - 1) != name->sz - 1)
  35614. return WOLFSSL_FAILURE;
  35615. return WOLFSSL_SUCCESS;
  35616. }
  35617. #ifndef NO_WOLFSSL_STUB
  35618. WOLFSSL_ASN1_BIT_STRING* wolfSSL_X509_get0_pubkey_bitstr(const WOLFSSL_X509* x)
  35619. {
  35620. (void)x;
  35621. WOLFSSL_ENTER("wolfSSL_X509_get0_pubkey_bitstr");
  35622. WOLFSSL_STUB("X509_get0_pubkey_bitstr");
  35623. return NULL;
  35624. }
  35625. #endif
  35626. #ifndef NO_WOLFSSL_STUB
  35627. int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session)
  35628. {
  35629. (void)ctx;
  35630. (void)session;
  35631. WOLFSSL_ENTER("wolfSSL_CTX_add_session");
  35632. WOLFSSL_STUB("SSL_CTX_add_session");
  35633. return WOLFSSL_SUCCESS;
  35634. }
  35635. #endif
  35636. int wolfSSL_version(WOLFSSL* ssl)
  35637. {
  35638. WOLFSSL_ENTER("wolfSSL_version");
  35639. if (ssl->version.major == SSLv3_MAJOR) {
  35640. switch (ssl->version.minor) {
  35641. case SSLv3_MINOR :
  35642. return SSL3_VERSION;
  35643. case TLSv1_MINOR :
  35644. return TLS1_VERSION;
  35645. case TLSv1_1_MINOR :
  35646. return TLS1_1_VERSION;
  35647. case TLSv1_2_MINOR :
  35648. return TLS1_2_VERSION;
  35649. case TLSv1_3_MINOR :
  35650. return TLS1_3_VERSION;
  35651. default:
  35652. return WOLFSSL_FAILURE;
  35653. }
  35654. }
  35655. else if (ssl->version.major == DTLS_MAJOR) {
  35656. switch (ssl->version.minor) {
  35657. case DTLS_MINOR :
  35658. return DTLS1_VERSION;
  35659. case DTLSv1_2_MINOR :
  35660. return DTLS1_2_VERSION;
  35661. default:
  35662. return WOLFSSL_FAILURE;
  35663. }
  35664. }
  35665. return WOLFSSL_FAILURE;
  35666. }
  35667. int wolfSSL_X509_NAME_get_sz(WOLFSSL_X509_NAME* name)
  35668. {
  35669. WOLFSSL_ENTER("wolfSSL_X509_NAME_get_sz");
  35670. if(!name)
  35671. return -1;
  35672. return name->sz;
  35673. }
  35674. #ifdef HAVE_SNI
  35675. int wolfSSL_set_tlsext_host_name(WOLFSSL* ssl, const char* host_name)
  35676. {
  35677. int ret;
  35678. WOLFSSL_ENTER("wolfSSL_set_tlsext_host_name");
  35679. ret = wolfSSL_UseSNI(ssl, WOLFSSL_SNI_HOST_NAME,
  35680. host_name, (word16)XSTRLEN(host_name));
  35681. WOLFSSL_LEAVE("wolfSSL_set_tlsext_host_name", ret);
  35682. return ret;
  35683. }
  35684. #ifndef NO_WOLFSSL_SERVER
  35685. const char * wolfSSL_get_servername(WOLFSSL* ssl, byte type)
  35686. {
  35687. void * serverName = NULL;
  35688. if (ssl == NULL)
  35689. return NULL;
  35690. TLSX_SNI_GetRequest(ssl->extensions, type, &serverName);
  35691. return (const char *)serverName;
  35692. }
  35693. #endif /* NO_WOLFSSL_SERVER */
  35694. #endif /* HAVE_SNI */
  35695. WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
  35696. {
  35697. if (ssl && ctx && SetSSL_CTX(ssl, ctx, 0) == WOLFSSL_SUCCESS)
  35698. return ssl->ctx;
  35699. return NULL;
  35700. }
  35701. VerifyCallback wolfSSL_CTX_get_verify_callback(WOLFSSL_CTX* ctx)
  35702. {
  35703. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_callback");
  35704. if(ctx)
  35705. return ctx->verifyCallback;
  35706. return NULL;
  35707. }
  35708. void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb)
  35709. {
  35710. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback");
  35711. if (ctx)
  35712. ctx->sniRecvCb = cb;
  35713. }
  35714. int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx,
  35715. CallbackSniRecv cb)
  35716. {
  35717. WOLFSSL_ENTER("wolfSSL_CTX_set_tlsext_servername_callback");
  35718. if (ctx) {
  35719. ctx->sniRecvCb = cb;
  35720. return WOLFSSL_SUCCESS;
  35721. }
  35722. return WOLFSSL_FAILURE;
  35723. }
  35724. int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg)
  35725. {
  35726. WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg");
  35727. if (ctx) {
  35728. ctx->sniRecvCbArg = arg;
  35729. return WOLFSSL_SUCCESS;
  35730. }
  35731. return WOLFSSL_FAILURE;
  35732. }
  35733. void wolfSSL_ERR_load_BIO_strings(void) {
  35734. WOLFSSL_ENTER("ERR_load_BIO_strings");
  35735. /* do nothing */
  35736. }
  35737. #ifndef NO_WOLFSSL_STUB
  35738. void wolfSSL_THREADID_set_callback(void(*threadid_func)(void*))
  35739. {
  35740. WOLFSSL_ENTER("wolfSSL_THREADID_set_callback");
  35741. WOLFSSL_STUB("CRYPTO_THREADID_set_callback");
  35742. (void)threadid_func;
  35743. return;
  35744. }
  35745. #endif
  35746. #ifndef NO_WOLFSSL_STUB
  35747. void wolfSSL_THREADID_set_numeric(void* id, unsigned long val)
  35748. {
  35749. WOLFSSL_ENTER("wolfSSL_THREADID_set_numeric");
  35750. WOLFSSL_STUB("CRYPTO_THREADID_set_numeric");
  35751. (void)id;
  35752. (void)val;
  35753. return;
  35754. }
  35755. #endif
  35756. #ifndef NO_WOLFSSL_STUB
  35757. WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_X509_STORE_get1_certs(
  35758. WOLFSSL_X509_STORE_CTX* ctx, WOLFSSL_X509_NAME* name)
  35759. {
  35760. WOLFSSL_ENTER("wolfSSL_X509_STORE_get1_certs");
  35761. WOLFSSL_STUB("X509_STORE_get1_certs");
  35762. (void)ctx;
  35763. (void)name;
  35764. return NULL;
  35765. }
  35766. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* wolfSSL_X509_STORE_get0_objects(
  35767. WOLFSSL_X509_STORE* store)
  35768. {
  35769. WOLFSSL_ENTER("wolfSSL_X509_STORE_get0_objects");
  35770. WOLFSSL_STUB("wolfSSL_X509_STORE_get0_objects");
  35771. (void)store;
  35772. return NULL;
  35773. }
  35774. WOLFSSL_X509_OBJECT* wolfSSL_sk_X509_OBJECT_delete(
  35775. WOLF_STACK_OF(WOLFSSL_X509_OBJECT)* sk, int i)
  35776. {
  35777. WOLFSSL_ENTER("wolfSSL_sk_X509_OBJECT_delete");
  35778. WOLFSSL_STUB("wolfSSL_sk_X509_OBJECT_delete");
  35779. (void)sk;
  35780. (void)i;
  35781. return NULL;
  35782. }
  35783. void wolfSSL_X509_OBJECT_free(WOLFSSL_X509_OBJECT *a)
  35784. {
  35785. WOLFSSL_ENTER("wolfSSL_X509_OBJECT_free");
  35786. WOLFSSL_STUB("wolfSSL_X509_OBJECT_free");
  35787. (void)a;
  35788. }
  35789. #endif
  35790. #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_LIGHTY)) */
  35791. #if defined(OPENSSL_EXTRA)
  35792. int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size)
  35793. {
  35794. if (!a || !b)
  35795. return 0;
  35796. return ConstantCompare((const byte*)a, (const byte*)b, (int)size);
  35797. }
  35798. int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s)
  35799. {
  35800. WOLFSSL_ENTER("wolfSSL_sk_X509_num");
  35801. if (s == NULL)
  35802. return -1;
  35803. return (int)s->num;
  35804. }
  35805. unsigned long wolfSSL_ERR_peek_last_error(void)
  35806. {
  35807. WOLFSSL_ENTER("wolfSSL_ERR_peek_last_error");
  35808. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_NGINX)
  35809. {
  35810. int ret;
  35811. if ((ret = wc_PeekErrorNode(-1, NULL, NULL, NULL)) < 0) {
  35812. WOLFSSL_MSG("Issue peeking at error node in queue");
  35813. return 0;
  35814. }
  35815. if (ret == -ASN_NO_PEM_HEADER)
  35816. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  35817. return (unsigned long)ret;
  35818. }
  35819. #else
  35820. return (unsigned long)(0 - NOT_COMPILED_IN);
  35821. #endif
  35822. }
  35823. #endif /* OPENSSL_EXTRA */
  35824. WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl)
  35825. {
  35826. WOLFSSL_ENTER("wolfSSL_get_SSL_CTX");
  35827. return ssl->ctx;
  35828. }
  35829. #if defined(OPENSSL_ALL) || \
  35830. defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \
  35831. defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  35832. const byte* wolfSSL_SESSION_get_id(WOLFSSL_SESSION* sess, unsigned int* idLen)
  35833. {
  35834. WOLFSSL_ENTER("wolfSSL_SESSION_get_id");
  35835. if(!sess || !idLen) {
  35836. WOLFSSL_MSG("Bad func args. Please provide idLen");
  35837. return NULL;
  35838. }
  35839. *idLen = sess->sessionIDSz;
  35840. return sess->sessionID;
  35841. }
  35842. #if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
  35843. !defined(NO_FILESYSTEM)
  35844. #if defined(SESSION_CERTS) || \
  35845. (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET))
  35846. /* returns a pointer to the protocol used by the session */
  35847. static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in)
  35848. {
  35849. return wolfSSL_internal_get_version((ProtocolVersion*)&in->version);
  35850. }
  35851. #endif
  35852. /* returns true (non 0) if the session has EMS (extended master secret) */
  35853. static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in)
  35854. {
  35855. if (in == NULL)
  35856. return 0;
  35857. return in->haveEMS;
  35858. }
  35859. #if defined(HAVE_SESSION_TICKET)
  35860. /* prints out the ticket to bio passed in
  35861. * return WOLFSSL_SUCCESS on success
  35862. */
  35863. static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio,
  35864. const WOLFSSL_SESSION* in, const char* tab)
  35865. {
  35866. unsigned short i, j, z, sz;
  35867. short tag = 0;
  35868. byte* pt;
  35869. if (in == NULL || bio == NULL) {
  35870. return BAD_FUNC_ARG;
  35871. }
  35872. sz = in->ticketLen;
  35873. pt = in->ticket;
  35874. if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0)
  35875. return WOLFSSL_FAILURE;
  35876. for (i = 0; i < sz;) {
  35877. char asc[16];
  35878. if (sz - i < 16) {
  35879. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0)
  35880. return WOLFSSL_FAILURE;
  35881. }
  35882. else {
  35883. if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0)
  35884. return WOLFSSL_FAILURE;
  35885. }
  35886. for (j = 0; i < sz && j < 8; j++,i++) {
  35887. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  35888. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  35889. return WOLFSSL_FAILURE;
  35890. }
  35891. if (i < sz) {
  35892. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  35893. if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0)
  35894. return WOLFSSL_FAILURE;
  35895. j++;
  35896. i++;
  35897. }
  35898. for (; i < sz && j < 16; j++,i++) {
  35899. asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.';
  35900. if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0)
  35901. return WOLFSSL_FAILURE;
  35902. }
  35903. /* pad out spacing */
  35904. for (z = j; z < 17; z++) {
  35905. if (wolfSSL_BIO_printf(bio, " ") <= 0)
  35906. return WOLFSSL_FAILURE;
  35907. }
  35908. for (z = 0; z < j; z++) {
  35909. if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0)
  35910. return WOLFSSL_FAILURE;
  35911. }
  35912. if (wolfSSL_BIO_printf(bio, "\n") <= 0)
  35913. return WOLFSSL_FAILURE;
  35914. tag += 16;
  35915. }
  35916. return WOLFSSL_SUCCESS;
  35917. }
  35918. #endif /* HAVE_SESSION_TICKET */
  35919. /* prints out the session information in human readable form
  35920. * return WOLFSSL_SUCCESS on success
  35921. */
  35922. int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *x)
  35923. {
  35924. const unsigned char* pt;
  35925. unsigned char buf[SECRET_LEN];
  35926. unsigned int sz = 0, i;
  35927. int ret;
  35928. WOLFSSL_SESSION* session = (WOLFSSL_SESSION*)x;
  35929. if (session == NULL) {
  35930. WOLFSSL_MSG("Bad NULL argument");
  35931. return WOLFSSL_FAILURE;
  35932. }
  35933. if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0)
  35934. return WOLFSSL_FAILURE;
  35935. #if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \
  35936. defined(HAVE_SESSION_TICKET))
  35937. if (wolfSSL_BIO_printf(bp, " Protocol : %s\n",
  35938. wolfSSL_SESSION_get_protocol(session)) <= 0)
  35939. return WOLFSSL_FAILURE;
  35940. #endif
  35941. if (wolfSSL_BIO_printf(bp, " Cipher : %s\n",
  35942. wolfSSL_SESSION_CIPHER_get_name(session)) <= 0)
  35943. return WOLFSSL_FAILURE;
  35944. pt = wolfSSL_SESSION_get_id(session, &sz);
  35945. if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0)
  35946. return WOLFSSL_FAILURE;
  35947. for (i = 0; i < sz; i++) {
  35948. if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0)
  35949. return WOLFSSL_FAILURE;
  35950. }
  35951. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  35952. return WOLFSSL_FAILURE;
  35953. if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0)
  35954. return WOLFSSL_FAILURE;
  35955. ret = wolfSSL_SESSION_get_master_key(x, buf, sizeof(buf));
  35956. if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0)
  35957. return WOLFSSL_FAILURE;
  35958. if (ret > 0) {
  35959. sz = (unsigned int)ret;
  35960. for (i = 0; i < sz; i++) {
  35961. if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0)
  35962. return WOLFSSL_FAILURE;
  35963. }
  35964. }
  35965. if (wolfSSL_BIO_printf(bp, "\n") <= 0)
  35966. return WOLFSSL_FAILURE;
  35967. /* @TODO PSK identity hint and SRP */
  35968. if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0)
  35969. return WOLFSSL_FAILURE;
  35970. #ifdef HAVE_SESSION_TICKET
  35971. if (wolfSSL_SESSION_print_ticket(bp, x, " ") != WOLFSSL_SUCCESS)
  35972. return WOLFSSL_FAILURE;
  35973. #endif
  35974. #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
  35975. defined(HAVE_EXT_CACHE))
  35976. if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n",
  35977. wolfSSL_SESSION_get_time(x)) <= 0)
  35978. return WOLFSSL_FAILURE;
  35979. if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n",
  35980. wolfSSL_SESSION_get_timeout(x)) <= 0)
  35981. return WOLFSSL_FAILURE;
  35982. #endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
  35983. /* @TODO verify return code print */
  35984. if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n",
  35985. (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0)
  35986. return WOLFSSL_FAILURE;
  35987. return WOLFSSL_SUCCESS;
  35988. }
  35989. #endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */
  35990. #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  35991. #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && defined(HAVE_STUNNEL)) \
  35992. || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX)
  35993. int wolfSSL_CTX_get_verify_mode(WOLFSSL_CTX* ctx)
  35994. {
  35995. int mode = 0;
  35996. WOLFSSL_ENTER("wolfSSL_CTX_get_verify_mode");
  35997. if(!ctx)
  35998. return WOLFSSL_FATAL_ERROR;
  35999. if (ctx->verifyPeer)
  36000. mode |= WOLFSSL_VERIFY_PEER;
  36001. else if (ctx->verifyNone)
  36002. mode |= WOLFSSL_VERIFY_NONE;
  36003. if (ctx->failNoCert)
  36004. mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
  36005. if (ctx->failNoCertxPSK)
  36006. mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
  36007. WOLFSSL_LEAVE("wolfSSL_CTX_get_verify_mode", mode);
  36008. return mode;
  36009. }
  36010. #endif
  36011. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519)
  36012. /* return 1 if success, 0 if error
  36013. * output keys are little endian format
  36014. */
  36015. int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz,
  36016. unsigned char *pub, unsigned int *pubSz)
  36017. {
  36018. #ifndef WOLFSSL_KEY_GEN
  36019. WOLFSSL_MSG("No Key Gen built in");
  36020. (void) priv;
  36021. (void) privSz;
  36022. (void) pub;
  36023. (void) pubSz;
  36024. return WOLFSSL_FAILURE;
  36025. #else /* WOLFSSL_KEY_GEN */
  36026. int ret = WOLFSSL_FAILURE;
  36027. int initTmpRng = 0;
  36028. WC_RNG *rng = NULL;
  36029. #ifdef WOLFSSL_SMALL_STACK
  36030. WC_RNG *tmpRNG = NULL;
  36031. #else
  36032. WC_RNG tmpRNG[1];
  36033. #endif
  36034. WOLFSSL_ENTER("wolfSSL_EC25519_generate_key");
  36035. if (priv == NULL || privSz == NULL || *privSz < CURVE25519_KEYSIZE ||
  36036. pub == NULL || pubSz == NULL || *pubSz < CURVE25519_KEYSIZE) {
  36037. WOLFSSL_MSG("Bad arguments");
  36038. return WOLFSSL_FAILURE;
  36039. }
  36040. #ifdef WOLFSSL_SMALL_STACK
  36041. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  36042. if (tmpRNG == NULL)
  36043. return WOLFSSL_FAILURE;
  36044. #endif
  36045. if (wc_InitRng(tmpRNG) == 0) {
  36046. rng = tmpRNG;
  36047. initTmpRng = 1;
  36048. }
  36049. else {
  36050. WOLFSSL_MSG("Bad RNG Init, trying global");
  36051. if (initGlobalRNG == 0)
  36052. WOLFSSL_MSG("Global RNG no Init");
  36053. else
  36054. rng = &globalRNG;
  36055. }
  36056. if (rng) {
  36057. curve25519_key key;
  36058. if (wc_curve25519_init(&key) != MP_OKAY)
  36059. WOLFSSL_MSG("wc_curve25519_init failed");
  36060. else if (wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key)!=MP_OKAY)
  36061. WOLFSSL_MSG("wc_curve25519_make_key failed");
  36062. /* export key pair */
  36063. else if (wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub,
  36064. pubSz, EC25519_LITTLE_ENDIAN)
  36065. != MP_OKAY)
  36066. WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed");
  36067. else
  36068. ret = WOLFSSL_SUCCESS;
  36069. wc_curve25519_free(&key);
  36070. }
  36071. if (initTmpRng)
  36072. wc_FreeRng(tmpRNG);
  36073. #ifdef WOLFSSL_SMALL_STACK
  36074. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  36075. #endif
  36076. return ret;
  36077. #endif /* WOLFSSL_KEY_GEN */
  36078. }
  36079. /* return 1 if success, 0 if error
  36080. * input and output keys are little endian format
  36081. */
  36082. int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz,
  36083. const unsigned char *priv, unsigned int privSz,
  36084. const unsigned char *pub, unsigned int pubSz)
  36085. {
  36086. #ifndef WOLFSSL_KEY_GEN
  36087. WOLFSSL_MSG("No Key Gen built in");
  36088. (void) shared;
  36089. (void) sharedSz;
  36090. (void) priv;
  36091. (void) privSz;
  36092. (void) pub;
  36093. (void) pubSz;
  36094. return WOLFSSL_FAILURE;
  36095. #else /* WOLFSSL_KEY_GEN */
  36096. int ret = WOLFSSL_FAILURE;
  36097. curve25519_key privkey, pubkey;
  36098. WOLFSSL_ENTER("wolfSSL_EC25519_shared_key");
  36099. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE25519_KEYSIZE ||
  36100. priv == NULL || privSz < CURVE25519_KEYSIZE ||
  36101. pub == NULL || pubSz < CURVE25519_KEYSIZE) {
  36102. WOLFSSL_MSG("Bad arguments");
  36103. return WOLFSSL_FAILURE;
  36104. }
  36105. /* import private key */
  36106. if (wc_curve25519_init(&privkey) != MP_OKAY) {
  36107. WOLFSSL_MSG("wc_curve25519_init privkey failed");
  36108. return ret;
  36109. }
  36110. if (wc_curve25519_import_private_ex(priv, privSz, &privkey,
  36111. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  36112. WOLFSSL_MSG("wc_curve25519_import_private_ex failed");
  36113. wc_curve25519_free(&privkey);
  36114. return ret;
  36115. }
  36116. /* import public key */
  36117. if (wc_curve25519_init(&pubkey) != MP_OKAY) {
  36118. WOLFSSL_MSG("wc_curve25519_init pubkey failed");
  36119. wc_curve25519_free(&privkey);
  36120. return ret;
  36121. }
  36122. if (wc_curve25519_import_public_ex(pub, pubSz, &pubkey,
  36123. EC25519_LITTLE_ENDIAN) != MP_OKAY) {
  36124. WOLFSSL_MSG("wc_curve25519_import_public_ex failed");
  36125. wc_curve25519_free(&privkey);
  36126. wc_curve25519_free(&pubkey);
  36127. return ret;
  36128. }
  36129. if (wc_curve25519_shared_secret_ex(&privkey, &pubkey,
  36130. shared, sharedSz,
  36131. EC25519_LITTLE_ENDIAN) != MP_OKAY)
  36132. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  36133. else
  36134. ret = WOLFSSL_SUCCESS;
  36135. wc_curve25519_free(&privkey);
  36136. wc_curve25519_free(&pubkey);
  36137. return ret;
  36138. #endif /* WOLFSSL_KEY_GEN */
  36139. }
  36140. #endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */
  36141. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519)
  36142. /* return 1 if success, 0 if error
  36143. * output keys are little endian format
  36144. */
  36145. int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz,
  36146. unsigned char *pub, unsigned int *pubSz)
  36147. {
  36148. #ifndef WOLFSSL_KEY_GEN
  36149. WOLFSSL_MSG("No Key Gen built in");
  36150. (void) priv;
  36151. (void) privSz;
  36152. (void) pub;
  36153. (void) pubSz;
  36154. return WOLFSSL_FAILURE;
  36155. #else /* WOLFSSL_KEY_GEN */
  36156. int ret = WOLFSSL_FAILURE;
  36157. int initTmpRng = 0;
  36158. WC_RNG *rng = NULL;
  36159. #ifdef WOLFSSL_SMALL_STACK
  36160. WC_RNG *tmpRNG = NULL;
  36161. #else
  36162. WC_RNG tmpRNG[1];
  36163. #endif
  36164. WOLFSSL_ENTER("wolfSSL_ED25519_generate_key");
  36165. if (priv == NULL || privSz == NULL || *privSz < ED25519_PRV_KEY_SIZE ||
  36166. pub == NULL || pubSz == NULL || *pubSz < ED25519_PUB_KEY_SIZE) {
  36167. WOLFSSL_MSG("Bad arguments");
  36168. return WOLFSSL_FAILURE;
  36169. }
  36170. #ifdef WOLFSSL_SMALL_STACK
  36171. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  36172. if (tmpRNG == NULL)
  36173. return WOLFSSL_FATAL_ERROR;
  36174. #endif
  36175. if (wc_InitRng(tmpRNG) == 0) {
  36176. rng = tmpRNG;
  36177. initTmpRng = 1;
  36178. }
  36179. else {
  36180. WOLFSSL_MSG("Bad RNG Init, trying global");
  36181. if (initGlobalRNG == 0)
  36182. WOLFSSL_MSG("Global RNG no Init");
  36183. else
  36184. rng = &globalRNG;
  36185. }
  36186. if (rng) {
  36187. ed25519_key key;
  36188. if (wc_ed25519_init(&key) != MP_OKAY)
  36189. WOLFSSL_MSG("wc_ed25519_init failed");
  36190. else if (wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key)!=MP_OKAY)
  36191. WOLFSSL_MSG("wc_ed25519_make_key failed");
  36192. /* export private key */
  36193. else if (wc_ed25519_export_key(&key, priv, privSz, pub, pubSz)!=MP_OKAY)
  36194. WOLFSSL_MSG("wc_ed25519_export_key failed");
  36195. else
  36196. ret = WOLFSSL_SUCCESS;
  36197. wc_ed25519_free(&key);
  36198. }
  36199. if (initTmpRng)
  36200. wc_FreeRng(tmpRNG);
  36201. #ifdef WOLFSSL_SMALL_STACK
  36202. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  36203. #endif
  36204. return ret;
  36205. #endif /* WOLFSSL_KEY_GEN */
  36206. }
  36207. /* return 1 if success, 0 if error
  36208. * input and output keys are little endian format
  36209. * priv is a buffer containing private and public part of key
  36210. */
  36211. int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz,
  36212. const unsigned char *priv, unsigned int privSz,
  36213. unsigned char *sig, unsigned int *sigSz)
  36214. {
  36215. #ifndef WOLFSSL_KEY_GEN
  36216. WOLFSSL_MSG("No Key Gen built in");
  36217. (void) msg;
  36218. (void) msgSz;
  36219. (void) priv;
  36220. (void) privSz;
  36221. (void) sig;
  36222. (void) sigSz;
  36223. return WOLFSSL_FAILURE;
  36224. #else /* WOLFSSL_KEY_GEN */
  36225. ed25519_key key;
  36226. int ret = WOLFSSL_FAILURE;
  36227. WOLFSSL_ENTER("wolfSSL_ED25519_sign");
  36228. if (priv == NULL || privSz != ED25519_PRV_KEY_SIZE ||
  36229. msg == NULL || sig == NULL || *sigSz < ED25519_SIG_SIZE) {
  36230. WOLFSSL_MSG("Bad arguments");
  36231. return WOLFSSL_FAILURE;
  36232. }
  36233. /* import key */
  36234. if (wc_ed25519_init(&key) != MP_OKAY) {
  36235. WOLFSSL_MSG("wc_curve25519_init failed");
  36236. return ret;
  36237. }
  36238. if (wc_ed25519_import_private_key(priv, privSz/2,
  36239. priv+(privSz/2), ED25519_PUB_KEY_SIZE,
  36240. &key) != MP_OKAY){
  36241. WOLFSSL_MSG("wc_ed25519_import_private failed");
  36242. wc_ed25519_free(&key);
  36243. return ret;
  36244. }
  36245. if (wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY)
  36246. WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed");
  36247. else
  36248. ret = WOLFSSL_SUCCESS;
  36249. wc_ed25519_free(&key);
  36250. return ret;
  36251. #endif /* WOLFSSL_KEY_GEN */
  36252. }
  36253. /* return 1 if success, 0 if error
  36254. * input and output keys are little endian format
  36255. * pub is a buffer containing public part of key
  36256. */
  36257. int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz,
  36258. const unsigned char *pub, unsigned int pubSz,
  36259. const unsigned char *sig, unsigned int sigSz)
  36260. {
  36261. #ifndef WOLFSSL_KEY_GEN
  36262. WOLFSSL_MSG("No Key Gen built in");
  36263. (void) msg;
  36264. (void) msgSz;
  36265. (void) pub;
  36266. (void) pubSz;
  36267. (void) sig;
  36268. (void) sigSz;
  36269. return WOLFSSL_FAILURE;
  36270. #else /* WOLFSSL_KEY_GEN */
  36271. ed25519_key key;
  36272. int ret = WOLFSSL_FAILURE, check = 0;
  36273. WOLFSSL_ENTER("wolfSSL_ED25519_verify");
  36274. if (pub == NULL || pubSz != ED25519_PUB_KEY_SIZE ||
  36275. msg == NULL || sig == NULL || sigSz != ED25519_SIG_SIZE) {
  36276. WOLFSSL_MSG("Bad arguments");
  36277. return WOLFSSL_FAILURE;
  36278. }
  36279. /* import key */
  36280. if (wc_ed25519_init(&key) != MP_OKAY) {
  36281. WOLFSSL_MSG("wc_curve25519_init failed");
  36282. return ret;
  36283. }
  36284. if (wc_ed25519_import_public(pub, pubSz, &key) != MP_OKAY){
  36285. WOLFSSL_MSG("wc_ed25519_import_public failed");
  36286. wc_ed25519_free(&key);
  36287. return ret;
  36288. }
  36289. if ((ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz,
  36290. &check, &key)) != MP_OKAY) {
  36291. WOLFSSL_MSG("wc_ed25519_verify_msg failed");
  36292. }
  36293. else if (!check)
  36294. WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)");
  36295. else
  36296. ret = WOLFSSL_SUCCESS;
  36297. wc_ed25519_free(&key);
  36298. return ret;
  36299. #endif /* WOLFSSL_KEY_GEN */
  36300. }
  36301. #endif /* OPENSSL_EXTRA && HAVE_ED25519 */
  36302. #if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448)
  36303. /* return 1 if success, 0 if error
  36304. * output keys are little endian format
  36305. */
  36306. int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz,
  36307. unsigned char *pub, unsigned int *pubSz)
  36308. {
  36309. #ifndef WOLFSSL_KEY_GEN
  36310. WOLFSSL_MSG("No Key Gen built in");
  36311. (void) priv;
  36312. (void) privSz;
  36313. (void) pub;
  36314. (void) pubSz;
  36315. return WOLFSSL_FAILURE;
  36316. #else /* WOLFSSL_KEY_GEN */
  36317. int ret = WOLFSSL_FAILURE;
  36318. int initTmpRng = 0;
  36319. WC_RNG *rng = NULL;
  36320. #ifdef WOLFSSL_SMALL_STACK
  36321. WC_RNG *tmpRNG = NULL;
  36322. #else
  36323. WC_RNG tmpRNG[1];
  36324. #endif
  36325. WOLFSSL_ENTER("wolfSSL_EC448_generate_key");
  36326. if (priv == NULL || privSz == NULL || *privSz < CURVE448_KEY_SIZE ||
  36327. pub == NULL || pubSz == NULL || *pubSz < CURVE448_KEY_SIZE) {
  36328. WOLFSSL_MSG("Bad arguments");
  36329. return WOLFSSL_FAILURE;
  36330. }
  36331. #ifdef WOLFSSL_SMALL_STACK
  36332. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  36333. if (tmpRNG == NULL)
  36334. return WOLFSSL_FAILURE;
  36335. #endif
  36336. if (wc_InitRng(tmpRNG) == 0) {
  36337. rng = tmpRNG;
  36338. initTmpRng = 1;
  36339. }
  36340. else {
  36341. WOLFSSL_MSG("Bad RNG Init, trying global");
  36342. if (initGlobalRNG == 0)
  36343. WOLFSSL_MSG("Global RNG no Init");
  36344. else
  36345. rng = &globalRNG;
  36346. }
  36347. if (rng) {
  36348. curve448_key key;
  36349. if (wc_curve448_init(&key) != MP_OKAY)
  36350. WOLFSSL_MSG("wc_curve448_init failed");
  36351. else if (wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key)!=MP_OKAY)
  36352. WOLFSSL_MSG("wc_curve448_make_key failed");
  36353. /* export key pair */
  36354. else if (wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz,
  36355. EC448_LITTLE_ENDIAN)
  36356. != MP_OKAY)
  36357. WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed");
  36358. else
  36359. ret = WOLFSSL_SUCCESS;
  36360. wc_curve448_free(&key);
  36361. }
  36362. if (initTmpRng)
  36363. wc_FreeRng(tmpRNG);
  36364. #ifdef WOLFSSL_SMALL_STACK
  36365. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  36366. #endif
  36367. return ret;
  36368. #endif /* WOLFSSL_KEY_GEN */
  36369. }
  36370. /* return 1 if success, 0 if error
  36371. * input and output keys are little endian format
  36372. */
  36373. int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz,
  36374. const unsigned char *priv, unsigned int privSz,
  36375. const unsigned char *pub, unsigned int pubSz)
  36376. {
  36377. #ifndef WOLFSSL_KEY_GEN
  36378. WOLFSSL_MSG("No Key Gen built in");
  36379. (void) shared;
  36380. (void) sharedSz;
  36381. (void) priv;
  36382. (void) privSz;
  36383. (void) pub;
  36384. (void) pubSz;
  36385. return WOLFSSL_FAILURE;
  36386. #else /* WOLFSSL_KEY_GEN */
  36387. int ret = WOLFSSL_FAILURE;
  36388. curve448_key privkey, pubkey;
  36389. WOLFSSL_ENTER("wolfSSL_EC448_shared_key");
  36390. if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE448_KEY_SIZE ||
  36391. priv == NULL || privSz < CURVE448_KEY_SIZE ||
  36392. pub == NULL || pubSz < CURVE448_KEY_SIZE) {
  36393. WOLFSSL_MSG("Bad arguments");
  36394. return WOLFSSL_FAILURE;
  36395. }
  36396. /* import private key */
  36397. if (wc_curve448_init(&privkey) != MP_OKAY) {
  36398. WOLFSSL_MSG("wc_curve448_init privkey failed");
  36399. return ret;
  36400. }
  36401. if (wc_curve448_import_private_ex(priv, privSz, &privkey,
  36402. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  36403. WOLFSSL_MSG("wc_curve448_import_private_ex failed");
  36404. wc_curve448_free(&privkey);
  36405. return ret;
  36406. }
  36407. /* import public key */
  36408. if (wc_curve448_init(&pubkey) != MP_OKAY) {
  36409. WOLFSSL_MSG("wc_curve448_init pubkey failed");
  36410. wc_curve448_free(&privkey);
  36411. return ret;
  36412. }
  36413. if (wc_curve448_import_public_ex(pub, pubSz, &pubkey,
  36414. EC448_LITTLE_ENDIAN) != MP_OKAY) {
  36415. WOLFSSL_MSG("wc_curve448_import_public_ex failed");
  36416. wc_curve448_free(&privkey);
  36417. wc_curve448_free(&pubkey);
  36418. return ret;
  36419. }
  36420. if (wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, sharedSz,
  36421. EC448_LITTLE_ENDIAN) != MP_OKAY)
  36422. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  36423. else
  36424. ret = WOLFSSL_SUCCESS;
  36425. wc_curve448_free(&privkey);
  36426. wc_curve448_free(&pubkey);
  36427. return ret;
  36428. #endif /* WOLFSSL_KEY_GEN */
  36429. }
  36430. #endif /* OPENSSL_EXTRA && HAVE_CURVE448 */
  36431. #if defined(OPENSSL_EXTRA) && defined(HAVE_ED448)
  36432. /* return 1 if success, 0 if error
  36433. * output keys are little endian format
  36434. */
  36435. int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz,
  36436. unsigned char *pub, unsigned int *pubSz)
  36437. {
  36438. #ifndef WOLFSSL_KEY_GEN
  36439. WOLFSSL_MSG("No Key Gen built in");
  36440. (void) priv;
  36441. (void) privSz;
  36442. (void) pub;
  36443. (void) pubSz;
  36444. return WOLFSSL_FAILURE;
  36445. #else /* WOLFSSL_KEY_GEN */
  36446. int ret = WOLFSSL_FAILURE;
  36447. int initTmpRng = 0;
  36448. WC_RNG *rng = NULL;
  36449. #ifdef WOLFSSL_SMALL_STACK
  36450. WC_RNG *tmpRNG = NULL;
  36451. #else
  36452. WC_RNG tmpRNG[1];
  36453. #endif
  36454. WOLFSSL_ENTER("wolfSSL_ED448_generate_key");
  36455. if (priv == NULL || privSz == NULL || *privSz < ED448_PRV_KEY_SIZE ||
  36456. pub == NULL || pubSz == NULL || *pubSz < ED448_PUB_KEY_SIZE) {
  36457. WOLFSSL_MSG("Bad arguments");
  36458. return WOLFSSL_FAILURE;
  36459. }
  36460. #ifdef WOLFSSL_SMALL_STACK
  36461. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  36462. if (tmpRNG == NULL)
  36463. return WOLFSSL_FATAL_ERROR;
  36464. #endif
  36465. if (wc_InitRng(tmpRNG) == 0) {
  36466. rng = tmpRNG;
  36467. initTmpRng = 1;
  36468. }
  36469. else {
  36470. WOLFSSL_MSG("Bad RNG Init, trying global");
  36471. if (initGlobalRNG == 0)
  36472. WOLFSSL_MSG("Global RNG no Init");
  36473. else
  36474. rng = &globalRNG;
  36475. }
  36476. if (rng) {
  36477. ed448_key key;
  36478. if (wc_ed448_init(&key) != MP_OKAY)
  36479. WOLFSSL_MSG("wc_ed448_init failed");
  36480. else if (wc_ed448_make_key(rng, ED448_KEY_SIZE, &key) != MP_OKAY)
  36481. WOLFSSL_MSG("wc_ed448_make_key failed");
  36482. /* export private key */
  36483. else if (wc_ed448_export_key(&key, priv, privSz, pub, pubSz) != MP_OKAY)
  36484. WOLFSSL_MSG("wc_ed448_export_key failed");
  36485. else
  36486. ret = WOLFSSL_SUCCESS;
  36487. wc_ed448_free(&key);
  36488. }
  36489. if (initTmpRng)
  36490. wc_FreeRng(tmpRNG);
  36491. #ifdef WOLFSSL_SMALL_STACK
  36492. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  36493. #endif
  36494. return ret;
  36495. #endif /* WOLFSSL_KEY_GEN */
  36496. }
  36497. /* return 1 if success, 0 if error
  36498. * input and output keys are little endian format
  36499. * priv is a buffer containing private and public part of key
  36500. */
  36501. int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz,
  36502. const unsigned char *priv, unsigned int privSz,
  36503. unsigned char *sig, unsigned int *sigSz)
  36504. {
  36505. #ifndef WOLFSSL_KEY_GEN
  36506. WOLFSSL_MSG("No Key Gen built in");
  36507. (void) msg;
  36508. (void) msgSz;
  36509. (void) priv;
  36510. (void) privSz;
  36511. (void) sig;
  36512. (void) sigSz;
  36513. return WOLFSSL_FAILURE;
  36514. #else /* WOLFSSL_KEY_GEN */
  36515. ed448_key key;
  36516. int ret = WOLFSSL_FAILURE;
  36517. WOLFSSL_ENTER("wolfSSL_ED448_sign");
  36518. if (priv == NULL || privSz != ED448_PRV_KEY_SIZE || msg == NULL ||
  36519. sig == NULL || *sigSz < ED448_SIG_SIZE) {
  36520. WOLFSSL_MSG("Bad arguments");
  36521. return WOLFSSL_FAILURE;
  36522. }
  36523. /* import key */
  36524. if (wc_ed448_init(&key) != MP_OKAY) {
  36525. WOLFSSL_MSG("wc_curve448_init failed");
  36526. return ret;
  36527. }
  36528. if (wc_ed448_import_private_key(priv, privSz/2, priv+(privSz/2),
  36529. ED448_PUB_KEY_SIZE, &key) != MP_OKAY){
  36530. WOLFSSL_MSG("wc_ed448_import_private failed");
  36531. wc_ed448_free(&key);
  36532. return ret;
  36533. }
  36534. if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY)
  36535. WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
  36536. else
  36537. ret = WOLFSSL_SUCCESS;
  36538. wc_ed448_free(&key);
  36539. return ret;
  36540. #endif /* WOLFSSL_KEY_GEN */
  36541. }
  36542. /* return 1 if success, 0 if error
  36543. * input and output keys are little endian format
  36544. * pub is a buffer containing public part of key
  36545. */
  36546. int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz,
  36547. const unsigned char *pub, unsigned int pubSz,
  36548. const unsigned char *sig, unsigned int sigSz)
  36549. {
  36550. #ifndef WOLFSSL_KEY_GEN
  36551. WOLFSSL_MSG("No Key Gen built in");
  36552. (void) msg;
  36553. (void) msgSz;
  36554. (void) pub;
  36555. (void) pubSz;
  36556. (void) sig;
  36557. (void) sigSz;
  36558. return WOLFSSL_FAILURE;
  36559. #else /* WOLFSSL_KEY_GEN */
  36560. ed448_key key;
  36561. int ret = WOLFSSL_FAILURE, check = 0;
  36562. WOLFSSL_ENTER("wolfSSL_ED448_verify");
  36563. if (pub == NULL || pubSz != ED448_PUB_KEY_SIZE || msg == NULL ||
  36564. sig == NULL || sigSz != ED448_SIG_SIZE) {
  36565. WOLFSSL_MSG("Bad arguments");
  36566. return WOLFSSL_FAILURE;
  36567. }
  36568. /* import key */
  36569. if (wc_ed448_init(&key) != MP_OKAY) {
  36570. WOLFSSL_MSG("wc_curve448_init failed");
  36571. return ret;
  36572. }
  36573. if (wc_ed448_import_public(pub, pubSz, &key) != MP_OKAY){
  36574. WOLFSSL_MSG("wc_ed448_import_public failed");
  36575. wc_ed448_free(&key);
  36576. return ret;
  36577. }
  36578. if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check,
  36579. &key, NULL, 0)) != MP_OKAY) {
  36580. WOLFSSL_MSG("wc_ed448_verify_msg failed");
  36581. }
  36582. else if (!check)
  36583. WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)");
  36584. else
  36585. ret = WOLFSSL_SUCCESS;
  36586. wc_ed448_free(&key);
  36587. return ret;
  36588. #endif /* WOLFSSL_KEY_GEN */
  36589. }
  36590. #endif /* OPENSSL_EXTRA && HAVE_ED448 */
  36591. #ifdef WOLFSSL_JNI
  36592. int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr)
  36593. {
  36594. WOLFSSL_ENTER("wolfSSL_set_jobject");
  36595. if (ssl != NULL)
  36596. {
  36597. ssl->jObjectRef = objPtr;
  36598. return WOLFSSL_SUCCESS;
  36599. }
  36600. return WOLFSSL_FAILURE;
  36601. }
  36602. void* wolfSSL_get_jobject(WOLFSSL* ssl)
  36603. {
  36604. WOLFSSL_ENTER("wolfSSL_get_jobject");
  36605. if (ssl != NULL)
  36606. return ssl->jObjectRef;
  36607. return NULL;
  36608. }
  36609. #endif /* WOLFSSL_JNI */
  36610. #ifdef WOLFSSL_ASYNC_CRYPT
  36611. int wolfSSL_CTX_AsyncPoll(WOLFSSL_CTX* ctx, WOLF_EVENT** events, int maxEvents,
  36612. WOLF_EVENT_FLAG flags, int* eventCount)
  36613. {
  36614. if (ctx == NULL) {
  36615. return BAD_FUNC_ARG;
  36616. }
  36617. return wolfAsync_EventQueuePoll(&ctx->event_queue, NULL,
  36618. events, maxEvents, flags, eventCount);
  36619. }
  36620. int wolfSSL_AsyncPoll(WOLFSSL* ssl, WOLF_EVENT_FLAG flags)
  36621. {
  36622. int ret, eventCount = 0;
  36623. WOLF_EVENT* events[1];
  36624. if (ssl == NULL) {
  36625. return BAD_FUNC_ARG;
  36626. }
  36627. ret = wolfAsync_EventQueuePoll(&ssl->ctx->event_queue, ssl,
  36628. events, sizeof(events)/sizeof(*events), flags, &eventCount);
  36629. if (ret == 0) {
  36630. ret = eventCount;
  36631. }
  36632. return ret;
  36633. }
  36634. #endif /* WOLFSSL_ASYNC_CRYPT */
  36635. #ifdef OPENSSL_EXTRA
  36636. unsigned long wolfSSL_ERR_peek_error_line_data(const char **file, int *line,
  36637. const char **data, int *flags)
  36638. {
  36639. WOLFSSL_ENTER("wolfSSL_ERR_peek_error_line_data");
  36640. (void)line;
  36641. (void)file;
  36642. /* No data or flags stored - error display only in Nginx. */
  36643. if (data != NULL) {
  36644. *data = "";
  36645. }
  36646. if (flags != NULL) {
  36647. *flags = 0;
  36648. }
  36649. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
  36650. defined(WOLFSSL_OPENSSH) || defined(WOLFSSL_HAPROXY) || \
  36651. defined(WOLFSSL_MYSQL_COMPATIBLE)
  36652. {
  36653. int ret = 0;
  36654. while (1) {
  36655. ret = wc_PeekErrorNode(-1, file, NULL, line);
  36656. if (ret == BAD_MUTEX_E || ret == BAD_FUNC_ARG || ret == BAD_STATE_E) {
  36657. WOLFSSL_MSG("Issue peeking at error node in queue");
  36658. return 0;
  36659. }
  36660. /* OpenSSL uses positive error codes */
  36661. if (ret < 0) {
  36662. ret = -ret;
  36663. }
  36664. if (ret == -ASN_NO_PEM_HEADER)
  36665. return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
  36666. if (ret != -WANT_READ && ret != -WANT_WRITE &&
  36667. ret != -ZERO_RETURN && ret != -WOLFSSL_ERROR_ZERO_RETURN &&
  36668. ret != -SOCKET_PEER_CLOSED_E && ret != -SOCKET_ERROR_E)
  36669. break;
  36670. wc_RemoveErrorNode(-1);
  36671. }
  36672. return (unsigned long)ret;
  36673. }
  36674. #else
  36675. return (unsigned long)(0 - NOT_COMPILED_IN);
  36676. #endif
  36677. }
  36678. #endif
  36679. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  36680. /* returns a pointer to internal cipher suite list. Should not be free'd by
  36681. * caller.
  36682. */
  36683. WOLF_STACK_OF(WOLFSSL_CIPHER) *wolfSSL_get_ciphers_compat(const WOLFSSL *ssl)
  36684. {
  36685. WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
  36686. Suites* suites;
  36687. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  36688. const CipherSuiteInfo* cipher_names = GetCipherNames();
  36689. int cipherSz = GetCipherNamesSize();
  36690. #endif
  36691. WOLFSSL_ENTER("wolfSSL_get_ciphers_compat");
  36692. if (ssl == NULL || (ssl->suites == NULL && ssl->ctx->suites == NULL)) {
  36693. return NULL;
  36694. }
  36695. if (ssl->suites != NULL) {
  36696. suites = ssl->suites;
  36697. }
  36698. else {
  36699. suites = ssl->ctx->suites;
  36700. }
  36701. /* check if stack needs populated */
  36702. if (suites->stack == NULL) {
  36703. int i;
  36704. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  36705. int j;
  36706. #endif
  36707. for (i = 0; i < suites->suiteSz; i+=2) {
  36708. WOLFSSL_STACK* add = wolfSSL_sk_new_node(ssl->heap);
  36709. if (add != NULL) {
  36710. add->type = STACK_TYPE_CIPHER;
  36711. add->data.cipher.cipherSuite0 = suites->suites[i];
  36712. add->data.cipher.cipherSuite = suites->suites[i+1];
  36713. add->data.cipher.ssl = ssl;
  36714. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  36715. for (j = 0; j < cipherSz; j++) {
  36716. if (cipher_names[j].cipherSuite0 ==
  36717. add->data.cipher.cipherSuite0 &&
  36718. cipher_names[j].cipherSuite ==
  36719. add->data.cipher.cipherSuite) {
  36720. add->data.cipher.offset = j;
  36721. break;
  36722. }
  36723. }
  36724. #endif
  36725. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  36726. /* in_stack is checked in wolfSSL_CIPHER_description */
  36727. add->data.cipher.in_stack = 1;
  36728. #endif
  36729. add->next = ret;
  36730. if (ret != NULL) {
  36731. add->num = ret->num + 1;
  36732. }
  36733. else {
  36734. add->num = 1;
  36735. }
  36736. ret = add;
  36737. }
  36738. }
  36739. suites->stack = ret;
  36740. }
  36741. return suites->stack;
  36742. }
  36743. #ifndef NO_WOLFSSL_STUB
  36744. void wolfSSL_OPENSSL_config(char *config_name)
  36745. {
  36746. (void)config_name;
  36747. WOLFSSL_STUB("OPENSSL_config");
  36748. }
  36749. #endif /* !NO_WOLFSSL_STUB */
  36750. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  36751. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  36752. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  36753. int wolfSSL_X509_get_ex_new_index(int idx, void *arg, void *a, void *b, void *c)
  36754. {
  36755. static int x509_idx = 0;
  36756. WOLFSSL_ENTER("wolfSSL_X509_get_ex_new_index");
  36757. (void)idx;
  36758. (void)arg;
  36759. (void)a;
  36760. (void)b;
  36761. (void)c;
  36762. return x509_idx++;
  36763. }
  36764. #endif
  36765. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  36766. #if defined(HAVE_EX_DATA) || defined(FORTRESS)
  36767. void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx)
  36768. {
  36769. WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
  36770. #ifdef MAX_EX_DATA
  36771. if(ex_data && idx < MAX_EX_DATA && idx >= 0) {
  36772. return ex_data->ex_data[idx];
  36773. }
  36774. #else
  36775. (void)ex_data;
  36776. (void)idx;
  36777. #endif
  36778. return NULL;
  36779. }
  36780. int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *data)
  36781. {
  36782. WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data");
  36783. #ifdef MAX_EX_DATA
  36784. if (ex_data && idx < MAX_EX_DATA && idx >= 0) {
  36785. ex_data->ex_data[idx] = data;
  36786. return WOLFSSL_SUCCESS;
  36787. }
  36788. #else
  36789. (void)ex_data;
  36790. (void)idx;
  36791. (void)data;
  36792. #endif
  36793. return WOLFSSL_FAILURE;
  36794. }
  36795. #endif /* HAVE_EX_DATA || FORTRESS */
  36796. void *wolfSSL_X509_get_ex_data(X509 *x509, int idx)
  36797. {
  36798. WOLFSSL_ENTER("wolfSSL_X509_get_ex_data");
  36799. #ifdef HAVE_EX_DATA
  36800. if (x509 != NULL) {
  36801. return wolfSSL_CRYPTO_get_ex_data(&x509->ex_data, idx);
  36802. }
  36803. #else
  36804. (void)x509;
  36805. (void)idx;
  36806. #endif
  36807. return NULL;
  36808. }
  36809. int wolfSSL_X509_set_ex_data(X509 *x509, int idx, void *data)
  36810. {
  36811. WOLFSSL_ENTER("wolfSSL_X509_set_ex_data");
  36812. #ifdef HAVE_EX_DATA
  36813. if (x509 != NULL)
  36814. {
  36815. return wolfSSL_CRYPTO_set_ex_data(&x509->ex_data, idx, data);
  36816. }
  36817. #else
  36818. (void)x509;
  36819. (void)idx;
  36820. (void)data;
  36821. #endif
  36822. return WOLFSSL_FAILURE;
  36823. }
  36824. #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
  36825. #ifndef NO_ASN
  36826. int wolfSSL_X509_check_host(WOLFSSL_X509 *x, const char *chk, size_t chklen,
  36827. unsigned int flags, char **peername)
  36828. {
  36829. int ret;
  36830. DecodedCert dCert;
  36831. WOLFSSL_ENTER("wolfSSL_X509_check_host");
  36832. /* flags and peername not needed for Nginx. */
  36833. (void)flags;
  36834. (void)peername;
  36835. if (flags == WOLFSSL_NO_WILDCARDS) {
  36836. WOLFSSL_MSG("X509_CHECK_FLAG_NO_WILDCARDS not yet implemented");
  36837. return WOLFSSL_FAILURE;
  36838. }
  36839. InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
  36840. ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
  36841. if (ret != 0) {
  36842. FreeDecodedCert(&dCert);
  36843. return WOLFSSL_FAILURE;
  36844. }
  36845. ret = CheckHostName(&dCert, (char *)chk, chklen);
  36846. FreeDecodedCert(&dCert);
  36847. if (ret != 0)
  36848. return WOLFSSL_FAILURE;
  36849. return WOLFSSL_SUCCESS;
  36850. }
  36851. int wolfSSL_X509_check_ip_asc(WOLFSSL_X509 *x, const char *ipasc,
  36852. unsigned int flags)
  36853. {
  36854. int ret = WOLFSSL_FAILURE;
  36855. DecodedCert dCert;
  36856. WOLFSSL_ENTER("wolfSSL_X509_check_ip_asc");
  36857. /* flags not yet implemented */
  36858. (void)flags;
  36859. if ((x == NULL) || (x->derCert == NULL) || (ipasc == NULL)) {
  36860. WOLFSSL_MSG("Invalid parameter");
  36861. }
  36862. else {
  36863. ret = WOLFSSL_SUCCESS;
  36864. }
  36865. if (ret == WOLFSSL_SUCCESS) {
  36866. InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
  36867. ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
  36868. if (ret != 0) {
  36869. ret = WOLFSSL_FAILURE;
  36870. }
  36871. else {
  36872. ret = CheckIPAddr(&dCert, ipasc);
  36873. if (ret != 0) {
  36874. ret = WOLFSSL_FAILURE;
  36875. }
  36876. else {
  36877. ret = WOLFSSL_SUCCESS;
  36878. }
  36879. }
  36880. FreeDecodedCert(&dCert);
  36881. }
  36882. return ret;
  36883. }
  36884. #endif
  36885. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
  36886. || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
  36887. int wolfSSL_X509_NAME_digest(const WOLFSSL_X509_NAME *name,
  36888. const WOLFSSL_EVP_MD *type, unsigned char *md, unsigned int *len)
  36889. {
  36890. WOLFSSL_ENTER("wolfSSL_X509_NAME_digest");
  36891. if (name == NULL || type == NULL)
  36892. return WOLFSSL_FAILURE;
  36893. #if !defined(NO_FILESYSTEM) && !defined(NO_PWDBASED)
  36894. return wolfSSL_EVP_Digest((unsigned char*)name->name,
  36895. name->sz, md, len, type, NULL);
  36896. #else
  36897. (void)md;
  36898. (void)len;
  36899. return NOT_COMPILED_IN;
  36900. #endif
  36901. }
  36902. long wolfSSL_SSL_CTX_get_timeout(const WOLFSSL_CTX *ctx)
  36903. {
  36904. WOLFSSL_ENTER("wolfSSL_SSL_CTX_get_timeout");
  36905. if (ctx == NULL)
  36906. return 0;
  36907. return ctx->timeout;
  36908. }
  36909. /* returns the time in seconds of the current timeout */
  36910. long wolfSSL_get_timeout(WOLFSSL* ssl)
  36911. {
  36912. WOLFSSL_ENTER("wolfSSL_get_timeout");
  36913. if (ssl == NULL)
  36914. return 0;
  36915. return ssl->timeout;
  36916. }
  36917. #ifdef HAVE_ECC
  36918. int wolfSSL_SSL_CTX_set_tmp_ecdh(WOLFSSL_CTX *ctx, WOLFSSL_EC_KEY *ecdh)
  36919. {
  36920. WOLFSSL_ENTER("wolfSSL_SSL_CTX_set_tmp_ecdh");
  36921. if (ctx == NULL || ecdh == NULL)
  36922. return BAD_FUNC_ARG;
  36923. ctx->ecdhCurveOID = ecdh->group->curve_oid;
  36924. return WOLFSSL_SUCCESS;
  36925. }
  36926. #endif
  36927. /* Assumes that the session passed in is from the cache. */
  36928. int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s)
  36929. {
  36930. WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session");
  36931. if (ctx == NULL || s == NULL)
  36932. return BAD_FUNC_ARG;
  36933. #ifdef HAVE_EXT_CACHE
  36934. if (!ctx->internalCacheOff)
  36935. #endif
  36936. {
  36937. /* Don't remove session just timeout session. */
  36938. s->timeout = 0;
  36939. }
  36940. #ifdef HAVE_EXT_CACHE
  36941. if (ctx->rem_sess_cb != NULL)
  36942. ctx->rem_sess_cb(ctx, s);
  36943. #endif
  36944. return 0;
  36945. }
  36946. BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s)
  36947. {
  36948. WOLFSSL_ENTER("wolfSSL_SSL_get_rbio");
  36949. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  36950. * The setting buffer size doesn't do anything so return NULL for both.
  36951. */
  36952. if (s == NULL)
  36953. return NULL;
  36954. return s->biord;
  36955. }
  36956. BIO *wolfSSL_SSL_get_wbio(const WOLFSSL *s)
  36957. {
  36958. WOLFSSL_ENTER("wolfSSL_SSL_get_wbio");
  36959. (void)s;
  36960. /* Nginx sets the buffer size if the read BIO is different to write BIO.
  36961. * The setting buffer size doesn't do anything so return NULL for both.
  36962. */
  36963. if (s == NULL)
  36964. return NULL;
  36965. return s->biowr;
  36966. }
  36967. int wolfSSL_SSL_do_handshake(WOLFSSL *s)
  36968. {
  36969. WOLFSSL_ENTER("wolfSSL_SSL_do_handshake");
  36970. if (s == NULL)
  36971. return WOLFSSL_FAILURE;
  36972. if (s->options.side == WOLFSSL_CLIENT_END) {
  36973. #ifndef NO_WOLFSSL_CLIENT
  36974. return wolfSSL_connect(s);
  36975. #else
  36976. WOLFSSL_MSG("Client not compiled in");
  36977. return WOLFSSL_FAILURE;
  36978. #endif
  36979. }
  36980. #ifndef NO_WOLFSSL_SERVER
  36981. return wolfSSL_accept(s);
  36982. #else
  36983. WOLFSSL_MSG("Server not compiled in");
  36984. return WOLFSSL_FAILURE;
  36985. #endif
  36986. }
  36987. int wolfSSL_SSL_in_init(WOLFSSL *ssl)
  36988. {
  36989. WOLFSSL_ENTER("SSL_in_init");
  36990. if (ssl == NULL)
  36991. return WOLFSSL_FAILURE;
  36992. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  36993. return ssl->options.connectState < SECOND_REPLY_DONE;
  36994. }
  36995. return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  36996. }
  36997. int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl)
  36998. {
  36999. WOLFSSL_ENTER("SSL_connect_init");
  37000. if (ssl == NULL)
  37001. return WOLFSSL_FAILURE;
  37002. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  37003. return ssl->options.connectState > CONNECT_BEGIN &&
  37004. ssl->options.connectState < SECOND_REPLY_DONE;
  37005. }
  37006. return ssl->options.acceptState > ACCEPT_BEGIN &&
  37007. ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  37008. }
  37009. #ifndef NO_SESSION_CACHE
  37010. WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl)
  37011. {
  37012. WOLFSSL_SESSION *session;
  37013. WOLFSSL_ENTER("wolfSSL_SSL_get0_session");
  37014. if (ssl == NULL) {
  37015. return NULL;
  37016. }
  37017. session = wolfSSL_get_session((WOLFSSL*)ssl);
  37018. #ifdef HAVE_EXT_CACHE
  37019. ((WOLFSSL*)ssl)->extSession = session;
  37020. #endif
  37021. return session;
  37022. }
  37023. #endif /* NO_SESSION_CACHE */
  37024. int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a)
  37025. {
  37026. static char num[16] = { '0', '1', '2', '3', '4', '5', '6', '7',
  37027. '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  37028. int i;
  37029. word32 j;
  37030. word32 len = 0;
  37031. WOLFSSL_ENTER("wolfSSL_i2a_ASN1_INTEGER");
  37032. if (bp == NULL || a == NULL)
  37033. return WOLFSSL_FAILURE;
  37034. /* Skip ASN.1 INTEGER (type) byte. */
  37035. i = 1;
  37036. /* When indefinite length, can't determine length with data available. */
  37037. if (a->data[i] == 0x80)
  37038. return 0;
  37039. /* One length byte if less than 0x80. */
  37040. if (a->data[i] < 0x80)
  37041. len = a->data[i++];
  37042. /* Multiple length byte if greater than 0x80. */
  37043. else if (a->data[i] > 0x80) {
  37044. switch (a->data[i++] - 0x80) {
  37045. case 4:
  37046. len |= a->data[i++] << 24;
  37047. FALL_THROUGH;
  37048. case 3:
  37049. len |= a->data[i++] << 16;
  37050. FALL_THROUGH;
  37051. case 2:
  37052. len |= a->data[i++] << 8;
  37053. FALL_THROUGH;
  37054. case 1:
  37055. len |= a->data[i++];
  37056. break;
  37057. default:
  37058. /* Not supporting greater than 4 bytes of length. */
  37059. return 0;
  37060. }
  37061. }
  37062. /* Zero length integer is the value zero. */
  37063. if (len == 0) {
  37064. wolfSSL_BIO_write(bp, "00", 2);
  37065. return 2;
  37066. }
  37067. /* Don't do negative - just write out every byte. */
  37068. for (j = 0; j < len; i++,j++) {
  37069. wolfSSL_BIO_write(bp, &num[a->data[i] >> 4], 1);
  37070. wolfSSL_BIO_write(bp, &num[a->data[i] & 0xf], 1);
  37071. }
  37072. /* Two nibbles written for each byte. */
  37073. return len * 2;
  37074. }
  37075. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  37076. /* Expected return values from implementations of OpenSSL ticket key callback.
  37077. */
  37078. #define TICKET_KEY_CB_RET_FAILURE -1
  37079. #define TICKET_KEY_CB_RET_NOT_FOUND 0
  37080. #define TICKET_KEY_CB_RET_OK 1
  37081. #define TICKET_KEY_CB_RET_RENEW 2
  37082. /* The ticket key callback as used in OpenSSL is stored here. */
  37083. static int (*ticketKeyCb)(WOLFSSL *ssl, unsigned char *name, unsigned char *iv,
  37084. WOLFSSL_EVP_CIPHER_CTX *ectx, WOLFSSL_HMAC_CTX *hctx, int enc) = NULL;
  37085. /* Implementation of session ticket encryption/decryption using OpenSSL
  37086. * callback to initialize the cipher and HMAC.
  37087. *
  37088. * ssl The SSL/TLS object.
  37089. * keyName The key name - used to identify the key to be used.
  37090. * iv The IV to use.
  37091. * mac The MAC of the encrypted data.
  37092. * enc Encrypt ticket.
  37093. * encTicket The ticket data.
  37094. * encTicketLen The length of the ticket data.
  37095. * encLen The encrypted/decrypted ticket length - output length.
  37096. * ctx Ignored. Application specific data.
  37097. * returns WOLFSSL_TICKET_RET_OK to indicate success,
  37098. * WOLFSSL_TICKET_RET_CREATE if a new ticket is required and
  37099. * WOLFSSL_TICKET_RET_FATAL on error.
  37100. */
  37101. static int wolfSSL_TicketKeyCb(WOLFSSL* ssl,
  37102. unsigned char keyName[WOLFSSL_TICKET_NAME_SZ],
  37103. unsigned char iv[WOLFSSL_TICKET_IV_SZ],
  37104. unsigned char mac[WOLFSSL_TICKET_MAC_SZ],
  37105. int enc, unsigned char* encTicket,
  37106. int encTicketLen, int* encLen, void* ctx)
  37107. {
  37108. byte digest[WC_MAX_DIGEST_SIZE];
  37109. WOLFSSL_EVP_CIPHER_CTX evpCtx;
  37110. WOLFSSL_HMAC_CTX hmacCtx;
  37111. unsigned int mdSz = 0;
  37112. int len = 0;
  37113. int ret = WOLFSSL_TICKET_RET_FATAL;
  37114. int res;
  37115. (void)ctx;
  37116. if (ticketKeyCb == NULL)
  37117. return WOLFSSL_TICKET_RET_FATAL;
  37118. wolfSSL_EVP_CIPHER_CTX_init(&evpCtx);
  37119. /* Initialize the cipher and HMAC. */
  37120. res = ticketKeyCb(ssl, keyName, iv, &evpCtx, &hmacCtx, enc);
  37121. if (res != TICKET_KEY_CB_RET_OK && res != TICKET_KEY_CB_RET_RENEW)
  37122. return WOLFSSL_TICKET_RET_FATAL;
  37123. if (enc)
  37124. {
  37125. /* Encrypt in place. */
  37126. if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
  37127. encTicket, encTicketLen))
  37128. goto end;
  37129. encTicketLen = len;
  37130. if (!wolfSSL_EVP_EncryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
  37131. goto end;
  37132. /* Total length of encrypted data. */
  37133. encTicketLen += len;
  37134. *encLen = encTicketLen;
  37135. /* HMAC the encrypted data into the parameter 'mac'. */
  37136. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  37137. goto end;
  37138. #ifdef WOLFSSL_SHA512
  37139. /* Check for SHA512, which would overrun the mac buffer */
  37140. if (hmacCtx.hmac.macType == WC_SHA512)
  37141. goto end;
  37142. #endif
  37143. if (!wolfSSL_HMAC_Final(&hmacCtx, mac, &mdSz))
  37144. goto end;
  37145. }
  37146. else
  37147. {
  37148. /* HMAC the encrypted data and compare it to the passed in data. */
  37149. if (!wolfSSL_HMAC_Update(&hmacCtx, encTicket, encTicketLen))
  37150. goto end;
  37151. if (!wolfSSL_HMAC_Final(&hmacCtx, digest, &mdSz))
  37152. goto end;
  37153. if (XMEMCMP(mac, digest, mdSz) != 0)
  37154. goto end;
  37155. /* Decrypt the ticket data in place. */
  37156. if (!wolfSSL_EVP_CipherUpdate(&evpCtx, encTicket, &len,
  37157. encTicket, encTicketLen))
  37158. goto end;
  37159. encTicketLen = len;
  37160. if (!wolfSSL_EVP_DecryptFinal(&evpCtx, &encTicket[encTicketLen], &len))
  37161. goto end;
  37162. /* Total length of decrypted data. */
  37163. *encLen = encTicketLen + len;
  37164. }
  37165. ret = (res == TICKET_KEY_CB_RET_RENEW) ? WOLFSSL_TICKET_RET_CREATE :
  37166. WOLFSSL_TICKET_RET_OK;
  37167. end:
  37168. return ret;
  37169. }
  37170. /* Set the callback to use when encrypting/decrypting tickets.
  37171. *
  37172. * ctx The SSL/TLS context object.
  37173. * cb The OpenSSL session ticket callback.
  37174. * returns WOLFSSL_SUCCESS to indicate success.
  37175. */
  37176. int wolfSSL_CTX_set_tlsext_ticket_key_cb(WOLFSSL_CTX *ctx, int (*cb)(
  37177. WOLFSSL *ssl, unsigned char *name, unsigned char *iv,
  37178. WOLFSSL_EVP_CIPHER_CTX *ectx, WOLFSSL_HMAC_CTX *hctx, int enc))
  37179. {
  37180. /* Store callback in a global. */
  37181. ticketKeyCb = cb;
  37182. /* Set the ticket encryption callback to be a wrapper around OpenSSL
  37183. * callback.
  37184. */
  37185. ctx->ticketEncCb = wolfSSL_TicketKeyCb;
  37186. return WOLFSSL_SUCCESS;
  37187. }
  37188. #endif /* HAVE_SESSION_TICKET */
  37189. #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
  37190. OPENSSL_EXTRA || HAVE_LIGHTY */
  37191. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  37192. #ifdef HAVE_OCSP
  37193. /* Not an OpenSSL API. */
  37194. int wolfSSL_get_ocsp_response(WOLFSSL* ssl, byte** response)
  37195. {
  37196. *response = ssl->ocspResp;
  37197. return ssl->ocspRespSz;
  37198. }
  37199. /* Not an OpenSSL API. */
  37200. char* wolfSSL_get_ocsp_url(WOLFSSL* ssl)
  37201. {
  37202. return ssl->url;
  37203. }
  37204. /* Not an OpenSSL API. */
  37205. int wolfSSL_set_ocsp_url(WOLFSSL* ssl, char* url)
  37206. {
  37207. if (ssl == NULL)
  37208. return WOLFSSL_FAILURE;
  37209. ssl->url = url;
  37210. return WOLFSSL_SUCCESS;
  37211. }
  37212. #endif /* OCSP */
  37213. #endif /* OPENSSL_ALL / WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  37214. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
  37215. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  37216. int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** chain)
  37217. {
  37218. word32 idx;
  37219. word32 length;
  37220. WOLFSSL_STACK* node;
  37221. WOLFSSL_STACK* last = NULL;
  37222. if (ctx == NULL || chain == NULL) {
  37223. chain = NULL;
  37224. return WOLFSSL_FAILURE;
  37225. }
  37226. if (ctx->x509Chain != NULL) {
  37227. *chain = ctx->x509Chain;
  37228. return WOLFSSL_SUCCESS;
  37229. }
  37230. /* If there are no chains then success! */
  37231. *chain = NULL;
  37232. if (ctx->certChain == NULL || ctx->certChain->length == 0) {
  37233. return WOLFSSL_SUCCESS;
  37234. }
  37235. /* Create a new stack of WOLFSSL_X509 object from chain buffer. */
  37236. for (idx = 0; idx < ctx->certChain->length; ) {
  37237. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  37238. DYNAMIC_TYPE_OPENSSL);
  37239. if (node == NULL)
  37240. return WOLFSSL_FAILURE;
  37241. node->next = NULL;
  37242. /* 3 byte length | X509 DER data */
  37243. ato24(ctx->certChain->buffer + idx, &length);
  37244. idx += 3;
  37245. /* Create a new X509 from DER encoded data. */
  37246. node->data.x509 = wolfSSL_X509_d2i(NULL, ctx->certChain->buffer + idx,
  37247. length);
  37248. if (node->data.x509 == NULL) {
  37249. XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
  37250. /* Return as much of the chain as we created. */
  37251. ctx->x509Chain = *chain;
  37252. return WOLFSSL_FAILURE;
  37253. }
  37254. idx += length;
  37255. /* Add object to the end of the stack. */
  37256. if (last == NULL) {
  37257. node->num = 1;
  37258. *chain = node;
  37259. }
  37260. else {
  37261. (*chain)->num++;
  37262. last->next = node;
  37263. }
  37264. last = node;
  37265. }
  37266. ctx->x509Chain = *chain;
  37267. return WOLFSSL_SUCCESS;
  37268. }
  37269. int wolfSSL_CTX_set_tlsext_status_cb(WOLFSSL_CTX* ctx,
  37270. int(*cb)(WOLFSSL*, void*))
  37271. {
  37272. if (ctx == NULL || ctx->cm == NULL)
  37273. return WOLFSSL_FAILURE;
  37274. #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  37275. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
  37276. /* Ensure stapling is on for callback to be used. */
  37277. wolfSSL_CTX_EnableOCSPStapling(ctx);
  37278. if (ctx->cm->ocsp_stapling == NULL)
  37279. return WOLFSSL_FAILURE;
  37280. ctx->cm->ocsp_stapling->statusCb = cb;
  37281. #else
  37282. (void)cb;
  37283. #endif
  37284. return WOLFSSL_SUCCESS;
  37285. }
  37286. int wolfSSL_X509_STORE_CTX_get1_issuer(WOLFSSL_X509 **issuer,
  37287. WOLFSSL_X509_STORE_CTX *ctx, WOLFSSL_X509 *x)
  37288. {
  37289. WOLFSSL_STACK* node;
  37290. Signer* ca = NULL;
  37291. #ifdef WOLFSSL_SMALL_STACK
  37292. DecodedCert* cert = NULL;
  37293. #else
  37294. DecodedCert cert[1];
  37295. #endif
  37296. if (issuer == NULL || ctx == NULL || x == NULL)
  37297. return WOLFSSL_FATAL_ERROR;
  37298. if (ctx->chain != NULL) {
  37299. for (node = ctx->chain; node != NULL; node = node->next) {
  37300. if (wolfSSL_X509_check_issued(node->data.x509, x) == X509_V_OK) {
  37301. *issuer = x;
  37302. return WOLFSSL_SUCCESS;
  37303. }
  37304. }
  37305. }
  37306. #ifdef WOLFSSL_SMALL_STACK
  37307. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
  37308. if (cert == NULL)
  37309. return WOLFSSL_FAILURE;
  37310. #endif
  37311. /* Use existing CA retrieval APIs that use DecodedCert. */
  37312. InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, NULL);
  37313. if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0) {
  37314. #ifndef NO_SKID
  37315. if (cert->extAuthKeyIdSet)
  37316. ca = GetCA(ctx->store->cm, cert->extAuthKeyId);
  37317. if (ca == NULL)
  37318. ca = GetCAByName(ctx->store->cm, cert->issuerHash);
  37319. #else /* NO_SKID */
  37320. ca = GetCA(ctx->store->cm, cert->issuerHash);
  37321. #endif /* NO SKID */
  37322. }
  37323. FreeDecodedCert(cert);
  37324. #ifdef WOLFSSL_SMALL_STACK
  37325. XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
  37326. #endif
  37327. if (ca == NULL)
  37328. return WOLFSSL_FAILURE;
  37329. #ifdef WOLFSSL_SIGNER_DER_CERT
  37330. /* populate issuer with Signer DER */
  37331. *issuer = wolfSSL_X509_d2i(issuer, ca->derCert->buffer,
  37332. ca->derCert->length);
  37333. if (*issuer == NULL)
  37334. return WOLFSSL_FAILURE;
  37335. #else
  37336. /* Create an empty certificate as CA doesn't have a certificate. */
  37337. *issuer = (WOLFSSL_X509 *)XMALLOC(sizeof(WOLFSSL_X509), 0,
  37338. DYNAMIC_TYPE_OPENSSL);
  37339. if (*issuer == NULL)
  37340. return WOLFSSL_FAILURE;
  37341. InitX509((*issuer), 1, NULL);
  37342. #endif
  37343. /* Result is ignored when passed to wolfSSL_OCSP_cert_to_id(). */
  37344. return WOLFSSL_SUCCESS;
  37345. }
  37346. void wolfSSL_X509_email_free(WOLF_STACK_OF(WOLFSSL_STRING) *sk)
  37347. {
  37348. WOLFSSL_STACK *curr;
  37349. while (sk != NULL) {
  37350. curr = sk;
  37351. sk = sk->next;
  37352. XFREE(curr, NULL, DYNAMIC_TYPE_OPENSSL);
  37353. }
  37354. }
  37355. WOLF_STACK_OF(WOLFSSL_STRING) *wolfSSL_X509_get1_ocsp(WOLFSSL_X509 *x)
  37356. {
  37357. WOLFSSL_STACK* list = NULL;
  37358. char* url;
  37359. if (x->authInfoSz == 0)
  37360. return NULL;
  37361. list = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK) + x->authInfoSz + 1,
  37362. NULL, DYNAMIC_TYPE_OPENSSL);
  37363. if (list == NULL)
  37364. return NULL;
  37365. url = (char*)list;
  37366. url += sizeof(WOLFSSL_STACK);
  37367. XMEMCPY(url, x->authInfo, x->authInfoSz);
  37368. url[x->authInfoSz] = '\0';
  37369. list->data.string = url;
  37370. list->next = NULL;
  37371. return list;
  37372. }
  37373. int wolfSSL_X509_check_issued(WOLFSSL_X509 *issuer, WOLFSSL_X509 *subject)
  37374. {
  37375. WOLFSSL_X509_NAME *issuerName = wolfSSL_X509_get_issuer_name(subject);
  37376. WOLFSSL_X509_NAME *subjectName = wolfSSL_X509_get_subject_name(issuer);
  37377. if (issuerName == NULL || subjectName == NULL)
  37378. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  37379. /* Literal matching of encoded names and key ids. */
  37380. if (issuerName->sz != subjectName->sz ||
  37381. XMEMCMP(issuerName->name, subjectName->name, subjectName->sz) != 0) {
  37382. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  37383. }
  37384. if (subject->authKeyId != NULL && issuer->subjKeyId != NULL) {
  37385. if (subject->authKeyIdSz != issuer->subjKeyIdSz ||
  37386. XMEMCMP(subject->authKeyId, issuer->subjKeyId,
  37387. issuer->subjKeyIdSz) != 0) {
  37388. return X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
  37389. }
  37390. }
  37391. return X509_V_OK;
  37392. }
  37393. WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
  37394. {
  37395. WOLFSSL_ENTER("wolfSSL_X509_dup");
  37396. if (x == NULL) {
  37397. WOLFSSL_MSG("Error: NULL certificate passed in");
  37398. return NULL;
  37399. }
  37400. return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length);
  37401. }
  37402. char* wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
  37403. int idx)
  37404. {
  37405. for (; idx > 0 && strings != NULL; idx--)
  37406. strings = strings->next;
  37407. if (strings == NULL)
  37408. return NULL;
  37409. return strings->data.string;
  37410. }
  37411. #endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
  37412. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  37413. #ifdef HAVE_ALPN
  37414. void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data,
  37415. unsigned int *len)
  37416. {
  37417. word16 nameLen;
  37418. if (ssl != NULL && data != NULL && len != NULL) {
  37419. TLSX_ALPN_GetRequest(ssl->extensions, (void **)data, &nameLen);
  37420. *len = nameLen;
  37421. }
  37422. }
  37423. int wolfSSL_select_next_proto(unsigned char **out, unsigned char *outLen,
  37424. const unsigned char *in, unsigned int inLen,
  37425. const unsigned char *clientNames,
  37426. unsigned int clientLen)
  37427. {
  37428. unsigned int i, j;
  37429. byte lenIn, lenClient;
  37430. if (out == NULL || outLen == NULL || in == NULL || clientNames == NULL)
  37431. return OPENSSL_NPN_UNSUPPORTED;
  37432. for (i = 0; i < inLen; i += lenIn) {
  37433. lenIn = in[i++];
  37434. for (j = 0; j < clientLen; j += lenClient) {
  37435. lenClient = clientNames[j++];
  37436. if (lenIn != lenClient)
  37437. continue;
  37438. if (XMEMCMP(in + i, clientNames + j, lenIn) == 0) {
  37439. *out = (unsigned char *)(in + i);
  37440. *outLen = lenIn;
  37441. return OPENSSL_NPN_NEGOTIATED;
  37442. }
  37443. }
  37444. }
  37445. *out = (unsigned char *)clientNames + 1;
  37446. *outLen = clientNames[0];
  37447. return OPENSSL_NPN_NO_OVERLAP;
  37448. }
  37449. void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx,
  37450. int (*cb) (WOLFSSL *ssl,
  37451. const unsigned char **out,
  37452. unsigned char *outlen,
  37453. const unsigned char *in,
  37454. unsigned int inlen,
  37455. void *arg), void *arg)
  37456. {
  37457. if (ctx != NULL) {
  37458. ctx->alpnSelect = cb;
  37459. ctx->alpnSelectArg = arg;
  37460. }
  37461. }
  37462. void wolfSSL_CTX_set_next_protos_advertised_cb(WOLFSSL_CTX *s,
  37463. int (*cb) (WOLFSSL *ssl,
  37464. const unsigned char
  37465. **out,
  37466. unsigned int *outlen,
  37467. void *arg), void *arg)
  37468. {
  37469. (void)s;
  37470. (void)cb;
  37471. (void)arg;
  37472. WOLFSSL_STUB("wolfSSL_CTX_set_next_protos_advertised_cb");
  37473. }
  37474. void wolfSSL_CTX_set_next_proto_select_cb(WOLFSSL_CTX *s,
  37475. int (*cb) (WOLFSSL *ssl,
  37476. unsigned char **out,
  37477. unsigned char *outlen,
  37478. const unsigned char *in,
  37479. unsigned int inlen,
  37480. void *arg), void *arg)
  37481. {
  37482. (void)s;
  37483. (void)cb;
  37484. (void)arg;
  37485. WOLFSSL_STUB("wolfSSL_CTX_set_next_proto_select_cb");
  37486. }
  37487. void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, const unsigned char **data,
  37488. unsigned *len)
  37489. {
  37490. (void)s;
  37491. (void)data;
  37492. (void)len;
  37493. WOLFSSL_STUB("wolfSSL_get0_next_proto_negotiated");
  37494. }
  37495. #endif /* HAVE_ALPN */
  37496. #endif /* WOLFSSL_NGINX / WOLFSSL_HAPROXY */
  37497. #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
  37498. int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names)
  37499. {
  37500. int idx, start = 0, len;
  37501. word16 curve;
  37502. char name[MAX_CURVE_NAME_SZ];
  37503. /* Disable all curves so that only the ones the user wants are enabled. */
  37504. ctx->disabledCurves = 0xFFFFFFFFUL;
  37505. for (idx = 1; names[idx-1] != '\0'; idx++) {
  37506. if (names[idx] != ':' && names[idx] != '\0')
  37507. continue;
  37508. len = idx - 1 - start;
  37509. if (len > MAX_CURVE_NAME_SZ - 1)
  37510. return WOLFSSL_FAILURE;
  37511. XMEMCPY(name, names + start, len);
  37512. name[len] = 0;
  37513. if ((XSTRNCMP(name, "prime256v1", len) == 0) ||
  37514. (XSTRNCMP(name, "secp256r1", len) == 0) ||
  37515. (XSTRNCMP(name, "P-256", len) == 0)) {
  37516. curve = WOLFSSL_ECC_SECP256R1;
  37517. }
  37518. else if ((XSTRNCMP(name, "secp384r1", len) == 0) ||
  37519. (XSTRNCMP(name, "P-384", len) == 0)) {
  37520. curve = WOLFSSL_ECC_SECP384R1;
  37521. }
  37522. else if ((XSTRNCMP(name, "secp521r1", len) == 0) ||
  37523. (XSTRNCMP(name, "P-521", len) == 0)) {
  37524. curve = WOLFSSL_ECC_SECP521R1;
  37525. }
  37526. else if (XSTRNCMP(name, "X25519", len) == 0) {
  37527. curve = WOLFSSL_ECC_X25519;
  37528. }
  37529. else if (XSTRNCMP(name, "X448", len) == 0) {
  37530. curve = WOLFSSL_ECC_X448;
  37531. }
  37532. else {
  37533. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  37534. int ret;
  37535. const ecc_set_type *eccSet;
  37536. ret = wc_ecc_get_curve_idx_from_name(name);
  37537. if (ret < 0) {
  37538. WOLFSSL_MSG("Could not find name in set");
  37539. return WOLFSSL_FAILURE;
  37540. }
  37541. eccSet = wc_ecc_get_curve_params(ret);
  37542. if (eccSet == NULL) {
  37543. WOLFSSL_MSG("NULL set returned");
  37544. return WOLFSSL_FAILURE;
  37545. }
  37546. curve = GetCurveByOID(eccSet->oidSum);
  37547. #else
  37548. WOLFSSL_MSG("API not present to search farther using name");
  37549. return WOLFSSL_FAILURE;
  37550. #endif
  37551. }
  37552. if (curve > (sizeof(word32) * WOLFSSL_BIT_SIZE)) {
  37553. /* shift left more than size of ctx->disabledCurves causes static
  37554. * analysis report */
  37555. WOLFSSL_MSG("curve value is too large for upcoming shift");
  37556. return WOLFSSL_FAILURE;
  37557. }
  37558. #if defined(HAVE_SUPPORTED_CURVES) && !defined(NO_WOLFSSL_CLIENT)
  37559. /* set the supported curve so client TLS extension contains only the
  37560. * desired curves */
  37561. if (wolfSSL_CTX_UseSupportedCurve(ctx, curve) != WOLFSSL_SUCCESS) {
  37562. WOLFSSL_MSG("Unable to set supported curve");
  37563. return WOLFSSL_FAILURE;
  37564. }
  37565. #endif
  37566. /* Switch the bit to off and therefore is enabled. */
  37567. ctx->disabledCurves &= ~(1U << curve);
  37568. start = idx + 1;
  37569. }
  37570. return WOLFSSL_SUCCESS;
  37571. }
  37572. int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
  37573. {
  37574. if (ssl == NULL) {
  37575. return WOLFSSL_FAILURE;
  37576. }
  37577. return wolfSSL_CTX_set1_curves_list(ssl->ctx, names);
  37578. }
  37579. #endif /* OPENSSL_EXTRA && HAVE_ECC */
  37580. #ifdef OPENSSL_EXTRA
  37581. #ifndef NO_WOLFSSL_STUB
  37582. int wolfSSL_CTX_set_msg_callback(WOLFSSL_CTX *ctx, SSL_Msg_Cb cb)
  37583. {
  37584. WOLFSSL_STUB("SSL_CTX_set_msg_callback");
  37585. (void)ctx;
  37586. (void)cb;
  37587. return WOLFSSL_FAILURE;
  37588. }
  37589. #endif
  37590. /* Sets a callback for when sending and receiving protocol messages.
  37591. *
  37592. * ssl WOLFSSL structure to set callback in
  37593. * cb callback to use
  37594. *
  37595. * return SSL_SUCCESS on success and SSL_FAILURE with error case
  37596. */
  37597. int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb)
  37598. {
  37599. WOLFSSL_ENTER("wolfSSL_set_msg_callback");
  37600. if (ssl == NULL) {
  37601. return SSL_FAILURE;
  37602. }
  37603. if (cb != NULL) {
  37604. ssl->toInfoOn = 1;
  37605. }
  37606. ssl->protoMsgCb = cb;
  37607. return SSL_SUCCESS;
  37608. }
  37609. #ifndef NO_WOLFSSL_STUB
  37610. int wolfSSL_CTX_set_msg_callback_arg(WOLFSSL_CTX *ctx, void* arg)
  37611. {
  37612. WOLFSSL_STUB("SSL_CTX_set_msg_callback_arg");
  37613. (void)ctx;
  37614. (void)arg;
  37615. return WOLFSSL_FAILURE;
  37616. }
  37617. #endif
  37618. int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg)
  37619. {
  37620. WOLFSSL_ENTER("wolfSSL_set_msg_callback_arg");
  37621. if (ssl == NULL)
  37622. return WOLFSSL_FAILURE;
  37623. ssl->protoMsgCtx = arg;
  37624. return WOLFSSL_SUCCESS;
  37625. }
  37626. void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line)
  37627. {
  37628. void *ret;
  37629. (void)file;
  37630. (void)line;
  37631. if (data == NULL || siz >= INT_MAX)
  37632. return NULL;
  37633. ret = OPENSSL_malloc(siz);
  37634. if (ret == NULL) {
  37635. return NULL;
  37636. }
  37637. return XMEMCPY(ret, data, siz);
  37638. }
  37639. int wolfSSL_CTX_set_alpn_protos(WOLFSSL_CTX *ctx, const unsigned char *p,
  37640. unsigned int p_len)
  37641. {
  37642. WOLFSSL_ENTER("wolfSSL_CTX_set_alpn_protos");
  37643. if(ctx == NULL)
  37644. return BAD_FUNC_ARG;
  37645. if((void *)ctx->alpn_cli_protos != NULL)
  37646. wolfSSL_OPENSSL_free((void *)ctx->alpn_cli_protos);
  37647. ctx->alpn_cli_protos =
  37648. (const unsigned char *)wolfSSL_OPENSSL_memdup(p, p_len, NULL, 0);
  37649. if (ctx->alpn_cli_protos == NULL) {
  37650. return SSL_FAILURE;
  37651. }
  37652. ctx->alpn_cli_protos_len = p_len;
  37653. return SSL_SUCCESS;
  37654. }
  37655. #ifdef HAVE_ALPN
  37656. /* Sets the ALPN extension protos
  37657. *
  37658. * example format is
  37659. * unsigned char p[] = {
  37660. * 8, 'h', 't', 't', 'p', '/', '1', '.', '1'
  37661. * };
  37662. *
  37663. * returns WOLFSSL_SUCCESS on success */
  37664. int wolfSSL_set_alpn_protos(WOLFSSL* ssl,
  37665. const unsigned char* p, unsigned int p_len)
  37666. {
  37667. WOLFSSL_BIO* bio;
  37668. char* pt;
  37669. unsigned int sz;
  37670. unsigned int idx = 0;
  37671. int alpn_opt = WOLFSSL_ALPN_CONTINUE_ON_MISMATCH;
  37672. WOLFSSL_ENTER("wolfSSL_set_alpn_protos");
  37673. if (ssl == NULL || p_len <= 1) {
  37674. return WOLFSSL_FAILURE;
  37675. }
  37676. bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
  37677. if (bio == NULL) {
  37678. return WOLFSSL_FAILURE;
  37679. }
  37680. /* convert into comma separated list */
  37681. while (idx < p_len - 1) {
  37682. unsigned int i;
  37683. sz = p[idx++];
  37684. if (idx + sz > p_len) {
  37685. WOLFSSL_MSG("Bad list format");
  37686. wolfSSL_BIO_free(bio);
  37687. return WOLFSSL_FAILURE;
  37688. }
  37689. if (sz > 0) {
  37690. for (i = 0; i < sz; i++) {
  37691. wolfSSL_BIO_write(bio, &p[idx++], 1);
  37692. }
  37693. if (idx < p_len - 1)
  37694. wolfSSL_BIO_write(bio, ",", 1);
  37695. }
  37696. }
  37697. wolfSSL_BIO_write(bio, "\0", 1);
  37698. /* clears out all current ALPN extensions set */
  37699. TLSX_Remove(&ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL, ssl->heap);
  37700. if ((sz = wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) {
  37701. wolfSSL_UseALPN(ssl, pt, sz, alpn_opt);
  37702. }
  37703. wolfSSL_BIO_free(bio);
  37704. return WOLFSSL_SUCCESS;
  37705. }
  37706. #endif /* HAVE_ALPN */
  37707. #endif
  37708. #endif /* WOLFCRYPT_ONLY */
  37709. #if defined(OPENSSL_EXTRA)
  37710. #define WOLFSSL_BIO_INCLUDED
  37711. #include "src/bio.c"
  37712. int oid2nid(word32 oid, int grp)
  37713. {
  37714. /* get OID type */
  37715. switch (grp) {
  37716. /* oidHashType */
  37717. case oidHashType:
  37718. switch (oid) {
  37719. #ifdef WOLFSSL_MD2
  37720. case MD2h:
  37721. return NID_md2;
  37722. #endif
  37723. #ifndef NO_MD5
  37724. case MD5h:
  37725. return NID_md5;
  37726. #endif
  37727. #ifndef NO_SHA
  37728. case SHAh:
  37729. return NID_sha1;
  37730. #endif
  37731. case SHA224h:
  37732. return NID_sha224;
  37733. #ifndef NO_SHA256
  37734. case SHA256h:
  37735. return NID_sha256;
  37736. #endif
  37737. #ifdef WOLFSSL_SHA384
  37738. case SHA384h:
  37739. return NID_sha384;
  37740. #endif
  37741. #ifdef WOLFSSL_SHA512
  37742. case SHA512h:
  37743. return NID_sha512;
  37744. #endif
  37745. }
  37746. break;
  37747. /* oidSigType */
  37748. case oidSigType:
  37749. switch (oid) {
  37750. #ifndef NO_DSA
  37751. case CTC_SHAwDSA:
  37752. return CTC_SHAwDSA;
  37753. #endif /* NO_DSA */
  37754. #ifndef NO_RSA
  37755. case CTC_MD2wRSA:
  37756. return CTC_MD2wRSA;
  37757. case CTC_MD5wRSA:
  37758. return CTC_MD5wRSA;
  37759. case CTC_SHAwRSA:
  37760. return CTC_SHAwRSA;
  37761. case CTC_SHA224wRSA:
  37762. return CTC_SHA224wRSA;
  37763. case CTC_SHA256wRSA:
  37764. return CTC_SHA256wRSA;
  37765. case CTC_SHA384wRSA:
  37766. return CTC_SHA384wRSA;
  37767. case CTC_SHA512wRSA:
  37768. return CTC_SHA512wRSA;
  37769. #endif /* NO_RSA */
  37770. #ifdef HAVE_ECC
  37771. case CTC_SHAwECDSA:
  37772. return CTC_SHAwECDSA;
  37773. case CTC_SHA224wECDSA:
  37774. return CTC_SHA224wECDSA;
  37775. case CTC_SHA256wECDSA:
  37776. return CTC_SHA256wECDSA;
  37777. case CTC_SHA384wECDSA:
  37778. return CTC_SHA384wECDSA;
  37779. case CTC_SHA512wECDSA:
  37780. return CTC_SHA512wECDSA;
  37781. #endif /* HAVE_ECC */
  37782. }
  37783. break;
  37784. /* oidKeyType */
  37785. case oidKeyType:
  37786. switch (oid) {
  37787. #ifndef NO_DSA
  37788. case DSAk:
  37789. return DSAk;
  37790. #endif /* NO_DSA */
  37791. #ifndef NO_RSA
  37792. case RSAk:
  37793. return RSAk;
  37794. #endif /* NO_RSA */
  37795. #ifdef HAVE_NTRU
  37796. case NTRUk:
  37797. return NTRUk;
  37798. #endif /* HAVE_NTRU */
  37799. #ifdef HAVE_ECC
  37800. case ECDSAk:
  37801. return ECDSAk;
  37802. #endif /* HAVE_ECC */
  37803. }
  37804. break;
  37805. #ifdef HAVE_ECC
  37806. case oidCurveType:
  37807. switch (oid) {
  37808. case ECC_SECP192R1_OID:
  37809. return NID_X9_62_prime192v1;
  37810. case ECC_PRIME192V2_OID:
  37811. return NID_X9_62_prime192v2;
  37812. case ECC_PRIME192V3_OID:
  37813. return NID_X9_62_prime192v3;
  37814. case ECC_PRIME239V1_OID:
  37815. return NID_X9_62_prime239v1;
  37816. case ECC_PRIME239V2_OID:
  37817. return NID_X9_62_prime239v2;
  37818. case ECC_PRIME239V3_OID:
  37819. return NID_X9_62_prime239v3;
  37820. case ECC_SECP256R1_OID:
  37821. return NID_X9_62_prime256v1;
  37822. case ECC_SECP112R1_OID:
  37823. return NID_secp112r1;
  37824. case ECC_SECP112R2_OID:
  37825. return NID_secp112r2;
  37826. case ECC_SECP128R1_OID:
  37827. return NID_secp128r1;
  37828. case ECC_SECP128R2_OID:
  37829. return NID_secp128r2;
  37830. case ECC_SECP160R1_OID:
  37831. return NID_secp160r1;
  37832. case ECC_SECP160R2_OID:
  37833. return NID_secp160r2;
  37834. case ECC_SECP224R1_OID:
  37835. return NID_secp224r1;
  37836. case ECC_SECP384R1_OID:
  37837. return NID_secp384r1;
  37838. case ECC_SECP521R1_OID:
  37839. return NID_secp521r1;
  37840. case ECC_SECP160K1_OID:
  37841. return NID_secp160k1;
  37842. case ECC_SECP192K1_OID:
  37843. return NID_secp192k1;
  37844. case ECC_SECP224K1_OID:
  37845. return NID_secp224k1;
  37846. case ECC_SECP256K1_OID:
  37847. return NID_secp256k1;
  37848. case ECC_BRAINPOOLP160R1_OID:
  37849. return NID_brainpoolP160r1;
  37850. case ECC_BRAINPOOLP192R1_OID:
  37851. return NID_brainpoolP192r1;
  37852. case ECC_BRAINPOOLP224R1_OID:
  37853. return NID_brainpoolP224r1;
  37854. case ECC_BRAINPOOLP256R1_OID:
  37855. return NID_brainpoolP256r1;
  37856. case ECC_BRAINPOOLP320R1_OID:
  37857. return NID_brainpoolP320r1;
  37858. case ECC_BRAINPOOLP384R1_OID:
  37859. return NID_brainpoolP384r1;
  37860. case ECC_BRAINPOOLP512R1_OID:
  37861. return NID_brainpoolP512r1;
  37862. }
  37863. break;
  37864. #endif /* HAVE_ECC */
  37865. /* oidBlkType */
  37866. case oidBlkType:
  37867. switch (oid) {
  37868. #ifdef WOLFSSL_AES_128
  37869. case AES128CBCb:
  37870. return AES128CBCb;
  37871. #endif
  37872. #ifdef WOLFSSL_AES_192
  37873. case AES192CBCb:
  37874. return AES192CBCb;
  37875. #endif
  37876. #ifdef WOLFSSL_AES_256
  37877. case AES256CBCb:
  37878. return AES256CBCb;
  37879. #endif
  37880. #ifndef NO_DES3
  37881. case DESb:
  37882. return NID_des;
  37883. case DES3b:
  37884. return NID_des3;
  37885. #endif
  37886. }
  37887. break;
  37888. #ifdef HAVE_OCSP
  37889. case oidOcspType:
  37890. switch (oid) {
  37891. case OCSP_BASIC_OID:
  37892. return NID_id_pkix_OCSP_basic;
  37893. case OCSP_NONCE_OID:
  37894. return OCSP_NONCE_OID;
  37895. }
  37896. break;
  37897. #endif /* HAVE_OCSP */
  37898. /* oidCertExtType */
  37899. case oidCertExtType:
  37900. switch (oid) {
  37901. case BASIC_CA_OID:
  37902. return BASIC_CA_OID;
  37903. case ALT_NAMES_OID:
  37904. return ALT_NAMES_OID;
  37905. case CRL_DIST_OID:
  37906. return CRL_DIST_OID;
  37907. case AUTH_INFO_OID:
  37908. return AUTH_INFO_OID;
  37909. case AUTH_KEY_OID:
  37910. return AUTH_KEY_OID;
  37911. case SUBJ_KEY_OID:
  37912. return SUBJ_KEY_OID;
  37913. case INHIBIT_ANY_OID:
  37914. return INHIBIT_ANY_OID;
  37915. case KEY_USAGE_OID:
  37916. return NID_key_usage;
  37917. case NAME_CONS_OID:
  37918. return NID_name_constraints;
  37919. case CERT_POLICY_OID:
  37920. return NID_certificate_policies;
  37921. }
  37922. break;
  37923. /* oidCertAuthInfoType */
  37924. case oidCertAuthInfoType:
  37925. switch (oid) {
  37926. case AIA_OCSP_OID:
  37927. return AIA_OCSP_OID;
  37928. case AIA_CA_ISSUER_OID:
  37929. return AIA_CA_ISSUER_OID;
  37930. }
  37931. break;
  37932. /* oidCertPolicyType */
  37933. case oidCertPolicyType:
  37934. switch (oid) {
  37935. case CP_ANY_OID:
  37936. return NID_any_policy;
  37937. }
  37938. break;
  37939. /* oidCertAltNameType */
  37940. case oidCertAltNameType:
  37941. switch (oid) {
  37942. case HW_NAME_OID:
  37943. return NID_hw_name_oid;
  37944. }
  37945. break;
  37946. /* oidCertKeyUseType */
  37947. case oidCertKeyUseType:
  37948. switch (oid) {
  37949. case EKU_ANY_OID:
  37950. return NID_anyExtendedKeyUsage;
  37951. case EKU_SERVER_AUTH_OID:
  37952. return EKU_SERVER_AUTH_OID;
  37953. case EKU_CLIENT_AUTH_OID:
  37954. return EKU_CLIENT_AUTH_OID;
  37955. case EKU_OCSP_SIGN_OID:
  37956. return EKU_OCSP_SIGN_OID;
  37957. }
  37958. break;
  37959. /* oidKdfType */
  37960. case oidKdfType:
  37961. switch (oid) {
  37962. case PBKDF2_OID:
  37963. return PBKDF2_OID;
  37964. }
  37965. break;
  37966. /* oidPBEType */
  37967. case oidPBEType:
  37968. switch (oid) {
  37969. case PBE_SHA1_RC4_128:
  37970. return PBE_SHA1_RC4_128;
  37971. case PBE_SHA1_DES:
  37972. return PBE_SHA1_DES;
  37973. case PBE_SHA1_DES3:
  37974. return PBE_SHA1_DES3;
  37975. }
  37976. break;
  37977. /* oidKeyWrapType */
  37978. case oidKeyWrapType:
  37979. switch (oid) {
  37980. #ifdef WOLFSSL_AES_128
  37981. case AES128_WRAP:
  37982. return AES128_WRAP;
  37983. #endif
  37984. #ifdef WOLFSSL_AES_192
  37985. case AES192_WRAP:
  37986. return AES192_WRAP;
  37987. #endif
  37988. #ifdef WOLFSSL_AES_256
  37989. case AES256_WRAP:
  37990. return AES256_WRAP;
  37991. #endif
  37992. }
  37993. break;
  37994. /* oidCmsKeyAgreeType */
  37995. case oidCmsKeyAgreeType:
  37996. switch (oid) {
  37997. #ifndef NO_SHA
  37998. case dhSinglePass_stdDH_sha1kdf_scheme:
  37999. return dhSinglePass_stdDH_sha1kdf_scheme;
  38000. #endif
  38001. #ifdef WOLFSSL_SHA224
  38002. case dhSinglePass_stdDH_sha224kdf_scheme:
  38003. return dhSinglePass_stdDH_sha224kdf_scheme;
  38004. #endif
  38005. #ifndef NO_SHA256
  38006. case dhSinglePass_stdDH_sha256kdf_scheme:
  38007. return dhSinglePass_stdDH_sha256kdf_scheme;
  38008. #endif
  38009. #ifdef WOLFSSL_SHA384
  38010. case dhSinglePass_stdDH_sha384kdf_scheme:
  38011. return dhSinglePass_stdDH_sha384kdf_scheme;
  38012. #endif
  38013. #ifdef WOLFSSL_SHA512
  38014. case dhSinglePass_stdDH_sha512kdf_scheme:
  38015. return dhSinglePass_stdDH_sha512kdf_scheme;
  38016. #endif
  38017. }
  38018. break;
  38019. default:
  38020. WOLFSSL_MSG("NID not in table");
  38021. return -1;
  38022. }
  38023. return -1;
  38024. }
  38025. /* when calling SetIndividualInternal, mpi should be cleared by caller if no
  38026. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  38027. * disabled since a copy of mpi is made by this function and placed into bn.
  38028. */
  38029. int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi)
  38030. {
  38031. WOLFSSL_MSG("Entering SetIndividualInternal");
  38032. if (bn == NULL || bn->internal == NULL) {
  38033. WOLFSSL_MSG("bn NULL error");
  38034. return WOLFSSL_FATAL_ERROR;
  38035. }
  38036. if (mpi == NULL) {
  38037. WOLFSSL_MSG("mpi NULL error");
  38038. return WOLFSSL_FATAL_ERROR;
  38039. }
  38040. if (mp_copy((mp_int*)bn->internal, mpi) != MP_OKAY) {
  38041. WOLFSSL_MSG("mp_copy error");
  38042. return WOLFSSL_FATAL_ERROR;
  38043. }
  38044. return WOLFSSL_SUCCESS;
  38045. }
  38046. #ifndef NO_ASN
  38047. WOLFSSL_BIGNUM *wolfSSL_ASN1_INTEGER_to_BN(const WOLFSSL_ASN1_INTEGER *ai,
  38048. WOLFSSL_BIGNUM *bn)
  38049. {
  38050. mp_int mpi;
  38051. word32 idx = 0;
  38052. int ret;
  38053. WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_to_BN");
  38054. if (ai == NULL) {
  38055. return NULL;
  38056. }
  38057. ret = GetInt(&mpi, ai->data, &idx, ai->dataMax);
  38058. if (ret != 0) {
  38059. #ifdef WOLFSSL_QT
  38060. ret = mp_init(&mpi); /* must init mpi */
  38061. if (ret != MP_OKAY) {
  38062. return NULL;
  38063. }
  38064. /* Serial number in QT starts at index 0 of data */
  38065. if (mp_read_unsigned_bin(&mpi, (byte*)ai->data, ai->length) != 0) {
  38066. mp_clear(&mpi);
  38067. return NULL;
  38068. }
  38069. #else
  38070. /* expecting ASN1 format for INTEGER */
  38071. WOLFSSL_LEAVE("wolfSSL_ASN1_INTEGER_to_BN", ret);
  38072. return NULL;
  38073. #endif
  38074. }
  38075. /* mp_clear needs called because mpi is copied and causes memory leak with
  38076. * --disable-fastmath */
  38077. ret = SetIndividualExternal(&bn, &mpi);
  38078. mp_clear(&mpi);
  38079. if (ret != WOLFSSL_SUCCESS) {
  38080. return NULL;
  38081. }
  38082. return bn;
  38083. }
  38084. #endif /* !NO_ASN */
  38085. #if !defined(NO_DSA) && !defined(NO_DH)
  38086. WOLFSSL_DH *wolfSSL_DSA_dup_DH(const WOLFSSL_DSA *dsa)
  38087. {
  38088. WOLFSSL_DH* dh;
  38089. DhKey* key;
  38090. WOLFSSL_ENTER("wolfSSL_DSA_dup_DH");
  38091. if (dsa == NULL) {
  38092. return NULL;
  38093. }
  38094. dh = wolfSSL_DH_new();
  38095. if (dh == NULL) {
  38096. return NULL;
  38097. }
  38098. key = (DhKey*)dh->internal;
  38099. if (dsa->p != NULL &&
  38100. SetIndividualInternal(((WOLFSSL_DSA*)dsa)->p, &key->p) != WOLFSSL_SUCCESS) {
  38101. WOLFSSL_MSG("rsa p key error");
  38102. wolfSSL_DH_free(dh);
  38103. return NULL;
  38104. }
  38105. if (dsa->g != NULL &&
  38106. SetIndividualInternal(((WOLFSSL_DSA*)dsa)->g, &key->g) != WOLFSSL_SUCCESS) {
  38107. WOLFSSL_MSG("rsa g key error");
  38108. wolfSSL_DH_free(dh);
  38109. return NULL;
  38110. }
  38111. if (SetIndividualExternal(&dh->p, &key->p) != WOLFSSL_SUCCESS) {
  38112. WOLFSSL_MSG("dsa p key error");
  38113. wolfSSL_DH_free(dh);
  38114. return NULL;
  38115. }
  38116. if (SetIndividualExternal(&dh->g, &key->g) != WOLFSSL_SUCCESS) {
  38117. WOLFSSL_MSG("dsa g key error");
  38118. wolfSSL_DH_free(dh);
  38119. return NULL;
  38120. }
  38121. return dh;
  38122. }
  38123. #endif /* !NO_DSA && !NO_DH */
  38124. #ifndef NO_RSA
  38125. #if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  38126. /* Openssl -> WolfSSL */
  38127. int SetRsaInternal(WOLFSSL_RSA* rsa)
  38128. {
  38129. RsaKey* key;
  38130. WOLFSSL_MSG("Entering SetRsaInternal");
  38131. if (rsa == NULL || rsa->internal == NULL) {
  38132. WOLFSSL_MSG("rsa key NULL error");
  38133. return WOLFSSL_FATAL_ERROR;
  38134. }
  38135. key = (RsaKey*)rsa->internal;
  38136. if (SetIndividualInternal(rsa->n, &key->n) != WOLFSSL_SUCCESS) {
  38137. WOLFSSL_MSG("rsa n key error");
  38138. return WOLFSSL_FATAL_ERROR;
  38139. }
  38140. if (SetIndividualInternal(rsa->e, &key->e) != WOLFSSL_SUCCESS) {
  38141. WOLFSSL_MSG("rsa e key error");
  38142. return WOLFSSL_FATAL_ERROR;
  38143. }
  38144. /* public key */
  38145. key->type = RSA_PUBLIC;
  38146. if (rsa->d != NULL) {
  38147. if (SetIndividualInternal(rsa->d, &key->d) != WOLFSSL_SUCCESS) {
  38148. WOLFSSL_MSG("rsa d key error");
  38149. return WOLFSSL_FATAL_ERROR;
  38150. }
  38151. /* private key */
  38152. key->type = RSA_PRIVATE;
  38153. }
  38154. if (rsa->p != NULL &&
  38155. SetIndividualInternal(rsa->p, &key->p) != WOLFSSL_SUCCESS) {
  38156. WOLFSSL_MSG("rsa p key error");
  38157. return WOLFSSL_FATAL_ERROR;
  38158. }
  38159. if (rsa->q != NULL &&
  38160. SetIndividualInternal(rsa->q, &key->q) != WOLFSSL_SUCCESS) {
  38161. WOLFSSL_MSG("rsa q key error");
  38162. return WOLFSSL_FATAL_ERROR;
  38163. }
  38164. #ifndef RSA_LOW_MEM
  38165. if (rsa->dmp1 != NULL &&
  38166. SetIndividualInternal(rsa->dmp1, &key->dP) != WOLFSSL_SUCCESS) {
  38167. WOLFSSL_MSG("rsa dP key error");
  38168. return WOLFSSL_FATAL_ERROR;
  38169. }
  38170. if (rsa->dmq1 != NULL &&
  38171. SetIndividualInternal(rsa->dmq1, &key->dQ) != WOLFSSL_SUCCESS) {
  38172. WOLFSSL_MSG("rsa dQ key error");
  38173. return WOLFSSL_FATAL_ERROR;
  38174. }
  38175. if (rsa->iqmp != NULL &&
  38176. SetIndividualInternal(rsa->iqmp, &key->u) != WOLFSSL_SUCCESS) {
  38177. WOLFSSL_MSG("rsa u key error");
  38178. return WOLFSSL_FATAL_ERROR;
  38179. }
  38180. #endif /* !RSA_LOW_MEM */
  38181. rsa->inSet = 1;
  38182. return WOLFSSL_SUCCESS;
  38183. }
  38184. /* SSL_SUCCESS on ok */
  38185. #ifndef NO_WOLFSSL_STUB
  38186. int wolfSSL_RSA_blinding_on(WOLFSSL_RSA* rsa, WOLFSSL_BN_CTX* bn)
  38187. {
  38188. (void)rsa;
  38189. (void)bn;
  38190. WOLFSSL_STUB("RSA_blinding_on");
  38191. WOLFSSL_MSG("wolfSSL_RSA_blinding_on");
  38192. return WOLFSSL_SUCCESS; /* on by default */
  38193. }
  38194. #endif
  38195. /* return compliant with OpenSSL
  38196. * size of encrypted data if success , -1 if error
  38197. */
  38198. int wolfSSL_RSA_public_encrypt(int len, const unsigned char* fr,
  38199. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  38200. {
  38201. int initTmpRng = 0;
  38202. WC_RNG *rng = NULL;
  38203. int outLen;
  38204. int ret = 0;
  38205. #ifdef WOLFSSL_SMALL_STACK
  38206. WC_RNG* tmpRNG = NULL;
  38207. #else
  38208. WC_RNG _tmpRNG[1];
  38209. WC_RNG* tmpRNG = _tmpRNG;
  38210. #endif
  38211. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  38212. int mgf = WC_MGF1NONE;
  38213. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  38214. #endif
  38215. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt");
  38216. /* Check and remap the padding to internal values, if needed. */
  38217. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  38218. if (padding == RSA_PKCS1_PADDING)
  38219. padding = WC_RSA_PKCSV15_PAD;
  38220. else if (padding == RSA_PKCS1_OAEP_PADDING) {
  38221. padding = WC_RSA_OAEP_PAD;
  38222. hash = WC_HASH_TYPE_SHA;
  38223. mgf = WC_MGF1SHA1;
  38224. }
  38225. else if (padding == RSA_PKCS1_PSS_PADDING) {
  38226. padding = WC_RSA_PSS_PAD;
  38227. hash = WC_HASH_TYPE_SHA256;
  38228. mgf = WC_MGF1SHA256;
  38229. }
  38230. else if (padding == RSA_NO_PADDING) {
  38231. padding = WC_RSA_NO_PAD;
  38232. }
  38233. #else
  38234. if (padding == RSA_PKCS1_PADDING)
  38235. ;
  38236. #endif
  38237. else {
  38238. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt unsupported padding");
  38239. return 0;
  38240. }
  38241. if (rsa->inSet == 0)
  38242. {
  38243. if (SetRsaInternal(rsa) != SSL_SUCCESS) {
  38244. WOLFSSL_MSG("SetRsaInternal failed");
  38245. return 0;
  38246. }
  38247. }
  38248. outLen = wolfSSL_RSA_size(rsa);
  38249. rng = WOLFSSL_RSA_GetRNG(rsa, (WC_RNG**)&tmpRNG, &initTmpRng);
  38250. if (outLen == 0) {
  38251. WOLFSSL_MSG("Bad RSA size");
  38252. }
  38253. if (rng) {
  38254. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  38255. ret = wc_RsaPublicEncrypt_ex(fr, len, to, outLen,
  38256. (RsaKey*)rsa->internal, rng, padding,
  38257. hash, mgf, NULL, 0);
  38258. #else
  38259. ret = wc_RsaPublicEncrypt(fr, len, to, outLen,
  38260. (RsaKey*)rsa->internal, rng);
  38261. #endif
  38262. if (ret <= 0) {
  38263. WOLFSSL_MSG("Bad Rsa Encrypt");
  38264. }
  38265. if (len <= 0) {
  38266. WOLFSSL_MSG("Bad Rsa Encrypt");
  38267. }
  38268. }
  38269. if (initTmpRng)
  38270. wc_FreeRng(tmpRNG);
  38271. #ifdef WOLFSSL_SMALL_STACK
  38272. if (tmpRNG)
  38273. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38274. #endif
  38275. if (ret >= 0)
  38276. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt success");
  38277. else {
  38278. WOLFSSL_MSG("wolfSSL_RSA_public_encrypt failed");
  38279. ret = WOLFSSL_FATAL_ERROR; /* return -1 on error case */
  38280. }
  38281. return ret;
  38282. }
  38283. /* return compliant with OpenSSL
  38284. * size of plain recovered data if success , -1 if error
  38285. */
  38286. int wolfSSL_RSA_private_decrypt(int len, const unsigned char* fr,
  38287. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  38288. {
  38289. int outLen;
  38290. int ret = 0;
  38291. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  38292. int mgf = WC_MGF1NONE;
  38293. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  38294. #endif
  38295. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt");
  38296. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  38297. if (padding == RSA_PKCS1_PADDING)
  38298. padding = WC_RSA_PKCSV15_PAD;
  38299. else if (padding == RSA_PKCS1_OAEP_PADDING) {
  38300. padding = WC_RSA_OAEP_PAD;
  38301. hash = WC_HASH_TYPE_SHA;
  38302. mgf = WC_MGF1SHA1;
  38303. }
  38304. else if (padding == RSA_PKCS1_PSS_PADDING) {
  38305. padding = WC_RSA_PSS_PAD;
  38306. hash = WC_HASH_TYPE_SHA256;
  38307. mgf = WC_MGF1SHA256;
  38308. }
  38309. else if (padding == RSA_NO_PADDING) {
  38310. padding = WC_RSA_NO_PAD;
  38311. }
  38312. #else
  38313. if (padding == RSA_PKCS1_PADDING)
  38314. ;
  38315. #endif
  38316. else {
  38317. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt unsupported padding");
  38318. return 0;
  38319. }
  38320. if (rsa->inSet == 0)
  38321. {
  38322. if (SetRsaInternal(rsa) != SSL_SUCCESS) {
  38323. WOLFSSL_MSG("SetRsaInternal failed");
  38324. return 0;
  38325. }
  38326. }
  38327. outLen = wolfSSL_RSA_size(rsa);
  38328. if (outLen == 0) {
  38329. WOLFSSL_MSG("Bad RSA size");
  38330. }
  38331. /* size of 'to' buffer must be size of RSA key */
  38332. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
  38333. ret = wc_RsaPrivateDecrypt_ex(fr, len, to, outLen,
  38334. (RsaKey*)rsa->internal, padding,
  38335. hash, mgf, NULL, 0);
  38336. #else
  38337. ret = wc_RsaPrivateDecrypt(fr, len, to, outLen,
  38338. (RsaKey*)rsa->internal);
  38339. #endif
  38340. if (len <= 0) {
  38341. WOLFSSL_MSG("Bad Rsa Decrypt");
  38342. }
  38343. if (ret > 0)
  38344. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt success");
  38345. else {
  38346. WOLFSSL_MSG("wolfSSL_RSA_private_decrypt failed");
  38347. ret = WOLFSSL_FATAL_ERROR;
  38348. }
  38349. return ret;
  38350. }
  38351. #if !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  38352. int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from,
  38353. unsigned char* to, WOLFSSL_RSA* rsa, int padding)
  38354. {
  38355. int tlen = 0;
  38356. int pad_type;
  38357. WOLFSSL_ENTER("wolfSSL_RSA_public_decrypt");
  38358. if (rsa == NULL || rsa->internal == NULL || from == NULL) {
  38359. WOLFSSL_MSG("Bad function arguments");
  38360. return WOLFSSL_FAILURE;
  38361. }
  38362. switch (padding) {
  38363. case RSA_PKCS1_PADDING:
  38364. pad_type = WC_RSA_PKCSV15_PAD;
  38365. break;
  38366. case RSA_PKCS1_OAEP_PADDING:
  38367. pad_type = WC_RSA_OAEP_PAD;
  38368. break;
  38369. case RSA_PKCS1_PSS_PADDING:
  38370. pad_type = WC_RSA_PSS_PAD;
  38371. break;
  38372. case RSA_NO_PADDING:
  38373. pad_type = WC_RSA_NO_PAD;
  38374. break;
  38375. default:
  38376. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt unsupported padding");
  38377. return WOLFSSL_FAILURE;
  38378. }
  38379. if (rsa->inSet == 0)
  38380. {
  38381. WOLFSSL_MSG("No RSA internal set, do it");
  38382. if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
  38383. WOLFSSL_MSG("SetRsaInternal failed");
  38384. return WOLFSSL_FAILURE;
  38385. }
  38386. }
  38387. /* size of 'to' buffer must be size of RSA key */
  38388. tlen = wc_RsaSSL_Verify_ex(from, flen, to, wolfSSL_RSA_size(rsa),
  38389. (RsaKey*)rsa->internal, pad_type);
  38390. if (tlen <= 0)
  38391. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt failed");
  38392. else {
  38393. WOLFSSL_MSG("wolfSSL_RSA_public_decrypt success");
  38394. }
  38395. return tlen;
  38396. }
  38397. #endif /* !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
  38398. /* RSA private encrypt calls wc_RsaSSL_Sign. Similar function set up as RSA
  38399. * public decrypt.
  38400. *
  38401. * len Length of input buffer
  38402. * in Input buffer to sign
  38403. * out Output buffer (expected to be greater than or equal to RSA key size)
  38404. * rsa Key to use for encryption
  38405. * padding Type of RSA padding to use.
  38406. */
  38407. int wolfSSL_RSA_private_encrypt(int len, unsigned char* in,
  38408. unsigned char* out, WOLFSSL_RSA* rsa, int padding)
  38409. {
  38410. int sz = 0;
  38411. WC_RNG* rng = NULL;
  38412. #if !defined(WC_RSA_BLINDING) || defined(HAVE_USER_RSA)
  38413. WC_RNG rng_lcl;
  38414. #endif
  38415. RsaKey* key;
  38416. WOLFSSL_MSG("wolfSSL_RSA_private_encrypt");
  38417. if (len < 0 || rsa == NULL || rsa->internal == NULL || in == NULL) {
  38418. WOLFSSL_MSG("Bad function arguments");
  38419. return 0;
  38420. }
  38421. if (padding != RSA_PKCS1_PADDING && padding != RSA_PKCS1_PSS_PADDING) {
  38422. WOLFSSL_MSG("wolfSSL_RSA_private_encrypt unsupported padding");
  38423. return 0;
  38424. }
  38425. if (rsa->inSet == 0)
  38426. {
  38427. WOLFSSL_MSG("Setting internal RSA structure");
  38428. if (SetRsaInternal(rsa) != SSL_SUCCESS) {
  38429. WOLFSSL_MSG("SetRsaInternal failed");
  38430. return 0;
  38431. }
  38432. }
  38433. key = (RsaKey*)rsa->internal;
  38434. #if defined(WC_RSA_BLINDING) && !defined(HAVE_USER_RSA)
  38435. rng = key->rng;
  38436. #else
  38437. rng = &rng_lcl;
  38438. #ifndef HAVE_FIPS
  38439. if (wc_InitRng_ex(rng, key->heap, INVALID_DEVID) != 0)
  38440. #else
  38441. if (wc_InitRng(rng) != 0)
  38442. #endif
  38443. {
  38444. WOLFSSL_MSG("Error with random number");
  38445. return SSL_FATAL_ERROR;
  38446. }
  38447. #endif
  38448. /* size of output buffer must be size of RSA key */
  38449. sz = wc_RsaSSL_Sign(in, (word32)len, out, wolfSSL_RSA_size(rsa), key, rng);
  38450. #if !defined(WC_RSA_BLINDING) || defined(HAVE_USER_RSA)
  38451. if (wc_FreeRng(rng) != 0) {
  38452. WOLFSSL_MSG("Error freeing random number generator");
  38453. return SSL_FATAL_ERROR;
  38454. }
  38455. #endif
  38456. if (sz <= 0) {
  38457. WOLFSSL_LEAVE("wolfSSL_RSA_private_encrypt", sz);
  38458. return 0;
  38459. }
  38460. return sz;
  38461. }
  38462. #endif /* HAVE_USER_RSA */
  38463. #endif
  38464. /* frees all nodes in the current threads error queue
  38465. *
  38466. * id thread id. ERR_remove_state is depreciated and id is ignored. The
  38467. * current threads queue will be free'd.
  38468. */
  38469. void wolfSSL_ERR_remove_state(unsigned long id)
  38470. {
  38471. WOLFSSL_ENTER("wolfSSL_ERR_remove_state");
  38472. (void)id;
  38473. if (wc_ERR_remove_state() != 0) {
  38474. WOLFSSL_MSG("Error with removing the state");
  38475. }
  38476. }
  38477. WOLFSSL_BN_CTX* wolfSSL_BN_CTX_new(void)
  38478. {
  38479. static int ctx; /* wolfcrypt doesn't now need ctx */
  38480. WOLFSSL_MSG("wolfSSL_BN_CTX_new");
  38481. return (WOLFSSL_BN_CTX*)&ctx;
  38482. }
  38483. void wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX* ctx)
  38484. {
  38485. (void)ctx;
  38486. WOLFSSL_MSG("wolfSSL_BN_CTX_init");
  38487. }
  38488. void wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX* ctx)
  38489. {
  38490. (void)ctx;
  38491. WOLFSSL_MSG("wolfSSL_BN_CTX_free");
  38492. /* do free since static ctx that does nothing */
  38493. }
  38494. /* WOLFSSL_SUCCESS on ok */
  38495. int wolfSSL_BN_sub(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  38496. const WOLFSSL_BIGNUM* b)
  38497. {
  38498. WOLFSSL_MSG("wolfSSL_BN_sub");
  38499. if (r == NULL || a == NULL || b == NULL)
  38500. return 0;
  38501. if (mp_sub((mp_int*)a->internal,(mp_int*)b->internal,
  38502. (mp_int*)r->internal) == MP_OKAY)
  38503. return WOLFSSL_SUCCESS;
  38504. WOLFSSL_MSG("wolfSSL_BN_sub mp_sub failed");
  38505. return 0;
  38506. }
  38507. /* WOLFSSL_SUCCESS on ok */
  38508. int wolfSSL_BN_mod(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* a,
  38509. const WOLFSSL_BIGNUM* b, const WOLFSSL_BN_CTX* c)
  38510. {
  38511. (void)c;
  38512. WOLFSSL_MSG("wolfSSL_BN_mod");
  38513. if (r == NULL || a == NULL || b == NULL)
  38514. return 0;
  38515. if (mp_mod((mp_int*)a->internal,(mp_int*)b->internal,
  38516. (mp_int*)r->internal) == MP_OKAY)
  38517. return WOLFSSL_SUCCESS;
  38518. WOLFSSL_MSG("wolfSSL_BN_mod mp_mod failed");
  38519. return 0;
  38520. }
  38521. /* r = (a^p) % m */
  38522. int wolfSSL_BN_mod_exp(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  38523. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  38524. {
  38525. int ret;
  38526. WOLFSSL_ENTER("wolfSSL_BN_mod_exp");
  38527. (void) ctx;
  38528. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  38529. WOLFSSL_MSG("Bad Argument");
  38530. return WOLFSSL_FAILURE;
  38531. }
  38532. if ((ret = mp_exptmod((mp_int*)a->internal,(mp_int*)p->internal,
  38533. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  38534. return WOLFSSL_SUCCESS;
  38535. }
  38536. WOLFSSL_LEAVE("wolfSSL_BN_mod_exp", ret);
  38537. (void)ret;
  38538. return WOLFSSL_FAILURE;
  38539. }
  38540. /* r = (a * p) % m */
  38541. int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  38542. const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
  38543. {
  38544. int ret;
  38545. WOLFSSL_ENTER("wolfSSL_BN_mod_mul");
  38546. (void) ctx;
  38547. if (r == NULL || a == NULL || p == NULL || m == NULL) {
  38548. WOLFSSL_MSG("Bad Argument");
  38549. return SSL_FAILURE;
  38550. }
  38551. if ((ret = mp_mulmod((mp_int*)a->internal,(mp_int*)p->internal,
  38552. (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
  38553. return SSL_SUCCESS;
  38554. }
  38555. WOLFSSL_LEAVE("wolfSSL_BN_mod_mul", ret);
  38556. (void)ret;
  38557. return SSL_FAILURE;
  38558. }
  38559. #ifdef OPENSSL_EXTRA
  38560. const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void)
  38561. {
  38562. WOLFSSL_MSG("wolfSSL_BN_value_one");
  38563. if (bn_one == NULL) {
  38564. bn_one = wolfSSL_BN_new();
  38565. if (bn_one) {
  38566. if (mp_set_int((mp_int*)bn_one->internal, 1) != MP_OKAY) {
  38567. /* handle error by freeing BN and returning NULL */
  38568. wolfSSL_BN_free(bn_one);
  38569. bn_one = NULL;
  38570. }
  38571. }
  38572. }
  38573. return bn_one;
  38574. }
  38575. #endif
  38576. /* return compliant with OpenSSL
  38577. * size of BIGNUM in bytes, 0 if error */
  38578. int wolfSSL_BN_num_bytes(const WOLFSSL_BIGNUM* bn)
  38579. {
  38580. WOLFSSL_ENTER("wolfSSL_BN_num_bytes");
  38581. if (bn == NULL || bn->internal == NULL)
  38582. return WOLFSSL_FAILURE;
  38583. return mp_unsigned_bin_size((mp_int*)bn->internal);
  38584. }
  38585. /* return compliant with OpenSSL
  38586. * size of BIGNUM in bits, 0 if error */
  38587. int wolfSSL_BN_num_bits(const WOLFSSL_BIGNUM* bn)
  38588. {
  38589. WOLFSSL_ENTER("wolfSSL_BN_num_bits");
  38590. if (bn == NULL || bn->internal == NULL)
  38591. return WOLFSSL_FAILURE;
  38592. return mp_count_bits((mp_int*)bn->internal);
  38593. }
  38594. int wolfSSL_BN_is_negative(const WOLFSSL_BIGNUM* bn)
  38595. {
  38596. if (bn == NULL)
  38597. return WOLFSSL_FAILURE;
  38598. return mp_isneg((mp_int*)bn->internal);
  38599. }
  38600. /* return compliant with OpenSSL
  38601. * 1 if BIGNUM is zero, 0 else */
  38602. int wolfSSL_BN_is_zero(const WOLFSSL_BIGNUM* bn)
  38603. {
  38604. WOLFSSL_MSG("wolfSSL_BN_is_zero");
  38605. if (bn == NULL || bn->internal == NULL)
  38606. return WOLFSSL_FAILURE;
  38607. if (mp_iszero((mp_int*)bn->internal) == MP_YES)
  38608. return WOLFSSL_SUCCESS;
  38609. return WOLFSSL_FAILURE;
  38610. }
  38611. /* return compliant with OpenSSL
  38612. * 1 if BIGNUM is one, 0 else */
  38613. int wolfSSL_BN_is_one(const WOLFSSL_BIGNUM* bn)
  38614. {
  38615. WOLFSSL_MSG("wolfSSL_BN_is_one");
  38616. if (bn == NULL || bn->internal == NULL)
  38617. return WOLFSSL_FAILURE;
  38618. if (mp_cmp_d((mp_int*)bn->internal, 1) == MP_EQ)
  38619. return WOLFSSL_SUCCESS;
  38620. return WOLFSSL_FAILURE;
  38621. }
  38622. /* return compliant with OpenSSL
  38623. * 1 if BIGNUM is odd, 0 else */
  38624. int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM* bn)
  38625. {
  38626. WOLFSSL_MSG("wolfSSL_BN_is_odd");
  38627. if (bn == NULL || bn->internal == NULL)
  38628. return WOLFSSL_FAILURE;
  38629. if (mp_isodd((mp_int*)bn->internal) == MP_YES)
  38630. return WOLFSSL_SUCCESS;
  38631. return WOLFSSL_FAILURE;
  38632. }
  38633. /* return compliant with OpenSSL
  38634. * 1 if BIGNUM is word, 0 else */
  38635. int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  38636. {
  38637. WOLFSSL_ENTER("wolfSSL_BN_is_word");
  38638. if (bn == NULL || bn->internal == NULL) {
  38639. WOLFSSL_MSG("bn NULL error");
  38640. return WOLFSSL_FAILURE;
  38641. }
  38642. if (mp_isword((mp_int*)bn->internal, w) == MP_YES) {
  38643. return WOLFSSL_SUCCESS;
  38644. }
  38645. return WOLFSSL_FAILURE;
  38646. }
  38647. /* return compliant with OpenSSL
  38648. * -1 if a < b, 0 if a == b and 1 if a > b
  38649. */
  38650. int wolfSSL_BN_cmp(const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* b)
  38651. {
  38652. int ret;
  38653. WOLFSSL_MSG("wolfSSL_BN_cmp");
  38654. if (a == NULL || a->internal == NULL || b == NULL || b->internal == NULL)
  38655. return WOLFSSL_FATAL_ERROR;
  38656. ret = mp_cmp((mp_int*)a->internal, (mp_int*)b->internal);
  38657. return (ret == MP_EQ ? 0 : (ret == MP_GT ? 1 : -1));
  38658. }
  38659. /* return compliant with OpenSSL
  38660. * length of BIGNUM in bytes, -1 if error */
  38661. int wolfSSL_BN_bn2bin(const WOLFSSL_BIGNUM* bn, unsigned char* r)
  38662. {
  38663. WOLFSSL_MSG("wolfSSL_BN_bn2bin");
  38664. if (bn == NULL || bn->internal == NULL) {
  38665. WOLFSSL_MSG("NULL bn error");
  38666. return WOLFSSL_FATAL_ERROR;
  38667. }
  38668. if (r == NULL)
  38669. return mp_unsigned_bin_size((mp_int*)bn->internal);
  38670. if (mp_to_unsigned_bin((mp_int*)bn->internal, r) != MP_OKAY) {
  38671. WOLFSSL_MSG("mp_to_unsigned_bin error");
  38672. return WOLFSSL_FATAL_ERROR;
  38673. }
  38674. return mp_unsigned_bin_size((mp_int*)bn->internal);
  38675. }
  38676. WOLFSSL_BIGNUM* wolfSSL_BN_bin2bn(const unsigned char* str, int len,
  38677. WOLFSSL_BIGNUM* ret)
  38678. {
  38679. int weOwn = 0;
  38680. WOLFSSL_MSG("wolfSSL_BN_bin2bn");
  38681. /* if ret is null create a BN */
  38682. if (ret == NULL) {
  38683. ret = wolfSSL_BN_new();
  38684. weOwn = 1;
  38685. if (ret == NULL)
  38686. return NULL;
  38687. }
  38688. /* check ret and ret->internal then read in value */
  38689. if (ret && ret->internal) {
  38690. if (mp_read_unsigned_bin((mp_int*)ret->internal, str, len) != 0) {
  38691. WOLFSSL_MSG("mp_read_unsigned_bin failure");
  38692. if (weOwn)
  38693. wolfSSL_BN_free(ret);
  38694. return NULL;
  38695. }
  38696. } else {
  38697. return NULL;
  38698. }
  38699. return ret;
  38700. }
  38701. /* return compliant with OpenSSL
  38702. * 1 if success, 0 if error */
  38703. #ifndef NO_WOLFSSL_STUB
  38704. int wolfSSL_mask_bits(WOLFSSL_BIGNUM* bn, int n)
  38705. {
  38706. (void)bn;
  38707. (void)n;
  38708. WOLFSSL_ENTER("wolfSSL_BN_mask_bits");
  38709. WOLFSSL_STUB("BN_mask_bits");
  38710. return SSL_FAILURE;
  38711. }
  38712. #endif
  38713. /* WOLFSSL_SUCCESS on ok */
  38714. int wolfSSL_BN_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  38715. {
  38716. int ret = 0;
  38717. int len = bits / 8;
  38718. int initTmpRng = 0;
  38719. WC_RNG* rng = NULL;
  38720. #ifdef WOLFSSL_SMALL_STACK
  38721. WC_RNG* tmpRNG = NULL;
  38722. byte* buff = NULL;
  38723. #else
  38724. WC_RNG tmpRNG[1];
  38725. byte buff[1024];
  38726. #endif
  38727. (void)top;
  38728. (void)bottom;
  38729. WOLFSSL_MSG("wolfSSL_BN_rand");
  38730. if (bits % 8)
  38731. len++;
  38732. #ifdef WOLFSSL_SMALL_STACK
  38733. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38734. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  38735. if (buff == NULL || tmpRNG == NULL) {
  38736. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38737. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  38738. return ret;
  38739. }
  38740. #endif
  38741. if (bn == NULL || bn->internal == NULL)
  38742. WOLFSSL_MSG("Bad function arguments");
  38743. else if (wc_InitRng(tmpRNG) == 0) {
  38744. rng = tmpRNG;
  38745. initTmpRng = 1;
  38746. }
  38747. else if (initGlobalRNG)
  38748. rng = &globalRNG;
  38749. if (rng) {
  38750. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  38751. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  38752. else {
  38753. buff[0] |= 0x80 | 0x40;
  38754. buff[len-1] |= 0x01;
  38755. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  38756. WOLFSSL_MSG("mp read bin failed");
  38757. else
  38758. ret = WOLFSSL_SUCCESS;
  38759. }
  38760. }
  38761. if (initTmpRng)
  38762. wc_FreeRng(tmpRNG);
  38763. #ifdef WOLFSSL_SMALL_STACK
  38764. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38765. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  38766. #endif
  38767. return ret;
  38768. }
  38769. /* WOLFSSL_SUCCESS on ok
  38770. * code is same as wolfSSL_BN_rand except for how top and bottom is handled.
  38771. * top -1 then leave most sig bit alone
  38772. * top 0 then most sig is set to 1
  38773. * top is 1 then first two most sig bits are 1
  38774. *
  38775. * bottom is hot then odd number */
  38776. int wolfSSL_BN_pseudo_rand(WOLFSSL_BIGNUM* bn, int bits, int top, int bottom)
  38777. {
  38778. int ret = 0;
  38779. int len = bits / 8;
  38780. int initTmpRng = 0;
  38781. WC_RNG* rng = NULL;
  38782. #ifdef WOLFSSL_SMALL_STACK
  38783. WC_RNG* tmpRNG = NULL;
  38784. byte* buff = NULL;
  38785. #else
  38786. WC_RNG tmpRNG[1];
  38787. byte buff[1024];
  38788. #endif
  38789. WOLFSSL_MSG("wolfSSL_BN_rand");
  38790. if (bits % 8)
  38791. len++;
  38792. #ifdef WOLFSSL_SMALL_STACK
  38793. buff = (byte*)XMALLOC(1024, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38794. tmpRNG = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38795. if (buff == NULL || tmpRNG == NULL) {
  38796. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38797. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38798. return ret;
  38799. }
  38800. #endif
  38801. if (bn == NULL || bn->internal == NULL)
  38802. WOLFSSL_MSG("Bad function arguments");
  38803. else if (wc_InitRng(tmpRNG) == 0) {
  38804. rng = tmpRNG;
  38805. initTmpRng = 1;
  38806. }
  38807. else if (initGlobalRNG)
  38808. rng = &globalRNG;
  38809. if (rng) {
  38810. if (wc_RNG_GenerateBlock(rng, buff, len) != 0)
  38811. WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
  38812. else {
  38813. switch (top) {
  38814. case -1:
  38815. break;
  38816. case 0:
  38817. buff[0] |= 0x80;
  38818. break;
  38819. case 1:
  38820. buff[0] |= 0x80 | 0x40;
  38821. break;
  38822. }
  38823. if (bottom == 1) {
  38824. buff[len-1] |= 0x01;
  38825. }
  38826. if (mp_read_unsigned_bin((mp_int*)bn->internal,buff,len) != MP_OKAY)
  38827. WOLFSSL_MSG("mp read bin failed");
  38828. else
  38829. ret = WOLFSSL_SUCCESS;
  38830. }
  38831. }
  38832. if (initTmpRng)
  38833. wc_FreeRng(tmpRNG);
  38834. #ifdef WOLFSSL_SMALL_STACK
  38835. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38836. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  38837. #endif
  38838. return ret;
  38839. }
  38840. /* return code compliant with OpenSSL :
  38841. * 1 if bit set, 0 else
  38842. */
  38843. int wolfSSL_BN_is_bit_set(const WOLFSSL_BIGNUM* bn, int n)
  38844. {
  38845. if (bn == NULL || bn->internal == NULL) {
  38846. WOLFSSL_MSG("bn NULL error");
  38847. return WOLFSSL_FAILURE;
  38848. }
  38849. return mp_is_bit_set((mp_int*)bn->internal, (mp_digit)n);
  38850. }
  38851. /* return code compliant with OpenSSL :
  38852. * 1 if success, 0 else
  38853. */
  38854. int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM* bn, int n)
  38855. {
  38856. if (bn == NULL || bn->internal == NULL) {
  38857. WOLFSSL_MSG("bn NULL error");
  38858. return WOLFSSL_FAILURE;
  38859. }
  38860. if (mp_set_bit((mp_int*)bn->internal, n) != MP_OKAY) {
  38861. WOLFSSL_MSG("mp_set_bit error");
  38862. return WOLFSSL_FAILURE;
  38863. }
  38864. return WOLFSSL_SUCCESS;
  38865. }
  38866. int wolfSSL_BN_clear_bit(WOLFSSL_BIGNUM* bn, int n)
  38867. {
  38868. int ret = WOLFSSL_FAILURE;
  38869. #ifndef WOLFSSL_SMALL_STACK
  38870. mp_int tmp[1];
  38871. #else
  38872. mp_int* tmp = NULL;
  38873. #endif
  38874. if (bn == NULL || bn->internal == NULL) {
  38875. WOLFSSL_MSG("bn NULL error");
  38876. goto cleanup;
  38877. }
  38878. if (mp_is_bit_set((mp_int*)bn->internal, n)) {
  38879. #ifdef WOLFSSL_SMALL_STACK
  38880. tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  38881. if (tmp == NULL) {
  38882. goto cleanup;
  38883. }
  38884. #endif
  38885. if (mp_init(tmp) != MP_OKAY) {
  38886. goto cleanup;
  38887. }
  38888. if (mp_set_bit(tmp, n) != MP_OKAY) {
  38889. goto cleanup;
  38890. }
  38891. if (mp_sub((mp_int*)bn->internal, tmp, (mp_int*)bn->internal) != MP_OKAY) {
  38892. goto cleanup;
  38893. }
  38894. }
  38895. ret = WOLFSSL_SUCCESS;
  38896. cleanup:
  38897. mp_clear(tmp);
  38898. #ifdef WOLFSSL_SMALL_STACK
  38899. if (tmp)
  38900. XFREE(tmp, NULL, DYNAMIC_TYPE_BIGINT);
  38901. #endif
  38902. return ret;
  38903. }
  38904. /* WOLFSSL_SUCCESS on ok */
  38905. /* Note on use: this function expects str to be an even length. It is
  38906. * converting pairs of bytes into 8-bit values. As an example, the RSA
  38907. * public exponent is commonly 0x010001. To get it to convert, you need
  38908. * to pass in the string "010001", it will fail if you use "10001". This
  38909. * is an affect of how Base16_Decode() works.
  38910. */
  38911. int wolfSSL_BN_hex2bn(WOLFSSL_BIGNUM** bn, const char* str)
  38912. {
  38913. int ret = 0;
  38914. word32 decSz = 1024;
  38915. #ifdef WOLFSSL_SMALL_STACK
  38916. byte* decoded;
  38917. #else
  38918. byte decoded[1024];
  38919. #endif
  38920. int weOwn = 0;
  38921. int strLen;
  38922. WOLFSSL_MSG("wolfSSL_BN_hex2bn");
  38923. #ifdef WOLFSSL_SMALL_STACK
  38924. decoded = (byte*)XMALLOC(decSz, NULL, DYNAMIC_TYPE_DER);
  38925. if (decoded == NULL)
  38926. return ret;
  38927. #endif
  38928. if (str == NULL || str[0] == '\0') {
  38929. WOLFSSL_MSG("Bad function argument");
  38930. ret = WOLFSSL_FAILURE;
  38931. } else {
  38932. strLen = (int)XSTRLEN(str);
  38933. /* ignore trailing new lines */
  38934. while (str[strLen-1] == '\n' && strLen > 0) strLen--;
  38935. if (Base16_Decode((byte*)str, strLen, decoded, &decSz) < 0)
  38936. WOLFSSL_MSG("Bad Base16_Decode error");
  38937. else if (bn == NULL)
  38938. ret = decSz;
  38939. else {
  38940. if (*bn == NULL) {
  38941. *bn = wolfSSL_BN_new();
  38942. if (*bn != NULL) {
  38943. weOwn = 1;
  38944. }
  38945. }
  38946. if (*bn == NULL)
  38947. WOLFSSL_MSG("BN new failed");
  38948. else if (wolfSSL_BN_bin2bn(decoded, decSz, *bn) == NULL) {
  38949. WOLFSSL_MSG("Bad bin2bn error");
  38950. if (weOwn == 1) {
  38951. wolfSSL_BN_free(*bn); /* Free new BN */
  38952. }
  38953. }
  38954. else
  38955. ret = WOLFSSL_SUCCESS;
  38956. }
  38957. }
  38958. #ifdef WOLFSSL_SMALL_STACK
  38959. XFREE(decoded, NULL, DYNAMIC_TYPE_DER);
  38960. #endif
  38961. return ret;
  38962. }
  38963. WOLFSSL_BIGNUM* wolfSSL_BN_dup(const WOLFSSL_BIGNUM* bn)
  38964. {
  38965. WOLFSSL_BIGNUM* ret;
  38966. WOLFSSL_MSG("wolfSSL_BN_dup");
  38967. if (bn == NULL || bn->internal == NULL) {
  38968. WOLFSSL_MSG("bn NULL error");
  38969. return NULL;
  38970. }
  38971. ret = wolfSSL_BN_new();
  38972. if (ret == NULL) {
  38973. WOLFSSL_MSG("bn new error");
  38974. return NULL;
  38975. }
  38976. if (mp_copy((mp_int*)bn->internal, (mp_int*)ret->internal) != MP_OKAY) {
  38977. WOLFSSL_MSG("mp_copy error");
  38978. wolfSSL_BN_free(ret);
  38979. return NULL;
  38980. }
  38981. ret->neg = bn->neg;
  38982. return ret;
  38983. }
  38984. WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* bn)
  38985. {
  38986. WOLFSSL_MSG("wolfSSL_BN_copy");
  38987. if (r == NULL || bn == NULL) {
  38988. WOLFSSL_MSG("r or bn NULL error");
  38989. return NULL;
  38990. }
  38991. if (mp_copy((mp_int*)bn->internal, (mp_int*)r->internal) != MP_OKAY) {
  38992. WOLFSSL_MSG("mp_copy error");
  38993. return NULL;
  38994. }
  38995. r->neg = bn->neg;
  38996. return r;
  38997. }
  38998. /* return code compliant with OpenSSL :
  38999. * 1 if success, 0 else
  39000. */
  39001. int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
  39002. {
  39003. WOLFSSL_MSG("wolfSSL_BN_set_word");
  39004. if (bn == NULL) {
  39005. WOLFSSL_MSG("bn NULL error");
  39006. return WOLFSSL_FAILURE;
  39007. }
  39008. if (mp_set_int((mp_int*)bn->internal, w) != MP_OKAY) {
  39009. WOLFSSL_MSG("mp_init_set_int error");
  39010. return WOLFSSL_FAILURE;
  39011. }
  39012. return WOLFSSL_SUCCESS;
  39013. }
  39014. /* Returns the big number as an unsigned long if possible.
  39015. *
  39016. * bn big number structure to get value from
  39017. *
  39018. * Returns value or 0xFFFFFFFFL if bigger than unsigned long.
  39019. */
  39020. unsigned long wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
  39021. {
  39022. mp_int* mp;
  39023. WOLFSSL_MSG("wolfSSL_BN_get_word");
  39024. if (bn == NULL) {
  39025. WOLFSSL_MSG("Invalid argument");
  39026. return 0;
  39027. }
  39028. if (wolfSSL_BN_num_bytes(bn) > (int)sizeof(unsigned long)) {
  39029. WOLFSSL_MSG("bignum is larger than unsigned long");
  39030. return 0xFFFFFFFFL;
  39031. }
  39032. mp = (mp_int*)bn->internal;
  39033. return (unsigned long)(mp->dp[0]);
  39034. }
  39035. /* return code compliant with OpenSSL :
  39036. * number length in decimal if success, 0 if error
  39037. */
  39038. #ifndef NO_WOLFSSL_STUB
  39039. int wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM** bn, const char* str)
  39040. {
  39041. (void)bn;
  39042. (void)str;
  39043. WOLFSSL_MSG("wolfSSL_BN_dec2bn");
  39044. WOLFSSL_STUB("BN_dec2bn");
  39045. return SSL_FAILURE;
  39046. }
  39047. #endif
  39048. #if defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)
  39049. char *wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM *bn)
  39050. {
  39051. int len = 0;
  39052. char *buf;
  39053. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  39054. if (bn == NULL || bn->internal == NULL) {
  39055. WOLFSSL_MSG("bn NULL error");
  39056. return NULL;
  39057. }
  39058. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_DEC, &len) != MP_OKAY) {
  39059. WOLFSSL_MSG("mp_radix_size failure");
  39060. return NULL;
  39061. }
  39062. buf = (char*) XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  39063. if (buf == NULL) {
  39064. WOLFSSL_MSG("BN_bn2dec malloc buffer failure");
  39065. return NULL;
  39066. }
  39067. if (mp_todecimal((mp_int*)bn->internal, buf) != MP_OKAY) {
  39068. XFREE(buf, NULL, DYNAMIC_TYPE_ECC);
  39069. return NULL;
  39070. }
  39071. return buf;
  39072. }
  39073. #else
  39074. char* wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM* bn)
  39075. {
  39076. (void)bn;
  39077. WOLFSSL_MSG("wolfSSL_BN_bn2dec");
  39078. return NULL;
  39079. }
  39080. #endif /* defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) */
  39081. /* return code compliant with OpenSSL :
  39082. * 1 if success, 0 else
  39083. */
  39084. int wolfSSL_BN_lshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  39085. {
  39086. WOLFSSL_MSG("wolfSSL_BN_lshift");
  39087. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  39088. WOLFSSL_MSG("bn NULL error");
  39089. return WOLFSSL_FAILURE;
  39090. }
  39091. if (mp_mul_2d((mp_int*)bn->internal, n, (mp_int*)r->internal) != MP_OKAY) {
  39092. WOLFSSL_MSG("mp_mul_2d error");
  39093. return WOLFSSL_FAILURE;
  39094. }
  39095. return WOLFSSL_SUCCESS;
  39096. }
  39097. /* return code compliant with OpenSSL :
  39098. * 1 if success, 0 else
  39099. */
  39100. int wolfSSL_BN_rshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
  39101. {
  39102. WOLFSSL_MSG("wolfSSL_BN_rshift");
  39103. if (r == NULL || r->internal == NULL || bn == NULL || bn->internal == NULL){
  39104. WOLFSSL_MSG("bn NULL error");
  39105. return WOLFSSL_FAILURE;
  39106. }
  39107. if (mp_div_2d((mp_int*)bn->internal, n,
  39108. (mp_int*)r->internal, NULL) != MP_OKAY) {
  39109. WOLFSSL_MSG("mp_mul_2d error");
  39110. return WOLFSSL_FAILURE;
  39111. }
  39112. return WOLFSSL_SUCCESS;
  39113. }
  39114. /* return code compliant with OpenSSL :
  39115. * 1 if success, 0 else
  39116. */
  39117. int wolfSSL_BN_add_word(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w)
  39118. {
  39119. WOLFSSL_MSG("wolfSSL_BN_add_word");
  39120. if (bn == NULL || bn->internal == NULL) {
  39121. WOLFSSL_MSG("bn NULL error");
  39122. return WOLFSSL_FAILURE;
  39123. }
  39124. if (mp_add_d((mp_int*)bn->internal, w, (mp_int*)bn->internal) != MP_OKAY) {
  39125. WOLFSSL_MSG("mp_add_d error");
  39126. return WOLFSSL_FAILURE;
  39127. }
  39128. return WOLFSSL_SUCCESS;
  39129. }
  39130. /* return code compliant with OpenSSL :
  39131. * 1 if success, 0 else
  39132. */
  39133. int wolfSSL_BN_add(WOLFSSL_BIGNUM *r, WOLFSSL_BIGNUM *a, WOLFSSL_BIGNUM *b)
  39134. {
  39135. WOLFSSL_MSG("wolfSSL_BN_add");
  39136. if (r == NULL || r->internal == NULL || a == NULL || a->internal == NULL ||
  39137. b == NULL || b->internal == NULL) {
  39138. WOLFSSL_MSG("bn NULL error");
  39139. return WOLFSSL_FAILURE;
  39140. }
  39141. if (mp_add((mp_int*)a->internal, (mp_int*)b->internal,
  39142. (mp_int*)r->internal) != MP_OKAY) {
  39143. WOLFSSL_MSG("mp_add_d error");
  39144. return WOLFSSL_FAILURE;
  39145. }
  39146. return WOLFSSL_SUCCESS;
  39147. }
  39148. /* r = a + b (mod m) */
  39149. int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
  39150. const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m,
  39151. WOLFSSL_BN_CTX *ctx)
  39152. {
  39153. (void)ctx;
  39154. WOLFSSL_MSG("wolfSSL_BN_add");
  39155. if (r == NULL || r->internal == NULL ||
  39156. a == NULL || a->internal == NULL ||
  39157. b == NULL || b->internal == NULL ||
  39158. m == NULL || m->internal == NULL) {
  39159. WOLFSSL_MSG("bn NULL error");
  39160. return WOLFSSL_FAILURE;
  39161. }
  39162. if (mp_addmod((mp_int*)a->internal, (mp_int*)b->internal,
  39163. (mp_int*)m->internal, (mp_int*)r->internal) != MP_OKAY) {
  39164. WOLFSSL_MSG("mp_add_d error");
  39165. return WOLFSSL_FAILURE;
  39166. }
  39167. return WOLFSSL_SUCCESS;
  39168. }
  39169. #ifdef WOLFSSL_KEY_GEN
  39170. /* return code compliant with OpenSSL :
  39171. * 1 if prime, 0 if not, -1 if error
  39172. */
  39173. int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM *bn, int nbchecks,
  39174. WOLFSSL_BN_CTX *ctx, WOLFSSL_BN_GENCB *cb)
  39175. {
  39176. WC_RNG* rng = NULL;
  39177. #ifdef WOLFSSL_SMALL_STACK
  39178. WC_RNG* tmpRNG = NULL;
  39179. #else
  39180. WC_RNG tmpRNG[1];
  39181. #endif
  39182. int initTmpRng = 0;
  39183. int res = MP_NO;
  39184. (void)ctx;
  39185. (void)cb;
  39186. WOLFSSL_MSG("wolfSSL_BN_is_prime_ex");
  39187. if (bn == NULL || bn->internal == NULL) {
  39188. WOLFSSL_MSG("bn NULL error");
  39189. return WOLFSSL_FATAL_ERROR;
  39190. }
  39191. #ifdef WOLFSSL_SMALL_STACK
  39192. tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  39193. if (tmpRNG == NULL)
  39194. return WOLFSSL_FAILURE;
  39195. #endif
  39196. if (wc_InitRng(tmpRNG) == 0) {
  39197. rng = tmpRNG;
  39198. initTmpRng = 1;
  39199. }
  39200. else {
  39201. WOLFSSL_MSG("Bad RNG Init, trying global");
  39202. if (initGlobalRNG == 0) {
  39203. WOLFSSL_MSG("Global RNG no Init");
  39204. }
  39205. else
  39206. rng = &globalRNG;
  39207. }
  39208. if (rng) {
  39209. if (mp_prime_is_prime_ex((mp_int*)bn->internal,
  39210. nbchecks, &res, rng) != MP_OKAY) {
  39211. WOLFSSL_MSG("mp_prime_is_prime_ex error");
  39212. res = MP_NO;
  39213. }
  39214. }
  39215. if (initTmpRng)
  39216. wc_FreeRng(tmpRNG);
  39217. #ifdef WOLFSSL_SMALL_STACK
  39218. XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
  39219. #endif
  39220. if (res != MP_YES) {
  39221. WOLFSSL_MSG("mp_prime_is_prime_ex not prime");
  39222. return WOLFSSL_FAILURE;
  39223. }
  39224. return WOLFSSL_SUCCESS;
  39225. }
  39226. /* return code compliant with OpenSSL :
  39227. * (bn mod w) if success, -1 if error
  39228. */
  39229. WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM *bn,
  39230. WOLFSSL_BN_ULONG w)
  39231. {
  39232. WOLFSSL_BN_ULONG ret = 0;
  39233. WOLFSSL_MSG("wolfSSL_BN_mod_word");
  39234. if (bn == NULL || bn->internal == NULL) {
  39235. WOLFSSL_MSG("bn NULL error");
  39236. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  39237. }
  39238. if (mp_mod_d((mp_int*)bn->internal, w, &ret) != MP_OKAY) {
  39239. WOLFSSL_MSG("mp_add_d error");
  39240. return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
  39241. }
  39242. return ret;
  39243. }
  39244. #endif /* #ifdef WOLFSSL_KEY_GEN */
  39245. char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM *bn)
  39246. {
  39247. int len = 0;
  39248. char *buf;
  39249. WOLFSSL_ENTER("wolfSSL_BN_bn2hex");
  39250. if (bn == NULL || bn->internal == NULL) {
  39251. WOLFSSL_MSG("bn NULL error");
  39252. return NULL;
  39253. }
  39254. if (mp_radix_size((mp_int*)bn->internal, MP_RADIX_HEX, &len) != MP_OKAY) {
  39255. WOLFSSL_MSG("mp_radix_size failure");
  39256. return NULL;
  39257. }
  39258. len += 1; /* add one for null terminator */
  39259. buf = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  39260. if (buf == NULL) {
  39261. WOLFSSL_MSG("BN_bn2hex malloc buffer failure");
  39262. return NULL;
  39263. }
  39264. if (mp_tohex((mp_int*)bn->internal, buf) != MP_OKAY) {
  39265. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  39266. return NULL;
  39267. }
  39268. return buf;
  39269. }
  39270. #ifndef NO_FILESYSTEM
  39271. /* return code compliant with OpenSSL :
  39272. * 1 if success, 0 if error
  39273. */
  39274. int wolfSSL_BN_print_fp(XFILE fp, const WOLFSSL_BIGNUM *bn)
  39275. {
  39276. char *buf;
  39277. WOLFSSL_ENTER("wolfSSL_BN_print_fp");
  39278. if (fp == XBADFILE || bn == NULL || bn->internal == NULL) {
  39279. WOLFSSL_MSG("bn NULL error");
  39280. return WOLFSSL_FAILURE;
  39281. }
  39282. buf = wolfSSL_BN_bn2hex(bn);
  39283. if (buf == NULL) {
  39284. WOLFSSL_MSG("wolfSSL_BN_bn2hex failure");
  39285. return WOLFSSL_FAILURE;
  39286. }
  39287. fprintf(fp, "%s", buf);
  39288. XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
  39289. return WOLFSSL_SUCCESS;
  39290. }
  39291. #endif /* !NO_FILESYSTEM */
  39292. WOLFSSL_BIGNUM *wolfSSL_BN_CTX_get(WOLFSSL_BN_CTX *ctx)
  39293. {
  39294. /* ctx is not used, return new Bignum */
  39295. (void)ctx;
  39296. WOLFSSL_ENTER("wolfSSL_BN_CTX_get");
  39297. return wolfSSL_BN_new();
  39298. }
  39299. #ifndef NO_WOLFSSL_STUB
  39300. void wolfSSL_BN_CTX_start(WOLFSSL_BN_CTX *ctx)
  39301. {
  39302. (void)ctx;
  39303. WOLFSSL_ENTER("wolfSSL_BN_CTX_start");
  39304. WOLFSSL_STUB("BN_CTX_start");
  39305. WOLFSSL_MSG("wolfSSL_BN_CTX_start TBD");
  39306. }
  39307. #endif
  39308. WOLFSSL_BIGNUM *wolfSSL_BN_mod_inverse(WOLFSSL_BIGNUM *r,
  39309. WOLFSSL_BIGNUM *a,
  39310. const WOLFSSL_BIGNUM *n,
  39311. WOLFSSL_BN_CTX *ctx)
  39312. {
  39313. int dynamic = 0;
  39314. /* ctx is not used */
  39315. (void)ctx;
  39316. WOLFSSL_ENTER("wolfSSL_BN_mod_inverse");
  39317. /* check parameter */
  39318. if (r == NULL) {
  39319. r = wolfSSL_BN_new();
  39320. if (r == NULL){
  39321. WOLFSSL_MSG("WolfSSL_BN_new() failed");
  39322. return NULL;
  39323. }
  39324. dynamic = 1;
  39325. }
  39326. if (a == NULL) {
  39327. WOLFSSL_MSG("a NULL error");
  39328. if (dynamic == 1) {
  39329. wolfSSL_BN_free(r);
  39330. }
  39331. return NULL;
  39332. }
  39333. if (n == NULL) {
  39334. WOLFSSL_MSG("n NULL error");
  39335. if (dynamic == 1) {
  39336. wolfSSL_BN_free(r);
  39337. }
  39338. return NULL;
  39339. }
  39340. /* Compute inverse of a modulo n and return r */
  39341. if (mp_invmod((mp_int *)a->internal,(mp_int *)n->internal,
  39342. (mp_int*)r->internal) == MP_VAL){
  39343. WOLFSSL_MSG("mp_invmod() error");
  39344. if (dynamic == 1) {
  39345. wolfSSL_BN_free(r);
  39346. }
  39347. return NULL;
  39348. }
  39349. return r;
  39350. }
  39351. #endif /* OPENSSL_EXTRA */
  39352. #if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) && !defined(NO_ASN)
  39353. static int unprintable_char(char c)
  39354. {
  39355. const unsigned char last_unprintable = 31;
  39356. const unsigned char LF = 10;
  39357. const unsigned char CR = 13;
  39358. if (c <= last_unprintable && c != LF && c != CR) {
  39359. return 1;
  39360. }
  39361. return 0;
  39362. }
  39363. int wolfSSL_ASN1_STRING_print(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str)
  39364. {
  39365. int i;
  39366. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_print");
  39367. if (out == NULL || str == NULL)
  39368. return WOLFSSL_FAILURE;
  39369. for (i=0; i < str->length; i++) {
  39370. if (unprintable_char(str->data[i])) {
  39371. str->data[i] = '.';
  39372. }
  39373. }
  39374. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  39375. return WOLFSSL_FAILURE;
  39376. }
  39377. return str->length;
  39378. }
  39379. #endif /* (WOLFSSL_QT || OPENSSL_ALL) && !NO_ASN */
  39380. #if defined(OPENSSL_EXTRA)
  39381. int wolfSSL_X509_check_ca(WOLFSSL_X509 *x509)
  39382. {
  39383. WOLFSSL_ENTER("X509_check_ca");
  39384. if (x509 == NULL)
  39385. return WOLFSSL_FAILURE;
  39386. if (x509->isCa)
  39387. return 1;
  39388. if (x509->extKeyUsageCrit)
  39389. return 4;
  39390. return 0;
  39391. }
  39392. const char *wolfSSL_ASN1_tag2str(int tag)
  39393. {
  39394. static const char *const tag_label[31] = {
  39395. "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", "NULL",
  39396. "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", "ENUMERATED",
  39397. "<ASN1 11>", "UTF8STRING", "<ASN1 13>", "<ASN1 14>", "<ASN1 15>",
  39398. "SEQUENCE", "SET", "NUMERICSTRING", "PRINTABLESTRING", "T61STRING",
  39399. "VIDEOTEXTSTRING", "IA5STRING", "UTCTIME", "GENERALIZEDTIME",
  39400. "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", "UNIVERSALSTRING",
  39401. "<ASN1 29>", "BMPSTRING"
  39402. };
  39403. if ((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
  39404. tag &= ~0x100;
  39405. if (tag < 0 || tag > 30)
  39406. return "(unknown)";
  39407. return tag_label[tag];
  39408. }
  39409. static int check_esc_char(char c, char *esc)
  39410. {
  39411. char *ptr;
  39412. ptr = esc;
  39413. while(*ptr != 0){
  39414. if (c == *ptr)
  39415. return 1;
  39416. ptr++;
  39417. }
  39418. return 0;
  39419. }
  39420. int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str,
  39421. unsigned long flags)
  39422. {
  39423. size_t str_len = 0, type_len = 0;
  39424. unsigned char *typebuf = NULL;
  39425. const char *hash="#";
  39426. WOLFSSL_ENTER("wolfSSL_ASN1_STRING_PRINT_ex");
  39427. if (out == NULL || str == NULL)
  39428. return WOLFSSL_FAILURE;
  39429. /* add ASN1 type tag */
  39430. if (flags & ASN1_STRFLGS_SHOW_TYPE){
  39431. const char *tag = wolfSSL_ASN1_tag2str(str->type);
  39432. /* colon len + tag len + null*/
  39433. type_len = XSTRLEN(tag) + 2;
  39434. typebuf = (unsigned char *)XMALLOC(type_len , NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39435. if (typebuf == NULL){
  39436. WOLFSSL_MSG("memory alloc failed.");
  39437. return WOLFSSL_FAILURE;
  39438. }
  39439. XMEMSET(typebuf, 0, type_len);
  39440. XSNPRINTF((char*)typebuf, (size_t)type_len , "%s:", tag);
  39441. type_len--;
  39442. }
  39443. /* dump hex */
  39444. if (flags & ASN1_STRFLGS_DUMP_ALL){
  39445. static const char hex_char[] = { '0', '1', '2', '3', '4', '5', '6',
  39446. '7','8', '9', 'A', 'B', 'C', 'D',
  39447. 'E', 'F' };
  39448. char hex_tmp[4];
  39449. char *str_ptr, *str_end;
  39450. if (type_len > 0){
  39451. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  39452. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39453. return WOLFSSL_FAILURE;
  39454. }
  39455. str_len += type_len;
  39456. }
  39457. if (wolfSSL_BIO_write(out, hash, 1) != 1){
  39458. goto err_exit;
  39459. }
  39460. str_len++;
  39461. if (flags & ASN1_STRFLGS_DUMP_DER){
  39462. hex_tmp[0] = hex_char[str->type >> 4];
  39463. hex_tmp[1] = hex_char[str->type & 0xf];
  39464. hex_tmp[2] = hex_char[str->length >> 4];
  39465. hex_tmp[3] = hex_char[str->length & 0xf];
  39466. if (wolfSSL_BIO_write(out, hex_tmp, 4) != 4){
  39467. goto err_exit;
  39468. }
  39469. str_len += 4;
  39470. XMEMSET(hex_tmp, 0, 4);
  39471. }
  39472. str_ptr = str->data;
  39473. str_end = str->data + str->length;
  39474. while (str_ptr < str_end){
  39475. hex_tmp[0] = hex_char[*str_ptr >> 4];
  39476. hex_tmp[1] = hex_char[*str_ptr & 0xf];
  39477. if (wolfSSL_BIO_write(out, hex_tmp, 2) != 2){
  39478. goto err_exit;
  39479. }
  39480. str_ptr++;
  39481. str_len += 2;
  39482. }
  39483. if (type_len > 0)
  39484. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39485. return (int)str_len;
  39486. }
  39487. if (type_len > 0){
  39488. if (wolfSSL_BIO_write(out, typebuf, (int)type_len) != (int)type_len){
  39489. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39490. return WOLFSSL_FAILURE;
  39491. }
  39492. str_len += type_len;
  39493. }
  39494. if (flags & ASN1_STRFLGS_ESC_2253){
  39495. char esc_ch[] = "+;<>\\";
  39496. char* esc_ptr;
  39497. esc_ptr = str->data;
  39498. while (*esc_ptr != 0){
  39499. if (check_esc_char(*esc_ptr, esc_ch)){
  39500. if (wolfSSL_BIO_write(out,"\\", 1) != 1)
  39501. goto err_exit;
  39502. str_len++;
  39503. }
  39504. if (wolfSSL_BIO_write(out, esc_ptr, 1) != 1)
  39505. goto err_exit;
  39506. str_len++;
  39507. esc_ptr++;
  39508. }
  39509. if (type_len > 0)
  39510. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39511. return (int)str_len;
  39512. }
  39513. if (wolfSSL_BIO_write(out, str->data, str->length) != str->length){
  39514. goto err_exit;
  39515. }
  39516. str_len += str->length;
  39517. if (type_len > 0)
  39518. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39519. return (int)str_len;
  39520. err_exit:
  39521. if (type_len > 0)
  39522. XFREE(typebuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  39523. return WOLFSSL_FAILURE;
  39524. }
  39525. #if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
  39526. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
  39527. int offset_day, long offset_sec)
  39528. {
  39529. const time_t sec_per_day = 24*60*60;
  39530. struct tm* ts = NULL;
  39531. struct tm* tmpTime;
  39532. time_t t_adj = 0;
  39533. time_t offset_day_sec = 0;
  39534. #if defined(NEED_TMP_TIME)
  39535. struct tm tmpTimeStorage;
  39536. tmpTime = &tmpTimeStorage;
  39537. #else
  39538. tmpTime = NULL;
  39539. #endif
  39540. (void)tmpTime;
  39541. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_adj");
  39542. if (s == NULL){
  39543. s = wolfSSL_ASN1_TIME_new();
  39544. if (s == NULL){
  39545. return NULL;
  39546. }
  39547. }
  39548. /* compute GMT time with offset */
  39549. offset_day_sec = offset_day * sec_per_day;
  39550. t_adj = t + offset_day_sec + offset_sec;
  39551. ts = (struct tm *)XGMTIME(&t_adj, tmpTime);
  39552. if (ts == NULL){
  39553. WOLFSSL_MSG("failed to get time data.");
  39554. XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL);
  39555. return NULL;
  39556. }
  39557. /* create ASN1 time notation */
  39558. /* UTC Time */
  39559. if (ts->tm_year >= 50 && ts->tm_year < 150){
  39560. char utc_str[ASN_UTC_TIME_SIZE];
  39561. int utc_year = 0,utc_mon,utc_day,utc_hour,utc_min,utc_sec;
  39562. s->type = V_ASN1_UTCTIME;
  39563. s->length = ASN_UTC_TIME_SIZE;
  39564. if (ts->tm_year >= 50 && ts->tm_year < 100){
  39565. utc_year = ts->tm_year;
  39566. } else if (ts->tm_year >= 100 && ts->tm_year < 150){
  39567. utc_year = ts->tm_year - 100;
  39568. }
  39569. utc_mon = ts->tm_mon + 1;
  39570. utc_day = ts->tm_mday;
  39571. utc_hour = ts->tm_hour;
  39572. utc_min = ts->tm_min;
  39573. utc_sec = ts->tm_sec;
  39574. XSNPRINTF((char *)utc_str, sizeof(utc_str),
  39575. "%02d%02d%02d%02d%02d%02dZ",
  39576. utc_year, utc_mon, utc_day, utc_hour, utc_min, utc_sec);
  39577. XMEMCPY(s->data, (byte *)utc_str, s->length);
  39578. /* GeneralizedTime */
  39579. } else {
  39580. char gt_str[ASN_GENERALIZED_TIME_MAX];
  39581. int gt_year,gt_mon,gt_day,gt_hour,gt_min,gt_sec;
  39582. s->type = V_ASN1_GENERALIZEDTIME;
  39583. s->length = ASN_GENERALIZED_TIME_SIZE;
  39584. gt_year = ts->tm_year + 1900;
  39585. gt_mon = ts->tm_mon + 1;
  39586. gt_day = ts->tm_mday;
  39587. gt_hour = ts->tm_hour;
  39588. gt_min = ts->tm_min;
  39589. gt_sec = ts->tm_sec;
  39590. XSNPRINTF((char *)gt_str, sizeof(gt_str),
  39591. "%4d%02d%02d%02d%02d%02dZ",
  39592. gt_year, gt_mon, gt_day, gt_hour, gt_min,gt_sec);
  39593. XMEMCPY(s->data, (byte *)gt_str, s->length);
  39594. }
  39595. return s;
  39596. }
  39597. #endif /* !NO_ASN_TIME && !USER_TIME && !TIME_OVERRIDES */
  39598. #ifndef NO_ASN_TIME
  39599. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void)
  39600. {
  39601. WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*)
  39602. XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL);
  39603. if (!ret)
  39604. return NULL;
  39605. XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME));
  39606. return ret;
  39607. }
  39608. void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t)
  39609. {
  39610. if (t) {
  39611. XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL);
  39612. }
  39613. }
  39614. /* not a compatibility function - length getter for opaque type */
  39615. int wolfSSL_ASN1_TIME_get_length(WOLFSSL_ASN1_TIME *t)
  39616. {
  39617. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_length");
  39618. if (t == NULL)
  39619. return WOLFSSL_FAILURE;
  39620. return t->length;
  39621. }
  39622. /* not a compatibility function - data getter for opaque type */
  39623. unsigned char* wolfSSL_ASN1_TIME_get_data(WOLFSSL_ASN1_TIME *t)
  39624. {
  39625. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_get_data");
  39626. if (t == NULL)
  39627. return NULL;
  39628. return t->data;
  39629. }
  39630. WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t,
  39631. WOLFSSL_ASN1_TIME **out)
  39632. {
  39633. int time_type = 0;
  39634. WOLFSSL_ASN1_TIME *ret = NULL;
  39635. WOLFSSL_ENTER("wolfSSL_ASN1_TIME_to_generalizedtime");
  39636. if (t == NULL) {
  39637. WOLFSSL_MSG("Invalid ASN_TIME value");
  39638. } else {
  39639. time_type = t->type;
  39640. if (time_type != ASN_UTC_TIME && time_type != ASN_GENERALIZED_TIME){
  39641. WOLFSSL_MSG("Invalid ASN_TIME type.");
  39642. } else {
  39643. if (out == NULL || *out == NULL) {
  39644. ret = wolfSSL_ASN1_TIME_new();
  39645. if (ret == NULL){
  39646. WOLFSSL_MSG("memory alloc failed.");
  39647. }
  39648. } else {
  39649. ret = *out;
  39650. }
  39651. }
  39652. }
  39653. if (ret != NULL) {
  39654. if (time_type == ASN_GENERALIZED_TIME){
  39655. XMEMCPY(ret->data, t->data, ASN_GENERALIZED_TIME_SIZE);
  39656. } else { /* ASN_UTC_TIME */
  39657. /* convert UTC to generalized time */
  39658. ret->type = ASN_GENERALIZED_TIME;
  39659. ret->length = ASN_GENERALIZED_TIME_SIZE;
  39660. if (t->data[0] >= '5') {
  39661. ret->data[0] = '1'; ret->data[1] = '9';
  39662. } else {
  39663. ret->data[0] = '2'; ret->data[1] = '0';
  39664. }
  39665. XMEMCPY(&ret->data[2], t->data, ASN_UTC_TIME_SIZE);
  39666. }
  39667. }
  39668. return ret;
  39669. }
  39670. #endif /* !NO_ASN_TIME */
  39671. #ifndef NO_ASN
  39672. int wolfSSL_i2c_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER *a, unsigned char **pp)
  39673. {
  39674. unsigned char *pptr = NULL;
  39675. char pad = 0 ;
  39676. unsigned char pad_val = 0;
  39677. int ret_size = 0;
  39678. unsigned char data1 = 0;
  39679. unsigned char neg = 0;
  39680. int i = 0;
  39681. WOLFSSL_ENTER("wolfSSL_i2c_ASN1_INTEGER");
  39682. if (a == NULL)
  39683. return WOLFSSL_FAILURE;
  39684. ret_size = a->intData[1];
  39685. if (ret_size == 0)
  39686. ret_size = 1;
  39687. else{
  39688. ret_size = (int)a->intData[1];
  39689. neg = a->negative;
  39690. data1 = a->intData[2];
  39691. if (ret_size == 1 && data1 == 0)
  39692. neg = 0;
  39693. /* 0x80 or greater positive number in first byte */
  39694. if (!neg && (data1 > 127)){
  39695. pad = 1;
  39696. pad_val = 0;
  39697. } else if (neg){
  39698. /* negative number */
  39699. if (data1 > 128){
  39700. pad = 1;
  39701. pad_val = 0xff;
  39702. } else if (data1 == 128){
  39703. for (i = 3; i < a->intData[1] + 2; i++){
  39704. if (a->intData[i]){
  39705. pad = 1;
  39706. pad_val = 0xff;
  39707. break;
  39708. }
  39709. }
  39710. }
  39711. }
  39712. ret_size += (int)pad;
  39713. }
  39714. if (pp == NULL)
  39715. return ret_size;
  39716. pptr = *pp;
  39717. if (pad)
  39718. *(pptr++) = pad_val;
  39719. if (a->intData[1] == 0)
  39720. *(pptr++) = 0;
  39721. else if (!neg){
  39722. /* positive number */
  39723. for (i=0; i < a->intData[1]; i++){
  39724. *pptr = a->intData[i+2];
  39725. pptr++;
  39726. }
  39727. } else {
  39728. /* negative number */
  39729. int str_len = 0;
  39730. /* 0 padding from end of buffer */
  39731. str_len = (int)a->intData[1];
  39732. pptr += a->intData[1] - 1;
  39733. while (!a->intData[str_len + 2] && str_len > 1){
  39734. *(pptr--) = 0;
  39735. str_len--;
  39736. }
  39737. /* 2's complement next octet */
  39738. *(pptr--) = ((a->intData[str_len + 1]) ^ 0xff) + 1;
  39739. str_len--;
  39740. /* Complement any octets left */
  39741. while (str_len > 0){
  39742. *(pptr--) = a->intData[str_len + 1] ^ 0xff;
  39743. str_len--;
  39744. }
  39745. }
  39746. *pp += ret_size;
  39747. return ret_size;
  39748. }
  39749. #endif /* !NO_ASN */
  39750. #ifndef NO_CERTS
  39751. int wolfSSL_X509_CA_num(WOLFSSL_X509_STORE* store)
  39752. {
  39753. int i = 0;
  39754. int cnt_ret = 0;
  39755. Signer **table;
  39756. WOLFSSL_ENTER("wolfSSL_X509_CA_num");
  39757. if (store == NULL || store->cm == NULL){
  39758. WOLFSSL_MSG("invalid parameter");
  39759. return WOLFSSL_FAILURE;
  39760. }
  39761. table = store->cm->caTable;
  39762. if (table){
  39763. if (wc_LockMutex(&store->cm->caLock) == 0){
  39764. for (i = 0; i < CA_TABLE_SIZE; i++) {
  39765. Signer* signer = table[i];
  39766. while (signer) {
  39767. Signer* next = signer->next;
  39768. cnt_ret++;
  39769. signer = next;
  39770. }
  39771. }
  39772. wc_UnLockMutex(&store->cm->caLock);
  39773. }
  39774. }
  39775. return cnt_ret;
  39776. }
  39777. #endif /* !NO_CERTS */
  39778. #endif /* OPENSSL_EXTRA */
  39779. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  39780. long wolfSSL_X509_get_version(const WOLFSSL_X509 *x509)
  39781. {
  39782. int version = 0;
  39783. WOLFSSL_ENTER("wolfSSL_X509_get_version");
  39784. if (x509 == NULL){
  39785. WOLFSSL_MSG("invalid parameter");
  39786. return 0L;
  39787. }
  39788. version = x509->version;
  39789. if (version != 0)
  39790. return (long)version - 1L;
  39791. return 0L;
  39792. }
  39793. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  39794. #if defined(OPENSSL_EXTRA)
  39795. int wolfSSL_X509_get_signature_nid(const WOLFSSL_X509 *x)
  39796. {
  39797. if (x == NULL)
  39798. return 0;
  39799. return oid2nid(x->sigOID, oidSigType);
  39800. }
  39801. #endif /* OPENSSL_EXTRA */
  39802. #if defined(OPENSSL_EXTRA) && !defined(NO_RSA)
  39803. /* return compliant with OpenSSL
  39804. * RSA modulus size in bytes, -1 if error
  39805. */
  39806. int wolfSSL_RSA_size(const WOLFSSL_RSA* rsa)
  39807. {
  39808. WOLFSSL_ENTER("wolfSSL_RSA_size");
  39809. if (rsa == NULL)
  39810. return WOLFSSL_FATAL_ERROR;
  39811. if (rsa->inSet == 0)
  39812. {
  39813. if (SetRsaInternal((WOLFSSL_RSA*)rsa) != SSL_SUCCESS) {
  39814. WOLFSSL_MSG("SetRsaInternal failed");
  39815. return 0;
  39816. }
  39817. }
  39818. return wc_RsaEncryptSize((RsaKey*)rsa->internal);
  39819. }
  39820. #endif
  39821. #if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) && \
  39822. !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  39823. /* WolfSSL -> OpenSSL */
  39824. int SetRsaExternal(WOLFSSL_RSA* rsa)
  39825. {
  39826. RsaKey* key;
  39827. WOLFSSL_MSG("Entering SetRsaExternal");
  39828. if (rsa == NULL || rsa->internal == NULL) {
  39829. WOLFSSL_MSG("rsa key NULL error");
  39830. return WOLFSSL_FATAL_ERROR;
  39831. }
  39832. key = (RsaKey*)rsa->internal;
  39833. if (SetIndividualExternal(&rsa->n, &key->n) != WOLFSSL_SUCCESS) {
  39834. WOLFSSL_MSG("rsa n key error");
  39835. return WOLFSSL_FATAL_ERROR;
  39836. }
  39837. if (SetIndividualExternal(&rsa->e, &key->e) != WOLFSSL_SUCCESS) {
  39838. WOLFSSL_MSG("rsa e key error");
  39839. return WOLFSSL_FATAL_ERROR;
  39840. }
  39841. if (key->type == RSA_PRIVATE) {
  39842. if (SetIndividualExternal(&rsa->d, &key->d) != WOLFSSL_SUCCESS) {
  39843. WOLFSSL_MSG("rsa d key error");
  39844. return WOLFSSL_FATAL_ERROR;
  39845. }
  39846. if (SetIndividualExternal(&rsa->p, &key->p) != WOLFSSL_SUCCESS) {
  39847. WOLFSSL_MSG("rsa p key error");
  39848. return WOLFSSL_FATAL_ERROR;
  39849. }
  39850. if (SetIndividualExternal(&rsa->q, &key->q) != WOLFSSL_SUCCESS) {
  39851. WOLFSSL_MSG("rsa q key error");
  39852. return WOLFSSL_FATAL_ERROR;
  39853. }
  39854. #ifndef RSA_LOW_MEM
  39855. if (SetIndividualExternal(&rsa->dmp1, &key->dP) != WOLFSSL_SUCCESS) {
  39856. WOLFSSL_MSG("rsa dP key error");
  39857. return WOLFSSL_FATAL_ERROR;
  39858. }
  39859. if (SetIndividualExternal(&rsa->dmq1, &key->dQ) != WOLFSSL_SUCCESS) {
  39860. WOLFSSL_MSG("rsa dQ key error");
  39861. return WOLFSSL_FATAL_ERROR;
  39862. }
  39863. if (SetIndividualExternal(&rsa->iqmp, &key->u) != WOLFSSL_SUCCESS) {
  39864. WOLFSSL_MSG("rsa u key error");
  39865. return WOLFSSL_FATAL_ERROR;
  39866. }
  39867. #endif /* !RSA_LOW_MEM */
  39868. }
  39869. rsa->exSet = 1;
  39870. return WOLFSSL_SUCCESS;
  39871. }
  39872. #endif
  39873. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  39874. /* when calling SetIndividualExternal, mpi should be cleared by caller if no
  39875. * longer used. ie mp_free(mpi). This is to free data when fastmath is
  39876. * disabled since a copy of mpi is made by this function and placed into bn.
  39877. */
  39878. int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi)
  39879. {
  39880. byte dynamic = 0;
  39881. WOLFSSL_MSG("Entering SetIndividualExternal");
  39882. if (mpi == NULL || bn == NULL) {
  39883. WOLFSSL_MSG("mpi NULL error");
  39884. return WOLFSSL_FATAL_ERROR;
  39885. }
  39886. if (*bn == NULL) {
  39887. *bn = wolfSSL_BN_new();
  39888. if (*bn == NULL) {
  39889. WOLFSSL_MSG("SetIndividualExternal alloc failed");
  39890. return WOLFSSL_FATAL_ERROR;
  39891. }
  39892. dynamic = 1;
  39893. }
  39894. if (mp_copy(mpi, (mp_int*)((*bn)->internal)) != MP_OKAY) {
  39895. WOLFSSL_MSG("mp_copy error");
  39896. if (dynamic == 1) {
  39897. wolfSSL_BN_free(*bn);
  39898. }
  39899. return WOLFSSL_FATAL_ERROR;
  39900. }
  39901. return WOLFSSL_SUCCESS;
  39902. }
  39903. static void InitwolfSSL_BigNum(WOLFSSL_BIGNUM* bn)
  39904. {
  39905. if (bn) {
  39906. XMEMSET(bn, 0, sizeof(WOLFSSL_BIGNUM));
  39907. bn->neg = 0;
  39908. bn->internal = NULL;
  39909. }
  39910. }
  39911. WOLFSSL_BIGNUM* wolfSSL_BN_new(void)
  39912. {
  39913. WOLFSSL_BIGNUM* external;
  39914. mp_int* mpi;
  39915. WOLFSSL_MSG("wolfSSL_BN_new");
  39916. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  39917. mpi = (mp_int*) XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  39918. if (mpi == NULL) {
  39919. WOLFSSL_MSG("wolfSSL_BN_new malloc mpi failure");
  39920. return NULL;
  39921. }
  39922. #endif
  39923. external = (WOLFSSL_BIGNUM*) XMALLOC(sizeof(WOLFSSL_BIGNUM), NULL,
  39924. DYNAMIC_TYPE_BIGINT);
  39925. if (external == NULL) {
  39926. WOLFSSL_MSG("wolfSSL_BN_new malloc WOLFSSL_BIGNUM failure");
  39927. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  39928. XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT);
  39929. #endif
  39930. return NULL;
  39931. }
  39932. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  39933. mpi = &external->fp;
  39934. #endif
  39935. InitwolfSSL_BigNum(external);
  39936. if (mp_init(mpi) != MP_OKAY) {
  39937. wolfSSL_BN_free(external);
  39938. return NULL;
  39939. }
  39940. external->internal = mpi;
  39941. return external;
  39942. }
  39943. #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
  39944. /* This function works without BN_free only with TFM */
  39945. void wolfSSL_BN_init(WOLFSSL_BIGNUM* bn)
  39946. {
  39947. if(bn == NULL)return;
  39948. WOLFSSL_MSG("wolfSSL_BN_init");
  39949. InitwolfSSL_BigNum(bn);
  39950. if (mp_init(&bn->fp) != MP_OKAY)
  39951. return;
  39952. bn->internal = (void *)&bn->fp;
  39953. }
  39954. #endif
  39955. void wolfSSL_BN_free(WOLFSSL_BIGNUM* bn)
  39956. {
  39957. WOLFSSL_MSG("wolfSSL_BN_free");
  39958. if (bn) {
  39959. if (bn->internal) {
  39960. mp_int* bni = (mp_int*)bn->internal;
  39961. mp_free(bni);
  39962. #if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT)
  39963. XFREE(bn->internal, NULL, DYNAMIC_TYPE_BIGINT);
  39964. #endif
  39965. bn->internal = NULL;
  39966. }
  39967. XFREE(bn, NULL, DYNAMIC_TYPE_BIGINT);
  39968. /* bn = NULL, don't try to access or double free it */
  39969. }
  39970. }
  39971. void wolfSSL_BN_clear_free(WOLFSSL_BIGNUM* bn)
  39972. {
  39973. WOLFSSL_MSG("wolfSSL_BN_clear_free");
  39974. if (bn) {
  39975. if (bn->internal) {
  39976. mp_int* bni = (mp_int*)bn->internal;
  39977. mp_forcezero(bni);
  39978. }
  39979. wolfSSL_BN_free(bn);
  39980. }
  39981. }
  39982. void wolfSSL_BN_clear(WOLFSSL_BIGNUM* bn)
  39983. {
  39984. WOLFSSL_MSG("wolfSSL_BN_clear");
  39985. if (bn && bn->internal) {
  39986. mp_forcezero((mp_int*)bn->internal);
  39987. }
  39988. }
  39989. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  39990. #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
  39991. static void InitwolfSSL_Rsa(WOLFSSL_RSA* rsa)
  39992. {
  39993. if (rsa) {
  39994. XMEMSET(rsa, 0, sizeof(WOLFSSL_RSA));
  39995. }
  39996. }
  39997. void wolfSSL_RSA_free(WOLFSSL_RSA* rsa)
  39998. {
  39999. WOLFSSL_ENTER("wolfSSL_RSA_free");
  40000. if (rsa) {
  40001. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  40002. int doFree = 0;
  40003. if (wc_LockMutex(&rsa->refMutex) != 0) {
  40004. WOLFSSL_MSG("Couldn't lock rsa mutex");
  40005. }
  40006. /* only free if all references to it are done */
  40007. rsa->refCount--;
  40008. if (rsa->refCount == 0) {
  40009. doFree = 1;
  40010. }
  40011. wc_UnLockMutex(&rsa->refMutex);
  40012. if (!doFree) {
  40013. return;
  40014. }
  40015. wc_FreeMutex(&rsa->refMutex);
  40016. #endif
  40017. if (rsa->internal) {
  40018. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  40019. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  40020. WC_RNG* rng;
  40021. /* check if RNG is owned before freeing it */
  40022. if (rsa->ownRng) {
  40023. rng = ((RsaKey*)rsa->internal)->rng;
  40024. if (rng != NULL && rng != &globalRNG) {
  40025. wc_FreeRng(rng);
  40026. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  40027. }
  40028. }
  40029. #endif /* WC_RSA_BLINDING */
  40030. wc_FreeRsaKey((RsaKey*)rsa->internal);
  40031. XFREE(rsa->internal, NULL, DYNAMIC_TYPE_RSA);
  40032. rsa->internal = NULL;
  40033. }
  40034. wolfSSL_BN_free(rsa->iqmp);
  40035. wolfSSL_BN_free(rsa->dmq1);
  40036. wolfSSL_BN_free(rsa->dmp1);
  40037. wolfSSL_BN_free(rsa->q);
  40038. wolfSSL_BN_free(rsa->p);
  40039. wolfSSL_BN_free(rsa->d);
  40040. wolfSSL_BN_free(rsa->e);
  40041. wolfSSL_BN_free(rsa->n);
  40042. #ifdef WC_RSA_BLINDING
  40043. if (rsa->rng && wc_FreeRng(rsa->rng) != 0) {
  40044. WOLFSSL_MSG("Issue freeing rng");
  40045. }
  40046. XFREE(rsa->rng, NULL, DYNAMIC_TYPE_RNG);
  40047. #endif
  40048. #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY)
  40049. if (rsa->meth) {
  40050. wolfSSL_RSA_meth_free(rsa->meth);
  40051. }
  40052. #endif
  40053. InitwolfSSL_Rsa(rsa); /* set back to NULLs for safety */
  40054. XFREE(rsa, NULL, DYNAMIC_TYPE_RSA);
  40055. /* rsa = NULL, don't try to access or double free it */
  40056. }
  40057. }
  40058. WOLFSSL_RSA* wolfSSL_RSA_new(void)
  40059. {
  40060. WOLFSSL_RSA* external;
  40061. RsaKey* key;
  40062. WOLFSSL_ENTER("wolfSSL_RSA_new");
  40063. key = (RsaKey*) XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA);
  40064. if (key == NULL) {
  40065. WOLFSSL_MSG("wolfSSL_RSA_new malloc RsaKey failure");
  40066. return NULL;
  40067. }
  40068. external = (WOLFSSL_RSA*) XMALLOC(sizeof(WOLFSSL_RSA), NULL,
  40069. DYNAMIC_TYPE_RSA);
  40070. if (external == NULL) {
  40071. WOLFSSL_MSG("wolfSSL_RSA_new malloc WOLFSSL_RSA failure");
  40072. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  40073. return NULL;
  40074. }
  40075. InitwolfSSL_Rsa(external);
  40076. if (wc_InitRsaKey(key, NULL) != 0) {
  40077. WOLFSSL_MSG("InitRsaKey WOLFSSL_RSA failure");
  40078. XFREE(external, NULL, DYNAMIC_TYPE_RSA);
  40079. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  40080. return NULL;
  40081. }
  40082. #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \
  40083. !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING)
  40084. {
  40085. WC_RNG* rng;
  40086. rng = (WC_RNG*) XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
  40087. if (rng != NULL && wc_InitRng(rng) != 0) {
  40088. WOLFSSL_MSG("InitRng failure, attempting to use global RNG");
  40089. XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
  40090. rng = NULL;
  40091. }
  40092. external->ownRng = 1;
  40093. if (rng == NULL && initGlobalRNG) {
  40094. external->ownRng = 0;
  40095. rng = &globalRNG;
  40096. }
  40097. if (rng == NULL) {
  40098. WOLFSSL_MSG("wolfSSL_RSA_new no WC_RNG for blinding");
  40099. XFREE(external, NULL, DYNAMIC_TYPE_RSA);
  40100. XFREE(key, NULL, DYNAMIC_TYPE_RSA);
  40101. return NULL;
  40102. }
  40103. wc_RsaSetRNG(key, rng);
  40104. }
  40105. #else
  40106. XMEMSET(key, 0, sizeof(RsaKey));
  40107. #endif /* WC_RSA_BLINDING */
  40108. external->internal = key;
  40109. external->inSet = 0;
  40110. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  40111. external->refCount = 1;
  40112. wc_InitMutex(&external->refMutex);
  40113. #endif
  40114. return external;
  40115. }
  40116. #endif /* !NO_RSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
  40117. #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7)
  40118. PKCS7* wolfSSL_PKCS7_new(void)
  40119. {
  40120. WOLFSSL_PKCS7* pkcs7;
  40121. int ret = 0;
  40122. pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(*pkcs7), NULL, DYNAMIC_TYPE_PKCS7);
  40123. if (pkcs7 != NULL) {
  40124. XMEMSET(pkcs7, 0, sizeof(*pkcs7));
  40125. ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID);
  40126. }
  40127. if (ret != 0 && pkcs7 != NULL)
  40128. XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7);
  40129. return (PKCS7*)pkcs7;
  40130. }
  40131. /******************************************************************************
  40132. * wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data
  40133. *
  40134. * RETURNS:
  40135. * returns pointer to the PKCS7 structure on success, otherwise returns NULL
  40136. */
  40137. PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void)
  40138. {
  40139. byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02};
  40140. PKCS7* pkcs7 = NULL;
  40141. if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL)
  40142. return NULL;
  40143. pkcs7->contentOID = SIGNED_DATA;
  40144. if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) {
  40145. if (pkcs7) {
  40146. wolfSSL_PKCS7_free(pkcs7);
  40147. return NULL;
  40148. }
  40149. }
  40150. return pkcs7;
  40151. }
  40152. void wolfSSL_PKCS7_free(PKCS7* pkcs7)
  40153. {
  40154. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  40155. if (p7 != NULL) {
  40156. if (p7->data != NULL)
  40157. XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
  40158. wc_PKCS7_Free(&p7->pkcs7);
  40159. XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7);
  40160. }
  40161. }
  40162. void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7)
  40163. {
  40164. wolfSSL_PKCS7_free(p7);
  40165. return;
  40166. }
  40167. PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len)
  40168. {
  40169. WOLFSSL_PKCS7* pkcs7 = NULL;
  40170. word32 idx = 0;
  40171. if (in == NULL)
  40172. return NULL;
  40173. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  40174. return NULL;
  40175. if (GetSequence(*in, &idx, &pkcs7->len, len) < 0) {
  40176. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  40177. return NULL;
  40178. }
  40179. pkcs7->len += idx;
  40180. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  40181. if (pkcs7->data == NULL) {
  40182. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  40183. return NULL;
  40184. }
  40185. XMEMCPY(pkcs7->data, *in, pkcs7->len);
  40186. *in += pkcs7->len;
  40187. if (p7 != NULL)
  40188. *p7 = (PKCS7*)pkcs7;
  40189. return (PKCS7*)pkcs7;
  40190. }
  40191. PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
  40192. {
  40193. WOLFSSL_PKCS7* pkcs7;
  40194. if (bio == NULL)
  40195. return NULL;
  40196. if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)
  40197. return NULL;
  40198. pkcs7->len = wolfSSL_BIO_pending(bio);
  40199. pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
  40200. if (pkcs7->data == NULL) {
  40201. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  40202. return NULL;
  40203. }
  40204. if (wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len) != pkcs7->len) {
  40205. wolfSSL_PKCS7_free((PKCS7*)pkcs7);
  40206. return NULL;
  40207. }
  40208. if (p7 != NULL)
  40209. *p7 = (PKCS7*)pkcs7;
  40210. return (PKCS7*)pkcs7;
  40211. }
  40212. int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  40213. WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in,
  40214. WOLFSSL_BIO* out, int flags)
  40215. {
  40216. int ret = 0;
  40217. unsigned char* mem = NULL;
  40218. int memSz = 0;
  40219. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  40220. if (pkcs7 == NULL)
  40221. return WOLFSSL_FAILURE;
  40222. if (in != NULL) {
  40223. if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0)
  40224. return WOLFSSL_FAILURE;
  40225. p7->pkcs7.content = mem;
  40226. p7->pkcs7.contentSz = memSz;
  40227. }
  40228. /* certs is the list of certificates to find the cert with issuer/serial. */
  40229. (void)certs;
  40230. /* store is the certificate store to use to verify signer certificate
  40231. * associated with the signers.
  40232. */
  40233. (void)store;
  40234. ret = wc_PKCS7_VerifySignedData_ex(&p7->pkcs7, NULL, 0, p7->data, p7->len,
  40235. NULL, 0);
  40236. if (ret != 0)
  40237. return WOLFSSL_FAILURE;
  40238. if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) {
  40239. /* All signer certificates are verified. */
  40240. return WOLFSSL_FAILURE;
  40241. }
  40242. if (out != NULL)
  40243. wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz);
  40244. return WOLFSSL_SUCCESS;
  40245. }
  40246. WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs,
  40247. int flags)
  40248. {
  40249. WOLFSSL_STACK* signers = NULL;
  40250. WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
  40251. if (p7 == NULL)
  40252. return NULL;
  40253. /* Only PKCS#7 messages with a single cert that is the verifying certificate
  40254. * is supported.
  40255. */
  40256. if ((flags | PKCS7_NOINTERN) == PKCS7_NOINTERN)
  40257. return NULL;
  40258. signers = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  40259. DYNAMIC_TYPE_X509);
  40260. if (signers == NULL)
  40261. return NULL;
  40262. signers->num = 1;
  40263. signers->data.x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
  40264. DYNAMIC_TYPE_X509);
  40265. if (signers->data.x509 == NULL) {
  40266. XFREE(signers, NULL, DYNAMIC_TYPE_X509);
  40267. return NULL;
  40268. }
  40269. if (DecodeToX509(signers->data.x509, p7->pkcs7.singleCert,
  40270. p7->pkcs7.singleCertSz) != 0) {
  40271. XFREE(signers->data.x509, NULL, DYNAMIC_TYPE_X509);
  40272. XFREE(signers, NULL, DYNAMIC_TYPE_X509);
  40273. return NULL;
  40274. }
  40275. (void)certs;
  40276. return signers;
  40277. }
  40278. /******************************************************************************
  40279. * wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO
  40280. *
  40281. * RETURNS:
  40282. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  40283. */
  40284. int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7)
  40285. {
  40286. #ifdef WOLFSSL_SMALL_STACK
  40287. byte* outputHead;
  40288. byte* outputFoot;
  40289. #else
  40290. byte outputHead[2048];
  40291. byte outputFoot[2048];
  40292. #endif
  40293. word32 outputHeadSz = 2048;
  40294. word32 outputFootSz = 2048;
  40295. word32 outputSz = 0;
  40296. byte* output = NULL;
  40297. byte* pem = NULL;
  40298. int pemSz = -1;
  40299. enum wc_HashType hashType;
  40300. byte hashBuf[WC_MAX_DIGEST_SIZE];
  40301. word32 hashSz = -1;
  40302. WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7()");
  40303. if (bio == NULL || p7 == NULL)
  40304. return WOLFSSL_FAILURE;
  40305. #ifdef WOLFSSL_SMALL_STACK
  40306. outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40307. if (outputHead == NULL)
  40308. return MEMORY_E;
  40309. outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40310. if (outputFoot == NULL)
  40311. goto error;
  40312. #endif
  40313. XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE);
  40314. XMEMSET(outputHead, 0, outputHeadSz);
  40315. XMEMSET(outputFoot, 0, outputFootSz);
  40316. hashType = wc_OidGetHash(p7->hashOID);
  40317. hashSz = wc_HashGetDigestSize(hashType);
  40318. if (hashSz > WC_MAX_DIGEST_SIZE)
  40319. return WOLFSSL_FAILURE;
  40320. /* only SIGNED_DATA is supported */
  40321. switch (p7->contentOID) {
  40322. case SIGNED_DATA:
  40323. break;
  40324. default:
  40325. WOLFSSL_MSG("Unknown PKCS#7 Type");
  40326. return WOLFSSL_FAILURE;
  40327. };
  40328. if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz,
  40329. outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0)
  40330. return WOLFSSL_FAILURE;
  40331. outputSz = outputHeadSz + p7->contentSz + outputFootSz;
  40332. output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40333. if (!output)
  40334. return WOLFSSL_FAILURE;
  40335. XMEMSET(output, 0, outputSz);
  40336. outputSz = 0;
  40337. XMEMCPY(&output[outputSz], outputHead, outputHeadSz);
  40338. outputSz += outputHeadSz;
  40339. XMEMCPY(&output[outputSz], p7->content, p7->contentSz);
  40340. outputSz += p7->contentSz;
  40341. XMEMCPY(&output[outputSz], outputFoot, outputFootSz);
  40342. outputSz += outputFootSz;
  40343. /* get PEM size */
  40344. pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE);
  40345. if (pemSz < 0)
  40346. goto error;
  40347. pemSz++; /* for '\0'*/
  40348. /* create PEM buffer and convert from DER to PEM*/
  40349. if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER)) == NULL)
  40350. goto error;
  40351. XMEMSET(pem, 0, pemSz);
  40352. if (wc_DerToPemEx(output, outputSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
  40353. goto error;
  40354. }
  40355. if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) {
  40356. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40357. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40358. #ifdef WOLFSSL_SMALL_STACK
  40359. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40360. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40361. #endif
  40362. return WOLFSSL_SUCCESS;
  40363. }
  40364. error:
  40365. #ifdef WOLFSSL_SMALL_STACK
  40366. if (outputHead) {
  40367. XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40368. }
  40369. if (outputFoot) {
  40370. XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40371. }
  40372. #endif
  40373. if (output) {
  40374. XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40375. }
  40376. if (pem) {
  40377. XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
  40378. }
  40379. return WOLFSSL_FAILURE;
  40380. }
  40381. #endif /* OPENSSL_ALL && HAVE_PKCS7 */
  40382. #if defined(OPENSSL_EXTRA)
  40383. WOLFSSL_STACK* wolfSSL_sk_X509_new(void)
  40384. {
  40385. WOLFSSL_STACK* s = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  40386. DYNAMIC_TYPE_X509);
  40387. if (s != NULL) {
  40388. XMEMSET(s, 0, sizeof(*s));
  40389. s->type = STACK_TYPE_X509;
  40390. }
  40391. return s;
  40392. }
  40393. #endif
  40394. #ifdef OPENSSL_ALL
  40395. int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio,
  40396. WOLFSSL_EVP_PKEY* pkey,
  40397. const WOLFSSL_EVP_CIPHER* enc,
  40398. char* passwd, int passwdSz,
  40399. pem_password_cb* cb, void* ctx)
  40400. {
  40401. int ret = 0;
  40402. char password[NAME_SZ];
  40403. byte* key = NULL;
  40404. word32 keySz;
  40405. byte* pem = NULL;
  40406. int pemSz;
  40407. int type = PKCS8_PRIVATEKEY_TYPE;
  40408. int algId;
  40409. const byte* curveOid;
  40410. word32 oidSz;
  40411. int encAlgId;
  40412. if (bio == NULL || pkey == NULL)
  40413. return -1;
  40414. keySz = pkey->pkey_sz + 128;
  40415. key = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40416. if (key == NULL)
  40417. ret = MEMORY_E;
  40418. if (ret == 0 && enc != NULL && passwd == NULL) {
  40419. passwdSz = cb(password, sizeof(password), 1, ctx);
  40420. if (passwdSz < 0)
  40421. ret = WOLFSSL_FAILURE;
  40422. passwd = password;
  40423. }
  40424. if (ret == 0 && enc != NULL) {
  40425. WC_RNG rng;
  40426. ret = wc_InitRng(&rng);
  40427. if (ret == 0) {
  40428. #ifndef NO_DES3
  40429. if (enc == EVP_DES_CBC)
  40430. encAlgId = DESb;
  40431. else if (enc == EVP_DES_EDE3_CBC)
  40432. encAlgId = DES3b;
  40433. else
  40434. #endif
  40435. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  40436. #ifdef WOLFSSL_AES_256
  40437. if (enc == EVP_AES_256_CBC)
  40438. encAlgId = AES256CBCb;
  40439. else
  40440. #endif
  40441. #endif
  40442. ret = -1;
  40443. if (ret == 0) {
  40444. ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, key,
  40445. &keySz, passwd, passwdSz, PKCS5, PBES2,
  40446. encAlgId, NULL, 0, WC_PKCS12_ITT_DEFAULT,
  40447. &rng, NULL);
  40448. if (ret > 0) {
  40449. keySz = ret;
  40450. ret = 0;
  40451. }
  40452. }
  40453. wc_FreeRng(&rng);
  40454. }
  40455. type = PKCS8_ENC_PRIVATEKEY_TYPE;
  40456. }
  40457. if (ret == 0 && enc == NULL) {
  40458. type = PKCS8_PRIVATEKEY_TYPE;
  40459. if (pkey->type == EVP_PKEY_EC) {
  40460. algId = ECDSAk;
  40461. ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid,
  40462. &oidSz);
  40463. }
  40464. else {
  40465. algId = RSAk;
  40466. curveOid = NULL;
  40467. oidSz = 0;
  40468. }
  40469. if (ret >= 0) {
  40470. ret = wc_CreatePKCS8Key(key, &keySz, (byte*)pkey->pkey.ptr,
  40471. pkey->pkey_sz, algId, curveOid, oidSz);
  40472. keySz = ret;
  40473. }
  40474. }
  40475. if (password == passwd)
  40476. XMEMSET(password, 0, passwdSz);
  40477. if (ret >= 0) {
  40478. pemSz = 2 * keySz + 2 * 64;
  40479. pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40480. if (pem == NULL)
  40481. ret = MEMORY_E;
  40482. }
  40483. if (ret >= 0)
  40484. ret = wc_DerToPemEx(key, keySz, pem, pemSz, NULL, type);
  40485. if (key != NULL)
  40486. XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40487. if (ret >= 0) {
  40488. if (wolfSSL_BIO_write(bio, pem, ret) != ret)
  40489. ret = -1;
  40490. }
  40491. if (pem != NULL)
  40492. XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  40493. return ret < 0 ? 0 : ret;
  40494. }
  40495. static int bio_get_data(WOLFSSL_BIO* bio, byte** data)
  40496. {
  40497. int ret = 0;
  40498. byte* mem = NULL;
  40499. #ifndef NO_FILESYSTEM
  40500. long memSz;
  40501. XFILE file;
  40502. long curr;
  40503. #endif
  40504. if ((ret = wolfSSL_BIO_pending(bio)) > 0) {
  40505. }
  40506. #ifndef NO_FILESYSTEM
  40507. else if (bio->type == WOLFSSL_BIO_FILE) {
  40508. if (wolfSSL_BIO_get_fp(bio, &file) != WOLFSSL_SUCCESS)
  40509. ret = BAD_FUNC_ARG;
  40510. if (ret == 0) {
  40511. curr = XFTELL(file);
  40512. if (curr < 0) {
  40513. ret = WOLFSSL_BAD_FILE;
  40514. }
  40515. if (XFSEEK(file, 0, XSEEK_END) != 0)
  40516. ret = WOLFSSL_BAD_FILE;
  40517. }
  40518. if (ret == 0) {
  40519. memSz = XFTELL(file);
  40520. if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz < 0) {
  40521. ret = WOLFSSL_BAD_FILE;
  40522. }
  40523. }
  40524. if (ret == 0) {
  40525. memSz -= curr;
  40526. ret = (int)memSz;
  40527. if (XFSEEK(file, curr, SEEK_SET) != 0)
  40528. ret = WOLFSSL_BAD_FILE;
  40529. }
  40530. }
  40531. #endif
  40532. if (ret > 0) {
  40533. mem = (byte*)XMALLOC(ret, bio->heap, DYNAMIC_TYPE_OPENSSL);
  40534. if (mem == NULL) {
  40535. WOLFSSL_MSG("Memory error");
  40536. ret = MEMORY_E;
  40537. }
  40538. if (ret >= 0) {
  40539. if ((ret = wolfSSL_BIO_read(bio, mem, ret)) <= 0) {
  40540. XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL);
  40541. ret = MEMORY_E;
  40542. mem = NULL;
  40543. }
  40544. }
  40545. }
  40546. *data = mem;
  40547. return ret;
  40548. }
  40549. #ifndef NO_WOLFSSL_STUB
  40550. void wolfSSL_BIO_set_init(WOLFSSL_BIO* bio, int init)
  40551. {
  40552. WOLFSSL_STUB("wolfSSL_BIO_set_init");
  40553. (void)bio;
  40554. (void)init;
  40555. }
  40556. void wolfSSL_BIO_set_shutdown(WOLFSSL_BIO* bio, int shut)
  40557. {
  40558. WOLFSSL_STUB("wolfSSL_BIO_set_shutdown");
  40559. (void)bio;
  40560. (void)shut;
  40561. }
  40562. int wolfSSL_BIO_get_shutdown(WOLFSSL_BIO* bio)
  40563. {
  40564. WOLFSSL_STUB("wolfSSL_BIO_get_shutdown");
  40565. (void)bio;
  40566. return 0;
  40567. }
  40568. #endif /* NO_WOLFSSL_STUB */
  40569. void wolfSSL_BIO_clear_retry_flags(WOLFSSL_BIO* bio)
  40570. {
  40571. WOLFSSL_ENTER("wolfSSL_BIO_clear_retry_flags");
  40572. if (bio)
  40573. bio->flags &= ~(WOLFSSL_BIO_FLAG_READ|WOLFSSL_BIO_FLAG_RETRY);
  40574. }
  40575. int wolfSSL_BIO_should_retry(WOLFSSL_BIO *bio)
  40576. {
  40577. int ret = 0;
  40578. if (bio != NULL) {
  40579. ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_RETRY);
  40580. }
  40581. return ret;
  40582. }
  40583. /* DER data is PKCS#8 encrypted. */
  40584. WOLFSSL_EVP_PKEY* wolfSSL_d2i_PKCS8PrivateKey_bio(WOLFSSL_BIO* bio,
  40585. WOLFSSL_EVP_PKEY** pkey,
  40586. pem_password_cb* cb,
  40587. void* ctx)
  40588. {
  40589. int ret;
  40590. byte* der;
  40591. int len;
  40592. byte* p;
  40593. char password[NAME_SZ];
  40594. int passwordSz;
  40595. word32 algId;
  40596. WOLFSSL_EVP_PKEY* key;
  40597. if ((len = bio_get_data(bio, &der)) < 0)
  40598. return NULL;
  40599. if (cb != NULL) {
  40600. passwordSz = cb(password, sizeof(password), PEM_PASS_READ, ctx);
  40601. if (passwordSz < 0) {
  40602. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  40603. return NULL;
  40604. }
  40605. ret = ToTraditionalEnc(der, len, password, passwordSz, &algId);
  40606. if (ret < 0) {
  40607. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  40608. return NULL;
  40609. }
  40610. XMEMSET(password, 0, passwordSz);
  40611. }
  40612. p = der;
  40613. key = wolfSSL_d2i_PrivateKey_EVP(pkey, &p, len);
  40614. XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL);
  40615. return key;
  40616. }
  40617. /* Detect which type of key it is before decoding. */
  40618. WOLFSSL_EVP_PKEY* wolfSSL_d2i_AutoPrivateKey(WOLFSSL_EVP_PKEY** pkey,
  40619. const unsigned char** pp,
  40620. long length)
  40621. {
  40622. int ret;
  40623. WOLFSSL_EVP_PKEY* key = NULL;
  40624. const byte* der = *pp;
  40625. word32 idx = 0;
  40626. int len = 0;
  40627. word32 end = 0;
  40628. int cnt = 0;
  40629. int type;
  40630. word32 algId;
  40631. word32 keyLen = (word32)length;
  40632. /* Take off PKCS#8 wrapper if found. */
  40633. if ((len = ToTraditionalInline_ex(der, &idx, keyLen, &algId)) >= 0) {
  40634. der += idx;
  40635. keyLen = len;
  40636. }
  40637. idx = 0;
  40638. len = 0;
  40639. /* Use the number of elements in the outer sequence to determine key type.
  40640. */
  40641. ret = GetSequence(der, &idx, &len, keyLen);
  40642. if (ret >= 0) {
  40643. end = idx + len;
  40644. while (ret >= 0 && idx < end) {
  40645. /* Skip type */
  40646. idx++;
  40647. /* Get length and skip over - keeping count */
  40648. len = 0;
  40649. ret = GetLength(der, &idx, &len, keyLen);
  40650. if (ret >= 0) {
  40651. if (idx + len > end)
  40652. ret = ASN_PARSE_E;
  40653. else {
  40654. idx += len;
  40655. cnt++;
  40656. }
  40657. }
  40658. }
  40659. }
  40660. if (ret >= 0) {
  40661. /* ECC includes version, private[, curve][, public key] */
  40662. if (cnt >= 2 && cnt <= 4)
  40663. type = EVP_PKEY_EC;
  40664. else
  40665. type = EVP_PKEY_RSA;
  40666. key = wolfSSL_d2i_PrivateKey(type, pkey, &der, keyLen);
  40667. *pp = der;
  40668. }
  40669. return key;
  40670. }
  40671. #endif
  40672. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  40673. !defined(WOLFCRYPT_ONLY)
  40674. /* unlike wolfSSL_X509_NAME_dup this does not malloc a duplicate, only deep
  40675. * copy. "to" is expected to be a fresh blank name, if not pointers could be
  40676. * lost */
  40677. int wolfSSL_X509_NAME_copy(WOLFSSL_X509_NAME* from, WOLFSSL_X509_NAME* to)
  40678. {
  40679. int i;
  40680. WOLFSSL_X509_NAME_ENTRY* ne;
  40681. WOLFSSL_ENTER("wolfSSL_X509_NAME_copy");
  40682. if (from == NULL || to == NULL) {
  40683. WOLFSSL_MSG("NULL parameter");
  40684. return BAD_FUNC_ARG;
  40685. }
  40686. if (from->dynamicName) {
  40687. to->name = (char*)XMALLOC(from->sz, to->heap, DYNAMIC_TYPE_SUBJECT_CN);
  40688. if (to->name == NULL)
  40689. return WOLFSSL_FAILURE;
  40690. to->dynamicName = 1;
  40691. }
  40692. XMEMCPY(to->name, from->name, from->sz);
  40693. to->sz = from->sz;
  40694. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  40695. ne = wolfSSL_X509_NAME_get_entry(from, i);
  40696. if (ne != NULL)
  40697. wolfSSL_X509_NAME_add_entry(to, ne, i, 1);
  40698. }
  40699. to->entrySz = from->entrySz;
  40700. return WOLFSSL_SUCCESS;
  40701. }
  40702. /* copies over information from "name" to the "cert" subject name
  40703. * returns WOLFSSL_SUCCESS on success */
  40704. int wolfSSL_X509_set_subject_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  40705. {
  40706. WOLFSSL_ENTER("X509_set_subject_name");
  40707. if (cert == NULL || name == NULL)
  40708. return WOLFSSL_FAILURE;
  40709. FreeX509Name(&cert->subject);
  40710. InitX509Name(&cert->subject, 0, cert->heap);
  40711. if (wolfSSL_X509_NAME_copy(name, &cert->subject) != WOLFSSL_SUCCESS) {
  40712. FreeX509Name(&cert->subject);
  40713. return WOLFSSL_FAILURE;
  40714. }
  40715. cert->subject.x509 = cert;
  40716. return WOLFSSL_SUCCESS;
  40717. }
  40718. /* copies over information from "name" to the "cert" issuer name
  40719. * returns WOLFSSL_SUCCESS on success */
  40720. int wolfSSL_X509_set_issuer_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
  40721. {
  40722. WOLFSSL_ENTER("X509_set_issuer_name");
  40723. if (cert == NULL || name == NULL)
  40724. return WOLFSSL_FAILURE;
  40725. FreeX509Name(&cert->issuer);
  40726. InitX509Name(&cert->issuer, 0, cert->heap);
  40727. if (wolfSSL_X509_NAME_copy(name, &cert->issuer) != WOLFSSL_SUCCESS) {
  40728. FreeX509Name(&cert->issuer);
  40729. return WOLFSSL_FAILURE;
  40730. }
  40731. cert->issuer.x509 = cert;
  40732. cert->issuerSet = 1;
  40733. return WOLFSSL_SUCCESS;
  40734. }
  40735. int wolfSSL_X509_set_notAfter(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  40736. {
  40737. if (x509 == NULL || t == NULL) {
  40738. return WOLFSSL_FAILURE;
  40739. }
  40740. XMEMCPY(&x509->notAfter, t, sizeof(WOLFSSL_ASN1_TIME));
  40741. return WOLFSSL_SUCCESS;
  40742. }
  40743. int wolfSSL_X509_set_notBefore(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
  40744. {
  40745. if (x509 == NULL || t == NULL) {
  40746. return WOLFSSL_FAILURE;
  40747. }
  40748. XMEMCPY(&x509->notBefore, t, sizeof(WOLFSSL_ASN1_TIME));
  40749. return WOLFSSL_SUCCESS;
  40750. }
  40751. int wolfSSL_X509_set_serialNumber(WOLFSSL_X509* x509, WOLFSSL_ASN1_INTEGER* s)
  40752. {
  40753. WOLFSSL_ENTER("wolfSSL_X509_set_serialNumber");
  40754. if (!x509 || !s || s->dataMax >= EXTERNAL_SERIAL_SIZE)
  40755. return WOLFSSL_FAILURE;
  40756. if (s->isDynamic)
  40757. XSTRNCPY((char*)x509->serial,(char*)s->data,s->dataMax);
  40758. else
  40759. XSTRNCPY((char*)x509->serial,(char*)s->intData,s->dataMax);
  40760. x509->serial[s->dataMax] = 0;
  40761. x509->serialSz = s->dataMax;
  40762. return WOLFSSL_SUCCESS;
  40763. }
  40764. int wolfSSL_X509_set_pubkey(WOLFSSL_X509 *cert, WOLFSSL_EVP_PKEY *pkey)
  40765. {
  40766. byte* p;
  40767. WOLFSSL_ENTER("wolfSSL_X509_set_pubkey");
  40768. if (cert == NULL || pkey == NULL)
  40769. return WOLFSSL_FAILURE;
  40770. if (pkey->type == EVP_PKEY_RSA)
  40771. cert->pubKeyOID = RSAk;
  40772. else if (pkey->type == EVP_PKEY_EC)
  40773. cert->pubKeyOID = ECDSAk;
  40774. else
  40775. return WOLFSSL_FAILURE;
  40776. p = (byte*)XMALLOC(pkey->pkey_sz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  40777. if (p == NULL)
  40778. return WOLFSSL_FAILURE;
  40779. if (cert->pubKey.buffer != NULL)
  40780. XFREE(cert->pubKey.buffer, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  40781. cert->pubKey.buffer = p;
  40782. XMEMCPY(cert->pubKey.buffer, pkey->pkey.ptr, pkey->pkey_sz);
  40783. cert->pubKey.length = pkey->pkey_sz;
  40784. return WOLFSSL_SUCCESS;
  40785. }
  40786. int wolfSSL_X509_set_version(WOLFSSL_X509* x509, long v)
  40787. {
  40788. WOLFSSL_ENTER("wolfSSL_X509_set_version");
  40789. if ((x509 == NULL) || (v < 0) || (v > INT_MAX)) {
  40790. return WOLFSSL_FAILURE;
  40791. }
  40792. x509->version = (int) v + 1;
  40793. return WOLFSSL_SUCCESS;
  40794. }
  40795. #endif /* (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) && WOLFSSL_CERT_GEN */
  40796. #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
  40797. defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ)
  40798. void wolfSSL_X509V3_set_ctx(WOLFSSL_X509V3_CTX* ctx, WOLFSSL_X509* issuer,
  40799. WOLFSSL_X509* subject, WOLFSSL_X509* req, WOLFSSL_X509_CRL* crl,
  40800. int flag)
  40801. {
  40802. int ret = WOLFSSL_SUCCESS;
  40803. WOLFSSL_ENTER("wolfSSL_X509V3_set_ctx");
  40804. if (!ctx || !ctx->x509)
  40805. return;
  40806. /* Set parameters in ctx as long as ret == WOLFSSL_SUCCESS */
  40807. if (issuer)
  40808. ret = wolfSSL_X509_set_issuer_name(ctx->x509,&issuer->issuer);
  40809. if (subject && ret == WOLFSSL_SUCCESS)
  40810. ret = wolfSSL_X509_set_subject_name(ctx->x509,&subject->subject);
  40811. if (req && ret == WOLFSSL_SUCCESS) {
  40812. WOLFSSL_MSG("req not implemented.");
  40813. }
  40814. if (crl && ret == WOLFSSL_SUCCESS) {
  40815. WOLFSSL_MSG("crl not implemented.");
  40816. }
  40817. if (flag && ret == WOLFSSL_SUCCESS) {
  40818. WOLFSSL_MSG("flag not implemented.");
  40819. }
  40820. if (!ret) {
  40821. WOLFSSL_MSG("Error setting WOLFSSL_X509V3_CTX parameters.");
  40822. }
  40823. }
  40824. int wolfSSL_i2d_X509_REQ(WOLFSSL_X509* req, unsigned char** out)
  40825. {
  40826. const unsigned char* der;
  40827. int derSz = 0;
  40828. WOLFSSL_ENTER("wolfSSL_i2d_X509_REQ");
  40829. if (req == NULL || out == NULL) {
  40830. return BAD_FUNC_ARG;
  40831. }
  40832. der = wolfSSL_X509_get_der(req, &derSz);
  40833. if (der == NULL) {
  40834. return MEMORY_E;
  40835. }
  40836. if (*out == NULL) {
  40837. *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
  40838. if (*out == NULL) {
  40839. return MEMORY_E;
  40840. }
  40841. }
  40842. XMEMCPY(*out, der, derSz);
  40843. return derSz;
  40844. }
  40845. WOLFSSL_X509* wolfSSL_X509_REQ_new(void)
  40846. {
  40847. return wolfSSL_X509_new();
  40848. }
  40849. void wolfSSL_X509_REQ_free(WOLFSSL_X509* req)
  40850. {
  40851. wolfSSL_X509_free(req);
  40852. }
  40853. int wolfSSL_X509_REQ_sign(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey,
  40854. const WOLFSSL_EVP_MD *md)
  40855. {
  40856. byte der[2048];
  40857. int derSz = sizeof(der);
  40858. if (req == NULL || pkey == NULL || md == NULL)
  40859. return WOLFSSL_FAILURE;
  40860. /* Create a Cert that has the certificate request fields. */
  40861. req->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
  40862. if (wolfSSL_X509_make_der(req, 1, der, &derSz) != WOLFSSL_SUCCESS) {
  40863. return WOLFSSL_FAILURE;
  40864. }
  40865. if (wolfSSL_X509_resign_cert(req, 1, der, sizeof(der), derSz,
  40866. (WOLFSSL_EVP_MD*)md, pkey) <= 0) {
  40867. return WOLFSSL_FAILURE;
  40868. }
  40869. return WOLFSSL_SUCCESS;
  40870. }
  40871. #ifndef NO_WOLFSSL_STUB
  40872. int wolfSSL_X509_REQ_add_extensions(WOLFSSL_X509* req,
  40873. WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* ext)
  40874. {
  40875. (void)req;
  40876. (void)ext;
  40877. return WOLFSSL_FATAL_ERROR;
  40878. }
  40879. #endif
  40880. int wolfSSL_X509_REQ_set_subject_name(WOLFSSL_X509 *req,
  40881. WOLFSSL_X509_NAME *name)
  40882. {
  40883. return wolfSSL_X509_set_subject_name(req, name);
  40884. }
  40885. int wolfSSL_X509_REQ_set_pubkey(WOLFSSL_X509 *req, WOLFSSL_EVP_PKEY *pkey)
  40886. {
  40887. return wolfSSL_X509_set_pubkey(req, pkey);
  40888. }
  40889. #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_CERT_GEN && WOLFSSL_CERT_REQ */
  40890. #ifdef WOLFSSL_STATIC_EPHEMERAL
  40891. static int SetStaticEphemeralKey(StaticKeyExchangeInfo_t* staticKE, int keyAlgo,
  40892. const char* key, unsigned int keySz, int format, void* heap)
  40893. {
  40894. int ret = 0;
  40895. byte* keyBuf = NULL;
  40896. #ifndef NO_FILESYSTEM
  40897. const char* keyFile = NULL;
  40898. #endif
  40899. /* allow empty key to free buffer */
  40900. if (staticKE == NULL || (key == NULL && keySz > 0)) {
  40901. return BAD_FUNC_ARG;
  40902. }
  40903. /* check if just free'ing key */
  40904. if (key == NULL && keySz == 0) {
  40905. return 0;
  40906. }
  40907. #ifndef NO_FILESYSTEM
  40908. /* load file from filesystem */
  40909. if (key && keySz == 0) {
  40910. size_t keyBufSz = 0;
  40911. keyFile = (const char*)key;
  40912. ret = wc_FileLoad(keyFile, &keyBuf, &keyBufSz, heap);
  40913. if (ret != 0) {
  40914. return ret;
  40915. }
  40916. keySz = (unsigned int)keyBufSz;
  40917. }
  40918. else
  40919. #endif
  40920. {
  40921. /* use as key buffer directly */
  40922. keyBuf = (byte*)key;
  40923. }
  40924. if (format == WOLFSSL_FILETYPE_PEM) {
  40925. #ifdef WOLFSSL_PEM_TO_DER
  40926. int keyFormat = 0;
  40927. ret = PemToDer(keyBuf, keySz, PRIVATEKEY_TYPE, &staticKE->key,
  40928. heap, NULL, &keyFormat);
  40929. /* auto detect key type */
  40930. if (ret == 0 && keyAlgo == 0) {
  40931. if (keyFormat == ECDSAk)
  40932. keyAlgo = WC_PK_TYPE_ECDH;
  40933. else
  40934. keyAlgo = WC_PK_TYPE_DH;
  40935. }
  40936. #else
  40937. ret = NOT_COMPILED_IN;
  40938. #endif
  40939. }
  40940. else {
  40941. ret = AllocDer(&staticKE->key, keySz, PRIVATEKEY_TYPE, heap);
  40942. if (ret == 0) {
  40943. XMEMCPY(staticKE->key->buffer, keyBuf, keySz);
  40944. }
  40945. }
  40946. staticKE->keyAlgo = keyAlgo;
  40947. #ifndef NO_FILESYSTEM
  40948. if (keyFile && keyBuf) {
  40949. XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
  40950. }
  40951. #endif
  40952. return ret;
  40953. }
  40954. int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
  40955. const char* key, unsigned int keySz, int format)
  40956. {
  40957. if (ctx == NULL) {
  40958. return BAD_FUNC_ARG;
  40959. }
  40960. /* if key is already set free it */
  40961. if (ctx->staticKE.key != NULL) {
  40962. FreeDer(&ctx->staticKE.key);
  40963. }
  40964. return SetStaticEphemeralKey(&ctx->staticKE, keyAlgo, key, keySz, format,
  40965. ctx->heap);
  40966. }
  40967. int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
  40968. const char* key, unsigned int keySz, int format)
  40969. {
  40970. if (ssl == NULL) {
  40971. return BAD_FUNC_ARG;
  40972. }
  40973. /* if key is already set and not created by ctx... set free it */
  40974. if (ssl->staticKE.key != NULL && ssl->staticKE.key != ssl->ctx->staticKE.key) {
  40975. FreeDer(&ssl->staticKE.key);
  40976. }
  40977. return SetStaticEphemeralKey(&ssl->staticKE, keyAlgo, key, keySz, format,
  40978. ssl->heap);
  40979. }
  40980. #endif /* WOLFSSL_STATIC_EPHEMERAL */