evp.c 388 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639
  1. /* evp.c
  2. *
  3. * Copyright (C) 2006-2023 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. #if !defined(WOLFSSL_EVP_INCLUDED)
  26. #ifndef WOLFSSL_IGNORE_FILE_WARN
  27. #warning evp.c does not need to be compiled separately from ssl.c
  28. #endif
  29. #elif defined(WOLFCRYPT_ONLY)
  30. #else
  31. #if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
  32. #if !defined(HAVE_PKCS7) && \
  33. ((defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && \
  34. (HAVE_FIPS_VERSION == 2)) || defined(HAVE_SELFTEST))
  35. #include <wolfssl/wolfcrypt/aes.h>
  36. #endif
  37. #include <wolfssl/openssl/ecdsa.h>
  38. #include <wolfssl/openssl/evp.h>
  39. #include <wolfssl/openssl/kdf.h>
  40. #include <wolfssl/wolfcrypt/wolfmath.h>
  41. static const struct s_ent {
  42. const enum wc_HashType macType;
  43. const int nid;
  44. const char *name;
  45. } md_tbl[] = {
  46. #ifndef NO_MD4
  47. {WC_HASH_TYPE_MD4, NID_md4, "MD4"},
  48. #endif /* NO_MD4 */
  49. #ifndef NO_MD5
  50. {WC_HASH_TYPE_MD5, NID_md5, "MD5"},
  51. #endif /* NO_MD5 */
  52. #ifndef NO_SHA
  53. {WC_HASH_TYPE_SHA, NID_sha1, "SHA1"},
  54. {WC_HASH_TYPE_SHA, NID_sha1, "SHA"}, /* Leave for backwards compatibility */
  55. #endif /* NO_SHA */
  56. #ifdef WOLFSSL_SHA224
  57. {WC_HASH_TYPE_SHA224, NID_sha224, "SHA224"},
  58. #endif /* WOLFSSL_SHA224 */
  59. #ifndef NO_SHA256
  60. {WC_HASH_TYPE_SHA256, NID_sha256, "SHA256"},
  61. #endif
  62. #ifdef WOLFSSL_SHA384
  63. {WC_HASH_TYPE_SHA384, NID_sha384, "SHA384"},
  64. #endif /* WOLFSSL_SHA384 */
  65. #ifdef WOLFSSL_SHA512
  66. {WC_HASH_TYPE_SHA512, NID_sha512, "SHA512"},
  67. #endif /* WOLFSSL_SHA512 */
  68. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  69. {WC_HASH_TYPE_SHA512_224, NID_sha512_224, "SHA512_224"},
  70. #endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_224 */
  71. #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  72. {WC_HASH_TYPE_SHA512_256, NID_sha512_256, "SHA512_256"},
  73. #endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_256 */
  74. #ifndef WOLFSSL_NOSHA3_224
  75. {WC_HASH_TYPE_SHA3_224, NID_sha3_224, "SHA3_224"},
  76. #endif
  77. #ifndef WOLFSSL_NOSHA3_256
  78. {WC_HASH_TYPE_SHA3_256, NID_sha3_256, "SHA3_256"},
  79. #endif
  80. #ifndef WOLFSSL_NOSHA3_384
  81. {WC_HASH_TYPE_SHA3_384, NID_sha3_384, "SHA3_384"},
  82. #endif
  83. #ifndef WOLFSSL_NOSHA3_512
  84. {WC_HASH_TYPE_SHA3_512, NID_sha3_512, "SHA3_512"},
  85. #endif
  86. #ifdef WOLFSSL_SM3
  87. {WC_HASH_TYPE_SM3, NID_sm3, "SM3"},
  88. #endif /* WOLFSSL_SHA512 */
  89. #ifdef HAVE_BLAKE2
  90. {WC_HASH_TYPE_BLAKE2B, NID_blake2b512, "BLAKE2B512"},
  91. #endif
  92. #ifdef HAVE_BLAKE2S
  93. {WC_HASH_TYPE_BLAKE2S, NID_blake2s256, "BLAKE2S256"},
  94. #endif
  95. #ifdef WOLFSSL_SHAKE128
  96. {WC_HASH_TYPE_SHAKE128, NID_shake128, "SHAKE128"},
  97. #endif
  98. #ifdef WOLFSSL_SHAKE256
  99. {WC_HASH_TYPE_SHAKE256, NID_shake256, "SHAKE256"},
  100. #endif
  101. {WC_HASH_TYPE_NONE, 0, NULL}
  102. };
  103. #endif /* OPENSSL_EXTRA || HAVE_CURL */
  104. #if defined(OPENSSL_EXTRA)
  105. #ifndef NO_AES
  106. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  107. #ifdef WOLFSSL_AES_128
  108. static const char EVP_AES_128_CBC[] = "AES-128-CBC";
  109. #endif
  110. #ifdef WOLFSSL_AES_192
  111. static const char EVP_AES_192_CBC[] = "AES-192-CBC";
  112. #endif
  113. #ifdef WOLFSSL_AES_256
  114. static const char EVP_AES_256_CBC[] = "AES-256-CBC";
  115. #endif
  116. #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
  117. #ifdef WOLFSSL_AES_OFB
  118. #ifdef WOLFSSL_AES_128
  119. static const char EVP_AES_128_OFB[] = "AES-128-OFB";
  120. #endif
  121. #ifdef WOLFSSL_AES_192
  122. static const char EVP_AES_192_OFB[] = "AES-192-OFB";
  123. #endif
  124. #ifdef WOLFSSL_AES_256
  125. static const char EVP_AES_256_OFB[] = "AES-256-OFB";
  126. #endif
  127. #endif /* WOLFSSL_AES_OFB */
  128. #if defined(WOLFSSL_AES_XTS) && \
  129. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  130. #ifdef WOLFSSL_AES_128
  131. static const char EVP_AES_128_XTS[] = "AES-128-XTS";
  132. #endif
  133. #ifdef WOLFSSL_AES_256
  134. static const char EVP_AES_256_XTS[] = "AES-256-XTS";
  135. #endif
  136. #endif /* WOLFSSL_AES_XTS &&
  137. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
  138. #ifdef WOLFSSL_AES_CFB
  139. #ifdef WOLFSSL_AES_128
  140. static const char EVP_AES_128_CFB1[] = "AES-128-CFB1";
  141. #endif
  142. #ifdef WOLFSSL_AES_192
  143. static const char EVP_AES_192_CFB1[] = "AES-192-CFB1";
  144. #endif
  145. #ifdef WOLFSSL_AES_256
  146. static const char EVP_AES_256_CFB1[] = "AES-256-CFB1";
  147. #endif
  148. #ifdef WOLFSSL_AES_128
  149. static const char EVP_AES_128_CFB8[] = "AES-128-CFB8";
  150. #endif
  151. #ifdef WOLFSSL_AES_192
  152. static const char EVP_AES_192_CFB8[] = "AES-192-CFB8";
  153. #endif
  154. #ifdef WOLFSSL_AES_256
  155. static const char EVP_AES_256_CFB8[] = "AES-256-CFB8";
  156. #endif
  157. #ifdef WOLFSSL_AES_128
  158. static const char EVP_AES_128_CFB128[] = "AES-128-CFB128";
  159. #endif
  160. #ifdef WOLFSSL_AES_192
  161. static const char EVP_AES_192_CFB128[] = "AES-192-CFB128";
  162. #endif
  163. #ifdef WOLFSSL_AES_256
  164. static const char EVP_AES_256_CFB128[] = "AES-256-CFB128";
  165. #endif
  166. #endif /* WOLFSSL_AES_CFB */
  167. #ifdef HAVE_AESGCM
  168. #ifdef WOLFSSL_AES_128
  169. static const char EVP_AES_128_GCM[] = "AES-128-GCM";
  170. #endif
  171. #ifdef WOLFSSL_AES_192
  172. static const char EVP_AES_192_GCM[] = "AES-192-GCM";
  173. #endif
  174. #ifdef WOLFSSL_AES_256
  175. static const char EVP_AES_256_GCM[] = "AES-256-GCM";
  176. #endif
  177. #endif /* HAVE_AESGCM */
  178. #ifdef HAVE_AESCCM
  179. #ifdef WOLFSSL_AES_128
  180. static const char EVP_AES_128_CCM[] = "AES-128-CCM";
  181. #endif
  182. #ifdef WOLFSSL_AES_192
  183. static const char EVP_AES_192_CCM[] = "AES-192-CCM";
  184. #endif
  185. #ifdef WOLFSSL_AES_256
  186. static const char EVP_AES_256_CCM[] = "AES-256-CCM";
  187. #endif
  188. #endif /* HAVE_AESCCM */
  189. #ifdef WOLFSSL_AES_COUNTER
  190. #ifdef WOLFSSL_AES_128
  191. static const char EVP_AES_128_CTR[] = "AES-128-CTR";
  192. #endif
  193. #ifdef WOLFSSL_AES_192
  194. static const char EVP_AES_192_CTR[] = "AES-192-CTR";
  195. #endif
  196. #ifdef WOLFSSL_AES_256
  197. static const char EVP_AES_256_CTR[] = "AES-256-CTR";
  198. #endif
  199. #endif
  200. #ifdef HAVE_AES_ECB
  201. #ifdef WOLFSSL_AES_128
  202. static const char EVP_AES_128_ECB[] = "AES-128-ECB";
  203. #endif
  204. #ifdef WOLFSSL_AES_192
  205. static const char EVP_AES_192_ECB[] = "AES-192-ECB";
  206. #endif
  207. #ifdef WOLFSSL_AES_256
  208. static const char EVP_AES_256_ECB[] = "AES-256-ECB";
  209. #endif
  210. #endif
  211. #endif
  212. #ifdef HAVE_ARIA
  213. #include <wolfssl/wolfcrypt/port/aria/aria-crypt.h>
  214. static const char EVP_ARIA_128_GCM[] = "ARIA-128-GCM";
  215. static const char EVP_ARIA_192_GCM[] = "ARIA-192-GCM";
  216. static const char EVP_ARIA_256_GCM[] = "ARIA-256-GCM";
  217. #endif
  218. #ifndef NO_DES3
  219. static const char EVP_DES_CBC[] = "DES-CBC";
  220. static const char EVP_DES_ECB[] = "DES-ECB";
  221. static const char EVP_DES_EDE3_CBC[] = "DES-EDE3-CBC";
  222. static const char EVP_DES_EDE3_ECB[] = "DES-EDE3-ECB";
  223. #endif
  224. #ifndef NO_RC4
  225. static const char EVP_ARC4[] = "ARC4";
  226. #endif
  227. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  228. static const char EVP_CHACHA20_POLY1305[] = "CHACHA20-POLY1305";
  229. #endif
  230. #ifdef HAVE_CHACHA
  231. static const char EVP_CHACHA20[] = "CHACHA20";
  232. #endif
  233. #ifdef WOLFSSL_SM4_ECB
  234. static const char EVP_SM4_ECB[] = "SM4-ECB";
  235. #endif /* WOLFSSL_SM4_ECB */
  236. #ifdef WOLFSSL_SM4_CBC
  237. static const char EVP_SM4_CBC[] = "SM4-CBC";
  238. #endif /* WOLFSSL_SM4_CBC */
  239. #ifdef WOLFSSL_SM4_CTR
  240. static const char EVP_SM4_CTR[] = "SM4-CTR";
  241. #endif /* WOLFSSL_SM4_CTR */
  242. #ifdef WOLFSSL_SM4_GCM
  243. static const char EVP_SM4_GCM[] = "SM4-GCM";
  244. #endif /* WOLFSSL_SM4_GCM */
  245. #ifdef WOLFSSL_SM4_CCM
  246. static const char EVP_SM4_CCM[] = "SM4-CCM";
  247. #endif /* WOLFSSL_SM4_CCM */
  248. static const char EVP_NULL[] = "NULL";
  249. #define EVP_CIPHER_TYPE_MATCHES(x, y) (XSTRCMP(x,y) == 0)
  250. #define EVP_PKEY_PRINT_LINE_WIDTH_MAX 80
  251. #define EVP_PKEY_PRINT_DIGITS_PER_LINE 15
  252. static unsigned int cipherType(const WOLFSSL_EVP_CIPHER *cipher);
  253. static enum wc_HashType EvpMd2MacType(const WOLFSSL_EVP_MD *md);
  254. /* Getter function for cipher key length
  255. *
  256. * c WOLFSSL_EVP_CIPHER structure to get key length from
  257. *
  258. * NOTE: OpenSSL_add_all_ciphers() should be called first before using this
  259. * function
  260. *
  261. * Returns size of key in bytes
  262. */
  263. int wolfSSL_EVP_Cipher_key_length(const WOLFSSL_EVP_CIPHER* c)
  264. {
  265. WOLFSSL_ENTER("wolfSSL_EVP_Cipher_key_length");
  266. if (c == NULL) {
  267. return 0;
  268. }
  269. switch (cipherType(c)) {
  270. #if !defined(NO_AES)
  271. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  272. case AES_128_CBC_TYPE: return 16;
  273. case AES_192_CBC_TYPE: return 24;
  274. case AES_256_CBC_TYPE: return 32;
  275. #endif
  276. #if defined(WOLFSSL_AES_CFB)
  277. case AES_128_CFB1_TYPE: return 16;
  278. case AES_192_CFB1_TYPE: return 24;
  279. case AES_256_CFB1_TYPE: return 32;
  280. case AES_128_CFB8_TYPE: return 16;
  281. case AES_192_CFB8_TYPE: return 24;
  282. case AES_256_CFB8_TYPE: return 32;
  283. case AES_128_CFB128_TYPE: return 16;
  284. case AES_192_CFB128_TYPE: return 24;
  285. case AES_256_CFB128_TYPE: return 32;
  286. #endif
  287. #if defined(WOLFSSL_AES_OFB)
  288. case AES_128_OFB_TYPE: return 16;
  289. case AES_192_OFB_TYPE: return 24;
  290. case AES_256_OFB_TYPE: return 32;
  291. #endif
  292. #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  293. /* Two keys for XTS. */
  294. case AES_128_XTS_TYPE: return 16 * 2;
  295. case AES_256_XTS_TYPE: return 32 * 2;
  296. #endif
  297. #if defined(HAVE_AESGCM)
  298. case AES_128_GCM_TYPE: return 16;
  299. case AES_192_GCM_TYPE: return 24;
  300. case AES_256_GCM_TYPE: return 32;
  301. #endif
  302. #if defined(HAVE_AESCCM)
  303. case AES_128_CCM_TYPE: return 16;
  304. case AES_192_CCM_TYPE: return 24;
  305. case AES_256_CCM_TYPE: return 32;
  306. #endif
  307. #if defined(WOLFSSL_AES_COUNTER)
  308. case AES_128_CTR_TYPE: return 16;
  309. case AES_192_CTR_TYPE: return 24;
  310. case AES_256_CTR_TYPE: return 32;
  311. #endif
  312. #if defined(HAVE_AES_ECB)
  313. case AES_128_ECB_TYPE: return 16;
  314. case AES_192_ECB_TYPE: return 24;
  315. case AES_256_ECB_TYPE: return 32;
  316. #endif
  317. #endif /* !NO_AES */
  318. #ifndef NO_DES3
  319. case DES_CBC_TYPE: return 8;
  320. case DES_EDE3_CBC_TYPE: return 24;
  321. case DES_ECB_TYPE: return 8;
  322. case DES_EDE3_ECB_TYPE: return 24;
  323. #endif
  324. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  325. case CHACHA20_POLY1305_TYPE: return 32;
  326. #endif
  327. #ifdef HAVE_CHACHA
  328. case CHACHA20_TYPE: return CHACHA_MAX_KEY_SZ;
  329. #endif
  330. #ifdef WOLFSSL_SM4_ECB
  331. case SM4_ECB_TYPE: return 16;
  332. #endif
  333. #ifdef WOLFSSL_SM4_CBC
  334. case SM4_CBC_TYPE: return 16;
  335. #endif
  336. #ifdef WOLFSSL_SM4_CTR
  337. case SM4_CTR_TYPE: return 16;
  338. #endif
  339. #ifdef WOLFSSL_SM4_GCM
  340. case SM4_GCM_TYPE: return 16;
  341. #endif
  342. #ifdef WOLFSSL_SM4_CCM
  343. case SM4_CCM_TYPE: return 16;
  344. #endif
  345. default:
  346. return 0;
  347. }
  348. }
  349. int wolfSSL_EVP_EncryptInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
  350. const WOLFSSL_EVP_CIPHER* type,
  351. const unsigned char* key,
  352. const unsigned char* iv)
  353. {
  354. return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 1);
  355. }
  356. int wolfSSL_EVP_EncryptInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx,
  357. const WOLFSSL_EVP_CIPHER* type,
  358. WOLFSSL_ENGINE *impl,
  359. const unsigned char* key,
  360. const unsigned char* iv)
  361. {
  362. (void) impl;
  363. return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 1);
  364. }
  365. int wolfSSL_EVP_DecryptInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
  366. const WOLFSSL_EVP_CIPHER* type,
  367. const unsigned char* key,
  368. const unsigned char* iv)
  369. {
  370. WOLFSSL_ENTER("wolfSSL_EVP_CipherInit");
  371. return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 0);
  372. }
  373. int wolfSSL_EVP_DecryptInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx,
  374. const WOLFSSL_EVP_CIPHER* type,
  375. WOLFSSL_ENGINE *impl,
  376. const unsigned char* key,
  377. const unsigned char* iv)
  378. {
  379. (void) impl;
  380. WOLFSSL_ENTER("wolfSSL_EVP_DecryptInit");
  381. return wolfSSL_EVP_CipherInit(ctx, type, (byte*)key, (byte*)iv, 0);
  382. }
  383. WOLFSSL_EVP_CIPHER_CTX *wolfSSL_EVP_CIPHER_CTX_new(void)
  384. {
  385. WOLFSSL_EVP_CIPHER_CTX *ctx = (WOLFSSL_EVP_CIPHER_CTX*)XMALLOC(sizeof(*ctx),
  386. NULL, DYNAMIC_TYPE_TMP_BUFFER);
  387. if (ctx) {
  388. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_new");
  389. wolfSSL_EVP_CIPHER_CTX_init(ctx);
  390. }
  391. return ctx;
  392. }
  393. void wolfSSL_EVP_CIPHER_CTX_free(WOLFSSL_EVP_CIPHER_CTX *ctx)
  394. {
  395. if (ctx) {
  396. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_free");
  397. wolfSSL_EVP_CIPHER_CTX_cleanup(ctx);
  398. XFREE(ctx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  399. }
  400. }
  401. int wolfSSL_EVP_CIPHER_CTX_reset(WOLFSSL_EVP_CIPHER_CTX *ctx)
  402. {
  403. int ret = WOLFSSL_FAILURE;
  404. if (ctx != NULL) {
  405. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_reset");
  406. wolfSSL_EVP_CIPHER_CTX_cleanup(ctx);
  407. ret = WOLFSSL_SUCCESS;
  408. }
  409. return ret;
  410. }
  411. unsigned long wolfSSL_EVP_CIPHER_CTX_mode(const WOLFSSL_EVP_CIPHER_CTX *ctx)
  412. {
  413. if (ctx == NULL) return 0;
  414. return ctx->flags & WOLFSSL_EVP_CIPH_MODE;
  415. }
  416. unsigned long wolfSSL_EVP_CIPHER_CTX_flags(const WOLFSSL_EVP_CIPHER_CTX *ctx)
  417. {
  418. if (ctx == NULL) return 0;
  419. return ctx->flags;
  420. }
  421. int wolfSSL_EVP_EncryptFinal(WOLFSSL_EVP_CIPHER_CTX *ctx,
  422. unsigned char *out, int *outl)
  423. {
  424. if (ctx && ctx->enc) {
  425. WOLFSSL_ENTER("wolfSSL_EVP_EncryptFinal");
  426. return wolfSSL_EVP_CipherFinal(ctx, out, outl);
  427. }
  428. else
  429. return WOLFSSL_FAILURE;
  430. }
  431. int wolfSSL_EVP_CipherInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx,
  432. const WOLFSSL_EVP_CIPHER* type,
  433. WOLFSSL_ENGINE *impl,
  434. const unsigned char* key,
  435. const unsigned char* iv,
  436. int enc)
  437. {
  438. (void)impl;
  439. return wolfSSL_EVP_CipherInit(ctx, type, key, iv, enc);
  440. }
  441. int wolfSSL_EVP_EncryptFinal_ex(WOLFSSL_EVP_CIPHER_CTX *ctx,
  442. unsigned char *out, int *outl)
  443. {
  444. if (ctx && ctx->enc) {
  445. WOLFSSL_ENTER("wolfSSL_EVP_EncryptFinal_ex");
  446. return wolfSSL_EVP_CipherFinal(ctx, out, outl);
  447. }
  448. else
  449. return WOLFSSL_FAILURE;
  450. }
  451. int wolfSSL_EVP_DecryptFinal(WOLFSSL_EVP_CIPHER_CTX *ctx,
  452. unsigned char *out, int *outl)
  453. {
  454. if (ctx && !ctx->enc) {
  455. WOLFSSL_ENTER("wolfSSL_EVP_DecryptFinal");
  456. return wolfSSL_EVP_CipherFinal(ctx, out, outl);
  457. }
  458. else {
  459. return WOLFSSL_FAILURE;
  460. }
  461. }
  462. int wolfSSL_EVP_DecryptFinal_ex(WOLFSSL_EVP_CIPHER_CTX *ctx,
  463. unsigned char *out, int *outl)
  464. {
  465. if (ctx && !ctx->enc) {
  466. WOLFSSL_ENTER("wolfSSL_EVP_DecryptFinal_ex");
  467. return wolfSSL_EVP_CipherFinal(ctx, out, outl);
  468. }
  469. else {
  470. return WOLFSSL_FAILURE;
  471. }
  472. }
  473. #ifdef DEBUG_WOLFSSL_EVP
  474. #define PRINT_BUF(b, sz) { int _i; for(_i=0; _i<(sz); _i++) { \
  475. printf("%02x(%c),", (b)[_i], (b)[_i]); if ((_i+1)%8==0)printf("\n");}}
  476. #else
  477. #define PRINT_BUF(b, sz) WC_DO_NOTHING
  478. #endif
  479. static int fillBuff(WOLFSSL_EVP_CIPHER_CTX *ctx, const unsigned char *in, int sz)
  480. {
  481. if (sz > 0) {
  482. int fill;
  483. if ((sz+ctx->bufUsed) > ctx->block_size) {
  484. fill = ctx->block_size - ctx->bufUsed;
  485. } else {
  486. fill = sz;
  487. }
  488. XMEMCPY(&(ctx->buf[ctx->bufUsed]), in, (size_t)fill);
  489. ctx->bufUsed += fill;
  490. return fill;
  491. } else return 0;
  492. }
  493. static int evpCipherBlock(WOLFSSL_EVP_CIPHER_CTX *ctx,
  494. unsigned char *out,
  495. const unsigned char *in, int inLen)
  496. {
  497. int ret = 0;
  498. word32 inl = (word32)inLen;
  499. switch (ctx->cipherType) {
  500. #if !defined(NO_AES)
  501. #if defined(HAVE_AES_CBC)
  502. case AES_128_CBC_TYPE:
  503. case AES_192_CBC_TYPE:
  504. case AES_256_CBC_TYPE:
  505. if (ctx->enc)
  506. ret = wc_AesCbcEncrypt(&ctx->cipher.aes, out, in, inl);
  507. else
  508. ret = wc_AesCbcDecrypt(&ctx->cipher.aes, out, in, inl);
  509. break;
  510. #endif
  511. #if defined(WOLFSSL_AES_COUNTER)
  512. case AES_128_CTR_TYPE:
  513. case AES_192_CTR_TYPE:
  514. case AES_256_CTR_TYPE:
  515. ret = wc_AesCtrEncrypt(&ctx->cipher.aes, out, in, inl);
  516. break;
  517. #endif
  518. #if defined(HAVE_AES_ECB)
  519. case AES_128_ECB_TYPE:
  520. case AES_192_ECB_TYPE:
  521. case AES_256_ECB_TYPE:
  522. if (ctx->enc)
  523. ret = wc_AesEcbEncrypt(&ctx->cipher.aes, out, in, inl);
  524. else
  525. ret = wc_AesEcbDecrypt(&ctx->cipher.aes, out, in, inl);
  526. break;
  527. #endif
  528. #if defined(WOLFSSL_AES_OFB)
  529. case AES_128_OFB_TYPE:
  530. case AES_192_OFB_TYPE:
  531. case AES_256_OFB_TYPE:
  532. if (ctx->enc)
  533. ret = wc_AesOfbEncrypt(&ctx->cipher.aes, out, in, inl);
  534. else
  535. ret = wc_AesOfbDecrypt(&ctx->cipher.aes, out, in, inl);
  536. break;
  537. #endif
  538. #if defined(WOLFSSL_AES_CFB)
  539. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  540. case AES_128_CFB1_TYPE:
  541. case AES_192_CFB1_TYPE:
  542. case AES_256_CFB1_TYPE:
  543. if (ctx->enc)
  544. ret = wc_AesCfb1Encrypt(&ctx->cipher.aes, out, in,
  545. inl * WOLFSSL_BIT_SIZE);
  546. else
  547. ret = wc_AesCfb1Decrypt(&ctx->cipher.aes, out, in,
  548. inl * WOLFSSL_BIT_SIZE);
  549. break;
  550. case AES_128_CFB8_TYPE:
  551. case AES_192_CFB8_TYPE:
  552. case AES_256_CFB8_TYPE:
  553. if (ctx->enc)
  554. ret = wc_AesCfb8Encrypt(&ctx->cipher.aes, out, in, inl);
  555. else
  556. ret = wc_AesCfb8Decrypt(&ctx->cipher.aes, out, in, inl);
  557. break;
  558. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  559. case AES_128_CFB128_TYPE:
  560. case AES_192_CFB128_TYPE:
  561. case AES_256_CFB128_TYPE:
  562. if (ctx->enc)
  563. ret = wc_AesCfbEncrypt(&ctx->cipher.aes, out, in, inl);
  564. else
  565. ret = wc_AesCfbDecrypt(&ctx->cipher.aes, out, in, inl);
  566. break;
  567. #endif
  568. #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  569. case AES_128_XTS_TYPE:
  570. case AES_256_XTS_TYPE:
  571. if (ctx->enc)
  572. ret = wc_AesXtsEncrypt(&ctx->cipher.xts, out, in, inl,
  573. ctx->iv, (word32)ctx->ivSz);
  574. else
  575. ret = wc_AesXtsDecrypt(&ctx->cipher.xts, out, in, inl,
  576. ctx->iv, (word32)ctx->ivSz);
  577. break;
  578. #endif
  579. #endif /* !NO_AES */
  580. #ifndef NO_DES3
  581. case DES_CBC_TYPE:
  582. if (ctx->enc)
  583. ret = wc_Des_CbcEncrypt(&ctx->cipher.des, out, in, inl);
  584. else
  585. ret = wc_Des_CbcDecrypt(&ctx->cipher.des, out, in, inl);
  586. break;
  587. case DES_EDE3_CBC_TYPE:
  588. if (ctx->enc)
  589. ret = wc_Des3_CbcEncrypt(&ctx->cipher.des3, out, in, inl);
  590. else
  591. ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, out, in, inl);
  592. break;
  593. #if defined(WOLFSSL_DES_ECB)
  594. case DES_ECB_TYPE:
  595. ret = wc_Des_EcbEncrypt(&ctx->cipher.des, out, in, inl);
  596. break;
  597. case DES_EDE3_ECB_TYPE:
  598. ret = wc_Des3_EcbEncrypt(&ctx->cipher.des3, out, in, inl);
  599. break;
  600. #endif
  601. #endif
  602. #ifndef NO_RC4
  603. case ARC4_TYPE:
  604. wc_Arc4Process(&ctx->cipher.arc4, out, in, inl);
  605. break;
  606. #endif
  607. #if defined(WOLFSSL_SM4_ECB)
  608. case SM4_ECB_TYPE:
  609. if (ctx->enc)
  610. wc_Sm4EcbEncrypt(&ctx->cipher.sm4, out, in, inl);
  611. else
  612. wc_Sm4EcbDecrypt(&ctx->cipher.sm4, out, in, inl);
  613. break;
  614. #endif
  615. #if defined(WOLFSSL_SM4_CBC)
  616. case SM4_CBC_TYPE:
  617. if (ctx->enc)
  618. wc_Sm4CbcEncrypt(&ctx->cipher.sm4, out, in, inl);
  619. else
  620. wc_Sm4CbcDecrypt(&ctx->cipher.sm4, out, in, inl);
  621. break;
  622. #endif
  623. #if defined(WOLFSSL_SM4_CTR)
  624. case SM4_CTR_TYPE:
  625. wc_Sm4CtrEncrypt(&ctx->cipher.sm4, out, in, inl);
  626. break;
  627. #endif
  628. default:
  629. ret = WOLFSSL_FAILURE;
  630. }
  631. (void)in;
  632. (void)inl;
  633. (void)out;
  634. return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  635. }
  636. #if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)
  637. #if defined(WOLFSSL_SM4_GCM) || !defined(WOLFSSL_AESGCM_STREAM)
  638. static int wolfSSL_EVP_CipherUpdate_GCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx,
  639. const unsigned char *in, int inl) {
  640. if (in && inl > 0) {
  641. byte* tmp = (byte*)XREALLOC(ctx->authIn,
  642. (size_t)(ctx->authInSz + inl), NULL, DYNAMIC_TYPE_OPENSSL);
  643. if (tmp) {
  644. ctx->authIn = tmp;
  645. XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl);
  646. ctx->authInSz += inl;
  647. }
  648. else {
  649. WOLFSSL_MSG("realloc error");
  650. return MEMORY_E;
  651. }
  652. }
  653. return 0;
  654. }
  655. #endif /* WOLFSSL_AESGCM_STREAM */
  656. static int wolfSSL_EVP_CipherUpdate_GCM(WOLFSSL_EVP_CIPHER_CTX *ctx,
  657. unsigned char *out, int *outl,
  658. const unsigned char *in, int inLen)
  659. {
  660. word32 inl = (word32)inLen;
  661. #if defined(WOLFSSL_SM4_GCM) || !defined(WOLFSSL_AESGCM_STREAM)
  662. #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_AESGCM_STREAM)
  663. if (ctx->cipherType == SM4_GCM_TYPE)
  664. #endif
  665. {
  666. int ret = 0;
  667. *outl = inl;
  668. if (out) {
  669. /* Buffer input for one-shot API */
  670. if (inl > 0) {
  671. byte* tmp;
  672. tmp = (byte*)XREALLOC(ctx->authBuffer,
  673. (size_t)(ctx->authBufferLen + inl), NULL,
  674. DYNAMIC_TYPE_OPENSSL);
  675. if (tmp) {
  676. XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl);
  677. ctx->authBufferLen += inl;
  678. ctx->authBuffer = tmp;
  679. *outl = 0;
  680. }
  681. else {
  682. ret = MEMORY_E;
  683. }
  684. }
  685. }
  686. else {
  687. ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, in, inl);
  688. }
  689. if (ret != 0) {
  690. *outl = 0;
  691. return WOLFSSL_FAILURE;
  692. }
  693. return WOLFSSL_SUCCESS;
  694. }
  695. #endif
  696. #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_AESGCM_STREAM)
  697. else
  698. #endif
  699. #if defined(WOLFSSL_AESGCM_STREAM)
  700. {
  701. int ret;
  702. /* When out is NULL then this is AAD. */
  703. if (out == NULL) {
  704. if (ctx->enc) {
  705. ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, NULL, NULL, 0,
  706. in, inl);
  707. }
  708. else {
  709. ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, NULL, NULL, 0,
  710. in, inl);
  711. }
  712. }
  713. /* When out is not NULL then this is plaintext/cipher text. */
  714. else {
  715. if (ctx->enc) {
  716. ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, out, in, inl,
  717. NULL, 0);
  718. }
  719. else {
  720. ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, out, in, inl,
  721. NULL, 0);
  722. }
  723. }
  724. *outl = (int)inl;
  725. if (ret == 0) {
  726. ret = WOLFSSL_SUCCESS;
  727. }
  728. else {
  729. ret = WOLFSSL_FAILURE;
  730. }
  731. return ret;
  732. }
  733. #endif /* WOLFSSL_AESGCM_STREAM */
  734. }
  735. #endif /* HAVE_AESGCM || WOLFSSL_SM4_GCM */
  736. #if defined(HAVE_AESCCM) || defined(WOLFSSL_SM4_CCM)
  737. static int wolfSSL_EVP_CipherUpdate_CCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx,
  738. const unsigned char *in, int inl) {
  739. if (in && inl > 0) {
  740. byte* tmp = (byte*)XREALLOC(ctx->authIn,
  741. (size_t)(ctx->authInSz + inl), NULL, DYNAMIC_TYPE_OPENSSL);
  742. if (tmp) {
  743. ctx->authIn = tmp;
  744. XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl);
  745. ctx->authInSz += inl;
  746. }
  747. else {
  748. WOLFSSL_MSG("realloc error");
  749. return MEMORY_E;
  750. }
  751. }
  752. return 0;
  753. }
  754. static int wolfSSL_EVP_CipherUpdate_CCM(WOLFSSL_EVP_CIPHER_CTX *ctx,
  755. unsigned char *out, int *outl,
  756. const unsigned char *in, int inl)
  757. {
  758. int ret = 0;
  759. *outl = inl;
  760. if (out) {
  761. /* Buffer input for one-shot API */
  762. if (inl > 0) {
  763. byte* tmp;
  764. tmp = (byte*)XREALLOC(ctx->authBuffer,
  765. (size_t)(ctx->authBufferLen + inl), NULL,
  766. DYNAMIC_TYPE_OPENSSL);
  767. if (tmp) {
  768. XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl);
  769. ctx->authBufferLen += inl;
  770. ctx->authBuffer = tmp;
  771. *outl = 0;
  772. }
  773. else {
  774. ret = MEMORY_E;
  775. }
  776. }
  777. }
  778. else {
  779. ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, in, inl);
  780. }
  781. if (ret != 0) {
  782. *outl = 0;
  783. return WOLFSSL_FAILURE;
  784. }
  785. return WOLFSSL_SUCCESS;
  786. }
  787. #endif /* HAVE_AESCCM || WOLFSSL_SM4_CCM */
  788. #if defined(HAVE_ARIA)
  789. static int wolfSSL_EVP_CipherUpdate_AriaGCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx,
  790. const unsigned char *in, int inl)
  791. {
  792. if (in && inl > 0) {
  793. byte* tmp = (byte*)XREALLOC(ctx->authIn,
  794. (size_t)ctx->authInSz + inl, NULL, DYNAMIC_TYPE_OPENSSL);
  795. if (tmp) {
  796. ctx->authIn = tmp;
  797. XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl);
  798. ctx->authInSz += inl;
  799. }
  800. else {
  801. WOLFSSL_MSG("realloc error");
  802. return MEMORY_E;
  803. }
  804. }
  805. return 0;
  806. }
  807. static int wolfSSL_EVP_CipherUpdate_AriaGCM(WOLFSSL_EVP_CIPHER_CTX *ctx,
  808. unsigned char *out, int *outl,
  809. const unsigned char *in, int inl)
  810. {
  811. int ret = 0;
  812. *outl = inl;
  813. if (out) {
  814. /* Buffer input for one-shot API */
  815. if (inl > 0) {
  816. byte* tmp;
  817. int size = ctx->authBufferLen + inl;
  818. if (ctx->enc == 0) { /* Append extra space for the tag */
  819. size = WC_ARIA_GCM_GET_CIPHERTEXT_SIZE(size);
  820. }
  821. tmp = (byte*)XREALLOC(ctx->authBuffer,
  822. (size_t)size, NULL,
  823. DYNAMIC_TYPE_OPENSSL);
  824. if (tmp) {
  825. XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl);
  826. ctx->authBufferLen += inl;
  827. ctx->authBuffer = tmp;
  828. *outl = 0;
  829. }
  830. else {
  831. ret = MEMORY_E;
  832. }
  833. }
  834. }
  835. else {
  836. ret = wolfSSL_EVP_CipherUpdate_AriaGCM_AAD(ctx, in, inl);
  837. }
  838. if (ret != 0) {
  839. *outl = 0;
  840. return WOLFSSL_FAILURE;
  841. }
  842. return WOLFSSL_SUCCESS;
  843. }
  844. #endif /* HAVE_ARIA */
  845. /* returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
  846. int wolfSSL_EVP_CipherUpdate(WOLFSSL_EVP_CIPHER_CTX *ctx,
  847. unsigned char *out, int *outl,
  848. const unsigned char *in, int inl)
  849. {
  850. int blocks;
  851. WOLFSSL_ENTER("wolfSSL_EVP_CipherUpdate");
  852. if ((ctx == NULL) || (outl == NULL)) {
  853. WOLFSSL_MSG("Bad argument");
  854. return WOLFSSL_FAILURE;
  855. }
  856. *outl = 0;
  857. if ((inl == 0) && (in == NULL)) {
  858. /* Nothing to do in this case. Just return. */
  859. return WOLFSSL_SUCCESS;
  860. }
  861. if ((inl < 0) || (in == NULL)) {
  862. WOLFSSL_MSG("Bad argument");
  863. return WOLFSSL_FAILURE;
  864. }
  865. switch (ctx->cipherType) {
  866. #if !defined(NO_AES) && defined(HAVE_AESGCM)
  867. case AES_128_GCM_TYPE:
  868. case AES_192_GCM_TYPE:
  869. case AES_256_GCM_TYPE:
  870. /* if out == NULL, in/inl contains the additional auth data */
  871. return wolfSSL_EVP_CipherUpdate_GCM(ctx, out, outl, in, inl);
  872. #endif /* !defined(NO_AES) && defined(HAVE_AESGCM) */
  873. #if !defined(NO_AES) && defined(HAVE_AESCCM)
  874. case AES_128_CCM_TYPE:
  875. case AES_192_CCM_TYPE:
  876. case AES_256_CCM_TYPE:
  877. /* if out == NULL, in/inl contains the
  878. * additional auth data */
  879. return wolfSSL_EVP_CipherUpdate_CCM(ctx, out, outl, in, inl);
  880. #endif /* !defined(NO_AES) && defined(HAVE_AESCCM) */
  881. #if defined(HAVE_ARIA)
  882. case ARIA_128_GCM_TYPE:
  883. case ARIA_192_GCM_TYPE:
  884. case ARIA_256_GCM_TYPE:
  885. /* if out == NULL, in/inl contains the additional auth data */
  886. return wolfSSL_EVP_CipherUpdate_AriaGCM(ctx, out, outl, in, inl);
  887. #endif /* defined(HAVE_ARIA) */
  888. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  889. case CHACHA20_POLY1305_TYPE:
  890. if (out == NULL) {
  891. if (wc_ChaCha20Poly1305_UpdateAad(&ctx->cipher.chachaPoly, in,
  892. (word32)inl) != 0) {
  893. WOLFSSL_MSG("wc_ChaCha20Poly1305_UpdateAad failed");
  894. return WOLFSSL_FAILURE;
  895. }
  896. else {
  897. *outl = inl;
  898. return WOLFSSL_SUCCESS;
  899. }
  900. }
  901. else {
  902. if (wc_ChaCha20Poly1305_UpdateData(&ctx->cipher.chachaPoly, in,
  903. out, (word32)inl) != 0) {
  904. WOLFSSL_MSG("wc_ChaCha20Poly1305_UpdateData failed");
  905. return WOLFSSL_FAILURE;
  906. }
  907. else {
  908. *outl = inl;
  909. return WOLFSSL_SUCCESS;
  910. }
  911. }
  912. #endif
  913. #ifdef HAVE_CHACHA
  914. case CHACHA20_TYPE:
  915. if (wc_Chacha_Process(&ctx->cipher.chacha, out, in, (word32)inl) !=
  916. 0) {
  917. WOLFSSL_MSG("wc_ChaCha_Process failed");
  918. return WOLFSSL_FAILURE;
  919. }
  920. *outl = inl;
  921. return WOLFSSL_SUCCESS;
  922. #endif
  923. #ifdef WOLFSSL_SM4_GCM
  924. case SM4_GCM_TYPE:
  925. /* if out == NULL, in/inl contains the additional auth data */
  926. return wolfSSL_EVP_CipherUpdate_GCM(ctx, out, outl, in, inl);
  927. #endif
  928. #ifdef WOLFSSL_SM4_CCM
  929. case SM4_CCM_TYPE:
  930. /* if out == NULL, in/inl contains the
  931. * additional auth data */
  932. return wolfSSL_EVP_CipherUpdate_CCM(ctx, out, outl, in, inl);
  933. #endif
  934. default:
  935. /* fall-through */
  936. break;
  937. }
  938. if (out == NULL) {
  939. return WOLFSSL_FAILURE;
  940. }
  941. /* if(inl == 0)wolfSSL_EVP_CipherUpdate_GCM to get tag */
  942. if (inl == 0) {
  943. return WOLFSSL_SUCCESS;
  944. }
  945. if (ctx->bufUsed > 0) { /* concatenate them if there is anything */
  946. int fill = fillBuff(ctx, in, inl);
  947. inl -= fill;
  948. in += fill;
  949. }
  950. /* check if the buff is full, and if so flash it out */
  951. if (ctx->bufUsed == ctx->block_size) {
  952. byte* output = out;
  953. /* During decryption we save the last block to check padding on Final.
  954. * Update the last block stored if one has already been stored */
  955. if (ctx->enc == 0) {
  956. if (ctx->lastUsed == 1) {
  957. XMEMCPY(out, ctx->lastBlock, (size_t)ctx->block_size);
  958. *outl+= ctx->block_size;
  959. out += ctx->block_size;
  960. }
  961. output = ctx->lastBlock; /* redirect output to last block buffer */
  962. ctx->lastUsed = 1;
  963. }
  964. PRINT_BUF(ctx->buf, ctx->block_size);
  965. if (evpCipherBlock(ctx, output, ctx->buf, ctx->block_size) == 0) {
  966. return WOLFSSL_FAILURE;
  967. }
  968. PRINT_BUF(out, ctx->block_size);
  969. ctx->bufUsed = 0;
  970. /* if doing encryption update the new output block, decryption will
  971. * always have the last block saved for when Final is called */
  972. if ((ctx->enc != 0)) {
  973. *outl+= ctx->block_size;
  974. out += ctx->block_size;
  975. }
  976. }
  977. blocks = inl / ctx->block_size;
  978. if (blocks > 0) {
  979. /* During decryption we save the last block to check padding on Final.
  980. * Update the last block stored if one has already been stored */
  981. if ((ctx->enc == 0) && (ctx->lastUsed == 1)) {
  982. PRINT_BUF(ctx->lastBlock, ctx->block_size);
  983. XMEMCPY(out, ctx->lastBlock, (size_t)ctx->block_size);
  984. *outl += ctx->block_size;
  985. out += ctx->block_size;
  986. ctx->lastUsed = 0;
  987. }
  988. /* process blocks */
  989. if (evpCipherBlock(ctx, out, in, blocks * ctx->block_size) == 0) {
  990. return WOLFSSL_FAILURE;
  991. }
  992. PRINT_BUF(in, ctx->block_size*blocks);
  993. PRINT_BUF(out,ctx->block_size*blocks);
  994. inl -= ctx->block_size * blocks;
  995. in += ctx->block_size * blocks;
  996. if (ctx->enc == 0) {
  997. if ((ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) ||
  998. (ctx->block_size == 1)) {
  999. ctx->lastUsed = 0;
  1000. *outl += ctx->block_size * blocks;
  1001. } else {
  1002. /* in the case of decryption and padding, store the last block
  1003. * here in order to verify the padding when Final is called */
  1004. if (inl == 0) { /* if not 0 then we know leftovers are checked*/
  1005. ctx->lastUsed = 1;
  1006. blocks = blocks - 1; /* save last block to check padding in
  1007. * EVP_CipherFinal call */
  1008. XMEMCPY(ctx->lastBlock, &out[ctx->block_size * blocks],
  1009. (size_t)ctx->block_size);
  1010. }
  1011. *outl += ctx->block_size * blocks;
  1012. }
  1013. } else {
  1014. *outl += ctx->block_size * blocks;
  1015. }
  1016. }
  1017. if (inl > 0) {
  1018. /* put fraction into buff */
  1019. fillBuff(ctx, in, inl);
  1020. /* no increase of outl */
  1021. }
  1022. (void)out; /* silence warning in case not read */
  1023. return WOLFSSL_SUCCESS;
  1024. }
  1025. static void padBlock(WOLFSSL_EVP_CIPHER_CTX *ctx)
  1026. {
  1027. int i;
  1028. for (i = ctx->bufUsed; i < ctx->block_size; i++)
  1029. ctx->buf[i] = (byte)(ctx->block_size - ctx->bufUsed);
  1030. }
  1031. static int checkPad(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *buff)
  1032. {
  1033. int i;
  1034. int n;
  1035. n = buff[ctx->block_size-1];
  1036. if (n > ctx->block_size) return -1;
  1037. for (i = 0; i < n; i++) {
  1038. if (buff[ctx->block_size-i-1] != n)
  1039. return -1;
  1040. }
  1041. return ctx->block_size - n;
  1042. }
  1043. #if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
  1044. defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
  1045. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || FIPS_VERSION_GE(2,0))
  1046. static WC_INLINE void IncCtr(byte* ctr, word32 ctrSz)
  1047. {
  1048. int i;
  1049. for (i = (int)ctrSz-1; i >= 0; i--) {
  1050. if (++ctr[i])
  1051. break;
  1052. }
  1053. }
  1054. #endif
  1055. int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *out,
  1056. int *outl)
  1057. {
  1058. int ret = WOLFSSL_SUCCESS;
  1059. if (!ctx || !outl)
  1060. return WOLFSSL_FAILURE;
  1061. WOLFSSL_ENTER("wolfSSL_EVP_CipherFinal");
  1062. switch (ctx->cipherType) {
  1063. #if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  1064. || FIPS_VERSION_GE(2,0))
  1065. case AES_128_GCM_TYPE:
  1066. case AES_192_GCM_TYPE:
  1067. case AES_256_GCM_TYPE:
  1068. #ifndef WOLFSSL_AESGCM_STREAM
  1069. if ((ctx->authBuffer && ctx->authBufferLen > 0)
  1070. || (ctx->authBufferLen == 0)) {
  1071. if (ctx->enc)
  1072. ret = wc_AesGcmEncrypt(&ctx->cipher.aes, out,
  1073. ctx->authBuffer, ctx->authBufferLen,
  1074. ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
  1075. ctx->authIn, ctx->authInSz);
  1076. else
  1077. ret = wc_AesGcmDecrypt(&ctx->cipher.aes, out,
  1078. ctx->authBuffer, ctx->authBufferLen,
  1079. ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
  1080. ctx->authIn, ctx->authInSz);
  1081. if (ret == 0) {
  1082. ret = WOLFSSL_SUCCESS;
  1083. *outl = ctx->authBufferLen;
  1084. }
  1085. else {
  1086. ret = WOLFSSL_FAILURE;
  1087. *outl = 0;
  1088. }
  1089. XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
  1090. ctx->authBuffer = NULL;
  1091. ctx->authBufferLen = 0;
  1092. if (ctx->authIncIv) {
  1093. IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
  1094. ctx->authIncIv = 0;
  1095. }
  1096. }
  1097. else {
  1098. *outl = 0;
  1099. }
  1100. #else
  1101. /* No data to return - all handled in Update. */
  1102. *outl = 0;
  1103. if (ctx->enc) {
  1104. ret = wc_AesGcmEncryptFinal(&ctx->cipher.aes, ctx->authTag,
  1105. (word32)ctx->authTagSz);
  1106. }
  1107. else {
  1108. ret = wc_AesGcmDecryptFinal(&ctx->cipher.aes, ctx->authTag,
  1109. (word32)ctx->authTagSz);
  1110. if (ctx->authIncIv) {
  1111. IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
  1112. }
  1113. }
  1114. if (ret == 0)
  1115. ret = WOLFSSL_SUCCESS;
  1116. else
  1117. ret = WOLFSSL_FAILURE;
  1118. /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */
  1119. if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0,
  1120. (byte*)ctx->cipher.aes.reg,
  1121. (word32)ctx->ivSz) != 0)
  1122. {
  1123. WOLFSSL_MSG("wc_AesGcmInit failed");
  1124. ret = WOLFSSL_FAILURE;
  1125. }
  1126. #endif /* WOLFSSL_AESGCM_STREAM */
  1127. if (ret == WOLFSSL_SUCCESS) {
  1128. if (ctx->authIncIv) {
  1129. ctx->authIncIv = 0;
  1130. }
  1131. else {
  1132. /* Clear IV, since IV reuse is not recommended for AES GCM. */
  1133. XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE);
  1134. }
  1135. if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
  1136. ret = WOLFSSL_FAILURE;
  1137. }
  1138. }
  1139. break;
  1140. #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  1141. * HAVE_FIPS_VERSION >= 2 */
  1142. #if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  1143. || FIPS_VERSION_GE(2,0))
  1144. case AES_128_CCM_TYPE:
  1145. case AES_192_CCM_TYPE:
  1146. case AES_256_CCM_TYPE:
  1147. if ((ctx->authBuffer && ctx->authBufferLen > 0)
  1148. || (ctx->authBufferLen == 0)) {
  1149. if (ctx->enc) {
  1150. ret = wc_AesCcmEncrypt(&ctx->cipher.aes, out,
  1151. ctx->authBuffer, (word32)ctx->authBufferLen,
  1152. ctx->iv, (word32)ctx->ivSz, ctx->authTag,
  1153. (word32)ctx->authTagSz, ctx->authIn,
  1154. (word32)ctx->authInSz);
  1155. }
  1156. else {
  1157. ret = wc_AesCcmDecrypt(&ctx->cipher.aes, out,
  1158. ctx->authBuffer, (word32)ctx->authBufferLen,
  1159. ctx->iv, (word32)ctx->ivSz, ctx->authTag,
  1160. (word32)ctx->authTagSz, ctx->authIn,
  1161. (word32)ctx->authInSz);
  1162. }
  1163. if (ret == 0) {
  1164. ret = WOLFSSL_SUCCESS;
  1165. *outl = ctx->authBufferLen;
  1166. }
  1167. else {
  1168. ret = WOLFSSL_FAILURE;
  1169. *outl = 0;
  1170. }
  1171. XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
  1172. ctx->authBuffer = NULL;
  1173. ctx->authBufferLen = 0;
  1174. if (ctx->authIncIv) {
  1175. IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz);
  1176. ctx->authIncIv = 0;
  1177. }
  1178. }
  1179. else {
  1180. *outl = 0;
  1181. }
  1182. if (ret == WOLFSSL_SUCCESS) {
  1183. if (ctx->authIncIv) {
  1184. ctx->authIncIv = 0;
  1185. }
  1186. else {
  1187. /* Clear IV, since IV reuse is not recommended
  1188. * for AES CCM. */
  1189. XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE);
  1190. }
  1191. if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
  1192. ret = WOLFSSL_FAILURE;
  1193. }
  1194. }
  1195. break;
  1196. #endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  1197. * HAVE_FIPS_VERSION >= 2 */
  1198. #if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  1199. || FIPS_VERSION_GE(2,0))
  1200. case ARIA_128_GCM_TYPE:
  1201. case ARIA_192_GCM_TYPE:
  1202. case ARIA_256_GCM_TYPE:
  1203. if ((ctx->authBuffer && ctx->authBufferLen > 0)
  1204. || (ctx->authBufferLen == 0)) {
  1205. if (ctx->enc)
  1206. ret = wc_AriaEncrypt(&ctx->cipher.aria, out,
  1207. ctx->authBuffer, ctx->authBufferLen,
  1208. ctx->iv, ctx->ivSz, ctx->authIn, ctx->authInSz,
  1209. ctx->authTag, ctx->authTagSz);
  1210. else
  1211. ret = wc_AriaDecrypt(&ctx->cipher.aria, out,
  1212. ctx->authBuffer, ctx->authBufferLen,
  1213. ctx->iv, ctx->ivSz, ctx->authIn, ctx->authInSz,
  1214. ctx->authTag, ctx->authTagSz);
  1215. if (ret == 0) {
  1216. ret = WOLFSSL_SUCCESS;
  1217. *outl = ctx->authBufferLen;
  1218. }
  1219. else {
  1220. ret = WOLFSSL_FAILURE;
  1221. *outl = 0;
  1222. }
  1223. XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
  1224. ctx->authBuffer = NULL;
  1225. ctx->authBufferLen = 0;
  1226. if (ctx->authIncIv) {
  1227. IncCtr((byte*)ctx->cipher.aria.nonce,
  1228. ctx->cipher.aria.nonceSz);
  1229. ctx->authIncIv = 0;
  1230. }
  1231. }
  1232. else {
  1233. *outl = 0;
  1234. }
  1235. if (ret == WOLFSSL_SUCCESS) {
  1236. if (ctx->authIncIv) {
  1237. ctx->authIncIv = 0;
  1238. }
  1239. else {
  1240. /* Clear IV, since IV reuse is not recommended for AES GCM. */
  1241. XMEMSET(ctx->iv, 0, ARIA_BLOCK_SIZE);
  1242. }
  1243. if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
  1244. ret = WOLFSSL_FAILURE;
  1245. }
  1246. }
  1247. break;
  1248. #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  1249. * HAVE_FIPS_VERSION >= 2 */
  1250. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  1251. case CHACHA20_POLY1305_TYPE:
  1252. if (wc_ChaCha20Poly1305_Final(&ctx->cipher.chachaPoly,
  1253. ctx->authTag) != 0) {
  1254. WOLFSSL_MSG("wc_ChaCha20Poly1305_Final failed");
  1255. return WOLFSSL_FAILURE;
  1256. }
  1257. else {
  1258. *outl = 0;
  1259. return WOLFSSL_SUCCESS;
  1260. }
  1261. break;
  1262. #endif
  1263. #ifdef WOLFSSL_SM4_GCM
  1264. case SM4_GCM_TYPE:
  1265. if ((ctx->authBuffer && ctx->authBufferLen > 0) ||
  1266. (ctx->authBufferLen == 0)) {
  1267. if (ctx->enc)
  1268. ret = wc_Sm4GcmEncrypt(&ctx->cipher.sm4, out,
  1269. ctx->authBuffer, ctx->authBufferLen,
  1270. ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
  1271. ctx->authIn, ctx->authInSz);
  1272. else
  1273. ret = wc_Sm4GcmDecrypt(&ctx->cipher.sm4, out,
  1274. ctx->authBuffer, ctx->authBufferLen,
  1275. ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
  1276. ctx->authIn, ctx->authInSz);
  1277. if (ret == 0) {
  1278. ret = WOLFSSL_SUCCESS;
  1279. *outl = ctx->authBufferLen;
  1280. }
  1281. else {
  1282. ret = WOLFSSL_FAILURE;
  1283. *outl = 0;
  1284. }
  1285. XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
  1286. ctx->authBuffer = NULL;
  1287. ctx->authBufferLen = 0;
  1288. if (ctx->authIncIv) {
  1289. IncCtr((byte*)ctx->cipher.sm4.iv, ctx->cipher.sm4.nonceSz);
  1290. ctx->authIncIv = 0;
  1291. }
  1292. }
  1293. else {
  1294. *outl = 0;
  1295. }
  1296. if (ret == WOLFSSL_SUCCESS) {
  1297. if (ctx->authIncIv) {
  1298. ctx->authIncIv = 0;
  1299. }
  1300. else {
  1301. /* Clear IV, since IV reuse is not recommended for SM4 GCM.
  1302. */
  1303. XMEMSET(ctx->iv, 0, SM4_BLOCK_SIZE);
  1304. }
  1305. if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
  1306. ret = WOLFSSL_FAILURE;
  1307. }
  1308. }
  1309. break;
  1310. #endif
  1311. #ifdef WOLFSSL_SM4_CCM
  1312. case SM4_CCM_TYPE:
  1313. if ((ctx->authBuffer && ctx->authBufferLen > 0) ||
  1314. (ctx->authBufferLen == 0)) {
  1315. if (ctx->enc)
  1316. ret = wc_Sm4CcmEncrypt(&ctx->cipher.sm4, out,
  1317. ctx->authBuffer, ctx->authBufferLen,
  1318. ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
  1319. ctx->authIn, ctx->authInSz);
  1320. else
  1321. ret = wc_Sm4CcmDecrypt(&ctx->cipher.sm4, out,
  1322. ctx->authBuffer, ctx->authBufferLen,
  1323. ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz,
  1324. ctx->authIn, ctx->authInSz);
  1325. if (ret == 0) {
  1326. ret = WOLFSSL_SUCCESS;
  1327. *outl = ctx->authBufferLen;
  1328. }
  1329. else {
  1330. ret = WOLFSSL_FAILURE;
  1331. *outl = 0;
  1332. }
  1333. XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
  1334. ctx->authBuffer = NULL;
  1335. ctx->authBufferLen = 0;
  1336. if (ctx->authIncIv) {
  1337. IncCtr((byte*)ctx->cipher.sm4.iv, ctx->cipher.sm4.nonceSz);
  1338. ctx->authIncIv = 0;
  1339. }
  1340. }
  1341. else {
  1342. *outl = 0;
  1343. }
  1344. if (ret == WOLFSSL_SUCCESS) {
  1345. if (ctx->authIncIv) {
  1346. ctx->authIncIv = 0;
  1347. }
  1348. else {
  1349. /* Clear IV, since IV reuse is not recommended
  1350. * for SM4 CCM. */
  1351. XMEMSET(ctx->iv, 0, SM4_BLOCK_SIZE);
  1352. }
  1353. if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
  1354. ret = WOLFSSL_FAILURE;
  1355. }
  1356. }
  1357. break;
  1358. #endif
  1359. default:
  1360. if (!out)
  1361. return WOLFSSL_FAILURE;
  1362. if (ctx->flags & WOLFSSL_EVP_CIPH_NO_PADDING) {
  1363. if (ctx->bufUsed != 0) return WOLFSSL_FAILURE;
  1364. *outl = 0;
  1365. }
  1366. else if (ctx->enc) {
  1367. if (ctx->block_size == 1) {
  1368. *outl = 0;
  1369. }
  1370. else if ((ctx->bufUsed >= 0) && (ctx->block_size != 1)) {
  1371. padBlock(ctx);
  1372. PRINT_BUF(ctx->buf, ctx->block_size);
  1373. if (evpCipherBlock(ctx, out, ctx->buf, ctx->block_size) == 0) {
  1374. WOLFSSL_MSG("Final Cipher Block failed");
  1375. ret = WOLFSSL_FAILURE;
  1376. }
  1377. else {
  1378. PRINT_BUF(out, ctx->block_size);
  1379. *outl = ctx->block_size;
  1380. }
  1381. }
  1382. }
  1383. else {
  1384. if (ctx->block_size == 1) {
  1385. *outl = 0;
  1386. }
  1387. else if ((ctx->bufUsed % ctx->block_size) != 0) {
  1388. *outl = 0;
  1389. /* not enough padding for decrypt */
  1390. WOLFSSL_MSG("Final Cipher Block not enough padding");
  1391. ret = WOLFSSL_FAILURE;
  1392. }
  1393. else if (ctx->lastUsed) {
  1394. int fl;
  1395. PRINT_BUF(ctx->lastBlock, ctx->block_size);
  1396. if ((fl = checkPad(ctx, ctx->lastBlock)) >= 0) {
  1397. XMEMCPY(out, ctx->lastBlock, (size_t)fl);
  1398. *outl = fl;
  1399. if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
  1400. /* return error in cases where the block length is
  1401. * incorrect */
  1402. WOLFSSL_MSG("Final Cipher Block bad length");
  1403. ret = WOLFSSL_FAILURE;
  1404. }
  1405. }
  1406. else {
  1407. ret = WOLFSSL_FAILURE;
  1408. }
  1409. }
  1410. else if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
  1411. /* return error in cases where the block length is
  1412. * incorrect */
  1413. ret = WOLFSSL_FAILURE;
  1414. }
  1415. }
  1416. break;
  1417. }
  1418. if (ret == WOLFSSL_SUCCESS) {
  1419. #if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
  1420. defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
  1421. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  1422. || FIPS_VERSION_GE(2,0))
  1423. byte tmp = 0;
  1424. /*
  1425. * This flag needs to retain its value between wolfSSL_EVP_CipherFinal
  1426. * calls. wolfSSL_EVP_CipherInit will clear it, so we save and restore
  1427. * it here.
  1428. */
  1429. if (FALSE
  1430. #ifdef HAVE_AESGCM
  1431. || ctx->cipherType == AES_128_GCM_TYPE ||
  1432. ctx->cipherType == AES_192_GCM_TYPE ||
  1433. ctx->cipherType == AES_256_GCM_TYPE
  1434. #endif
  1435. #ifdef HAVE_AESCCM
  1436. || ctx->cipherType == AES_128_CCM_TYPE ||
  1437. ctx->cipherType == AES_192_CCM_TYPE ||
  1438. ctx->cipherType == AES_256_CCM_TYPE
  1439. #endif
  1440. #ifdef WOLFSSL_SM4_GCM
  1441. || ctx->cipherType == SM4_GCM_TYPE
  1442. #endif
  1443. #ifdef WOLFSSL_SM4_CCM
  1444. || ctx->cipherType == SM4_CCM_TYPE
  1445. #endif
  1446. ) {
  1447. tmp = ctx->authIvGenEnable;
  1448. }
  1449. #endif
  1450. /* reset cipher state after final */
  1451. ret = wolfSSL_EVP_CipherInit(ctx, NULL, NULL, NULL, -1);
  1452. #if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
  1453. defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
  1454. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || FIPS_VERSION_GE(2,0))
  1455. if (FALSE
  1456. #ifdef HAVE_AESGCM
  1457. || ctx->cipherType == AES_128_GCM_TYPE ||
  1458. ctx->cipherType == AES_192_GCM_TYPE ||
  1459. ctx->cipherType == AES_256_GCM_TYPE
  1460. #endif
  1461. #ifdef HAVE_AESCCM
  1462. || ctx->cipherType == AES_128_CCM_TYPE ||
  1463. ctx->cipherType == AES_192_CCM_TYPE ||
  1464. ctx->cipherType == AES_256_CCM_TYPE
  1465. #endif
  1466. #ifdef WOLFSSL_SM4_GCM
  1467. || ctx->cipherType == SM4_GCM_TYPE
  1468. #endif
  1469. #ifdef WOLFSSL_SM4_CCM
  1470. || ctx->cipherType == SM4_CCM_TYPE
  1471. #endif
  1472. ) {
  1473. ctx->authIvGenEnable = (tmp == 1);
  1474. }
  1475. #endif
  1476. }
  1477. return ret;
  1478. }
  1479. #ifdef WOLFSSL_EVP_DECRYPT_LEGACY
  1480. /* This is a version of DecryptFinal to work with data encrypted with
  1481. * wolfSSL_EVP_EncryptFinal() with the broken padding. (pre-v3.12.0)
  1482. * Only call this after wolfSSL_EVP_CipherFinal() fails on a decrypt.
  1483. * Note, you don't know if the padding is good or bad with the old
  1484. * encrypt, but it is likely to be or bad. It will update the output
  1485. * length with the block_size so the last block is still captured. */
  1486. int wolfSSL_EVP_DecryptFinal_legacy(WOLFSSL_EVP_CIPHER_CTX *ctx,
  1487. unsigned char *out, int *outl)
  1488. {
  1489. int fl;
  1490. if (ctx == NULL || out == NULL || outl == NULL)
  1491. return BAD_FUNC_ARG;
  1492. WOLFSSL_ENTER("wolfSSL_EVP_DecryptFinal_legacy");
  1493. if (ctx->block_size == 1) {
  1494. *outl = 0;
  1495. return WOLFSSL_SUCCESS;
  1496. }
  1497. if ((ctx->bufUsed % ctx->block_size) != 0) {
  1498. *outl = 0;
  1499. /* not enough padding for decrypt */
  1500. return WOLFSSL_FAILURE;
  1501. }
  1502. /* The original behavior of CipherFinal() was like it is now,
  1503. * but checkPad would return 0 in case of a bad pad. It would
  1504. * treat the pad as 0, and leave the data in the output buffer,
  1505. * and not try to copy anything. This converts checkPad's -1 error
  1506. * code to block_size.
  1507. */
  1508. if (ctx->lastUsed) {
  1509. PRINT_BUF(ctx->lastBlock, ctx->block_size);
  1510. if ((fl = checkPad(ctx, ctx->lastBlock)) < 0) {
  1511. fl = ctx->block_size;
  1512. }
  1513. else {
  1514. XMEMCPY(out, ctx->lastBlock, (size_t)fl);
  1515. }
  1516. *outl = fl;
  1517. }
  1518. /* return error in cases where the block length is incorrect */
  1519. if (ctx->lastUsed == 0 && ctx->bufUsed == 0) {
  1520. return WOLFSSL_FAILURE;
  1521. }
  1522. return WOLFSSL_SUCCESS;
  1523. }
  1524. #endif
  1525. int wolfSSL_EVP_CIPHER_CTX_block_size(const WOLFSSL_EVP_CIPHER_CTX *ctx)
  1526. {
  1527. if (ctx == NULL) return BAD_FUNC_ARG;
  1528. switch (ctx->cipherType) {
  1529. #if !defined(NO_AES) || !defined(NO_DES3) || defined(WOLFSSL_SM4)
  1530. #if !defined(NO_AES)
  1531. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  1532. case AES_128_CBC_TYPE:
  1533. case AES_192_CBC_TYPE:
  1534. case AES_256_CBC_TYPE:
  1535. #endif
  1536. #if defined(HAVE_AESGCM)
  1537. case AES_128_GCM_TYPE:
  1538. case AES_192_GCM_TYPE:
  1539. case AES_256_GCM_TYPE:
  1540. #endif
  1541. #if defined(HAVE_AESCCM)
  1542. case AES_128_CCM_TYPE:
  1543. case AES_192_CCM_TYPE:
  1544. case AES_256_CCM_TYPE:
  1545. #endif
  1546. #if defined(WOLFSSL_AES_COUNTER)
  1547. case AES_128_CTR_TYPE:
  1548. case AES_192_CTR_TYPE:
  1549. case AES_256_CTR_TYPE:
  1550. #endif
  1551. #if defined(WOLFSSL_AES_CFB)
  1552. case AES_128_CFB1_TYPE:
  1553. case AES_192_CFB1_TYPE:
  1554. case AES_256_CFB1_TYPE:
  1555. case AES_128_CFB8_TYPE:
  1556. case AES_192_CFB8_TYPE:
  1557. case AES_256_CFB8_TYPE:
  1558. case AES_128_CFB128_TYPE:
  1559. case AES_192_CFB128_TYPE:
  1560. case AES_256_CFB128_TYPE:
  1561. #endif
  1562. #if defined(WOLFSSL_AES_OFB)
  1563. case AES_128_OFB_TYPE:
  1564. case AES_192_OFB_TYPE:
  1565. case AES_256_OFB_TYPE:
  1566. #endif
  1567. #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  1568. case AES_128_XTS_TYPE:
  1569. case AES_256_XTS_TYPE:
  1570. #endif
  1571. #if defined(HAVE_ARIA)
  1572. case ARIA_128_GCM_TYPE:
  1573. case ARIA_192_GCM_TYPE:
  1574. case ARIA_256_GCM_TYPE:
  1575. #endif
  1576. case AES_128_ECB_TYPE:
  1577. case AES_192_ECB_TYPE:
  1578. case AES_256_ECB_TYPE:
  1579. #endif /* !NO_AES */
  1580. #ifndef NO_DES3
  1581. case DES_CBC_TYPE:
  1582. case DES_ECB_TYPE:
  1583. case DES_EDE3_CBC_TYPE:
  1584. case DES_EDE3_ECB_TYPE:
  1585. #endif
  1586. #ifdef WOLFSSL_SM4_ECB
  1587. case SM4_ECB_TYPE:
  1588. #endif
  1589. #ifdef WOLFSSL_SM4_CBC
  1590. case SM4_CBC_TYPE:
  1591. #endif
  1592. #ifdef WOLFSSL_SM4_CTR
  1593. case SM4_CTR_TYPE:
  1594. #endif
  1595. #ifdef WOLFSSL_SM4_GCM
  1596. case SM4_GCM_TYPE:
  1597. #endif
  1598. #ifdef WOLFSSL_SM4_CCM
  1599. case SM4_CCM_TYPE:
  1600. #endif
  1601. return ctx->block_size;
  1602. #endif /* !NO_AES || !NO_DES3 || WOLFSSL_SM4 */
  1603. default:
  1604. return 0;
  1605. }
  1606. }
  1607. static unsigned int cipherType(const WOLFSSL_EVP_CIPHER *cipher)
  1608. {
  1609. if (cipher == NULL) return 0; /* dummy for #ifdef */
  1610. #ifndef NO_DES3
  1611. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_CBC))
  1612. return DES_CBC_TYPE;
  1613. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_EDE3_CBC))
  1614. return DES_EDE3_CBC_TYPE;
  1615. #if !defined(NO_DES3)
  1616. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_ECB))
  1617. return DES_ECB_TYPE;
  1618. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_DES_EDE3_ECB))
  1619. return DES_EDE3_ECB_TYPE;
  1620. #endif /* NO_DES3 && HAVE_AES_ECB */
  1621. #endif
  1622. #if !defined(NO_AES)
  1623. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  1624. #ifdef WOLFSSL_AES_128
  1625. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CBC))
  1626. return AES_128_CBC_TYPE;
  1627. #endif
  1628. #ifdef WOLFSSL_AES_192
  1629. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CBC))
  1630. return AES_192_CBC_TYPE;
  1631. #endif
  1632. #ifdef WOLFSSL_AES_256
  1633. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CBC))
  1634. return AES_256_CBC_TYPE;
  1635. #endif
  1636. #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
  1637. #if defined(HAVE_AESGCM)
  1638. #ifdef WOLFSSL_AES_128
  1639. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_GCM))
  1640. return AES_128_GCM_TYPE;
  1641. #endif
  1642. #ifdef WOLFSSL_AES_192
  1643. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_GCM))
  1644. return AES_192_GCM_TYPE;
  1645. #endif
  1646. #ifdef WOLFSSL_AES_256
  1647. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_GCM))
  1648. return AES_256_GCM_TYPE;
  1649. #endif
  1650. #endif /* HAVE_AESGCM */
  1651. #if defined(HAVE_AESCCM)
  1652. #ifdef WOLFSSL_AES_128
  1653. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CCM))
  1654. return AES_128_CCM_TYPE;
  1655. #endif
  1656. #ifdef WOLFSSL_AES_192
  1657. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CCM))
  1658. return AES_192_CCM_TYPE;
  1659. #endif
  1660. #ifdef WOLFSSL_AES_256
  1661. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CCM))
  1662. return AES_256_CCM_TYPE;
  1663. #endif
  1664. #endif /* HAVE_AESCCM */
  1665. #if defined(WOLFSSL_AES_COUNTER)
  1666. #ifdef WOLFSSL_AES_128
  1667. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CTR))
  1668. return AES_128_CTR_TYPE;
  1669. #endif
  1670. #ifdef WOLFSSL_AES_192
  1671. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CTR))
  1672. return AES_192_CTR_TYPE;
  1673. #endif
  1674. #ifdef WOLFSSL_AES_256
  1675. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CTR))
  1676. return AES_256_CTR_TYPE;
  1677. #endif
  1678. #endif /* HAVE_AES_CBC */
  1679. #if defined(HAVE_AES_ECB)
  1680. #ifdef WOLFSSL_AES_128
  1681. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_ECB))
  1682. return AES_128_ECB_TYPE;
  1683. #endif
  1684. #ifdef WOLFSSL_AES_192
  1685. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_ECB))
  1686. return AES_192_ECB_TYPE;
  1687. #endif
  1688. #ifdef WOLFSSL_AES_256
  1689. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_ECB))
  1690. return AES_256_ECB_TYPE;
  1691. #endif
  1692. #endif /*HAVE_AES_CBC */
  1693. #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  1694. #ifdef WOLFSSL_AES_128
  1695. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_XTS))
  1696. return AES_128_XTS_TYPE;
  1697. #endif
  1698. #ifdef WOLFSSL_AES_256
  1699. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_XTS))
  1700. return AES_256_XTS_TYPE;
  1701. #endif
  1702. #endif /* WOLFSSL_AES_XTS */
  1703. #if defined(WOLFSSL_AES_CFB)
  1704. #ifdef WOLFSSL_AES_128
  1705. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB1))
  1706. return AES_128_CFB1_TYPE;
  1707. #endif
  1708. #ifdef WOLFSSL_AES_192
  1709. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB1))
  1710. return AES_192_CFB1_TYPE;
  1711. #endif
  1712. #ifdef WOLFSSL_AES_256
  1713. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB1))
  1714. return AES_256_CFB1_TYPE;
  1715. #endif
  1716. #ifdef WOLFSSL_AES_128
  1717. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB8))
  1718. return AES_128_CFB8_TYPE;
  1719. #endif
  1720. #ifdef WOLFSSL_AES_192
  1721. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB8))
  1722. return AES_192_CFB8_TYPE;
  1723. #endif
  1724. #ifdef WOLFSSL_AES_256
  1725. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB8))
  1726. return AES_256_CFB8_TYPE;
  1727. #endif
  1728. #ifdef WOLFSSL_AES_128
  1729. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_CFB128))
  1730. return AES_128_CFB128_TYPE;
  1731. #endif
  1732. #ifdef WOLFSSL_AES_192
  1733. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_CFB128))
  1734. return AES_192_CFB128_TYPE;
  1735. #endif
  1736. #ifdef WOLFSSL_AES_256
  1737. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_CFB128))
  1738. return AES_256_CFB128_TYPE;
  1739. #endif
  1740. #endif /*HAVE_AES_CBC */
  1741. #if defined(WOLFSSL_AES_OFB)
  1742. #ifdef WOLFSSL_AES_128
  1743. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_OFB))
  1744. return AES_128_OFB_TYPE;
  1745. #endif
  1746. #ifdef WOLFSSL_AES_192
  1747. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_192_OFB))
  1748. return AES_192_OFB_TYPE;
  1749. #endif
  1750. #ifdef WOLFSSL_AES_256
  1751. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_256_OFB))
  1752. return AES_256_OFB_TYPE;
  1753. #endif
  1754. #endif
  1755. #endif /* !NO_AES */
  1756. #if defined(HAVE_ARIA)
  1757. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_128_GCM))
  1758. return ARIA_128_GCM_TYPE;
  1759. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_192_GCM))
  1760. return ARIA_192_GCM_TYPE;
  1761. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_256_GCM))
  1762. return ARIA_256_GCM_TYPE;
  1763. #endif /* HAVE_ARIA */
  1764. #ifndef NO_RC4
  1765. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARC4))
  1766. return ARC4_TYPE;
  1767. #endif
  1768. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  1769. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_CHACHA20_POLY1305))
  1770. return CHACHA20_POLY1305_TYPE;
  1771. #endif
  1772. #ifdef HAVE_CHACHA
  1773. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_CHACHA20))
  1774. return CHACHA20_TYPE;
  1775. #endif
  1776. #ifdef WOLFSSL_SM4_ECB
  1777. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_ECB))
  1778. return SM4_ECB_TYPE;
  1779. #endif
  1780. #ifdef WOLFSSL_SM4_CBC
  1781. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CBC))
  1782. return SM4_CBC_TYPE;
  1783. #endif
  1784. #ifdef WOLFSSL_SM4_CTR
  1785. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CTR))
  1786. return SM4_CTR_TYPE;
  1787. #endif
  1788. #ifdef WOLFSSL_SM4_GCM
  1789. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_GCM))
  1790. return SM4_GCM_TYPE;
  1791. #endif
  1792. #ifdef WOLFSSL_SM4_CCM
  1793. else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CCM))
  1794. return SM4_CCM_TYPE;
  1795. #endif
  1796. else return 0;
  1797. }
  1798. int wolfSSL_EVP_CIPHER_block_size(const WOLFSSL_EVP_CIPHER *cipher)
  1799. {
  1800. if (cipher == NULL)
  1801. return BAD_FUNC_ARG;
  1802. switch (cipherType(cipher)) {
  1803. #if !defined(NO_AES)
  1804. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  1805. case AES_128_CBC_TYPE:
  1806. case AES_192_CBC_TYPE:
  1807. case AES_256_CBC_TYPE:
  1808. return AES_BLOCK_SIZE;
  1809. #endif
  1810. #if defined(HAVE_AESGCM)
  1811. case AES_128_GCM_TYPE:
  1812. case AES_192_GCM_TYPE:
  1813. case AES_256_GCM_TYPE:
  1814. return 1;
  1815. #endif
  1816. #if defined(HAVE_AESCCM)
  1817. case AES_128_CCM_TYPE:
  1818. case AES_192_CCM_TYPE:
  1819. case AES_256_CCM_TYPE:
  1820. return 1;
  1821. #endif
  1822. #if defined(WOLFSSL_AES_COUNTER)
  1823. case AES_128_CTR_TYPE:
  1824. case AES_192_CTR_TYPE:
  1825. case AES_256_CTR_TYPE:
  1826. return 1;
  1827. #endif
  1828. #if defined(HAVE_AES_ECB)
  1829. case AES_128_ECB_TYPE:
  1830. case AES_192_ECB_TYPE:
  1831. case AES_256_ECB_TYPE:
  1832. return AES_BLOCK_SIZE;
  1833. #endif
  1834. #if defined(WOLFSSL_AES_CFB)
  1835. case AES_128_CFB1_TYPE:
  1836. case AES_192_CFB1_TYPE:
  1837. case AES_256_CFB1_TYPE:
  1838. case AES_128_CFB8_TYPE:
  1839. case AES_192_CFB8_TYPE:
  1840. case AES_256_CFB8_TYPE:
  1841. case AES_128_CFB128_TYPE:
  1842. case AES_192_CFB128_TYPE:
  1843. case AES_256_CFB128_TYPE:
  1844. return 1;
  1845. #endif
  1846. #if defined(WOLFSSL_AES_OFB)
  1847. case AES_128_OFB_TYPE:
  1848. case AES_192_OFB_TYPE:
  1849. case AES_256_OFB_TYPE:
  1850. return 1;
  1851. #endif
  1852. #if defined(WOLFSSL_AES_XTS) && \
  1853. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  1854. case AES_128_XTS_TYPE:
  1855. case AES_256_XTS_TYPE:
  1856. return 1;
  1857. #endif
  1858. #endif /* NO_AES */
  1859. #ifndef NO_RC4
  1860. case ARC4_TYPE:
  1861. return 1;
  1862. #endif
  1863. #if defined(HAVE_ARIA)
  1864. case ARIA_128_GCM_TYPE:
  1865. case ARIA_192_GCM_TYPE:
  1866. case ARIA_256_GCM_TYPE:
  1867. return 1;
  1868. #endif
  1869. #ifndef NO_DES3
  1870. case DES_CBC_TYPE: return 8;
  1871. case DES_EDE3_CBC_TYPE: return 8;
  1872. case DES_ECB_TYPE: return 8;
  1873. case DES_EDE3_ECB_TYPE: return 8;
  1874. #endif
  1875. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  1876. case CHACHA20_POLY1305_TYPE:
  1877. return 1;
  1878. #endif
  1879. #ifdef HAVE_CHACHA
  1880. case CHACHA20_TYPE:
  1881. return 1;
  1882. #endif
  1883. #ifdef WOLFSSL_SM4_ECB
  1884. case SM4_ECB_TYPE:
  1885. return SM4_BLOCK_SIZE;
  1886. #endif
  1887. #ifdef WOLFSSL_SM4_CBC
  1888. case SM4_CBC_TYPE:
  1889. return SM4_BLOCK_SIZE;
  1890. #endif
  1891. #ifdef WOLFSSL_SM4_CTR
  1892. case SM4_CTR_TYPE:
  1893. return 1;
  1894. #endif
  1895. #ifdef WOLFSSL_SM4_GCM
  1896. case SM4_GCM_TYPE:
  1897. return 1;
  1898. #endif
  1899. #ifdef WOLFSSL_SM4_CCM
  1900. case SM4_CCM_TYPE:
  1901. return 1;
  1902. #endif
  1903. default:
  1904. return 0;
  1905. }
  1906. }
  1907. unsigned long WOLFSSL_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher)
  1908. {
  1909. switch (cipherType(cipher)) {
  1910. #if !defined(NO_AES)
  1911. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  1912. case AES_128_CBC_TYPE:
  1913. case AES_192_CBC_TYPE:
  1914. case AES_256_CBC_TYPE:
  1915. return WOLFSSL_EVP_CIPH_CBC_MODE;
  1916. #endif
  1917. #if defined(HAVE_AESGCM)
  1918. case AES_128_GCM_TYPE:
  1919. case AES_192_GCM_TYPE:
  1920. case AES_256_GCM_TYPE:
  1921. return WOLFSSL_EVP_CIPH_GCM_MODE |
  1922. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  1923. #endif
  1924. #if defined(HAVE_AESCCM)
  1925. case AES_128_CCM_TYPE:
  1926. case AES_192_CCM_TYPE:
  1927. case AES_256_CCM_TYPE:
  1928. return WOLFSSL_EVP_CIPH_CCM_MODE |
  1929. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  1930. #endif
  1931. #if defined(WOLFSSL_AES_COUNTER)
  1932. case AES_128_CTR_TYPE:
  1933. case AES_192_CTR_TYPE:
  1934. case AES_256_CTR_TYPE:
  1935. return WOLFSSL_EVP_CIPH_CTR_MODE;
  1936. #endif
  1937. #if defined(WOLFSSL_AES_CFB)
  1938. case AES_128_CFB1_TYPE:
  1939. case AES_192_CFB1_TYPE:
  1940. case AES_256_CFB1_TYPE:
  1941. case AES_128_CFB8_TYPE:
  1942. case AES_192_CFB8_TYPE:
  1943. case AES_256_CFB8_TYPE:
  1944. case AES_128_CFB128_TYPE:
  1945. case AES_192_CFB128_TYPE:
  1946. case AES_256_CFB128_TYPE:
  1947. return WOLFSSL_EVP_CIPH_CFB_MODE;
  1948. #endif
  1949. #if defined(WOLFSSL_AES_OFB)
  1950. case AES_128_OFB_TYPE:
  1951. case AES_192_OFB_TYPE:
  1952. case AES_256_OFB_TYPE:
  1953. return WOLFSSL_EVP_CIPH_OFB_MODE;
  1954. #endif
  1955. #if defined(WOLFSSL_AES_XTS) && \
  1956. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  1957. case AES_128_XTS_TYPE:
  1958. case AES_256_XTS_TYPE:
  1959. return WOLFSSL_EVP_CIPH_XTS_MODE;
  1960. #endif
  1961. case AES_128_ECB_TYPE:
  1962. case AES_192_ECB_TYPE:
  1963. case AES_256_ECB_TYPE:
  1964. return WOLFSSL_EVP_CIPH_ECB_MODE;
  1965. #endif /* !NO_AES */
  1966. #if defined(HAVE_ARIA)
  1967. case ARIA_128_GCM_TYPE:
  1968. case ARIA_192_GCM_TYPE:
  1969. case ARIA_256_GCM_TYPE:
  1970. return WOLFSSL_EVP_CIPH_GCM_MODE |
  1971. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  1972. #endif
  1973. #ifndef NO_DES3
  1974. case DES_CBC_TYPE:
  1975. case DES_EDE3_CBC_TYPE:
  1976. return WOLFSSL_EVP_CIPH_CBC_MODE;
  1977. case DES_ECB_TYPE:
  1978. case DES_EDE3_ECB_TYPE:
  1979. return WOLFSSL_EVP_CIPH_ECB_MODE;
  1980. #endif
  1981. #ifndef NO_RC4
  1982. case ARC4_TYPE:
  1983. return EVP_CIPH_STREAM_CIPHER;
  1984. #endif
  1985. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  1986. case CHACHA20_POLY1305_TYPE:
  1987. return WOLFSSL_EVP_CIPH_STREAM_CIPHER |
  1988. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  1989. #endif
  1990. #ifdef HAVE_CHACHA
  1991. case CHACHA20_TYPE:
  1992. return WOLFSSL_EVP_CIPH_STREAM_CIPHER;
  1993. #endif
  1994. #ifdef WOLFSSL_SM4_ECB
  1995. case SM4_ECB_TYPE:
  1996. return WOLFSSL_EVP_CIPH_ECB_MODE;
  1997. #endif
  1998. #ifdef WOLFSSL_SM4_CBC
  1999. case SM4_CBC_TYPE:
  2000. return WOLFSSL_EVP_CIPH_CBC_MODE;
  2001. #endif
  2002. #ifdef WOLFSSL_SM4_CTR
  2003. case SM4_CTR_TYPE:
  2004. return WOLFSSL_EVP_CIPH_CTR_MODE;
  2005. #endif
  2006. #ifdef WOLFSSL_SM4_GCM
  2007. case SM4_GCM_TYPE:
  2008. return WOLFSSL_EVP_CIPH_GCM_MODE |
  2009. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  2010. #endif
  2011. #ifdef WOLFSSL_SM4_CCM
  2012. case SM4_CCM_TYPE:
  2013. return WOLFSSL_EVP_CIPH_CCM_MODE |
  2014. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  2015. #endif
  2016. default:
  2017. return 0;
  2018. }
  2019. }
  2020. unsigned long WOLFSSL_EVP_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher)
  2021. {
  2022. if (cipher == NULL)
  2023. return 0;
  2024. return WOLFSSL_CIPHER_mode(cipher) & WOLFSSL_EVP_CIPH_MODE;
  2025. }
  2026. void wolfSSL_EVP_CIPHER_CTX_set_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags)
  2027. {
  2028. if (ctx != NULL) {
  2029. ctx->flags |= (unsigned long)flags;
  2030. }
  2031. }
  2032. void wolfSSL_EVP_CIPHER_CTX_clear_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags)
  2033. {
  2034. if (ctx != NULL) {
  2035. ctx->flags &= (unsigned long)~flags;
  2036. }
  2037. }
  2038. unsigned long wolfSSL_EVP_CIPHER_flags(const WOLFSSL_EVP_CIPHER *cipher)
  2039. {
  2040. if (cipher == NULL)
  2041. return 0;
  2042. return WOLFSSL_CIPHER_mode(cipher);
  2043. }
  2044. int wolfSSL_EVP_CIPHER_CTX_set_padding(WOLFSSL_EVP_CIPHER_CTX *ctx,
  2045. int padding)
  2046. {
  2047. if (ctx == NULL)
  2048. return BAD_FUNC_ARG;
  2049. if (padding) {
  2050. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_NO_PADDING;
  2051. }
  2052. else {
  2053. ctx->flags |= WOLFSSL_EVP_CIPH_NO_PADDING;
  2054. }
  2055. return 1;
  2056. }
  2057. int wolfSSL_EVP_add_digest(const WOLFSSL_EVP_MD *digest)
  2058. {
  2059. (void)digest;
  2060. /* nothing to do */
  2061. return 0;
  2062. }
  2063. /* Frees the WOLFSSL_EVP_PKEY_CTX passed in.
  2064. *
  2065. * return WOLFSSL_SUCCESS on success
  2066. */
  2067. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  2068. void wolfSSL_EVP_PKEY_CTX_free(WOLFSSL_EVP_PKEY_CTX *ctx)
  2069. #else
  2070. int wolfSSL_EVP_PKEY_CTX_free(WOLFSSL_EVP_PKEY_CTX *ctx)
  2071. #endif
  2072. {
  2073. if (ctx == NULL)
  2074. #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  2075. return;
  2076. #else
  2077. return 0;
  2078. #endif
  2079. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_free");
  2080. if (ctx->pkey != NULL)
  2081. wolfSSL_EVP_PKEY_free(ctx->pkey);
  2082. if (ctx->peerKey != NULL)
  2083. wolfSSL_EVP_PKEY_free(ctx->peerKey);
  2084. XFREE(ctx, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
  2085. #if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L
  2086. return WOLFSSL_SUCCESS;
  2087. #endif
  2088. }
  2089. /* Creates a new WOLFSSL_EVP_PKEY_CTX structure.
  2090. *
  2091. * pkey key structure to use with new WOLFSSL_EVP_PKEY_CTX
  2092. * e engine to use. It should be NULL at this time.
  2093. *
  2094. * return the new structure on success and NULL if failed.
  2095. */
  2096. WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_ENGINE *e)
  2097. {
  2098. WOLFSSL_EVP_PKEY_CTX* ctx;
  2099. if (pkey == NULL) return 0;
  2100. if (e != NULL) return 0;
  2101. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_new");
  2102. ctx = (WOLFSSL_EVP_PKEY_CTX*)XMALLOC(sizeof(WOLFSSL_EVP_PKEY_CTX), NULL,
  2103. DYNAMIC_TYPE_PUBLIC_KEY);
  2104. if (ctx == NULL) return NULL;
  2105. XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_PKEY_CTX));
  2106. ctx->pkey = pkey;
  2107. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  2108. ctx->padding = RSA_PKCS1_PADDING;
  2109. ctx->md = NULL;
  2110. #endif
  2111. #ifdef HAVE_ECC
  2112. if (pkey->ecc && pkey->ecc->group) {
  2113. /* set curve NID from pkey if available */
  2114. ctx->curveNID = pkey->ecc->group->curve_nid;
  2115. }
  2116. else {
  2117. ctx->curveNID = ECC_CURVE_DEF;
  2118. }
  2119. #endif
  2120. if (wolfSSL_EVP_PKEY_up_ref(pkey) != WOLFSSL_SUCCESS) {
  2121. WOLFSSL_MSG("Couldn't increase key reference count");
  2122. }
  2123. return ctx;
  2124. }
  2125. /* Sets the type of RSA padding to use.
  2126. *
  2127. * ctx structure to set padding in.
  2128. * padding RSA padding type
  2129. *
  2130. * returns WOLFSSL_SUCCESS on success.
  2131. */
  2132. int wolfSSL_EVP_PKEY_CTX_set_rsa_padding(WOLFSSL_EVP_PKEY_CTX *ctx, int padding)
  2133. {
  2134. if (ctx == NULL) return 0;
  2135. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_rsa_padding");
  2136. ctx->padding = padding;
  2137. return WOLFSSL_SUCCESS;
  2138. }
  2139. /* Sets the message digest type for RSA padding to use.
  2140. *
  2141. * ctx structure to set padding in.
  2142. * md Message digest
  2143. *
  2144. * returns WOLFSSL_SUCCESS on success.
  2145. */
  2146. int wolfSSL_EVP_PKEY_CTX_set_signature_md(WOLFSSL_EVP_PKEY_CTX *ctx,
  2147. const EVP_MD* md)
  2148. {
  2149. if (ctx == NULL) return 0;
  2150. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_signature_md");
  2151. #ifndef NO_RSA
  2152. ctx->md = md;
  2153. #else
  2154. (void)md;
  2155. #endif
  2156. return WOLFSSL_SUCCESS;
  2157. }
  2158. /* create a PKEY context and return it */
  2159. WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new_id(int id, WOLFSSL_ENGINE *e)
  2160. {
  2161. WOLFSSL_EVP_PKEY* pkey;
  2162. WOLFSSL_EVP_PKEY_CTX* ctx = NULL;
  2163. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_new_id");
  2164. pkey = wolfSSL_EVP_PKEY_new_ex(NULL);
  2165. if (pkey) {
  2166. pkey->type = id;
  2167. ctx = wolfSSL_EVP_PKEY_CTX_new(pkey, e);
  2168. /* wolfSSL_EVP_PKEY_CTX_new calls wolfSSL_EVP_PKEY_up_ref so we need
  2169. * to always call wolfSSL_EVP_PKEY_free (either to free it if an
  2170. * error occurred in the previous function or to decrease the reference
  2171. * count so that pkey is actually free'd when wolfSSL_EVP_PKEY_CTX_free
  2172. * is called) */
  2173. wolfSSL_EVP_PKEY_free(pkey);
  2174. }
  2175. return ctx;
  2176. }
  2177. /* Returns WOLFSSL_SUCCESS or error */
  2178. int wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(WOLFSSL_EVP_PKEY_CTX *ctx, int bits)
  2179. {
  2180. if (ctx) {
  2181. ctx->nbits = bits;
  2182. }
  2183. return WOLFSSL_SUCCESS;
  2184. }
  2185. int wolfSSL_EVP_PKEY_derive_init(WOLFSSL_EVP_PKEY_CTX *ctx)
  2186. {
  2187. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive_init");
  2188. if (!ctx) {
  2189. return WOLFSSL_FAILURE;
  2190. }
  2191. wolfSSL_EVP_PKEY_free(ctx->peerKey);
  2192. ctx->op = EVP_PKEY_OP_DERIVE;
  2193. ctx->padding = 0;
  2194. ctx->nbits = 0;
  2195. return WOLFSSL_SUCCESS;
  2196. }
  2197. int wolfSSL_EVP_PKEY_derive_set_peer(WOLFSSL_EVP_PKEY_CTX *ctx, WOLFSSL_EVP_PKEY *peer)
  2198. {
  2199. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive_set_peer");
  2200. if (!ctx || ctx->op != EVP_PKEY_OP_DERIVE) {
  2201. return WOLFSSL_FAILURE;
  2202. }
  2203. wolfSSL_EVP_PKEY_free(ctx->peerKey);
  2204. ctx->peerKey = peer;
  2205. if (!wolfSSL_EVP_PKEY_up_ref(peer)) {
  2206. ctx->peerKey = NULL;
  2207. return WOLFSSL_FAILURE;
  2208. }
  2209. return WOLFSSL_SUCCESS;
  2210. }
  2211. #ifndef NO_WOLFSSL_STUB
  2212. int wolfSSL_EVP_PKEY_CTX_ctrl_str(WOLFSSL_EVP_PKEY_CTX *ctx,
  2213. const char *name, const char *value)
  2214. {
  2215. WOLFSSL_STUB("wolfSSL_EVP_PKEY_CTX_ctrl_str");
  2216. (void)ctx;
  2217. (void)name;
  2218. (void)value;
  2219. return WOLFSSL_FAILURE;
  2220. }
  2221. #endif /* NO_WOLFSSL_STUB */
  2222. #if (!defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)) || defined(HAVE_ECC) || \
  2223. defined(HAVE_HKDF)
  2224. int wolfSSL_EVP_PKEY_derive(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)
  2225. {
  2226. int len;
  2227. #ifdef HAVE_HKDF
  2228. enum wc_HashType hkdfHashType;
  2229. #endif
  2230. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_derive");
  2231. if (!ctx || ctx->op != EVP_PKEY_OP_DERIVE || !ctx->pkey || (!ctx->peerKey
  2232. && ctx->pkey->type != EVP_PKEY_HKDF) || !keylen || (ctx->pkey->type
  2233. != EVP_PKEY_HKDF && ctx->pkey->type != ctx->peerKey->type)) {
  2234. return WOLFSSL_FAILURE;
  2235. }
  2236. switch (ctx->pkey->type) {
  2237. #ifndef NO_DH
  2238. case EVP_PKEY_DH:
  2239. /* Use DH */
  2240. if (!ctx->pkey->dh || !ctx->peerKey->dh) {
  2241. return WOLFSSL_FAILURE;
  2242. }
  2243. /* set internal peer key if not done */
  2244. if (!ctx->peerKey->dh->inSet) {
  2245. if (SetDhInternal(ctx->peerKey->dh) != WOLFSSL_SUCCESS) {
  2246. WOLFSSL_MSG("SetDhInternal failed");
  2247. return WOLFSSL_FAILURE;
  2248. }
  2249. }
  2250. if (!ctx->peerKey->dh->pub_key) {
  2251. WOLFSSL_MSG("SetDhInternal failed, pub_key is NULL");
  2252. return WOLFSSL_FAILURE;
  2253. }
  2254. if ((len = wolfSSL_DH_size(ctx->pkey->dh)) <= 0) {
  2255. return WOLFSSL_FAILURE;
  2256. }
  2257. if (key) {
  2258. if (*keylen < (size_t)len) {
  2259. return WOLFSSL_FAILURE;
  2260. }
  2261. /* computed DH agreement can be less than DH size if leading zeros */
  2262. if (wolfSSL_DH_compute_key(key, ctx->peerKey->dh->pub_key,
  2263. ctx->pkey->dh) <= 0) {
  2264. return WOLFSSL_FAILURE;
  2265. }
  2266. }
  2267. *keylen = (size_t)len;
  2268. break;
  2269. #endif
  2270. #if defined(HAVE_ECC) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  2271. case EVP_PKEY_EC:
  2272. /* Use ECDH */
  2273. if (!ctx->pkey->ecc || !ctx->peerKey->ecc) {
  2274. return WOLFSSL_FAILURE;
  2275. }
  2276. /* set internal key if not done */
  2277. if (!ctx->pkey->ecc->inSet) {
  2278. if (SetECKeyInternal(ctx->pkey->ecc) != WOLFSSL_SUCCESS) {
  2279. WOLFSSL_MSG("SetECKeyInternal failed");
  2280. return WOLFSSL_FAILURE;
  2281. }
  2282. }
  2283. if (!ctx->peerKey->ecc->exSet || !ctx->peerKey->ecc->pub_key->internal) {
  2284. if (SetECKeyExternal(ctx->peerKey->ecc) != WOLFSSL_SUCCESS) {
  2285. WOLFSSL_MSG("SetECKeyExternal failed");
  2286. return WOLFSSL_FAILURE;
  2287. }
  2288. }
  2289. if (!(len = wc_ecc_size((ecc_key*)ctx->pkey->ecc->internal))) {
  2290. return WOLFSSL_FAILURE;
  2291. }
  2292. if (key) {
  2293. word32 len32 = (word32)len;
  2294. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  2295. && (!defined(HAVE_FIPS) || \
  2296. (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
  2297. WC_RNG rng;
  2298. if (wc_InitRng(&rng) != MP_OKAY) {
  2299. WOLFSSL_MSG("Init RNG failed");
  2300. return WOLFSSL_FAILURE;
  2301. }
  2302. ((ecc_key*)ctx->pkey->ecc->internal)->rng = &rng;
  2303. #endif
  2304. if (*keylen < len32) {
  2305. WOLFSSL_MSG("buffer too short");
  2306. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  2307. && (!defined(HAVE_FIPS) || \
  2308. (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
  2309. ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
  2310. wc_FreeRng(&rng);
  2311. #endif
  2312. return WOLFSSL_FAILURE;
  2313. }
  2314. if (wc_ecc_shared_secret_ssh((ecc_key*)ctx->pkey->ecc->internal,
  2315. (ecc_point*)ctx->peerKey->ecc->pub_key->internal,
  2316. key, &len32) != MP_OKAY) {
  2317. WOLFSSL_MSG("wc_ecc_shared_secret failed");
  2318. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  2319. && (!defined(HAVE_FIPS) || \
  2320. (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
  2321. ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
  2322. wc_FreeRng(&rng);
  2323. #endif
  2324. return WOLFSSL_FAILURE;
  2325. }
  2326. #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
  2327. && (!defined(HAVE_FIPS) || \
  2328. (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
  2329. ((ecc_key*)ctx->pkey->ecc->internal)->rng = NULL;
  2330. wc_FreeRng(&rng);
  2331. #endif
  2332. len = (int)len32;
  2333. }
  2334. *keylen = (size_t)len;
  2335. break;
  2336. #endif
  2337. #ifdef HAVE_HKDF
  2338. case EVP_PKEY_HKDF:
  2339. (void)len;
  2340. hkdfHashType = EvpMd2MacType(ctx->pkey->hkdfMd);
  2341. if (hkdfHashType == WC_HASH_TYPE_NONE) {
  2342. WOLFSSL_MSG("Invalid hash type for HKDF.");
  2343. return WOLFSSL_FAILURE;
  2344. }
  2345. if (ctx->pkey->hkdfMode == EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND) {
  2346. if (wc_HKDF(hkdfHashType, ctx->pkey->hkdfKey, ctx->pkey->hkdfKeySz,
  2347. ctx->pkey->hkdfSalt, ctx->pkey->hkdfSaltSz,
  2348. ctx->pkey->hkdfInfo, ctx->pkey->hkdfInfoSz, key,
  2349. (word32)*keylen) != 0) {
  2350. WOLFSSL_MSG("wc_HKDF failed.");
  2351. return WOLFSSL_FAILURE;
  2352. }
  2353. }
  2354. else if (ctx->pkey->hkdfMode == EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY) {
  2355. if (wc_HKDF_Extract(hkdfHashType, ctx->pkey->hkdfSalt,
  2356. ctx->pkey->hkdfSaltSz, ctx->pkey->hkdfKey,
  2357. ctx->pkey->hkdfKeySz, key) != 0) {
  2358. WOLFSSL_MSG("wc_HKDF_Extract failed.");
  2359. return WOLFSSL_FAILURE;
  2360. }
  2361. else {
  2362. int hkdfHashSz = wolfSSL_EVP_MD_size(ctx->pkey->hkdfMd);
  2363. if (hkdfHashSz <= 0) {
  2364. WOLFSSL_MSG("Failed to get block size for HKDF hash.");
  2365. return WOLFSSL_FAILURE;
  2366. }
  2367. /* Length of extract only is always the length of the hash. */
  2368. *keylen = (size_t)hkdfHashSz;
  2369. }
  2370. }
  2371. else if (ctx->pkey->hkdfMode == EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) {
  2372. if (wc_HKDF_Expand(hkdfHashType, ctx->pkey->hkdfKey,
  2373. ctx->pkey->hkdfKeySz, ctx->pkey->hkdfInfo,
  2374. ctx->pkey->hkdfInfoSz, key,
  2375. (word32)*keylen) != 0) {
  2376. WOLFSSL_MSG("wc_HKDF_Expand failed.");
  2377. return WOLFSSL_FAILURE;
  2378. }
  2379. }
  2380. else {
  2381. WOLFSSL_MSG("Invalid HKDF mode.");
  2382. return WOLFSSL_FAILURE;
  2383. }
  2384. break;
  2385. #endif /* HAVE_HKDF */
  2386. default:
  2387. WOLFSSL_MSG("Unknown key type");
  2388. return WOLFSSL_FAILURE;
  2389. }
  2390. return WOLFSSL_SUCCESS;
  2391. }
  2392. #endif /* (!NO_DH && WOLFSSL_DH_EXTRA) || HAVE_ECC || HAVE_HKDF */
  2393. #ifdef HAVE_HKDF
  2394. int wolfSSL_EVP_PKEY_CTX_set_hkdf_md(WOLFSSL_EVP_PKEY_CTX* ctx,
  2395. const WOLFSSL_EVP_MD* md)
  2396. {
  2397. int ret = WOLFSSL_SUCCESS;
  2398. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_hkdf_md");
  2399. if (ctx == NULL || ctx->pkey == NULL || md == NULL) {
  2400. WOLFSSL_MSG("Bad argument.");
  2401. ret = WOLFSSL_FAILURE;
  2402. }
  2403. if (ret == WOLFSSL_SUCCESS) {
  2404. ctx->pkey->hkdfMd = md;
  2405. }
  2406. WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set_hkdf_md", ret);
  2407. return ret;
  2408. }
  2409. int wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt(WOLFSSL_EVP_PKEY_CTX* ctx,
  2410. const byte* salt, int saltSz)
  2411. {
  2412. int ret = WOLFSSL_SUCCESS;
  2413. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt");
  2414. if (ctx == NULL || ctx->pkey == NULL || saltSz < 0) {
  2415. WOLFSSL_MSG("Bad argument.");
  2416. ret = WOLFSSL_FAILURE;
  2417. }
  2418. if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != EVP_PKEY_HKDF) {
  2419. WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
  2420. ret = WOLFSSL_FAILURE;
  2421. }
  2422. if (ret == WOLFSSL_SUCCESS && salt != NULL && saltSz > 0) {
  2423. if (ctx->pkey->hkdfSalt != NULL) {
  2424. XFREE(ctx->pkey->hkdfSalt, NULL, DYNAMIC_TYPE_SALT);
  2425. }
  2426. ctx->pkey->hkdfSalt = (byte*)XMALLOC((size_t)saltSz, NULL,
  2427. DYNAMIC_TYPE_SALT);
  2428. if (ctx->pkey->hkdfSalt == NULL) {
  2429. WOLFSSL_MSG("Failed to allocate HKDF salt buffer.");
  2430. ret = WOLFSSL_FAILURE;
  2431. }
  2432. else {
  2433. XMEMCPY(ctx->pkey->hkdfSalt, salt, (size_t)saltSz);
  2434. ctx->pkey->hkdfSaltSz = (word32)saltSz;
  2435. }
  2436. }
  2437. WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set1_hkdf_salt", ret);
  2438. return ret;
  2439. }
  2440. int wolfSSL_EVP_PKEY_CTX_set1_hkdf_key(WOLFSSL_EVP_PKEY_CTX* ctx,
  2441. const byte* key, int keySz)
  2442. {
  2443. int ret = WOLFSSL_SUCCESS;
  2444. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set1_hkdf_key");
  2445. if (ctx == NULL || ctx->pkey == NULL || key == NULL || keySz <= 0) {
  2446. WOLFSSL_MSG("Bad argument.");
  2447. ret = WOLFSSL_FAILURE;
  2448. }
  2449. if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != EVP_PKEY_HKDF) {
  2450. WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
  2451. ret = WOLFSSL_FAILURE;
  2452. }
  2453. if (ret == WOLFSSL_SUCCESS) {
  2454. if (ctx->pkey->hkdfKey != NULL) {
  2455. XFREE(ctx->pkey->hkdfKey, NULL, DYNAMIC_TYPE_KEY);
  2456. }
  2457. ctx->pkey->hkdfKey = (byte*)XMALLOC((size_t)keySz, NULL,
  2458. DYNAMIC_TYPE_KEY);
  2459. if (ctx->pkey->hkdfKey == NULL) {
  2460. WOLFSSL_MSG("Failed to allocate HKDF key buffer.");
  2461. ret = WOLFSSL_FAILURE;
  2462. }
  2463. else {
  2464. XMEMCPY(ctx->pkey->hkdfKey, key, (size_t)keySz);
  2465. ctx->pkey->hkdfKeySz = (word32)keySz;
  2466. }
  2467. }
  2468. WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_set1_hkdf_key", ret);
  2469. return ret;
  2470. }
  2471. int wolfSSL_EVP_PKEY_CTX_add1_hkdf_info(WOLFSSL_EVP_PKEY_CTX* ctx,
  2472. const byte* info, int infoSz)
  2473. {
  2474. int ret = WOLFSSL_SUCCESS;
  2475. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_add1_hkdf_info");
  2476. if (ctx == NULL || ctx->pkey == NULL || infoSz < 0) {
  2477. WOLFSSL_MSG("Bad argument.");
  2478. ret = WOLFSSL_FAILURE;
  2479. }
  2480. if (ret == WOLFSSL_SUCCESS && ctx->pkey->type != EVP_PKEY_HKDF) {
  2481. WOLFSSL_MSG("WOLFSSL_EVP_PKEY type is not HKDF.");
  2482. ret = WOLFSSL_FAILURE;
  2483. }
  2484. if (ret == WOLFSSL_SUCCESS && info != NULL && infoSz > 0) {
  2485. unsigned char* p;
  2486. /* If there's already info in the buffer, append. */
  2487. p = (byte*)XREALLOC(ctx->pkey->hkdfInfo,
  2488. (size_t)(ctx->pkey->hkdfInfoSz + (word32)infoSz), NULL,
  2489. DYNAMIC_TYPE_INFO);
  2490. if (p == NULL) {
  2491. WOLFSSL_MSG("Failed to reallocate larger HKDF info buffer.");
  2492. ret = WOLFSSL_FAILURE;
  2493. }
  2494. else {
  2495. ctx->pkey->hkdfInfo = p;
  2496. XMEMCPY(ctx->pkey->hkdfInfo + ctx->pkey->hkdfInfoSz, info,
  2497. (size_t)infoSz);
  2498. ctx->pkey->hkdfInfoSz += (word32)infoSz;
  2499. }
  2500. }
  2501. WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_add1_hkdf_info", ret);
  2502. return ret;
  2503. }
  2504. int wolfSSL_EVP_PKEY_CTX_hkdf_mode(WOLFSSL_EVP_PKEY_CTX* ctx, int mode)
  2505. {
  2506. int ret = WOLFSSL_SUCCESS;
  2507. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_hkdf_mode");
  2508. if (ctx == NULL || ctx->pkey == NULL) {
  2509. WOLFSSL_MSG("Bad argument.");
  2510. ret = WOLFSSL_FAILURE;
  2511. }
  2512. if (ret == WOLFSSL_SUCCESS &&
  2513. mode != EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND &&
  2514. mode != EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY &&
  2515. mode != EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) {
  2516. WOLFSSL_MSG("Invalid HKDF mode.");
  2517. ret = WOLFSSL_FAILURE;
  2518. }
  2519. if (ret == WOLFSSL_SUCCESS) {
  2520. ctx->pkey->hkdfMode = mode;
  2521. }
  2522. WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_CTX_hkdf_mode", ret);
  2523. return ret;
  2524. }
  2525. #endif /* HAVE_HKDF */
  2526. /* Uses the WOLFSSL_EVP_PKEY_CTX to decrypt a buffer.
  2527. *
  2528. * ctx EVP_PKEY context of operation.
  2529. * out Decrypted output buffer. If NULL, puts the maximum output buffer size
  2530. in outLen and returns success.
  2531. * outLen If out is NULL, see above. If out is non-NULL, on input outLen holds
  2532. * the size of out. On output holds the length of actual decryption.
  2533. * in Encrypted input buffer.
  2534. * inLen Length of encrypted data.
  2535. *
  2536. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure.
  2537. */
  2538. int wolfSSL_EVP_PKEY_decrypt(WOLFSSL_EVP_PKEY_CTX *ctx,
  2539. unsigned char *out, size_t *outLen,
  2540. const unsigned char *in, size_t inLen)
  2541. {
  2542. int len = 0;
  2543. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_decrypt");
  2544. if (ctx == NULL || ctx->pkey == NULL) {
  2545. WOLFSSL_MSG("Bad parameter.");
  2546. return 0;
  2547. }
  2548. (void)out;
  2549. (void)outLen;
  2550. (void)in;
  2551. (void)inLen;
  2552. (void)len;
  2553. switch (ctx->pkey->type) {
  2554. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  2555. case EVP_PKEY_RSA:
  2556. if (out == NULL) {
  2557. if (ctx->pkey->rsa == NULL) {
  2558. WOLFSSL_MSG("Internal wolfCrypt RSA object is NULL.");
  2559. return WOLFSSL_FAILURE;
  2560. }
  2561. len = wolfSSL_RSA_size(ctx->pkey->rsa);
  2562. if (len <= 0) {
  2563. WOLFSSL_MSG("Error getting RSA size.");
  2564. return WOLFSSL_FAILURE;
  2565. }
  2566. if (outLen == NULL) {
  2567. WOLFSSL_MSG("outLen is NULL.");
  2568. return WOLFSSL_FAILURE;
  2569. }
  2570. *outLen = (size_t)len;
  2571. return WOLFSSL_SUCCESS;
  2572. }
  2573. len = wolfSSL_RSA_private_decrypt((int)inLen, (unsigned char*)in, out,
  2574. ctx->pkey->rsa, ctx->padding);
  2575. if (len < 0) break;
  2576. else {
  2577. *outLen = (size_t)len;
  2578. return WOLFSSL_SUCCESS;
  2579. }
  2580. #endif /* NO_RSA */
  2581. case EVP_PKEY_EC:
  2582. WOLFSSL_MSG("EVP_PKEY_EC not implemented.");
  2583. FALL_THROUGH;
  2584. default:
  2585. break;
  2586. }
  2587. return WOLFSSL_FAILURE;
  2588. }
  2589. /* Initialize a WOLFSSL_EVP_PKEY_CTX structure for decryption
  2590. *
  2591. * ctx WOLFSSL_EVP_PKEY_CTX structure to use with decryption
  2592. *
  2593. * Returns WOLFSSL_FAILURE on failure and WOLFSSL_SUCCESS on success
  2594. */
  2595. int wolfSSL_EVP_PKEY_decrypt_init(WOLFSSL_EVP_PKEY_CTX *ctx)
  2596. {
  2597. if (ctx == NULL) return WOLFSSL_FAILURE;
  2598. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_decrypt_init");
  2599. switch (ctx->pkey->type) {
  2600. case EVP_PKEY_RSA:
  2601. ctx->op = EVP_PKEY_OP_DECRYPT;
  2602. return WOLFSSL_SUCCESS;
  2603. case EVP_PKEY_EC:
  2604. WOLFSSL_MSG("not implemented");
  2605. FALL_THROUGH;
  2606. default:
  2607. break;
  2608. }
  2609. return WOLFSSL_FAILURE;
  2610. }
  2611. /* Uses the WOLFSSL_EVP_PKEY_CTX to encrypt a buffer.
  2612. *
  2613. * ctx EVP_PKEY context of operation.
  2614. * out Encrypted output buffer. If NULL, puts the maximum output buffer size
  2615. * in outlen and returns success.
  2616. * outLen If out is NULL, see above. If out is non-NULL, on input outLen holds
  2617. * the size of out. On output holds the length of actual encryption.
  2618. * in Plaintext input buffer.
  2619. * inLen Length of plaintext.
  2620. *
  2621. * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure.
  2622. */
  2623. int wolfSSL_EVP_PKEY_encrypt(WOLFSSL_EVP_PKEY_CTX *ctx,
  2624. unsigned char *out, size_t *outLen,
  2625. const unsigned char *in, size_t inLen)
  2626. {
  2627. int len = 0;
  2628. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_encrypt");
  2629. if (ctx == NULL || ctx->pkey == NULL) {
  2630. WOLFSSL_MSG("Bad parameter.");
  2631. return 0;
  2632. }
  2633. if (ctx->op != EVP_PKEY_OP_ENCRYPT) {
  2634. WOLFSSL_MSG("ctx->op must be set to EVP_PKEY_OP_ENCRYPT. Use "
  2635. "wolfSSL_EVP_PKEY_encrypt_init.");
  2636. return WOLFSSL_FAILURE;
  2637. }
  2638. (void)out;
  2639. (void)outLen;
  2640. (void)in;
  2641. (void)inLen;
  2642. (void)len;
  2643. switch (ctx->pkey->type) {
  2644. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  2645. case EVP_PKEY_RSA:
  2646. if (out == NULL) {
  2647. if (ctx->pkey->rsa == NULL) {
  2648. WOLFSSL_MSG("Internal wolfCrypt RSA object is NULL.");
  2649. return WOLFSSL_FAILURE;
  2650. }
  2651. len = wolfSSL_RSA_size(ctx->pkey->rsa);
  2652. if (len <= 0) {
  2653. WOLFSSL_MSG("Error getting RSA size.");
  2654. return WOLFSSL_FAILURE;
  2655. }
  2656. if (outLen == NULL) {
  2657. WOLFSSL_MSG("outLen is NULL.");
  2658. return WOLFSSL_FAILURE;
  2659. }
  2660. *outLen = (size_t)len;
  2661. return WOLFSSL_SUCCESS;
  2662. }
  2663. len = wolfSSL_RSA_public_encrypt((int)inLen, (unsigned char *)in, out,
  2664. ctx->pkey->rsa, ctx->padding);
  2665. if (len < 0)
  2666. break;
  2667. else {
  2668. *outLen = (size_t)len;
  2669. return WOLFSSL_SUCCESS;
  2670. }
  2671. #endif /* NO_RSA */
  2672. case EVP_PKEY_EC:
  2673. WOLFSSL_MSG("EVP_PKEY_EC not implemented");
  2674. FALL_THROUGH;
  2675. default:
  2676. break;
  2677. }
  2678. return WOLFSSL_FAILURE;
  2679. }
  2680. /* Initialize a WOLFSSL_EVP_PKEY_CTX structure to encrypt data
  2681. *
  2682. * ctx WOLFSSL_EVP_PKEY_CTX structure to use with encryption
  2683. *
  2684. * Returns WOLFSSL_FAILURE on failure and WOLFSSL_SUCCESS on success
  2685. */
  2686. int wolfSSL_EVP_PKEY_encrypt_init(WOLFSSL_EVP_PKEY_CTX *ctx)
  2687. {
  2688. if (ctx == NULL) return WOLFSSL_FAILURE;
  2689. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_encrypt_init");
  2690. switch (ctx->pkey->type) {
  2691. case EVP_PKEY_RSA:
  2692. ctx->op = EVP_PKEY_OP_ENCRYPT;
  2693. return WOLFSSL_SUCCESS;
  2694. case EVP_PKEY_EC:
  2695. WOLFSSL_MSG("not implemented");
  2696. FALL_THROUGH;
  2697. default:
  2698. break;
  2699. }
  2700. return WOLFSSL_FAILURE;
  2701. }
  2702. /******************************************************************************
  2703. * wolfSSL_EVP_PKEY_sign_init - initializes a public key algorithm context for
  2704. * a signing operation.
  2705. *
  2706. * RETURNS:
  2707. * returns WOLFSSL_SUCCESS on success, otherwise returns -2
  2708. */
  2709. int wolfSSL_EVP_PKEY_sign_init(WOLFSSL_EVP_PKEY_CTX *ctx)
  2710. {
  2711. int ret = -2;
  2712. WOLFSSL_MSG("wolfSSL_EVP_PKEY_sign_init");
  2713. if (!ctx || !ctx->pkey)
  2714. return ret;
  2715. switch (ctx->pkey->type) {
  2716. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  2717. case EVP_PKEY_RSA:
  2718. ctx->op = EVP_PKEY_OP_SIGN;
  2719. ret = WOLFSSL_SUCCESS;
  2720. break;
  2721. #endif /* NO_RSA */
  2722. #ifndef NO_DSA
  2723. case EVP_PKEY_DSA:
  2724. ctx->op = EVP_PKEY_OP_SIGN;
  2725. ret = WOLFSSL_SUCCESS;
  2726. break;
  2727. #endif /* NO_DSA */
  2728. #ifdef HAVE_ECC
  2729. case EVP_PKEY_EC:
  2730. ctx->op = EVP_PKEY_OP_SIGN;
  2731. ret = WOLFSSL_SUCCESS;
  2732. break;
  2733. #endif /* HAVE_ECC */
  2734. default:
  2735. ret = -2;
  2736. }
  2737. return ret;
  2738. }
  2739. /******************************************************************************
  2740. * wolfSSL_EVP_PKEY_sign - performs a public key signing operation using ctx
  2741. * The data to be signed should be hashed since the function does not hash the data.
  2742. *
  2743. * RETURNS:
  2744. * returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE
  2745. */
  2746. int wolfSSL_EVP_PKEY_sign(WOLFSSL_EVP_PKEY_CTX *ctx, unsigned char *sig,
  2747. size_t *siglen, const unsigned char *tbs, size_t tbslen)
  2748. {
  2749. WOLFSSL_MSG("wolfSSL_EVP_PKEY_sign");
  2750. if (!ctx || ctx->op != EVP_PKEY_OP_SIGN || !ctx->pkey || !siglen)
  2751. return WOLFSSL_FAILURE;
  2752. (void)sig;
  2753. (void)siglen;
  2754. (void)tbs;
  2755. (void)tbslen;
  2756. switch (ctx->pkey->type) {
  2757. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  2758. case EVP_PKEY_RSA: {
  2759. unsigned int usiglen = (unsigned int)*siglen;
  2760. if (!sig) {
  2761. int len;
  2762. if (!ctx->pkey->rsa)
  2763. return WOLFSSL_FAILURE;
  2764. len = wc_RsaEncryptSize((RsaKey*)ctx->pkey->rsa->internal);
  2765. if (len < 0)
  2766. return WOLFSSL_FAILURE;
  2767. *siglen = (size_t)len;
  2768. return WOLFSSL_SUCCESS;
  2769. }
  2770. /* wolfSSL_RSA_sign_generic_padding performs a check that the output
  2771. * sig buffer is large enough */
  2772. if (wolfSSL_RSA_sign_generic_padding(wolfSSL_EVP_MD_type(ctx->md), tbs,
  2773. (unsigned int)tbslen, sig, &usiglen, ctx->pkey->rsa, 1,
  2774. ctx->padding) != WOLFSSL_SUCCESS) {
  2775. return WOLFSSL_FAILURE;
  2776. }
  2777. *siglen = (size_t)usiglen;
  2778. return WOLFSSL_SUCCESS;
  2779. }
  2780. #endif /* NO_RSA */
  2781. #ifndef NO_DSA
  2782. case EVP_PKEY_DSA: {
  2783. int bytes;
  2784. int ret;
  2785. if (!ctx->pkey->dsa)
  2786. return WOLFSSL_FAILURE;
  2787. bytes = wolfSSL_BN_num_bytes(ctx->pkey->dsa->q);
  2788. if (bytes == WOLFSSL_FAILURE)
  2789. return WOLFSSL_FAILURE;
  2790. bytes *= 2;
  2791. if (!sig) {
  2792. *siglen = (size_t)bytes;
  2793. return WOLFSSL_SUCCESS;
  2794. }
  2795. if ((int)*siglen < bytes)
  2796. return WOLFSSL_FAILURE;
  2797. ret = wolfSSL_DSA_do_sign(tbs, sig, ctx->pkey->dsa);
  2798. /* wolfSSL_DSA_do_sign() can return WOLFSSL_FATAL_ERROR */
  2799. if (ret != WOLFSSL_SUCCESS)
  2800. return ret;
  2801. if (bytes == WOLFSSL_FAILURE)
  2802. return WOLFSSL_FAILURE;
  2803. *siglen = (size_t)bytes;
  2804. return WOLFSSL_SUCCESS;
  2805. }
  2806. #endif /* NO_DSA */
  2807. #ifdef HAVE_ECC
  2808. case EVP_PKEY_EC: {
  2809. int ret;
  2810. WOLFSSL_ECDSA_SIG *ecdsaSig;
  2811. if (!sig) {
  2812. WOLFSSL_EC_KEY *key = ctx->pkey->ecc;
  2813. ecc_key* eckey;
  2814. if (!key)
  2815. return WOLFSSL_FAILURE;
  2816. /* set internal key if not done */
  2817. if (key->inSet == 0 && SetECKeyInternal(key) != WOLFSSL_SUCCESS)
  2818. return WOLFSSL_FAILURE;
  2819. eckey = (ecc_key*)ctx->pkey->ecc->internal;
  2820. if (!eckey)
  2821. return WOLFSSL_FAILURE;
  2822. ret = wc_ecc_sig_size(eckey);
  2823. if (ret == 0)
  2824. return WOLFSSL_FAILURE;
  2825. *siglen = (size_t)ret;
  2826. return WOLFSSL_SUCCESS;
  2827. }
  2828. ecdsaSig = wolfSSL_ECDSA_do_sign(tbs, (int)tbslen, ctx->pkey->ecc);
  2829. if (ecdsaSig == NULL)
  2830. return WOLFSSL_FAILURE;
  2831. ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
  2832. if (ret == 0 || ret > (int)*siglen) {
  2833. wolfSSL_ECDSA_SIG_free(ecdsaSig);
  2834. return WOLFSSL_FAILURE;
  2835. }
  2836. ret = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sig);
  2837. wolfSSL_ECDSA_SIG_free(ecdsaSig);
  2838. if (ret == 0)
  2839. return WOLFSSL_FAILURE;
  2840. *siglen = (size_t)ret;
  2841. return WOLFSSL_SUCCESS;
  2842. }
  2843. #endif /* HAVE_ECC */
  2844. default:
  2845. break;
  2846. }
  2847. return WOLFSSL_FAILURE;
  2848. }
  2849. /******************************************************************************
  2850. * wolfSSL_EVP_PKEY_verify_init - initializes a public key algorithm context for
  2851. * a verification operation.
  2852. *
  2853. * RETURNS:
  2854. * returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. In particular
  2855. * a return value of -2 indicates the operation is not supported by the public
  2856. * key algorithm.
  2857. */
  2858. int wolfSSL_EVP_PKEY_verify_init(WOLFSSL_EVP_PKEY_CTX *ctx)
  2859. {
  2860. WOLFSSL_MSG("wolfSSL_EVP_PKEY_verify_init");
  2861. if (!ctx || !ctx->pkey)
  2862. return WOLFSSL_FAILURE;
  2863. switch (ctx->pkey->type) {
  2864. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  2865. case EVP_PKEY_RSA:
  2866. ctx->op = EVP_PKEY_OP_VERIFY;
  2867. return WOLFSSL_SUCCESS;
  2868. #endif /* NO_RSA */
  2869. #ifndef NO_DSA
  2870. case EVP_PKEY_DSA:
  2871. ctx->op = EVP_PKEY_OP_VERIFY;
  2872. return WOLFSSL_SUCCESS;
  2873. #endif /* NO_DSA */
  2874. #ifdef HAVE_ECC
  2875. case EVP_PKEY_EC:
  2876. ctx->op = EVP_PKEY_OP_VERIFY;
  2877. return WOLFSSL_SUCCESS;
  2878. #endif /* HAVE_ECC */
  2879. default:
  2880. return -2;
  2881. }
  2882. }
  2883. /******************************************************************************
  2884. * wolfSSL_EVP_PKEY_verify - verifies a signature using ctx
  2885. *
  2886. * RETURNS:
  2887. * returns WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. In particular
  2888. * a return value of -2 indicates the operation is not supported by the public
  2889. * key algorithm.
  2890. */
  2891. int wolfSSL_EVP_PKEY_verify(WOLFSSL_EVP_PKEY_CTX *ctx, const unsigned char *sig,
  2892. size_t siglen, const unsigned char *tbs,
  2893. size_t tbslen)
  2894. {
  2895. WOLFSSL_MSG("wolfSSL_EVP_PKEY_verify");
  2896. if (!ctx || ctx->op != EVP_PKEY_OP_VERIFY || !ctx->pkey)
  2897. return WOLFSSL_FAILURE;
  2898. switch (ctx->pkey->type) {
  2899. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  2900. case EVP_PKEY_RSA:
  2901. return wolfSSL_RSA_verify_ex(WC_HASH_TYPE_NONE, tbs,
  2902. (unsigned int)tbslen, sig, (unsigned int)siglen, ctx->pkey->rsa,
  2903. ctx->padding);
  2904. #endif /* NO_RSA */
  2905. #ifndef NO_DSA
  2906. case EVP_PKEY_DSA: {
  2907. int dsacheck = 0;
  2908. if (wolfSSL_DSA_do_verify(tbs, (unsigned char *)sig, ctx->pkey->dsa,
  2909. &dsacheck) != WOLFSSL_SUCCESS || dsacheck != 1)
  2910. return WOLFSSL_FAILURE;
  2911. return WOLFSSL_SUCCESS;
  2912. }
  2913. #endif /* NO_DSA */
  2914. #ifdef HAVE_ECC
  2915. case EVP_PKEY_EC: {
  2916. int ret;
  2917. WOLFSSL_ECDSA_SIG *ecdsaSig = wolfSSL_d2i_ECDSA_SIG(
  2918. NULL, (const unsigned char **)&sig, (long)siglen);
  2919. if (ecdsaSig == NULL)
  2920. return WOLFSSL_FAILURE;
  2921. ret = wolfSSL_ECDSA_do_verify(tbs, (int)tbslen, ecdsaSig,
  2922. ctx->pkey->ecc);
  2923. wolfSSL_ECDSA_SIG_free(ecdsaSig);
  2924. return ret;
  2925. }
  2926. #endif /* HAVE_ECC */
  2927. default:
  2928. return -2;
  2929. }
  2930. }
  2931. /* Get the size in bits for WOLFSSL_EVP_PKEY key
  2932. *
  2933. * pkey WOLFSSL_EVP_PKEY structure to get key size of
  2934. *
  2935. * returns the size in bits of key on success
  2936. */
  2937. int wolfSSL_EVP_PKEY_bits(const WOLFSSL_EVP_PKEY *pkey)
  2938. {
  2939. int bytes;
  2940. if (pkey == NULL) return 0;
  2941. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_bits");
  2942. if ((bytes = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey)) ==0) return 0;
  2943. return bytes*8;
  2944. }
  2945. int wolfSSL_EVP_PKEY_paramgen_init(WOLFSSL_EVP_PKEY_CTX *ctx)
  2946. {
  2947. (void)ctx;
  2948. return WOLFSSL_SUCCESS;
  2949. }
  2950. int wolfSSL_EVP_PKEY_CTX_set_ec_paramgen_curve_nid(WOLFSSL_EVP_PKEY_CTX *ctx,
  2951. int nid)
  2952. {
  2953. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_set_ec_paramgen_curve_nid");
  2954. #ifdef HAVE_ECC
  2955. if (ctx != NULL && ctx->pkey != NULL && ctx->pkey->type == EVP_PKEY_EC) {
  2956. ctx->curveNID = nid;
  2957. return WOLFSSL_SUCCESS;
  2958. }
  2959. else
  2960. #endif
  2961. {
  2962. #ifndef HAVE_ECC
  2963. (void)ctx;
  2964. (void)nid;
  2965. WOLFSSL_MSG("Support not compiled in");
  2966. #else
  2967. WOLFSSL_MSG("Bad parameter");
  2968. #endif
  2969. return WOLFSSL_FAILURE;
  2970. }
  2971. }
  2972. int wolfSSL_EVP_PKEY_paramgen(WOLFSSL_EVP_PKEY_CTX* ctx,
  2973. WOLFSSL_EVP_PKEY** pkey)
  2974. {
  2975. int ret = WOLFSSL_SUCCESS;
  2976. int ownPkey = 0;
  2977. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_paramgen");
  2978. if (ctx == NULL || pkey == NULL) {
  2979. WOLFSSL_MSG("Bad parameter");
  2980. ret = WOLFSSL_FAILURE;
  2981. }
  2982. if (ret == WOLFSSL_SUCCESS && *pkey == NULL) {
  2983. /* Only ECC is supported currently. */
  2984. if (ctx->pkey == NULL || ctx->pkey->type != EVP_PKEY_EC) {
  2985. WOLFSSL_MSG("Key not set or key type not supported.");
  2986. ret = WOLFSSL_FAILURE;
  2987. }
  2988. else {
  2989. *pkey = wolfSSL_EVP_PKEY_new();
  2990. if (*pkey == NULL) {
  2991. WOLFSSL_MSG("Failed to create WOLFSSL_EVP_PKEY.");
  2992. ret = WOLFSSL_FAILURE;
  2993. }
  2994. else {
  2995. (*pkey)->type = ctx->pkey->type;
  2996. ownPkey = 1;
  2997. }
  2998. }
  2999. }
  3000. if (ret == WOLFSSL_SUCCESS) {
  3001. switch ((*pkey)->type) {
  3002. #ifdef HAVE_ECC
  3003. /* For ECC parameter generation we just need to set the group, which
  3004. * wolfSSL_EC_KEY_new_by_curve_name will do. */
  3005. case EVP_PKEY_EC:
  3006. (*pkey)->ecc = wolfSSL_EC_KEY_new_by_curve_name(ctx->curveNID);
  3007. if ((*pkey)->ecc == NULL) {
  3008. WOLFSSL_MSG("Failed to create WOLFSSL_EC_KEY.");
  3009. ret = WOLFSSL_FAILURE;
  3010. }
  3011. else {
  3012. (*pkey)->ownEcc = 1;
  3013. }
  3014. break;
  3015. #endif
  3016. default:
  3017. ret = WOLFSSL_FAILURE;
  3018. break;
  3019. }
  3020. }
  3021. if (ret != WOLFSSL_SUCCESS && ownPkey) {
  3022. wolfSSL_EVP_PKEY_free(*pkey);
  3023. *pkey = NULL;
  3024. }
  3025. WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_paramgen", ret);
  3026. return ret;
  3027. }
  3028. /* wolfSSL only supports writing out named curves so no need to store the flag.
  3029. * In short, it is preferred to write out the name of the curve chosen instead
  3030. * of the explicit parameters.
  3031. * The difference is nicely explained and illustrated in section
  3032. * "ECDH and Named Curves" of
  3033. * https://wiki.openssl.org/index.php/Elliptic_Curve_Diffie_Hellman */
  3034. int wolfSSL_EVP_PKEY_CTX_set_ec_param_enc(WOLFSSL_EVP_PKEY_CTX *ctx,
  3035. int flag)
  3036. {
  3037. (void)ctx;
  3038. (void)flag;
  3039. return WOLFSSL_SUCCESS;
  3040. }
  3041. int wolfSSL_EVP_PKEY_keygen_init(WOLFSSL_EVP_PKEY_CTX *ctx)
  3042. {
  3043. (void)ctx;
  3044. return WOLFSSL_SUCCESS;
  3045. }
  3046. int wolfSSL_EVP_PKEY_keygen(WOLFSSL_EVP_PKEY_CTX *ctx,
  3047. WOLFSSL_EVP_PKEY **ppkey)
  3048. {
  3049. int ret = WOLFSSL_FAILURE;
  3050. int ownPkey = 0;
  3051. WOLFSSL_EVP_PKEY* pkey;
  3052. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_keygen");
  3053. if (ctx == NULL || ppkey == NULL) {
  3054. return BAD_FUNC_ARG;
  3055. }
  3056. pkey = *ppkey;
  3057. if (pkey == NULL) {
  3058. if (ctx->pkey == NULL ||
  3059. (ctx->pkey->type != EVP_PKEY_EC &&
  3060. ctx->pkey->type != EVP_PKEY_RSA &&
  3061. ctx->pkey->type != EVP_PKEY_DH)) {
  3062. WOLFSSL_MSG("Key not set or key type not supported");
  3063. return BAD_FUNC_ARG;
  3064. }
  3065. pkey = wolfSSL_EVP_PKEY_new();
  3066. if (pkey == NULL) {
  3067. return MEMORY_E;
  3068. }
  3069. ownPkey = 1;
  3070. pkey->type = ctx->pkey->type;
  3071. }
  3072. switch (pkey->type) {
  3073. #if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \
  3074. !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  3075. case EVP_PKEY_RSA:
  3076. pkey->rsa = wolfSSL_RSA_generate_key(ctx->nbits, WC_RSA_EXPONENT,
  3077. NULL, NULL);
  3078. if (pkey->rsa) {
  3079. pkey->ownRsa = 1;
  3080. pkey->pkey_sz = wolfSSL_i2d_RSAPrivateKey(pkey->rsa,
  3081. (unsigned char**)&pkey->pkey.ptr);
  3082. ret = WOLFSSL_SUCCESS;
  3083. }
  3084. break;
  3085. #endif
  3086. #ifdef HAVE_ECC
  3087. case EVP_PKEY_EC:
  3088. /* pkey->ecc may not be NULL, if, for example, it was populated by a
  3089. * prior call to wolfSSL_EVP_PKEY_paramgen. */
  3090. if (pkey->ecc == NULL) {
  3091. pkey->ecc = wolfSSL_EC_KEY_new_by_curve_name(ctx->curveNID);
  3092. }
  3093. if (pkey->ecc) {
  3094. ret = wolfSSL_EC_KEY_generate_key(pkey->ecc);
  3095. if (ret == WOLFSSL_SUCCESS) {
  3096. pkey->ownEcc = 1;
  3097. }
  3098. }
  3099. break;
  3100. #endif
  3101. #if !defined(NO_DH) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
  3102. case EVP_PKEY_DH:
  3103. pkey->dh = wolfSSL_DH_new();
  3104. if (pkey->dh) {
  3105. pkey->ownDh = 1;
  3106. /* load DH params from CTX */
  3107. ret = wolfSSL_DH_LoadDer(pkey->dh,
  3108. (const unsigned char*)ctx->pkey->pkey.ptr,
  3109. ctx->pkey->pkey_sz);
  3110. if (ret == WOLFSSL_SUCCESS) {
  3111. ret = wolfSSL_DH_generate_key(pkey->dh);
  3112. }
  3113. if (ret == WOLFSSL_SUCCESS) {
  3114. /* copy private/public key from external to internal */
  3115. ret = SetDhInternal(pkey->dh);
  3116. }
  3117. }
  3118. break;
  3119. #endif
  3120. default:
  3121. break;
  3122. }
  3123. if (ret != WOLFSSL_SUCCESS && ownPkey) {
  3124. wolfSSL_EVP_PKEY_free(pkey);
  3125. pkey = NULL;
  3126. }
  3127. *ppkey = pkey;
  3128. return ret;
  3129. }
  3130. /* Get the size in bytes for WOLFSSL_EVP_PKEY key
  3131. *
  3132. * pkey WOLFSSL_EVP_PKEY structure to get key size of
  3133. *
  3134. * returns the size of a key on success which is the maximum size of a
  3135. * signature
  3136. */
  3137. int wolfSSL_EVP_PKEY_size(WOLFSSL_EVP_PKEY *pkey)
  3138. {
  3139. if (pkey == NULL) return 0;
  3140. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_size");
  3141. switch (pkey->type) {
  3142. #ifndef NO_RSA
  3143. case EVP_PKEY_RSA:
  3144. return (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(pkey->rsa));
  3145. #endif /* !NO_RSA */
  3146. #ifndef NO_DSA
  3147. case EVP_PKEY_DSA:
  3148. if (pkey->dsa == NULL ||
  3149. (!pkey->dsa->exSet &&
  3150. SetDsaExternal(pkey->dsa) != WOLFSSL_SUCCESS))
  3151. return WOLFSSL_FAILURE;
  3152. return wolfSSL_BN_num_bytes(pkey->dsa->p);
  3153. #endif
  3154. #ifdef HAVE_ECC
  3155. case EVP_PKEY_EC:
  3156. if (pkey->ecc == NULL || pkey->ecc->internal == NULL) {
  3157. WOLFSSL_MSG("No ECC key has been set");
  3158. break;
  3159. }
  3160. return wc_ecc_size((ecc_key*)(pkey->ecc->internal));
  3161. #endif /* HAVE_ECC */
  3162. default:
  3163. break;
  3164. }
  3165. return 0;
  3166. }
  3167. int wolfSSL_EVP_PKEY_copy_parameters(WOLFSSL_EVP_PKEY *to,
  3168. const WOLFSSL_EVP_PKEY *from)
  3169. {
  3170. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_copy_parameters");
  3171. if (!to || !from) {
  3172. WOLFSSL_MSG("Bad parameter");
  3173. return WOLFSSL_FAILURE;
  3174. }
  3175. if (to->type == EVP_PKEY_NONE) {
  3176. to->type = from->type;
  3177. }
  3178. else if (to->type != from->type) {
  3179. WOLFSSL_MSG("Different key types");
  3180. return WOLFSSL_FAILURE;
  3181. }
  3182. switch(from->type) {
  3183. #ifdef HAVE_ECC
  3184. case EVP_PKEY_EC:
  3185. if (from->ecc) {
  3186. if (!to->ecc) {
  3187. if ((to->ecc = wolfSSL_EC_KEY_new()) == NULL) {
  3188. WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
  3189. return WOLFSSL_FAILURE;
  3190. }
  3191. to->ownEcc = 1;
  3192. }
  3193. to->ecc->group->curve_idx = from->ecc->group->curve_idx;
  3194. to->ecc->group->curve_nid = from->ecc->group->curve_nid;
  3195. to->ecc->group->curve_oid = from->ecc->group->curve_oid;
  3196. }
  3197. else {
  3198. WOLFSSL_MSG("Missing ECC struct");
  3199. return WOLFSSL_FAILURE;
  3200. }
  3201. break;
  3202. #endif
  3203. #ifndef NO_DSA
  3204. case EVP_PKEY_DSA:
  3205. if (from->dsa) {
  3206. WOLFSSL_BIGNUM* cpy;
  3207. if (!to->dsa) {
  3208. if ((to->dsa = wolfSSL_DSA_new()) == NULL) {
  3209. WOLFSSL_MSG("wolfSSL_DSA_new error");
  3210. return WOLFSSL_FAILURE;
  3211. }
  3212. to->ownDsa = 1;
  3213. }
  3214. /* free existing BIGNUMs if needed before copying over new */
  3215. wolfSSL_BN_free(to->dsa->p);
  3216. wolfSSL_BN_free(to->dsa->g);
  3217. wolfSSL_BN_free(to->dsa->q);
  3218. to->dsa->p = NULL;
  3219. to->dsa->g = NULL;
  3220. to->dsa->q = NULL;
  3221. if (!(cpy = wolfSSL_BN_dup(from->dsa->p))) {
  3222. WOLFSSL_MSG("wolfSSL_BN_dup error");
  3223. return WOLFSSL_FAILURE;
  3224. }
  3225. to->dsa->p = cpy;
  3226. if (!(cpy = wolfSSL_BN_dup(from->dsa->q))) {
  3227. WOLFSSL_MSG("wolfSSL_BN_dup error");
  3228. return WOLFSSL_FAILURE;
  3229. }
  3230. to->dsa->q = cpy;
  3231. if (!(cpy = wolfSSL_BN_dup(from->dsa->g))) {
  3232. WOLFSSL_MSG("wolfSSL_BN_dup error");
  3233. return WOLFSSL_FAILURE;
  3234. }
  3235. to->dsa->g = cpy;
  3236. }
  3237. else {
  3238. WOLFSSL_MSG("Missing DSA struct");
  3239. return WOLFSSL_FAILURE;
  3240. }
  3241. break;
  3242. #endif
  3243. #ifndef NO_DH
  3244. case EVP_PKEY_DH:
  3245. if (from->dh) {
  3246. WOLFSSL_BIGNUM* cpy;
  3247. if (!to->dh) {
  3248. if ((to->dh = wolfSSL_DH_new()) == NULL) {
  3249. WOLFSSL_MSG("wolfSSL_DH_new error");
  3250. return WOLFSSL_FAILURE;
  3251. }
  3252. to->ownDh = 1;
  3253. }
  3254. /* free existing BIGNUMs if needed before copying over new */
  3255. wolfSSL_BN_free(to->dh->p);
  3256. wolfSSL_BN_free(to->dh->g);
  3257. wolfSSL_BN_free(to->dh->q);
  3258. to->dh->p = NULL;
  3259. to->dh->g = NULL;
  3260. to->dh->q = NULL;
  3261. if (!(cpy = wolfSSL_BN_dup(from->dh->p))) {
  3262. WOLFSSL_MSG("wolfSSL_BN_dup error, DH p");
  3263. return WOLFSSL_FAILURE;
  3264. }
  3265. to->dh->p = cpy;
  3266. if (!(cpy = wolfSSL_BN_dup(from->dh->g))) {
  3267. WOLFSSL_MSG("wolfSSL_BN_dup error, DH g");
  3268. return WOLFSSL_FAILURE;
  3269. }
  3270. to->dh->g = cpy;
  3271. if (!(cpy = wolfSSL_BN_dup(from->dh->q))) {
  3272. WOLFSSL_MSG("wolfSSL_BN_dup error, DH q");
  3273. return WOLFSSL_FAILURE;
  3274. }
  3275. to->dh->q = cpy;
  3276. }
  3277. else {
  3278. WOLFSSL_MSG("Missing DH struct");
  3279. return WOLFSSL_FAILURE;
  3280. }
  3281. break;
  3282. #endif
  3283. #ifndef NO_RSA
  3284. case EVP_PKEY_RSA:
  3285. #endif
  3286. default:
  3287. WOLFSSL_MSG("Copy parameters not available for this key type");
  3288. return WOLFSSL_FAILURE;
  3289. }
  3290. return WOLFSSL_SUCCESS;
  3291. }
  3292. #ifndef NO_WOLFSSL_STUB
  3293. int wolfSSL_EVP_PKEY_missing_parameters(WOLFSSL_EVP_PKEY *pkey)
  3294. {
  3295. (void)pkey;
  3296. /* not using missing params callback and returning zero to indicate success */
  3297. return 0;
  3298. }
  3299. #endif
  3300. /* wolfSSL_EVP_PKEY_cmp
  3301. * returns 0 on success, -1 on failure.
  3302. *
  3303. * This behavior is different from openssl.
  3304. * EVP_PKEY_cmp returns:
  3305. * 1 : two keys match
  3306. * 0 : do not match
  3307. * -1: key types are different
  3308. * -2: the operation is not supported
  3309. * If you want this function behave the same as openSSL,
  3310. * define WOLFSSL_ERROR_CODE_OPENSSL so that WS_RETURN_CODE translates return
  3311. * codes to match OpenSSL equivalent behavior.
  3312. */
  3313. int wolfSSL_EVP_PKEY_cmp(const WOLFSSL_EVP_PKEY *a, const WOLFSSL_EVP_PKEY *b)
  3314. {
  3315. int ret = -1; /* failure */
  3316. int a_sz = 0, b_sz = 0;
  3317. if (a == NULL || b == NULL)
  3318. return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
  3319. /* check its the same type of key */
  3320. if (a->type != b->type)
  3321. return WS_RETURN_CODE(ret, -1);
  3322. /* get size based on key type */
  3323. switch (a->type) {
  3324. #ifndef NO_RSA
  3325. case EVP_PKEY_RSA:
  3326. a_sz = (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(a->rsa));
  3327. b_sz = (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(b->rsa));
  3328. break;
  3329. #endif /* !NO_RSA */
  3330. #ifdef HAVE_ECC
  3331. case EVP_PKEY_EC:
  3332. if (a->ecc == NULL || a->ecc->internal == NULL ||
  3333. b->ecc == NULL || b->ecc->internal == NULL) {
  3334. return ret;
  3335. }
  3336. a_sz = wc_ecc_size((ecc_key*)(a->ecc->internal));
  3337. b_sz = wc_ecc_size((ecc_key*)(b->ecc->internal));
  3338. break;
  3339. #endif /* HAVE_ECC */
  3340. default:
  3341. return WS_RETURN_CODE(ret, -2);
  3342. } /* switch (a->type) */
  3343. /* check size */
  3344. if (a_sz <= 0 || b_sz <= 0 || a_sz != b_sz) {
  3345. return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
  3346. }
  3347. /* check public key size */
  3348. if (a->pkey_sz > 0 && b->pkey_sz > 0 && a->pkey_sz != b->pkey_sz) {
  3349. return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
  3350. }
  3351. /* check public key */
  3352. if (a->pkey.ptr && b->pkey.ptr) {
  3353. if (XMEMCMP(a->pkey.ptr, b->pkey.ptr, (size_t)a->pkey_sz) != 0) {
  3354. return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
  3355. }
  3356. }
  3357. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  3358. ret = 1; /* the keys match */
  3359. #else
  3360. ret = 0; /* success */
  3361. #endif
  3362. return ret;
  3363. }
  3364. /**
  3365. * validate DH algorithm parameters
  3366. * @param dh_key a pointer to WOLFSSL_EVP_PKEY_CTX structure
  3367. * @return WOLFSSL_SUCCESS on success, otherwise failure
  3368. */
  3369. static int DH_param_check(WOLFSSL_DH* dh_key)
  3370. {
  3371. int ret = WOLFSSL_SUCCESS;
  3372. WOLFSSL_BN_CTX* ctx = NULL;
  3373. WOLFSSL_BIGNUM *num1 = NULL;
  3374. WOLFSSL_BIGNUM *num2 = NULL;
  3375. WOLFSSL_ENTER("DH_param_check");
  3376. ctx = wolfSSL_BN_CTX_new();
  3377. if (ctx == NULL) {
  3378. WOLFSSL_MSG("failed to allocate memory");
  3379. return WOLFSSL_FAILURE;
  3380. }
  3381. num1 = wolfSSL_BN_new();
  3382. num2 = wolfSSL_BN_new();
  3383. if (num1 == NULL || num2 == NULL) {
  3384. WOLFSSL_MSG("failed to assign big number");
  3385. ret = WOLFSSL_FAILURE;
  3386. }
  3387. /* prime check */
  3388. if (ret == WOLFSSL_SUCCESS &&
  3389. wolfSSL_BN_is_odd(dh_key->p) == 0){
  3390. WOLFSSL_MSG("dh_key->p is not prime");
  3391. ret = WOLFSSL_FAILURE;
  3392. } /* TODO safe prime check. need BN_rshift1 */
  3393. /* generator check */
  3394. if (ret == WOLFSSL_SUCCESS &&
  3395. (wolfSSL_BN_is_one(dh_key->g) ||
  3396. wolfSSL_BN_is_negative(dh_key->g) ||
  3397. wolfSSL_BN_is_zero(dh_key->g))) {
  3398. WOLFSSL_MSG("dh_key->g is not suitable generator");
  3399. ret = WOLFSSL_FAILURE;
  3400. }
  3401. if (ret == WOLFSSL_SUCCESS &&
  3402. wolfSSL_BN_cmp(dh_key->p, dh_key->g) <= 0) {
  3403. WOLFSSL_MSG("dh_key->g is not suitable generator");
  3404. ret = WOLFSSL_FAILURE;
  3405. }
  3406. if (ret == WOLFSSL_SUCCESS &&
  3407. dh_key->q != NULL)
  3408. {
  3409. if (ret == WOLFSSL_SUCCESS &&
  3410. wolfSSL_BN_mod_exp(num1, dh_key->g, dh_key->q, dh_key->p, ctx) ==
  3411. WOLFSSL_FAILURE) {
  3412. WOLFSSL_MSG("BN_mod_exp failed");
  3413. ret = WOLFSSL_FAILURE;
  3414. }
  3415. else
  3416. if (ret == WOLFSSL_SUCCESS &&
  3417. wolfSSL_BN_is_one(num1) == WOLFSSL_FAILURE) {
  3418. WOLFSSL_MSG("dh_key->g is not suitable generator");
  3419. ret = WOLFSSL_FAILURE;
  3420. }
  3421. #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN)
  3422. /* test if the number q is prime. */
  3423. if (ret == WOLFSSL_SUCCESS &&
  3424. (wolfSSL_BN_is_prime_ex(dh_key->q, 64, ctx, NULL) <= 0)) {
  3425. WOLFSSL_MSG("dh_key->q is not prime or error during check.");
  3426. ret = WOLFSSL_FAILURE;
  3427. } /* else TODO check q div q - 1. need BN_div */
  3428. #endif
  3429. }
  3430. /* clean up */
  3431. wolfSSL_BN_CTX_free(ctx);
  3432. wolfSSL_BN_free(num1);
  3433. wolfSSL_BN_free(num2);
  3434. WOLFSSL_LEAVE("DH_param_check", WOLFSSL_SUCCESS);
  3435. return ret;
  3436. }
  3437. /**
  3438. * validate the algorithm parameters
  3439. * @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
  3440. * @return WOLFSSL_SUCCESS on success, otherwise failure
  3441. */
  3442. int wolfSSL_EVP_PKEY_param_check(WOLFSSL_EVP_PKEY_CTX* ctx)
  3443. {
  3444. int type;
  3445. int ret;
  3446. WOLFSSL_DH* dh_key = NULL;
  3447. /* sanity check */
  3448. if (ctx == NULL) {
  3449. return WOLFSSL_FAILURE;
  3450. }
  3451. type = wolfSSL_EVP_PKEY_type(wolfSSL_EVP_PKEY_base_id(ctx->pkey));
  3452. switch (type) {
  3453. #if !defined(NO_RSA)
  3454. case EVP_PKEY_RSA:
  3455. WOLFSSL_MSG("EVP_PKEY_RSA not yet implemented");
  3456. return WOLFSSL_FAILURE;
  3457. #endif
  3458. #if defined(HAVE_ECC)
  3459. case EVP_PKEY_EC:
  3460. WOLFSSL_MSG("EVP_PKEY_EC not yet implemented");
  3461. return WOLFSSL_FAILURE;
  3462. #endif
  3463. #if !defined(NO_DSA)
  3464. case EVP_PKEY_DSA:
  3465. WOLFSSL_MSG("EVP_PKEY_DSA not yet implemented");
  3466. return WOLFSSL_FAILURE;
  3467. #endif
  3468. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENSSH)
  3469. #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM)
  3470. case EVP_PKEY_DH:
  3471. dh_key = wolfSSL_EVP_PKEY_get1_DH(ctx->pkey);
  3472. if (dh_key != NULL) {
  3473. ret = DH_param_check(dh_key);
  3474. wolfSSL_DH_free(dh_key);
  3475. }
  3476. else
  3477. ret = WOLFSSL_FAILURE;
  3478. return ret;
  3479. #endif
  3480. #endif
  3481. default:
  3482. WOLFSSL_MSG("Unknown PKEY type");
  3483. break;
  3484. }
  3485. (void)ret;
  3486. (void)DH_param_check;
  3487. (void)dh_key;
  3488. return WOLFSSL_FAILURE;
  3489. }
  3490. /* Initialize structure for signing
  3491. *
  3492. * ctx WOLFSSL_EVP_MD_CTX structure to initialize
  3493. * type is the type of message digest to use
  3494. *
  3495. * returns WOLFSSL_SUCCESS on success
  3496. */
  3497. int wolfSSL_EVP_SignInit(WOLFSSL_EVP_MD_CTX *ctx, const WOLFSSL_EVP_MD *type)
  3498. {
  3499. if (ctx == NULL) return WOLFSSL_FAILURE;
  3500. WOLFSSL_ENTER("EVP_SignInit");
  3501. return wolfSSL_EVP_DigestInit(ctx,type);
  3502. }
  3503. int wolfSSL_EVP_SignInit_ex(WOLFSSL_EVP_MD_CTX* ctx,
  3504. const WOLFSSL_EVP_MD* type,
  3505. WOLFSSL_ENGINE *impl)
  3506. {
  3507. if (ctx == NULL) return WOLFSSL_FAILURE;
  3508. WOLFSSL_ENTER("EVP_SignInit");
  3509. return wolfSSL_EVP_DigestInit_ex(ctx,type,impl);
  3510. }
  3511. /* Update structure with data for signing
  3512. *
  3513. * ctx WOLFSSL_EVP_MD_CTX structure to update
  3514. * data buffer holding data to update with for sign
  3515. * len length of data buffer
  3516. *
  3517. * returns WOLFSSL_SUCCESS on success
  3518. */
  3519. int wolfSSL_EVP_SignUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len)
  3520. {
  3521. if (ctx == NULL) return 0;
  3522. WOLFSSL_ENTER("EVP_SignUpdate(");
  3523. return wolfSSL_EVP_DigestUpdate(ctx, data, len);
  3524. }
  3525. static const WOLFSSL_EVP_MD* wolfSSL_macType2EVP_md(enum wc_HashType type)
  3526. {
  3527. const struct s_ent *ent ;
  3528. for (ent = md_tbl; ent->name != NULL; ent++) {
  3529. if (ent->macType == type) {
  3530. return ent->name;
  3531. }
  3532. }
  3533. return NULL;
  3534. }
  3535. /* Finalize structure for signing
  3536. *
  3537. * ctx WOLFSSL_EVP_MD_CTX structure to finalize
  3538. * sigret buffer to hold resulting signature
  3539. * siglen length of sigret buffer
  3540. * pkey key to sign with
  3541. *
  3542. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  3543. */
  3544. int wolfSSL_EVP_SignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sigret,
  3545. unsigned int *siglen, WOLFSSL_EVP_PKEY *pkey)
  3546. {
  3547. unsigned int mdsize;
  3548. unsigned char md[WC_MAX_DIGEST_SIZE];
  3549. int ret;
  3550. (void)sigret;
  3551. (void)siglen;
  3552. WOLFSSL_ENTER("EVP_SignFinal");
  3553. if (ctx == NULL)
  3554. return WOLFSSL_FAILURE;
  3555. ret = wolfSSL_EVP_DigestFinal(ctx, md, &mdsize);
  3556. if (ret <= 0)
  3557. return ret;
  3558. switch (pkey->type) {
  3559. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  3560. case EVP_PKEY_RSA: {
  3561. int nid;
  3562. const WOLFSSL_EVP_MD *ctxmd;
  3563. ctxmd = wolfSSL_EVP_MD_CTX_md(ctx);
  3564. if (ctxmd == NULL)
  3565. return WOLFSSL_FAILURE;
  3566. nid = wolfSSL_EVP_MD_type(ctxmd);
  3567. if (nid < 0)
  3568. return WOLFSSL_FAILURE;
  3569. return wolfSSL_RSA_sign(nid, md, mdsize, sigret,
  3570. siglen, pkey->rsa);
  3571. }
  3572. #endif /* NO_RSA */
  3573. #ifndef NO_DSA
  3574. case EVP_PKEY_DSA: {
  3575. int bytes;
  3576. ret = wolfSSL_DSA_do_sign(md, sigret, pkey->dsa);
  3577. /* wolfSSL_DSA_do_sign() can return WOLFSSL_FATAL_ERROR */
  3578. if (ret != WOLFSSL_SUCCESS)
  3579. return ret;
  3580. bytes = wolfSSL_BN_num_bytes(pkey->dsa->q);
  3581. if (bytes == WOLFSSL_FAILURE || (int)*siglen < bytes * 2)
  3582. return WOLFSSL_FAILURE;
  3583. *siglen = (unsigned int)(bytes * 2);
  3584. return WOLFSSL_SUCCESS;
  3585. }
  3586. #endif
  3587. case EVP_PKEY_EC:
  3588. WOLFSSL_MSG("not implemented");
  3589. FALL_THROUGH;
  3590. default:
  3591. break;
  3592. }
  3593. return WOLFSSL_FAILURE;
  3594. }
  3595. /* Initialize structure for verifying signature
  3596. *
  3597. * ctx WOLFSSL_EVP_MD_CTX structure to initialize
  3598. * type is the type of message digest to use
  3599. *
  3600. * returns WOLFSSL_SUCCESS on success
  3601. */
  3602. int wolfSSL_EVP_VerifyInit(WOLFSSL_EVP_MD_CTX *ctx, const WOLFSSL_EVP_MD *type)
  3603. {
  3604. if (ctx == NULL) return WOLFSSL_FAILURE;
  3605. WOLFSSL_ENTER("EVP_VerifyInit");
  3606. return wolfSSL_EVP_DigestInit(ctx,type);
  3607. }
  3608. /* Update structure for verifying signature
  3609. *
  3610. * ctx WOLFSSL_EVP_MD_CTX structure to update
  3611. * data buffer holding data to update with for verify
  3612. * len length of data buffer
  3613. *
  3614. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  3615. */
  3616. int wolfSSL_EVP_VerifyUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len)
  3617. {
  3618. if (ctx == NULL) return WOLFSSL_FAILURE;
  3619. WOLFSSL_ENTER("EVP_VerifyUpdate");
  3620. return wolfSSL_EVP_DigestUpdate(ctx, data, len);
  3621. }
  3622. /* Finalize structure for verifying signature
  3623. *
  3624. * ctx WOLFSSL_EVP_MD_CTX structure to finalize
  3625. * sig buffer holding signature
  3626. * siglen length of sig buffer
  3627. * pkey key to verify with
  3628. *
  3629. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  3630. */
  3631. int wolfSSL_EVP_VerifyFinal(WOLFSSL_EVP_MD_CTX *ctx,
  3632. const unsigned char*sig, unsigned int siglen, WOLFSSL_EVP_PKEY *pkey)
  3633. {
  3634. int ret;
  3635. unsigned char md[WC_MAX_DIGEST_SIZE];
  3636. unsigned int mdsize;
  3637. if (ctx == NULL) return WOLFSSL_FAILURE;
  3638. WOLFSSL_ENTER("EVP_VerifyFinal");
  3639. ret = wolfSSL_EVP_DigestFinal(ctx, md, &mdsize);
  3640. if (ret <= 0) return ret;
  3641. (void)sig;
  3642. (void)siglen;
  3643. switch (pkey->type) {
  3644. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  3645. case EVP_PKEY_RSA: {
  3646. int nid;
  3647. const WOLFSSL_EVP_MD *ctxmd = wolfSSL_EVP_MD_CTX_md(ctx);
  3648. if (ctxmd == NULL) break;
  3649. nid = wolfSSL_EVP_MD_type(ctxmd);
  3650. if (nid < 0) break;
  3651. return wolfSSL_RSA_verify(nid, md, mdsize, sig,
  3652. (unsigned int)siglen, pkey->rsa);
  3653. }
  3654. #endif /* NO_RSA */
  3655. case EVP_PKEY_DSA:
  3656. case EVP_PKEY_EC:
  3657. WOLFSSL_MSG("not implemented");
  3658. FALL_THROUGH;
  3659. default:
  3660. break;
  3661. }
  3662. return WOLFSSL_FAILURE;
  3663. }
  3664. int wolfSSL_EVP_add_cipher(const WOLFSSL_EVP_CIPHER *cipher)
  3665. {
  3666. (void)cipher;
  3667. /* nothing to do */
  3668. return 0;
  3669. }
  3670. WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_mac_key(int type, WOLFSSL_ENGINE* e,
  3671. const unsigned char* key, int keylen)
  3672. {
  3673. WOLFSSL_EVP_PKEY* pkey;
  3674. (void)e;
  3675. if (type != EVP_PKEY_HMAC || (key == NULL && keylen != 0))
  3676. return NULL;
  3677. pkey = wolfSSL_EVP_PKEY_new();
  3678. if (pkey != NULL) {
  3679. pkey->pkey.ptr = (char*)XMALLOC((size_t)keylen, NULL,
  3680. DYNAMIC_TYPE_PUBLIC_KEY);
  3681. if (pkey->pkey.ptr == NULL && keylen > 0) {
  3682. wolfSSL_EVP_PKEY_free(pkey);
  3683. pkey = NULL;
  3684. }
  3685. else {
  3686. if (keylen) {
  3687. XMEMCPY(pkey->pkey.ptr, key, (size_t)keylen);
  3688. }
  3689. pkey->pkey_sz = keylen;
  3690. pkey->type = pkey->save_type = type;
  3691. }
  3692. }
  3693. return pkey;
  3694. }
  3695. #if defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_DIRECT)
  3696. WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_CMAC_key(WOLFSSL_ENGINE* e,
  3697. const unsigned char* priv, size_t len, const WOLFSSL_EVP_CIPHER *cipher)
  3698. {
  3699. WOLFSSL_EVP_PKEY* pkey;
  3700. WOLFSSL_CMAC_CTX* ctx;
  3701. int ret = 0;
  3702. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_new_CMAC_key");
  3703. if (priv == NULL || len == 0 || cipher == NULL) {
  3704. WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", BAD_FUNC_ARG);
  3705. return NULL;
  3706. }
  3707. ctx = wolfSSL_CMAC_CTX_new();
  3708. if (ctx == NULL) {
  3709. WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
  3710. return NULL;
  3711. }
  3712. ret = wolfSSL_CMAC_Init(ctx, priv, len, cipher, e);
  3713. if (ret == WOLFSSL_FAILURE) {
  3714. wolfSSL_CMAC_CTX_free(ctx);
  3715. WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
  3716. return NULL;
  3717. }
  3718. pkey = wolfSSL_EVP_PKEY_new();
  3719. if (pkey != NULL) {
  3720. pkey->pkey.ptr = (char*)XMALLOC((size_t)len, NULL,
  3721. DYNAMIC_TYPE_PUBLIC_KEY);
  3722. if (pkey->pkey.ptr == NULL && len > 0) {
  3723. wolfSSL_EVP_PKEY_free(pkey);
  3724. pkey = NULL;
  3725. wolfSSL_CMAC_CTX_free(ctx);
  3726. }
  3727. else {
  3728. if (len) {
  3729. XMEMCPY(pkey->pkey.ptr, priv, (size_t)len);
  3730. }
  3731. pkey->pkey_sz = (int)len;
  3732. pkey->type = pkey->save_type = EVP_PKEY_CMAC;
  3733. pkey->cmacCtx = ctx;
  3734. }
  3735. }
  3736. else {
  3737. wolfSSL_CMAC_CTX_free(ctx);
  3738. }
  3739. WOLFSSL_LEAVE("wolfSSL_EVP_PKEY_new_CMAC_key", 0);
  3740. return pkey;
  3741. }
  3742. #endif /* defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_DIRECT) */
  3743. const unsigned char* wolfSSL_EVP_PKEY_get0_hmac(const WOLFSSL_EVP_PKEY* pkey,
  3744. size_t* len)
  3745. {
  3746. if (pkey == NULL || len == NULL)
  3747. return NULL;
  3748. *len = (size_t)pkey->pkey_sz;
  3749. return (const unsigned char*)pkey->pkey.ptr;
  3750. }
  3751. static int wolfssl_evp_md_to_hash_type(const WOLFSSL_EVP_MD *type,
  3752. int* hashType)
  3753. {
  3754. int ret = 0;
  3755. #ifndef NO_SHA256
  3756. if (XSTRCMP(type, "SHA256") == 0) {
  3757. *hashType = WC_SHA256;
  3758. }
  3759. else
  3760. #endif
  3761. #ifndef NO_SHA
  3762. if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, "SHA1") == 0)) {
  3763. *hashType = WC_SHA;
  3764. }
  3765. else
  3766. #endif /* NO_SHA */
  3767. #ifdef WOLFSSL_SHA224
  3768. if (XSTRCMP(type, "SHA224") == 0) {
  3769. *hashType = WC_SHA224;
  3770. }
  3771. else
  3772. #endif
  3773. #ifdef WOLFSSL_SHA384
  3774. if (XSTRCMP(type, "SHA384") == 0) {
  3775. *hashType = WC_SHA384;
  3776. }
  3777. else
  3778. #endif
  3779. #ifdef WOLFSSL_SHA512
  3780. if (XSTRCMP(type, "SHA512") == 0) {
  3781. *hashType = WC_SHA512;
  3782. }
  3783. else
  3784. #endif
  3785. #ifdef WOLFSSL_SHA3
  3786. #ifndef WOLFSSL_NOSHA3_224
  3787. if (XSTRCMP(type, "SHA3_224") == 0) {
  3788. *hashType = WC_SHA3_224;
  3789. }
  3790. else
  3791. #endif
  3792. #ifndef WOLFSSL_NOSHA3_256
  3793. if (XSTRCMP(type, "SHA3_256") == 0) {
  3794. *hashType = WC_SHA3_256;
  3795. }
  3796. else
  3797. #endif
  3798. #ifndef WOLFSSL_NOSHA3_384
  3799. if (XSTRCMP(type, "SHA3_384") == 0) {
  3800. *hashType = WC_SHA3_384;
  3801. }
  3802. else
  3803. #endif
  3804. #ifndef WOLFSSL_NOSHA3_512
  3805. if (XSTRCMP(type, "SHA3_512") == 0) {
  3806. *hashType = WC_SHA3_512;
  3807. }
  3808. else
  3809. #endif
  3810. #endif
  3811. #ifdef WOLFSSL_SM3
  3812. if (XSTRCMP(type, "SM3") == 0) {
  3813. *hashType = WC_SM3;
  3814. }
  3815. else
  3816. #endif
  3817. #ifndef NO_MD5
  3818. if (XSTRCMP(type, "MD5") == 0) {
  3819. *hashType = WC_MD5;
  3820. }
  3821. else
  3822. #endif
  3823. {
  3824. ret = BAD_FUNC_ARG;
  3825. }
  3826. return ret;
  3827. }
  3828. /* Initialize an EVP_DigestSign/Verify operation.
  3829. * Initialize a digest for RSA and ECC keys, or HMAC for HMAC key.
  3830. */
  3831. static int wolfSSL_evp_digest_pk_init(WOLFSSL_EVP_MD_CTX *ctx,
  3832. WOLFSSL_EVP_PKEY_CTX **pctx,
  3833. const WOLFSSL_EVP_MD *type,
  3834. WOLFSSL_ENGINE *e,
  3835. WOLFSSL_EVP_PKEY *pkey)
  3836. {
  3837. if (!type) {
  3838. int default_digest;
  3839. if (wolfSSL_EVP_PKEY_get_default_digest_nid(pkey, &default_digest)
  3840. != WOLFSSL_SUCCESS) {
  3841. WOLFSSL_MSG("Could not get default digest");
  3842. return WOLFSSL_FAILURE;
  3843. }
  3844. type = wolfSSL_EVP_get_digestbynid(default_digest);
  3845. if (type == NULL) {
  3846. return BAD_FUNC_ARG;
  3847. }
  3848. }
  3849. if (pkey->type == EVP_PKEY_HMAC) {
  3850. int hashType;
  3851. int ret;
  3852. size_t keySz = 0;
  3853. const unsigned char* key;
  3854. ret = wolfssl_evp_md_to_hash_type(type, &hashType);
  3855. if (ret != 0) {
  3856. return ret;
  3857. }
  3858. key = wolfSSL_EVP_PKEY_get0_hmac(pkey, &keySz);
  3859. if (wc_HmacInit(&ctx->hash.hmac, NULL, INVALID_DEVID) != 0)
  3860. return WOLFSSL_FAILURE;
  3861. if (wc_HmacSetKey(&ctx->hash.hmac, hashType, key, (word32)keySz) != 0)
  3862. return WOLFSSL_FAILURE;
  3863. ctx->isHMAC = 1;
  3864. }
  3865. else if (wolfSSL_EVP_DigestInit(ctx, type) != 1)
  3866. return WOLFSSL_FAILURE;
  3867. if (ctx->pctx == NULL) {
  3868. ctx->pctx = wolfSSL_EVP_PKEY_CTX_new(pkey, e);
  3869. if (ctx->pctx == NULL)
  3870. return WOLFSSL_FAILURE;
  3871. }
  3872. if (pctx != NULL)
  3873. *pctx = ctx->pctx;
  3874. return WOLFSSL_SUCCESS;
  3875. }
  3876. /* Update an EVP_DigestSign/Verify operation.
  3877. * Update a digest for RSA and ECC keys, or HMAC for HMAC key.
  3878. */
  3879. static int wolfssl_evp_digest_pk_update(WOLFSSL_EVP_MD_CTX *ctx,
  3880. const void *d, unsigned int cnt)
  3881. {
  3882. if (ctx->isHMAC) {
  3883. if (wc_HmacUpdate(&ctx->hash.hmac, (const byte *)d, cnt) != 0)
  3884. return WOLFSSL_FAILURE;
  3885. return WOLFSSL_SUCCESS;
  3886. }
  3887. else
  3888. return wolfSSL_EVP_DigestUpdate(ctx, d, cnt);
  3889. }
  3890. /* Finalize an EVP_DigestSign/Verify operation - common part only.
  3891. * Finalize a digest for RSA and ECC keys, or HMAC for HMAC key.
  3892. * Copies the digest so that you can keep updating.
  3893. */
  3894. static int wolfssl_evp_digest_pk_final(WOLFSSL_EVP_MD_CTX *ctx,
  3895. unsigned char *md, unsigned int* mdlen)
  3896. {
  3897. int ret;
  3898. if (ctx->isHMAC) {
  3899. Hmac hmacCopy;
  3900. if (wolfSSL_HmacCopy(&hmacCopy, &ctx->hash.hmac) != WOLFSSL_SUCCESS)
  3901. return WOLFSSL_FAILURE;
  3902. ret = wc_HmacFinal(&hmacCopy, md) == 0;
  3903. wc_HmacFree(&hmacCopy);
  3904. return ret;
  3905. }
  3906. else {
  3907. WOLFSSL_EVP_MD_CTX ctxCopy;
  3908. wolfSSL_EVP_MD_CTX_init(&ctxCopy);
  3909. if (wolfSSL_EVP_MD_CTX_copy_ex(&ctxCopy, ctx) != WOLFSSL_SUCCESS)
  3910. return WOLFSSL_FAILURE;
  3911. ret = wolfSSL_EVP_DigestFinal(&ctxCopy, md, mdlen);
  3912. wolfSSL_EVP_MD_CTX_cleanup(&ctxCopy);
  3913. return ret;
  3914. }
  3915. }
  3916. /* Get the length of the mac based on the digest algorithm. */
  3917. static unsigned int wolfssl_mac_len(unsigned char macType)
  3918. {
  3919. unsigned int hashLen;
  3920. switch (macType) {
  3921. #ifndef NO_MD5
  3922. case WC_MD5:
  3923. hashLen = WC_MD5_DIGEST_SIZE;
  3924. break;
  3925. #endif /* !NO_MD5 */
  3926. #ifndef NO_SHA
  3927. case WC_SHA:
  3928. hashLen = WC_SHA_DIGEST_SIZE;
  3929. break;
  3930. #endif /* !NO_SHA */
  3931. #ifdef WOLFSSL_SHA224
  3932. case WC_SHA224:
  3933. hashLen = WC_SHA224_DIGEST_SIZE;
  3934. break;
  3935. #endif /* WOLFSSL_SHA224 */
  3936. #ifndef NO_SHA256
  3937. case WC_SHA256:
  3938. hashLen = WC_SHA256_DIGEST_SIZE;
  3939. break;
  3940. #endif /* !NO_SHA256 */
  3941. #ifdef WOLFSSL_SHA384
  3942. case WC_SHA384:
  3943. hashLen = WC_SHA384_DIGEST_SIZE;
  3944. break;
  3945. #endif /* WOLFSSL_SHA384 */
  3946. #ifdef WOLFSSL_SHA512
  3947. case WC_SHA512:
  3948. hashLen = WC_SHA512_DIGEST_SIZE;
  3949. break;
  3950. #endif /* WOLFSSL_SHA512 */
  3951. #ifdef HAVE_BLAKE2
  3952. case BLAKE2B_ID:
  3953. hashLen = BLAKE2B_OUTBYTES;
  3954. break;
  3955. #endif /* HAVE_BLAKE2 */
  3956. #ifdef WOLFSSL_SHA3
  3957. #ifndef WOLFSSL_NOSHA3_224
  3958. case WC_SHA3_224:
  3959. hashLen = WC_SHA3_224_DIGEST_SIZE;
  3960. break;
  3961. #endif
  3962. #ifndef WOLFSSL_NOSHA3_256
  3963. case WC_SHA3_256:
  3964. hashLen = WC_SHA3_256_DIGEST_SIZE;
  3965. break;
  3966. #endif
  3967. #ifndef WOLFSSL_NOSHA3_384
  3968. case WC_SHA3_384:
  3969. hashLen = WC_SHA3_384_DIGEST_SIZE;
  3970. break;
  3971. #endif
  3972. #ifndef WOLFSSL_NOSHA3_512
  3973. case WC_SHA3_512:
  3974. hashLen = WC_SHA3_512_DIGEST_SIZE;
  3975. break;
  3976. #endif
  3977. #endif
  3978. #ifdef WOLFSSL_SM3
  3979. case WC_SM3:
  3980. hashLen = WC_SM3_DIGEST_SIZE;
  3981. break;
  3982. #endif /* WOLFSSL_SM3 */
  3983. default:
  3984. hashLen = 0;
  3985. }
  3986. return hashLen;
  3987. }
  3988. int wolfSSL_EVP_DigestSignInit(WOLFSSL_EVP_MD_CTX *ctx,
  3989. WOLFSSL_EVP_PKEY_CTX **pctx,
  3990. const WOLFSSL_EVP_MD *type,
  3991. WOLFSSL_ENGINE *e,
  3992. WOLFSSL_EVP_PKEY *pkey)
  3993. {
  3994. WOLFSSL_ENTER("EVP_DigestSignInit");
  3995. if (ctx == NULL || pkey == NULL)
  3996. return BAD_FUNC_ARG;
  3997. return wolfSSL_evp_digest_pk_init(ctx, pctx, type, e, pkey);
  3998. }
  3999. int wolfSSL_EVP_DigestSignUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *d,
  4000. unsigned int cnt)
  4001. {
  4002. WOLFSSL_ENTER("EVP_DigestSignUpdate");
  4003. if (ctx == NULL || d == NULL)
  4004. return BAD_FUNC_ARG;
  4005. return wolfssl_evp_digest_pk_update(ctx, d, cnt);
  4006. }
  4007. int wolfSSL_EVP_DigestSignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sig,
  4008. size_t *siglen)
  4009. {
  4010. unsigned char digest[WC_MAX_DIGEST_SIZE];
  4011. unsigned int hashLen;
  4012. int ret = WOLFSSL_FAILURE;
  4013. WOLFSSL_ENTER("EVP_DigestSignFinal");
  4014. if (ctx == NULL || siglen == NULL)
  4015. return WOLFSSL_FAILURE;
  4016. /* Return the maximum size of the signature when sig is NULL. */
  4017. if (ctx->isHMAC) {
  4018. hashLen = wolfssl_mac_len(ctx->hash.hmac.macType);
  4019. if (sig == NULL) {
  4020. *siglen = hashLen;
  4021. return WOLFSSL_SUCCESS;
  4022. }
  4023. }
  4024. #ifndef NO_RSA
  4025. else if (ctx->pctx->pkey->type == EVP_PKEY_RSA) {
  4026. if (sig == NULL) {
  4027. *siglen = (size_t)wolfSSL_RSA_size(ctx->pctx->pkey->rsa);
  4028. return WOLFSSL_SUCCESS;
  4029. }
  4030. }
  4031. #endif /* !NO_RSA */
  4032. #ifdef HAVE_ECC
  4033. else if (ctx->pctx->pkey->type == EVP_PKEY_EC) {
  4034. if (sig == NULL) {
  4035. /* SEQ + INT + INT */
  4036. *siglen = (size_t)ecc_sets[ctx->pctx->pkey->ecc->group->curve_idx].
  4037. size * 2 + 8;
  4038. return WOLFSSL_SUCCESS;
  4039. }
  4040. }
  4041. #endif
  4042. if (wolfssl_evp_digest_pk_final(ctx, digest, &hashLen) <= 0)
  4043. return WOLFSSL_FAILURE;
  4044. if (ctx->isHMAC) {
  4045. /* Copy the HMAC result as signature. */
  4046. if ((unsigned int)(*siglen) > hashLen)
  4047. *siglen = hashLen;
  4048. /* May be a truncated signature. */
  4049. XMEMCPY(sig, digest, (size_t)*siglen);
  4050. ret = WOLFSSL_SUCCESS;
  4051. }
  4052. else {
  4053. /* Sign the digest. */
  4054. switch (ctx->pctx->pkey->type) {
  4055. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  4056. case EVP_PKEY_RSA: {
  4057. unsigned int sigSz = (unsigned int)*siglen;
  4058. int nid;
  4059. const WOLFSSL_EVP_MD *md = wolfSSL_EVP_MD_CTX_md(ctx);
  4060. if (md == NULL)
  4061. break;
  4062. nid = wolfSSL_EVP_MD_type(md);
  4063. if (nid < 0)
  4064. break;
  4065. ret = wolfSSL_RSA_sign_generic_padding(nid, digest, hashLen,
  4066. sig, &sigSz, ctx->pctx->pkey->rsa, 1, ctx->pctx->padding);
  4067. if (ret >= 0)
  4068. *siglen = sigSz;
  4069. break;
  4070. }
  4071. #endif /* NO_RSA */
  4072. #ifdef HAVE_ECC
  4073. case EVP_PKEY_EC: {
  4074. int len;
  4075. WOLFSSL_ECDSA_SIG *ecdsaSig;
  4076. ecdsaSig = wolfSSL_ECDSA_do_sign(digest, (int)hashLen,
  4077. ctx->pctx->pkey->ecc);
  4078. if (ecdsaSig == NULL)
  4079. break;
  4080. len = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sig);
  4081. wolfSSL_ECDSA_SIG_free(ecdsaSig);
  4082. if (len == 0)
  4083. break;
  4084. *siglen = (size_t)len;
  4085. ret = WOLFSSL_SUCCESS;
  4086. break;
  4087. }
  4088. #endif
  4089. default:
  4090. break;
  4091. }
  4092. }
  4093. ForceZero(digest, sizeof(digest));
  4094. return ret;
  4095. }
  4096. int wolfSSL_EVP_DigestVerifyInit(WOLFSSL_EVP_MD_CTX *ctx,
  4097. WOLFSSL_EVP_PKEY_CTX **pctx,
  4098. const WOLFSSL_EVP_MD *type,
  4099. WOLFSSL_ENGINE *e,
  4100. WOLFSSL_EVP_PKEY *pkey)
  4101. {
  4102. WOLFSSL_ENTER("EVP_DigestVerifyInit");
  4103. if (ctx == NULL || type == NULL || pkey == NULL)
  4104. return BAD_FUNC_ARG;
  4105. return wolfSSL_evp_digest_pk_init(ctx, pctx, type, e, pkey);
  4106. }
  4107. int wolfSSL_EVP_DigestVerifyUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *d,
  4108. size_t cnt)
  4109. {
  4110. WOLFSSL_ENTER("EVP_DigestVerifyUpdate");
  4111. if (ctx == NULL || d == NULL)
  4112. return BAD_FUNC_ARG;
  4113. return wolfssl_evp_digest_pk_update(ctx, d, (unsigned int)cnt);
  4114. }
  4115. int wolfSSL_EVP_DigestVerifyFinal(WOLFSSL_EVP_MD_CTX *ctx,
  4116. const unsigned char *sig, size_t siglen)
  4117. {
  4118. unsigned char digest[WC_MAX_DIGEST_SIZE];
  4119. unsigned int hashLen;
  4120. WOLFSSL_ENTER("EVP_DigestVerifyFinal");
  4121. if (ctx == NULL || sig == NULL)
  4122. return WOLFSSL_FAILURE;
  4123. if (ctx->isHMAC) {
  4124. hashLen = wolfssl_mac_len(ctx->hash.hmac.macType);
  4125. if (siglen > hashLen)
  4126. return WOLFSSL_FAILURE;
  4127. /* May be a truncated signature. */
  4128. }
  4129. if (wolfssl_evp_digest_pk_final(ctx, digest, &hashLen) <= 0)
  4130. return WOLFSSL_FAILURE;
  4131. if (ctx->isHMAC) {
  4132. /* Check HMAC result matches the signature. */
  4133. if (XMEMCMP(sig, digest, (size_t)siglen) == 0)
  4134. return WOLFSSL_SUCCESS;
  4135. return WOLFSSL_FAILURE;
  4136. }
  4137. else {
  4138. /* Verify the signature with the digest. */
  4139. switch (ctx->pctx->pkey->type) {
  4140. #if !defined(NO_RSA) && !defined(HAVE_USER_RSA)
  4141. case EVP_PKEY_RSA: {
  4142. int nid;
  4143. const WOLFSSL_EVP_MD *md = wolfSSL_EVP_MD_CTX_md(ctx);
  4144. if (md == NULL)
  4145. return WOLFSSL_FAILURE;
  4146. nid = wolfSSL_EVP_MD_type(md);
  4147. if (nid < 0)
  4148. return WOLFSSL_FAILURE;
  4149. return wolfSSL_RSA_verify_ex(nid, digest, hashLen, sig,
  4150. (unsigned int)siglen,
  4151. ctx->pctx->pkey->rsa, ctx->pctx->padding);
  4152. }
  4153. #endif /* NO_RSA */
  4154. #ifdef HAVE_ECC
  4155. case EVP_PKEY_EC: {
  4156. int ret;
  4157. WOLFSSL_ECDSA_SIG *ecdsaSig;
  4158. ecdsaSig = wolfSSL_d2i_ECDSA_SIG(NULL, &sig, (long)siglen);
  4159. if (ecdsaSig == NULL)
  4160. return WOLFSSL_FAILURE;
  4161. ret = wolfSSL_ECDSA_do_verify(digest, (int)hashLen, ecdsaSig,
  4162. ctx->pctx->pkey->ecc);
  4163. wolfSSL_ECDSA_SIG_free(ecdsaSig);
  4164. return ret;
  4165. }
  4166. #endif
  4167. default:
  4168. break;
  4169. }
  4170. }
  4171. return WOLFSSL_FAILURE;
  4172. }
  4173. #ifdef WOLFSSL_APACHE_HTTPD
  4174. #if !defined(USE_WINDOWS_API) && !defined(MICROCHIP_PIC32)
  4175. #include <termios.h>
  4176. #endif
  4177. #ifndef XGETPASSWD
  4178. static int XGETPASSWD(char* buf, int bufSz) {
  4179. int ret = WOLFSSL_SUCCESS;
  4180. /* turn off echo for passwords */
  4181. #ifdef USE_WINDOWS_API
  4182. DWORD originalTerm;
  4183. DWORD newTerm;
  4184. CONSOLE_SCREEN_BUFFER_INFO screenOrig;
  4185. HANDLE stdinHandle = GetStdHandle(STD_INPUT_HANDLE);
  4186. if (GetConsoleMode(stdinHandle, &originalTerm) == 0) {
  4187. WOLFSSL_MSG("Couldn't get the original terminal settings");
  4188. return WOLFSSL_FAILURE;
  4189. }
  4190. newTerm = originalTerm;
  4191. newTerm &= ~ENABLE_ECHO_INPUT;
  4192. if (SetConsoleMode(stdinHandle, newTerm) == 0) {
  4193. WOLFSSL_MSG("Couldn't turn off echo");
  4194. return WOLFSSL_FAILURE;
  4195. }
  4196. #else
  4197. struct termios originalTerm;
  4198. struct termios newTerm;
  4199. if (tcgetattr(STDIN_FILENO, &originalTerm) != 0) {
  4200. WOLFSSL_MSG("Couldn't get the original terminal settings");
  4201. return WOLFSSL_FAILURE;
  4202. }
  4203. XMEMCPY(&newTerm, &originalTerm, sizeof(struct termios));
  4204. newTerm.c_lflag &= ~ECHO;
  4205. newTerm.c_lflag |= (ICANON | ECHONL);
  4206. if (tcsetattr(STDIN_FILENO, TCSANOW, &newTerm) != 0) {
  4207. WOLFSSL_MSG("Couldn't turn off echo");
  4208. return WOLFSSL_FAILURE;
  4209. }
  4210. #endif
  4211. if (XFGETS(buf, bufSz, stdin) == NULL) {
  4212. ret = WOLFSSL_FAILURE;
  4213. }
  4214. /* restore default echo */
  4215. #ifdef USE_WINDOWS_API
  4216. if (SetConsoleMode(stdinHandle, originalTerm) == 0) {
  4217. WOLFSSL_MSG("Couldn't restore the terminal settings");
  4218. return WOLFSSL_FAILURE;
  4219. }
  4220. #else
  4221. if (tcsetattr(STDIN_FILENO, TCSANOW, &originalTerm) != 0) {
  4222. WOLFSSL_MSG("Couldn't restore the terminal settings");
  4223. return WOLFSSL_FAILURE;
  4224. }
  4225. #endif
  4226. return ret;
  4227. }
  4228. #endif
  4229. /* returns 0 on success and -2 or -1 on failure */
  4230. int wolfSSL_EVP_read_pw_string(char* buf, int bufSz, const char* banner, int v)
  4231. {
  4232. printf("%s", banner);
  4233. if (XGETPASSWD(buf, bufSz) == WOLFSSL_FAILURE) {
  4234. return -1;
  4235. }
  4236. (void)v; /* fgets always sanity checks size of input vs buffer */
  4237. return 0;
  4238. }
  4239. #endif /* WOLFSSL_APACHE_HTTPD */
  4240. #if !defined(NO_PWDBASED) && !defined(NO_SHA) && !defined(NO_HMAC)
  4241. int wolfSSL_PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
  4242. const unsigned char *salt,
  4243. int saltlen, int iter,
  4244. int keylen, unsigned char *out)
  4245. {
  4246. const char *nostring = "";
  4247. int ret = 0;
  4248. if (pass == NULL) {
  4249. passlen = 0;
  4250. pass = nostring;
  4251. }
  4252. else if (passlen == -1) {
  4253. passlen = (int)XSTRLEN(pass);
  4254. }
  4255. ret = wc_PBKDF2((byte*)out, (byte*)pass, passlen, (byte*)salt, saltlen,
  4256. iter, keylen, WC_SHA);
  4257. if (ret == 0)
  4258. return WOLFSSL_SUCCESS;
  4259. else
  4260. return WOLFSSL_FAILURE;
  4261. }
  4262. #endif /* !NO_PWDBASED !NO_SHA*/
  4263. #if !defined(NO_PWDBASED) && !defined(NO_HMAC)
  4264. int wolfSSL_PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
  4265. const unsigned char *salt,
  4266. int saltlen, int iter,
  4267. const WOLFSSL_EVP_MD *digest,
  4268. int keylen, unsigned char *out)
  4269. {
  4270. const char *nostring = "";
  4271. int ret = 0;
  4272. if (pass == NULL) {
  4273. passlen = 0;
  4274. pass = nostring;
  4275. } else if (passlen == -1) {
  4276. passlen = (int)XSTRLEN(pass);
  4277. }
  4278. ret = wc_PBKDF2((byte*)out, (byte*)pass, passlen, (byte*)salt, saltlen,
  4279. iter, keylen, EvpMd2MacType(digest));
  4280. if (ret == 0)
  4281. return WOLFSSL_SUCCESS;
  4282. else
  4283. return WOLFSSL_FAILURE;
  4284. }
  4285. #endif /* !NO_PWDBASED */
  4286. #if defined(HAVE_SCRYPT) && defined(HAVE_PBKDF2) && !defined(NO_PWDBASED) && \
  4287. !defined(NO_SHA256)
  4288. /**
  4289. * Derives a key from the specified password and the salt using SCRYPT
  4290. * algorithm.
  4291. *
  4292. * Parameters:
  4293. * - pass :password data. no need to be null-terminated. NULL is accepted.
  4294. * - passlen :length of the password. Must be 0 when pass is NULL.
  4295. * - salt :salt. NULL is accepted.
  4296. * - saltlen :length of the salt. Must be 0 when salt is NULL.
  4297. * - N :cost parameter. Must be grater or equal to 2 and be a power of 2.
  4298. * - r :block size. Must 1 or greater.
  4299. * - p :parallelism
  4300. * - maxmem :maximum size of buffer used for calculation in definition,
  4301. * Not referred in this implementation.
  4302. * - key :derived key.
  4303. * - keylen :length of the derived key
  4304. *
  4305. * Returns:
  4306. * 1 on success, otherwise 0.
  4307. */
  4308. int wolfSSL_EVP_PBE_scrypt(const char *pass, size_t passlen,
  4309. const unsigned char *salt, size_t saltlen,
  4310. word64 N, word64 r, word64 p,
  4311. word64 maxmem, unsigned char *key, size_t keylen)
  4312. {
  4313. int ret;
  4314. int exp = 0;
  4315. (void)maxmem;
  4316. WOLFSSL_ENTER("wolfSSL_EVP_PBE_scrypt");
  4317. if (r > INT32_MAX || p > INT32_MAX) {
  4318. WOLFSSL_MSG("Doesn't support greater than 32 bit values of r and p");
  4319. return WOLFSSL_FAILURE;
  4320. }
  4321. /* N must be a power of 2 and > 2.
  4322. if (N & (N-1)) is zero, it means N is a power of 2.
  4323. */
  4324. if (N < 2 || (N & (N-1)) || r <= 0 || p <= 0)
  4325. return WOLFSSL_FAILURE;
  4326. if (key == NULL)
  4327. return WOLFSSL_SUCCESS;
  4328. /* get exponent of power of 2. Confirmed N is power of 2. */
  4329. while (N != 1) {
  4330. N >>= 1;
  4331. exp++;
  4332. }
  4333. ret = wc_scrypt(key, (const byte*)pass, (int)passlen, salt, (int)saltlen,
  4334. exp, (int)r, (int)p, (int)keylen);
  4335. WOLFSSL_LEAVE("wolfSSL_EVP_PBE_scrypt", ret);
  4336. if (ret == 0)
  4337. return WOLFSSL_SUCCESS;
  4338. else
  4339. return WOLFSSL_FAILURE;
  4340. }
  4341. #endif /* HAVE_SCRYPT && HAVE_PBKDF2 && !NO_PWDBASED && !NO_SHA */
  4342. static const struct cipher{
  4343. unsigned char type;
  4344. const char *name;
  4345. int nid;
  4346. } cipher_tbl[] = {
  4347. #ifndef NO_AES
  4348. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  4349. #ifdef WOLFSSL_AES_128
  4350. {AES_128_CBC_TYPE, EVP_AES_128_CBC, NID_aes_128_cbc},
  4351. #endif
  4352. #ifdef WOLFSSL_AES_192
  4353. {AES_192_CBC_TYPE, EVP_AES_192_CBC, NID_aes_192_cbc},
  4354. #endif
  4355. #ifdef WOLFSSL_AES_256
  4356. {AES_256_CBC_TYPE, EVP_AES_256_CBC, NID_aes_256_cbc},
  4357. #endif
  4358. #endif
  4359. #ifdef WOLFSSL_AES_CFB
  4360. #ifdef WOLFSSL_AES_128
  4361. {AES_128_CFB1_TYPE, EVP_AES_128_CFB1, NID_aes_128_cfb1},
  4362. #endif
  4363. #ifdef WOLFSSL_AES_192
  4364. {AES_192_CFB1_TYPE, EVP_AES_192_CFB1, NID_aes_192_cfb1},
  4365. #endif
  4366. #ifdef WOLFSSL_AES_256
  4367. {AES_256_CFB1_TYPE, EVP_AES_256_CFB1, NID_aes_256_cfb1},
  4368. #endif
  4369. #ifdef WOLFSSL_AES_128
  4370. {AES_128_CFB8_TYPE, EVP_AES_128_CFB8, NID_aes_128_cfb8},
  4371. #endif
  4372. #ifdef WOLFSSL_AES_192
  4373. {AES_192_CFB8_TYPE, EVP_AES_192_CFB8, NID_aes_192_cfb8},
  4374. #endif
  4375. #ifdef WOLFSSL_AES_256
  4376. {AES_256_CFB8_TYPE, EVP_AES_256_CFB8, NID_aes_256_cfb8},
  4377. #endif
  4378. #ifdef WOLFSSL_AES_128
  4379. {AES_128_CFB128_TYPE, EVP_AES_128_CFB128, NID_aes_128_cfb128},
  4380. #endif
  4381. #ifdef WOLFSSL_AES_192
  4382. {AES_192_CFB128_TYPE, EVP_AES_192_CFB128, NID_aes_192_cfb128},
  4383. #endif
  4384. #ifdef WOLFSSL_AES_256
  4385. {AES_256_CFB128_TYPE, EVP_AES_256_CFB128, NID_aes_256_cfb128},
  4386. #endif
  4387. #endif
  4388. #ifdef WOLFSSL_AES_OFB
  4389. #ifdef WOLFSSL_AES_128
  4390. {AES_128_OFB_TYPE, EVP_AES_128_OFB, NID_aes_128_ofb},
  4391. #endif
  4392. #ifdef WOLFSSL_AES_192
  4393. {AES_192_OFB_TYPE, EVP_AES_192_OFB, NID_aes_192_ofb},
  4394. #endif
  4395. #ifdef WOLFSSL_AES_256
  4396. {AES_256_OFB_TYPE, EVP_AES_256_OFB, NID_aes_256_ofb},
  4397. #endif
  4398. #endif
  4399. #if defined(WOLFSSL_AES_XTS) && \
  4400. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  4401. #ifdef WOLFSSL_AES_128
  4402. {AES_128_XTS_TYPE, EVP_AES_128_XTS, NID_aes_128_xts},
  4403. #endif
  4404. #ifdef WOLFSSL_AES_256
  4405. {AES_256_XTS_TYPE, EVP_AES_256_XTS, NID_aes_256_xts},
  4406. #endif
  4407. #endif
  4408. #ifdef HAVE_AESGCM
  4409. #ifdef WOLFSSL_AES_128
  4410. {AES_128_GCM_TYPE, EVP_AES_128_GCM, NID_aes_128_gcm},
  4411. #endif
  4412. #ifdef WOLFSSL_AES_192
  4413. {AES_192_GCM_TYPE, EVP_AES_192_GCM, NID_aes_192_gcm},
  4414. #endif
  4415. #ifdef WOLFSSL_AES_256
  4416. {AES_256_GCM_TYPE, EVP_AES_256_GCM, NID_aes_256_gcm},
  4417. #endif
  4418. #endif
  4419. #ifdef HAVE_AESCCM
  4420. #ifdef WOLFSSL_AES_128
  4421. {AES_128_CCM_TYPE, EVP_AES_128_CCM, NID_aes_128_ccm},
  4422. #endif
  4423. #ifdef WOLFSSL_AES_192
  4424. {AES_192_CCM_TYPE, EVP_AES_192_CCM, NID_aes_192_ccm},
  4425. #endif
  4426. #ifdef WOLFSSL_AES_256
  4427. {AES_256_CCM_TYPE, EVP_AES_256_CCM, NID_aes_256_ccm},
  4428. #endif
  4429. #endif
  4430. #ifdef WOLFSSL_AES_COUNTER
  4431. #ifdef WOLFSSL_AES_128
  4432. {AES_128_CTR_TYPE, EVP_AES_128_CTR, NID_aes_128_ctr},
  4433. #endif
  4434. #ifdef WOLFSSL_AES_192
  4435. {AES_192_CTR_TYPE, EVP_AES_192_CTR, NID_aes_192_ctr},
  4436. #endif
  4437. #ifdef WOLFSSL_AES_256
  4438. {AES_256_CTR_TYPE, EVP_AES_256_CTR, NID_aes_256_ctr},
  4439. #endif
  4440. #endif
  4441. #ifdef HAVE_AES_ECB
  4442. #ifdef WOLFSSL_AES_128
  4443. {AES_128_ECB_TYPE, EVP_AES_128_ECB, NID_aes_128_ecb},
  4444. #endif
  4445. #ifdef WOLFSSL_AES_192
  4446. {AES_192_ECB_TYPE, EVP_AES_192_ECB, NID_aes_192_ecb},
  4447. #endif
  4448. #ifdef WOLFSSL_AES_256
  4449. {AES_256_ECB_TYPE, EVP_AES_256_ECB, NID_aes_256_ecb},
  4450. #endif
  4451. #endif
  4452. #endif
  4453. #ifdef HAVE_ARIA
  4454. {ARIA_128_GCM_TYPE, EVP_ARIA_128_GCM, NID_aria_128_gcm},
  4455. {ARIA_192_GCM_TYPE, EVP_ARIA_192_GCM, NID_aria_192_gcm},
  4456. {ARIA_256_GCM_TYPE, EVP_ARIA_256_GCM, NID_aria_256_gcm},
  4457. #endif
  4458. #ifndef NO_DES3
  4459. {DES_CBC_TYPE, EVP_DES_CBC, NID_des_cbc},
  4460. {DES_ECB_TYPE, EVP_DES_ECB, NID_des_ecb},
  4461. {DES_EDE3_CBC_TYPE, EVP_DES_EDE3_CBC, NID_des_ede3_cbc},
  4462. {DES_EDE3_ECB_TYPE, EVP_DES_EDE3_ECB, NID_des_ede3_ecb},
  4463. #endif
  4464. #ifndef NO_RC4
  4465. {ARC4_TYPE, EVP_ARC4, NID_undef},
  4466. #endif
  4467. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  4468. {CHACHA20_POLY1305_TYPE, EVP_CHACHA20_POLY1305, NID_chacha20_poly1305},
  4469. #endif
  4470. #ifdef HAVE_CHACHA
  4471. {CHACHA20_TYPE, EVP_CHACHA20, NID_chacha20},
  4472. #endif
  4473. #ifdef WOLFSSL_SM4_ECB
  4474. {SM4_ECB_TYPE, EVP_SM4_ECB, NID_sm4_ecb},
  4475. #endif
  4476. #ifdef WOLFSSL_SM4_CBC
  4477. {SM4_CBC_TYPE, EVP_SM4_CBC, NID_sm4_cbc},
  4478. #endif
  4479. #ifdef WOLFSSL_SM4_CTR
  4480. {SM4_CTR_TYPE, EVP_SM4_CTR, NID_sm4_ctr},
  4481. #endif
  4482. #ifdef WOLFSSL_SM4_GCM
  4483. {SM4_GCM_TYPE, EVP_SM4_GCM, NID_sm4_gcm},
  4484. #endif
  4485. #ifdef WOLFSSL_SM4_CCM
  4486. {SM4_CCM_TYPE, EVP_SM4_CCM, NID_sm4_ccm},
  4487. #endif
  4488. { 0, NULL, 0}
  4489. };
  4490. /* returns cipher using provided ctx type */
  4491. const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_CIPHER_CTX_cipher(
  4492. const WOLFSSL_EVP_CIPHER_CTX *ctx)
  4493. {
  4494. const struct cipher* c;
  4495. if (!ctx || !ctx->cipherType) {
  4496. return NULL;
  4497. }
  4498. for (c = cipher_tbl; c->type != 0; c++) {
  4499. if (ctx->cipherType == c->type) {
  4500. return wolfSSL_EVP_get_cipherbyname(c->name);
  4501. }
  4502. }
  4503. return NULL;
  4504. }
  4505. int wolfSSL_EVP_CIPHER_nid(const WOLFSSL_EVP_CIPHER *cipher)
  4506. {
  4507. const struct cipher* c;
  4508. if (!cipher) {
  4509. return 0;
  4510. }
  4511. for (c = cipher_tbl; c->type != 0; c++) {
  4512. if (XSTRCMP(cipher, c->name) == 0) {
  4513. return c->nid;
  4514. }
  4515. }
  4516. return 0;
  4517. }
  4518. const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_get_cipherbyname(const char *name)
  4519. {
  4520. const struct alias {
  4521. const char *name;
  4522. const char *alias;
  4523. } cipher_alias_tbl[] = {
  4524. #ifndef NO_DES3
  4525. {EVP_DES_CBC, "des"},
  4526. {EVP_DES_ECB, "des-ecb"},
  4527. {EVP_DES_EDE3_CBC, "des3"},
  4528. {EVP_DES_EDE3_CBC, "3des"},
  4529. {EVP_DES_EDE3_ECB, "des-ede3"},
  4530. {EVP_DES_EDE3_ECB, "des-ede3-ecb"},
  4531. #endif
  4532. #ifndef NO_AES
  4533. #ifdef HAVE_AES_CBC
  4534. #ifdef WOLFSSL_AES_128
  4535. {EVP_AES_128_CBC, "aes128-cbc"},
  4536. {EVP_AES_128_CBC, "aes128"},
  4537. #endif
  4538. #ifdef WOLFSSL_AES_192
  4539. {EVP_AES_192_CBC, "aes192-cbc"},
  4540. {EVP_AES_192_CBC, "aes192"},
  4541. #endif
  4542. #ifdef WOLFSSL_AES_256
  4543. {EVP_AES_256_CBC, "aes256-cbc"},
  4544. {EVP_AES_256_CBC, "aes256"},
  4545. #endif
  4546. #endif
  4547. #ifdef HAVE_AES_ECB
  4548. #ifdef WOLFSSL_AES_128
  4549. {EVP_AES_128_ECB, "aes128-ecb"},
  4550. #endif
  4551. #ifdef WOLFSSL_AES_192
  4552. {EVP_AES_192_ECB, "aes192-ecb"},
  4553. #endif
  4554. #ifdef WOLFSSL_AES_256
  4555. {EVP_AES_256_ECB, "aes256-ecb"},
  4556. #endif
  4557. #endif
  4558. #ifdef HAVE_AESGCM
  4559. #ifdef WOLFSSL_AES_128
  4560. {EVP_AES_128_GCM, "aes-128-gcm"},
  4561. {EVP_AES_128_GCM, "id-aes128-GCM"},
  4562. #endif
  4563. #ifdef WOLFSSL_AES_192
  4564. {EVP_AES_192_GCM, "aes-192-gcm"},
  4565. {EVP_AES_192_GCM, "id-aes192-GCM"},
  4566. #endif
  4567. #ifdef WOLFSSL_AES_256
  4568. {EVP_AES_256_GCM, "aes-256-gcm"},
  4569. {EVP_AES_256_GCM, "id-aes256-GCM"},
  4570. #endif
  4571. #endif
  4572. #ifdef HAVE_AESCCM
  4573. #ifdef WOLFSSL_AES_128
  4574. {EVP_AES_128_CCM, "aes-128-ccm"},
  4575. {EVP_AES_128_CCM, "id-aes128-CCM"},
  4576. #endif
  4577. #ifdef WOLFSSL_AES_192
  4578. {EVP_AES_192_CCM, "aes-192-ccm"},
  4579. {EVP_AES_192_CCM, "id-aes192-CCM"},
  4580. #endif
  4581. #ifdef WOLFSSL_AES_256
  4582. {EVP_AES_256_CCM, "aes-256-ccm"},
  4583. {EVP_AES_256_CCM, "id-aes256-CCM"},
  4584. #endif
  4585. #endif
  4586. #endif
  4587. #ifdef HAVE_ARIA
  4588. {EVP_ARIA_128_GCM, "aria-128-gcm"},
  4589. {EVP_ARIA_128_GCM, "id-aria128-GCM"},
  4590. {EVP_ARIA_192_GCM, "aria-192-gcm"},
  4591. {EVP_ARIA_192_GCM, "id-aria192-GCM"},
  4592. {EVP_ARIA_256_GCM, "aria-256-gcm"},
  4593. {EVP_ARIA_256_GCM, "id-aria256-GCM"},
  4594. #endif
  4595. #ifdef WOLFSSL_SM4_EBC
  4596. {EVP_SM4_ECB, "sm4-ecb"},
  4597. #endif
  4598. #ifdef WOLFSSL_SM4_CBC
  4599. {EVP_SM4_CBC, "sm4"},
  4600. {EVP_SM4_CBC, "sm4-cbc"},
  4601. #endif
  4602. #ifdef WOLFSSL_SM4_CTR
  4603. {EVP_SM4_CTR, "sm4-ctr"},
  4604. #endif
  4605. #ifdef WOLFSSL_SM4_GCM
  4606. {EVP_SM4_GCM, "sm4-gcm"},
  4607. #endif
  4608. #ifdef WOLFSSL_SM4_CCM
  4609. {EVP_SM4_CCM, "sm4-ccm"},
  4610. #endif
  4611. #ifndef NO_RC4
  4612. {EVP_ARC4, "RC4"},
  4613. #endif
  4614. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  4615. {EVP_CHACHA20_POLY1305, "chacha20-poly1305"},
  4616. #endif
  4617. #ifdef HAVE_CHACHA
  4618. {EVP_CHACHA20, "chacha20"},
  4619. #endif
  4620. { NULL, NULL}
  4621. };
  4622. const struct cipher *ent;
  4623. const struct alias *al;
  4624. WOLFSSL_ENTER("EVP_get_cipherbyname");
  4625. for (al = cipher_alias_tbl; al->name != NULL; al++) {
  4626. /* Accept any case alternative version of an alias. */
  4627. if (XSTRCASECMP(name, al->alias) == 0) {
  4628. name = al->name;
  4629. break;
  4630. }
  4631. }
  4632. for (ent = cipher_tbl; ent->name != NULL; ent++) {
  4633. /* Accept any case alternative version of name. */
  4634. if (XSTRCASECMP(name, ent->name) == 0) {
  4635. return (WOLFSSL_EVP_CIPHER *)ent->name;
  4636. }
  4637. }
  4638. return NULL;
  4639. }
  4640. /*
  4641. * return an EVP_CIPHER structure when cipher NID is passed.
  4642. *
  4643. * id cipher NID
  4644. *
  4645. * return WOLFSSL_EVP_CIPHER
  4646. */
  4647. const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_get_cipherbynid(int id)
  4648. {
  4649. WOLFSSL_ENTER("EVP_get_cipherbynid");
  4650. switch(id) {
  4651. #ifndef NO_AES
  4652. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  4653. #ifdef WOLFSSL_AES_128
  4654. case NID_aes_128_cbc:
  4655. return wolfSSL_EVP_aes_128_cbc();
  4656. #endif
  4657. #ifdef WOLFSSL_AES_192
  4658. case NID_aes_192_cbc:
  4659. return wolfSSL_EVP_aes_192_cbc();
  4660. #endif
  4661. #ifdef WOLFSSL_AES_256
  4662. case NID_aes_256_cbc:
  4663. return wolfSSL_EVP_aes_256_cbc();
  4664. #endif
  4665. #endif
  4666. #ifdef WOLFSSL_AES_COUNTER
  4667. #ifdef WOLFSSL_AES_128
  4668. case NID_aes_128_ctr:
  4669. return wolfSSL_EVP_aes_128_ctr();
  4670. #endif
  4671. #ifdef WOLFSSL_AES_192
  4672. case NID_aes_192_ctr:
  4673. return wolfSSL_EVP_aes_192_ctr();
  4674. #endif
  4675. #ifdef WOLFSSL_AES_256
  4676. case NID_aes_256_ctr:
  4677. return wolfSSL_EVP_aes_256_ctr();
  4678. #endif
  4679. #endif /* WOLFSSL_AES_COUNTER */
  4680. #ifdef HAVE_AES_ECB
  4681. #ifdef WOLFSSL_AES_128
  4682. case NID_aes_128_ecb:
  4683. return wolfSSL_EVP_aes_128_ecb();
  4684. #endif
  4685. #ifdef WOLFSSL_AES_192
  4686. case NID_aes_192_ecb:
  4687. return wolfSSL_EVP_aes_192_ecb();
  4688. #endif
  4689. #ifdef WOLFSSL_AES_256
  4690. case NID_aes_256_ecb:
  4691. return wolfSSL_EVP_aes_256_ecb();
  4692. #endif
  4693. #endif /* HAVE_AES_ECB */
  4694. #ifdef HAVE_AESGCM
  4695. #ifdef WOLFSSL_AES_128
  4696. case NID_aes_128_gcm:
  4697. return wolfSSL_EVP_aes_128_gcm();
  4698. #endif
  4699. #ifdef WOLFSSL_AES_192
  4700. case NID_aes_192_gcm:
  4701. return wolfSSL_EVP_aes_192_gcm();
  4702. #endif
  4703. #ifdef WOLFSSL_AES_256
  4704. case NID_aes_256_gcm:
  4705. return wolfSSL_EVP_aes_256_gcm();
  4706. #endif
  4707. #endif
  4708. #ifdef HAVE_AESCCM
  4709. #ifdef WOLFSSL_AES_128
  4710. case NID_aes_128_ccm:
  4711. return wolfSSL_EVP_aes_128_ccm();
  4712. #endif
  4713. #ifdef WOLFSSL_AES_192
  4714. case NID_aes_192_ccm:
  4715. return wolfSSL_EVP_aes_192_ccm();
  4716. #endif
  4717. #ifdef WOLFSSL_AES_256
  4718. case NID_aes_256_ccm:
  4719. return wolfSSL_EVP_aes_256_ccm();
  4720. #endif
  4721. #endif
  4722. #endif
  4723. #ifdef HAVE_ARIA
  4724. case NID_aria_128_gcm:
  4725. return wolfSSL_EVP_aria_128_gcm();
  4726. case NID_aria_192_gcm:
  4727. return wolfSSL_EVP_aria_192_gcm();
  4728. case NID_aria_256_gcm:
  4729. return wolfSSL_EVP_aria_256_gcm();
  4730. #endif
  4731. #ifndef NO_DES3
  4732. case NID_des_cbc:
  4733. return wolfSSL_EVP_des_cbc();
  4734. #ifdef WOLFSSL_DES_ECB
  4735. case NID_des_ecb:
  4736. return wolfSSL_EVP_des_ecb();
  4737. #endif
  4738. case NID_des_ede3_cbc:
  4739. return wolfSSL_EVP_des_ede3_cbc();
  4740. #ifdef WOLFSSL_DES_ECB
  4741. case NID_des_ede3_ecb:
  4742. return wolfSSL_EVP_des_ede3_ecb();
  4743. #endif
  4744. #endif /*NO_DES3*/
  4745. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  4746. case NID_chacha20_poly1305:
  4747. return wolfSSL_EVP_chacha20_poly1305();
  4748. #endif
  4749. #ifdef HAVE_CHACHA
  4750. case NID_chacha20:
  4751. return wolfSSL_EVP_chacha20();
  4752. #endif
  4753. #ifdef WOLFSSL_SM4_ECB
  4754. case NID_sm4_ecb:
  4755. return wolfSSL_EVP_sm4_ecb();
  4756. #endif
  4757. #ifdef WOLFSSL_SM4_CBC
  4758. case NID_sm4_cbc:
  4759. return wolfSSL_EVP_sm4_cbc();
  4760. #endif
  4761. #ifdef WOLFSSL_SM4_CTR
  4762. case NID_sm4_ctr:
  4763. return wolfSSL_EVP_sm4_ctr();
  4764. #endif
  4765. #ifdef WOLFSSL_SM4_GCM
  4766. case NID_sm4_gcm:
  4767. return wolfSSL_EVP_sm4_gcm();
  4768. #endif
  4769. #ifdef WOLFSSL_SM4_CCM
  4770. case NID_sm4_ccm:
  4771. return wolfSSL_EVP_sm4_ccm();
  4772. #endif
  4773. default:
  4774. WOLFSSL_MSG("Bad cipher id value");
  4775. }
  4776. return NULL;
  4777. }
  4778. void wolfSSL_EVP_init(void)
  4779. {
  4780. /* Does nothing. */
  4781. }
  4782. /* returns WOLFSSL_SUCCESS on success */
  4783. int wolfSSL_EVP_MD_CTX_copy(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in)
  4784. {
  4785. return wolfSSL_EVP_MD_CTX_copy_ex(out, in);
  4786. }
  4787. /* Deep copy of EVP_MD hasher
  4788. * return WOLFSSL_SUCCESS on success */
  4789. static int wolfSSL_EVP_MD_Copy_Hasher(WOLFSSL_EVP_MD_CTX* des,
  4790. const WOLFSSL_EVP_MD_CTX* src)
  4791. {
  4792. if (src->isHMAC) {
  4793. return wolfSSL_HmacCopy(&des->hash.hmac, (Hmac*)&src->hash.hmac);
  4794. }
  4795. else {
  4796. int ret;
  4797. switch (src->macType) {
  4798. case WC_HASH_TYPE_MD5:
  4799. #ifndef NO_MD5
  4800. ret = wc_Md5Copy((wc_Md5*)&src->hash.digest,
  4801. (wc_Md5*)&des->hash.digest);
  4802. #else
  4803. ret = NOT_COMPILED_IN;
  4804. #endif /* !NO_MD5 */
  4805. break;
  4806. case WC_HASH_TYPE_SHA:
  4807. #ifndef NO_SHA
  4808. ret = wc_ShaCopy((wc_Sha*)&src->hash.digest,
  4809. (wc_Sha*)&des->hash.digest);
  4810. #else
  4811. ret = NOT_COMPILED_IN;
  4812. #endif /* !NO_SHA */
  4813. break;
  4814. case WC_HASH_TYPE_SHA224:
  4815. #ifdef WOLFSSL_SHA224
  4816. ret = wc_Sha224Copy((wc_Sha224*)&src->hash.digest,
  4817. (wc_Sha224*)&des->hash.digest);
  4818. #else
  4819. ret = NOT_COMPILED_IN;
  4820. #endif /* WOLFSSL_SHA224 */
  4821. break;
  4822. case WC_HASH_TYPE_SHA256:
  4823. #ifndef NO_SHA256
  4824. ret = wc_Sha256Copy((wc_Sha256*)&src->hash.digest,
  4825. (wc_Sha256*)&des->hash.digest);
  4826. #else
  4827. ret = NOT_COMPILED_IN;
  4828. #endif /* !NO_SHA256 */
  4829. break;
  4830. case WC_HASH_TYPE_SHA384:
  4831. #ifdef WOLFSSL_SHA384
  4832. ret = wc_Sha384Copy((wc_Sha384*)&src->hash.digest,
  4833. (wc_Sha384*)&des->hash.digest);
  4834. #else
  4835. ret = NOT_COMPILED_IN;
  4836. #endif /* WOLFSSL_SHA384 */
  4837. break;
  4838. case WC_HASH_TYPE_SHA512:
  4839. #ifdef WOLFSSL_SHA512
  4840. ret = wc_Sha512Copy((wc_Sha512*)&src->hash.digest,
  4841. (wc_Sha512*)&des->hash.digest);
  4842. #else
  4843. ret = NOT_COMPILED_IN;
  4844. #endif /* WOLFSSL_SHA512 */
  4845. break;
  4846. #ifndef WOLFSSL_NOSHA512_224
  4847. case WC_HASH_TYPE_SHA512_224:
  4848. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  4849. defined(WOLFSSL_SHA512)
  4850. ret = wc_Sha512_224Copy((wc_Sha512*)&src->hash.digest,
  4851. (wc_Sha512*)&des->hash.digest);
  4852. #else
  4853. ret = NOT_COMPILED_IN;
  4854. #endif
  4855. break;
  4856. #endif /* !WOLFSSL_NOSHA512_224 */
  4857. #ifndef WOLFSSL_NOSHA512_256
  4858. case WC_HASH_TYPE_SHA512_256:
  4859. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  4860. defined(WOLFSSL_SHA512)
  4861. ret = wc_Sha512_256Copy((wc_Sha512*)&src->hash.digest,
  4862. (wc_Sha512*)&des->hash.digest);
  4863. #else
  4864. ret = NOT_COMPILED_IN;
  4865. #endif
  4866. break;
  4867. #endif /* !WOLFSSL_NOSHA512_256 */
  4868. case WC_HASH_TYPE_SHA3_224:
  4869. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  4870. ret = wc_Sha3_224_Copy((wc_Sha3*)&src->hash.digest,
  4871. (wc_Sha3*)&des->hash.digest);
  4872. #else
  4873. ret = NOT_COMPILED_IN;
  4874. #endif
  4875. break;
  4876. case WC_HASH_TYPE_SHA3_256:
  4877. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  4878. ret = wc_Sha3_256_Copy((wc_Sha3*)&src->hash.digest,
  4879. (wc_Sha3*)&des->hash.digest);
  4880. #else
  4881. ret = NOT_COMPILED_IN;
  4882. #endif
  4883. break;
  4884. case WC_HASH_TYPE_SHA3_384:
  4885. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  4886. ret = wc_Sha3_384_Copy((wc_Sha3*)&src->hash.digest,
  4887. (wc_Sha3*)&des->hash.digest);
  4888. #else
  4889. ret = NOT_COMPILED_IN;
  4890. #endif
  4891. break;
  4892. case WC_HASH_TYPE_SHA3_512:
  4893. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  4894. ret = wc_Sha3_512_Copy((wc_Sha3*)&src->hash.digest,
  4895. (wc_Sha3*)&des->hash.digest);
  4896. #else
  4897. ret = NOT_COMPILED_IN;
  4898. #endif
  4899. break;
  4900. #ifdef WOLFSSL_SM3
  4901. case WC_HASH_TYPE_SM3:
  4902. ret = wc_Sm3Copy(&src->hash.digest.sm3,
  4903. &des->hash.digest.sm3);
  4904. break;
  4905. #endif
  4906. case WC_HASH_TYPE_NONE:
  4907. case WC_HASH_TYPE_MD2:
  4908. case WC_HASH_TYPE_MD4:
  4909. case WC_HASH_TYPE_MD5_SHA:
  4910. case WC_HASH_TYPE_BLAKE2B:
  4911. case WC_HASH_TYPE_BLAKE2S:
  4912. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  4913. case WC_HASH_TYPE_SHAKE128:
  4914. #endif
  4915. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  4916. case WC_HASH_TYPE_SHAKE256:
  4917. #endif
  4918. default:
  4919. ret = BAD_FUNC_ARG;
  4920. break;
  4921. }
  4922. return ret == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
  4923. }
  4924. }
  4925. /* copies structure in to the structure out
  4926. *
  4927. * returns WOLFSSL_SUCCESS on success */
  4928. int wolfSSL_EVP_MD_CTX_copy_ex(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in)
  4929. {
  4930. if ((out == NULL) || (in == NULL)) return WOLFSSL_FAILURE;
  4931. WOLFSSL_ENTER("EVP_CIPHER_MD_CTX_copy_ex");
  4932. wolfSSL_EVP_MD_CTX_cleanup(out);
  4933. XMEMCPY(out, in, sizeof(WOLFSSL_EVP_MD_CTX));
  4934. if (in->pctx != NULL) {
  4935. out->pctx = wolfSSL_EVP_PKEY_CTX_new(in->pctx->pkey, NULL);
  4936. if (out->pctx == NULL)
  4937. return WOLFSSL_FAILURE;
  4938. }
  4939. return wolfSSL_EVP_MD_Copy_Hasher(out, (WOLFSSL_EVP_MD_CTX*)in);
  4940. }
  4941. #ifndef NO_AES
  4942. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  4943. #ifdef WOLFSSL_AES_128
  4944. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cbc(void)
  4945. {
  4946. WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cbc");
  4947. return EVP_AES_128_CBC;
  4948. }
  4949. #endif /* WOLFSSL_AES_128 */
  4950. #ifdef WOLFSSL_AES_192
  4951. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cbc(void)
  4952. {
  4953. WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cbc");
  4954. return EVP_AES_192_CBC;
  4955. }
  4956. #endif /* WOLFSSL_AES_192 */
  4957. #ifdef WOLFSSL_AES_256
  4958. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cbc(void)
  4959. {
  4960. WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cbc");
  4961. return EVP_AES_256_CBC;
  4962. }
  4963. #endif /* WOLFSSL_AES_256 */
  4964. #endif /* HAVE_AES_CBC */
  4965. #ifdef WOLFSSL_AES_CFB
  4966. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  4967. #ifdef WOLFSSL_AES_128
  4968. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb1(void)
  4969. {
  4970. WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb1");
  4971. return EVP_AES_128_CFB1;
  4972. }
  4973. #endif /* WOLFSSL_AES_128 */
  4974. #ifdef WOLFSSL_AES_192
  4975. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb1(void)
  4976. {
  4977. WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb1");
  4978. return EVP_AES_192_CFB1;
  4979. }
  4980. #endif /* WOLFSSL_AES_192 */
  4981. #ifdef WOLFSSL_AES_256
  4982. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb1(void)
  4983. {
  4984. WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb1");
  4985. return EVP_AES_256_CFB1;
  4986. }
  4987. #endif /* WOLFSSL_AES_256 */
  4988. #ifdef WOLFSSL_AES_128
  4989. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb8(void)
  4990. {
  4991. WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb8");
  4992. return EVP_AES_128_CFB8;
  4993. }
  4994. #endif /* WOLFSSL_AES_128 */
  4995. #ifdef WOLFSSL_AES_192
  4996. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb8(void)
  4997. {
  4998. WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb8");
  4999. return EVP_AES_192_CFB8;
  5000. }
  5001. #endif /* WOLFSSL_AES_192 */
  5002. #ifdef WOLFSSL_AES_256
  5003. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb8(void)
  5004. {
  5005. WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb8");
  5006. return EVP_AES_256_CFB8;
  5007. }
  5008. #endif /* WOLFSSL_AES_256 */
  5009. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  5010. #ifdef WOLFSSL_AES_128
  5011. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb128(void)
  5012. {
  5013. WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb128");
  5014. return EVP_AES_128_CFB128;
  5015. }
  5016. #endif /* WOLFSSL_AES_128 */
  5017. #ifdef WOLFSSL_AES_192
  5018. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb128(void)
  5019. {
  5020. WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb128");
  5021. return EVP_AES_192_CFB128;
  5022. }
  5023. #endif /* WOLFSSL_AES_192 */
  5024. #ifdef WOLFSSL_AES_256
  5025. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb128(void)
  5026. {
  5027. WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb128");
  5028. return EVP_AES_256_CFB128;
  5029. }
  5030. #endif /* WOLFSSL_AES_256 */
  5031. #endif /* WOLFSSL_AES_CFB */
  5032. #ifdef WOLFSSL_AES_OFB
  5033. #ifdef WOLFSSL_AES_128
  5034. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ofb(void)
  5035. {
  5036. WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ofb");
  5037. return EVP_AES_128_OFB;
  5038. }
  5039. #endif /* WOLFSSL_AES_128 */
  5040. #ifdef WOLFSSL_AES_192
  5041. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ofb(void)
  5042. {
  5043. WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ofb");
  5044. return EVP_AES_192_OFB;
  5045. }
  5046. #endif /* WOLFSSL_AES_192 */
  5047. #ifdef WOLFSSL_AES_256
  5048. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ofb(void)
  5049. {
  5050. WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ofb");
  5051. return EVP_AES_256_OFB;
  5052. }
  5053. #endif /* WOLFSSL_AES_256 */
  5054. #endif /* WOLFSSL_AES_OFB */
  5055. #if defined(WOLFSSL_AES_XTS) && \
  5056. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  5057. #ifdef WOLFSSL_AES_128
  5058. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_xts(void)
  5059. {
  5060. WOLFSSL_ENTER("wolfSSL_EVP_aes_128_xts");
  5061. return EVP_AES_128_XTS;
  5062. }
  5063. #endif /* WOLFSSL_AES_128 */
  5064. #ifdef WOLFSSL_AES_256
  5065. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_xts(void)
  5066. {
  5067. WOLFSSL_ENTER("wolfSSL_EVP_aes_256_xts");
  5068. return EVP_AES_256_XTS;
  5069. }
  5070. #endif /* WOLFSSL_AES_256 */
  5071. #endif /* WOLFSSL_AES_XTS &&
  5072. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
  5073. #ifdef HAVE_AESGCM
  5074. #ifdef WOLFSSL_AES_128
  5075. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_gcm(void)
  5076. {
  5077. WOLFSSL_ENTER("wolfSSL_EVP_aes_128_gcm");
  5078. return EVP_AES_128_GCM;
  5079. }
  5080. #endif /* WOLFSSL_GCM_128 */
  5081. #ifdef WOLFSSL_AES_192
  5082. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_gcm(void)
  5083. {
  5084. WOLFSSL_ENTER("wolfSSL_EVP_aes_192_gcm");
  5085. return EVP_AES_192_GCM;
  5086. }
  5087. #endif /* WOLFSSL_AES_192 */
  5088. #ifdef WOLFSSL_AES_256
  5089. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_gcm(void)
  5090. {
  5091. WOLFSSL_ENTER("wolfSSL_EVP_aes_256_gcm");
  5092. return EVP_AES_256_GCM;
  5093. }
  5094. #endif /* WOLFSSL_AES_256 */
  5095. #endif /* HAVE_AESGCM */
  5096. #ifdef HAVE_AESCCM
  5097. #ifdef WOLFSSL_AES_128
  5098. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ccm(void)
  5099. {
  5100. WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ccm");
  5101. return EVP_AES_128_CCM;
  5102. }
  5103. #endif /* WOLFSSL_CCM_128 */
  5104. #ifdef WOLFSSL_AES_192
  5105. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ccm(void)
  5106. {
  5107. WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ccm");
  5108. return EVP_AES_192_CCM;
  5109. }
  5110. #endif /* WOLFSSL_AES_192 */
  5111. #ifdef WOLFSSL_AES_256
  5112. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ccm(void)
  5113. {
  5114. WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ccm");
  5115. return EVP_AES_256_CCM;
  5116. }
  5117. #endif /* WOLFSSL_AES_256 */
  5118. #endif /* HAVE_AESCCM */
  5119. #ifdef WOLFSSL_AES_COUNTER
  5120. #ifdef WOLFSSL_AES_128
  5121. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ctr(void)
  5122. {
  5123. WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ctr");
  5124. return EVP_AES_128_CTR;
  5125. }
  5126. #endif /* WOLFSSL_AES_2128 */
  5127. #ifdef WOLFSSL_AES_192
  5128. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ctr(void)
  5129. {
  5130. WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ctr");
  5131. return EVP_AES_192_CTR;
  5132. }
  5133. #endif /* WOLFSSL_AES_192 */
  5134. #ifdef WOLFSSL_AES_256
  5135. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ctr(void)
  5136. {
  5137. WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ctr");
  5138. return EVP_AES_256_CTR;
  5139. }
  5140. #endif /* WOLFSSL_AES_256 */
  5141. #endif /* WOLFSSL_AES_COUNTER */
  5142. #ifdef HAVE_AES_ECB
  5143. #ifdef WOLFSSL_AES_128
  5144. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ecb(void)
  5145. {
  5146. WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ecb");
  5147. return EVP_AES_128_ECB;
  5148. }
  5149. #endif /* WOLFSSL_AES_128 */
  5150. #ifdef WOLFSSL_AES_192
  5151. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ecb(void)
  5152. {
  5153. WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ecb");
  5154. return EVP_AES_192_ECB;
  5155. }
  5156. #endif /* WOLFSSL_AES_192*/
  5157. #ifdef WOLFSSL_AES_256
  5158. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ecb(void)
  5159. {
  5160. WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ecb");
  5161. return EVP_AES_256_ECB;
  5162. }
  5163. #endif /* WOLFSSL_AES_256 */
  5164. #endif /* HAVE_AES_ECB */
  5165. #endif /* NO_AES */
  5166. #ifdef HAVE_ARIA
  5167. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_128_gcm(void)
  5168. {
  5169. WOLFSSL_ENTER("wolfSSL_EVP_aria_128_gcm");
  5170. return EVP_ARIA_128_GCM;
  5171. }
  5172. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_192_gcm(void)
  5173. {
  5174. WOLFSSL_ENTER("wolfSSL_EVP_aria_192_gcm");
  5175. return EVP_ARIA_192_GCM;
  5176. }
  5177. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_256_gcm(void)
  5178. {
  5179. WOLFSSL_ENTER("wolfSSL_EVP_aria_256_gcm");
  5180. return EVP_ARIA_256_GCM;
  5181. }
  5182. #endif /* HAVE_ARIA */
  5183. #ifndef NO_DES3
  5184. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_cbc(void)
  5185. {
  5186. WOLFSSL_ENTER("wolfSSL_EVP_des_cbc");
  5187. return EVP_DES_CBC;
  5188. }
  5189. #ifdef WOLFSSL_DES_ECB
  5190. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ecb(void)
  5191. {
  5192. WOLFSSL_ENTER("wolfSSL_EVP_des_ecb");
  5193. return EVP_DES_ECB;
  5194. }
  5195. #endif
  5196. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_cbc(void)
  5197. {
  5198. WOLFSSL_ENTER("wolfSSL_EVP_des_ede3_cbc");
  5199. return EVP_DES_EDE3_CBC;
  5200. }
  5201. #ifdef WOLFSSL_DES_ECB
  5202. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_ecb(void)
  5203. {
  5204. WOLFSSL_ENTER("wolfSSL_EVP_des_ede3_ecb");
  5205. return EVP_DES_EDE3_ECB;
  5206. }
  5207. #endif
  5208. #endif /* NO_DES3 */
  5209. #ifndef NO_RC4
  5210. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc4(void)
  5211. {
  5212. WOLFSSL_ENTER("wolfSSL_EVP_rc4");
  5213. return EVP_ARC4;
  5214. }
  5215. #endif
  5216. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  5217. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_chacha20_poly1305(void)
  5218. {
  5219. WOLFSSL_ENTER("wolfSSL_EVP_chacha20_poly1305");
  5220. return EVP_CHACHA20_POLY1305;
  5221. }
  5222. #endif
  5223. #ifdef HAVE_CHACHA
  5224. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_chacha20(void)
  5225. {
  5226. WOLFSSL_ENTER("wolfSSL_EVP_chacha20");
  5227. return EVP_CHACHA20;
  5228. }
  5229. #endif
  5230. #ifdef WOLFSSL_SM4_ECB
  5231. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ecb(void)
  5232. {
  5233. WOLFSSL_ENTER("wolfSSL_EVP_sm4_ecb");
  5234. return EVP_SM4_ECB;
  5235. }
  5236. #endif
  5237. #ifdef WOLFSSL_SM4_CBC
  5238. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_cbc(void)
  5239. {
  5240. WOLFSSL_ENTER("wolfSSL_EVP_sm4_cbc");
  5241. return EVP_SM4_CBC;
  5242. }
  5243. #endif
  5244. #ifdef WOLFSSL_SM4_CTR
  5245. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ctr(void)
  5246. {
  5247. WOLFSSL_ENTER("wolfSSL_EVP_sm4_ctr");
  5248. return EVP_SM4_CTR;
  5249. }
  5250. #endif
  5251. #ifdef WOLFSSL_SM4_GCM
  5252. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_gcm(void)
  5253. {
  5254. WOLFSSL_ENTER("wolfSSL_EVP_sm4_gcm");
  5255. return EVP_SM4_GCM;
  5256. }
  5257. #endif
  5258. #ifdef WOLFSSL_SM4_CCM
  5259. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ccm(void)
  5260. {
  5261. WOLFSSL_ENTER("wolfSSL_EVP_sm4_ccm");
  5262. return EVP_SM4_CCM;
  5263. }
  5264. #endif
  5265. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_enc_null(void)
  5266. {
  5267. WOLFSSL_ENTER("wolfSSL_EVP_enc_null");
  5268. return EVP_NULL;
  5269. }
  5270. void wolfSSL_EVP_CIPHER_CTX_init(WOLFSSL_EVP_CIPHER_CTX* ctx)
  5271. {
  5272. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_init");
  5273. if (ctx) {
  5274. XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_CIPHER_CTX));
  5275. ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT; /* not yet initialized */
  5276. ctx->keyLen = 0;
  5277. ctx->enc = 1; /* start in encrypt mode */
  5278. }
  5279. }
  5280. /* This function allows cipher specific parameters to be
  5281. determined and set. */
  5282. int wolfSSL_EVP_CIPHER_CTX_ctrl(WOLFSSL_EVP_CIPHER_CTX *ctx, int type, \
  5283. int arg, void *ptr)
  5284. {
  5285. int ret = WOLFSSL_FAILURE;
  5286. #if defined(HAVE_AESGCM) || (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
  5287. #ifndef WC_NO_RNG
  5288. WC_RNG rng;
  5289. #endif
  5290. #endif
  5291. if (ctx == NULL)
  5292. return WOLFSSL_FAILURE;
  5293. (void)arg;
  5294. (void)ptr;
  5295. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_ctrl");
  5296. switch(type) {
  5297. case EVP_CTRL_INIT:
  5298. wolfSSL_EVP_CIPHER_CTX_init(ctx);
  5299. if(ctx)
  5300. ret = WOLFSSL_SUCCESS;
  5301. break;
  5302. case EVP_CTRL_SET_KEY_LENGTH:
  5303. ret = wolfSSL_EVP_CIPHER_CTX_set_key_length(ctx, arg);
  5304. break;
  5305. #if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \
  5306. defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) || \
  5307. (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
  5308. case EVP_CTRL_AEAD_SET_IVLEN:
  5309. if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
  5310. break;
  5311. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  5312. if (ctx->cipherType == CHACHA20_POLY1305_TYPE) {
  5313. if (arg != CHACHA20_POLY1305_AEAD_IV_SIZE) {
  5314. break;
  5315. }
  5316. }
  5317. else
  5318. #endif /* HAVE_CHACHA && HAVE_POLY1305 */
  5319. #if defined(WOLFSSL_SM4_GCM)
  5320. if (ctx->cipherType == SM4_GCM_TYPE) {
  5321. if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
  5322. break;
  5323. }
  5324. }
  5325. else
  5326. #endif
  5327. #if defined(WOLFSSL_SM4_CCM)
  5328. if (ctx->cipherType == SM4_CCM_TYPE) {
  5329. if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
  5330. break;
  5331. }
  5332. }
  5333. else
  5334. #endif
  5335. {
  5336. if (arg <= 0 || arg > AES_BLOCK_SIZE)
  5337. break;
  5338. }
  5339. ret = wolfSSL_EVP_CIPHER_CTX_set_iv_length(ctx, arg);
  5340. break;
  5341. #if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM) || \
  5342. (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
  5343. case EVP_CTRL_AEAD_SET_IV_FIXED:
  5344. if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
  5345. break;
  5346. if (arg == -1) {
  5347. /* arg == -1 copies ctx->ivSz from ptr */
  5348. ret = wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, (byte*)ptr, ctx->ivSz);
  5349. }
  5350. #ifndef WC_NO_RNG
  5351. else {
  5352. /*
  5353. * Fixed field must be at least 4 bytes and invocation
  5354. * field at least 8.
  5355. */
  5356. if ((arg < 4) || (ctx->ivSz - arg) < 8) {
  5357. WOLFSSL_MSG("Fixed field or invocation field too short");
  5358. break;
  5359. }
  5360. /* arg is 4...(ctx->ivSz - 8) */
  5361. XMEMCPY(ctx->iv, ptr, (size_t)arg);
  5362. if (wc_InitRng(&rng) != 0) {
  5363. WOLFSSL_MSG("wc_InitRng failed");
  5364. break;
  5365. }
  5366. if (wc_RNG_GenerateBlock(&rng, ctx->iv + arg,
  5367. (word32)(ctx->ivSz - arg)) == 0) {
  5368. ret = WOLFSSL_SUCCESS;
  5369. } else {
  5370. /* rng is freed immediately after if block so no need
  5371. * to do it here
  5372. */
  5373. WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
  5374. }
  5375. if (wc_FreeRng(&rng) != 0) {
  5376. WOLFSSL_MSG("wc_FreeRng failed");
  5377. ret = WOLFSSL_FAILURE;
  5378. break;
  5379. }
  5380. }
  5381. #if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)
  5382. if (ret == WOLFSSL_SUCCESS) {
  5383. /*
  5384. * OpenSSL requires that a EVP_CTRL_AEAD_SET_IV_FIXED
  5385. * command be issued before a EVP_CTRL_GCM_IV_GEN command.
  5386. * This flag is used to enforce that.
  5387. */
  5388. ctx->authIvGenEnable = 1;
  5389. }
  5390. #endif
  5391. #endif /* !WC_NO_RNG */
  5392. break;
  5393. #endif /* HAVE_AESGCM || WOLFSSL_SM4_GCM || (HAVE_CHACHA && HAVE_POLY1305) */
  5394. #if (defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)) && !defined(_WIN32) && \
  5395. !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(2,0))
  5396. /*
  5397. * Using EVP_CTRL_GCM_IV_GEN is a way to do AES-GCM encrypt/decrypt
  5398. * multiple times with EVP_Cipher without having to call
  5399. * EVP_CipherInit between each iteration. The IV is incremented for
  5400. * each subsequent EVP_Cipher call to prevent IV reuse.
  5401. */
  5402. case EVP_CTRL_GCM_IV_GEN:
  5403. if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
  5404. break;
  5405. if (!ctx->authIvGenEnable) {
  5406. WOLFSSL_MSG("Must use EVP_CTRL_AEAD_SET_IV_FIXED before "
  5407. "EVP_CTRL_GCM_IV_GEN");
  5408. break;
  5409. }
  5410. if (ctx->cipher.aes.keylen == 0 || ctx->ivSz == 0) {
  5411. WOLFSSL_MSG("Key or IV not set");
  5412. break;
  5413. }
  5414. if (ptr == NULL) {
  5415. WOLFSSL_MSG("Destination buffer for IV bytes NULL.");
  5416. break;
  5417. }
  5418. if (arg <= 0 || arg > ctx->ivSz) {
  5419. XMEMCPY(ptr, ctx->iv, (size_t)ctx->ivSz);
  5420. }
  5421. else {
  5422. /*
  5423. * Copy the last "arg" bytes of ctx->iv into the buffer at
  5424. * "ptr." Not sure why OpenSSL does this, but it does.
  5425. */
  5426. XMEMCPY(ptr, ctx->iv + ctx->ivSz - arg, (size_t)arg);
  5427. }
  5428. /*
  5429. * The gcmIncIV flag indicates that the IV should be incremented
  5430. * after the next cipher operation.
  5431. */
  5432. ctx->authIncIv = 1;
  5433. ret = WOLFSSL_SUCCESS;
  5434. break;
  5435. #endif /* (HAVE_AESGCM || WOLFSSL_SM4_GCM) && !_WIN32 && !HAVE_SELFTEST &&
  5436. * !HAVE_FIPS || FIPS_VERSION >= 2)*/
  5437. case EVP_CTRL_AEAD_SET_TAG:
  5438. if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
  5439. break;
  5440. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  5441. if (ctx->cipherType == CHACHA20_POLY1305_TYPE) {
  5442. if (arg != CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE) {
  5443. break;
  5444. }
  5445. ctx->authTagSz = arg;
  5446. ret = WOLFSSL_SUCCESS;
  5447. if (ptr != NULL) {
  5448. XMEMCPY(ctx->authTag, ptr, (size_t)arg);
  5449. }
  5450. break;
  5451. }
  5452. else
  5453. #endif /* HAVE_CHACHA && HAVE_POLY1305 */
  5454. #if defined(WOLFSSL_SM4_GCM)
  5455. if (ctx->cipherType == SM4_GCM_TYPE) {
  5456. if ((arg <= 0) || (arg > SM4_BLOCK_SIZE) || (ptr == NULL)) {
  5457. break;
  5458. }
  5459. XMEMCPY(ctx->authTag, ptr, (size_t)arg);
  5460. ctx->authTagSz = arg;
  5461. ret = WOLFSSL_SUCCESS;
  5462. break;
  5463. }
  5464. else
  5465. #endif
  5466. #if defined(WOLFSSL_SM4_CCM)
  5467. if (ctx->cipherType == SM4_CCM_TYPE) {
  5468. if ((arg <= 0) || (arg > SM4_BLOCK_SIZE) || (ptr == NULL)) {
  5469. break;
  5470. }
  5471. XMEMCPY(ctx->authTag, ptr, (size_t)arg);
  5472. ctx->authTagSz = arg;
  5473. ret = WOLFSSL_SUCCESS;
  5474. break;
  5475. }
  5476. else
  5477. #endif
  5478. {
  5479. if(arg <= 0 || arg > 16 || (ptr == NULL))
  5480. break;
  5481. XMEMCPY(ctx->authTag, ptr, (size_t)arg);
  5482. ctx->authTagSz = arg;
  5483. ret = WOLFSSL_SUCCESS;
  5484. break;
  5485. }
  5486. case EVP_CTRL_AEAD_GET_TAG:
  5487. if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0)
  5488. break;
  5489. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  5490. if (ctx->cipherType == CHACHA20_POLY1305_TYPE) {
  5491. if (arg != CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE) {
  5492. break;
  5493. }
  5494. }
  5495. else
  5496. #endif /* HAVE_CHACHA && HAVE_POLY1305 */
  5497. #if defined(WOLFSSL_SM4_GCM)
  5498. if (ctx->cipherType == SM4_GCM_TYPE) {
  5499. if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
  5500. break;
  5501. }
  5502. }
  5503. else
  5504. #endif
  5505. #if defined(WOLFSSL_SM4_CCM)
  5506. if (ctx->cipherType == SM4_CCM_TYPE) {
  5507. if (arg <= 0 || arg > SM4_BLOCK_SIZE) {
  5508. break;
  5509. }
  5510. }
  5511. else
  5512. #endif
  5513. {
  5514. if (arg <= 0 || arg > AES_BLOCK_SIZE)
  5515. break;
  5516. }
  5517. if (ptr != NULL) {
  5518. XMEMCPY(ptr, ctx->authTag, (size_t)arg);
  5519. ret = WOLFSSL_SUCCESS;
  5520. }
  5521. break;
  5522. #endif /* HAVE_AESGCM || HAVE_AESCCM || WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM ||
  5523. * HAVE_ARIA || (HAVE_CHACHA && HAVE_POLY1305) */
  5524. default:
  5525. WOLFSSL_MSG("EVP_CIPHER_CTX_ctrl operation not yet handled");
  5526. break;
  5527. }
  5528. return ret;
  5529. }
  5530. /* WOLFSSL_SUCCESS on ok */
  5531. static int wolfSSL_EVP_CIPHER_CTX_cleanup_cipher(
  5532. WOLFSSL_EVP_CIPHER_CTX* ctx)
  5533. {
  5534. int ret = WOLFSSL_SUCCESS;
  5535. if (ctx) {
  5536. #if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  5537. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
  5538. switch (ctx->cipherType) {
  5539. #if (defined(HAVE_AESGCM) && defined(WOLFSSL_AESGCM_STREAM)) || \
  5540. defined(HAVE_AESCCM) || \
  5541. defined(HAVE_AES_CBC) || \
  5542. defined(WOLFSSL_AES_COUNTER) || \
  5543. defined(HAVE_AES_ECB) || \
  5544. defined(WOLFSSL_AES_CFB) || \
  5545. defined(WOLFSSL_AES_OFB) || \
  5546. defined(WOLFSSL_AES_XTS)
  5547. #if defined(HAVE_AESGCM)
  5548. case AES_128_GCM_TYPE:
  5549. case AES_192_GCM_TYPE:
  5550. case AES_256_GCM_TYPE:
  5551. #endif /* HAVE_AESGCM */
  5552. #if defined(HAVE_AESCCM)
  5553. case AES_128_CCM_TYPE:
  5554. case AES_192_CCM_TYPE:
  5555. case AES_256_CCM_TYPE:
  5556. #endif /* HAVE_AESCCM */
  5557. #ifdef HAVE_AES_CBC
  5558. case AES_128_CBC_TYPE:
  5559. case AES_192_CBC_TYPE:
  5560. case AES_256_CBC_TYPE:
  5561. #endif
  5562. #ifdef WOLFSSL_AES_COUNTER
  5563. case AES_128_CTR_TYPE:
  5564. case AES_192_CTR_TYPE:
  5565. case AES_256_CTR_TYPE:
  5566. #endif
  5567. #ifdef HAVE_AES_ECB
  5568. case AES_128_ECB_TYPE:
  5569. case AES_192_ECB_TYPE:
  5570. case AES_256_ECB_TYPE:
  5571. #endif
  5572. #ifdef WOLFSSL_AES_CFB
  5573. case AES_128_CFB1_TYPE:
  5574. case AES_192_CFB1_TYPE:
  5575. case AES_256_CFB1_TYPE:
  5576. case AES_128_CFB8_TYPE:
  5577. case AES_192_CFB8_TYPE:
  5578. case AES_256_CFB8_TYPE:
  5579. case AES_128_CFB128_TYPE:
  5580. case AES_192_CFB128_TYPE:
  5581. case AES_256_CFB128_TYPE:
  5582. #endif
  5583. #ifdef WOLFSSL_AES_OFB
  5584. case AES_128_OFB_TYPE:
  5585. case AES_192_OFB_TYPE:
  5586. case AES_256_OFB_TYPE:
  5587. #endif
  5588. wc_AesFree(&ctx->cipher.aes);
  5589. ctx->flags &= ~WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  5590. break;
  5591. #if defined(WOLFSSL_AES_XTS) && \
  5592. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  5593. case AES_128_XTS_TYPE:
  5594. case AES_256_XTS_TYPE:
  5595. wc_AesXtsFree(&ctx->cipher.xts);
  5596. ctx->flags &= ~WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  5597. break;
  5598. #endif
  5599. #endif /* AES */
  5600. #ifdef HAVE_ARIA
  5601. case ARIA_128_GCM_TYPE:
  5602. case ARIA_192_GCM_TYPE:
  5603. case ARIA_256_GCM_TYPE:
  5604. {
  5605. int result = wc_AriaFreeCrypt(&ctx->cipher.aria);
  5606. if (result != 0) {
  5607. WOLFSSL_MSG("wc_AriaFreeCrypt failure");
  5608. ret = result;
  5609. }
  5610. }
  5611. break;
  5612. #endif
  5613. }
  5614. #endif /* not FIPS or FIPS v2+ */
  5615. #ifdef WOLFSSL_SM4
  5616. switch (ctx->cipherType) {
  5617. #ifdef WOLFSSL_SM4_ECB
  5618. case SM4_ECB_TYPE:
  5619. #endif
  5620. #ifdef WOLFSSL_SM4_CBC
  5621. case SM4_CBC_TYPE:
  5622. #endif
  5623. #ifdef WOLFSSL_SM4_CTR
  5624. case SM4_CTR_TYPE:
  5625. #endif
  5626. #ifdef WOLFSSL_SM4_GCM
  5627. case SM4_GCM_TYPE:
  5628. #endif
  5629. #ifdef WOLFSSL_SM4_CCM
  5630. case SM4_CCM_TYPE:
  5631. #endif
  5632. wc_Sm4Free(&ctx->cipher.sm4);
  5633. }
  5634. #endif
  5635. }
  5636. return ret;
  5637. }
  5638. int wolfSSL_EVP_CIPHER_CTX_cleanup(WOLFSSL_EVP_CIPHER_CTX* ctx)
  5639. {
  5640. int ret = WOLFSSL_SUCCESS;
  5641. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_cleanup");
  5642. if (ctx) {
  5643. wolfSSL_EVP_CIPHER_CTX_cleanup_cipher(ctx);
  5644. ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT; /* not yet initialized */
  5645. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  5646. if (ctx->key) {
  5647. ForceZero(ctx->key, (word32)ctx->keyLen);
  5648. XFREE(ctx->key, NULL, DYNAMIC_TYPE_OPENSSL);
  5649. ctx->key = NULL;
  5650. }
  5651. #endif
  5652. ctx->keyLen = 0;
  5653. #if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \
  5654. defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  5655. if (ctx->authBuffer) {
  5656. XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL);
  5657. ctx->authBuffer = NULL;
  5658. }
  5659. ctx->authBufferLen = 0;
  5660. if (ctx->authIn) {
  5661. XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
  5662. ctx->authIn = NULL;
  5663. }
  5664. ctx->authInSz = 0;
  5665. ctx->authIvGenEnable = 0;
  5666. ctx->authIncIv = 0;
  5667. #endif
  5668. }
  5669. return ret;
  5670. }
  5671. /* Permanent stub for Qt compilation. */
  5672. #if defined(WOLFSSL_QT) && !defined(NO_WOLFSSL_STUB)
  5673. const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc2_cbc(void)
  5674. {
  5675. WOLFSSL_ENTER("wolfSSL_EVP_rc2_cbc");
  5676. WOLFSSL_STUB("EVP_rc2_cbc");
  5677. return NULL;
  5678. }
  5679. #endif
  5680. #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)
  5681. int wolfSSL_EVP_BytesToKey(const WOLFSSL_EVP_CIPHER* type,
  5682. const WOLFSSL_EVP_MD* md, const byte* salt,
  5683. const byte* data, int sz, int count, byte* key, byte* iv)
  5684. {
  5685. int ret;
  5686. int hashType = WC_HASH_TYPE_NONE;
  5687. #ifdef WOLFSSL_SMALL_STACK
  5688. EncryptedInfo* info;
  5689. #else
  5690. EncryptedInfo info[1];
  5691. #endif
  5692. #ifdef WOLFSSL_SMALL_STACK
  5693. info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL,
  5694. DYNAMIC_TYPE_ENCRYPTEDINFO);
  5695. if (info == NULL) {
  5696. WOLFSSL_MSG("malloc failed");
  5697. return WOLFSSL_FAILURE;
  5698. }
  5699. #endif
  5700. XMEMSET(info, 0, sizeof(EncryptedInfo));
  5701. ret = wc_EncryptedInfoGet(info, type);
  5702. if (ret < 0)
  5703. goto end;
  5704. if (data == NULL) {
  5705. ret = (int)info->keySz;
  5706. goto end;
  5707. }
  5708. ret = wolfSSL_EVP_get_hashinfo(md, &hashType, NULL);
  5709. if (ret == WOLFSSL_FAILURE)
  5710. goto end;
  5711. ret = wc_PBKDF1_ex(key, (int)info->keySz, iv, (int)info->ivSz, data, sz,
  5712. salt, EVP_SALT_SIZE, count, hashType, NULL);
  5713. if (ret == 0)
  5714. ret = (int)info->keySz;
  5715. end:
  5716. #ifdef WOLFSSL_SMALL_STACK
  5717. XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
  5718. #endif
  5719. if (ret < 0)
  5720. return 0; /* failure - for compatibility */
  5721. return ret;
  5722. }
  5723. #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */
  5724. #ifndef NO_AES
  5725. #if defined(WOLFSSL_AES_128) || defined(WOLFSSL_AES_192) || \
  5726. defined(WOLFSSL_AES_256)
  5727. #define AES_SIZE_ANY
  5728. #endif
  5729. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_COUNTER) || \
  5730. defined(HAVE_AES_ECB) || defined(WOLFSSL_AES_CFB) || \
  5731. defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_DIRECT)
  5732. #define AES_SET_KEY
  5733. #endif
  5734. #if defined(AES_SIZE_ANY) && defined(AES_SET_KEY)
  5735. static int AesSetKey_ex(Aes* aes, const byte* key, word32 len,
  5736. const byte* iv, int dir, int direct)
  5737. {
  5738. int ret;
  5739. /* wc_AesSetKey clear aes.reg if iv == NULL.
  5740. Keep IV for openSSL compatibility */
  5741. if (iv == NULL)
  5742. XMEMCPY((byte *)aes->tmp, (byte *)aes->reg, AES_BLOCK_SIZE);
  5743. if (direct) {
  5744. #if defined(WOLFSSL_AES_DIRECT)
  5745. ret = wc_AesSetKeyDirect(aes, key, len, iv, dir);
  5746. #else
  5747. ret = NOT_COMPILED_IN;
  5748. #endif
  5749. }
  5750. else {
  5751. ret = wc_AesSetKey(aes, key, len, iv, dir);
  5752. }
  5753. if (iv == NULL)
  5754. XMEMCPY((byte *)aes->reg, (byte *)aes->tmp, AES_BLOCK_SIZE);
  5755. return ret;
  5756. }
  5757. #endif /* AES_ANY_SIZE && AES_SET_KEY */
  5758. #endif /* NO_AES */
  5759. #if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  5760. || FIPS_VERSION_GE(2,0))
  5761. static int EvpCipherInitAesGCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
  5762. const WOLFSSL_EVP_CIPHER* type,
  5763. const byte* key, const byte* iv, int enc)
  5764. {
  5765. int ret = WOLFSSL_SUCCESS;
  5766. if (ctx->authIn) {
  5767. XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
  5768. ctx->authIn = NULL;
  5769. }
  5770. ctx->authInSz = 0;
  5771. ctx->block_size = AES_BLOCK_SIZE;
  5772. ctx->authTagSz = AES_BLOCK_SIZE;
  5773. if (ctx->ivSz == 0) {
  5774. ctx->ivSz = GCM_NONCE_MID_SZ;
  5775. }
  5776. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  5777. ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
  5778. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  5779. if (enc == 0 || enc == 1) {
  5780. ctx->enc = enc ? 1 : 0;
  5781. }
  5782. #ifdef WOLFSSL_AES_128
  5783. if (ctx->cipherType == AES_128_GCM_TYPE ||
  5784. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_GCM))) {
  5785. WOLFSSL_MSG("EVP_AES_128_GCM");
  5786. ctx->cipherType = AES_128_GCM_TYPE;
  5787. ctx->keyLen = AES_128_KEY_SIZE;
  5788. }
  5789. #endif
  5790. #ifdef WOLFSSL_AES_192
  5791. if (ctx->cipherType == AES_192_GCM_TYPE ||
  5792. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_GCM))) {
  5793. WOLFSSL_MSG("EVP_AES_192_GCM");
  5794. ctx->cipherType = AES_192_GCM_TYPE;
  5795. ctx->keyLen = AES_192_KEY_SIZE;
  5796. }
  5797. #endif
  5798. #ifdef WOLFSSL_AES_256
  5799. if (ctx->cipherType == AES_256_GCM_TYPE ||
  5800. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_GCM))) {
  5801. WOLFSSL_MSG("EVP_AES_256_GCM");
  5802. ctx->cipherType = AES_256_GCM_TYPE;
  5803. ctx->keyLen = AES_256_KEY_SIZE;
  5804. }
  5805. #endif
  5806. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  5807. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  5808. ret = WOLFSSL_FAILURE;
  5809. else
  5810. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  5811. }
  5812. #ifndef WOLFSSL_AESGCM_STREAM
  5813. if (ret == WOLFSSL_SUCCESS && key &&
  5814. wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) {
  5815. WOLFSSL_MSG("wc_AesGcmSetKey() failed");
  5816. ret = WOLFSSL_FAILURE;
  5817. }
  5818. #endif /* !WOLFSSL_AESGCM_STREAM */
  5819. if (ret == WOLFSSL_SUCCESS && iv &&
  5820. wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, (word32)ctx->ivSz)) {
  5821. WOLFSSL_MSG("wc_AesGcmSetExtIV() failed");
  5822. ret = WOLFSSL_FAILURE;
  5823. }
  5824. #ifdef WOLFSSL_AESGCM_STREAM
  5825. /*
  5826. * Initialize with key and IV if available. wc_AesGcmInit will fail
  5827. * if called with IV only and no key has been set.
  5828. */
  5829. if (ret == WOLFSSL_SUCCESS &&
  5830. (key || (iv && ctx->cipher.aes.gcmKeySet)) &&
  5831. wc_AesGcmInit(&ctx->cipher.aes, key,
  5832. (key == NULL) ? 0 : (word32)ctx->keyLen, iv,
  5833. (iv == NULL) ? 0 : (word32)ctx->ivSz) != 0) {
  5834. WOLFSSL_MSG("wc_AesGcmInit() failed");
  5835. ret = WOLFSSL_FAILURE;
  5836. }
  5837. #endif /* WOLFSSL_AESGCM_STREAM */
  5838. /*
  5839. * OpenSSL clears this flag, which permits subsequent use of
  5840. * EVP_CTRL_GCM_IV_GEN, when EVP_CipherInit is called with no key.
  5841. * If a key is provided, the flag retains its value.
  5842. */
  5843. if (ret == WOLFSSL_SUCCESS && key == NULL) {
  5844. ctx->authIvGenEnable = 0;
  5845. }
  5846. return ret;
  5847. }
  5848. static int EvpCipherAesGCM(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
  5849. byte* src, word32 len)
  5850. {
  5851. int ret = WOLFSSL_FAILURE;
  5852. #ifndef WOLFSSL_AESGCM_STREAM
  5853. /* No destination means only AAD. */
  5854. if (src != NULL && dst == NULL) {
  5855. ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, src, len);
  5856. }
  5857. else if (src != NULL && dst != NULL) {
  5858. if (ctx->enc) {
  5859. ret = wc_AesGcmEncrypt(&ctx->cipher.aes, dst, src,
  5860. len, ctx->iv, ctx->ivSz, ctx->authTag,
  5861. ctx->authTagSz, ctx->authIn,
  5862. ctx->authInSz);
  5863. }
  5864. else {
  5865. ret = wc_AesGcmDecrypt(&ctx->cipher.aes, dst, src,
  5866. len, ctx->iv, ctx->ivSz, ctx->authTag,
  5867. ctx->authTagSz, ctx->authIn,
  5868. ctx->authInSz);
  5869. }
  5870. if (ctx->authIncIv) {
  5871. IncCtr((byte*)ctx->cipher.aes.reg,
  5872. ctx->cipher.aes.nonceSz);
  5873. ctx->authIncIv = 0;
  5874. }
  5875. }
  5876. #else
  5877. /*
  5878. * No need to call wc_AesGcmInit. Should have been called by
  5879. * wolfSSL_EVP_CipherInit.
  5880. */
  5881. /* NULL dst and non-NULL src means only AAD. */
  5882. if (src != NULL && dst == NULL) {
  5883. if (ctx->enc) {
  5884. ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, NULL,
  5885. NULL, 0, src, len);
  5886. }
  5887. else {
  5888. ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, NULL,
  5889. NULL, 0, src, len);
  5890. }
  5891. }
  5892. /* Only plain/cipher text. */
  5893. else if (src != NULL && dst != NULL) {
  5894. if (ctx->enc) {
  5895. ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, dst, src,
  5896. len, NULL, 0);
  5897. }
  5898. else {
  5899. ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, dst, src,
  5900. len, NULL, 0);
  5901. }
  5902. }
  5903. /*
  5904. * src == NULL is analogous to other "final"-type functions
  5905. * (e.g. EVP_CipherFinal). Calculates tag on encrypt
  5906. * and checks tag on decrypt.
  5907. */
  5908. else {
  5909. if (ctx->enc) {
  5910. /* Calculate authentication tag. */
  5911. ret = wc_AesGcmEncryptFinal(&ctx->cipher.aes,
  5912. ctx->authTag, (word32)ctx->authTagSz);
  5913. /*
  5914. * wc_AesGcmEncryptFinal increments the IV in
  5915. * ctx->cipher.aes.reg, so we don't call IncCtr here.
  5916. */
  5917. }
  5918. else {
  5919. /* Calculate authentication tag and compare. */
  5920. ret = wc_AesGcmDecryptFinal(&ctx->cipher.aes,
  5921. ctx->authTag, (word32)ctx->authTagSz);
  5922. if (ctx->authIncIv) {
  5923. IncCtr((byte*)ctx->cipher.aes.reg,
  5924. ctx->cipher.aes.nonceSz);
  5925. }
  5926. }
  5927. /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */
  5928. if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0,
  5929. (byte*)ctx->cipher.aes.reg,
  5930. (word32)ctx->ivSz) != 0) {
  5931. WOLFSSL_MSG("wc_AesGcmInit failed");
  5932. return WOLFSSL_FAILURE;
  5933. }
  5934. ctx->authIncIv = 0;
  5935. }
  5936. #endif /* WOLFSSL_AESGCM_STREAM */
  5937. if (src == NULL) {
  5938. /*
  5939. * Clear any leftover AAD on final (final is when src is
  5940. * NULL).
  5941. */
  5942. if (ctx->authIn != NULL) {
  5943. XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
  5944. }
  5945. ctx->authInSz = 0;
  5946. }
  5947. if (ret == 0) {
  5948. ret = (int)len;
  5949. }
  5950. return ret;
  5951. }
  5952. #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  5953. * HAVE_FIPS_VERSION >= 2 */
  5954. /* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */
  5955. #if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  5956. || FIPS_VERSION_GE(2,0))
  5957. static int EvpCipherInitAesCCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
  5958. const WOLFSSL_EVP_CIPHER* type,
  5959. const byte* key, const byte* iv, int enc)
  5960. {
  5961. int ret = WOLFSSL_SUCCESS;
  5962. if (ctx->authIn) {
  5963. XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
  5964. ctx->authIn = NULL;
  5965. }
  5966. ctx->authInSz = 0;
  5967. ctx->block_size = AES_BLOCK_SIZE;
  5968. ctx->authTagSz = AES_BLOCK_SIZE;
  5969. if (ctx->ivSz == 0) {
  5970. ctx->ivSz = GCM_NONCE_MID_SZ;
  5971. }
  5972. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  5973. ctx->flags |= WOLFSSL_EVP_CIPH_CCM_MODE |
  5974. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  5975. if (enc == 0 || enc == 1) {
  5976. ctx->enc = enc ? 1 : 0;
  5977. }
  5978. #ifdef WOLFSSL_AES_128
  5979. if (ctx->cipherType == AES_128_CCM_TYPE ||
  5980. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CCM))) {
  5981. WOLFSSL_MSG("EVP_AES_128_CCM");
  5982. ctx->cipherType = AES_128_CCM_TYPE;
  5983. ctx->keyLen = AES_128_KEY_SIZE;
  5984. }
  5985. #endif
  5986. #ifdef WOLFSSL_AES_192
  5987. if (ctx->cipherType == AES_192_CCM_TYPE ||
  5988. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CCM))) {
  5989. WOLFSSL_MSG("EVP_AES_192_CCM");
  5990. ctx->cipherType = AES_192_CCM_TYPE;
  5991. ctx->keyLen = AES_192_KEY_SIZE;
  5992. }
  5993. #endif
  5994. #ifdef WOLFSSL_AES_256
  5995. if (ctx->cipherType == AES_256_CCM_TYPE ||
  5996. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CCM))) {
  5997. WOLFSSL_MSG("EVP_AES_256_CCM");
  5998. ctx->cipherType = AES_256_CCM_TYPE;
  5999. ctx->keyLen = AES_256_KEY_SIZE;
  6000. }
  6001. #endif
  6002. if (ret == WOLFSSL_SUCCESS) {
  6003. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6004. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) {
  6005. WOLFSSL_MSG("wc_AesInit() failed");
  6006. ret = WOLFSSL_FAILURE;
  6007. } else
  6008. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6009. }
  6010. }
  6011. if (ret == WOLFSSL_SUCCESS && key &&
  6012. wc_AesCcmSetKey(&ctx->cipher.aes, key, (word32)ctx->keyLen)) {
  6013. WOLFSSL_MSG("wc_AesCcmSetKey() failed");
  6014. ret = WOLFSSL_FAILURE;
  6015. }
  6016. if (ret == WOLFSSL_SUCCESS && iv &&
  6017. wc_AesCcmSetNonce(&ctx->cipher.aes, iv, (word32)ctx->ivSz)) {
  6018. WOLFSSL_MSG("wc_AesCcmSetNonce() failed");
  6019. ret = WOLFSSL_FAILURE;
  6020. }
  6021. /*
  6022. * OpenSSL clears this flag, which permits subsequent use of
  6023. * EVP_CTRL_CCM_IV_GEN, when EVP_CipherInit is called with no key.
  6024. * If a key is provided, the flag retains its value.
  6025. */
  6026. if (ret == WOLFSSL_SUCCESS && key == NULL) {
  6027. ctx->authIvGenEnable = 0;
  6028. }
  6029. return ret;
  6030. }
  6031. static int EvpCipherAesCCM(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst,
  6032. byte* src, word32 len)
  6033. {
  6034. int ret = WOLFSSL_FAILURE;
  6035. /* No destination means only AAD. */
  6036. if (src != NULL && dst == NULL) {
  6037. ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, (int)len);
  6038. }
  6039. else if (src != NULL && dst != NULL) {
  6040. if (ctx->enc) {
  6041. ret = wc_AesCcmEncrypt(&ctx->cipher.aes, dst, src,
  6042. len, ctx->iv, (word32)ctx->ivSz, ctx->authTag,
  6043. (word32)ctx->authTagSz, ctx->authIn,
  6044. (word32)ctx->authInSz);
  6045. }
  6046. else {
  6047. ret = wc_AesCcmDecrypt(&ctx->cipher.aes, dst, src,
  6048. len, ctx->iv, (word32)ctx->ivSz, ctx->authTag,
  6049. (word32)ctx->authTagSz, ctx->authIn,
  6050. (word32)ctx->authInSz);
  6051. }
  6052. if (ctx->authIncIv) {
  6053. IncCtr((byte*)ctx->cipher.aes.reg,
  6054. ctx->cipher.aes.nonceSz);
  6055. ctx->authIncIv = 0;
  6056. }
  6057. }
  6058. if (src == NULL) {
  6059. /*
  6060. * Clear any leftover AAD on final (final is when src is
  6061. * NULL).
  6062. */
  6063. if (ctx->authIn != NULL) {
  6064. XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
  6065. }
  6066. ctx->authInSz = 0;
  6067. }
  6068. if (ret == 0) {
  6069. ret = (int)len;
  6070. }
  6071. return ret;
  6072. }
  6073. #endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  6074. * HAVE_FIPS_VERSION >= 2 */
  6075. #if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  6076. || FIPS_VERSION_GE(2,0))
  6077. static int EvpCipherInitAriaGCM(WOLFSSL_EVP_CIPHER_CTX* ctx,
  6078. const WOLFSSL_EVP_CIPHER* type,
  6079. const byte* key, const byte* iv, int enc)
  6080. {
  6081. int ret = WOLFSSL_SUCCESS;
  6082. if (ctx->cipherType == ARIA_128_GCM_TYPE ||
  6083. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_128_GCM))) {
  6084. WOLFSSL_MSG("EVP_ARIA_128_GCM");
  6085. ctx->cipherType = ARIA_128_GCM_TYPE;
  6086. ctx->keyLen = ARIA_128_KEY_SIZE;
  6087. } else if (ctx->cipherType == ARIA_192_GCM_TYPE ||
  6088. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_192_GCM))) {
  6089. WOLFSSL_MSG("EVP_ARIA_192_GCM");
  6090. ctx->cipherType = ARIA_192_GCM_TYPE;
  6091. ctx->keyLen = ARIA_192_KEY_SIZE;
  6092. } else if (ctx->cipherType == ARIA_256_GCM_TYPE ||
  6093. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_256_GCM))) {
  6094. WOLFSSL_MSG("EVP_ARIA_256_GCM");
  6095. ctx->cipherType = ARIA_256_GCM_TYPE;
  6096. ctx->keyLen = ARIA_256_KEY_SIZE;
  6097. } else {
  6098. WOLFSSL_MSG("Unrecognized cipher type");
  6099. return WOLFSSL_FAILURE;
  6100. }
  6101. if (ctx->authIn) {
  6102. XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
  6103. ctx->authIn = NULL;
  6104. }
  6105. ctx->authInSz = 0;
  6106. ctx->block_size = AES_BLOCK_SIZE;
  6107. ctx->authTagSz = AES_BLOCK_SIZE;
  6108. if (ctx->ivSz == 0) {
  6109. ctx->ivSz = GCM_NONCE_MID_SZ;
  6110. }
  6111. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6112. ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
  6113. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  6114. if (enc == 0 || enc == 1) {
  6115. ctx->enc = enc ? 1 : 0;
  6116. }
  6117. switch(ctx->cipherType) {
  6118. case ARIA_128_GCM_TYPE:
  6119. ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_128BITKEY);
  6120. break;
  6121. case ARIA_192_GCM_TYPE:
  6122. ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_192BITKEY);
  6123. break;
  6124. case ARIA_256_GCM_TYPE:
  6125. ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_256BITKEY);
  6126. break;
  6127. default:
  6128. WOLFSSL_MSG("Not implemented cipherType");
  6129. return WOLFSSL_NOT_IMPLEMENTED; /* This should never happen */
  6130. }
  6131. if (ret != 0) {
  6132. WOLFSSL_MSG(MC_GetErrorString(ret));
  6133. WOLFSSL_MSG(MC_GetError(ctx->cipher.aria.hSession));
  6134. return WOLFSSL_FAILURE;
  6135. }
  6136. if (key && wc_AriaSetKey(&ctx->cipher.aria, (byte *)key)) {
  6137. WOLFSSL_MSG("wc_AriaSetKey() failed");
  6138. return WOLFSSL_FAILURE;
  6139. }
  6140. if (iv && wc_AriaGcmSetExtIV(&ctx->cipher.aria, iv, ctx->ivSz)) {
  6141. WOLFSSL_MSG("wc_AriaGcmSetIV() failed");
  6142. return WOLFSSL_FAILURE;
  6143. }
  6144. return WOLFSSL_SUCCESS;
  6145. }
  6146. #endif /* HAVE_ARIA && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  6147. * HAVE_FIPS_VERSION >= 2 */
  6148. /* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */
  6149. int wolfSSL_EVP_CipherInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
  6150. const WOLFSSL_EVP_CIPHER* type, const byte* key,
  6151. const byte* iv, int enc)
  6152. {
  6153. int ret = 0;
  6154. (void)key;
  6155. (void)iv;
  6156. (void)enc;
  6157. WOLFSSL_ENTER("wolfSSL_EVP_CipherInit");
  6158. if (ctx == NULL) {
  6159. WOLFSSL_MSG("no ctx");
  6160. return WOLFSSL_FAILURE;
  6161. }
  6162. if (type == NULL && ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) {
  6163. WOLFSSL_MSG("no type set");
  6164. return WOLFSSL_FAILURE;
  6165. }
  6166. if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT){
  6167. /* only first EVP_CipherInit invoke. ctx->cipherType is set below */
  6168. XMEMSET(&ctx->cipher, 0, sizeof(ctx->cipher));
  6169. ctx->flags = 0;
  6170. }
  6171. /* always clear buffer state */
  6172. ctx->bufUsed = 0;
  6173. ctx->lastUsed = 0;
  6174. #ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
  6175. if (!iv && ctx->ivSz) {
  6176. iv = ctx->iv;
  6177. }
  6178. #endif
  6179. #ifndef NO_AES
  6180. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  6181. #ifdef WOLFSSL_AES_128
  6182. if (ctx->cipherType == AES_128_CBC_TYPE ||
  6183. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CBC))) {
  6184. WOLFSSL_MSG("EVP_AES_128_CBC");
  6185. ctx->cipherType = AES_128_CBC_TYPE;
  6186. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6187. ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE;
  6188. ctx->keyLen = 16;
  6189. ctx->block_size = AES_BLOCK_SIZE;
  6190. ctx->ivSz = AES_BLOCK_SIZE;
  6191. if (enc == 0 || enc == 1)
  6192. ctx->enc = enc ? 1 : 0;
  6193. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6194. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6195. return WOLFSSL_FAILURE;
  6196. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6197. }
  6198. if (key) {
  6199. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6200. iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
  6201. if (ret != 0)
  6202. return WOLFSSL_FAILURE;
  6203. }
  6204. if (iv && key == NULL) {
  6205. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6206. if (ret != 0)
  6207. return WOLFSSL_FAILURE;
  6208. }
  6209. }
  6210. #endif /* WOLFSSL_AES_128 */
  6211. #ifdef WOLFSSL_AES_192
  6212. if (ctx->cipherType == AES_192_CBC_TYPE ||
  6213. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CBC))) {
  6214. WOLFSSL_MSG("EVP_AES_192_CBC");
  6215. ctx->cipherType = AES_192_CBC_TYPE;
  6216. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6217. ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE;
  6218. ctx->keyLen = 24;
  6219. ctx->block_size = AES_BLOCK_SIZE;
  6220. ctx->ivSz = AES_BLOCK_SIZE;
  6221. if (enc == 0 || enc == 1)
  6222. ctx->enc = enc ? 1 : 0;
  6223. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6224. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6225. return WOLFSSL_FAILURE;
  6226. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6227. }
  6228. if (key) {
  6229. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6230. iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
  6231. if (ret != 0)
  6232. return WOLFSSL_FAILURE;
  6233. }
  6234. if (iv && key == NULL) {
  6235. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6236. if (ret != 0)
  6237. return WOLFSSL_FAILURE;
  6238. }
  6239. }
  6240. #endif /* WOLFSSL_AES_192 */
  6241. #ifdef WOLFSSL_AES_256
  6242. if (ctx->cipherType == AES_256_CBC_TYPE ||
  6243. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CBC))) {
  6244. WOLFSSL_MSG("EVP_AES_256_CBC");
  6245. ctx->cipherType = AES_256_CBC_TYPE;
  6246. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6247. ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE;
  6248. ctx->keyLen = 32;
  6249. ctx->block_size = AES_BLOCK_SIZE;
  6250. ctx->ivSz = AES_BLOCK_SIZE;
  6251. if (enc == 0 || enc == 1)
  6252. ctx->enc = enc ? 1 : 0;
  6253. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6254. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6255. return WOLFSSL_FAILURE;
  6256. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6257. }
  6258. if (key) {
  6259. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6260. iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0);
  6261. if (ret != 0){
  6262. WOLFSSL_MSG("AesSetKey() failed");
  6263. return WOLFSSL_FAILURE;
  6264. }
  6265. }
  6266. if (iv && key == NULL) {
  6267. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6268. if (ret != 0){
  6269. WOLFSSL_MSG("wc_AesSetIV() failed");
  6270. return WOLFSSL_FAILURE;
  6271. }
  6272. }
  6273. }
  6274. #endif /* WOLFSSL_AES_256 */
  6275. #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
  6276. #if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  6277. || FIPS_VERSION_GE(2,0))
  6278. if (FALSE
  6279. #ifdef WOLFSSL_AES_128
  6280. || ctx->cipherType == AES_128_GCM_TYPE ||
  6281. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_GCM))
  6282. #endif
  6283. #ifdef WOLFSSL_AES_192
  6284. || ctx->cipherType == AES_192_GCM_TYPE ||
  6285. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_GCM))
  6286. #endif
  6287. #ifdef WOLFSSL_AES_256
  6288. || ctx->cipherType == AES_256_GCM_TYPE ||
  6289. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_GCM))
  6290. #endif
  6291. ) {
  6292. if (EvpCipherInitAesGCM(ctx, type, key, iv, enc)
  6293. != WOLFSSL_SUCCESS) {
  6294. return WOLFSSL_FAILURE;
  6295. }
  6296. }
  6297. #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  6298. * HAVE_FIPS_VERSION >= 2 */
  6299. #if defined(HAVE_AESCCM) && \
  6300. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  6301. || FIPS_VERSION_GE(2,0))
  6302. if (FALSE
  6303. #ifdef WOLFSSL_AES_128
  6304. || ctx->cipherType == AES_128_CCM_TYPE ||
  6305. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CCM))
  6306. #endif
  6307. #ifdef WOLFSSL_AES_192
  6308. || ctx->cipherType == AES_192_CCM_TYPE ||
  6309. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CCM))
  6310. #endif
  6311. #ifdef WOLFSSL_AES_256
  6312. || ctx->cipherType == AES_256_CCM_TYPE ||
  6313. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CCM))
  6314. #endif
  6315. )
  6316. {
  6317. if (EvpCipherInitAesCCM(ctx, type, key, iv, enc)
  6318. != WOLFSSL_SUCCESS) {
  6319. return WOLFSSL_FAILURE;
  6320. }
  6321. }
  6322. #endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  6323. * HAVE_FIPS_VERSION >= 2 */
  6324. #ifdef WOLFSSL_AES_COUNTER
  6325. #ifdef WOLFSSL_AES_128
  6326. if (ctx->cipherType == AES_128_CTR_TYPE ||
  6327. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CTR))) {
  6328. WOLFSSL_MSG("EVP_AES_128_CTR");
  6329. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6330. ctx->cipherType = AES_128_CTR_TYPE;
  6331. ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE;
  6332. ctx->keyLen = 16;
  6333. ctx->block_size = NO_PADDING_BLOCK_SIZE;
  6334. ctx->ivSz = AES_BLOCK_SIZE;
  6335. #if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
  6336. ctx->cipher.aes.left = 0;
  6337. #endif
  6338. if (enc == 0 || enc == 1)
  6339. ctx->enc = enc ? 1 : 0;
  6340. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6341. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6342. return WOLFSSL_FAILURE;
  6343. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6344. }
  6345. if (key) {
  6346. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6347. iv, AES_ENCRYPTION, 1);
  6348. if (ret != 0)
  6349. return WOLFSSL_FAILURE;
  6350. }
  6351. if (iv && key == NULL) {
  6352. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6353. if (ret != 0)
  6354. return WOLFSSL_FAILURE;
  6355. }
  6356. }
  6357. #endif /* WOLFSSL_AES_128 */
  6358. #ifdef WOLFSSL_AES_192
  6359. if (ctx->cipherType == AES_192_CTR_TYPE ||
  6360. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CTR))) {
  6361. WOLFSSL_MSG("EVP_AES_192_CTR");
  6362. ctx->cipherType = AES_192_CTR_TYPE;
  6363. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6364. ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE;
  6365. ctx->keyLen = 24;
  6366. ctx->block_size = NO_PADDING_BLOCK_SIZE;
  6367. ctx->ivSz = AES_BLOCK_SIZE;
  6368. #if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
  6369. ctx->cipher.aes.left = 0;
  6370. #endif
  6371. if (enc == 0 || enc == 1)
  6372. ctx->enc = enc ? 1 : 0;
  6373. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6374. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6375. return WOLFSSL_FAILURE;
  6376. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6377. }
  6378. if (key) {
  6379. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6380. iv, AES_ENCRYPTION, 1);
  6381. if (ret != 0)
  6382. return WOLFSSL_FAILURE;
  6383. }
  6384. if (iv && key == NULL) {
  6385. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6386. if (ret != 0)
  6387. return WOLFSSL_FAILURE;
  6388. }
  6389. }
  6390. #endif /* WOLFSSL_AES_192 */
  6391. #ifdef WOLFSSL_AES_256
  6392. if (ctx->cipherType == AES_256_CTR_TYPE ||
  6393. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CTR))) {
  6394. WOLFSSL_MSG("EVP_AES_256_CTR");
  6395. ctx->cipherType = AES_256_CTR_TYPE;
  6396. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6397. ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE;
  6398. ctx->keyLen = 32;
  6399. ctx->block_size = NO_PADDING_BLOCK_SIZE;
  6400. ctx->ivSz = AES_BLOCK_SIZE;
  6401. #if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB)
  6402. ctx->cipher.aes.left = 0;
  6403. #endif
  6404. if (enc == 0 || enc == 1)
  6405. ctx->enc = enc ? 1 : 0;
  6406. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6407. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6408. return WOLFSSL_FAILURE;
  6409. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6410. }
  6411. if (key) {
  6412. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6413. iv, AES_ENCRYPTION, 1);
  6414. if (ret != 0)
  6415. return WOLFSSL_FAILURE;
  6416. }
  6417. if (iv && key == NULL) {
  6418. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6419. if (ret != 0)
  6420. return WOLFSSL_FAILURE;
  6421. }
  6422. }
  6423. #endif /* WOLFSSL_AES_256 */
  6424. #endif /* WOLFSSL_AES_COUNTER */
  6425. #ifdef HAVE_AES_ECB
  6426. #ifdef WOLFSSL_AES_128
  6427. if (ctx->cipherType == AES_128_ECB_TYPE ||
  6428. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_ECB))) {
  6429. WOLFSSL_MSG("EVP_AES_128_ECB");
  6430. ctx->cipherType = AES_128_ECB_TYPE;
  6431. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6432. ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE;
  6433. ctx->keyLen = 16;
  6434. ctx->block_size = AES_BLOCK_SIZE;
  6435. if (enc == 0 || enc == 1)
  6436. ctx->enc = enc ? 1 : 0;
  6437. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6438. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6439. return WOLFSSL_FAILURE;
  6440. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6441. }
  6442. if (key) {
  6443. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6444. NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
  6445. }
  6446. if (ret != 0)
  6447. return WOLFSSL_FAILURE;
  6448. }
  6449. #endif /* WOLFSSL_AES_128 */
  6450. #ifdef WOLFSSL_AES_192
  6451. if (ctx->cipherType == AES_192_ECB_TYPE ||
  6452. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_ECB))) {
  6453. WOLFSSL_MSG("EVP_AES_192_ECB");
  6454. ctx->cipherType = AES_192_ECB_TYPE;
  6455. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6456. ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE;
  6457. ctx->keyLen = 24;
  6458. ctx->block_size = AES_BLOCK_SIZE;
  6459. if (enc == 0 || enc == 1)
  6460. ctx->enc = enc ? 1 : 0;
  6461. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6462. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6463. return WOLFSSL_FAILURE;
  6464. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6465. }
  6466. if (key) {
  6467. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6468. NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
  6469. }
  6470. if (ret != 0)
  6471. return WOLFSSL_FAILURE;
  6472. }
  6473. #endif /* WOLFSSL_AES_192 */
  6474. #ifdef WOLFSSL_AES_256
  6475. if (ctx->cipherType == AES_256_ECB_TYPE ||
  6476. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_ECB))) {
  6477. WOLFSSL_MSG("EVP_AES_256_ECB");
  6478. ctx->cipherType = AES_256_ECB_TYPE;
  6479. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6480. ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE;
  6481. ctx->keyLen = 32;
  6482. ctx->block_size = AES_BLOCK_SIZE;
  6483. if (enc == 0 || enc == 1)
  6484. ctx->enc = enc ? 1 : 0;
  6485. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6486. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6487. return WOLFSSL_FAILURE;
  6488. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6489. }
  6490. if (key) {
  6491. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6492. NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1);
  6493. }
  6494. if (ret != 0)
  6495. return WOLFSSL_FAILURE;
  6496. }
  6497. #endif /* WOLFSSL_AES_256 */
  6498. #endif /* HAVE_AES_ECB */
  6499. #ifdef WOLFSSL_AES_CFB
  6500. #ifdef WOLFSSL_AES_128
  6501. if (ctx->cipherType == AES_128_CFB1_TYPE ||
  6502. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB1))) {
  6503. WOLFSSL_MSG("EVP_AES_128_CFB1");
  6504. ctx->cipherType = AES_128_CFB1_TYPE;
  6505. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6506. ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE;
  6507. ctx->keyLen = 16;
  6508. ctx->block_size = 1;
  6509. if (enc == 0 || enc == 1)
  6510. ctx->enc = enc ? 1 : 0;
  6511. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6512. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6513. return WOLFSSL_FAILURE;
  6514. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6515. }
  6516. if (key) {
  6517. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6518. iv, AES_ENCRYPTION, 0);
  6519. if (ret != 0)
  6520. return WOLFSSL_FAILURE;
  6521. }
  6522. if (iv && key == NULL) {
  6523. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6524. if (ret != 0)
  6525. return WOLFSSL_FAILURE;
  6526. }
  6527. }
  6528. #endif /* WOLFSSL_AES_128 */
  6529. #ifdef WOLFSSL_AES_192
  6530. if (ctx->cipherType == AES_192_CFB1_TYPE ||
  6531. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB1))) {
  6532. WOLFSSL_MSG("EVP_AES_192_CFB1");
  6533. ctx->cipherType = AES_192_CFB1_TYPE;
  6534. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6535. ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE;
  6536. ctx->keyLen = 24;
  6537. ctx->block_size = 1;
  6538. if (enc == 0 || enc == 1)
  6539. ctx->enc = enc ? 1 : 0;
  6540. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6541. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6542. return WOLFSSL_FAILURE;
  6543. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6544. }
  6545. if (key) {
  6546. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6547. iv, AES_ENCRYPTION, 0);
  6548. if (ret != 0)
  6549. return WOLFSSL_FAILURE;
  6550. }
  6551. if (iv && key == NULL) {
  6552. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6553. if (ret != 0)
  6554. return WOLFSSL_FAILURE;
  6555. }
  6556. }
  6557. #endif /* WOLFSSL_AES_192 */
  6558. #ifdef WOLFSSL_AES_256
  6559. if (ctx->cipherType == AES_256_CFB1_TYPE ||
  6560. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB1))) {
  6561. WOLFSSL_MSG("EVP_AES_256_CFB1");
  6562. ctx->cipherType = AES_256_CFB1_TYPE;
  6563. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6564. ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE;
  6565. ctx->keyLen = 32;
  6566. ctx->block_size = 1;
  6567. if (enc == 0 || enc == 1)
  6568. ctx->enc = enc ? 1 : 0;
  6569. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6570. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6571. return WOLFSSL_FAILURE;
  6572. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6573. }
  6574. if (key) {
  6575. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6576. iv, AES_ENCRYPTION, 0);
  6577. if (ret != 0){
  6578. WOLFSSL_MSG("AesSetKey() failed");
  6579. return WOLFSSL_FAILURE;
  6580. }
  6581. }
  6582. if (iv && key == NULL) {
  6583. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6584. if (ret != 0){
  6585. WOLFSSL_MSG("wc_AesSetIV() failed");
  6586. return WOLFSSL_FAILURE;
  6587. }
  6588. }
  6589. }
  6590. #endif /* WOLFSSL_AES_256 */
  6591. #ifdef WOLFSSL_AES_128
  6592. if (ctx->cipherType == AES_128_CFB8_TYPE ||
  6593. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB8))) {
  6594. WOLFSSL_MSG("EVP_AES_128_CFB8");
  6595. ctx->cipherType = AES_128_CFB8_TYPE;
  6596. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6597. ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE;
  6598. ctx->keyLen = 16;
  6599. ctx->block_size = 1;
  6600. if (enc == 0 || enc == 1)
  6601. ctx->enc = enc ? 1 : 0;
  6602. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6603. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6604. return WOLFSSL_FAILURE;
  6605. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6606. }
  6607. if (key) {
  6608. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6609. iv, AES_ENCRYPTION, 0);
  6610. if (ret != 0)
  6611. return WOLFSSL_FAILURE;
  6612. }
  6613. if (iv && key == NULL) {
  6614. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6615. if (ret != 0)
  6616. return WOLFSSL_FAILURE;
  6617. }
  6618. }
  6619. #endif /* WOLFSSL_AES_128 */
  6620. #ifdef WOLFSSL_AES_192
  6621. if (ctx->cipherType == AES_192_CFB8_TYPE ||
  6622. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB8))) {
  6623. WOLFSSL_MSG("EVP_AES_192_CFB8");
  6624. ctx->cipherType = AES_192_CFB8_TYPE;
  6625. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6626. ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE;
  6627. ctx->keyLen = 24;
  6628. ctx->block_size = 1;
  6629. if (enc == 0 || enc == 1)
  6630. ctx->enc = enc ? 1 : 0;
  6631. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6632. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6633. return WOLFSSL_FAILURE;
  6634. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6635. }
  6636. if (key) {
  6637. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6638. iv, AES_ENCRYPTION, 0);
  6639. if (ret != 0)
  6640. return WOLFSSL_FAILURE;
  6641. }
  6642. if (iv && key == NULL) {
  6643. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6644. if (ret != 0)
  6645. return WOLFSSL_FAILURE;
  6646. }
  6647. }
  6648. #endif /* WOLFSSL_AES_192 */
  6649. #ifdef WOLFSSL_AES_256
  6650. if (ctx->cipherType == AES_256_CFB8_TYPE ||
  6651. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB8))) {
  6652. WOLFSSL_MSG("EVP_AES_256_CFB8");
  6653. ctx->cipherType = AES_256_CFB8_TYPE;
  6654. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6655. ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE;
  6656. ctx->keyLen = 32;
  6657. ctx->block_size = 1;
  6658. if (enc == 0 || enc == 1)
  6659. ctx->enc = enc ? 1 : 0;
  6660. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6661. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6662. return WOLFSSL_FAILURE;
  6663. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6664. }
  6665. if (key) {
  6666. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6667. iv, AES_ENCRYPTION, 0);
  6668. if (ret != 0){
  6669. WOLFSSL_MSG("AesSetKey() failed");
  6670. return WOLFSSL_FAILURE;
  6671. }
  6672. }
  6673. if (iv && key == NULL) {
  6674. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6675. if (ret != 0){
  6676. WOLFSSL_MSG("wc_AesSetIV() failed");
  6677. return WOLFSSL_FAILURE;
  6678. }
  6679. }
  6680. }
  6681. #endif /* WOLFSSL_AES_256 */
  6682. #ifdef WOLFSSL_AES_128
  6683. if (ctx->cipherType == AES_128_CFB128_TYPE ||
  6684. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB128))) {
  6685. WOLFSSL_MSG("EVP_AES_128_CFB128");
  6686. ctx->cipherType = AES_128_CFB128_TYPE;
  6687. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6688. ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE;
  6689. ctx->keyLen = 16;
  6690. ctx->block_size = 1;
  6691. if (enc == 0 || enc == 1)
  6692. ctx->enc = enc ? 1 : 0;
  6693. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6694. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6695. return WOLFSSL_FAILURE;
  6696. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6697. }
  6698. if (key) {
  6699. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6700. iv, AES_ENCRYPTION, 0);
  6701. if (ret != 0)
  6702. return WOLFSSL_FAILURE;
  6703. }
  6704. if (iv && key == NULL) {
  6705. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6706. if (ret != 0)
  6707. return WOLFSSL_FAILURE;
  6708. }
  6709. }
  6710. #endif /* WOLFSSL_AES_128 */
  6711. #ifdef WOLFSSL_AES_192
  6712. if (ctx->cipherType == AES_192_CFB128_TYPE ||
  6713. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB128))) {
  6714. WOLFSSL_MSG("EVP_AES_192_CFB128");
  6715. ctx->cipherType = AES_192_CFB128_TYPE;
  6716. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6717. ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE;
  6718. ctx->keyLen = 24;
  6719. ctx->block_size = 1;
  6720. if (enc == 0 || enc == 1)
  6721. ctx->enc = enc ? 1 : 0;
  6722. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6723. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6724. return WOLFSSL_FAILURE;
  6725. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6726. }
  6727. if (key) {
  6728. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6729. iv, AES_ENCRYPTION, 0);
  6730. if (ret != 0)
  6731. return WOLFSSL_FAILURE;
  6732. }
  6733. if (iv && key == NULL) {
  6734. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6735. if (ret != 0)
  6736. return WOLFSSL_FAILURE;
  6737. }
  6738. }
  6739. #endif /* WOLFSSL_AES_192 */
  6740. #ifdef WOLFSSL_AES_256
  6741. if (ctx->cipherType == AES_256_CFB128_TYPE ||
  6742. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB128))) {
  6743. WOLFSSL_MSG("EVP_AES_256_CFB128");
  6744. ctx->cipherType = AES_256_CFB128_TYPE;
  6745. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6746. ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE;
  6747. ctx->keyLen = 32;
  6748. ctx->block_size = 1;
  6749. if (enc == 0 || enc == 1)
  6750. ctx->enc = enc ? 1 : 0;
  6751. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6752. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6753. return WOLFSSL_FAILURE;
  6754. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6755. }
  6756. if (key) {
  6757. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6758. iv, AES_ENCRYPTION, 0);
  6759. if (ret != 0){
  6760. WOLFSSL_MSG("AesSetKey() failed");
  6761. return WOLFSSL_FAILURE;
  6762. }
  6763. }
  6764. if (iv && key == NULL) {
  6765. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6766. if (ret != 0){
  6767. WOLFSSL_MSG("wc_AesSetIV() failed");
  6768. return WOLFSSL_FAILURE;
  6769. }
  6770. }
  6771. }
  6772. #endif /* WOLFSSL_AES_256 */
  6773. #endif /* WOLFSSL_AES_CFB */
  6774. #ifdef WOLFSSL_AES_OFB
  6775. #ifdef WOLFSSL_AES_128
  6776. if (ctx->cipherType == AES_128_OFB_TYPE ||
  6777. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_OFB))) {
  6778. WOLFSSL_MSG("EVP_AES_128_OFB");
  6779. ctx->cipherType = AES_128_OFB_TYPE;
  6780. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6781. ctx->flags |= WOLFSSL_EVP_CIPH_OFB_MODE;
  6782. ctx->keyLen = 16;
  6783. ctx->block_size = 1;
  6784. if (enc == 0 || enc == 1)
  6785. ctx->enc = enc ? 1 : 0;
  6786. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6787. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6788. return WOLFSSL_FAILURE;
  6789. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6790. }
  6791. if (key) {
  6792. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6793. iv, AES_ENCRYPTION, 0);
  6794. if (ret != 0)
  6795. return WOLFSSL_FAILURE;
  6796. }
  6797. if (iv && key == NULL) {
  6798. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6799. if (ret != 0)
  6800. return WOLFSSL_FAILURE;
  6801. }
  6802. }
  6803. #endif /* WOLFSSL_AES_128 */
  6804. #ifdef WOLFSSL_AES_192
  6805. if (ctx->cipherType == AES_192_OFB_TYPE ||
  6806. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_OFB))) {
  6807. WOLFSSL_MSG("EVP_AES_192_OFB");
  6808. ctx->cipherType = AES_192_OFB_TYPE;
  6809. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6810. ctx->flags |= WOLFSSL_EVP_CIPH_OFB_MODE;
  6811. ctx->keyLen = 24;
  6812. ctx->block_size = 1;
  6813. if (enc == 0 || enc == 1)
  6814. ctx->enc = enc ? 1 : 0;
  6815. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6816. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6817. return WOLFSSL_FAILURE;
  6818. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6819. }
  6820. if (key) {
  6821. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6822. iv, AES_ENCRYPTION, 0);
  6823. if (ret != 0)
  6824. return WOLFSSL_FAILURE;
  6825. }
  6826. if (iv && key == NULL) {
  6827. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6828. if (ret != 0)
  6829. return WOLFSSL_FAILURE;
  6830. }
  6831. }
  6832. #endif /* WOLFSSL_AES_192 */
  6833. #ifdef WOLFSSL_AES_256
  6834. if (ctx->cipherType == AES_256_OFB_TYPE ||
  6835. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_OFB))) {
  6836. WOLFSSL_MSG("EVP_AES_256_OFB");
  6837. ctx->cipherType = AES_256_OFB_TYPE;
  6838. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6839. ctx->flags |= WOLFSSL_EVP_CIPH_OFB_MODE;
  6840. ctx->keyLen = 32;
  6841. ctx->block_size = 1;
  6842. if (enc == 0 || enc == 1)
  6843. ctx->enc = enc ? 1 : 0;
  6844. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6845. if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0)
  6846. return WOLFSSL_FAILURE;
  6847. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6848. }
  6849. if (key) {
  6850. ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen,
  6851. iv, AES_ENCRYPTION, 0);
  6852. if (ret != 0){
  6853. WOLFSSL_MSG("AesSetKey() failed");
  6854. return WOLFSSL_FAILURE;
  6855. }
  6856. }
  6857. if (iv && key == NULL) {
  6858. ret = wc_AesSetIV(&ctx->cipher.aes, iv);
  6859. if (ret != 0){
  6860. WOLFSSL_MSG("wc_AesSetIV() failed");
  6861. return WOLFSSL_FAILURE;
  6862. }
  6863. }
  6864. }
  6865. #endif /* WOLFSSL_AES_256 */
  6866. #endif /* WOLFSSL_AES_OFB */
  6867. #if defined(WOLFSSL_AES_XTS) && \
  6868. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  6869. #ifdef WOLFSSL_AES_128
  6870. if (ctx->cipherType == AES_128_XTS_TYPE ||
  6871. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_XTS))) {
  6872. WOLFSSL_MSG("EVP_AES_128_XTS");
  6873. ctx->cipherType = AES_128_XTS_TYPE;
  6874. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6875. ctx->flags |= WOLFSSL_EVP_CIPH_XTS_MODE;
  6876. ctx->keyLen = 32;
  6877. ctx->block_size = 1;
  6878. ctx->ivSz = AES_BLOCK_SIZE;
  6879. if (iv != NULL) {
  6880. if (iv != ctx->iv) /* Valgrind error when src == dst */
  6881. XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
  6882. }
  6883. else
  6884. XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE);
  6885. if (enc == 0 || enc == 1)
  6886. ctx->enc = enc ? 1 : 0;
  6887. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6888. ret = wc_AesXtsInit(&ctx->cipher.xts, NULL, 0);
  6889. if (ret != 0) {
  6890. WOLFSSL_MSG("wc_AesXtsInit() failed");
  6891. return WOLFSSL_FAILURE;
  6892. }
  6893. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6894. }
  6895. if (key) {
  6896. ret = wc_AesXtsSetKeyNoInit(&ctx->cipher.xts, key,
  6897. (word32)ctx->keyLen,
  6898. ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
  6899. if (ret != 0) {
  6900. WOLFSSL_MSG("wc_AesXtsSetKey() failed");
  6901. return WOLFSSL_FAILURE;
  6902. }
  6903. }
  6904. }
  6905. #endif /* WOLFSSL_AES_128 */
  6906. #ifdef WOLFSSL_AES_256
  6907. if (ctx->cipherType == AES_256_XTS_TYPE ||
  6908. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_XTS))) {
  6909. WOLFSSL_MSG("EVP_AES_256_XTS");
  6910. ctx->cipherType = AES_256_XTS_TYPE;
  6911. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6912. ctx->flags |= WOLFSSL_EVP_CIPH_XTS_MODE;
  6913. ctx->keyLen = 64;
  6914. ctx->block_size = 1;
  6915. ctx->ivSz = AES_BLOCK_SIZE;
  6916. if (iv != NULL) {
  6917. if (iv != ctx->iv) /* Valgrind error when src == dst */
  6918. XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
  6919. }
  6920. else
  6921. XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE);
  6922. if (enc == 0 || enc == 1)
  6923. ctx->enc = enc ? 1 : 0;
  6924. if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) {
  6925. ret = wc_AesXtsInit(&ctx->cipher.xts, NULL, 0);
  6926. if (ret != 0) {
  6927. WOLFSSL_MSG("wc_AesXtsInit() failed");
  6928. return WOLFSSL_FAILURE;
  6929. }
  6930. ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED;
  6931. }
  6932. if (key) {
  6933. ret = wc_AesXtsSetKeyNoInit(&ctx->cipher.xts, key,
  6934. (word32)ctx->keyLen,
  6935. ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
  6936. if (ret != 0) {
  6937. WOLFSSL_MSG("wc_AesXtsSetKey() failed");
  6938. return WOLFSSL_FAILURE;
  6939. }
  6940. }
  6941. }
  6942. #endif /* WOLFSSL_AES_256 */
  6943. #endif /* WOLFSSL_AES_XTS &&
  6944. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
  6945. #endif /* NO_AES */
  6946. #if defined(HAVE_ARIA)
  6947. if (ctx->cipherType == ARIA_128_GCM_TYPE ||
  6948. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_128_GCM))
  6949. || ctx->cipherType == ARIA_192_GCM_TYPE ||
  6950. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_192_GCM))
  6951. || ctx->cipherType == ARIA_256_GCM_TYPE ||
  6952. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_256_GCM))
  6953. ) {
  6954. if (EvpCipherInitAriaGCM(ctx, type, key, iv, enc)
  6955. != WOLFSSL_SUCCESS) {
  6956. return WOLFSSL_FAILURE;
  6957. }
  6958. }
  6959. #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  6960. * HAVE_FIPS_VERSION >= 2 */
  6961. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  6962. if (ctx->cipherType == CHACHA20_POLY1305_TYPE ||
  6963. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_CHACHA20_POLY1305))) {
  6964. WOLFSSL_MSG("EVP_CHACHA20_POLY1305");
  6965. ctx->cipherType = CHACHA20_POLY1305_TYPE;
  6966. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  6967. ctx->flags |= WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  6968. ctx->keyLen = CHACHA20_POLY1305_AEAD_KEYSIZE;
  6969. ctx->block_size = CHACHA_CHUNK_BYTES;
  6970. ctx->authTagSz = CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE;
  6971. ctx->ivSz = CHACHA20_POLY1305_AEAD_IV_SIZE;
  6972. if (enc == 0 || enc == 1) {
  6973. ctx->enc = (byte) enc;
  6974. }
  6975. /* wolfSSL_EVP_CipherInit() may be called multiple times to
  6976. * set key or iv alone. A common use case is to set key
  6977. * and then init with another iv again and again after
  6978. * update/finals. We need to preserve the key for those calls
  6979. * since wc_ChaCha20Poly1305_Init() does not. */
  6980. if (key != NULL) {
  6981. if (!ctx->key) {
  6982. ctx->key = (byte*)XMALLOC((size_t)ctx->keyLen, NULL,
  6983. DYNAMIC_TYPE_OPENSSL);
  6984. if (!ctx->key) {
  6985. return MEMORY_E;
  6986. }
  6987. }
  6988. XMEMCPY(ctx->key, key, (size_t)ctx->keyLen);
  6989. }
  6990. if ((ctx->key != NULL && iv != NULL) && wc_ChaCha20Poly1305_Init(
  6991. &ctx->cipher.chachaPoly, ctx->key, iv, ctx->enc) != 0) {
  6992. WOLFSSL_MSG("wc_ChaCha20Poly1305_Init() failed");
  6993. return WOLFSSL_FAILURE;
  6994. }
  6995. }
  6996. #endif
  6997. #ifdef HAVE_CHACHA
  6998. if (ctx->cipherType == CHACHA20_TYPE ||
  6999. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_CHACHA20))) {
  7000. WOLFSSL_MSG("EVP_CHACHA20");
  7001. ctx->cipherType = CHACHA20_TYPE;
  7002. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7003. ctx->keyLen = CHACHA_MAX_KEY_SZ;
  7004. ctx->block_size = 1;
  7005. ctx->ivSz = WOLFSSL_EVP_CHACHA_IV_BYTES;
  7006. if (enc == 0 || enc == 1) {
  7007. ctx->enc = (byte) enc;
  7008. }
  7009. if (key != NULL && wc_Chacha_SetKey(&ctx->cipher.chacha, key,
  7010. (word32)ctx->keyLen) != 0) {
  7011. WOLFSSL_MSG("wc_Chacha_SetKey() failed");
  7012. return WOLFSSL_FAILURE;
  7013. }
  7014. if (iv != NULL) {
  7015. /* a bit silly. chacha takes an iv+counter and internally
  7016. * combines them to a new iv. EVP is given exactly *one* iv,
  7017. * so to pass it into chacha, we have to revert that first.
  7018. * The counter comes first in little-endian */
  7019. word32 counter = (word32)iv[0] + (word32)(iv[1] << 8) +
  7020. (word32)(iv[2] << 16) + (word32)(iv[3] << 24);
  7021. if (wc_Chacha_SetIV(&ctx->cipher.chacha,
  7022. iv + sizeof(counter), counter) != 0) {
  7023. WOLFSSL_MSG("wc_Chacha_SetIV() failed");
  7024. return WOLFSSL_FAILURE;
  7025. }
  7026. }
  7027. }
  7028. #endif
  7029. #ifdef WOLFSSL_SM4_ECB
  7030. if (ctx->cipherType == SM4_ECB_TYPE ||
  7031. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_ECB))) {
  7032. WOLFSSL_MSG("EVP_SM4_ECB");
  7033. ctx->cipherType = SM4_ECB_TYPE;
  7034. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7035. ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE;
  7036. ctx->keyLen = SM4_KEY_SIZE;
  7037. ctx->block_size = SM4_BLOCK_SIZE;
  7038. if (enc == 0 || enc == 1)
  7039. ctx->enc = enc ? 1 : 0;
  7040. if (key) {
  7041. ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
  7042. }
  7043. if (ret != 0) {
  7044. return WOLFSSL_FAILURE;
  7045. }
  7046. }
  7047. #endif
  7048. #ifdef WOLFSSL_SM4_CBC
  7049. if (ctx->cipherType == SM4_CBC_TYPE ||
  7050. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CBC))) {
  7051. WOLFSSL_MSG("EVP_SM4_CBC");
  7052. ctx->cipherType = SM4_CBC_TYPE;
  7053. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7054. ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE;
  7055. ctx->keyLen = SM4_KEY_SIZE;
  7056. ctx->block_size = SM4_BLOCK_SIZE;
  7057. ctx->ivSz = SM4_BLOCK_SIZE;
  7058. if (enc == 0 || enc == 1)
  7059. ctx->enc = enc ? 1 : 0;
  7060. if (key != NULL) {
  7061. ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
  7062. if (ret != 0) {
  7063. return WOLFSSL_FAILURE;
  7064. }
  7065. }
  7066. if (iv != NULL) {
  7067. ret = wc_Sm4SetIV(&ctx->cipher.sm4, iv);
  7068. if (ret != 0) {
  7069. return WOLFSSL_FAILURE;
  7070. }
  7071. }
  7072. }
  7073. #endif
  7074. #ifdef WOLFSSL_SM4_CTR
  7075. if (ctx->cipherType == SM4_CTR_TYPE ||
  7076. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CTR))) {
  7077. WOLFSSL_MSG("EVP_SM4_CTR");
  7078. ctx->cipherType = SM4_CTR_TYPE;
  7079. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7080. ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE;
  7081. ctx->keyLen = SM4_KEY_SIZE;
  7082. ctx->block_size = NO_PADDING_BLOCK_SIZE;
  7083. ctx->ivSz = SM4_BLOCK_SIZE;
  7084. if (enc == 0 || enc == 1)
  7085. ctx->enc = enc ? 1 : 0;
  7086. if (key != NULL) {
  7087. ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
  7088. if (ret != 0) {
  7089. return WOLFSSL_FAILURE;
  7090. }
  7091. }
  7092. if (iv != NULL) {
  7093. ret = wc_Sm4SetIV(&ctx->cipher.sm4, iv);
  7094. if (ret != 0) {
  7095. return WOLFSSL_FAILURE;
  7096. }
  7097. }
  7098. }
  7099. #endif
  7100. #ifdef WOLFSSL_SM4_GCM
  7101. if (ctx->cipherType == SM4_GCM_TYPE ||
  7102. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_GCM))) {
  7103. WOLFSSL_MSG("EVP_SM4_GCM");
  7104. ctx->cipherType = SM4_GCM_TYPE;
  7105. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7106. ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE |
  7107. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  7108. ctx->block_size = NO_PADDING_BLOCK_SIZE;
  7109. ctx->keyLen = SM4_KEY_SIZE;
  7110. if (ctx->ivSz == 0) {
  7111. ctx->ivSz = GCM_NONCE_MID_SZ;
  7112. }
  7113. ctx->authTagSz = SM4_BLOCK_SIZE;
  7114. if (ctx->authIn) {
  7115. XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
  7116. ctx->authIn = NULL;
  7117. }
  7118. ctx->authInSz = 0;
  7119. if (enc == 0 || enc == 1)
  7120. ctx->enc = enc ? 1 : 0;
  7121. if (key != NULL) {
  7122. ret = wc_Sm4GcmSetKey(&ctx->cipher.sm4, key, ctx->keyLen);
  7123. if (ret != 0) {
  7124. return WOLFSSL_FAILURE;
  7125. }
  7126. }
  7127. if (iv != NULL) {
  7128. XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
  7129. }
  7130. }
  7131. #endif
  7132. #ifdef WOLFSSL_SM4_CCM
  7133. if (ctx->cipherType == SM4_CCM_TYPE ||
  7134. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CCM))) {
  7135. WOLFSSL_MSG("EVP_SM4_CCM");
  7136. ctx->cipherType = SM4_CCM_TYPE;
  7137. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7138. ctx->flags |= WOLFSSL_EVP_CIPH_CCM_MODE |
  7139. WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER;
  7140. ctx->block_size = NO_PADDING_BLOCK_SIZE;
  7141. ctx->keyLen = SM4_KEY_SIZE;
  7142. if (ctx->ivSz == 0) {
  7143. ctx->ivSz = GCM_NONCE_MID_SZ;
  7144. }
  7145. ctx->authTagSz = SM4_BLOCK_SIZE;
  7146. if (ctx->authIn) {
  7147. XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL);
  7148. ctx->authIn = NULL;
  7149. }
  7150. ctx->authInSz = 0;
  7151. if (enc == 0 || enc == 1)
  7152. ctx->enc = enc ? 1 : 0;
  7153. if (key != NULL) {
  7154. ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen);
  7155. if (ret != 0) {
  7156. return WOLFSSL_FAILURE;
  7157. }
  7158. }
  7159. if (iv != NULL) {
  7160. XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz);
  7161. }
  7162. }
  7163. #endif
  7164. #ifndef NO_DES3
  7165. if (ctx->cipherType == DES_CBC_TYPE ||
  7166. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_CBC))) {
  7167. WOLFSSL_MSG("EVP_DES_CBC");
  7168. ctx->cipherType = DES_CBC_TYPE;
  7169. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7170. ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE;
  7171. ctx->keyLen = 8;
  7172. ctx->block_size = DES_BLOCK_SIZE;
  7173. ctx->ivSz = DES_BLOCK_SIZE;
  7174. if (enc == 0 || enc == 1)
  7175. ctx->enc = enc ? 1 : 0;
  7176. if (key) {
  7177. ret = wc_Des_SetKey(&ctx->cipher.des, key, iv,
  7178. ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
  7179. if (ret != 0)
  7180. return WOLFSSL_FAILURE;
  7181. }
  7182. if (iv && key == NULL)
  7183. wc_Des_SetIV(&ctx->cipher.des, iv);
  7184. }
  7185. #ifdef WOLFSSL_DES_ECB
  7186. else if (ctx->cipherType == DES_ECB_TYPE ||
  7187. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_ECB))) {
  7188. WOLFSSL_MSG("EVP_DES_ECB");
  7189. ctx->cipherType = DES_ECB_TYPE;
  7190. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7191. ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE;
  7192. ctx->keyLen = 8;
  7193. ctx->block_size = DES_BLOCK_SIZE;
  7194. if (enc == 0 || enc == 1)
  7195. ctx->enc = enc ? 1 : 0;
  7196. if (key) {
  7197. WOLFSSL_MSG("Des_SetKey");
  7198. ret = wc_Des_SetKey(&ctx->cipher.des, key, NULL,
  7199. ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
  7200. if (ret != 0)
  7201. return WOLFSSL_FAILURE;
  7202. }
  7203. }
  7204. #endif
  7205. else if (ctx->cipherType == DES_EDE3_CBC_TYPE ||
  7206. (type &&
  7207. EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_EDE3_CBC))) {
  7208. WOLFSSL_MSG("EVP_DES_EDE3_CBC");
  7209. ctx->cipherType = DES_EDE3_CBC_TYPE;
  7210. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7211. ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE;
  7212. ctx->keyLen = 24;
  7213. ctx->block_size = DES_BLOCK_SIZE;
  7214. ctx->ivSz = DES_BLOCK_SIZE;
  7215. if (enc == 0 || enc == 1)
  7216. ctx->enc = enc ? 1 : 0;
  7217. if (key) {
  7218. ret = wc_Des3_SetKey(&ctx->cipher.des3, key, iv,
  7219. ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
  7220. if (ret != 0)
  7221. return WOLFSSL_FAILURE;
  7222. }
  7223. if (iv && key == NULL) {
  7224. ret = wc_Des3_SetIV(&ctx->cipher.des3, iv);
  7225. if (ret != 0)
  7226. return WOLFSSL_FAILURE;
  7227. }
  7228. }
  7229. else if (ctx->cipherType == DES_EDE3_ECB_TYPE ||
  7230. (type &&
  7231. EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_EDE3_ECB))) {
  7232. WOLFSSL_MSG("EVP_DES_EDE3_ECB");
  7233. ctx->cipherType = DES_EDE3_ECB_TYPE;
  7234. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7235. ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE;
  7236. ctx->keyLen = 24;
  7237. ctx->block_size = DES_BLOCK_SIZE;
  7238. if (enc == 0 || enc == 1)
  7239. ctx->enc = enc ? 1 : 0;
  7240. if (key) {
  7241. ret = wc_Des3_SetKey(&ctx->cipher.des3, key, NULL,
  7242. ctx->enc ? DES_ENCRYPTION : DES_DECRYPTION);
  7243. if (ret != 0)
  7244. return WOLFSSL_FAILURE;
  7245. }
  7246. }
  7247. #endif /* NO_DES3 */
  7248. #ifndef NO_RC4
  7249. if (ctx->cipherType == ARC4_TYPE ||
  7250. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARC4))) {
  7251. WOLFSSL_MSG("ARC4");
  7252. ctx->cipherType = ARC4_TYPE;
  7253. ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE;
  7254. ctx->flags |= WOLFSSL_EVP_CIPH_STREAM_CIPHER;
  7255. ctx->block_size = 1;
  7256. if (ctx->keyLen == 0) /* user may have already set */
  7257. ctx->keyLen = 16; /* default to 128 */
  7258. if (key)
  7259. wc_Arc4SetKey(&ctx->cipher.arc4, key, (word32)ctx->keyLen);
  7260. }
  7261. #endif /* NO_RC4 */
  7262. if (ctx->cipherType == NULL_CIPHER_TYPE ||
  7263. (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_NULL))) {
  7264. WOLFSSL_MSG("NULL cipher");
  7265. ctx->cipherType = NULL_CIPHER_TYPE;
  7266. ctx->keyLen = 0;
  7267. ctx->block_size = 16;
  7268. }
  7269. #ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
  7270. if (iv && iv != ctx->iv) {
  7271. if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
  7272. return WOLFSSL_FAILURE;
  7273. }
  7274. }
  7275. #endif
  7276. (void)ret; /* remove warning. If execution reaches this point, ret=0 */
  7277. return WOLFSSL_SUCCESS;
  7278. }
  7279. int wolfSSL_EVP_CIPHER_CTX_nid(const WOLFSSL_EVP_CIPHER_CTX *ctx)
  7280. {
  7281. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_nid");
  7282. if (ctx == NULL) {
  7283. WOLFSSL_ERROR_MSG("Bad parameters");
  7284. return NID_undef;
  7285. }
  7286. switch (ctx->cipherType) {
  7287. #ifndef NO_AES
  7288. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  7289. case AES_128_CBC_TYPE :
  7290. return NID_aes_128_cbc;
  7291. case AES_192_CBC_TYPE :
  7292. return NID_aes_192_cbc;
  7293. case AES_256_CBC_TYPE :
  7294. return NID_aes_256_cbc;
  7295. #endif
  7296. #ifdef HAVE_AESGCM
  7297. case AES_128_GCM_TYPE :
  7298. return NID_aes_128_gcm;
  7299. case AES_192_GCM_TYPE :
  7300. return NID_aes_192_gcm;
  7301. case AES_256_GCM_TYPE :
  7302. return NID_aes_256_gcm;
  7303. #endif
  7304. #ifdef HAVE_AESCCM
  7305. case AES_128_CCM_TYPE :
  7306. return NID_aes_128_ccm;
  7307. case AES_192_CCM_TYPE :
  7308. return NID_aes_192_ccm;
  7309. case AES_256_CCM_TYPE :
  7310. return NID_aes_256_ccm;
  7311. #endif
  7312. #ifdef HAVE_AES_ECB
  7313. case AES_128_ECB_TYPE :
  7314. return NID_aes_128_ecb;
  7315. case AES_192_ECB_TYPE :
  7316. return NID_aes_192_ecb;
  7317. case AES_256_ECB_TYPE :
  7318. return NID_aes_256_ecb;
  7319. #endif
  7320. #ifdef WOLFSSL_AES_COUNTER
  7321. case AES_128_CTR_TYPE :
  7322. return NID_aes_128_ctr;
  7323. case AES_192_CTR_TYPE :
  7324. return NID_aes_192_ctr;
  7325. case AES_256_CTR_TYPE :
  7326. return NID_aes_256_ctr;
  7327. #endif
  7328. #endif /* NO_AES */
  7329. #ifdef HAVE_ARIA
  7330. case ARIA_128_GCM_TYPE :
  7331. return NID_aria_128_gcm;
  7332. case ARIA_192_GCM_TYPE :
  7333. return NID_aria_192_gcm;
  7334. case ARIA_256_GCM_TYPE :
  7335. return NID_aria_256_gcm;
  7336. #endif
  7337. #ifndef NO_DES3
  7338. case DES_CBC_TYPE :
  7339. return NID_des_cbc;
  7340. case DES_EDE3_CBC_TYPE :
  7341. return NID_des_ede3_cbc;
  7342. #endif
  7343. #ifdef WOLFSSL_DES_ECB
  7344. case DES_ECB_TYPE :
  7345. return NID_des_ecb;
  7346. case DES_EDE3_ECB_TYPE :
  7347. return NID_des_ede3_ecb;
  7348. #endif
  7349. case ARC4_TYPE :
  7350. return NID_rc4;
  7351. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  7352. case CHACHA20_POLY1305_TYPE:
  7353. return NID_chacha20_poly1305;
  7354. #endif
  7355. #ifdef HAVE_CHACHA
  7356. case CHACHA20_TYPE:
  7357. return NID_chacha20;
  7358. #endif
  7359. #ifdef WOLFSSL_SM4_ECB
  7360. case SM4_ECB_TYPE:
  7361. return NID_sm4_ecb;
  7362. #endif
  7363. #ifdef WOLFSSL_SM4_CBC
  7364. case SM4_CBC_TYPE:
  7365. return NID_sm4_cbc;
  7366. #endif
  7367. #ifdef WOLFSSL_SM4_CTR
  7368. case SM4_CTR_TYPE:
  7369. return NID_sm4_ctr;
  7370. #endif
  7371. #ifdef WOLFSSL_SM4_GCM
  7372. case SM4_GCM_TYPE:
  7373. return NID_sm4_gcm;
  7374. #endif
  7375. #ifdef WOLFSSL_SM4_CCM
  7376. case SM4_CCM_TYPE:
  7377. return NID_sm4_ccm;
  7378. #endif
  7379. case NULL_CIPHER_TYPE :
  7380. WOLFSSL_ERROR_MSG("Null cipher has no NID");
  7381. FALL_THROUGH;
  7382. default:
  7383. return NID_undef;
  7384. }
  7385. }
  7386. /* WOLFSSL_SUCCESS on ok */
  7387. int wolfSSL_EVP_CIPHER_CTX_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx)
  7388. {
  7389. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_key_length");
  7390. if (ctx)
  7391. return ctx->keyLen;
  7392. else
  7393. return WOLFSSL_FAILURE;
  7394. }
  7395. /* WOLFSSL_SUCCESS on ok */
  7396. int wolfSSL_EVP_CIPHER_CTX_set_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx,
  7397. int keylen)
  7398. {
  7399. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_key_length");
  7400. if (ctx)
  7401. ctx->keyLen = keylen;
  7402. else
  7403. return WOLFSSL_FAILURE;
  7404. return WOLFSSL_SUCCESS;
  7405. }
  7406. #ifdef HAVE_WOLFSSL_EVP_CIPHER_CTX_IV
  7407. /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
  7408. int wolfSSL_EVP_CIPHER_CTX_set_iv_length(WOLFSSL_EVP_CIPHER_CTX* ctx,
  7409. int ivLen)
  7410. {
  7411. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_iv_length");
  7412. if (ctx)
  7413. ctx->ivSz= ivLen;
  7414. else
  7415. return WOLFSSL_FAILURE;
  7416. return WOLFSSL_SUCCESS;
  7417. }
  7418. #endif
  7419. #if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \
  7420. (defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
  7421. /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
  7422. int wolfSSL_EVP_CIPHER_CTX_set_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* iv,
  7423. int ivLen)
  7424. {
  7425. int expectedIvLen;
  7426. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_set_iv");
  7427. if (!ctx || !iv || !ivLen) {
  7428. return WOLFSSL_FAILURE;
  7429. }
  7430. expectedIvLen = wolfSSL_EVP_CIPHER_CTX_iv_length(ctx);
  7431. if (expectedIvLen == 0 || expectedIvLen != ivLen) {
  7432. WOLFSSL_MSG("Wrong ivLen value");
  7433. return WOLFSSL_FAILURE;
  7434. }
  7435. return wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, -1);
  7436. }
  7437. #endif
  7438. #if !defined(NO_AES) || !defined(NO_DES3)
  7439. /* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE */
  7440. int wolfSSL_EVP_CIPHER_CTX_get_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* iv,
  7441. int ivLen)
  7442. {
  7443. int expectedIvLen;
  7444. WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_get_iv");
  7445. if (ctx == NULL || iv == NULL || ivLen == 0) {
  7446. WOLFSSL_MSG("Bad parameter");
  7447. return WOLFSSL_FAILURE;
  7448. }
  7449. expectedIvLen = wolfSSL_EVP_CIPHER_CTX_iv_length(ctx);
  7450. if (expectedIvLen == 0 || expectedIvLen != ivLen) {
  7451. WOLFSSL_MSG("Wrong ivLen value");
  7452. return WOLFSSL_FAILURE;
  7453. }
  7454. XMEMCPY(iv, ctx->iv, (size_t)ivLen);
  7455. return WOLFSSL_SUCCESS;
  7456. }
  7457. #endif /* !NO_AES || !NO_DES3 */
  7458. /* Return length on ok */
  7459. int wolfSSL_EVP_Cipher(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst, byte* src,
  7460. word32 len)
  7461. {
  7462. int ret = WOLFSSL_FAILURE;
  7463. WOLFSSL_ENTER("wolfSSL_EVP_Cipher");
  7464. if (ctx == NULL || ((src == NULL || dst == NULL) &&
  7465. (TRUE
  7466. #ifdef HAVE_AESGCM
  7467. && ctx->cipherType != AES_128_GCM_TYPE &&
  7468. ctx->cipherType != AES_192_GCM_TYPE &&
  7469. ctx->cipherType != AES_256_GCM_TYPE
  7470. #endif
  7471. #ifdef HAVE_AESCCM
  7472. && ctx->cipherType != AES_128_CCM_TYPE &&
  7473. ctx->cipherType != AES_192_CCM_TYPE &&
  7474. ctx->cipherType != AES_256_CCM_TYPE
  7475. #endif
  7476. #ifdef HAVE_ARIA
  7477. && ctx->cipherType != ARIA_128_GCM_TYPE &&
  7478. ctx->cipherType != ARIA_192_GCM_TYPE &&
  7479. ctx->cipherType != ARIA_256_GCM_TYPE
  7480. #endif
  7481. #ifdef WOLFSSL_SM4_GCM
  7482. && ctx->cipherType != SM4_GCM_TYPE
  7483. #endif
  7484. #ifdef WOLFSSL_SM4_CCM
  7485. && ctx->cipherType != SM4_CCM_TYPE
  7486. #endif
  7487. ))) {
  7488. WOLFSSL_MSG("Bad argument.");
  7489. return WOLFSSL_FATAL_ERROR;
  7490. }
  7491. if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) {
  7492. WOLFSSL_MSG("Cipher operation not initialized. Call "
  7493. "wolfSSL_EVP_CipherInit.");
  7494. return WOLFSSL_FATAL_ERROR;
  7495. }
  7496. switch (ctx->cipherType) {
  7497. #ifndef NO_AES
  7498. #ifdef HAVE_AES_CBC
  7499. case AES_128_CBC_TYPE :
  7500. case AES_192_CBC_TYPE :
  7501. case AES_256_CBC_TYPE :
  7502. WOLFSSL_MSG("AES CBC");
  7503. if (ctx->enc)
  7504. ret = wc_AesCbcEncrypt(&ctx->cipher.aes, dst, src, len);
  7505. else
  7506. ret = wc_AesCbcDecrypt(&ctx->cipher.aes, dst, src, len);
  7507. if (ret == 0)
  7508. ret = (int)((len / AES_BLOCK_SIZE) * AES_BLOCK_SIZE);
  7509. break;
  7510. #endif /* HAVE_AES_CBC */
  7511. #ifdef WOLFSSL_AES_CFB
  7512. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  7513. case AES_128_CFB1_TYPE:
  7514. case AES_192_CFB1_TYPE:
  7515. case AES_256_CFB1_TYPE:
  7516. WOLFSSL_MSG("AES CFB1");
  7517. if (ctx->enc)
  7518. ret = wc_AesCfb1Encrypt(&ctx->cipher.aes, dst, src, len);
  7519. else
  7520. ret = wc_AesCfb1Decrypt(&ctx->cipher.aes, dst, src, len);
  7521. if (ret == 0)
  7522. ret = (int)len;
  7523. break;
  7524. case AES_128_CFB8_TYPE:
  7525. case AES_192_CFB8_TYPE:
  7526. case AES_256_CFB8_TYPE:
  7527. WOLFSSL_MSG("AES CFB8");
  7528. if (ctx->enc)
  7529. ret = wc_AesCfb8Encrypt(&ctx->cipher.aes, dst, src, len);
  7530. else
  7531. ret = wc_AesCfb8Decrypt(&ctx->cipher.aes, dst, src, len);
  7532. if (ret == 0)
  7533. ret = (int)len;
  7534. break;
  7535. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  7536. case AES_128_CFB128_TYPE:
  7537. case AES_192_CFB128_TYPE:
  7538. case AES_256_CFB128_TYPE:
  7539. WOLFSSL_MSG("AES CFB128");
  7540. if (ctx->enc)
  7541. ret = wc_AesCfbEncrypt(&ctx->cipher.aes, dst, src, len);
  7542. else
  7543. ret = wc_AesCfbDecrypt(&ctx->cipher.aes, dst, src, len);
  7544. if (ret == 0)
  7545. ret = (int)len;
  7546. break;
  7547. #endif /* WOLFSSL_AES_CFB */
  7548. #if defined(WOLFSSL_AES_OFB)
  7549. case AES_128_OFB_TYPE:
  7550. case AES_192_OFB_TYPE:
  7551. case AES_256_OFB_TYPE:
  7552. WOLFSSL_MSG("AES OFB");
  7553. if (ctx->enc)
  7554. ret = wc_AesOfbEncrypt(&ctx->cipher.aes, dst, src, len);
  7555. else
  7556. ret = wc_AesOfbDecrypt(&ctx->cipher.aes, dst, src, len);
  7557. if (ret == 0)
  7558. ret = (int)len;
  7559. break;
  7560. #endif /* WOLFSSL_AES_OFB */
  7561. #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  7562. case AES_128_XTS_TYPE:
  7563. case AES_256_XTS_TYPE:
  7564. WOLFSSL_MSG("AES XTS");
  7565. if (ctx->enc)
  7566. ret = wc_AesXtsEncrypt(&ctx->cipher.xts, dst, src, len,
  7567. ctx->iv, (word32)ctx->ivSz);
  7568. else
  7569. ret = wc_AesXtsDecrypt(&ctx->cipher.xts, dst, src, len,
  7570. ctx->iv, (word32)ctx->ivSz);
  7571. if (ret == 0)
  7572. ret = (int)len;
  7573. break;
  7574. #endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
  7575. #if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  7576. || FIPS_VERSION_GE(2,0))
  7577. case AES_128_GCM_TYPE :
  7578. case AES_192_GCM_TYPE :
  7579. case AES_256_GCM_TYPE :
  7580. WOLFSSL_MSG("AES GCM");
  7581. ret = EvpCipherAesGCM(ctx, dst, src, len);
  7582. break;
  7583. #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  7584. * HAVE_FIPS_VERSION >= 2 */
  7585. #if defined(HAVE_AESCCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  7586. || FIPS_VERSION_GE(2,0))
  7587. case AES_128_CCM_TYPE :
  7588. case AES_192_CCM_TYPE :
  7589. case AES_256_CCM_TYPE :
  7590. WOLFSSL_MSG("AES CCM");
  7591. ret = EvpCipherAesCCM(ctx, dst, src, len);
  7592. break;
  7593. #endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  7594. * HAVE_FIPS_VERSION >= 2 */
  7595. #ifdef HAVE_AES_ECB
  7596. case AES_128_ECB_TYPE :
  7597. case AES_192_ECB_TYPE :
  7598. case AES_256_ECB_TYPE :
  7599. WOLFSSL_MSG("AES ECB");
  7600. if (ctx->enc)
  7601. ret = wc_AesEcbEncrypt(&ctx->cipher.aes, dst, src, len);
  7602. else
  7603. ret = wc_AesEcbDecrypt(&ctx->cipher.aes, dst, src, len);
  7604. if (ret == 0)
  7605. ret = (int)((len / AES_BLOCK_SIZE) * AES_BLOCK_SIZE);
  7606. break;
  7607. #endif
  7608. #ifdef WOLFSSL_AES_COUNTER
  7609. case AES_128_CTR_TYPE :
  7610. case AES_192_CTR_TYPE :
  7611. case AES_256_CTR_TYPE :
  7612. WOLFSSL_MSG("AES CTR");
  7613. ret = wc_AesCtrEncrypt(&ctx->cipher.aes, dst, src, len);
  7614. if (ret == 0)
  7615. ret = (int)len;
  7616. break;
  7617. #endif /* WOLFSSL_AES_COUNTER */
  7618. #endif /* NO_AES */
  7619. #if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \
  7620. || FIPS_VERSION_GE(2,0))
  7621. case ARIA_128_GCM_TYPE :
  7622. case ARIA_192_GCM_TYPE :
  7623. case ARIA_256_GCM_TYPE :
  7624. WOLFSSL_MSG("ARIA GCM");
  7625. if (ctx->enc) {
  7626. ret = wc_AriaEncrypt(&ctx->cipher.aria, dst, src, len,
  7627. ctx->iv, ctx->ivSz, NULL, 0,
  7628. ctx->authTag, ctx->authTagSz);
  7629. }
  7630. else {
  7631. ret = wc_AriaDecrypt(&ctx->cipher.aria, dst, src, len,
  7632. ctx->iv, ctx->ivSz, NULL, 0,
  7633. ctx->authTag, ctx->authTagSz);
  7634. }
  7635. break;
  7636. #endif /* HAVE_ARIA&& ((!HAVE_FIPS && !HAVE_SELFTEST) ||
  7637. * HAVE_FIPS_VERSION >= 2 */
  7638. #ifndef NO_DES3
  7639. case DES_CBC_TYPE :
  7640. WOLFSSL_MSG("DES CBC");
  7641. if (ctx->enc)
  7642. wc_Des_CbcEncrypt(&ctx->cipher.des, dst, src, len);
  7643. else
  7644. wc_Des_CbcDecrypt(&ctx->cipher.des, dst, src, len);
  7645. if (ret == 0)
  7646. ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
  7647. break;
  7648. case DES_EDE3_CBC_TYPE :
  7649. WOLFSSL_MSG("DES3 CBC");
  7650. if (ctx->enc)
  7651. ret = wc_Des3_CbcEncrypt(&ctx->cipher.des3, dst, src, len);
  7652. else
  7653. ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, dst, src, len);
  7654. if (ret == 0)
  7655. ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
  7656. break;
  7657. #ifdef WOLFSSL_DES_ECB
  7658. case DES_ECB_TYPE :
  7659. WOLFSSL_MSG("DES ECB");
  7660. ret = wc_Des_EcbEncrypt(&ctx->cipher.des, dst, src, len);
  7661. if (ret == 0)
  7662. ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
  7663. break;
  7664. case DES_EDE3_ECB_TYPE :
  7665. WOLFSSL_MSG("DES3 ECB");
  7666. ret = wc_Des3_EcbEncrypt(&ctx->cipher.des3, dst, src, len);
  7667. if (ret == 0)
  7668. ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE);
  7669. break;
  7670. #endif
  7671. #endif /* !NO_DES3 */
  7672. #ifndef NO_RC4
  7673. case ARC4_TYPE :
  7674. WOLFSSL_MSG("ARC4");
  7675. wc_Arc4Process(&ctx->cipher.arc4, dst, src, len);
  7676. if (ret == 0)
  7677. ret = (int)len;
  7678. break;
  7679. #endif
  7680. /* TODO: Chacha??? */
  7681. #ifdef WOLFSSL_SM4_ECB
  7682. case SM4_ECB_TYPE :
  7683. WOLFSSL_MSG("Sm4 ECB");
  7684. if (ctx->enc)
  7685. ret = wc_Sm4EcbEncrypt(&ctx->cipher.sm4, dst, src, len);
  7686. else
  7687. ret = wc_Sm4EcbDecrypt(&ctx->cipher.sm4, dst, src, len);
  7688. if (ret == 0)
  7689. ret = (int)((len / SM4_BLOCK_SIZE) * SM4_BLOCK_SIZE);
  7690. break;
  7691. #endif
  7692. #ifdef WOLFSSL_SM4_CBC
  7693. case SM4_CBC_TYPE :
  7694. WOLFSSL_MSG("Sm4 CBC");
  7695. if (ctx->enc)
  7696. ret = wc_Sm4CbcEncrypt(&ctx->cipher.sm4, dst, src, len);
  7697. else
  7698. ret = wc_Sm4CbcDecrypt(&ctx->cipher.sm4, dst, src, len);
  7699. if (ret == 0)
  7700. ret = (int)((len / SM4_BLOCK_SIZE) * SM4_BLOCK_SIZE);
  7701. break;
  7702. #endif
  7703. #ifdef WOLFSSL_SM4_CTR
  7704. case SM4_CTR_TYPE :
  7705. WOLFSSL_MSG("AES CTR");
  7706. ret = wc_Sm4CtrEncrypt(&ctx->cipher.sm4, dst, src, len);
  7707. if (ret == 0)
  7708. ret = (int)len;
  7709. break;
  7710. #endif
  7711. #ifdef WOLFSSL_SM4_GCM
  7712. case SM4_GCM_TYPE :
  7713. WOLFSSL_MSG("SM4 GCM");
  7714. /* No destination means only AAD. */
  7715. if (src != NULL && dst == NULL) {
  7716. ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, src, len);
  7717. }
  7718. else if (src != NULL && dst != NULL) {
  7719. if (ctx->enc) {
  7720. ret = wc_Sm4GcmEncrypt(&ctx->cipher.sm4, dst, src,
  7721. len, ctx->iv, ctx->ivSz, ctx->authTag,
  7722. ctx->authTagSz, ctx->authIn,
  7723. ctx->authInSz);
  7724. }
  7725. else {
  7726. ret = wc_Sm4GcmDecrypt(&ctx->cipher.sm4, dst, src,
  7727. len, ctx->iv, ctx->ivSz, ctx->authTag,
  7728. ctx->authTagSz, ctx->authIn,
  7729. ctx->authInSz);
  7730. }
  7731. if (ctx->authIncIv) {
  7732. IncCtr((byte*)ctx->cipher.sm4.iv,
  7733. ctx->cipher.sm4.nonceSz);
  7734. ctx->authIncIv = 0;
  7735. }
  7736. }
  7737. break;
  7738. #endif
  7739. #ifdef WOLFSSL_SM4_CCM
  7740. case SM4_CCM_TYPE :
  7741. WOLFSSL_MSG("SM4 CCM");
  7742. /* No destination means only AAD. */
  7743. if (src != NULL && dst == NULL) {
  7744. ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, len);
  7745. }
  7746. else if (src != NULL && dst != NULL) {
  7747. if (ctx->enc) {
  7748. ret = wc_Sm4CcmEncrypt(&ctx->cipher.sm4, dst, src,
  7749. len, ctx->iv, ctx->ivSz, ctx->authTag,
  7750. ctx->authTagSz, ctx->authIn,
  7751. ctx->authInSz);
  7752. }
  7753. else {
  7754. ret = wc_Sm4CcmDecrypt(&ctx->cipher.sm4, dst, src,
  7755. len, ctx->iv, ctx->ivSz, ctx->authTag,
  7756. ctx->authTagSz, ctx->authIn,
  7757. ctx->authInSz);
  7758. }
  7759. if (ctx->authIncIv) {
  7760. IncCtr((byte*)ctx->cipher.sm4.iv,
  7761. ctx->cipher.sm4.nonceSz);
  7762. ctx->authIncIv = 0;
  7763. }
  7764. }
  7765. if (src == NULL) {
  7766. /*
  7767. * Clear any leftover AAD on final (final is when src is
  7768. * NULL).
  7769. */
  7770. if (ctx->authIn != NULL) {
  7771. XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz);
  7772. }
  7773. ctx->authInSz = 0;
  7774. }
  7775. if (ret == 0) {
  7776. ret = (int)len;
  7777. }
  7778. break;
  7779. #endif
  7780. case NULL_CIPHER_TYPE :
  7781. WOLFSSL_MSG("NULL CIPHER");
  7782. XMEMCPY(dst, src, (size_t)len);
  7783. ret = (int)len;
  7784. break;
  7785. default: {
  7786. WOLFSSL_MSG("bad type");
  7787. return WOLFSSL_FATAL_ERROR;
  7788. }
  7789. }
  7790. if (ret < 0) {
  7791. if (ret == AES_GCM_AUTH_E) {
  7792. WOLFSSL_MSG("wolfSSL_EVP_Cipher failure: bad AES-GCM tag.");
  7793. }
  7794. WOLFSSL_MSG("wolfSSL_EVP_Cipher failure");
  7795. return WOLFSSL_FATAL_ERROR;
  7796. }
  7797. if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) {
  7798. return WOLFSSL_FATAL_ERROR;
  7799. }
  7800. WOLFSSL_MSG("wolfSSL_EVP_Cipher success");
  7801. return ret;
  7802. }
  7803. static void clearEVPPkeyKeys(WOLFSSL_EVP_PKEY *pkey)
  7804. {
  7805. if(pkey == NULL)
  7806. return;
  7807. WOLFSSL_ENTER("clearEVPPkeyKeys");
  7808. #ifndef NO_RSA
  7809. if (pkey->rsa != NULL && pkey->ownRsa == 1) {
  7810. wolfSSL_RSA_free(pkey->rsa);
  7811. pkey->rsa = NULL;
  7812. }
  7813. pkey->ownRsa = 0;
  7814. #endif
  7815. #ifndef NO_DSA
  7816. if (pkey->dsa != NULL && pkey->ownDsa == 1) {
  7817. wolfSSL_DSA_free(pkey->dsa);
  7818. pkey->dsa = NULL;
  7819. }
  7820. pkey->ownDsa = 0;
  7821. #endif
  7822. #ifndef NO_DH
  7823. if (pkey->dh != NULL && pkey->ownDh == 1) {
  7824. wolfSSL_DH_free(pkey->dh);
  7825. pkey->dh = NULL;
  7826. }
  7827. pkey->ownDh = 0;
  7828. #endif
  7829. #ifdef HAVE_ECC
  7830. if (pkey->ecc != NULL && pkey->ownEcc == 1) {
  7831. wolfSSL_EC_KEY_free(pkey->ecc);
  7832. pkey->ecc = NULL;
  7833. }
  7834. pkey->ownEcc = 0;
  7835. #endif
  7836. }
  7837. #ifndef NO_RSA
  7838. #if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA)
  7839. static int PopulateRSAEvpPkeyDer(WOLFSSL_EVP_PKEY *pkey)
  7840. {
  7841. int ret = 0;
  7842. int derSz = 0;
  7843. word32 pkcs8Sz = 0;
  7844. byte* derBuf = NULL;
  7845. RsaKey* rsa = NULL;
  7846. WOLFSSL_RSA *key = NULL;
  7847. if (pkey == NULL || pkey->rsa == NULL || pkey->rsa->internal == NULL) {
  7848. WOLFSSL_MSG("bad parameter");
  7849. return WOLFSSL_FAILURE;
  7850. }
  7851. key = pkey->rsa;
  7852. rsa = (RsaKey*)pkey->rsa->internal;
  7853. /* Get DER size */
  7854. if (rsa->type == RSA_PRIVATE) {
  7855. ret = wc_RsaKeyToDer(rsa, NULL, 0);
  7856. if (ret > 0) {
  7857. derSz = ret;
  7858. #ifdef HAVE_PKCS8
  7859. if (key->pkcs8HeaderSz) {
  7860. ret = wc_CreatePKCS8Key(NULL, &pkcs8Sz, NULL, (word32)derSz,
  7861. RSAk, NULL, 0);
  7862. if (ret == LENGTH_ONLY_E)
  7863. ret = 0;
  7864. }
  7865. #endif
  7866. }
  7867. }
  7868. else {
  7869. ret = wc_RsaKeyToPublicDer(rsa, NULL, 0);
  7870. if (ret > 0)
  7871. derSz = ret;
  7872. }
  7873. if (derSz == 0 || ret < 0) {
  7874. WOLFSSL_MSG("Error getting RSA DER size");
  7875. return WOLFSSL_FAILURE;
  7876. }
  7877. #ifdef WOLFSSL_NO_REALLOC
  7878. derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_DER);
  7879. if (derBuf != NULL) {
  7880. XMEMCPY(derBuf, pkey->pkey.ptr, (size_t)pkey->pkey_sz);
  7881. XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_DER);
  7882. pkey->pkey.ptr = NULL;
  7883. }
  7884. #else
  7885. derBuf = (byte*)XREALLOC(pkey->pkey.ptr, (size_t)derSz,
  7886. pkey->heap, DYNAMIC_TYPE_DER);
  7887. #endif
  7888. if (derBuf == NULL) {
  7889. WOLFSSL_MSG("PopulateRSAEvpPkeyDer malloc failed");
  7890. return WOLFSSL_FAILURE;
  7891. }
  7892. /* Old pointer is invalid from this point on */
  7893. pkey->pkey.ptr = (char*)derBuf;
  7894. if (rsa->type == RSA_PRIVATE) {
  7895. ret = wc_RsaKeyToDer(rsa, derBuf, (word32)derSz);
  7896. if (ret > 0) {
  7897. derSz = ret;
  7898. #ifdef HAVE_PKCS8
  7899. if (key->pkcs8HeaderSz) {
  7900. byte* keyBuf = derBuf;
  7901. int keySz = derSz;
  7902. word32 sz = pkcs8Sz;
  7903. /* Need new buffer for PKCS8 since we can't
  7904. * do this in-place */
  7905. derBuf = (byte*)XMALLOC((size_t)pkcs8Sz, pkey->heap,
  7906. DYNAMIC_TYPE_DER);
  7907. if (derBuf != NULL) {
  7908. ret = wc_CreatePKCS8Key(derBuf, &sz, keyBuf, (word32)keySz,
  7909. RSAk, NULL, 0);
  7910. XFREE(keyBuf, pkey->heap, DYNAMIC_TYPE_DER);
  7911. pkey->pkey.ptr = (char*)derBuf;
  7912. }
  7913. else {
  7914. ret = MEMORY_E;
  7915. }
  7916. derSz = (int)sz;
  7917. }
  7918. #endif
  7919. }
  7920. }
  7921. else {
  7922. /* Public key to DER */
  7923. ret = wc_RsaKeyToPublicDer(rsa, derBuf, (word32)derSz);
  7924. if (ret > 0)
  7925. derSz = ret;
  7926. }
  7927. if (ret < 0) {
  7928. WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed");
  7929. return WOLFSSL_FAILURE;
  7930. }
  7931. else {
  7932. pkey->pkey_sz = derSz;
  7933. return WOLFSSL_SUCCESS;
  7934. }
  7935. }
  7936. #endif
  7937. WOLFSSL_RSA* wolfSSL_EVP_PKEY_get0_RSA(WOLFSSL_EVP_PKEY *pkey)
  7938. {
  7939. WOLFSSL_MSG("wolfSSL_EVP_PKEY_get0_RSA");
  7940. if (pkey == NULL)
  7941. return NULL;
  7942. return pkey->rsa;
  7943. }
  7944. WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY* pkey)
  7945. {
  7946. WOLFSSL_MSG("wolfSSL_EVP_PKEY_get1_RSA");
  7947. if (pkey == NULL || pkey->rsa == NULL)
  7948. return NULL;
  7949. if (wolfSSL_RSA_up_ref(pkey->rsa) != WOLFSSL_SUCCESS)
  7950. return NULL;
  7951. return pkey->rsa;
  7952. }
  7953. /* with set1 functions the pkey struct does not own the RSA structure
  7954. *
  7955. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  7956. */
  7957. int wolfSSL_EVP_PKEY_set1_RSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_RSA *key)
  7958. {
  7959. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_RSA");
  7960. if (pkey == NULL || key == NULL)
  7961. return WOLFSSL_FAILURE;
  7962. if (wolfSSL_RSA_up_ref(key) != WOLFSSL_SUCCESS) {
  7963. WOLFSSL_MSG("wolfSSL_RSA_up_ref failed");
  7964. return WOLFSSL_FAILURE;
  7965. }
  7966. clearEVPPkeyKeys(pkey);
  7967. pkey->rsa = key;
  7968. pkey->ownRsa = 1; /* pkey does not own RSA but needs to call free on it */
  7969. pkey->type = EVP_PKEY_RSA;
  7970. pkey->pkcs8HeaderSz = key->pkcs8HeaderSz;
  7971. if (key->inSet == 0) {
  7972. if (SetRsaInternal(key) != WOLFSSL_SUCCESS) {
  7973. WOLFSSL_MSG("SetRsaInternal failed");
  7974. return WOLFSSL_FAILURE;
  7975. }
  7976. }
  7977. #if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA)
  7978. if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS) {
  7979. WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed");
  7980. return WOLFSSL_FAILURE;
  7981. }
  7982. #endif /* WOLFSSL_KEY_GEN && !HAVE_USER_RSA */
  7983. #ifdef WC_RSA_BLINDING
  7984. if (key->ownRng == 0) {
  7985. if (wc_RsaSetRNG((RsaKey*)pkey->rsa->internal, &pkey->rng) != 0) {
  7986. WOLFSSL_MSG("Error setting RSA rng");
  7987. return WOLFSSL_FAILURE;
  7988. }
  7989. }
  7990. #endif
  7991. return WOLFSSL_SUCCESS;
  7992. }
  7993. #endif /* !NO_RSA */
  7994. #if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN)
  7995. /* with set1 functions the pkey struct does not own the DSA structure
  7996. *
  7997. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  7998. */
  7999. int wolfSSL_EVP_PKEY_set1_DSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DSA *key)
  8000. {
  8001. int derMax = 0;
  8002. int derSz = 0;
  8003. DsaKey* dsa = NULL;
  8004. byte* derBuf = NULL;
  8005. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DSA");
  8006. if((pkey == NULL) || (key == NULL))return WOLFSSL_FAILURE;
  8007. clearEVPPkeyKeys(pkey);
  8008. pkey->dsa = key;
  8009. pkey->ownDsa = 0; /* pkey does not own DSA */
  8010. pkey->type = EVP_PKEY_DSA;
  8011. if (key->inSet == 0) {
  8012. if (SetDsaInternal(key) != WOLFSSL_SUCCESS) {
  8013. WOLFSSL_MSG("SetDsaInternal failed");
  8014. return WOLFSSL_FAILURE;
  8015. }
  8016. }
  8017. dsa = (DsaKey*)key->internal;
  8018. /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */
  8019. derMax = 4 * wolfSSL_BN_num_bytes(key->g) + AES_BLOCK_SIZE;
  8020. derBuf = (byte*)XMALLOC((size_t)derMax, pkey->heap,
  8021. DYNAMIC_TYPE_TMP_BUFFER);
  8022. if (derBuf == NULL) {
  8023. WOLFSSL_MSG("malloc failed");
  8024. return WOLFSSL_FAILURE;
  8025. }
  8026. if (dsa->type == DSA_PRIVATE) {
  8027. /* Private key to DER */
  8028. derSz = wc_DsaKeyToDer(dsa, derBuf, (word32)derMax);
  8029. }
  8030. else {
  8031. /* Public key to DER */
  8032. derSz = wc_DsaKeyToPublicDer(dsa, derBuf, (word32)derMax);
  8033. }
  8034. if (derSz < 0) {
  8035. if (dsa->type == DSA_PRIVATE) {
  8036. WOLFSSL_MSG("wc_DsaKeyToDer failed");
  8037. }
  8038. else {
  8039. WOLFSSL_MSG("wc_DsaKeyToPublicDer failed");
  8040. }
  8041. XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8042. return WOLFSSL_FAILURE;
  8043. }
  8044. pkey->pkey.ptr = (char*)XMALLOC((size_t)derSz, pkey->heap,
  8045. DYNAMIC_TYPE_DER);
  8046. if (pkey->pkey.ptr == NULL) {
  8047. WOLFSSL_MSG("key malloc failed");
  8048. XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8049. return WOLFSSL_FAILURE;
  8050. }
  8051. pkey->pkey_sz = derSz;
  8052. XMEMCPY(pkey->pkey.ptr, derBuf, (size_t)derSz);
  8053. XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8054. return WOLFSSL_SUCCESS;
  8055. }
  8056. WOLFSSL_DSA* wolfSSL_EVP_PKEY_get0_DSA(struct WOLFSSL_EVP_PKEY *pkey)
  8057. {
  8058. if (!pkey) {
  8059. return NULL;
  8060. }
  8061. return pkey->dsa;
  8062. }
  8063. WOLFSSL_DSA* wolfSSL_EVP_PKEY_get1_DSA(WOLFSSL_EVP_PKEY* key)
  8064. {
  8065. WOLFSSL_DSA* local;
  8066. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_DSA");
  8067. if (key == NULL) {
  8068. WOLFSSL_MSG("Bad function argument");
  8069. return NULL;
  8070. }
  8071. local = wolfSSL_DSA_new();
  8072. if (local == NULL) {
  8073. WOLFSSL_MSG("Error creating a new WOLFSSL_DSA structure");
  8074. return NULL;
  8075. }
  8076. if (key->type == EVP_PKEY_DSA) {
  8077. if (wolfSSL_DSA_LoadDer(local, (const unsigned char*)key->pkey.ptr,
  8078. key->pkey_sz) != SSL_SUCCESS) {
  8079. /* now try public key */
  8080. if (wolfSSL_DSA_LoadDer_ex(local,
  8081. (const unsigned char*)key->pkey.ptr, key->pkey_sz,
  8082. WOLFSSL_DSA_LOAD_PUBLIC) != SSL_SUCCESS) {
  8083. wolfSSL_DSA_free(local);
  8084. local = NULL;
  8085. }
  8086. }
  8087. }
  8088. else {
  8089. WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold a DSA key");
  8090. wolfSSL_DSA_free(local);
  8091. local = NULL;
  8092. }
  8093. return local;
  8094. }
  8095. #endif /* !NO_DSA && !HAVE_SELFTEST && WOLFSSL_KEY_GEN */
  8096. #ifdef HAVE_ECC
  8097. WOLFSSL_EC_KEY *wolfSSL_EVP_PKEY_get0_EC_KEY(WOLFSSL_EVP_PKEY *pkey)
  8098. {
  8099. WOLFSSL_EC_KEY *eckey = NULL;
  8100. if (pkey && pkey->type == EVP_PKEY_EC) {
  8101. #ifdef HAVE_ECC
  8102. eckey = pkey->ecc;
  8103. #endif
  8104. }
  8105. return eckey;
  8106. }
  8107. WOLFSSL_EC_KEY* wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY* key)
  8108. {
  8109. WOLFSSL_EC_KEY* local = NULL;
  8110. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_EC_KEY");
  8111. if (key == NULL || key->type != EVP_PKEY_EC) {
  8112. return NULL;
  8113. }
  8114. if (key->type == EVP_PKEY_EC) {
  8115. if (key->ecc != NULL) {
  8116. if (wolfSSL_EC_KEY_up_ref(key->ecc) != WOLFSSL_SUCCESS) {
  8117. return NULL;
  8118. }
  8119. local = key->ecc;
  8120. }
  8121. else {
  8122. key->ecc = local = wolfSSL_EC_KEY_new();
  8123. if (local == NULL) {
  8124. WOLFSSL_MSG("Error creating a new WOLFSSL_EC_KEY structure");
  8125. return NULL;
  8126. }
  8127. if (wolfSSL_EC_KEY_LoadDer(local,
  8128. (const unsigned char*)key->pkey.ptr,
  8129. key->pkey_sz) != WOLFSSL_SUCCESS) {
  8130. /* now try public key */
  8131. if (wolfSSL_EC_KEY_LoadDer_ex(local,
  8132. (const unsigned char*)key->pkey.ptr, key->pkey_sz,
  8133. WOLFSSL_EC_KEY_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
  8134. wolfSSL_EC_KEY_free(local);
  8135. local = NULL;
  8136. }
  8137. }
  8138. }
  8139. }
  8140. else {
  8141. WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold an EC key");
  8142. }
  8143. return local;
  8144. }
  8145. #endif /* HAVE_ECC */
  8146. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENSSH)
  8147. #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM)
  8148. /* with set1 functions the pkey struct does not own the DH structure
  8149. * Build the following DH Key format from the passed in WOLFSSL_DH
  8150. * then store in WOLFSSL_EVP_PKEY in DER format.
  8151. *
  8152. * returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
  8153. */
  8154. int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key)
  8155. {
  8156. byte havePublic = 0, havePrivate = 0;
  8157. int ret;
  8158. word32 derSz = 0;
  8159. byte* derBuf = NULL;
  8160. DhKey* dhkey = NULL;
  8161. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_DH");
  8162. if (pkey == NULL || key == NULL)
  8163. return WOLFSSL_FAILURE;
  8164. clearEVPPkeyKeys(pkey);
  8165. if (wolfSSL_DH_up_ref(key) != WOLFSSL_SUCCESS) {
  8166. WOLFSSL_MSG("Failed to increase dh key ref count");
  8167. return WOLFSSL_FAILURE;
  8168. }
  8169. pkey->dh = key;
  8170. pkey->ownDh = 1; /* pkey does not own DH but needs to call free on it */
  8171. pkey->type = EVP_PKEY_DH;
  8172. if (key->inSet == 0) {
  8173. if (SetDhInternal(key) != WOLFSSL_SUCCESS) {
  8174. WOLFSSL_MSG("SetDhInternal failed");
  8175. return WOLFSSL_FAILURE;
  8176. }
  8177. }
  8178. dhkey = (DhKey*)key->internal;
  8179. havePublic = mp_unsigned_bin_size(&dhkey->pub) > 0;
  8180. havePrivate = mp_unsigned_bin_size(&dhkey->priv) > 0;
  8181. /* Get size of DER buffer only */
  8182. if (havePublic && !havePrivate) {
  8183. ret = wc_DhPubKeyToDer(dhkey, NULL, &derSz);
  8184. } else if (havePrivate && !havePublic) {
  8185. ret = wc_DhPrivKeyToDer(dhkey, NULL, &derSz);
  8186. } else {
  8187. ret = wc_DhParamsToDer(dhkey,NULL,&derSz);
  8188. }
  8189. if (derSz == 0 || ret != LENGTH_ONLY_E) {
  8190. WOLFSSL_MSG("Failed to get size of DH Key");
  8191. return WOLFSSL_FAILURE;
  8192. }
  8193. derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8194. if (derBuf == NULL) {
  8195. WOLFSSL_MSG("malloc failed");
  8196. return WOLFSSL_FAILURE;
  8197. }
  8198. /* Fill DER buffer */
  8199. if (havePublic && !havePrivate) {
  8200. ret = wc_DhPubKeyToDer(dhkey, derBuf, &derSz);
  8201. } else if (havePrivate && !havePublic) {
  8202. ret = wc_DhPrivKeyToDer(dhkey, derBuf, &derSz);
  8203. } else {
  8204. ret = wc_DhParamsToDer(dhkey,derBuf,&derSz);
  8205. }
  8206. if (ret <= 0) {
  8207. WOLFSSL_MSG("Failed to export DH Key");
  8208. XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8209. return WOLFSSL_FAILURE;
  8210. }
  8211. /* Store DH key into pkey (DER format) */
  8212. pkey->pkey.ptr = (char*)derBuf;
  8213. pkey->pkey_sz = (int)derSz;
  8214. return WOLFSSL_SUCCESS;
  8215. }
  8216. WOLFSSL_DH* wolfSSL_EVP_PKEY_get0_DH(WOLFSSL_EVP_PKEY* key)
  8217. {
  8218. if (!key) {
  8219. return NULL;
  8220. }
  8221. return key->dh;
  8222. }
  8223. WOLFSSL_DH* wolfSSL_EVP_PKEY_get1_DH(WOLFSSL_EVP_PKEY* key)
  8224. {
  8225. WOLFSSL_DH* local = NULL;
  8226. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_DH");
  8227. if (key == NULL || key->dh == NULL) {
  8228. WOLFSSL_MSG("Bad function argument");
  8229. return NULL;
  8230. }
  8231. if (key->type == EVP_PKEY_DH) {
  8232. /* if key->dh already exists copy instead of re-importing from DER */
  8233. if (key->dh != NULL) {
  8234. if (wolfSSL_DH_up_ref(key->dh) != WOLFSSL_SUCCESS) {
  8235. return NULL;
  8236. }
  8237. local = key->dh;
  8238. }
  8239. else {
  8240. #if !defined(NO_DH) && (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
  8241. (HAVE_FIPS_VERSION>2)))
  8242. local = wolfSSL_DH_new();
  8243. if (local == NULL) {
  8244. WOLFSSL_MSG("Error creating a new WOLFSSL_DH structure");
  8245. return NULL;
  8246. }
  8247. if (wolfSSL_DH_LoadDer(local, (const unsigned char*)key->pkey.ptr,
  8248. key->pkey_sz) != SSL_SUCCESS) {
  8249. wolfSSL_DH_free(local);
  8250. WOLFSSL_MSG("Error wolfSSL_DH_LoadDer");
  8251. local = NULL;
  8252. }
  8253. #else
  8254. WOLFSSL_MSG("EVP_PKEY does not hold DH struct");
  8255. return NULL;
  8256. #endif
  8257. }
  8258. }
  8259. else {
  8260. WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold a DH key");
  8261. wolfSSL_DH_free(local);
  8262. return NULL;
  8263. }
  8264. return local;
  8265. }
  8266. #endif /* NO_DH && WOLFSSL_DH_EXTRA && NO_FILESYSTEM */
  8267. int wolfSSL_EVP_PKEY_assign(WOLFSSL_EVP_PKEY *pkey, int type, void *key)
  8268. {
  8269. int ret;
  8270. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_assign");
  8271. /* pkey and key checked if NULL in subsequent assign functions */
  8272. switch(type) {
  8273. #ifndef NO_RSA
  8274. case EVP_PKEY_RSA:
  8275. ret = wolfSSL_EVP_PKEY_assign_RSA(pkey, (WOLFSSL_RSA*)key);
  8276. break;
  8277. #endif
  8278. #ifndef NO_DSA
  8279. case EVP_PKEY_DSA:
  8280. ret = wolfSSL_EVP_PKEY_assign_DSA(pkey, (WOLFSSL_DSA*)key);
  8281. break;
  8282. #endif
  8283. #ifdef HAVE_ECC
  8284. case EVP_PKEY_EC:
  8285. ret = wolfSSL_EVP_PKEY_assign_EC_KEY(pkey, (WOLFSSL_EC_KEY*)key);
  8286. break;
  8287. #endif
  8288. #ifndef NO_DH
  8289. case EVP_PKEY_DH:
  8290. ret = wolfSSL_EVP_PKEY_assign_DH(pkey, (WOLFSSL_DH*)key);
  8291. break;
  8292. #endif
  8293. default:
  8294. WOLFSSL_MSG("Unknown EVP_PKEY type in wolfSSL_EVP_PKEY_assign.");
  8295. ret = WOLFSSL_FAILURE;
  8296. }
  8297. return ret;
  8298. }
  8299. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  8300. #if defined(HAVE_ECC)
  8301. /* try and populate public pkey_sz and pkey.ptr */
  8302. static int ECC_populate_EVP_PKEY(EVP_PKEY* pkey, WOLFSSL_EC_KEY *key)
  8303. {
  8304. int derSz = 0;
  8305. byte* derBuf = NULL;
  8306. ecc_key* ecc;
  8307. if (pkey == NULL || key == NULL || key->internal == NULL)
  8308. return WOLFSSL_FAILURE;
  8309. ecc = (ecc_key*)key->internal;
  8310. if (ecc->type == ECC_PRIVATEKEY || ecc->type == ECC_PRIVATEKEY_ONLY) {
  8311. #ifdef HAVE_PKCS8
  8312. if (key->pkcs8HeaderSz) {
  8313. /* when key has pkcs8 header the pkey should too */
  8314. if (wc_EccKeyToPKCS8(ecc, NULL, (word32*)&derSz) == LENGTH_ONLY_E) {
  8315. derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap,
  8316. DYNAMIC_TYPE_OPENSSL);
  8317. if (derBuf) {
  8318. if (wc_EccKeyToPKCS8(ecc, derBuf, (word32*)&derSz) >= 0) {
  8319. if (pkey->pkey.ptr) {
  8320. XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
  8321. }
  8322. pkey->pkey_sz = (int)derSz;
  8323. pkey->pkey.ptr = (char*)derBuf;
  8324. pkey->pkcs8HeaderSz = key->pkcs8HeaderSz;
  8325. return WOLFSSL_SUCCESS;
  8326. }
  8327. else {
  8328. XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL);
  8329. derBuf = NULL;
  8330. }
  8331. }
  8332. }
  8333. }
  8334. else
  8335. #endif /* HAVE_PKCS8 */
  8336. {
  8337. if (ecc->type == ECC_PRIVATEKEY_ONLY) {
  8338. if (wc_ecc_make_pub(ecc, NULL) != MP_OKAY) {
  8339. return WOLFSSL_FAILURE;
  8340. }
  8341. }
  8342. /* if not, the pkey will be traditional ecc key */
  8343. if ((derSz = wc_EccKeyDerSize(ecc, 1)) > 0) {
  8344. derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap,
  8345. DYNAMIC_TYPE_OPENSSL);
  8346. if (derBuf) {
  8347. if (wc_EccKeyToDer(ecc, derBuf, (word32)derSz) >= 0) {
  8348. if (pkey->pkey.ptr) {
  8349. XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL);
  8350. }
  8351. pkey->pkey_sz = (int)derSz;
  8352. pkey->pkey.ptr = (char*)derBuf;
  8353. return WOLFSSL_SUCCESS;
  8354. }
  8355. else {
  8356. XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_OPENSSL);
  8357. derBuf = NULL;
  8358. }
  8359. }
  8360. }
  8361. }
  8362. }
  8363. else if (ecc->type == ECC_PUBLICKEY) {
  8364. if ((derSz = wc_EccPublicKeyDerSize(ecc, 1)) > 0) {
  8365. derBuf = (byte*)XREALLOC(pkey->pkey.ptr, (size_t)derSz, NULL,
  8366. DYNAMIC_TYPE_OPENSSL);
  8367. if (derBuf != NULL) {
  8368. pkey->pkey.ptr = (char*)derBuf;
  8369. if ((derSz = wc_EccPublicKeyToDer(ecc, derBuf, (word32)derSz,
  8370. 1)) < 0) {
  8371. XFREE(derBuf, NULL, DYNAMIC_TYPE_OPENSSL);
  8372. derBuf = NULL;
  8373. }
  8374. }
  8375. }
  8376. }
  8377. if (derBuf != NULL) {
  8378. pkey->pkey_sz = (int)derSz;
  8379. return WOLFSSL_SUCCESS;
  8380. }
  8381. else {
  8382. return WOLFSSL_FAILURE;
  8383. }
  8384. }
  8385. int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key)
  8386. {
  8387. #ifdef HAVE_ECC
  8388. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_EC_KEY");
  8389. if (pkey == NULL || key == NULL)
  8390. return WOLFSSL_FAILURE;
  8391. clearEVPPkeyKeys(pkey);
  8392. if (wolfSSL_EC_KEY_up_ref(key) != WOLFSSL_SUCCESS) {
  8393. WOLFSSL_MSG("wolfSSL_EC_KEY_up_ref failed");
  8394. return WOLFSSL_FAILURE;
  8395. }
  8396. pkey->ecc = key;
  8397. pkey->ownEcc = 1; /* pkey needs to call free on key */
  8398. pkey->type = EVP_PKEY_EC;
  8399. return ECC_populate_EVP_PKEY(pkey, key);
  8400. #else
  8401. (void)pkey;
  8402. (void)key;
  8403. return WOLFSSL_FAILURE;
  8404. #endif /* HAVE_ECC */
  8405. }
  8406. void* wolfSSL_EVP_X_STATE(const WOLFSSL_EVP_CIPHER_CTX* ctx)
  8407. {
  8408. WOLFSSL_MSG("wolfSSL_EVP_X_STATE");
  8409. if (ctx) {
  8410. switch (ctx->cipherType) {
  8411. case ARC4_TYPE:
  8412. WOLFSSL_MSG("returning arc4 state");
  8413. return (void*)&ctx->cipher.arc4.x;
  8414. default:
  8415. WOLFSSL_MSG("bad x state type");
  8416. return 0;
  8417. }
  8418. }
  8419. return NULL;
  8420. }
  8421. int wolfSSL_EVP_PKEY_assign_EC_KEY(EVP_PKEY* pkey, WOLFSSL_EC_KEY* key)
  8422. {
  8423. int ret;
  8424. if (pkey == NULL || key == NULL)
  8425. return WOLFSSL_FAILURE;
  8426. /* try and populate public pkey_sz and pkey.ptr */
  8427. ret = ECC_populate_EVP_PKEY(pkey, key);
  8428. if (ret == WOLFSSL_SUCCESS) { /* take ownership of key if can be used */
  8429. clearEVPPkeyKeys(pkey); /* clear out any previous keys */
  8430. pkey->type = EVP_PKEY_EC;
  8431. pkey->ecc = key;
  8432. pkey->ownEcc = 1;
  8433. }
  8434. return ret;
  8435. }
  8436. #endif /* HAVE_ECC */
  8437. #ifndef NO_WOLFSSL_STUB
  8438. const WOLFSSL_EVP_MD* wolfSSL_EVP_ripemd160(void)
  8439. {
  8440. WOLFSSL_MSG("wolfSSL_ripemd160");
  8441. WOLFSSL_STUB("EVP_ripemd160");
  8442. return NULL;
  8443. }
  8444. #endif
  8445. int wolfSSL_EVP_MD_pkey_type(const WOLFSSL_EVP_MD* type)
  8446. {
  8447. int ret = BAD_FUNC_ARG;
  8448. WOLFSSL_ENTER("wolfSSL_EVP_MD_pkey_type");
  8449. if (type != NULL) {
  8450. if (XSTRCMP(type, "MD5") == 0) {
  8451. ret = NID_md5WithRSAEncryption;
  8452. }
  8453. else if (XSTRCMP(type, "SHA1") == 0) {
  8454. ret = NID_sha1WithRSAEncryption;
  8455. }
  8456. else if (XSTRCMP(type, "SHA224") == 0) {
  8457. ret = NID_sha224WithRSAEncryption;
  8458. }
  8459. else if (XSTRCMP(type, "SHA256") == 0) {
  8460. ret = NID_sha256WithRSAEncryption;
  8461. }
  8462. else if (XSTRCMP(type, "SHA384") == 0) {
  8463. ret = NID_sha384WithRSAEncryption;
  8464. }
  8465. else if (XSTRCMP(type, "SHA512") == 0) {
  8466. ret = NID_sha512WithRSAEncryption;
  8467. }
  8468. }
  8469. WOLFSSL_LEAVE("wolfSSL_EVP_MD_pkey_type", ret);
  8470. return ret;
  8471. }
  8472. int wolfSSL_EVP_CIPHER_CTX_iv_length(const WOLFSSL_EVP_CIPHER_CTX* ctx)
  8473. {
  8474. WOLFSSL_MSG("wolfSSL_EVP_CIPHER_CTX_iv_length");
  8475. if (ctx == NULL) {
  8476. WOLFSSL_MSG("No context");
  8477. return 0;
  8478. }
  8479. switch (ctx->cipherType) {
  8480. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  8481. case AES_128_CBC_TYPE :
  8482. case AES_192_CBC_TYPE :
  8483. case AES_256_CBC_TYPE :
  8484. WOLFSSL_MSG("AES CBC");
  8485. return AES_BLOCK_SIZE;
  8486. #endif
  8487. #if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  8488. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
  8489. #ifdef HAVE_AESGCM
  8490. case AES_128_GCM_TYPE :
  8491. case AES_192_GCM_TYPE :
  8492. case AES_256_GCM_TYPE :
  8493. WOLFSSL_MSG("AES GCM");
  8494. if (ctx->ivSz != 0) {
  8495. return ctx->ivSz;
  8496. }
  8497. return GCM_NONCE_MID_SZ;
  8498. #endif
  8499. #ifdef HAVE_AESCCM
  8500. case AES_128_CCM_TYPE :
  8501. case AES_192_CCM_TYPE :
  8502. case AES_256_CCM_TYPE :
  8503. WOLFSSL_MSG("AES CCM");
  8504. if (ctx->ivSz != 0) {
  8505. return ctx->ivSz;
  8506. }
  8507. return CCM_NONCE_MIN_SZ;
  8508. #endif
  8509. #endif /* (HAVE_FIPS && !HAVE_SELFTEST) || HAVE_FIPS_VERSION >= 2 */
  8510. #ifdef WOLFSSL_AES_COUNTER
  8511. case AES_128_CTR_TYPE :
  8512. case AES_192_CTR_TYPE :
  8513. case AES_256_CTR_TYPE :
  8514. WOLFSSL_MSG("AES CTR");
  8515. return AES_BLOCK_SIZE;
  8516. #endif
  8517. #ifndef NO_DES3
  8518. case DES_CBC_TYPE :
  8519. WOLFSSL_MSG("DES CBC");
  8520. return DES_BLOCK_SIZE;
  8521. case DES_EDE3_CBC_TYPE :
  8522. WOLFSSL_MSG("DES EDE3 CBC");
  8523. return DES_BLOCK_SIZE;
  8524. #endif
  8525. #ifndef NO_RC4
  8526. case ARC4_TYPE :
  8527. WOLFSSL_MSG("ARC4");
  8528. return 0;
  8529. #endif
  8530. #ifdef WOLFSSL_AES_CFB
  8531. #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
  8532. case AES_128_CFB1_TYPE:
  8533. case AES_192_CFB1_TYPE:
  8534. case AES_256_CFB1_TYPE:
  8535. WOLFSSL_MSG("AES CFB1");
  8536. return AES_BLOCK_SIZE;
  8537. case AES_128_CFB8_TYPE:
  8538. case AES_192_CFB8_TYPE:
  8539. case AES_256_CFB8_TYPE:
  8540. WOLFSSL_MSG("AES CFB8");
  8541. return AES_BLOCK_SIZE;
  8542. #endif /* !HAVE_SELFTEST && !HAVE_FIPS */
  8543. case AES_128_CFB128_TYPE:
  8544. case AES_192_CFB128_TYPE:
  8545. case AES_256_CFB128_TYPE:
  8546. WOLFSSL_MSG("AES CFB128");
  8547. return AES_BLOCK_SIZE;
  8548. #endif /* WOLFSSL_AES_CFB */
  8549. #if defined(WOLFSSL_AES_OFB)
  8550. case AES_128_OFB_TYPE:
  8551. case AES_192_OFB_TYPE:
  8552. case AES_256_OFB_TYPE:
  8553. WOLFSSL_MSG("AES OFB");
  8554. return AES_BLOCK_SIZE;
  8555. #endif /* WOLFSSL_AES_OFB */
  8556. #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  8557. case AES_128_XTS_TYPE:
  8558. case AES_256_XTS_TYPE:
  8559. WOLFSSL_MSG("AES XTS");
  8560. return AES_BLOCK_SIZE;
  8561. #endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
  8562. #ifdef HAVE_ARIA
  8563. case ARIA_128_GCM_TYPE :
  8564. case ARIA_192_GCM_TYPE :
  8565. case ARIA_256_GCM_TYPE :
  8566. WOLFSSL_MSG("ARIA GCM");
  8567. if (ctx->ivSz != 0) {
  8568. return ctx->ivSz;
  8569. }
  8570. return GCM_NONCE_MID_SZ;
  8571. #endif
  8572. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  8573. case CHACHA20_POLY1305_TYPE:
  8574. WOLFSSL_MSG("CHACHA20 POLY1305");
  8575. return CHACHA20_POLY1305_AEAD_IV_SIZE;
  8576. #endif /* HAVE_CHACHA HAVE_POLY1305 */
  8577. #ifdef HAVE_CHACHA
  8578. case CHACHA20_TYPE:
  8579. WOLFSSL_MSG("CHACHA20");
  8580. return WOLFSSL_EVP_CHACHA_IV_BYTES;
  8581. #endif /* HAVE_CHACHA */
  8582. #ifdef WOLFSSL_SM4_CBC
  8583. case SM4_CBC_TYPE :
  8584. WOLFSSL_MSG("SM4 CBC");
  8585. return SM4_BLOCK_SIZE;
  8586. #endif
  8587. #ifdef WOLFSSL_SM4_CTR
  8588. case SM4_CTR_TYPE :
  8589. WOLFSSL_MSG("SM4 CTR");
  8590. return SM4_BLOCK_SIZE;
  8591. #endif
  8592. #ifdef WOLFSSL_SM4_GCM
  8593. case SM4_GCM_TYPE :
  8594. WOLFSSL_MSG("SM4 GCM");
  8595. if (ctx->ivSz != 0) {
  8596. return ctx->ivSz;
  8597. }
  8598. return GCM_NONCE_MID_SZ;
  8599. #endif
  8600. #ifdef WOLFSSL_SM4_CCM
  8601. case SM4_CCM_TYPE :
  8602. WOLFSSL_MSG("SM4 CCM");
  8603. if (ctx->ivSz != 0) {
  8604. return ctx->ivSz;
  8605. }
  8606. return CCM_NONCE_MIN_SZ;
  8607. #endif
  8608. case NULL_CIPHER_TYPE :
  8609. WOLFSSL_MSG("NULL");
  8610. return 0;
  8611. default: {
  8612. WOLFSSL_MSG("bad type");
  8613. }
  8614. }
  8615. return 0;
  8616. }
  8617. int wolfSSL_EVP_CIPHER_iv_length(const WOLFSSL_EVP_CIPHER* cipher)
  8618. {
  8619. const char *name = (const char *)cipher;
  8620. WOLFSSL_MSG("wolfSSL_EVP_CIPHER_iv_length");
  8621. #ifndef NO_AES
  8622. #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)
  8623. #ifdef WOLFSSL_AES_128
  8624. if (XSTRCMP(name, EVP_AES_128_CBC) == 0)
  8625. return AES_BLOCK_SIZE;
  8626. #endif
  8627. #ifdef WOLFSSL_AES_192
  8628. if (XSTRCMP(name, EVP_AES_192_CBC) == 0)
  8629. return AES_BLOCK_SIZE;
  8630. #endif
  8631. #ifdef WOLFSSL_AES_256
  8632. if (XSTRCMP(name, EVP_AES_256_CBC) == 0)
  8633. return AES_BLOCK_SIZE;
  8634. #endif
  8635. #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */
  8636. #if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  8637. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))
  8638. #ifdef HAVE_AESGCM
  8639. #ifdef WOLFSSL_AES_128
  8640. if (XSTRCMP(name, EVP_AES_128_GCM) == 0)
  8641. return GCM_NONCE_MID_SZ;
  8642. #endif
  8643. #ifdef WOLFSSL_AES_192
  8644. if (XSTRCMP(name, EVP_AES_192_GCM) == 0)
  8645. return GCM_NONCE_MID_SZ;
  8646. #endif
  8647. #ifdef WOLFSSL_AES_256
  8648. if (XSTRCMP(name, EVP_AES_256_GCM) == 0)
  8649. return GCM_NONCE_MID_SZ;
  8650. #endif
  8651. #endif /* HAVE_AESGCM */
  8652. #ifdef HAVE_AESCCM
  8653. #ifdef WOLFSSL_AES_128
  8654. if (XSTRCMP(name, EVP_AES_128_CCM) == 0)
  8655. return CCM_NONCE_MIN_SZ;
  8656. #endif
  8657. #ifdef WOLFSSL_AES_192
  8658. if (XSTRCMP(name, EVP_AES_192_CCM) == 0)
  8659. return CCM_NONCE_MIN_SZ;
  8660. #endif
  8661. #ifdef WOLFSSL_AES_256
  8662. if (XSTRCMP(name, EVP_AES_256_CCM) == 0)
  8663. return CCM_NONCE_MIN_SZ;
  8664. #endif
  8665. #endif /* HAVE_AESCCM */
  8666. #endif /* (HAVE_FIPS && !HAVE_SELFTEST) || HAVE_FIPS_VERSION >= 2 */
  8667. #ifdef WOLFSSL_AES_COUNTER
  8668. #ifdef WOLFSSL_AES_128
  8669. if (XSTRCMP(name, EVP_AES_128_CTR) == 0)
  8670. return AES_BLOCK_SIZE;
  8671. #endif
  8672. #ifdef WOLFSSL_AES_192
  8673. if (XSTRCMP(name, EVP_AES_192_CTR) == 0)
  8674. return AES_BLOCK_SIZE;
  8675. #endif
  8676. #ifdef WOLFSSL_AES_256
  8677. if (XSTRCMP(name, EVP_AES_256_CTR) == 0)
  8678. return AES_BLOCK_SIZE;
  8679. #endif
  8680. #endif
  8681. #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  8682. #ifdef WOLFSSL_AES_128
  8683. if (XSTRCMP(name, EVP_AES_128_XTS) == 0)
  8684. return AES_BLOCK_SIZE;
  8685. #endif /* WOLFSSL_AES_128 */
  8686. #ifdef WOLFSSL_AES_256
  8687. if (XSTRCMP(name, EVP_AES_256_XTS) == 0)
  8688. return AES_BLOCK_SIZE;
  8689. #endif /* WOLFSSL_AES_256 */
  8690. #endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */
  8691. #endif
  8692. #ifdef HAVE_ARIA
  8693. if (XSTRCMP(name, EVP_ARIA_128_GCM) == 0)
  8694. return GCM_NONCE_MID_SZ;
  8695. if (XSTRCMP(name, EVP_ARIA_192_GCM) == 0)
  8696. return GCM_NONCE_MID_SZ;
  8697. if (XSTRCMP(name, EVP_ARIA_256_GCM) == 0)
  8698. return GCM_NONCE_MID_SZ;
  8699. #endif /* HAVE_ARIA */
  8700. #ifndef NO_DES3
  8701. if ((XSTRCMP(name, EVP_DES_CBC) == 0) ||
  8702. (XSTRCMP(name, EVP_DES_EDE3_CBC) == 0)) {
  8703. return DES_BLOCK_SIZE;
  8704. }
  8705. #endif
  8706. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  8707. if (XSTRCMP(name, EVP_CHACHA20_POLY1305) == 0)
  8708. return CHACHA20_POLY1305_AEAD_IV_SIZE;
  8709. #endif
  8710. #ifdef HAVE_CHACHA
  8711. if (XSTRCMP(name, EVP_CHACHA20) == 0)
  8712. return WOLFSSL_EVP_CHACHA_IV_BYTES;
  8713. #endif
  8714. #ifdef WOLFSSL_SM4_CBC
  8715. if (XSTRCMP(name, EVP_SM4_CBC) == 0)
  8716. return SM4_BLOCK_SIZE;
  8717. #endif
  8718. #ifdef WOLFSSL_SM4_CTR
  8719. if (XSTRCMP(name, EVP_SM4_CTR) == 0)
  8720. return SM4_BLOCK_SIZE;
  8721. #endif
  8722. #ifdef WOLFSSL_SM4_GCM
  8723. if (XSTRCMP(name, EVP_SM4_GCM) == 0)
  8724. return GCM_NONCE_MID_SZ;
  8725. #endif
  8726. #ifdef WOLFSSL_SM4_CCM
  8727. if (XSTRCMP(name, EVP_SM4_CCM) == 0)
  8728. return CCM_NONCE_MIN_SZ;
  8729. #endif
  8730. (void)name;
  8731. return 0;
  8732. }
  8733. int wolfSSL_EVP_X_STATE_LEN(const WOLFSSL_EVP_CIPHER_CTX* ctx)
  8734. {
  8735. WOLFSSL_MSG("wolfSSL_EVP_X_STATE_LEN");
  8736. if (ctx) {
  8737. switch (ctx->cipherType) {
  8738. case ARC4_TYPE:
  8739. WOLFSSL_MSG("returning arc4 state size");
  8740. return sizeof(Arc4);
  8741. default:
  8742. WOLFSSL_MSG("bad x state type");
  8743. return 0;
  8744. }
  8745. }
  8746. return 0;
  8747. }
  8748. /* return of pkey->type which will be EVP_PKEY_RSA for example.
  8749. *
  8750. * type type of EVP_PKEY
  8751. *
  8752. * returns type or if type is not found then NID_undef
  8753. */
  8754. int wolfSSL_EVP_PKEY_type(int type)
  8755. {
  8756. WOLFSSL_MSG("wolfSSL_EVP_PKEY_type");
  8757. switch (type) {
  8758. case EVP_PKEY_RSA:
  8759. return EVP_PKEY_RSA;
  8760. case EVP_PKEY_DSA:
  8761. return EVP_PKEY_DSA;
  8762. case EVP_PKEY_EC:
  8763. return EVP_PKEY_EC;
  8764. case EVP_PKEY_DH:
  8765. return EVP_PKEY_DH;
  8766. default:
  8767. return NID_undef;
  8768. }
  8769. }
  8770. int wolfSSL_EVP_PKEY_id(const WOLFSSL_EVP_PKEY *pkey)
  8771. {
  8772. if (pkey != NULL)
  8773. return pkey->type;
  8774. return 0;
  8775. }
  8776. int wolfSSL_EVP_PKEY_base_id(const WOLFSSL_EVP_PKEY *pkey)
  8777. {
  8778. if (pkey == NULL)
  8779. return NID_undef;
  8780. return wolfSSL_EVP_PKEY_type(pkey->type);
  8781. }
  8782. int wolfSSL_EVP_PKEY_get_default_digest_nid(WOLFSSL_EVP_PKEY *pkey, int *pnid)
  8783. {
  8784. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get_default_digest_nid");
  8785. if (!pkey || !pnid) {
  8786. WOLFSSL_MSG("Bad parameter");
  8787. return WOLFSSL_FAILURE;
  8788. }
  8789. switch (pkey->type) {
  8790. case EVP_PKEY_HMAC:
  8791. #ifndef NO_DSA
  8792. case EVP_PKEY_DSA:
  8793. #endif
  8794. #ifndef NO_RSA
  8795. case EVP_PKEY_RSA:
  8796. #endif
  8797. #ifdef HAVE_ECC
  8798. case EVP_PKEY_EC:
  8799. #endif
  8800. *pnid = NID_sha256;
  8801. return WOLFSSL_SUCCESS;
  8802. default:
  8803. return WOLFSSL_FAILURE;
  8804. }
  8805. }
  8806. #if defined(OPENSSL_ALL) || defined(WOLFSSL_WPAS_SMALL)
  8807. WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKCS82PKEY(const WOLFSSL_PKCS8_PRIV_KEY_INFO* p8)
  8808. {
  8809. if (p8 == NULL || p8->pkey.ptr == NULL) {
  8810. return NULL;
  8811. }
  8812. return wolfSSL_d2i_PrivateKey_EVP(NULL, (unsigned char**)&p8->pkey.ptr,
  8813. p8->pkey_sz);
  8814. }
  8815. /* in wolf PKCS8_PRIV_KEY_INFO and WOLFSSL_EVP_PKEY are same type */
  8816. /* this function just casts and returns pointer */
  8817. WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_EVP_PKEY2PKCS8(const WOLFSSL_EVP_PKEY* pkey)
  8818. {
  8819. return (WOLFSSL_PKCS8_PRIV_KEY_INFO*)pkey;
  8820. }
  8821. #endif
  8822. /* increments ref count of WOLFSSL_EVP_PKEY. Return 1 on success, 0 on error */
  8823. int wolfSSL_EVP_PKEY_up_ref(WOLFSSL_EVP_PKEY* pkey)
  8824. {
  8825. if (pkey) {
  8826. int ret;
  8827. wolfSSL_RefInc(&pkey->ref, &ret);
  8828. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  8829. if (ret != 0) {
  8830. WOLFSSL_MSG("Failed to lock pkey mutex");
  8831. }
  8832. #else
  8833. (void)ret;
  8834. #endif
  8835. return WOLFSSL_SUCCESS;
  8836. }
  8837. return WOLFSSL_FAILURE;
  8838. }
  8839. #ifndef NO_RSA
  8840. int wolfSSL_EVP_PKEY_assign_RSA(EVP_PKEY* pkey, WOLFSSL_RSA* key)
  8841. {
  8842. if (pkey == NULL || key == NULL)
  8843. return WOLFSSL_FAILURE;
  8844. clearEVPPkeyKeys(pkey);
  8845. pkey->type = EVP_PKEY_RSA;
  8846. pkey->rsa = key;
  8847. pkey->ownRsa = 1;
  8848. /* try and populate pkey_sz and pkey.ptr */
  8849. if (key->internal) {
  8850. RsaKey* rsa = (RsaKey*)key->internal;
  8851. int ret = wc_RsaKeyToDer(rsa, NULL, 0);
  8852. if (ret > 0) {
  8853. word32 derSz = (word32)ret;
  8854. byte* derBuf = (byte*)XMALLOC((size_t)derSz, NULL,
  8855. DYNAMIC_TYPE_TMP_BUFFER);
  8856. if (derBuf != NULL) {
  8857. ret = wc_RsaKeyToDer(rsa, derBuf, derSz);
  8858. if (ret >= 0) {
  8859. pkey->pkey_sz = ret;
  8860. pkey->pkey.ptr = (char*)derBuf;
  8861. }
  8862. else { /* failure - okay to ignore */
  8863. XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  8864. derBuf = NULL;
  8865. }
  8866. }
  8867. }
  8868. }
  8869. return WOLFSSL_SUCCESS;
  8870. }
  8871. #endif /* !NO_RSA */
  8872. #ifndef NO_DSA
  8873. int wolfSSL_EVP_PKEY_assign_DSA(EVP_PKEY* pkey, WOLFSSL_DSA* key)
  8874. {
  8875. if (pkey == NULL || key == NULL)
  8876. return WOLFSSL_FAILURE;
  8877. clearEVPPkeyKeys(pkey);
  8878. pkey->type = EVP_PKEY_DSA;
  8879. pkey->dsa = key;
  8880. pkey->ownDsa = 1;
  8881. return WOLFSSL_SUCCESS;
  8882. }
  8883. #endif /* !NO_DSA */
  8884. #ifndef NO_DH
  8885. int wolfSSL_EVP_PKEY_assign_DH(EVP_PKEY* pkey, WOLFSSL_DH* key)
  8886. {
  8887. if (pkey == NULL || key == NULL)
  8888. return WOLFSSL_FAILURE;
  8889. clearEVPPkeyKeys(pkey);
  8890. pkey->type = EVP_PKEY_DH;
  8891. pkey->dh = key;
  8892. pkey->ownDh = 1;
  8893. return WOLFSSL_SUCCESS;
  8894. }
  8895. #endif /* !NO_DH */
  8896. #endif /* OPENSSL_EXTRA */
  8897. #if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
  8898. /* EVP Digest functions used with cURL build too */
  8899. static enum wc_HashType EvpMd2MacType(const WOLFSSL_EVP_MD *md)
  8900. {
  8901. if (md != NULL) {
  8902. const struct s_ent *ent;
  8903. for (ent = md_tbl; ent->name != NULL; ent++) {
  8904. if (XSTRCMP((const char *)md, ent->name) == 0) {
  8905. return ent->macType;
  8906. }
  8907. }
  8908. }
  8909. return WC_HASH_TYPE_NONE;
  8910. }
  8911. int wolfSSL_EVP_DigestInit_ex(WOLFSSL_EVP_MD_CTX* ctx,
  8912. const WOLFSSL_EVP_MD* type,
  8913. WOLFSSL_ENGINE *impl)
  8914. {
  8915. (void) impl;
  8916. WOLFSSL_ENTER("wolfSSL_EVP_DigestInit_ex");
  8917. return wolfSSL_EVP_DigestInit(ctx, type);
  8918. }
  8919. /* this function makes the assumption that out buffer is big enough for digest*/
  8920. int wolfSSL_EVP_Digest(const unsigned char* in, int inSz, unsigned char* out,
  8921. unsigned int* outSz, const WOLFSSL_EVP_MD* evp,
  8922. WOLFSSL_ENGINE* eng)
  8923. {
  8924. int err;
  8925. int hashType = WC_HASH_TYPE_NONE;
  8926. int hashSz;
  8927. WOLFSSL_ENTER("wolfSSL_EVP_Digest");
  8928. if (in == NULL || out == NULL || evp == NULL) {
  8929. WOLFSSL_MSG("Null argument passed in");
  8930. return WOLFSSL_FAILURE;
  8931. }
  8932. err = wolfSSL_EVP_get_hashinfo(evp, &hashType, &hashSz);
  8933. if (err != WOLFSSL_SUCCESS)
  8934. return err;
  8935. if (wc_Hash((enum wc_HashType)hashType, in, (word32)inSz, out,
  8936. (word32)hashSz) != 0) {
  8937. return WOLFSSL_FAILURE;
  8938. }
  8939. if (outSz != NULL)
  8940. *outSz = (unsigned int)hashSz;
  8941. (void)eng;
  8942. return WOLFSSL_SUCCESS;
  8943. }
  8944. static const struct alias {
  8945. const char *name;
  8946. const char *alias;
  8947. } digest_alias_tbl[] =
  8948. {
  8949. {"MD4", "ssl3-md4"},
  8950. {"MD5", "ssl3-md5"},
  8951. {"SHA1", "ssl3-sha1"},
  8952. {"SHA1", "SHA"},
  8953. { NULL, NULL}
  8954. };
  8955. const WOLFSSL_EVP_MD *wolfSSL_EVP_get_digestbyname(const char *name)
  8956. {
  8957. char nameUpper[15]; /* 15 bytes should be enough for any name */
  8958. size_t i;
  8959. const struct alias *al;
  8960. const struct s_ent *ent;
  8961. for (i = 0; i < sizeof(nameUpper) && name[i] != '\0'; i++) {
  8962. nameUpper[i] = (char)XTOUPPER((unsigned char) name[i]);
  8963. }
  8964. if (i < sizeof(nameUpper))
  8965. nameUpper[i] = '\0';
  8966. else
  8967. return NULL;
  8968. name = nameUpper;
  8969. for (al = digest_alias_tbl; al->name != NULL; al++)
  8970. if(XSTRCMP(name, al->alias) == 0) {
  8971. name = al->name;
  8972. break;
  8973. }
  8974. for (ent = md_tbl; ent->name != NULL; ent++)
  8975. if(XSTRCMP(name, ent->name) == 0) {
  8976. return (EVP_MD *)ent->name;
  8977. }
  8978. return NULL;
  8979. }
  8980. /* Returns the NID of the WOLFSSL_EVP_MD passed in.
  8981. *
  8982. * type - pointer to WOLFSSL_EVP_MD for which to return NID value
  8983. *
  8984. * Returns NID on success, or NID_undef if none exists.
  8985. */
  8986. int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD* type)
  8987. {
  8988. const struct s_ent *ent ;
  8989. WOLFSSL_ENTER("EVP_MD_type");
  8990. if (type == NULL) {
  8991. WOLFSSL_MSG("MD type arg is NULL");
  8992. return NID_undef;
  8993. }
  8994. for( ent = md_tbl; ent->name != NULL; ent++){
  8995. if(XSTRCMP((const char *)type, ent->name) == 0) {
  8996. return ent->nid;
  8997. }
  8998. }
  8999. return NID_undef;
  9000. }
  9001. #ifndef NO_MD4
  9002. /* return a pointer to MD4 EVP type */
  9003. const WOLFSSL_EVP_MD* wolfSSL_EVP_md4(void)
  9004. {
  9005. WOLFSSL_ENTER("EVP_md4");
  9006. return EVP_get_digestbyname("MD4");
  9007. }
  9008. #endif /* !NO_MD4 */
  9009. #ifndef NO_MD5
  9010. const WOLFSSL_EVP_MD* wolfSSL_EVP_md5(void)
  9011. {
  9012. WOLFSSL_ENTER("EVP_md5");
  9013. return EVP_get_digestbyname("MD5");
  9014. }
  9015. #endif /* !NO_MD5 */
  9016. #ifdef HAVE_BLAKE2
  9017. /* return EVP_MD
  9018. * @param none
  9019. * @return "blake2b512"
  9020. */
  9021. const WOLFSSL_EVP_MD* wolfSSL_EVP_blake2b512(void)
  9022. {
  9023. WOLFSSL_ENTER("EVP_blake2b512");
  9024. return EVP_get_digestbyname("BLAKE2b512");
  9025. }
  9026. #endif
  9027. #ifdef HAVE_BLAKE2S
  9028. /* return EVP_MD
  9029. * @param none
  9030. * @return "blake2s256"
  9031. */
  9032. const WOLFSSL_EVP_MD* wolfSSL_EVP_blake2s256(void)
  9033. {
  9034. WOLFSSL_ENTER("EVP_blake2s256");
  9035. return EVP_get_digestbyname("BLAKE2s256");
  9036. }
  9037. #endif
  9038. #ifndef NO_WOLFSSL_STUB
  9039. void wolfSSL_EVP_set_pw_prompt(const char *prompt)
  9040. {
  9041. (void)prompt;
  9042. WOLFSSL_STUB("EVP_set_pw_prompt");
  9043. }
  9044. #endif
  9045. #ifndef NO_WOLFSSL_STUB
  9046. const WOLFSSL_EVP_MD* wolfSSL_EVP_mdc2(void)
  9047. {
  9048. WOLFSSL_STUB("EVP_mdc2");
  9049. return NULL;
  9050. }
  9051. #endif
  9052. #ifndef NO_SHA
  9053. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha1(void)
  9054. {
  9055. WOLFSSL_ENTER("EVP_sha1");
  9056. return EVP_get_digestbyname("SHA1");
  9057. }
  9058. #endif /* NO_SHA */
  9059. #ifdef WOLFSSL_SHA224
  9060. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha224(void)
  9061. {
  9062. WOLFSSL_ENTER("EVP_sha224");
  9063. return EVP_get_digestbyname("SHA224");
  9064. }
  9065. #endif /* WOLFSSL_SHA224 */
  9066. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha256(void)
  9067. {
  9068. WOLFSSL_ENTER("EVP_sha256");
  9069. return EVP_get_digestbyname("SHA256");
  9070. }
  9071. #ifdef WOLFSSL_SHA384
  9072. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha384(void)
  9073. {
  9074. WOLFSSL_ENTER("EVP_sha384");
  9075. return EVP_get_digestbyname("SHA384");
  9076. }
  9077. #endif /* WOLFSSL_SHA384 */
  9078. #ifdef WOLFSSL_SHA512
  9079. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512(void)
  9080. {
  9081. WOLFSSL_ENTER("EVP_sha512");
  9082. return EVP_get_digestbyname("SHA512");
  9083. }
  9084. #ifndef WOLFSSL_NOSHA512_224
  9085. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512_224(void)
  9086. {
  9087. WOLFSSL_ENTER("EVP_sha512_224");
  9088. return EVP_get_digestbyname("SHA512_224");
  9089. }
  9090. #endif /* !WOLFSSL_NOSHA512_224 */
  9091. #ifndef WOLFSSL_NOSHA512_256
  9092. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512_256(void)
  9093. {
  9094. WOLFSSL_ENTER("EVP_sha512_256");
  9095. return EVP_get_digestbyname("SHA512_256");
  9096. }
  9097. #endif /* !WOLFSSL_NOSHA512_224 */
  9098. #endif /* WOLFSSL_SHA512 */
  9099. #ifdef WOLFSSL_SHA3
  9100. #ifndef WOLFSSL_NOSHA3_224
  9101. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_224(void)
  9102. {
  9103. WOLFSSL_ENTER("EVP_sha3_224");
  9104. return EVP_get_digestbyname("SHA3_224");
  9105. }
  9106. #endif /* WOLFSSL_NOSHA3_224 */
  9107. #ifndef WOLFSSL_NOSHA3_256
  9108. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_256(void)
  9109. {
  9110. WOLFSSL_ENTER("EVP_sha3_256");
  9111. return EVP_get_digestbyname("SHA3_256");
  9112. }
  9113. #endif /* WOLFSSL_NOSHA3_256 */
  9114. #ifndef WOLFSSL_NOSHA3_384
  9115. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_384(void)
  9116. {
  9117. WOLFSSL_ENTER("EVP_sha3_384");
  9118. return EVP_get_digestbyname("SHA3_384");
  9119. }
  9120. #endif /* WOLFSSL_NOSHA3_384 */
  9121. #ifndef WOLFSSL_NOSHA3_512
  9122. const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_512(void)
  9123. {
  9124. WOLFSSL_ENTER("EVP_sha3_512");
  9125. return EVP_get_digestbyname("SHA3_512");
  9126. }
  9127. #endif /* WOLFSSL_NOSHA3_512 */
  9128. #ifdef WOLFSSL_SHAKE128
  9129. const WOLFSSL_EVP_MD* wolfSSL_EVP_shake128(void)
  9130. {
  9131. WOLFSSL_ENTER("EVP_shake128");
  9132. return EVP_get_digestbyname("SHAKE128");
  9133. }
  9134. #endif /* WOLFSSL_SHAKE128 */
  9135. #ifdef WOLFSSL_SHAKE256
  9136. const WOLFSSL_EVP_MD* wolfSSL_EVP_shake256(void)
  9137. {
  9138. WOLFSSL_ENTER("EVP_shake256");
  9139. return EVP_get_digestbyname("SHAKE256");
  9140. }
  9141. #endif /* WOLFSSL_SHAKE256 */
  9142. #endif /* WOLFSSL_SHA3 */
  9143. #ifdef WOLFSSL_SM3
  9144. const WOLFSSL_EVP_MD* wolfSSL_EVP_sm3(void)
  9145. {
  9146. WOLFSSL_ENTER("EVP_sm3");
  9147. return EVP_get_digestbyname("SM3");
  9148. }
  9149. #endif /* WOLFSSL_SM3 */
  9150. WOLFSSL_EVP_MD_CTX *wolfSSL_EVP_MD_CTX_new(void)
  9151. {
  9152. WOLFSSL_EVP_MD_CTX* ctx;
  9153. WOLFSSL_ENTER("EVP_MD_CTX_new");
  9154. ctx = (WOLFSSL_EVP_MD_CTX*)XMALLOC(sizeof(*ctx), NULL,
  9155. DYNAMIC_TYPE_OPENSSL);
  9156. if (ctx){
  9157. wolfSSL_EVP_MD_CTX_init(ctx);
  9158. }
  9159. return ctx;
  9160. }
  9161. void wolfSSL_EVP_MD_CTX_free(WOLFSSL_EVP_MD_CTX *ctx)
  9162. {
  9163. if (ctx) {
  9164. WOLFSSL_ENTER("EVP_MD_CTX_free");
  9165. wolfSSL_EVP_MD_CTX_cleanup(ctx);
  9166. XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
  9167. }
  9168. }
  9169. /* returns the NID of message digest used by the ctx */
  9170. int wolfSSL_EVP_MD_CTX_type(const WOLFSSL_EVP_MD_CTX *ctx)
  9171. {
  9172. WOLFSSL_ENTER("EVP_MD_CTX_type");
  9173. if (ctx) {
  9174. const struct s_ent *ent;
  9175. if (ctx->isHMAC) {
  9176. return NID_hmac;
  9177. }
  9178. for(ent = md_tbl; ent->name != NULL; ent++) {
  9179. if (ctx->macType == ent->macType) {
  9180. return ent->nid;
  9181. }
  9182. }
  9183. /* Return whatever we got */
  9184. return ctx->macType;
  9185. }
  9186. return 0;
  9187. }
  9188. /* returns digest size */
  9189. int wolfSSL_EVP_MD_CTX_size(const WOLFSSL_EVP_MD_CTX *ctx) {
  9190. return(wolfSSL_EVP_MD_size(wolfSSL_EVP_MD_CTX_md(ctx)));
  9191. }
  9192. /* returns block size */
  9193. int wolfSSL_EVP_MD_CTX_block_size(const WOLFSSL_EVP_MD_CTX *ctx) {
  9194. return(wolfSSL_EVP_MD_block_size(wolfSSL_EVP_MD_CTX_md(ctx)));
  9195. }
  9196. void wolfSSL_EVP_MD_CTX_init(WOLFSSL_EVP_MD_CTX* ctx)
  9197. {
  9198. WOLFSSL_ENTER("EVP_CIPHER_MD_CTX_init");
  9199. XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_MD_CTX));
  9200. }
  9201. const WOLFSSL_EVP_MD *wolfSSL_EVP_MD_CTX_md(const WOLFSSL_EVP_MD_CTX *ctx)
  9202. {
  9203. const struct s_ent *ent;
  9204. if (ctx == NULL)
  9205. return NULL;
  9206. WOLFSSL_ENTER("EVP_MD_CTX_md");
  9207. if (ctx->isHMAC) {
  9208. return "HMAC";
  9209. }
  9210. for(ent = md_tbl; ent->name != NULL; ent++) {
  9211. if(ctx->macType == ent->macType) {
  9212. return (const WOLFSSL_EVP_MD *)ent->name;
  9213. }
  9214. }
  9215. return (WOLFSSL_EVP_MD *)NULL;
  9216. }
  9217. /* return alias name if has
  9218. * @param n message digest type name
  9219. * @return alias name, otherwise NULL
  9220. */
  9221. static const char* hasAliasName(const char* n)
  9222. {
  9223. const char* aliasnm = NULL;
  9224. const struct alias *al;
  9225. for (al = digest_alias_tbl; al->name != NULL; al++)
  9226. if(XSTRCMP(n, al->name) == 0) {
  9227. aliasnm = al->alias;
  9228. break;
  9229. }
  9230. return aliasnm;
  9231. }
  9232. struct do_all_md {
  9233. void *arg;
  9234. void (*fn) (const WOLFSSL_EVP_MD *m,
  9235. const char* from, const char* to, void *arg);
  9236. };
  9237. /* do all md algorithm
  9238. * @param nm a pointer to WOLFSSL_OBJ_NAME
  9239. * @param arg arguments to pass to the callback
  9240. * @return none
  9241. */
  9242. static void md_do_all_func(const WOLFSSL_OBJ_NAME* nm, void* arg)
  9243. {
  9244. struct do_all_md *md = (struct do_all_md*)arg;
  9245. const struct s_ent *ent;
  9246. /* sanity check */
  9247. if (md == NULL || nm == NULL || md->fn == NULL ||
  9248. nm->type != WOLFSSL_OBJ_NAME_TYPE_MD_METH)
  9249. return;
  9250. /* loop all md */
  9251. for (ent = md_tbl; ent->name != NULL; ent++){
  9252. /* check if the md has alias */
  9253. if(hasAliasName(ent->name) != NULL) {
  9254. md->fn(NULL, ent->name, ent->name, md->arg);
  9255. }
  9256. else {
  9257. md->fn(ent->name, ent->name, NULL, md->arg);
  9258. }
  9259. }
  9260. }
  9261. /* call md_do_all function to do all md algorithm via a callback function
  9262. * @param fn a callback function to be called with all 'md'
  9263. * @param args arguments to pass to the callback
  9264. * @return none
  9265. */
  9266. void wolfSSL_EVP_MD_do_all(void (*fn) (const WOLFSSL_EVP_MD *m,
  9267. const char* from, const char* to, void* xx), void* args)
  9268. {
  9269. struct do_all_md md;
  9270. md.fn = fn;
  9271. md.arg = args;
  9272. wolfSSL_OBJ_NAME_do_all(WOLFSSL_OBJ_NAME_TYPE_MD_METH,
  9273. md_do_all_func, &md);
  9274. }
  9275. /* call "fn" based on OBJ_NAME type
  9276. * @param type OBJ_NAME type
  9277. * @param fn a callback function
  9278. * @param args arguments to pass to the callback
  9279. * @return none
  9280. */
  9281. void wolfSSL_OBJ_NAME_do_all(int type,
  9282. void (*fn)(const WOLFSSL_OBJ_NAME*, void* arg), void* arg)
  9283. {
  9284. WOLFSSL_OBJ_NAME objnm;
  9285. /* sanity check */
  9286. if (!fn)
  9287. return;
  9288. objnm.type = type;
  9289. switch(type) {
  9290. case WOLFSSL_OBJ_NAME_TYPE_MD_METH:
  9291. fn(&objnm, arg);
  9292. break;
  9293. case WOLFSSL_OBJ_NAME_TYPE_CIPHER_METH:
  9294. case WOLFSSL_OBJ_NAME_TYPE_PKEY_METH:
  9295. case WOLFSSL_OBJ_NAME_TYPE_COMP_METH:
  9296. case WOLFSSL_OBJ_NAME_TYPE_NUM:
  9297. WOLFSSL_MSG("not implemented");
  9298. FALL_THROUGH;
  9299. case WOLFSSL_OBJ_NAME_TYPE_UNDEF:
  9300. default:
  9301. break;
  9302. }
  9303. }
  9304. int wolfSSL_EVP_MD_CTX_cleanup(WOLFSSL_EVP_MD_CTX* ctx)
  9305. {
  9306. int ret = WOLFSSL_SUCCESS;
  9307. WOLFSSL_ENTER("wolfSSL_EVP_MD_CTX_cleanup");
  9308. #ifdef OPENSSL_EXTRA
  9309. if (ctx->pctx != NULL)
  9310. wolfSSL_EVP_PKEY_CTX_free(ctx->pctx);
  9311. #endif
  9312. if (ctx->isHMAC) {
  9313. wc_HmacFree(&ctx->hash.hmac);
  9314. }
  9315. else {
  9316. switch (ctx->macType) {
  9317. case WC_HASH_TYPE_MD5:
  9318. #ifndef NO_MD5
  9319. wc_Md5Free((wc_Md5*)&ctx->hash.digest);
  9320. #endif /* !NO_MD5 */
  9321. break;
  9322. case WC_HASH_TYPE_SHA:
  9323. #ifndef NO_SHA
  9324. wc_ShaFree((wc_Sha*)&ctx->hash.digest);
  9325. #endif /* !NO_SHA */
  9326. break;
  9327. case WC_HASH_TYPE_SHA224:
  9328. #ifdef WOLFSSL_SHA224
  9329. wc_Sha224Free((wc_Sha224*)&ctx->hash.digest);
  9330. #endif /* WOLFSSL_SHA224 */
  9331. break;
  9332. case WC_HASH_TYPE_SHA256:
  9333. #ifndef NO_SHA256
  9334. wc_Sha256Free((wc_Sha256*)&ctx->hash.digest);
  9335. #endif /* !NO_SHA256 */
  9336. break;
  9337. case WC_HASH_TYPE_SHA384:
  9338. #ifdef WOLFSSL_SHA384
  9339. wc_Sha384Free((wc_Sha384*)&ctx->hash.digest);
  9340. #endif /* WOLFSSL_SHA384 */
  9341. break;
  9342. case WC_HASH_TYPE_SHA512:
  9343. #ifdef WOLFSSL_SHA512
  9344. wc_Sha512Free((wc_Sha512*)&ctx->hash.digest);
  9345. #endif /* WOLFSSL_SHA512 */
  9346. break;
  9347. #ifndef WOLFSSL_NOSHA512_224
  9348. case WC_HASH_TYPE_SHA512_224:
  9349. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  9350. defined(WOLFSSL_SHA512)
  9351. wc_Sha512_224Free((wc_Sha512*)&ctx->hash.digest);
  9352. #endif
  9353. break;
  9354. #endif /* !WOLFSSL_NOSHA512_224 */
  9355. #ifndef WOLFSSL_NOSHA512_256
  9356. case WC_HASH_TYPE_SHA512_256:
  9357. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  9358. defined(WOLFSSL_SHA512)
  9359. wc_Sha512_256Free((wc_Sha512*)&ctx->hash.digest);
  9360. #endif
  9361. break;
  9362. #endif /* !WOLFSSL_NOSHA512_256 */
  9363. case WC_HASH_TYPE_SHA3_224:
  9364. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  9365. wc_Sha3_224_Free((wc_Sha3*)&ctx->hash.digest);
  9366. #endif
  9367. break;
  9368. case WC_HASH_TYPE_SHA3_256:
  9369. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  9370. wc_Sha3_256_Free((wc_Sha3*)&ctx->hash.digest);
  9371. #endif
  9372. break;
  9373. case WC_HASH_TYPE_SHA3_384:
  9374. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  9375. wc_Sha3_384_Free((wc_Sha3*)&ctx->hash.digest);
  9376. #endif
  9377. break;
  9378. case WC_HASH_TYPE_SHA3_512:
  9379. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  9380. wc_Sha3_512_Free((wc_Sha3*)&ctx->hash.digest);
  9381. #endif
  9382. break;
  9383. #ifdef WOLFSSL_SM3
  9384. case WC_HASH_TYPE_SM3:
  9385. wc_Sm3Free(&ctx->hash.digest.sm3);
  9386. break;
  9387. #endif
  9388. case WC_HASH_TYPE_NONE:
  9389. /* Not an error since an unused struct could be free'd or
  9390. * reset. */
  9391. break;
  9392. case WC_HASH_TYPE_MD2:
  9393. case WC_HASH_TYPE_MD4:
  9394. case WC_HASH_TYPE_MD5_SHA:
  9395. case WC_HASH_TYPE_BLAKE2B:
  9396. case WC_HASH_TYPE_BLAKE2S:
  9397. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  9398. case WC_HASH_TYPE_SHAKE128:
  9399. #endif
  9400. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  9401. case WC_HASH_TYPE_SHAKE256:
  9402. #endif
  9403. default:
  9404. ret = WOLFSSL_FAILURE;
  9405. break;
  9406. }
  9407. }
  9408. ForceZero(ctx, sizeof(*ctx));
  9409. ctx->macType = WC_HASH_TYPE_NONE;
  9410. return ret;
  9411. }
  9412. /* WOLFSSL_SUCCESS on ok */
  9413. int wolfSSL_EVP_DigestInit(WOLFSSL_EVP_MD_CTX* ctx,
  9414. const WOLFSSL_EVP_MD* md)
  9415. {
  9416. int ret = WOLFSSL_SUCCESS;
  9417. WOLFSSL_ENTER("EVP_DigestInit");
  9418. if (ctx == NULL) {
  9419. return BAD_FUNC_ARG;
  9420. }
  9421. #ifdef WOLFSSL_ASYNC_CRYPT
  9422. /* compile-time validation of ASYNC_CTX_SIZE */
  9423. typedef char async_test[WC_ASYNC_DEV_SIZE >= sizeof(WC_ASYNC_DEV) ?
  9424. 1 : -1];
  9425. (void)sizeof(async_test);
  9426. #endif
  9427. /* Set to 0 if no match */
  9428. ctx->macType = EvpMd2MacType(md);
  9429. if (md == NULL) {
  9430. XMEMSET(&ctx->hash.digest, 0, sizeof(WOLFSSL_Hasher));
  9431. } else
  9432. #ifndef NO_SHA
  9433. if ((XSTRCMP(md, "SHA") == 0) || (XSTRCMP(md, "SHA1") == 0)) {
  9434. ret = wolfSSL_SHA_Init(&(ctx->hash.digest.sha));
  9435. } else
  9436. #endif
  9437. #ifndef NO_SHA256
  9438. if (XSTRCMP(md, "SHA256") == 0) {
  9439. ret = wolfSSL_SHA256_Init(&(ctx->hash.digest.sha256));
  9440. } else
  9441. #endif
  9442. #ifdef WOLFSSL_SHA224
  9443. if (XSTRCMP(md, "SHA224") == 0) {
  9444. ret = wolfSSL_SHA224_Init(&(ctx->hash.digest.sha224));
  9445. } else
  9446. #endif
  9447. #ifdef WOLFSSL_SHA384
  9448. if (XSTRCMP(md, "SHA384") == 0) {
  9449. ret = wolfSSL_SHA384_Init(&(ctx->hash.digest.sha384));
  9450. } else
  9451. #endif
  9452. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  9453. defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224)
  9454. if (XSTRCMP(md, "SHA512_224") == 0) {
  9455. ret = wolfSSL_SHA512_224_Init(&(ctx->hash.digest.sha512));
  9456. } else
  9457. #endif
  9458. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  9459. defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256)
  9460. if (XSTRCMP(md, "SHA512_256") == 0) {
  9461. ret = wolfSSL_SHA512_256_Init(&(ctx->hash.digest.sha512));
  9462. } else
  9463. #endif
  9464. #ifdef WOLFSSL_SHA512
  9465. if (XSTRCMP(md, "SHA512") == 0) {
  9466. ret = wolfSSL_SHA512_Init(&(ctx->hash.digest.sha512));
  9467. } else
  9468. #endif
  9469. #ifndef NO_MD4
  9470. if (XSTRCMP(md, "MD4") == 0) {
  9471. wolfSSL_MD4_Init(&(ctx->hash.digest.md4));
  9472. } else
  9473. #endif
  9474. #ifndef NO_MD5
  9475. if (XSTRCMP(md, "MD5") == 0) {
  9476. ret = wolfSSL_MD5_Init(&(ctx->hash.digest.md5));
  9477. } else
  9478. #endif
  9479. #ifdef WOLFSSL_SHA3
  9480. #ifndef WOLFSSL_NOSHA3_224
  9481. if (XSTRCMP(md, "SHA3_224") == 0) {
  9482. ret = wolfSSL_SHA3_224_Init(&(ctx->hash.digest.sha3_224));
  9483. } else
  9484. #endif
  9485. #ifndef WOLFSSL_NOSHA3_256
  9486. if (XSTRCMP(md, "SHA3_256") == 0) {
  9487. ret = wolfSSL_SHA3_256_Init(&(ctx->hash.digest.sha3_256));
  9488. } else
  9489. #endif
  9490. #ifndef WOLFSSL_NOSHA3_384
  9491. if (XSTRCMP(md, "SHA3_384") == 0) {
  9492. ret = wolfSSL_SHA3_384_Init(&(ctx->hash.digest.sha3_384));
  9493. } else
  9494. #endif
  9495. #ifndef WOLFSSL_NOSHA3_512
  9496. if (XSTRCMP(md, "SHA3_512") == 0) {
  9497. ret = wolfSSL_SHA3_512_Init(&(ctx->hash.digest.sha3_512));
  9498. } else
  9499. #endif
  9500. #endif
  9501. #ifdef WOLFSSL_SM3
  9502. if (XSTRCMP(md, "SM3") == 0) {
  9503. ret = wc_InitSm3(&ctx->hash.digest.sm3, NULL, INVALID_DEVID);
  9504. if (ret == 0) {
  9505. ret = WOLFSSL_SUCCESS;
  9506. }
  9507. else {
  9508. ret = WOLFSSL_FAILURE;
  9509. }
  9510. } else
  9511. #endif
  9512. {
  9513. ctx->macType = WC_HASH_TYPE_NONE;
  9514. return BAD_FUNC_ARG;
  9515. }
  9516. return ret;
  9517. }
  9518. /* WOLFSSL_SUCCESS on ok, WOLFSSL_FAILURE on failure */
  9519. int wolfSSL_EVP_DigestUpdate(WOLFSSL_EVP_MD_CTX* ctx, const void* data,
  9520. size_t sz)
  9521. {
  9522. int ret = WOLFSSL_FAILURE;
  9523. enum wc_HashType macType;
  9524. WOLFSSL_ENTER("EVP_DigestUpdate");
  9525. macType = EvpMd2MacType(EVP_MD_CTX_md(ctx));
  9526. switch (macType) {
  9527. case WC_HASH_TYPE_MD4:
  9528. #ifndef NO_MD4
  9529. wolfSSL_MD4_Update((MD4_CTX*)&ctx->hash, data,
  9530. (unsigned long)sz);
  9531. ret = WOLFSSL_SUCCESS;
  9532. #endif
  9533. break;
  9534. case WC_HASH_TYPE_MD5:
  9535. #ifndef NO_MD5
  9536. ret = wolfSSL_MD5_Update((MD5_CTX*)&ctx->hash, data,
  9537. (unsigned long)sz);
  9538. #endif
  9539. break;
  9540. case WC_HASH_TYPE_SHA:
  9541. #ifndef NO_SHA
  9542. ret = wolfSSL_SHA_Update((SHA_CTX*)&ctx->hash, data,
  9543. (unsigned long)sz);
  9544. #endif
  9545. break;
  9546. case WC_HASH_TYPE_SHA224:
  9547. #ifdef WOLFSSL_SHA224
  9548. ret = wolfSSL_SHA224_Update((SHA224_CTX*)&ctx->hash, data,
  9549. (unsigned long)sz);
  9550. #endif
  9551. break;
  9552. case WC_HASH_TYPE_SHA256:
  9553. #ifndef NO_SHA256
  9554. ret = wolfSSL_SHA256_Update((SHA256_CTX*)&ctx->hash, data,
  9555. (unsigned long)sz);
  9556. #endif /* !NO_SHA256 */
  9557. break;
  9558. case WC_HASH_TYPE_SHA384:
  9559. #ifdef WOLFSSL_SHA384
  9560. ret = wolfSSL_SHA384_Update((SHA384_CTX*)&ctx->hash, data,
  9561. (unsigned long)sz);
  9562. #endif
  9563. break;
  9564. case WC_HASH_TYPE_SHA512:
  9565. #ifdef WOLFSSL_SHA512
  9566. ret = wolfSSL_SHA512_Update((SHA512_CTX*)&ctx->hash, data,
  9567. (unsigned long)sz);
  9568. #endif /* WOLFSSL_SHA512 */
  9569. break;
  9570. #ifndef WOLFSSL_NOSHA512_224
  9571. case WC_HASH_TYPE_SHA512_224:
  9572. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  9573. defined(WOLFSSL_SHA512)
  9574. ret = wolfSSL_SHA512_224_Update((SHA512_CTX*)&ctx->hash, data,
  9575. (unsigned long)sz);
  9576. #endif
  9577. break;
  9578. #endif /* !WOLFSSL_NOSHA512_224 */
  9579. #ifndef WOLFSSL_NOSHA512_256
  9580. case WC_HASH_TYPE_SHA512_256:
  9581. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  9582. defined(WOLFSSL_SHA512)
  9583. ret = wolfSSL_SHA512_256_Update((SHA512_CTX*)&ctx->hash, data,
  9584. (unsigned long)sz);
  9585. #endif /* WOLFSSL_SHA512 */
  9586. break;
  9587. #endif /* !WOLFSSL_NOSHA512_256 */
  9588. case WC_HASH_TYPE_SHA3_224:
  9589. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  9590. ret = wolfSSL_SHA3_224_Update((SHA3_224_CTX*)&ctx->hash, data,
  9591. (unsigned long)sz);
  9592. #endif
  9593. break;
  9594. case WC_HASH_TYPE_SHA3_256:
  9595. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  9596. ret = wolfSSL_SHA3_256_Update((SHA3_256_CTX*)&ctx->hash, data,
  9597. (unsigned long)sz);
  9598. #endif
  9599. break;
  9600. case WC_HASH_TYPE_SHA3_384:
  9601. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  9602. ret = wolfSSL_SHA3_384_Update((SHA3_384_CTX*)&ctx->hash, data,
  9603. (unsigned long)sz);
  9604. #endif
  9605. break;
  9606. case WC_HASH_TYPE_SHA3_512:
  9607. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  9608. ret = wolfSSL_SHA3_512_Update((SHA3_512_CTX*)&ctx->hash, data,
  9609. (unsigned long)sz);
  9610. #endif
  9611. break;
  9612. #ifdef WOLFSSL_SM3
  9613. case WC_HASH_TYPE_SM3:
  9614. ret = wc_Sm3Update(&ctx->hash.digest.sm3, data, (word32)sz);
  9615. if (ret == 0) {
  9616. ret = WOLFSSL_SUCCESS;
  9617. }
  9618. else {
  9619. ret = WOLFSSL_FAILURE;
  9620. }
  9621. break;
  9622. #endif
  9623. case WC_HASH_TYPE_NONE:
  9624. case WC_HASH_TYPE_MD2:
  9625. case WC_HASH_TYPE_MD5_SHA:
  9626. case WC_HASH_TYPE_BLAKE2B:
  9627. case WC_HASH_TYPE_BLAKE2S:
  9628. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  9629. case WC_HASH_TYPE_SHAKE128:
  9630. #endif
  9631. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  9632. case WC_HASH_TYPE_SHAKE256:
  9633. #endif
  9634. default:
  9635. return WOLFSSL_FAILURE;
  9636. }
  9637. return ret;
  9638. }
  9639. /* WOLFSSL_SUCCESS on ok */
  9640. int wolfSSL_EVP_DigestFinal(WOLFSSL_EVP_MD_CTX* ctx, unsigned char* md,
  9641. unsigned int* s)
  9642. {
  9643. int ret = WOLFSSL_FAILURE;
  9644. enum wc_HashType macType;
  9645. WOLFSSL_ENTER("EVP_DigestFinal");
  9646. macType = EvpMd2MacType(EVP_MD_CTX_md(ctx));
  9647. switch (macType) {
  9648. case WC_HASH_TYPE_MD4:
  9649. #ifndef NO_MD4
  9650. wolfSSL_MD4_Final(md, (MD4_CTX*)&ctx->hash);
  9651. if (s) *s = MD4_DIGEST_SIZE;
  9652. ret = WOLFSSL_SUCCESS;
  9653. #endif
  9654. break;
  9655. case WC_HASH_TYPE_MD5:
  9656. #ifndef NO_MD5
  9657. ret = wolfSSL_MD5_Final(md, (MD5_CTX*)&ctx->hash);
  9658. if (s) *s = WC_MD5_DIGEST_SIZE;
  9659. #endif
  9660. break;
  9661. case WC_HASH_TYPE_SHA:
  9662. #ifndef NO_SHA
  9663. ret = wolfSSL_SHA_Final(md, (SHA_CTX*)&ctx->hash);
  9664. if (s) *s = WC_SHA_DIGEST_SIZE;
  9665. #endif
  9666. break;
  9667. case WC_HASH_TYPE_SHA224:
  9668. #ifdef WOLFSSL_SHA224
  9669. ret = wolfSSL_SHA224_Final(md, (SHA224_CTX*)&ctx->hash);
  9670. if (s) *s = WC_SHA224_DIGEST_SIZE;
  9671. #endif
  9672. break;
  9673. case WC_HASH_TYPE_SHA256:
  9674. #ifndef NO_SHA256
  9675. ret = wolfSSL_SHA256_Final(md, (SHA256_CTX*)&ctx->hash);
  9676. if (s) *s = WC_SHA256_DIGEST_SIZE;
  9677. #endif /* !NO_SHA256 */
  9678. break;
  9679. case WC_HASH_TYPE_SHA384:
  9680. #ifdef WOLFSSL_SHA384
  9681. ret = wolfSSL_SHA384_Final(md, (SHA384_CTX*)&ctx->hash);
  9682. if (s) *s = WC_SHA384_DIGEST_SIZE;
  9683. #endif
  9684. break;
  9685. case WC_HASH_TYPE_SHA512:
  9686. #ifdef WOLFSSL_SHA512
  9687. ret = wolfSSL_SHA512_Final(md, (SHA512_CTX*)&ctx->hash);
  9688. if (s) *s = WC_SHA512_DIGEST_SIZE;
  9689. #endif /* WOLFSSL_SHA512 */
  9690. break;
  9691. #ifndef WOLFSSL_NOSHA512_224
  9692. case WC_HASH_TYPE_SHA512_224:
  9693. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  9694. defined(WOLFSSL_SHA512)
  9695. ret = wolfSSL_SHA512_224_Final(md, (SHA512_CTX*)&ctx->hash);
  9696. if (s) *s = WC_SHA512_224_DIGEST_SIZE;
  9697. #endif
  9698. break;
  9699. #endif /* !WOLFSSL_NOSHA512_224 */
  9700. #ifndef WOLFSSL_NOSHA512_256
  9701. case WC_HASH_TYPE_SHA512_256:
  9702. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  9703. defined(WOLFSSL_SHA512)
  9704. ret = wolfSSL_SHA512_256_Final(md, (SHA512_CTX*)&ctx->hash);
  9705. if (s) *s = WC_SHA512_256_DIGEST_SIZE;
  9706. #endif
  9707. break;
  9708. #endif /* !WOLFSSL_NOSHA512_256 */
  9709. case WC_HASH_TYPE_SHA3_224:
  9710. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224)
  9711. ret = wolfSSL_SHA3_224_Final(md, (SHA3_224_CTX*)&ctx->hash);
  9712. if (s) *s = WC_SHA3_224_DIGEST_SIZE;
  9713. #endif
  9714. break;
  9715. case WC_HASH_TYPE_SHA3_256:
  9716. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256)
  9717. ret = wolfSSL_SHA3_256_Final(md, (SHA3_256_CTX*)&ctx->hash);
  9718. if (s) *s = WC_SHA3_256_DIGEST_SIZE;
  9719. #endif
  9720. break;
  9721. case WC_HASH_TYPE_SHA3_384:
  9722. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384)
  9723. ret = wolfSSL_SHA3_384_Final(md, (SHA3_384_CTX*)&ctx->hash);
  9724. if (s) *s = WC_SHA3_384_DIGEST_SIZE;
  9725. #endif
  9726. break;
  9727. case WC_HASH_TYPE_SHA3_512:
  9728. #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512)
  9729. ret = wolfSSL_SHA3_512_Final(md, (SHA3_512_CTX*)&ctx->hash);
  9730. if (s) *s = WC_SHA3_512_DIGEST_SIZE;
  9731. #endif
  9732. break;
  9733. #ifdef WOLFSSL_SM3
  9734. case WC_HASH_TYPE_SM3:
  9735. ret = wc_Sm3Final(&ctx->hash.digest.sm3, md);
  9736. if (ret == 0) {
  9737. ret = WOLFSSL_SUCCESS;
  9738. }
  9739. else {
  9740. ret = WOLFSSL_FAILURE;
  9741. }
  9742. if (s) *s = WC_SM3_DIGEST_SIZE;
  9743. break;
  9744. #endif
  9745. case WC_HASH_TYPE_NONE:
  9746. case WC_HASH_TYPE_MD2:
  9747. case WC_HASH_TYPE_MD5_SHA:
  9748. case WC_HASH_TYPE_BLAKE2B:
  9749. case WC_HASH_TYPE_BLAKE2S:
  9750. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128)
  9751. case WC_HASH_TYPE_SHAKE128:
  9752. #endif
  9753. #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE256)
  9754. case WC_HASH_TYPE_SHAKE256:
  9755. #endif
  9756. default:
  9757. return WOLFSSL_FAILURE;
  9758. }
  9759. return ret;
  9760. }
  9761. /* WOLFSSL_SUCCESS on ok */
  9762. int wolfSSL_EVP_DigestFinal_ex(WOLFSSL_EVP_MD_CTX* ctx, unsigned char* md,
  9763. unsigned int* s)
  9764. {
  9765. WOLFSSL_ENTER("EVP_DigestFinal_ex");
  9766. return EVP_DigestFinal(ctx, md, s);
  9767. }
  9768. void wolfSSL_EVP_cleanup(void)
  9769. {
  9770. /* nothing to do here */
  9771. }
  9772. const WOLFSSL_EVP_MD* wolfSSL_EVP_get_digestbynid(int id)
  9773. {
  9774. WOLFSSL_MSG("wolfSSL_get_digestbynid");
  9775. switch(id) {
  9776. #ifndef NO_MD5
  9777. case NID_md5:
  9778. return wolfSSL_EVP_md5();
  9779. #endif
  9780. #ifndef NO_SHA
  9781. case NID_sha1:
  9782. return wolfSSL_EVP_sha1();
  9783. #endif
  9784. #ifdef WOLFSSL_SHA224
  9785. case NID_sha224:
  9786. return wolfSSL_EVP_sha224();
  9787. #endif
  9788. #ifndef NO_SHA256
  9789. case NID_sha256:
  9790. return wolfSSL_EVP_sha256();
  9791. #endif
  9792. #ifdef WOLFSSL_SHA384
  9793. case NID_sha384:
  9794. return wolfSSL_EVP_sha384();
  9795. #endif
  9796. #ifdef WOLFSSL_SHA512
  9797. case NID_sha512:
  9798. return wolfSSL_EVP_sha512();
  9799. #endif
  9800. #ifdef WOLFSSL_SM3
  9801. case NID_sm3:
  9802. return wolfSSL_EVP_sm3();
  9803. #endif
  9804. default:
  9805. WOLFSSL_MSG("Bad digest id value");
  9806. }
  9807. return NULL;
  9808. }
  9809. int wolfSSL_EVP_MD_block_size(const WOLFSSL_EVP_MD* type)
  9810. {
  9811. WOLFSSL_MSG("wolfSSL_EVP_MD_block_size");
  9812. if (type == NULL) {
  9813. WOLFSSL_MSG("No md type arg");
  9814. return BAD_FUNC_ARG;
  9815. }
  9816. #ifndef NO_SHA
  9817. if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, "SHA1") == 0)) {
  9818. return WC_SHA_BLOCK_SIZE;
  9819. } else
  9820. #endif
  9821. #ifndef NO_SHA256
  9822. if (XSTRCMP(type, "SHA256") == 0) {
  9823. return WC_SHA256_BLOCK_SIZE;
  9824. } else
  9825. #endif
  9826. #ifndef NO_MD4
  9827. if (XSTRCMP(type, "MD4") == 0) {
  9828. return MD4_BLOCK_SIZE;
  9829. } else
  9830. #endif
  9831. #ifndef NO_MD5
  9832. if (XSTRCMP(type, "MD5") == 0) {
  9833. return WC_MD5_BLOCK_SIZE;
  9834. } else
  9835. #endif
  9836. #ifdef WOLFSSL_SHA224
  9837. if (XSTRCMP(type, "SHA224") == 0) {
  9838. return WC_SHA224_BLOCK_SIZE;
  9839. } else
  9840. #endif
  9841. #ifdef WOLFSSL_SHA384
  9842. if (XSTRCMP(type, "SHA384") == 0) {
  9843. return WC_SHA384_BLOCK_SIZE;
  9844. } else
  9845. #endif
  9846. #ifdef WOLFSSL_SHA512
  9847. if (XSTRCMP(type, "SHA512") == 0) {
  9848. return WC_SHA512_BLOCK_SIZE;
  9849. } else
  9850. #endif
  9851. #ifdef WOLFSSL_SHA3
  9852. #ifndef WOLFSSL_NOSHA3_224
  9853. if (XSTRCMP(type, "SHA3_224") == 0) {
  9854. return WC_SHA3_224_BLOCK_SIZE;
  9855. } else
  9856. #endif
  9857. #ifndef WOLFSSL_NOSHA3_256
  9858. if (XSTRCMP(type, "SHA3_256") == 0) {
  9859. return WC_SHA3_256_BLOCK_SIZE;
  9860. } else
  9861. #endif
  9862. #ifndef WOLFSSL_NOSHA3_384
  9863. if (XSTRCMP(type, "SHA3_384") == 0) {
  9864. return WC_SHA3_384_BLOCK_SIZE;
  9865. } else
  9866. #endif
  9867. #ifndef WOLFSSL_NOSHA3_512
  9868. if (XSTRCMP(type, "SHA3_512") == 0) {
  9869. return WC_SHA3_512_BLOCK_SIZE;
  9870. }
  9871. #endif
  9872. #endif /* WOLFSSL_SHA3 */
  9873. #ifdef WOLFSSL_SM3
  9874. if (XSTRCMP(type, "SM3") == 0) {
  9875. return WC_SM3_BLOCK_SIZE;
  9876. } else
  9877. #endif
  9878. return BAD_FUNC_ARG;
  9879. }
  9880. int wolfSSL_EVP_MD_size(const WOLFSSL_EVP_MD* type)
  9881. {
  9882. WOLFSSL_MSG("wolfSSL_EVP_MD_size");
  9883. if (type == NULL) {
  9884. WOLFSSL_MSG("No md type arg");
  9885. return BAD_FUNC_ARG;
  9886. }
  9887. #ifndef NO_SHA
  9888. if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, "SHA1") == 0)) {
  9889. return WC_SHA_DIGEST_SIZE;
  9890. } else
  9891. #endif
  9892. #ifndef NO_SHA256
  9893. if (XSTRCMP(type, "SHA256") == 0) {
  9894. return WC_SHA256_DIGEST_SIZE;
  9895. } else
  9896. #endif
  9897. #ifndef NO_MD4
  9898. if (XSTRCMP(type, "MD4") == 0) {
  9899. return MD4_DIGEST_SIZE;
  9900. } else
  9901. #endif
  9902. #ifndef NO_MD5
  9903. if (XSTRCMP(type, "MD5") == 0) {
  9904. return WC_MD5_DIGEST_SIZE;
  9905. } else
  9906. #endif
  9907. #ifdef WOLFSSL_SHA224
  9908. if (XSTRCMP(type, "SHA224") == 0) {
  9909. return WC_SHA224_DIGEST_SIZE;
  9910. } else
  9911. #endif
  9912. #ifdef WOLFSSL_SHA384
  9913. if (XSTRCMP(type, "SHA384") == 0) {
  9914. return WC_SHA384_DIGEST_SIZE;
  9915. } else
  9916. #endif
  9917. #ifdef WOLFSSL_SHA512
  9918. if (XSTRCMP(type, "SHA512") == 0) {
  9919. return WC_SHA512_DIGEST_SIZE;
  9920. } else
  9921. #ifndef WOLFSSL_NOSHA512_224
  9922. if (XSTRCMP(type, "SHA512_224") == 0) {
  9923. return WC_SHA512_224_DIGEST_SIZE;
  9924. } else
  9925. #endif
  9926. #ifndef WOLFSSL_NOSHA512_256
  9927. if (XSTRCMP(type, "SHA512_256") == 0) {
  9928. return WC_SHA512_256_DIGEST_SIZE;
  9929. } else
  9930. #endif
  9931. #endif
  9932. #ifdef WOLFSSL_SHA3
  9933. #ifndef WOLFSSL_NOSHA3_224
  9934. if (XSTRCMP(type, "SHA3_224") == 0) {
  9935. return WC_SHA3_224_DIGEST_SIZE;
  9936. } else
  9937. #endif
  9938. #ifndef WOLFSSL_NOSHA3_256
  9939. if (XSTRCMP(type, "SHA3_256") == 0) {
  9940. return WC_SHA3_256_DIGEST_SIZE;
  9941. } else
  9942. #endif
  9943. #ifndef WOLFSSL_NOSHA3_384
  9944. if (XSTRCMP(type, "SHA3_384") == 0) {
  9945. return WC_SHA3_384_DIGEST_SIZE;
  9946. } else
  9947. #endif
  9948. #ifndef WOLFSSL_NOSHA3_512
  9949. if (XSTRCMP(type, "SHA3_512") == 0) {
  9950. return WC_SHA3_512_DIGEST_SIZE;
  9951. } else
  9952. #endif
  9953. #endif /* WOLFSSL_SHA3 */
  9954. #ifdef WOLFSSL_SM3
  9955. if (XSTRCMP(type, "SM3") == 0) {
  9956. return WC_SM3_DIGEST_SIZE;
  9957. }
  9958. #endif
  9959. return BAD_FUNC_ARG;
  9960. }
  9961. #endif /* OPENSSL_EXTRA || HAVE_CURL */
  9962. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9963. /* Subset of OPENSSL_EXTRA for PKEY operations PKEY free is needed by the
  9964. * subset of X509 API */
  9965. WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new(void){
  9966. return wolfSSL_EVP_PKEY_new_ex(NULL);
  9967. }
  9968. WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_ex(void* heap)
  9969. {
  9970. WOLFSSL_EVP_PKEY* pkey;
  9971. int ret;
  9972. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_new_ex");
  9973. pkey = (WOLFSSL_EVP_PKEY*)XMALLOC(sizeof(WOLFSSL_EVP_PKEY), heap,
  9974. DYNAMIC_TYPE_PUBLIC_KEY);
  9975. if (pkey != NULL) {
  9976. XMEMSET(pkey, 0, sizeof(WOLFSSL_EVP_PKEY));
  9977. pkey->heap = heap;
  9978. pkey->type = WOLFSSL_EVP_PKEY_DEFAULT;
  9979. #ifndef HAVE_FIPS
  9980. ret = wc_InitRng_ex(&pkey->rng, heap, INVALID_DEVID);
  9981. #else
  9982. ret = wc_InitRng(&pkey->rng);
  9983. #endif
  9984. if (ret != 0){
  9985. /* Free directly since mutex for ref count not set yet */
  9986. XFREE(pkey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  9987. WOLFSSL_MSG("Issue initializing RNG");
  9988. return NULL;
  9989. }
  9990. wolfSSL_RefInit(&pkey->ref, &ret);
  9991. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  9992. if (ret != 0){
  9993. wolfSSL_EVP_PKEY_free(pkey);
  9994. WOLFSSL_MSG("Issue initializing mutex");
  9995. return NULL;
  9996. }
  9997. #else
  9998. (void)ret;
  9999. #endif
  10000. }
  10001. else {
  10002. WOLFSSL_MSG("memory failure");
  10003. }
  10004. return pkey;
  10005. }
  10006. void wolfSSL_EVP_PKEY_free(WOLFSSL_EVP_PKEY* key)
  10007. {
  10008. int doFree = 0;
  10009. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_free");
  10010. if (key != NULL) {
  10011. int ret;
  10012. wolfSSL_RefDec(&key->ref, &doFree, &ret);
  10013. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  10014. if (ret != 0) {
  10015. WOLFSSL_MSG("Couldn't lock pkey mutex");
  10016. }
  10017. #else
  10018. (void)ret;
  10019. #endif
  10020. if (doFree) {
  10021. wc_FreeRng(&key->rng);
  10022. if (key->pkey.ptr != NULL) {
  10023. XFREE(key->pkey.ptr, key->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  10024. key->pkey.ptr = NULL;
  10025. }
  10026. switch(key->type)
  10027. {
  10028. #ifndef NO_RSA
  10029. case EVP_PKEY_RSA:
  10030. if (key->rsa != NULL && key->ownRsa == 1) {
  10031. wolfSSL_RSA_free(key->rsa);
  10032. key->rsa = NULL;
  10033. }
  10034. break;
  10035. #endif /* NO_RSA */
  10036. #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA)
  10037. case EVP_PKEY_EC:
  10038. if (key->ecc != NULL && key->ownEcc == 1) {
  10039. wolfSSL_EC_KEY_free(key->ecc);
  10040. key->ecc = NULL;
  10041. }
  10042. break;
  10043. #endif /* HAVE_ECC && OPENSSL_EXTRA */
  10044. #ifndef NO_DSA
  10045. case EVP_PKEY_DSA:
  10046. if (key->dsa != NULL && key->ownDsa == 1) {
  10047. wolfSSL_DSA_free(key->dsa);
  10048. key->dsa = NULL;
  10049. }
  10050. break;
  10051. #endif /* NO_DSA */
  10052. #if !defined(NO_DH) && (defined(WOLFSSL_QT) || \
  10053. defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL))
  10054. case EVP_PKEY_DH:
  10055. if (key->dh != NULL && key->ownDh == 1) {
  10056. wolfSSL_DH_free(key->dh);
  10057. key->dh = NULL;
  10058. }
  10059. break;
  10060. #endif /* ! NO_DH ... */
  10061. #ifdef HAVE_HKDF
  10062. case EVP_PKEY_HKDF:
  10063. if (key->hkdfSalt != NULL) {
  10064. XFREE(key->hkdfSalt, NULL, DYNAMIC_TYPE_SALT);
  10065. key->hkdfSalt = NULL;
  10066. }
  10067. if (key->hkdfKey != NULL) {
  10068. XFREE(key->hkdfKey, NULL, DYNAMIC_TYPE_KEY);
  10069. key->hkdfKey = NULL;
  10070. }
  10071. if (key->hkdfInfo != NULL) {
  10072. XFREE(key->hkdfInfo, NULL, DYNAMIC_TYPE_INFO);
  10073. key->hkdfInfo = NULL;
  10074. }
  10075. key->hkdfSaltSz = 0;
  10076. key->hkdfKeySz = 0;
  10077. key->hkdfInfoSz = 0;
  10078. break;
  10079. #endif /* HAVE_HKDF */
  10080. #if defined(WOLFSSL_CMAC) && defined(OPENSSL_EXTRA) && \
  10081. defined(WOLFSSL_AES_DIRECT)
  10082. case EVP_PKEY_CMAC:
  10083. if (key->cmacCtx != NULL) {
  10084. wolfSSL_CMAC_CTX_free(key->cmacCtx);
  10085. key->cmacCtx = NULL;
  10086. }
  10087. break;
  10088. #endif /* defined(WOLFSSL_CMAC) ... */
  10089. default:
  10090. break;
  10091. }
  10092. wolfSSL_RefFree(&key->ref);
  10093. XFREE(key, key->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  10094. }
  10095. }
  10096. }
  10097. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  10098. /* Indent writes white spaces of the number specified by "indents"
  10099. * to the BIO. The number of white spaces is limited from 0 to
  10100. * EVP_PKEY_PRINT_INDENT_MAX.
  10101. * returns the amount written to BIO.
  10102. */
  10103. static int Indent(WOLFSSL_BIO* out, int indents)
  10104. {
  10105. int i;
  10106. char space = ' ';
  10107. if (out == NULL) {
  10108. return 0;
  10109. }
  10110. if (indents > EVP_PKEY_PRINT_INDENT_MAX) {
  10111. indents = EVP_PKEY_PRINT_INDENT_MAX;
  10112. }
  10113. for (i = 0; i < indents; i++) {
  10114. if (wolfSSL_BIO_write(out, &space, 1) < 0) {
  10115. break;
  10116. }
  10117. }
  10118. return indents -i;
  10119. }
  10120. /* PrintHexWithColon dump byte-data specified by "input" to the "out".
  10121. * Each line has leading white spaces( "indent" gives the number ) plus
  10122. * four spaces, then hex coded 15 byte data with separator ":" follow.
  10123. * Each line looks like:
  10124. * " 00:e6:ab: --- 9f:ef:"
  10125. * Parameters:
  10126. * out bio to output dump data
  10127. * input buffer holding data to dump
  10128. * inlen input data size
  10129. * indent the number of spaces for indent
  10130. * blower true if lower case uses
  10131. * Returns 1 on success, 0 on failure.
  10132. */
  10133. static int PrintHexWithColon(WOLFSSL_BIO* out, const byte* input,
  10134. int inlen, int indent, byte blower)
  10135. {
  10136. #ifdef WOLFSSL_SMALL_STACK
  10137. byte* buff = NULL;
  10138. #else
  10139. byte buff[EVP_PKEY_PRINT_LINE_WIDTH_MAX] = { 0 };
  10140. #endif /* WOLFSSL_SMALL_STACK */
  10141. int ret = WOLFSSL_SUCCESS;
  10142. word32 in = 0;
  10143. word32 i;
  10144. int idx;
  10145. const byte* data;
  10146. word32 outSz;
  10147. byte outHex[3];
  10148. if (!out || !input || inlen <= 0) {
  10149. return WOLFSSL_FAILURE;
  10150. }
  10151. if (indent < 0) {
  10152. indent = 0;
  10153. }
  10154. if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
  10155. indent = EVP_PKEY_PRINT_INDENT_MAX;
  10156. }
  10157. data = input;
  10158. #ifdef WOLFSSL_SMALL_STACK
  10159. buff = (byte*)XMALLOC(EVP_PKEY_PRINT_LINE_WIDTH_MAX, NULL,
  10160. DYNAMIC_TYPE_TMP_BUFFER);
  10161. if (!buff) {
  10162. return WOLFSSL_FAILURE;
  10163. }
  10164. #endif
  10165. /* print pub element */
  10166. idx = 0;
  10167. for (in = 0; in < (word32)inlen && ret == WOLFSSL_SUCCESS; in +=
  10168. EVP_PKEY_PRINT_DIGITS_PER_LINE ) {
  10169. Indent(out, indent);
  10170. for (i = 0; (i < EVP_PKEY_PRINT_DIGITS_PER_LINE) &&
  10171. (in + i < (word32)inlen); i++) {
  10172. if (ret == WOLFSSL_SUCCESS) {
  10173. outSz = sizeof(outHex);
  10174. ret = Base16_Encode((const byte*)&data[in + i], 1,
  10175. outHex, &outSz) == 0;
  10176. }
  10177. if (ret == WOLFSSL_SUCCESS) {
  10178. if (blower) {
  10179. outHex[0] = (byte)XTOLOWER(outHex[0]);
  10180. outHex[1] = (byte)XTOLOWER(outHex[1]);
  10181. }
  10182. XMEMCPY(buff + idx, outHex, 2);
  10183. idx += 2;
  10184. if (in + i != (word32)inlen -1) {
  10185. XMEMSET(buff + idx, ':', 1);
  10186. idx += 1;
  10187. }
  10188. }
  10189. }
  10190. if (ret == WOLFSSL_SUCCESS) {
  10191. ret = wolfSSL_BIO_write(out, buff, idx) > 0;
  10192. }
  10193. if (ret == WOLFSSL_SUCCESS) {
  10194. ret = wolfSSL_BIO_write(out, "\n", 1) > 0;
  10195. }
  10196. if (ret == WOLFSSL_SUCCESS) {
  10197. XMEMSET(buff, 0, EVP_PKEY_PRINT_LINE_WIDTH_MAX);
  10198. idx = 0;
  10199. }
  10200. }
  10201. #ifdef WOLFSSL_SMALL_STACK
  10202. XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  10203. #endif
  10204. return ret;
  10205. }
  10206. #if !defined(NO_RSA)
  10207. /* PrintPubKeyRSA is a helper function for wolfSSL_EVP_PKEY_print_public
  10208. * to parse a DER format RSA public key specified in the second parameter.
  10209. * Parameters:
  10210. * out bio to output dump data
  10211. * pkey buffer holding public key data
  10212. * pkeySz public key data size
  10213. * indent the number of spaces for indent
  10214. * bitlen bit size of the given key
  10215. * pctx context(not used)
  10216. * Returns 1 on success, 0 on failure.
  10217. */
  10218. static int PrintPubKeyRSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
  10219. int indent, int bitlen, ASN1_PCTX* pctx)
  10220. {
  10221. byte buff[8] = { 0 };
  10222. int res = WOLFSSL_FAILURE;
  10223. word32 inOutIdx = 0;
  10224. word32 nSz; /* size of modulus */
  10225. word32 eSz; /* size of public exponent */
  10226. const byte* n = NULL;
  10227. const byte* e = NULL; /* pointer to modulus/exponent */
  10228. word32 i;
  10229. unsigned long exponent = 0;
  10230. #ifdef WOLFSSL_SMALL_STACK
  10231. mp_int* a = NULL;
  10232. #else
  10233. mp_int a[1];
  10234. #endif
  10235. char line[32] = { 0 };
  10236. (void)pctx;
  10237. #ifdef WOLFSSL_SMALL_STACK
  10238. a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  10239. if (a == NULL) {
  10240. return WOLFSSL_FAILURE;
  10241. }
  10242. #endif
  10243. if( mp_init(a) != 0) {
  10244. #ifdef WOLFSSL_SMALL_STACK
  10245. XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
  10246. #endif
  10247. return WOLFSSL_FAILURE;
  10248. }
  10249. if (indent < 0) {
  10250. indent = 0;
  10251. }
  10252. if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
  10253. indent = EVP_PKEY_PRINT_INDENT_MAX;
  10254. }
  10255. do {
  10256. int idx;
  10257. int wsz;
  10258. /* parse key to get modulus and exponent */
  10259. if (wc_RsaPublicKeyDecode_ex(pkey, &inOutIdx, (word32)pkeySz,
  10260. &n, &nSz, &e, &eSz) != 0) {
  10261. break;
  10262. }
  10263. /* print out public key elements */
  10264. idx = 0;
  10265. XMEMSET(buff, 0, sizeof(buff));
  10266. Indent(out, indent);
  10267. XSTRNCPY(line, "RSA Public-Key: (", sizeof(line));
  10268. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10269. break;
  10270. }
  10271. if (mp_set_int(a, (unsigned long)bitlen) != 0) {
  10272. break;
  10273. }
  10274. if (mp_todecimal(a, (char*)buff) != 0) {
  10275. break;
  10276. }
  10277. wsz = (int)XSTRLEN((const char*)buff);
  10278. if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
  10279. break;
  10280. }
  10281. XSTRNCPY(line, " bit)\n", sizeof(line));
  10282. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10283. break;
  10284. }
  10285. /* print Modulus */
  10286. Indent(out, indent);
  10287. XSTRNCPY(line, "Modulus:\n", sizeof(line));
  10288. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10289. break;
  10290. }
  10291. /* print modulus with leading zero if exists */
  10292. if (*n & 0x80 && *(n-1) == 0) {
  10293. n--;
  10294. nSz++;
  10295. }
  10296. if (PrintHexWithColon(out, n, (int)nSz,
  10297. indent + 4, 1/* lower case */) != WOLFSSL_SUCCESS) {
  10298. break;
  10299. }
  10300. /* print public Exponent */
  10301. idx = 0;
  10302. Indent(out, indent);
  10303. XSTRNCPY(line, "Exponent: ", sizeof(line));
  10304. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10305. break;
  10306. }
  10307. for (i = 0; i < eSz; i++) {
  10308. exponent <<= 8;
  10309. exponent += e[i];
  10310. }
  10311. XMEMSET(buff, 0, sizeof(buff));
  10312. if (mp_set_int(a, exponent) != 0) {
  10313. break;
  10314. }
  10315. if (mp_todecimal(a, (char*)buff) != 0) {
  10316. break;
  10317. }
  10318. wsz = (int)XSTRLEN((const char*)buff);
  10319. if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
  10320. break;
  10321. }
  10322. XSTRNCPY(line, " (0x", sizeof(line));
  10323. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10324. break;
  10325. }
  10326. XMEMSET(buff, 0, sizeof(buff));
  10327. if (mp_tohex(a, (char*)buff) != 0) {
  10328. break;
  10329. }
  10330. if (wolfSSL_BIO_write(out, buff, (int)XSTRLEN((char*)buff)) <= 0) {
  10331. break;
  10332. }
  10333. XSTRNCPY(line, ")\n", sizeof(line));
  10334. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10335. break;
  10336. }
  10337. res = WOLFSSL_SUCCESS;
  10338. } while (0);
  10339. mp_free(a);
  10340. #ifdef WOLFSSL_SMALL_STACK
  10341. XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
  10342. #endif
  10343. return res;
  10344. }
  10345. #endif /* !NO_RSA */
  10346. #if defined(HAVE_ECC)
  10347. /* PrintPubKeyEC is a helper function for wolfSSL_EVP_PKEY_print_public
  10348. * to parse a DER format ECC public key specified in the second parameter.
  10349. * Parameters:
  10350. * out bio to output dump data
  10351. * pkey buffer holding public key data
  10352. * pkeySz public key data size
  10353. * indent the number of spaces for indent
  10354. * bitlen bit size of the given key
  10355. * pctx context(not used)
  10356. * Returns 1 on success, 0 on failure.
  10357. */
  10358. static int PrintPubKeyEC(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
  10359. int indent, int bitlen, ASN1_PCTX* pctx)
  10360. {
  10361. byte* pub = NULL;
  10362. word32 pubSz = 0;
  10363. byte buff[8] = { 0 };
  10364. int res = WOLFSSL_SUCCESS;
  10365. word32 inOutIdx = 0;
  10366. int curveId = 0;
  10367. const byte* curveOID = NULL;
  10368. word32 oidSz = 0;
  10369. const char* OIDName = NULL;
  10370. const char* nistCurveName = NULL;
  10371. int idx = 0;
  10372. int wsz = 0;
  10373. #ifdef WOLFSSL_SMALL_STACK
  10374. mp_int* a = NULL;
  10375. ecc_key* key = NULL;
  10376. #else
  10377. mp_int a[1];
  10378. ecc_key key[1];
  10379. #endif
  10380. char line[32] = { 0 };
  10381. (void)pctx;
  10382. #ifdef WOLFSSL_SMALL_STACK
  10383. a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  10384. if (a == NULL) {
  10385. WOLFSSL_MSG("Failed to allocate memory for mp_int");
  10386. return WOLFSSL_FAILURE;
  10387. }
  10388. XMEMSET(a, 0, sizeof(mp_int));
  10389. key = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC);
  10390. if (key == NULL) {
  10391. WOLFSSL_MSG("Failed to allocate memory for ecc_key");
  10392. XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
  10393. return WOLFSSL_FAILURE;
  10394. }
  10395. #endif
  10396. if (mp_init(a) != 0) {
  10397. #ifdef WOLFSSL_SMALL_STACK
  10398. XFREE(key, NULL, DYNAMIC_TYPE_ECC);
  10399. XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
  10400. #endif
  10401. return WOLFSSL_FAILURE;
  10402. }
  10403. if (wc_ecc_init(key) != 0) {
  10404. /* Return early so we don't have to remember if init succeeded
  10405. * or not. */
  10406. mp_free(a);
  10407. #ifdef WOLFSSL_SMALL_STACK
  10408. XFREE(key, NULL, DYNAMIC_TYPE_ECC);
  10409. XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
  10410. #endif
  10411. return WOLFSSL_FAILURE;
  10412. }
  10413. if (indent < 0) {
  10414. indent = 0;
  10415. }
  10416. else if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
  10417. indent = EVP_PKEY_PRINT_INDENT_MAX;
  10418. }
  10419. if (res == WOLFSSL_SUCCESS) {
  10420. res = wc_EccPublicKeyDecode(pkey, &inOutIdx, key, (word32)pkeySz) == 0;
  10421. }
  10422. if (res == WOLFSSL_SUCCESS) {
  10423. curveId = wc_ecc_get_oid(key->dp->oidSum, &curveOID, &oidSz);
  10424. res = curveId > 0 && oidSz > 0;
  10425. }
  10426. /* get NIST curve name */
  10427. if (res == WOLFSSL_SUCCESS) {
  10428. int nid = EccEnumToNID(curveId);
  10429. if (nid != -1) {
  10430. /* look up object name and nist curve name*/
  10431. OIDName = wolfSSL_OBJ_nid2sn(nid);
  10432. nistCurveName = wolfSSL_EC_curve_nid2nist(nid);
  10433. res = (nistCurveName != NULL) && (OIDName != NULL);
  10434. }
  10435. else {
  10436. res = WOLFSSL_FAILURE;
  10437. }
  10438. }
  10439. if (res == WOLFSSL_SUCCESS) {
  10440. pub = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  10441. if (pub != NULL) {
  10442. pubSz = ECC_BUFSIZE;
  10443. XMEMSET(pub, 0, ECC_BUFSIZE);
  10444. PRIVATE_KEY_UNLOCK();
  10445. res = wc_ecc_export_x963(key, pub, &pubSz) == 0;
  10446. PRIVATE_KEY_LOCK();
  10447. }
  10448. else {
  10449. res = WOLFSSL_FAILURE;
  10450. }
  10451. }
  10452. if (res == WOLFSSL_SUCCESS) {
  10453. idx = 0;
  10454. res = Indent(out, indent) >= 0;
  10455. }
  10456. if (res == WOLFSSL_SUCCESS) {
  10457. XSTRNCPY(line, "Public-Key: (", sizeof(line));
  10458. res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
  10459. }
  10460. if (res == WOLFSSL_SUCCESS) {
  10461. res = mp_set_int(a, (unsigned long)bitlen) == 0;
  10462. }
  10463. if (res == WOLFSSL_SUCCESS) {
  10464. res = mp_todecimal(a, (char*)buff) == 0;
  10465. }
  10466. if (res == WOLFSSL_SUCCESS) {
  10467. wsz = (int)XSTRLEN((const char*)buff);
  10468. }
  10469. if (res == WOLFSSL_SUCCESS) {
  10470. res = wolfSSL_BIO_write(out, buff + idx, wsz) >= 0;
  10471. }
  10472. if (res == WOLFSSL_SUCCESS) {
  10473. XSTRNCPY(line, " bit)\n", sizeof(line));
  10474. res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
  10475. }
  10476. if (res == WOLFSSL_SUCCESS) {
  10477. res = Indent(out, indent) >= 0;
  10478. }
  10479. if (res == WOLFSSL_SUCCESS) {
  10480. /* print pub element */
  10481. XSTRNCPY(line, "pub:\n", sizeof(line));
  10482. res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
  10483. }
  10484. if (res == WOLFSSL_SUCCESS) {
  10485. /* upper case */
  10486. res = PrintHexWithColon(out, pub, (int)pubSz, indent + 4, 0);
  10487. }
  10488. if (res == WOLFSSL_SUCCESS) {
  10489. res = Indent(out, indent) >= 0;
  10490. }
  10491. if (res == WOLFSSL_SUCCESS) {
  10492. /* print OID in name */
  10493. XSTRNCPY(line, "ASN1 OID: ", sizeof(line));
  10494. res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
  10495. }
  10496. if (res == WOLFSSL_SUCCESS) {
  10497. res = wolfSSL_BIO_write(out, OIDName, (int)XSTRLEN(OIDName)) > 0;
  10498. }
  10499. if (res == WOLFSSL_SUCCESS) {
  10500. res = wolfSSL_BIO_write(out, "\n", 1) > 0;
  10501. }
  10502. if (res == WOLFSSL_SUCCESS) {
  10503. res = Indent(out, indent) >= 0;
  10504. }
  10505. if (res == WOLFSSL_SUCCESS) {
  10506. /* print NIST curve name */
  10507. XSTRNCPY(line, "NIST CURVE: ", sizeof(line));
  10508. res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0;
  10509. }
  10510. if (res == WOLFSSL_SUCCESS) {
  10511. res = wolfSSL_BIO_write(out, nistCurveName,
  10512. (int)XSTRLEN(nistCurveName)) > 0;
  10513. }
  10514. if (res == WOLFSSL_SUCCESS) {
  10515. res = wolfSSL_BIO_write(out, "\n", 1) > 0;
  10516. }
  10517. if (pub != NULL) {
  10518. XFREE(pub, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  10519. pub = NULL;
  10520. }
  10521. wc_ecc_free(key);
  10522. mp_free(a);
  10523. #ifdef WOLFSSL_SMALL_STACK
  10524. XFREE(key, NULL, DYNAMIC_TYPE_ECC);
  10525. XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
  10526. #endif
  10527. return res;
  10528. }
  10529. #endif /* HAVE_ECC */
  10530. #if !defined(NO_DSA)
  10531. /* PrintPubKeyDSA is a helper function for wolfSSL_EVP_PKEY_print_public
  10532. * to parse a DER format DSA public key specified in the second parameter.
  10533. * Parameters:
  10534. * out bio to output dump data
  10535. * pkey buffer holding public key data
  10536. * pkeySz public key data size
  10537. * indent the number of spaces for indent
  10538. * bitlen bit size of the given key
  10539. * pctx context(not used)
  10540. * Returns 1 on success, 0 on failure.
  10541. */
  10542. static int PrintPubKeyDSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
  10543. int indent, int bitlen, ASN1_PCTX* pctx)
  10544. {
  10545. byte buff[8] = { 0 };
  10546. int length;
  10547. int res = WOLFSSL_FAILURE;
  10548. word32 inOutIdx = 0;
  10549. word32 oid;
  10550. byte tagFound;
  10551. #ifdef WOLFSSL_SMALL_STACK
  10552. mp_int* a = NULL;
  10553. #else
  10554. mp_int a[1];
  10555. #endif
  10556. char line[32] = { 0 };
  10557. #ifdef WOLFSSL_SMALL_STACK
  10558. a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  10559. if (a == NULL) {
  10560. return WOLFSSL_FAILURE;
  10561. }
  10562. #endif
  10563. if( mp_init(a) != 0) {
  10564. #ifdef WOLFSSL_SMALL_STACK
  10565. XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
  10566. #endif
  10567. return WOLFSSL_FAILURE;
  10568. }
  10569. inOutIdx = 0;
  10570. (void)pctx;
  10571. if (indent < 0) {
  10572. indent = 0;
  10573. }
  10574. if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
  10575. indent = EVP_PKEY_PRINT_INDENT_MAX;
  10576. }
  10577. do {
  10578. byte *p = NULL, * q = NULL, * g = NULL, * y = NULL;
  10579. int pSz, qSz, gSz, ySz;
  10580. int idx;
  10581. int wsz;
  10582. if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
  10583. break;
  10584. }
  10585. if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
  10586. break;
  10587. }
  10588. if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, (word32)pkeySz) !=
  10589. 0) {
  10590. break;
  10591. }
  10592. if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) {
  10593. break;
  10594. }
  10595. /* find P */
  10596. if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
  10597. break;
  10598. }
  10599. if (tagFound != ASN_INTEGER) {
  10600. break;
  10601. }
  10602. if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
  10603. break;
  10604. }
  10605. p = (byte*)(pkey + inOutIdx);
  10606. pSz = length;
  10607. if (bitlen == 0) {
  10608. if (*p == 0) {
  10609. bitlen = (pSz - 1) * 8; /* remove leading zero */
  10610. }
  10611. else {
  10612. bitlen = pSz * 8;
  10613. }
  10614. }
  10615. inOutIdx += (word32)length;
  10616. /* find Q */
  10617. if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
  10618. break;
  10619. }
  10620. if (tagFound != ASN_INTEGER) {
  10621. break;
  10622. }
  10623. if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
  10624. break;
  10625. }
  10626. q = (byte*)(pkey + inOutIdx);
  10627. qSz = length;
  10628. inOutIdx += (word32)length;
  10629. /* find G */
  10630. if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
  10631. break;
  10632. }
  10633. if (tagFound != ASN_INTEGER) {
  10634. break;
  10635. }
  10636. if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
  10637. break;
  10638. }
  10639. g = (byte*)(pkey + inOutIdx);
  10640. gSz = length;
  10641. inOutIdx += (word32)length;
  10642. /* find Y */
  10643. if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
  10644. break;
  10645. }
  10646. if (tagFound != ASN_BIT_STRING) {
  10647. break;
  10648. }
  10649. if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
  10650. break;
  10651. }
  10652. inOutIdx++; /* skip the first byte( unused byte number)*/
  10653. if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
  10654. break;
  10655. }
  10656. if (tagFound != ASN_INTEGER) {
  10657. break;
  10658. }
  10659. if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) {
  10660. break;
  10661. }
  10662. y = (byte*)(pkey + inOutIdx);
  10663. ySz = length;
  10664. idx = 0;
  10665. XMEMSET(buff, 0, sizeof(buff));
  10666. Indent(out, indent);
  10667. XSTRNCPY(line, "DSA Public-Key: (", sizeof(line));
  10668. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10669. break;
  10670. }
  10671. if (mp_set_int(a, (unsigned long)bitlen) != 0) {
  10672. break;
  10673. }
  10674. if (mp_todecimal(a, (char*)buff) != 0) {
  10675. break;
  10676. }
  10677. wsz = (int)XSTRLEN((const char*)buff);
  10678. if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
  10679. break;
  10680. }
  10681. XSTRNCPY(line, " bit)\n", sizeof(line));
  10682. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10683. break;
  10684. }
  10685. /* print pub element */
  10686. Indent(out, indent);
  10687. XSTRNCPY(line, "pub:\n", sizeof(line));
  10688. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10689. break;
  10690. }
  10691. if (PrintHexWithColon(out, y, ySz, indent + 4, 0/* upper case */)
  10692. != WOLFSSL_SUCCESS) {
  10693. break;
  10694. }
  10695. /* print P element */
  10696. Indent(out, indent);
  10697. XSTRNCPY(line, "P:\n", sizeof(line));
  10698. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10699. break;
  10700. }
  10701. if (PrintHexWithColon(out, p, pSz, indent + 4, 0/* upper case */)
  10702. != WOLFSSL_SUCCESS) {
  10703. break;
  10704. }
  10705. /* print Q element */
  10706. Indent(out, indent);
  10707. XSTRNCPY(line, "Q:\n", sizeof(line));
  10708. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10709. break;
  10710. }
  10711. if (PrintHexWithColon(out, q, qSz, indent + 4, 0/* upper case */)
  10712. != WOLFSSL_SUCCESS) {
  10713. break;
  10714. }
  10715. /* print G element */
  10716. Indent(out, indent);
  10717. XSTRNCPY(line, "G:\n", sizeof(line));
  10718. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10719. break;
  10720. }
  10721. if (PrintHexWithColon(out, g, gSz, indent + 4, 0/* upper case */)
  10722. != WOLFSSL_SUCCESS) {
  10723. break;
  10724. }
  10725. res = WOLFSSL_SUCCESS;
  10726. } while (0);
  10727. mp_free(a);
  10728. #ifdef WOLFSSL_SMALL_STACK
  10729. XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
  10730. #endif
  10731. return res;
  10732. }
  10733. #endif /* !NO_DSA */
  10734. #if defined(WOLFSSL_DH_EXTRA)
  10735. /* PrintPubKeyDH is a helper function for wolfSSL_EVP_PKEY_print_public
  10736. * to parse a DER format DH public key specified in the second parameter.
  10737. * Parameters:
  10738. * out bio to output dump data
  10739. * pkey buffer holding public key data
  10740. * pkeySz public key data size
  10741. * indent the number of spaces for indent
  10742. * bitlen bit size of the given key
  10743. * pctx context(not used)
  10744. * Returns 1 on success, 0 on failure.
  10745. */
  10746. static int PrintPubKeyDH(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
  10747. int indent, int bitlen, ASN1_PCTX* pctx)
  10748. {
  10749. byte buff[8] = { 0 };
  10750. int res = WOLFSSL_FAILURE;
  10751. word32 length;
  10752. word32 inOutIdx;
  10753. word32 oid;
  10754. byte tagFound;
  10755. byte* prime = NULL;
  10756. byte generator;
  10757. byte* publicKey = NULL;
  10758. word32 outSz;
  10759. byte outHex[3];
  10760. #ifdef WOLFSSL_SMALL_STACK
  10761. mp_int* a = NULL;
  10762. #else
  10763. mp_int a[1];
  10764. #endif
  10765. char line[32] = { 0 };
  10766. #ifdef WOLFSSL_SMALL_STACK
  10767. a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  10768. if (a == NULL) {
  10769. return WOLFSSL_FAILURE;
  10770. }
  10771. #endif
  10772. if( mp_init(a) != 0) {
  10773. #ifdef WOLFSSL_SMALL_STACK
  10774. XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
  10775. #endif
  10776. return WOLFSSL_FAILURE;
  10777. }
  10778. inOutIdx = 0;
  10779. (void)pctx;
  10780. if (indent < 0) {
  10781. indent = 0;
  10782. }
  10783. if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
  10784. indent = EVP_PKEY_PRINT_INDENT_MAX;
  10785. }
  10786. do {
  10787. int primeSz;
  10788. int publicKeySz;
  10789. int idx;
  10790. int wsz;
  10791. if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
  10792. break;
  10793. }
  10794. if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
  10795. break;
  10796. }
  10797. if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, (word32)pkeySz) <
  10798. 0) {
  10799. break;
  10800. }
  10801. if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) {
  10802. break;
  10803. }
  10804. /* get prime element */
  10805. if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
  10806. break;
  10807. }
  10808. if (tagFound != ASN_INTEGER) {
  10809. break;
  10810. }
  10811. if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
  10812. break;
  10813. }
  10814. prime = (byte*)(pkey + inOutIdx);
  10815. primeSz = (int)length;
  10816. inOutIdx += length;
  10817. /* get generator element */
  10818. if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
  10819. break;
  10820. }
  10821. if (tagFound != ASN_INTEGER) {
  10822. break;
  10823. }
  10824. if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
  10825. break;
  10826. }
  10827. if (length != 1) {
  10828. break;
  10829. }
  10830. generator = *(pkey + inOutIdx);
  10831. inOutIdx += length;
  10832. /* get public-key element */
  10833. if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
  10834. break;
  10835. }
  10836. if (tagFound != ASN_BIT_STRING) {
  10837. break;
  10838. }
  10839. if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
  10840. break;
  10841. }
  10842. inOutIdx ++;
  10843. if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) {
  10844. break;
  10845. }
  10846. if (tagFound != ASN_INTEGER) {
  10847. break;
  10848. }
  10849. if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) {
  10850. break;
  10851. }
  10852. publicKeySz = (int)length;
  10853. publicKey = (byte*)(pkey + inOutIdx);
  10854. if (bitlen == 0) {
  10855. if (*publicKey == 0) {
  10856. bitlen = (publicKeySz - 1) * 8;
  10857. }
  10858. else {
  10859. bitlen = publicKeySz * 8;
  10860. }
  10861. }
  10862. /* print elements */
  10863. idx = 0;
  10864. Indent(out, indent);
  10865. XSTRNCPY(line, "DH Public-Key: (", sizeof(line));
  10866. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10867. break;
  10868. }
  10869. if (mp_set_int(a, (unsigned long)bitlen) != 0) {
  10870. break;
  10871. }
  10872. if (mp_todecimal(a, (char*)buff) != 0) {
  10873. break;
  10874. }
  10875. wsz = (int)XSTRLEN((const char*)buff);
  10876. if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
  10877. break;
  10878. }
  10879. XSTRNCPY(line, " bit)\n", sizeof(line));
  10880. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10881. break;
  10882. }
  10883. Indent(out, indent);
  10884. XSTRNCPY(line, "public-key:\n", sizeof(line));
  10885. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10886. break;
  10887. }
  10888. if (PrintHexWithColon(out, publicKey,
  10889. publicKeySz, indent + 4, 0/* upper case */)
  10890. != WOLFSSL_SUCCESS) {
  10891. break;
  10892. }
  10893. Indent(out, indent);
  10894. XSTRNCPY(line, "prime:\n", sizeof(line));
  10895. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10896. break;
  10897. }
  10898. if (PrintHexWithColon(out, prime, primeSz,
  10899. indent + 4, 0/* upper case */)
  10900. != WOLFSSL_SUCCESS) {
  10901. break;
  10902. }
  10903. idx = 0;
  10904. XMEMSET(buff, 0, sizeof(buff));
  10905. Indent(out, indent);
  10906. XSTRNCPY(line, "generator: ", sizeof(line));
  10907. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10908. break;
  10909. }
  10910. if (mp_set_int(a, generator) != 0) {
  10911. break;
  10912. }
  10913. if (mp_todecimal(a, (char*)buff) != 0) {
  10914. break;
  10915. }
  10916. wsz = (int)XSTRLEN((const char*)buff);
  10917. if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
  10918. break;
  10919. }
  10920. XSTRNCPY(line, " (0x", sizeof(line));
  10921. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10922. break;
  10923. }
  10924. idx = 0;
  10925. XMEMSET(buff, 0, sizeof(buff));
  10926. outSz = sizeof(outHex);
  10927. if (Base16_Encode((const byte*)&generator, 1, outHex, &outSz ) != 0) {
  10928. break;
  10929. }
  10930. if (idx + 2 < (int)sizeof(buff) ) {
  10931. XMEMCPY(buff + idx, outHex, 2);
  10932. idx += 2;
  10933. }
  10934. if (wolfSSL_BIO_write(out, buff, idx) <= 0 ) {
  10935. break;
  10936. }
  10937. XSTRNCPY(line, ")\n", sizeof(line));
  10938. if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
  10939. break;
  10940. }
  10941. res = WOLFSSL_SUCCESS;
  10942. } while (0);
  10943. mp_free(a);
  10944. #ifdef WOLFSSL_SMALL_STACK
  10945. XFREE(a, NULL, DYNAMIC_TYPE_BIGINT);
  10946. #endif
  10947. return res;
  10948. }
  10949. #endif /* WOLFSSL_DH_EXTRA */
  10950. /* wolfSSL_EVP_PKEY_print_public parses the specified key then
  10951. * outputs public key info in human readable format to the specified BIO.
  10952. * White spaces of the same number which 'indent" gives, will be added to
  10953. * each line to output and ignores pctx parameter.
  10954. * Parameters:
  10955. * out bio to output dump data
  10956. * pkey buffer holding public key data
  10957. * indent the number of spaces for indent
  10958. * pctx context(not used)
  10959. * Returns 1 on success, 0 or negative on error, -2 means specified key
  10960. * algo is not supported.
  10961. * Can handle RSA, ECC, DSA and DH public keys.
  10962. */
  10963. int wolfSSL_EVP_PKEY_print_public(WOLFSSL_BIO* out,
  10964. const WOLFSSL_EVP_PKEY* pkey, int indent, ASN1_PCTX* pctx)
  10965. {
  10966. int res;
  10967. #if !defined(NO_RSA) || defined(HAVE_ECC) || !defined(NO_DSA) || \
  10968. defined(WOLFSSL_DH_EXTRA)
  10969. int keybits; /* bit length of the key */
  10970. #endif
  10971. WOLFSSL_ENTER("wolfSSL_EVP_PKEY_print_public");
  10972. if (pkey == NULL || out == NULL) {
  10973. return 0;
  10974. }
  10975. #if !defined(NO_RSA) || defined(HAVE_ECC) || !defined(NO_DSA) || \
  10976. defined(WOLFSSL_DH_EXTRA)
  10977. if (indent < 0) {
  10978. indent = 0;
  10979. }
  10980. if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
  10981. indent = EVP_PKEY_PRINT_INDENT_MAX;
  10982. }
  10983. #endif
  10984. switch (pkey->type) {
  10985. case EVP_PKEY_RSA:
  10986. #if !defined(NO_RSA)
  10987. keybits = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey) * 8;
  10988. res = PrintPubKeyRSA(
  10989. out,
  10990. (byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */
  10991. pkey->pkey_sz, /* raw pkey size */
  10992. indent, /* indent size */
  10993. keybits, /* bit length of the key */
  10994. pctx); /* not used */
  10995. #else
  10996. res = WOLFSSL_UNKNOWN; /* not supported algo */
  10997. #endif
  10998. break;
  10999. case EVP_PKEY_EC:
  11000. #if defined(HAVE_ECC)
  11001. keybits = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey) * 8;
  11002. res = PrintPubKeyEC(
  11003. out,
  11004. (byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */
  11005. pkey->pkey_sz, /* raw pkey size */
  11006. indent, /* indent size */
  11007. keybits, /* bit length of the key */
  11008. pctx); /* not used */
  11009. #else
  11010. res = WOLFSSL_UNKNOWN; /* not supported algo */
  11011. #endif
  11012. break;
  11013. case EVP_PKEY_DSA:
  11014. #if !defined(NO_DSA)
  11015. keybits = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey) * 8;
  11016. res = PrintPubKeyDSA(
  11017. out,
  11018. (byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */
  11019. pkey->pkey_sz, /* raw pkey size */
  11020. indent, /* indent size */
  11021. keybits, /* bit length of the key */
  11022. pctx); /* not used */
  11023. #else
  11024. res = WOLFSSL_UNKNOWN; /* not supported algo */
  11025. #endif
  11026. break;
  11027. case EVP_PKEY_DH:
  11028. #if defined(WOLFSSL_DH_EXTRA)
  11029. keybits = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey) * 8;
  11030. res = PrintPubKeyDH(
  11031. out,
  11032. (byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */
  11033. pkey->pkey_sz, /* raw pkey size */
  11034. indent, /* indent size */
  11035. keybits, /* bit length of the key */
  11036. pctx); /* not used */
  11037. #else
  11038. res = WOLFSSL_UNKNOWN; /* not supported algo */
  11039. #endif
  11040. break;
  11041. default:
  11042. res = WOLFSSL_UNKNOWN; /* not supported algo */
  11043. break;
  11044. }
  11045. return res;
  11046. }
  11047. #endif /* OPENSSL_EXTRA && !NO_BIO */
  11048. int wolfSSL_EVP_get_hashinfo(const WOLFSSL_EVP_MD* evp,
  11049. int* pHash, int* pHashSz)
  11050. {
  11051. enum wc_HashType hash = WC_HASH_TYPE_NONE;
  11052. int hashSz;
  11053. if (XSTRLEN(evp) < 3) {
  11054. /* do not try comparing strings if size is too small */
  11055. return WOLFSSL_FAILURE;
  11056. }
  11057. #ifndef NO_SHA
  11058. if ((XSTRCMP("SHA", evp) == 0) || (XSTRCMP("SHA1", evp) == 0)) {
  11059. hash = WC_HASH_TYPE_SHA;
  11060. } else
  11061. #endif
  11062. #ifdef WOLFSSL_SHA224
  11063. if (XSTRCMP("SHA224", evp) == 0) {
  11064. hash = WC_HASH_TYPE_SHA224;
  11065. } else
  11066. #endif
  11067. #ifndef NO_SHA256
  11068. if (XSTRCMP("SHA256", evp) == 0) {
  11069. hash = WC_HASH_TYPE_SHA256;
  11070. } else
  11071. #endif
  11072. #ifdef WOLFSSL_SHA384
  11073. if (XSTRCMP("SHA384", evp) == 0) {
  11074. hash = WC_HASH_TYPE_SHA384;
  11075. } else
  11076. #endif
  11077. #ifdef WOLFSSL_SHA512
  11078. if (XSTRCMP("SHA512", evp) == 0) {
  11079. hash = WC_HASH_TYPE_SHA512;
  11080. } else
  11081. #ifndef WOLFSSL_NOSHA512_224
  11082. if (XSTRCMP("SHA512_224", evp) == 0) {
  11083. hash = WC_HASH_TYPE_SHA512_224;
  11084. } else
  11085. #endif
  11086. #ifndef WOLFSSL_NOSHA512_256
  11087. if (XSTRCMP("SHA512_256", evp) == 0) {
  11088. hash = WC_HASH_TYPE_SHA512_256;
  11089. } else
  11090. #endif
  11091. #endif
  11092. #ifdef WOLFSSL_SHA3
  11093. #ifndef WOLFSSL_NOSHA3_224
  11094. if (XSTRCMP("SHA3_224", evp) == 0) {
  11095. hash = WC_HASH_TYPE_SHA3_224;
  11096. } else
  11097. #endif
  11098. #ifndef WOLFSSL_NOSHA3_256
  11099. if (XSTRCMP("SHA3_256", evp) == 0) {
  11100. hash = WC_HASH_TYPE_SHA3_256;
  11101. } else
  11102. #endif
  11103. #ifndef WOLFSSL_NOSHA3_384
  11104. if (XSTRCMP("SHA3_384", evp) == 0) {
  11105. hash = WC_HASH_TYPE_SHA3_384;
  11106. } else
  11107. #endif
  11108. #ifndef WOLFSSL_NOSHA3_512
  11109. if (XSTRCMP("SHA3_512", evp) == 0) {
  11110. hash = WC_HASH_TYPE_SHA3_512;
  11111. } else
  11112. #endif
  11113. #endif /* WOLFSSL_SHA3 */
  11114. #ifdef WOLFSSL_SM3
  11115. if (XSTRCMP("SM3", evp) == 0) {
  11116. hash = WC_HASH_TYPE_SM3;
  11117. } else
  11118. #endif
  11119. #ifdef WOLFSSL_MD2
  11120. if (XSTRCMP("MD2", evp) == 0) {
  11121. hash = WC_HASH_TYPE_MD2;
  11122. } else
  11123. #endif
  11124. #ifndef NO_MD4
  11125. if (XSTRCMP("MD4", evp) == 0) {
  11126. hash = WC_HASH_TYPE_MD4;
  11127. } else
  11128. #endif
  11129. #ifndef NO_MD5
  11130. if (XSTRCMP("MD5", evp) == 0) {
  11131. hash = WC_HASH_TYPE_MD5;
  11132. } else
  11133. #endif
  11134. {
  11135. if (XSTRNCMP("SHA", evp, 3) == 0) {
  11136. WOLFSSL_MSG("Unknown SHA hash");
  11137. }
  11138. return WOLFSSL_FAILURE;
  11139. }
  11140. if (pHash)
  11141. *pHash = hash;
  11142. hashSz = wc_HashGetDigestSize(hash);
  11143. if (pHashSz)
  11144. *pHashSz = hashSz;
  11145. if (hashSz < 0) {
  11146. return WOLFSSL_FAILURE;
  11147. }
  11148. return WOLFSSL_SUCCESS;
  11149. }
  11150. /* Base64 encoding APIs */
  11151. #if defined(WOLFSSL_BASE64_ENCODE) || defined(WOLFSSL_BASE64_DECODE)
  11152. /* wolfSSL_EVP_ENCODE_CTX_new allocates WOLFSSL_EVP_ENCODE_CTX
  11153. * Returns WOLFSSL_EVP_ENCODE_CTX structure on success, NULL on failure.
  11154. */
  11155. struct WOLFSSL_EVP_ENCODE_CTX* wolfSSL_EVP_ENCODE_CTX_new(void)
  11156. {
  11157. WOLFSSL_EVP_ENCODE_CTX* ctx = NULL;
  11158. WOLFSSL_ENTER("wolfSSL_EVP_ENCODE_CTX_new");
  11159. ctx = (WOLFSSL_EVP_ENCODE_CTX*)XMALLOC(sizeof(WOLFSSL_EVP_ENCODE_CTX),
  11160. NULL, DYNAMIC_TYPE_OPENSSL );
  11161. if (ctx != NULL) {
  11162. XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_ENCODE_CTX) );
  11163. ctx->heap = NULL;
  11164. return ctx;
  11165. }
  11166. return NULL;
  11167. }
  11168. /* wolfSSL_EVP_ENCODE_CTX_free frees specified WOLFSSL_EVP_ENCODE_CTX struct.
  11169. */
  11170. void wolfSSL_EVP_ENCODE_CTX_free(WOLFSSL_EVP_ENCODE_CTX* ctx)
  11171. {
  11172. WOLFSSL_ENTER("wolfSSL_EVP_ENCODE_CTX_free");
  11173. if (ctx != NULL) {
  11174. XFREE(ctx, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  11175. }
  11176. }
  11177. #endif /* WOLFSSL_BASE64_ENCODE || WOLFSSL_BASE64_DECODE */
  11178. #if defined(WOLFSSL_BASE64_ENCODE)
  11179. /* Assume that out has enough space */
  11180. int wolfSSL_EVP_EncodeBlock(unsigned char *out, const unsigned char *in,
  11181. int inLen)
  11182. {
  11183. word32 ret = (word32)-1;
  11184. WOLFSSL_ENTER("wolfSSL_EVP_EncodeBlock");
  11185. if (out == NULL || in == NULL)
  11186. return WOLFSSL_FATAL_ERROR;
  11187. if (Base64_Encode_NoNl(in, (word32)inLen, out, &ret) == 0)
  11188. return (int)ret;
  11189. else
  11190. return WOLFSSL_FATAL_ERROR;
  11191. }
  11192. /* Assume that out has enough space */
  11193. int wolfSSL_EVP_DecodeBlock(unsigned char *out, const unsigned char *in,
  11194. int inLen)
  11195. {
  11196. word32 ret = (word32)-1;
  11197. WOLFSSL_ENTER("wolfSSL_EVP_DecodeBlock");
  11198. if (out == NULL || in == NULL)
  11199. return WOLFSSL_FATAL_ERROR;
  11200. if (Base64_Decode(in, (word32)inLen, out, &ret) == 0)
  11201. return (int)ret;
  11202. else
  11203. return WOLFSSL_FATAL_ERROR;
  11204. }
  11205. /* wolfSSL_EVP_EncodeInit initializes specified WOLFSSL_EVP_ENCODE_CTX object
  11206. * for the subsequent wolfSSL_EVP_EncodeUpdate.
  11207. */
  11208. void wolfSSL_EVP_EncodeInit(WOLFSSL_EVP_ENCODE_CTX* ctx)
  11209. {
  11210. WOLFSSL_ENTER("wolfSSL_EVP_EncodeInit");
  11211. /* clean up ctx */
  11212. if (ctx != NULL) {
  11213. ctx->remaining = 0;
  11214. XMEMSET(ctx->data, 0, sizeof(ctx->data));
  11215. }
  11216. }
  11217. /* wolfSSL_EVP_EncodeUpdate encodes the input data in 48-byte units
  11218. * and outputs it to out. If less than 48 bytes of data remain, save it in
  11219. * ctx. The data given in the subsequent wolfSSL_EVP_EncodeUpdate
  11220. * is combined with the data stored in CTX and used for encoding.
  11221. * Returns 1 on success, 0 on error.
  11222. */
  11223. int wolfSSL_EVP_EncodeUpdate(WOLFSSL_EVP_ENCODE_CTX* ctx,
  11224. unsigned char* out, int* outl, const unsigned char* in, int inl)
  11225. {
  11226. int res;
  11227. word32 outsz = 0;
  11228. WOLFSSL_ENTER("wolfSSL_EVP_EncodeUpdate");
  11229. if (ctx == NULL || out == NULL || in == NULL || outl == NULL)
  11230. return 0;
  11231. *outl = 0;
  11232. /* if the remaining data exists in the ctx, add input data to them
  11233. * to create a block(48bytes) for encoding
  11234. */
  11235. if (ctx->remaining > 0 && inl > 0) {
  11236. int cpysz = (int)min(
  11237. (word32)(BASE64_ENCODE_BLOCK_SIZE - ctx->remaining), (word32)inl);
  11238. XMEMCPY(ctx->data + ctx->remaining, in, (size_t)cpysz);
  11239. ctx->remaining += cpysz;
  11240. in += cpysz;
  11241. inl -= cpysz;
  11242. /* check if a block for encoding exists in ctx.data, if so encode it */
  11243. if (ctx->remaining >= BASE64_ENCODE_BLOCK_SIZE) {
  11244. /* Base64_Encode asks the out buff size via the 4th param*/
  11245. outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1;
  11246. res = Base64_Encode(ctx->data, BASE64_ENCODE_BLOCK_SIZE, out,
  11247. &outsz);
  11248. if (res == 0) {
  11249. ctx->remaining = 0;
  11250. *outl = (int)outsz;
  11251. }
  11252. else
  11253. return 0; /* return with error */
  11254. }
  11255. else {
  11256. /* could not create a block */
  11257. *outl = 0;
  11258. return 1;
  11259. }
  11260. }
  11261. /* Here, there is no data left in ctx, so try processing the data of
  11262. * the specified input data.
  11263. */
  11264. while (inl >= BASE64_ENCODE_BLOCK_SIZE) {
  11265. outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1;/* 64 byte and one for LF*/
  11266. res = Base64_Encode(in, BASE64_ENCODE_BLOCK_SIZE,out,&outsz);
  11267. if (res == 0) {
  11268. in += BASE64_ENCODE_BLOCK_SIZE;
  11269. inl -= BASE64_ENCODE_BLOCK_SIZE;
  11270. out += outsz;
  11271. *outl += (int)outsz;
  11272. }
  11273. else {
  11274. *outl = 0;
  11275. return 0;
  11276. }
  11277. }
  11278. /* if remaining data exists, copy them into ctx for the next call*/
  11279. if (inl > 0) {
  11280. XMEMSET(ctx->data, 0, sizeof(ctx->data));
  11281. XMEMCPY(ctx->data, in, (size_t)inl);
  11282. ctx->remaining = inl;
  11283. }
  11284. return 1; /* returns 1 on success, 0 on error */
  11285. }
  11286. /* wolfSSL_EVP_EncodeFinal encodes data in ctx and outputs to out.
  11287. */
  11288. void wolfSSL_EVP_EncodeFinal(WOLFSSL_EVP_ENCODE_CTX* ctx,
  11289. unsigned char* out, int* outl)
  11290. {
  11291. word32 outsz = 0;
  11292. int res;
  11293. WOLFSSL_ENTER("wolfSSL_EVP_EncodeFinal");
  11294. if (outl == NULL)
  11295. return;
  11296. if (ctx == NULL || out == NULL) {
  11297. *outl = 0;
  11298. return;
  11299. }
  11300. if (ctx->remaining >= BASE64_ENCODE_RESULT_BLOCK_SIZE) {
  11301. *outl = 0;
  11302. return;
  11303. }
  11304. /* process remaining data in ctx */
  11305. outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1; /* 64 byte and one for LF*/
  11306. res = Base64_Encode(ctx->data, (word32)ctx->remaining, out, &outsz);
  11307. if (res == 0)
  11308. *outl = (int)outsz;
  11309. else
  11310. *outl = 0;
  11311. ctx->remaining = 0;
  11312. XMEMSET(ctx->data, 0, sizeof(ctx->data));
  11313. return;
  11314. }
  11315. #endif /* WOLFSSL_BASE64_ENCODE */
  11316. #if defined(WOLFSSL_BASE64_DECODE)
  11317. /* wolfSSL_EVP_DecodeInit initializes specified WOLFSSL_EVP_ENCODE_CTX struct
  11318. * for subsequent wolfSSL_EVP_DecodeUpdate.
  11319. */
  11320. void wolfSSL_EVP_DecodeInit(WOLFSSL_EVP_ENCODE_CTX* ctx)
  11321. {
  11322. WOLFSSL_ENTER("wolfSSL_EVP_DecodeInit");
  11323. /* clean up ctx */
  11324. if (ctx != NULL) {
  11325. ctx->remaining = 0;
  11326. XMEMSET(ctx->data, 0, sizeof(ctx->data));
  11327. }
  11328. }
  11329. /* wolfSSL_EVP_DecodeUpdate encodes the input data in 4-byte units
  11330. * and outputs it to out. If less than 4 bytes of data remain, save it in
  11331. * ctx. The data given in the subsequent wolfSSL_EVP_DecodeUpdate
  11332. * is combined with the data stored in CTX and used for decoding.
  11333. * Returns 1 or 0 on success, -1 on error. Return value 0 indicates that
  11334. * clients should call wolfSSL_EVP_DecodeFinal as next call.
  11335. */
  11336. int wolfSSL_EVP_DecodeUpdate(WOLFSSL_EVP_ENCODE_CTX* ctx,
  11337. unsigned char* out, int* outl, const unsigned char* in, int inl)
  11338. {
  11339. word32 outsz = 0;
  11340. word32 j = 0;
  11341. word32 inLen;
  11342. int res;
  11343. int pad = 0;
  11344. int i;
  11345. unsigned char c;
  11346. int pad3 = 0;
  11347. int pad4 = 0;
  11348. byte e[4];
  11349. WOLFSSL_ENTER("wolfSSL_EVP_DecodeUpdate");
  11350. if (outl == NULL)
  11351. return -1;
  11352. if (ctx == NULL || out == NULL || in == NULL) {
  11353. *outl = 0;
  11354. return -1;
  11355. }
  11356. if (inl == 0) {
  11357. *outl = 0;
  11358. return 1;
  11359. }
  11360. inLen = (word32)inl;
  11361. *outl = 0;
  11362. /* if the remaining data exist in the ctx, add input data to them to create
  11363. a block(4bytes) for decoding*/
  11364. if (ctx->remaining > 0 && inl > 0) {
  11365. int cpySz = (int)min(
  11366. (word32)(BASE64_DECODE_BLOCK_SIZE - ctx->remaining), (word32)inl);
  11367. for ( i = 0; cpySz > 0 && inLen > 0; i++) {
  11368. if (Base64_SkipNewline(in, &inLen, &j) == ASN_INPUT_E) {
  11369. return -1; /* detected an illegal char in input */
  11370. }
  11371. c = in[j++];
  11372. if (c == '=')
  11373. pad = 1;
  11374. *(ctx->data + ctx->remaining + i) = c;
  11375. inLen--;
  11376. cpySz--;
  11377. }
  11378. outsz = sizeof(ctx->data);
  11379. res = Base64_Decode( ctx->data, BASE64_DECODE_BLOCK_SIZE, out, &outsz);
  11380. if (res == 0) {
  11381. *outl += (int)outsz;
  11382. out += outsz;
  11383. ctx->remaining = 0;
  11384. XMEMSET(ctx->data, 0, sizeof(ctx->data));
  11385. }
  11386. else {
  11387. *outl = 0;
  11388. return -1; /* return with error */
  11389. }
  11390. }
  11391. /* Base64_Decode is not a streaming process, so it processes
  11392. * the input data and exits. If a line break or whitespace
  11393. * character is found in the input data, it will be skipped,
  11394. * but if the end point of the input data is reached as a result,
  11395. * Base64_Decode will stop processing there. The data cleansing is
  11396. * required before Base64_Decode so that the processing does not
  11397. * stop within 4 bytes, which is the unit of Base64 decoding processing.
  11398. * The logic that exists before calling Base64_Decode in a While Loop is
  11399. * a data cleansing process that removes line breaks and whitespace.
  11400. */
  11401. while (inLen > 3) {
  11402. if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
  11403. if (res == BUFFER_E) {
  11404. break;
  11405. }
  11406. else {
  11407. *outl = 0;
  11408. return -1;
  11409. }
  11410. }
  11411. e[0] = in[j++];
  11412. if (e[0] == '\0') {
  11413. break;
  11414. }
  11415. inLen--;
  11416. if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
  11417. if (res == BUFFER_E) {
  11418. break;
  11419. }
  11420. else {
  11421. *outl = 0;
  11422. return -1;
  11423. }
  11424. }
  11425. e[1] = in[j++];
  11426. inLen--;
  11427. if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
  11428. if (res == BUFFER_E) {
  11429. break;
  11430. }
  11431. else {
  11432. *outl = 0;
  11433. return -1;
  11434. }
  11435. }
  11436. e[2] = in[j++];
  11437. inLen--;
  11438. if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) {
  11439. if (res == BUFFER_E) {
  11440. break;
  11441. }
  11442. else {
  11443. *outl = 0;
  11444. return -1;
  11445. }
  11446. }
  11447. e[3] = in[j++];
  11448. inLen--;
  11449. if (e[0] == '=')
  11450. pad = 1;
  11451. if (e[1] == '=')
  11452. pad = 1;
  11453. if (e[2] == '=') {
  11454. pad = 1;
  11455. pad3 = 1;
  11456. }
  11457. if (e[3] == '=') {
  11458. pad = 1;
  11459. pad4 = 1;
  11460. }
  11461. if (pad3 && !pad4) {
  11462. *outl = 0;
  11463. return -1;
  11464. }
  11465. /* decode four bytes */
  11466. outsz = sizeof(ctx->data);
  11467. res = Base64_Decode( e, BASE64_DECODE_BLOCK_SIZE, out, &outsz);
  11468. if (res < 0) {
  11469. *outl = 0;
  11470. return -1;
  11471. }
  11472. *outl += (int)outsz;
  11473. out += outsz;
  11474. }
  11475. /* copy left data to ctx */
  11476. if (inLen > 0) {
  11477. XMEMSET(ctx->data, 0, sizeof(ctx->data));
  11478. i = 0;
  11479. while (inLen > 0) {
  11480. c = in[j++];
  11481. if (c== '\n' || c == '\r' || c == ' ') {
  11482. inLen--;
  11483. continue;
  11484. }
  11485. if (c == '=') {
  11486. pad = 1;
  11487. }
  11488. ctx->data[i++] = c;
  11489. ctx->remaining++;
  11490. inLen--;
  11491. }
  11492. if (pad)
  11493. return 0; /* indicates that clients should call DecodeFinal */
  11494. else
  11495. return 1;
  11496. }
  11497. /* if the last data is '\n', remove it */
  11498. c = in[j - 1];
  11499. if (c == '\n') {
  11500. c = (in[j - 2]);
  11501. if (c == '=')
  11502. return 0;
  11503. else
  11504. return 1;
  11505. }
  11506. if (c == '=')
  11507. return 0;
  11508. else
  11509. return 1;
  11510. }
  11511. /* wolfSSL_EVP_DecodeFinal decode remaining data in ctx
  11512. * to outputs to out.
  11513. * Returns 1 on success, -1 on failure.
  11514. */
  11515. int wolfSSL_EVP_DecodeFinal(WOLFSSL_EVP_ENCODE_CTX* ctx,
  11516. unsigned char* out, int* outl)
  11517. {
  11518. word32 outsz = 0;
  11519. word32 inLen;
  11520. word32 j = 0;
  11521. WOLFSSL_ENTER("wolfSSL_EVP_DecodeFinal");
  11522. if (outl == NULL)
  11523. return -1;
  11524. if (ctx == NULL || out == NULL ) {
  11525. *outl = 0;
  11526. return -1;
  11527. }
  11528. if (ctx->remaining > 0) {
  11529. int res;
  11530. inLen = (word32)ctx->remaining;
  11531. if ((res = Base64_SkipNewline(ctx->data, &inLen, &j)) != 0) {
  11532. *outl = 0;
  11533. if (res == BUFFER_E) /* means no valid data to decode in buffer */
  11534. return 1; /* returns as success with no output */
  11535. else
  11536. return -1;
  11537. }
  11538. outsz = (word32)ctx->remaining;
  11539. res = Base64_Decode(ctx->data, (word32)ctx->remaining, out, &outsz);
  11540. if (res == 0) {
  11541. *outl = (int)outsz;
  11542. return 1;
  11543. }
  11544. else {
  11545. *outl = 0;
  11546. return -1;
  11547. }
  11548. }
  11549. else {
  11550. *outl = 0;
  11551. return 1;
  11552. }
  11553. }
  11554. #endif /* WOLFSSL_BASE64_DECODE */
  11555. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  11556. #endif /* WOLFSSL_EVP_INCLUDED */