ecc.c 523 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280
  1. /* ecc.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. /* in case user set HAVE_ECC there */
  25. #include <wolfssl/wolfcrypt/settings.h>
  26. #ifdef WOLFSSL_ECC_NO_SMALL_STACK
  27. #undef WOLFSSL_SMALL_STACK
  28. #undef WOLFSSL_SMALL_STACK_CACHE
  29. #endif
  30. /*
  31. Possible ECC enable options:
  32. * HAVE_ECC: Overall control of ECC default: on
  33. * HAVE_ECC_ENCRYPT: ECC encrypt/decrypt w/AES and HKDF default: off
  34. * HAVE_ECC_SIGN: ECC sign default: on
  35. * HAVE_ECC_VERIFY: ECC verify default: on
  36. * HAVE_ECC_DHE: ECC build shared secret default: on
  37. * HAVE_ECC_CDH: ECC cofactor DH shared secret default: off
  38. * HAVE_ECC_KEY_IMPORT: ECC Key import default: on
  39. * HAVE_ECC_KEY_EXPORT: ECC Key export default: on
  40. * ECC_SHAMIR: Enables Shamir calc method default: on
  41. * HAVE_COMP_KEY: Enables compressed key default: off
  42. * WOLFSSL_VALIDATE_ECC_IMPORT: Validate ECC key on import default: off
  43. * WOLFSSL_VALIDATE_ECC_KEYGEN: Validate ECC key gen default: off
  44. * WOLFSSL_CUSTOM_CURVES: Allow non-standard curves. default: off
  45. * Includes the curve "a" variable in calculation
  46. * ECC_DUMP_OID: Enables dump of OID encoding and sum default: off
  47. * ECC_CACHE_CURVE: Enables cache of curve info to improve performance
  48. * default: off
  49. * FP_ECC: ECC Fixed Point Cache default: off
  50. * FP cache is not supported for SECP160R1, SECP160R2,
  51. * SECP160K1 and SECP224K1. These do not work with scalars
  52. * that are the length of the order when the order is
  53. * longer than the prime. Use wc_ecc_fp_free to free cache.
  54. * USE_ECC_B_PARAM: Enable ECC curve B param default: off
  55. * (on for HAVE_COMP_KEY)
  56. * WOLFSSL_ECC_CURVE_STATIC: default off (on for windows)
  57. * For the ECC curve parameters `ecc_set_type` use fixed
  58. * array for hex string
  59. * WC_ECC_NONBLOCK: Enable non-blocking support for sign/verify.
  60. * Requires SP with WOLFSSL_SP_NONBLOCK
  61. * WC_ECC_NONBLOCK_ONLY Enable the non-blocking function only, no fall-back to
  62. * normal blocking API's
  63. * WOLFSSL_ECDSA_SET_K: Enables the setting of the 'k' value to use during ECDSA
  64. * signing. If the value is invalid, a new random 'k' is
  65. * generated in the loop. (For testing)
  66. * default: off
  67. * WOLFSSL_ECDSA_SET_K_ONE_LOOP:
  68. * Enables the setting of the 'k' value to use during ECDSA
  69. * signing. If the value is invalid then an error is
  70. * returned rather than generating a new 'k'. (For testing)
  71. * default: off
  72. * WOLFSSL_ECDSA_DETERMINISTIC_K: Enables RFC6979 implementation of
  73. * deterministic ECC signatures. The following function
  74. * can be used to set the deterministic signing flag in the
  75. * ecc key structure.
  76. * int wc_ecc_set_deterministic(ecc_key* key, byte flag)
  77. * default: off
  78. *
  79. * WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT: RFC6979 lists a variant that uses the
  80. * hash directly instead of doing bits2octets(H(m)), when
  81. * the variant macro is used the bits2octets operation on
  82. * the hash is removed.
  83. * default: off
  84. *
  85. * WC_PROTECT_ENCRYPTED_MEM:
  86. * Enables implementations that protect data that is in
  87. * encrypted memory.
  88. * default: off
  89. * WOLFSSL_ECC_GEN_REJECT_SAMPLING
  90. * Enables generation of scalar (private key and ECDSA
  91. * nonce) to be performed using reject sampling algorithm.
  92. * Use this when CPU state can be closely observed by
  93. * attacker.
  94. * default: off
  95. */
  96. /*
  97. ECC Curve Types:
  98. * NO_ECC_SECP Disables SECP curves default: off (not defined)
  99. * HAVE_ECC_SECPR2 Enables SECP R2 curves default: off
  100. * HAVE_ECC_SECPR3 Enables SECP R3 curves default: off
  101. * HAVE_ECC_BRAINPOOL Enables Brainpool curves default: off
  102. * HAVE_ECC_KOBLITZ Enables Koblitz curves default: off
  103. * WOLFSSL_SM2 Enables SM2 curves default: off
  104. */
  105. /*
  106. ECC Curve Sizes:
  107. * ECC_USER_CURVES: Allows custom combination of key sizes below
  108. * HAVE_ALL_CURVES: Enable all key sizes (on unless ECC_USER_CURVES is defined)
  109. * ECC_MIN_KEY_SZ: Minimum supported ECC key size
  110. * HAVE_ECC112: 112 bit key
  111. * HAVE_ECC128: 128 bit key
  112. * HAVE_ECC160: 160 bit key
  113. * HAVE_ECC192: 192 bit key
  114. * HAVE_ECC224: 224 bit key
  115. * HAVE_ECC239: 239 bit key
  116. * NO_ECC256: Disables 256 bit key (on by default)
  117. * HAVE_ECC320: 320 bit key
  118. * HAVE_ECC384: 384 bit key
  119. * HAVE_ECC512: 512 bit key
  120. * HAVE_ECC521: 521 bit key
  121. */
  122. #ifdef HAVE_ECC
  123. /* Make sure custom curves is enabled for Brainpool or Koblitz curve types */
  124. #if (defined(HAVE_ECC_BRAINPOOL) || defined(HAVE_ECC_KOBLITZ)) &&\
  125. !defined(WOLFSSL_CUSTOM_CURVES)
  126. #error Brainpool and Koblitz curves requires WOLFSSL_CUSTOM_CURVES
  127. #endif
  128. #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)
  129. /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */
  130. #define FIPS_NO_WRAPPERS
  131. #ifdef USE_WINDOWS_API
  132. #pragma code_seg(".fipsA$f")
  133. #pragma const_seg(".fipsB$f")
  134. #endif
  135. #endif
  136. /* public ASN interface */
  137. #include <wolfssl/wolfcrypt/asn_public.h>
  138. #include <wolfssl/wolfcrypt/ecc.h>
  139. #include <wolfssl/wolfcrypt/asn.h>
  140. #include <wolfssl/wolfcrypt/error-crypt.h>
  141. #include <wolfssl/wolfcrypt/logging.h>
  142. #include <wolfssl/wolfcrypt/types.h>
  143. #ifdef WOLFSSL_HAVE_SP_ECC
  144. #include <wolfssl/wolfcrypt/sp.h>
  145. #endif
  146. #ifdef HAVE_ECC_ENCRYPT
  147. #include <wolfssl/wolfcrypt/kdf.h>
  148. #include <wolfssl/wolfcrypt/aes.h>
  149. #endif
  150. #ifdef HAVE_X963_KDF
  151. #include <wolfssl/wolfcrypt/hash.h>
  152. #endif
  153. #ifdef WOLF_CRYPTO_CB
  154. #include <wolfssl/wolfcrypt/cryptocb.h>
  155. #endif
  156. #ifdef NO_INLINE
  157. #include <wolfssl/wolfcrypt/misc.h>
  158. #else
  159. #define WOLFSSL_MISC_INCLUDED
  160. #include <wolfcrypt/src/misc.c>
  161. #endif
  162. #if defined(FREESCALE_LTC_ECC)
  163. #include <wolfssl/wolfcrypt/port/nxp/ksdk_port.h>
  164. #endif
  165. #if defined(WOLFSSL_STM32_PKA)
  166. #include <wolfssl/wolfcrypt/port/st/stm32.h>
  167. #endif
  168. #if defined(WOLFSSL_PSOC6_CRYPTO)
  169. #include <wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h>
  170. #endif
  171. #if defined(WOLFSSL_CAAM)
  172. #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
  173. #endif
  174. #if defined(WOLFSSL_KCAPI_ECC)
  175. #include <wolfssl/wolfcrypt/port/kcapi/kcapi_ecc.h>
  176. #endif
  177. #ifdef WOLFSSL_SE050
  178. #include <wolfssl/wolfcrypt/port/nxp/se050_port.h>
  179. #endif
  180. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  181. #include <xsecure_ellipticclient.h>
  182. #endif
  183. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  184. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  185. #include <wolfssl/wolfcrypt/hmac.h>
  186. #endif
  187. #if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
  188. #define GEN_MEM_ERR MP_MEM
  189. #elif defined(USE_FAST_MATH)
  190. #define GEN_MEM_ERR FP_MEM
  191. #else
  192. #define GEN_MEM_ERR MP_MEM
  193. #endif
  194. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  195. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \
  196. !defined(WOLFSSL_KCAPI_ECC) && !defined(WOLFSSL_SE050) && \
  197. !defined(WOLFSSL_XILINX_CRYPT_VERSAL) && !defined(WOLFSSL_STM32_PKA)
  198. #undef HAVE_ECC_VERIFY_HELPER
  199. #define HAVE_ECC_VERIFY_HELPER
  200. #endif
  201. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  202. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \
  203. !defined(WOLFSSL_KCAPI_ECC) && !defined(NO_ECC_MAKE_PUB) && \
  204. !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  205. #undef HAVE_ECC_MAKE_PUB
  206. #define HAVE_ECC_MAKE_PUB
  207. #endif
  208. #if !defined(WOLFSSL_SP_MATH) && \
  209. !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  210. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \
  211. !defined(WOLFSSL_SE050) && !defined(WOLFSSL_STM32_PKA) && \
  212. !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  213. #undef HAVE_ECC_CHECK_PUBKEY_ORDER
  214. #define HAVE_ECC_CHECK_PUBKEY_ORDER
  215. #endif
  216. #if defined(WOLFSSL_SP_MATH_ALL) && SP_INT_BITS < MAX_ECC_BITS_NEEDED
  217. #define MAX_ECC_BITS_USE SP_INT_BITS
  218. #else
  219. #define MAX_ECC_BITS_USE MAX_ECC_BITS_NEEDED
  220. #endif
  221. #if !defined(WOLFSSL_CUSTOM_CURVES) && (ECC_MIN_KEY_SZ > 160) && \
  222. (!defined(HAVE_ECC_KOBLITZ) || (ECC_MIN_KEY_SZ > 224))
  223. #define ECC_KEY_MAX_BITS(key) \
  224. ((((key) == NULL) || ((key)->dp == NULL)) ? MAX_ECC_BITS_USE : \
  225. ((unsigned)((key)->dp->size * 8)))
  226. #else
  227. /* Add one bit for cases when order is a bit greater than prime. */
  228. #define ECC_KEY_MAX_BITS(key) \
  229. ((((key) == NULL) || ((key)->dp == NULL)) ? MAX_ECC_BITS_USE : \
  230. ((unsigned)((key)->dp->size * 8 + 1)))
  231. #endif
  232. /* forward declarations */
  233. static int wc_ecc_new_point_ex(ecc_point** point, void* heap);
  234. static void wc_ecc_del_point_ex(ecc_point* p, void* heap);
  235. #if defined(HAVE_ECC_SIGN) && (defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  236. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT))
  237. static int deterministic_sign_helper(const byte* in, word32 inlen, ecc_key* key);
  238. #endif
  239. /* internal ECC states */
  240. enum {
  241. ECC_STATE_NONE = 0,
  242. ECC_STATE_SHARED_SEC_GEN,
  243. ECC_STATE_SHARED_SEC_RES,
  244. ECC_STATE_SIGN_DO,
  245. ECC_STATE_SIGN_ENCODE,
  246. ECC_STATE_VERIFY_DECODE,
  247. ECC_STATE_VERIFY_DO,
  248. ECC_STATE_VERIFY_RES
  249. };
  250. /* map
  251. ptmul -> mulmod
  252. */
  253. /* 256-bit curve on by default whether user curves or not */
  254. #if (defined(HAVE_ECC112) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 112
  255. #define ECC112
  256. #endif
  257. #if (defined(HAVE_ECC128) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 128
  258. #define ECC128
  259. #endif
  260. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  261. #define ECC160
  262. #endif
  263. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  264. #define ECC192
  265. #endif
  266. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  267. #define ECC224
  268. #endif
  269. #if (defined(HAVE_ECC239) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 239
  270. #define ECC239
  271. #endif
  272. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  273. #define ECC256
  274. #endif
  275. #if (defined(HAVE_ECC320) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 320
  276. #define ECC320
  277. #endif
  278. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  279. #define ECC384
  280. #endif
  281. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  282. #define ECC512
  283. #endif
  284. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  285. #define ECC521
  286. #endif
  287. /* The encoded OID's for ECC curves */
  288. #ifdef ECC112
  289. #ifndef NO_ECC_SECP
  290. #ifdef HAVE_OID_ENCODING
  291. #define CODED_SECP112R1 {1,3,132,0,6}
  292. #define CODED_SECP112R1_SZ 5
  293. #else
  294. #define CODED_SECP112R1 {0x2B,0x81,0x04,0x00,0x06}
  295. #define CODED_SECP112R1_SZ 5
  296. #endif
  297. #ifndef WOLFSSL_ECC_CURVE_STATIC
  298. static const ecc_oid_t ecc_oid_secp112r1[] = CODED_SECP112R1;
  299. #else
  300. #define ecc_oid_secp112r1 CODED_SECP112R1
  301. #endif
  302. #define ecc_oid_secp112r1_sz CODED_SECP112R1_SZ
  303. #endif /* !NO_ECC_SECP */
  304. #if defined(HAVE_ECC_SECPR2) && defined(HAVE_ECC_KOBLITZ)
  305. #ifdef HAVE_OID_ENCODING
  306. #define CODED_SECP112R2 {1,3,132,0,7}
  307. #define CODED_SECP112R2_SZ 5
  308. #else
  309. #define CODED_SECP112R2 {0x2B,0x81,0x04,0x00,0x07}
  310. #define CODED_SECP112R2_SZ 5
  311. #endif
  312. #ifndef WOLFSSL_ECC_CURVE_STATIC
  313. static const ecc_oid_t ecc_oid_secp112r2[] = CODED_SECP112R2;
  314. #else
  315. #define ecc_oid_secp112r2 CODED_SECP112R2
  316. #endif
  317. #define ecc_oid_secp112r2_sz CODED_SECP112R2_SZ
  318. #endif /* HAVE_ECC_SECPR2 && HAVE_ECC_KOBLITZ */
  319. #endif /* ECC112 */
  320. #ifdef ECC128
  321. #ifndef NO_ECC_SECP
  322. #ifdef HAVE_OID_ENCODING
  323. #define CODED_SECP128R1 {1,3,132,0,28}
  324. #define CODED_SECP128R1_SZ 5
  325. #else
  326. #define CODED_SECP128R1 {0x2B,0x81,0x04,0x00,0x1C}
  327. #define CODED_SECP128R1_SZ 5
  328. #endif
  329. #ifndef WOLFSSL_ECC_CURVE_STATIC
  330. static const ecc_oid_t ecc_oid_secp128r1[] = CODED_SECP128R1;
  331. #else
  332. #define ecc_oid_secp128r1 CODED_SECP128R1
  333. #endif
  334. #define ecc_oid_secp128r1_sz CODED_SECP128R1_SZ
  335. #endif /* !NO_ECC_SECP */
  336. #if defined(HAVE_ECC_SECPR2) && defined(HAVE_ECC_KOBLITZ)
  337. #ifdef HAVE_OID_ENCODING
  338. #define CODED_SECP128R2 {1,3,132,0,29}
  339. #define CODED_SECP128R2_SZ 5
  340. #else
  341. #define CODED_SECP128R2 {0x2B,0x81,0x04,0x00,0x1D}
  342. #define CODED_SECP128R2_SZ 5
  343. #endif
  344. #ifndef WOLFSSL_ECC_CURVE_STATIC
  345. static const ecc_oid_t ecc_oid_secp128r2[] = CODED_SECP128R2;
  346. #else
  347. #define ecc_oid_secp128r2 CODED_SECP128R2
  348. #endif
  349. #define ecc_oid_secp128r2_sz CODED_SECP128R2_SZ
  350. #endif /* HAVE_ECC_SECPR2 && HAVE_ECC_KOBLITZ */
  351. #endif /* ECC128 */
  352. #ifdef ECC160
  353. #ifndef FP_ECC
  354. #ifndef NO_ECC_SECP
  355. #ifdef HAVE_OID_ENCODING
  356. #define CODED_SECP160R1 {1,3,132,0,8}
  357. #define CODED_SECP160R1_SZ 5
  358. #else
  359. #define CODED_SECP160R1 {0x2B,0x81,0x04,0x00,0x08}
  360. #define CODED_SECP160R1_SZ 5
  361. #endif
  362. #ifndef WOLFSSL_ECC_CURVE_STATIC
  363. static const ecc_oid_t ecc_oid_secp160r1[] = CODED_SECP160R1;
  364. #else
  365. #define ecc_oid_secp160r1 CODED_SECP160R1
  366. #endif
  367. #define ecc_oid_secp160r1_sz CODED_SECP160R1_SZ
  368. #endif /* !NO_ECC_SECP */
  369. #ifdef HAVE_ECC_SECPR2
  370. #ifdef HAVE_OID_ENCODING
  371. #define CODED_SECP160R2 {1,3,132,0,30}
  372. #define CODED_SECP160R2_SZ 5
  373. #else
  374. #define CODED_SECP160R2 {0x2B,0x81,0x04,0x00,0x1E}
  375. #define CODED_SECP160R2_SZ 5
  376. #endif
  377. #ifndef WOLFSSL_ECC_CURVE_STATIC
  378. static const ecc_oid_t ecc_oid_secp160r2[] = CODED_SECP160R2;
  379. #else
  380. #define ecc_oid_secp160r2 CODED_SECP160R2
  381. #endif
  382. #define ecc_oid_secp160r2_sz CODED_SECP160R2_SZ
  383. #endif /* HAVE_ECC_SECPR2 */
  384. #ifdef HAVE_ECC_KOBLITZ
  385. #ifdef HAVE_OID_ENCODING
  386. #define CODED_SECP160K1 {1,3,132,0,9}
  387. #define CODED_SECP160K1_SZ 5
  388. #else
  389. #define CODED_SECP160K1 {0x2B,0x81,0x04,0x00,0x09}
  390. #define CODED_SECP160K1_SZ 5
  391. #endif
  392. #ifndef WOLFSSL_ECC_CURVE_STATIC
  393. static const ecc_oid_t ecc_oid_secp160k1[] = CODED_SECP160K1;
  394. #else
  395. #define ecc_oid_secp160k1 CODED_SECP160K1
  396. #endif
  397. #define ecc_oid_secp160k1_sz CODED_SECP160K1_SZ
  398. #endif /* HAVE_ECC_KOBLITZ */
  399. #endif /* !FP_ECC */
  400. #ifdef HAVE_ECC_BRAINPOOL
  401. #ifdef HAVE_OID_ENCODING
  402. #define CODED_BRAINPOOLP160R1 {1,3,36,3,3,2,8,1,1,1}
  403. #define CODED_BRAINPOOLP160R1_SZ 10
  404. #else
  405. #define CODED_BRAINPOOLP160R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x01}
  406. #define CODED_BRAINPOOLP160R1_SZ 9
  407. #endif
  408. #ifndef WOLFSSL_ECC_CURVE_STATIC
  409. static const ecc_oid_t ecc_oid_brainpoolp160r1[] = CODED_BRAINPOOLP160R1;
  410. #else
  411. #define ecc_oid_brainpoolp160r1 CODED_BRAINPOOLP160R1
  412. #endif
  413. #define ecc_oid_brainpoolp160r1_sz CODED_BRAINPOOLP160R1_SZ
  414. #endif /* HAVE_ECC_BRAINPOOL */
  415. #endif /* ECC160 */
  416. #ifdef ECC192
  417. #ifndef NO_ECC_SECP
  418. #ifdef HAVE_OID_ENCODING
  419. #define CODED_SECP192R1 {1,2,840,10045,3,1,1}
  420. #define CODED_SECP192R1_SZ 7
  421. #else
  422. #define CODED_SECP192R1 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x01}
  423. #define CODED_SECP192R1_SZ 8
  424. #endif
  425. #ifndef WOLFSSL_ECC_CURVE_STATIC
  426. static const ecc_oid_t ecc_oid_secp192r1[] = CODED_SECP192R1;
  427. #else
  428. #define ecc_oid_secp192r1 CODED_SECP192R1
  429. #endif
  430. #define ecc_oid_secp192r1_sz CODED_SECP192R1_SZ
  431. #endif /* !NO_ECC_SECP */
  432. #ifdef HAVE_ECC_SECPR2
  433. #ifdef HAVE_OID_ENCODING
  434. #define CODED_PRIME192V2 {1,2,840,10045,3,1,2}
  435. #define CODED_PRIME192V2_SZ 7
  436. #else
  437. #define CODED_PRIME192V2 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x02}
  438. #define CODED_PRIME192V2_SZ 8
  439. #endif
  440. #ifndef WOLFSSL_ECC_CURVE_STATIC
  441. static const ecc_oid_t ecc_oid_prime192v2[] = CODED_PRIME192V2;
  442. #else
  443. #define ecc_oid_prime192v2 CODED_PRIME192V2
  444. #endif
  445. #define ecc_oid_prime192v2_sz CODED_PRIME192V2_SZ
  446. #endif /* HAVE_ECC_SECPR2 */
  447. #ifdef HAVE_ECC_SECPR3
  448. #ifdef HAVE_OID_ENCODING
  449. #define CODED_PRIME192V3 {1,2,840,10045,3,1,3}
  450. #define CODED_PRIME192V3_SZ 7
  451. #else
  452. #define CODED_PRIME192V3 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x03}
  453. #define CODED_PRIME192V3_SZ 8
  454. #endif
  455. #ifndef WOLFSSL_ECC_CURVE_STATIC
  456. static const ecc_oid_t ecc_oid_prime192v3[] = CODED_PRIME192V3;
  457. #else
  458. #define ecc_oid_prime192v3 CODED_PRIME192V3
  459. #endif
  460. #define ecc_oid_prime192v3_sz CODED_PRIME192V3_SZ
  461. #endif /* HAVE_ECC_SECPR3 */
  462. #ifdef HAVE_ECC_KOBLITZ
  463. #ifdef HAVE_OID_ENCODING
  464. #define CODED_SECP192K1 {1,3,132,0,31}
  465. #define CODED_SECP192K1_SZ 5
  466. #else
  467. #define CODED_SECP192K1 {0x2B,0x81,0x04,0x00,0x1F}
  468. #define CODED_SECP192K1_SZ 5
  469. #endif
  470. #ifndef WOLFSSL_ECC_CURVE_STATIC
  471. static const ecc_oid_t ecc_oid_secp192k1[] = CODED_SECP192K1;
  472. #else
  473. #define ecc_oid_secp192k1 CODED_SECP192K1
  474. #endif
  475. #define ecc_oid_secp192k1_sz CODED_SECP192K1_SZ
  476. #endif /* HAVE_ECC_KOBLITZ */
  477. #ifdef HAVE_ECC_BRAINPOOL
  478. #ifdef HAVE_OID_ENCODING
  479. #define CODED_BRAINPOOLP192R1 {1,3,36,3,3,2,8,1,1,3}
  480. #define CODED_BRAINPOOLP192R1_SZ 10
  481. #else
  482. #define CODED_BRAINPOOLP192R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x03}
  483. #define CODED_BRAINPOOLP192R1_SZ 9
  484. #endif
  485. #ifndef WOLFSSL_ECC_CURVE_STATIC
  486. static const ecc_oid_t ecc_oid_brainpoolp192r1[] = CODED_BRAINPOOLP192R1;
  487. #else
  488. #define ecc_oid_brainpoolp192r1 CODED_BRAINPOOLP192R1
  489. #endif
  490. #define ecc_oid_brainpoolp192r1_sz CODED_BRAINPOOLP192R1_SZ
  491. #endif /* HAVE_ECC_BRAINPOOL */
  492. #endif /* ECC192 */
  493. #ifdef ECC224
  494. #ifndef NO_ECC_SECP
  495. #ifdef HAVE_OID_ENCODING
  496. #define CODED_SECP224R1 {1,3,132,0,33}
  497. #define CODED_SECP224R1_SZ 5
  498. #else
  499. #define CODED_SECP224R1 {0x2B,0x81,0x04,0x00,0x21}
  500. #define CODED_SECP224R1_SZ 5
  501. #endif
  502. #ifndef WOLFSSL_ECC_CURVE_STATIC
  503. static const ecc_oid_t ecc_oid_secp224r1[] = CODED_SECP224R1;
  504. #else
  505. #define ecc_oid_secp224r1 CODED_SECP224R1
  506. #endif
  507. #define ecc_oid_secp224r1_sz CODED_SECP224R1_SZ
  508. #endif /* !NO_ECC_SECP */
  509. #if defined(HAVE_ECC_KOBLITZ) && !defined(FP_ECC)
  510. #ifdef HAVE_OID_ENCODING
  511. #define CODED_SECP224K1 {1,3,132,0,32}
  512. #define CODED_SECP224K1_SZ 5
  513. #else
  514. #define CODED_SECP224K1 {0x2B,0x81,0x04,0x00,0x20}
  515. #define CODED_SECP224K1_SZ 5
  516. #endif
  517. #ifndef WOLFSSL_ECC_CURVE_STATIC
  518. static const ecc_oid_t ecc_oid_secp224k1[] = CODED_SECP224K1;
  519. #else
  520. #define ecc_oid_secp224k1 CODED_SECP224K1
  521. #endif
  522. #define ecc_oid_secp224k1_sz CODED_SECP224K1_SZ
  523. #endif /* HAVE_ECC_KOBLITZ && !FP_ECC */
  524. #ifdef HAVE_ECC_BRAINPOOL
  525. #ifdef HAVE_OID_ENCODING
  526. #define CODED_BRAINPOOLP224R1 {1,3,36,3,3,2,8,1,1,5}
  527. #define CODED_BRAINPOOLP224R1_SZ 10
  528. #else
  529. #define CODED_BRAINPOOLP224R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x05}
  530. #define CODED_BRAINPOOLP224R1_SZ 9
  531. #endif
  532. #ifndef WOLFSSL_ECC_CURVE_STATIC
  533. static const ecc_oid_t ecc_oid_brainpoolp224r1[] = CODED_BRAINPOOLP224R1;
  534. #else
  535. #define ecc_oid_brainpoolp224r1 CODED_BRAINPOOLP224R1
  536. #endif
  537. #define ecc_oid_brainpoolp224r1_sz CODED_BRAINPOOLP224R1_SZ
  538. #endif /* HAVE_ECC_BRAINPOOL */
  539. #endif /* ECC224 */
  540. #ifdef ECC239
  541. #ifndef NO_ECC_SECP
  542. #ifdef HAVE_OID_ENCODING
  543. #define CODED_PRIME239V1 {1,2,840,10045,3,1,4}
  544. #define CODED_PRIME239V1_SZ 7
  545. #else
  546. #define CODED_PRIME239V1 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x04}
  547. #define CODED_PRIME239V1_SZ 8
  548. #endif
  549. #ifndef WOLFSSL_ECC_CURVE_STATIC
  550. static const ecc_oid_t ecc_oid_prime239v1[] = CODED_PRIME239V1;
  551. #else
  552. #define ecc_oid_prime239v1 CODED_PRIME239V1
  553. #endif
  554. #define ecc_oid_prime239v1_sz CODED_PRIME239V1_SZ
  555. #endif /* !NO_ECC_SECP */
  556. #ifdef HAVE_ECC_SECPR2
  557. #ifdef HAVE_OID_ENCODING
  558. #define CODED_PRIME239V2 {1,2,840,10045,3,1,5}
  559. #define CODED_PRIME239V2_SZ 7
  560. #else
  561. #define CODED_PRIME239V2 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x05}
  562. #define CODED_PRIME239V2_SZ 8
  563. #endif
  564. #ifndef WOLFSSL_ECC_CURVE_STATIC
  565. static const ecc_oid_t ecc_oid_prime239v2[] = CODED_PRIME239V2;
  566. #else
  567. #define ecc_oid_prime239v2 CODED_PRIME239V2
  568. #endif
  569. #define ecc_oid_prime239v2_sz CODED_PRIME239V2_SZ
  570. #endif /* HAVE_ECC_SECPR2 */
  571. #ifdef HAVE_ECC_SECPR3
  572. #ifdef HAVE_OID_ENCODING
  573. #define CODED_PRIME239V3 {1,2,840,10045,3,1,6}
  574. #define CODED_PRIME239V3_SZ 7
  575. #else
  576. #define CODED_PRIME239V3 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x06}
  577. #define CODED_PRIME239V3_SZ 8
  578. #endif
  579. #ifndef WOLFSSL_ECC_CURVE_STATIC
  580. static const ecc_oid_t ecc_oid_prime239v3[] = CODED_PRIME239V3;
  581. #else
  582. #define ecc_oid_prime239v3 CODED_PRIME239V3
  583. #endif
  584. #define ecc_oid_prime239v3_sz CODED_PRIME239V3_SZ
  585. #endif /* HAVE_ECC_SECPR3 */
  586. #endif /* ECC239 */
  587. #ifdef ECC256
  588. #ifndef NO_ECC_SECP
  589. #ifdef HAVE_OID_ENCODING
  590. #define CODED_SECP256R1 {1,2,840,10045,3,1,7}
  591. #define CODED_SECP256R1_SZ 7
  592. #else
  593. #define CODED_SECP256R1 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x07}
  594. #define CODED_SECP256R1_SZ 8
  595. #endif
  596. #ifndef WOLFSSL_ECC_CURVE_STATIC
  597. static const ecc_oid_t ecc_oid_secp256r1[] = CODED_SECP256R1;
  598. #else
  599. #define ecc_oid_secp256r1 CODED_SECP256R1
  600. #endif
  601. #define ecc_oid_secp256r1_sz CODED_SECP256R1_SZ
  602. #endif /* !NO_ECC_SECP */
  603. #ifdef HAVE_ECC_KOBLITZ
  604. #ifdef HAVE_OID_ENCODING
  605. #define CODED_SECP256K1 {1,3,132,0,10}
  606. #define CODED_SECP256K1_SZ 5
  607. #else
  608. #define CODED_SECP256K1 {0x2B,0x81,0x04,0x00,0x0A}
  609. #define CODED_SECP256K1_SZ 5
  610. #endif
  611. #ifndef WOLFSSL_ECC_CURVE_STATIC
  612. static const ecc_oid_t ecc_oid_secp256k1[] = CODED_SECP256K1;
  613. #else
  614. #define ecc_oid_secp256k1 CODED_SECP256K1
  615. #endif
  616. #define ecc_oid_secp256k1_sz CODED_SECP256K1_SZ
  617. #endif /* HAVE_ECC_KOBLITZ */
  618. #ifdef HAVE_ECC_BRAINPOOL
  619. #ifdef HAVE_OID_ENCODING
  620. #define CODED_BRAINPOOLP256R1 {1,3,36,3,3,2,8,1,1,7}
  621. #define CODED_BRAINPOOLP256R1_SZ 10
  622. #else
  623. #define CODED_BRAINPOOLP256R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x07}
  624. #define CODED_BRAINPOOLP256R1_SZ 9
  625. #endif
  626. #ifndef WOLFSSL_ECC_CURVE_STATIC
  627. static const ecc_oid_t ecc_oid_brainpoolp256r1[] = CODED_BRAINPOOLP256R1;
  628. #else
  629. #define ecc_oid_brainpoolp256r1 CODED_BRAINPOOLP256R1
  630. #endif
  631. #define ecc_oid_brainpoolp256r1_sz CODED_BRAINPOOLP256R1_SZ
  632. #endif /* HAVE_ECC_BRAINPOOL */
  633. #endif /* ECC256 */
  634. #if defined(WOLFSSL_SM2)
  635. #ifdef HAVE_OID_ENCODING
  636. #define CODED_SM2P256V1 {1,2,156,10197,1,301}
  637. #define CODED_SM2P256V1_SZ 6
  638. #else
  639. #define CODED_SM2P256V1 {0x2A,0x81,0x1C,0xCF,0x55,0x01,0x82,0x2d}
  640. #define CODED_SM2P256V1_SZ 8
  641. #endif
  642. #ifndef WOLFSSL_ECC_CURVE_STATIC
  643. static const ecc_oid_t ecc_oid_sm2p256v1[] = CODED_SM2P256V1;
  644. #else
  645. #define ecc_oid_sm2p256v1 CODED_SM2P256V1
  646. #endif
  647. #define ecc_oid_sm2p256v1_sz CODED_SM2P256V1_SZ
  648. #endif /* WOLFSSL_SM2 */
  649. #ifdef ECC320
  650. #ifdef HAVE_ECC_BRAINPOOL
  651. #ifdef HAVE_OID_ENCODING
  652. #define CODED_BRAINPOOLP320R1 {1,3,36,3,3,2,8,1,1,9}
  653. #define CODED_BRAINPOOLP320R1_SZ 10
  654. #else
  655. #define CODED_BRAINPOOLP320R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x09}
  656. #define CODED_BRAINPOOLP320R1_SZ 9
  657. #endif
  658. #ifndef WOLFSSL_ECC_CURVE_STATIC
  659. static const ecc_oid_t ecc_oid_brainpoolp320r1[] = CODED_BRAINPOOLP320R1;
  660. #else
  661. #define ecc_oid_brainpoolp320r1 CODED_BRAINPOOLP320R1
  662. #endif
  663. #define ecc_oid_brainpoolp320r1_sz CODED_BRAINPOOLP320R1_SZ
  664. #endif /* HAVE_ECC_BRAINPOOL */
  665. #endif /* ECC320 */
  666. #ifdef ECC384
  667. #ifndef NO_ECC_SECP
  668. #ifdef HAVE_OID_ENCODING
  669. #define CODED_SECP384R1 {1,3,132,0,34}
  670. #define CODED_SECP384R1_SZ 5
  671. #else
  672. #define CODED_SECP384R1 {0x2B,0x81,0x04,0x00,0x22}
  673. #define CODED_SECP384R1_SZ 5
  674. #endif
  675. #ifndef WOLFSSL_ECC_CURVE_STATIC
  676. static const ecc_oid_t ecc_oid_secp384r1[] = CODED_SECP384R1;
  677. #define CODED_SECP384R1_OID ecc_oid_secp384r1
  678. #else
  679. #define ecc_oid_secp384r1 CODED_SECP384R1
  680. #endif
  681. #define ecc_oid_secp384r1_sz CODED_SECP384R1_SZ
  682. #endif /* !NO_ECC_SECP */
  683. #ifdef HAVE_ECC_BRAINPOOL
  684. #ifdef HAVE_OID_ENCODING
  685. #define CODED_BRAINPOOLP384R1 {1,3,36,3,3,2,8,1,1,11}
  686. #define CODED_BRAINPOOLP384R1_SZ 10
  687. #else
  688. #define CODED_BRAINPOOLP384R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0B}
  689. #define CODED_BRAINPOOLP384R1_SZ 9
  690. #endif
  691. #ifndef WOLFSSL_ECC_CURVE_STATIC
  692. static const ecc_oid_t ecc_oid_brainpoolp384r1[] = CODED_BRAINPOOLP384R1;
  693. #else
  694. #define ecc_oid_brainpoolp384r1 CODED_BRAINPOOLP384R1
  695. #endif
  696. #define ecc_oid_brainpoolp384r1_sz CODED_BRAINPOOLP384R1_SZ
  697. #endif /* HAVE_ECC_BRAINPOOL */
  698. #endif /* ECC384 */
  699. #ifdef ECC512
  700. #ifdef HAVE_ECC_BRAINPOOL
  701. #ifdef HAVE_OID_ENCODING
  702. #define CODED_BRAINPOOLP512R1 {1,3,36,3,3,2,8,1,1,13}
  703. #define CODED_BRAINPOOLP512R1_SZ 10
  704. #else
  705. #define CODED_BRAINPOOLP512R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0D}
  706. #define CODED_BRAINPOOLP512R1_SZ 9
  707. #endif
  708. #ifndef WOLFSSL_ECC_CURVE_STATIC
  709. static const ecc_oid_t ecc_oid_brainpoolp512r1[] = CODED_BRAINPOOLP512R1;
  710. #else
  711. #define ecc_oid_brainpoolp512r1 CODED_BRAINPOOLP512R1
  712. #endif
  713. #define ecc_oid_brainpoolp512r1_sz CODED_BRAINPOOLP512R1_SZ
  714. #endif /* HAVE_ECC_BRAINPOOL */
  715. #endif /* ECC512 */
  716. #ifdef ECC521
  717. #ifndef NO_ECC_SECP
  718. #ifdef HAVE_OID_ENCODING
  719. #define CODED_SECP521R1 {1,3,132,0,35}
  720. #define CODED_SECP521R1_SZ 5
  721. #else
  722. #define CODED_SECP521R1 {0x2B,0x81,0x04,0x00,0x23}
  723. #define CODED_SECP521R1_SZ 5
  724. #endif
  725. #ifndef WOLFSSL_ECC_CURVE_STATIC
  726. static const ecc_oid_t ecc_oid_secp521r1[] = CODED_SECP521R1;
  727. #else
  728. #define ecc_oid_secp521r1 CODED_SECP521R1
  729. #endif
  730. #define ecc_oid_secp521r1_sz CODED_SECP521R1_SZ
  731. #endif /* !NO_ECC_SECP */
  732. #endif /* ECC521 */
  733. /* This holds the key settings.
  734. ***MUST*** be organized by size from smallest to largest. */
  735. const ecc_set_type ecc_sets[] = {
  736. #ifdef ECC112
  737. #ifndef NO_ECC_SECP
  738. {
  739. 14, /* size/bytes */
  740. ECC_SECP112R1, /* ID */
  741. "SECP112R1", /* curve name */
  742. "DB7C2ABF62E35E668076BEAD208B", /* prime */
  743. "DB7C2ABF62E35E668076BEAD2088", /* A */
  744. "659EF8BA043916EEDE8911702B22", /* B */
  745. "DB7C2ABF62E35E7628DFAC6561C5", /* order */
  746. "9487239995A5EE76B55F9C2F098", /* Gx */
  747. "A89CE5AF8724C0A23E0E0FF77500", /* Gy */
  748. ecc_oid_secp112r1, /* oid/oidSz */
  749. ecc_oid_secp112r1_sz,
  750. ECC_SECP112R1_OID, /* oid sum */
  751. 1, /* cofactor */
  752. },
  753. #endif /* !NO_ECC_SECP */
  754. #if defined(HAVE_ECC_SECPR2) && defined(HAVE_ECC_KOBLITZ)
  755. {
  756. 14, /* size/bytes */
  757. ECC_SECP112R2, /* ID */
  758. "SECP112R2", /* curve name */
  759. "DB7C2ABF62E35E668076BEAD208B", /* prime */
  760. "6127C24C05F38A0AAAF65C0EF02C", /* A */
  761. "51DEF1815DB5ED74FCC34C85D709", /* B */
  762. "36DF0AAFD8B8D7597CA10520D04B", /* order */
  763. "4BA30AB5E892B4E1649DD0928643", /* Gx */
  764. "ADCD46F5882E3747DEF36E956E97", /* Gy */
  765. ecc_oid_secp112r2, /* oid/oidSz */
  766. ecc_oid_secp112r2_sz,
  767. ECC_SECP112R2_OID, /* oid sum */
  768. 4, /* cofactor */
  769. },
  770. #endif /* HAVE_ECC_SECPR2 && HAVE_ECC_KOBLITZ */
  771. #endif /* ECC112 */
  772. #ifdef ECC128
  773. #ifndef NO_ECC_SECP
  774. {
  775. 16, /* size/bytes */
  776. ECC_SECP128R1, /* ID */
  777. "SECP128R1", /* curve name */
  778. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  779. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", /* A */
  780. "E87579C11079F43DD824993C2CEE5ED3", /* B */
  781. "FFFFFFFE0000000075A30D1B9038A115", /* order */
  782. "161FF7528B899B2D0C28607CA52C5B86", /* Gx */
  783. "CF5AC8395BAFEB13C02DA292DDED7A83", /* Gy */
  784. ecc_oid_secp128r1, /* oid/oidSz */
  785. ecc_oid_secp128r1_sz,
  786. ECC_SECP128R1_OID, /* oid sum */
  787. 1, /* cofactor */
  788. },
  789. #endif /* !NO_ECC_SECP */
  790. #if defined(HAVE_ECC_SECPR2) && defined(HAVE_ECC_KOBLITZ)
  791. {
  792. 16, /* size/bytes */
  793. ECC_SECP128R2, /* ID */
  794. "SECP128R2", /* curve name */
  795. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  796. "D6031998D1B3BBFEBF59CC9BBFF9AEE1", /* A */
  797. "5EEEFCA380D02919DC2C6558BB6D8A5D", /* B */
  798. "3FFFFFFF7FFFFFFFBE0024720613B5A3", /* order */
  799. "7B6AA5D85E572983E6FB32A7CDEBC140", /* Gx */
  800. "27B6916A894D3AEE7106FE805FC34B44", /* Gy */
  801. ecc_oid_secp128r2, /* oid/oidSz */
  802. ecc_oid_secp128r2_sz,
  803. ECC_SECP128R2_OID, /* oid sum */
  804. 4, /* cofactor */
  805. },
  806. #endif /* HAVE_ECC_SECPR2 && HAVE_ECC_KOBLITZ */
  807. #endif /* ECC128 */
  808. #ifdef ECC160
  809. #ifndef FP_ECC
  810. #ifndef NO_ECC_SECP
  811. {
  812. 20, /* size/bytes */
  813. ECC_SECP160R1, /* ID */
  814. "SECP160R1", /* curve name */
  815. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", /* prime */
  816. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", /* A */
  817. "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", /* B */
  818. "100000000000000000001F4C8F927AED3CA752257",/* order */
  819. "4A96B5688EF573284664698968C38BB913CBFC82", /* Gx */
  820. "23A628553168947D59DCC912042351377AC5FB32", /* Gy */
  821. ecc_oid_secp160r1, /* oid/oidSz */
  822. ecc_oid_secp160r1_sz,
  823. ECC_SECP160R1_OID, /* oid sum */
  824. 1, /* cofactor */
  825. },
  826. #endif /* !NO_ECC_SECP */
  827. #ifdef HAVE_ECC_SECPR2
  828. {
  829. 20, /* size/bytes */
  830. ECC_SECP160R2, /* ID */
  831. "SECP160R2", /* curve name */
  832. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", /* prime */
  833. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70", /* A */
  834. "B4E134D3FB59EB8BAB57274904664D5AF50388BA", /* B */
  835. "100000000000000000000351EE786A818F3A1A16B",/* order */
  836. "52DCB034293A117E1F4FF11B30F7199D3144CE6D", /* Gx */
  837. "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E", /* Gy */
  838. ecc_oid_secp160r2, /* oid/oidSz */
  839. ecc_oid_secp160r2_sz,
  840. ECC_SECP160R2_OID, /* oid sum */
  841. 1, /* cofactor */
  842. },
  843. #endif /* HAVE_ECC_SECPR2 */
  844. #ifdef HAVE_ECC_KOBLITZ
  845. {
  846. 20, /* size/bytes */
  847. ECC_SECP160K1, /* ID */
  848. "SECP160K1", /* curve name */
  849. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", /* prime */
  850. "0000000000000000000000000000000000000000", /* A */
  851. "0000000000000000000000000000000000000007", /* B */
  852. "100000000000000000001B8FA16DFAB9ACA16B6B3",/* order */
  853. "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", /* Gx */
  854. "938CF935318FDCED6BC28286531733C3F03C4FEE", /* Gy */
  855. ecc_oid_secp160k1, /* oid/oidSz */
  856. ecc_oid_secp160k1_sz,
  857. ECC_SECP160K1_OID, /* oid sum */
  858. 1, /* cofactor */
  859. },
  860. #endif /* HAVE_ECC_KOBLITZ */
  861. #endif /* !FP_ECC */
  862. #ifdef HAVE_ECC_BRAINPOOL
  863. {
  864. 20, /* size/bytes */
  865. ECC_BRAINPOOLP160R1, /* ID */
  866. "BRAINPOOLP160R1", /* curve name */
  867. "E95E4A5F737059DC60DFC7AD95B3D8139515620F", /* prime */
  868. "340E7BE2A280EB74E2BE61BADA745D97E8F7C300", /* A */
  869. "1E589A8595423412134FAA2DBDEC95C8D8675E58", /* B */
  870. "E95E4A5F737059DC60DF5991D45029409E60FC09", /* order */
  871. "BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3", /* Gx */
  872. "1667CB477A1A8EC338F94741669C976316DA6321", /* Gy */
  873. ecc_oid_brainpoolp160r1, /* oid/oidSz */
  874. ecc_oid_brainpoolp160r1_sz,
  875. ECC_BRAINPOOLP160R1_OID, /* oid sum */
  876. 1, /* cofactor */
  877. },
  878. #endif /* HAVE_ECC_BRAINPOOL */
  879. #endif /* ECC160 */
  880. #ifdef ECC192
  881. #ifndef NO_ECC_SECP
  882. {
  883. 24, /* size/bytes */
  884. ECC_SECP192R1, /* ID */
  885. "SECP192R1", /* curve name */
  886. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", /* prime */
  887. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", /* A */
  888. "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", /* B */
  889. "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", /* order */
  890. "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", /* Gx */
  891. "7192B95FFC8DA78631011ED6B24CDD573F977A11E794811", /* Gy */
  892. ecc_oid_secp192r1, /* oid/oidSz */
  893. ecc_oid_secp192r1_sz,
  894. ECC_SECP192R1_OID, /* oid sum */
  895. 1, /* cofactor */
  896. },
  897. #endif /* !NO_ECC_SECP */
  898. #ifdef HAVE_ECC_SECPR2
  899. {
  900. 24, /* size/bytes */
  901. ECC_PRIME192V2, /* ID */
  902. "PRIME192V2", /* curve name */
  903. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", /* prime */
  904. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", /* A */
  905. "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953", /* B */
  906. "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31", /* order */
  907. "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A", /* Gx */
  908. "6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15", /* Gy */
  909. ecc_oid_prime192v2, /* oid/oidSz */
  910. ecc_oid_prime192v2_sz,
  911. ECC_PRIME192V2_OID, /* oid sum */
  912. 1, /* cofactor */
  913. },
  914. #endif /* HAVE_ECC_SECPR2 */
  915. #ifdef HAVE_ECC_SECPR3
  916. {
  917. 24, /* size/bytes */
  918. ECC_PRIME192V3, /* ID */
  919. "PRIME192V3", /* curve name */
  920. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", /* prime */
  921. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", /* A */
  922. "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916", /* B */
  923. "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13", /* order */
  924. "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896", /* Gx */
  925. "38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0", /* Gy */
  926. ecc_oid_prime192v3, /* oid/oidSz */
  927. ecc_oid_prime192v3_sz,
  928. ECC_PRIME192V3_OID, /* oid sum */
  929. 1, /* cofactor */
  930. },
  931. #endif /* HAVE_ECC_SECPR3 */
  932. #ifdef HAVE_ECC_KOBLITZ
  933. {
  934. 24, /* size/bytes */
  935. ECC_SECP192K1, /* ID */
  936. "SECP192K1", /* curve name */
  937. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", /* prime */
  938. "000000000000000000000000000000000000000000000000", /* A */
  939. "000000000000000000000000000000000000000000000003", /* B */
  940. "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", /* order */
  941. "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", /* Gx */
  942. "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", /* Gy */
  943. ecc_oid_secp192k1, /* oid/oidSz */
  944. ecc_oid_secp192k1_sz,
  945. ECC_SECP192K1_OID, /* oid sum */
  946. 1, /* cofactor */
  947. },
  948. #endif /* HAVE_ECC_KOBLITZ */
  949. #ifdef HAVE_ECC_BRAINPOOL
  950. {
  951. 24, /* size/bytes */
  952. ECC_BRAINPOOLP192R1, /* ID */
  953. "BRAINPOOLP192R1", /* curve name */
  954. "C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297", /* prime */
  955. "6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF", /* A */
  956. "469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9", /* B */
  957. "C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1", /* order */
  958. "C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6", /* Gx */
  959. "14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F", /* Gy */
  960. ecc_oid_brainpoolp192r1, /* oid/oidSz */
  961. ecc_oid_brainpoolp192r1_sz,
  962. ECC_BRAINPOOLP192R1_OID, /* oid sum */
  963. 1, /* cofactor */
  964. },
  965. #endif /* HAVE_ECC_BRAINPOOL */
  966. #endif /* ECC192 */
  967. #ifdef ECC224
  968. #ifndef NO_ECC_SECP
  969. {
  970. 28, /* size/bytes */
  971. ECC_SECP224R1, /* ID */
  972. "SECP224R1", /* curve name */
  973. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", /* prime */
  974. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", /* A */
  975. "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", /* B */
  976. "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", /* order */
  977. "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", /* Gx */
  978. "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", /* Gy */
  979. ecc_oid_secp224r1, /* oid/oidSz */
  980. ecc_oid_secp224r1_sz,
  981. ECC_SECP224R1_OID, /* oid sum */
  982. 1, /* cofactor */
  983. },
  984. #endif /* !NO_ECC_SECP */
  985. #if defined(HAVE_ECC_KOBLITZ) && !defined(FP_ECC)
  986. {
  987. 28, /* size/bytes */
  988. ECC_SECP224K1, /* ID */
  989. "SECP224K1", /* curve name */
  990. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D", /* prime */
  991. "00000000000000000000000000000000000000000000000000000000", /* A */
  992. "00000000000000000000000000000000000000000000000000000005", /* B */
  993. "10000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",/* order */
  994. "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C", /* Gx */
  995. "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5", /* Gy */
  996. ecc_oid_secp224k1, /* oid/oidSz */
  997. ecc_oid_secp224k1_sz,
  998. ECC_SECP224K1_OID, /* oid sum */
  999. 1, /* cofactor */
  1000. },
  1001. #endif /* HAVE_ECC_KOBLITZ && !FP_ECC */
  1002. #ifdef HAVE_ECC_BRAINPOOL
  1003. {
  1004. 28, /* size/bytes */
  1005. ECC_BRAINPOOLP224R1, /* ID */
  1006. "BRAINPOOLP224R1", /* curve name */
  1007. "D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF", /* prime */
  1008. "68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43", /* A */
  1009. "2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B", /* B */
  1010. "D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F", /* order */
  1011. "0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D", /* Gx */
  1012. "58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD", /* Gy */
  1013. ecc_oid_brainpoolp224r1, /* oid/oidSz */
  1014. ecc_oid_brainpoolp224r1_sz,
  1015. ECC_BRAINPOOLP224R1_OID, /* oid sum */
  1016. 1, /* cofactor */
  1017. },
  1018. #endif /* HAVE_ECC_BRAINPOOL */
  1019. #endif /* ECC224 */
  1020. #ifdef ECC239
  1021. #ifndef NO_ECC_SECP
  1022. {
  1023. 30, /* size/bytes */
  1024. ECC_PRIME239V1, /* ID */
  1025. "PRIME239V1", /* curve name */
  1026. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", /* prime */
  1027. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", /* A */
  1028. "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A", /* B */
  1029. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B", /* order */
  1030. "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF", /* Gx */
  1031. "7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE", /* Gy */
  1032. ecc_oid_prime239v1, /* oid/oidSz */
  1033. ecc_oid_prime239v1_sz,
  1034. ECC_PRIME239V1_OID, /* oid sum */
  1035. 1, /* cofactor */
  1036. },
  1037. #endif /* !NO_ECC_SECP */
  1038. #ifdef HAVE_ECC_SECPR2
  1039. {
  1040. 30, /* size/bytes */
  1041. ECC_PRIME239V2, /* ID */
  1042. "PRIME239V2", /* curve name */
  1043. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", /* prime */
  1044. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", /* A */
  1045. "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C", /* B */
  1046. "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063", /* order */
  1047. "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7", /* Gx */
  1048. "5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA", /* Gy */
  1049. ecc_oid_prime239v2, /* oid/oidSz */
  1050. ecc_oid_prime239v2_sz,
  1051. ECC_PRIME239V2_OID, /* oid sum */
  1052. 1, /* cofactor */
  1053. },
  1054. #endif /* HAVE_ECC_SECPR2 */
  1055. #ifdef HAVE_ECC_SECPR3
  1056. {
  1057. 30, /* size/bytes */
  1058. ECC_PRIME239V3, /* ID */
  1059. "PRIME239V3", /* curve name */
  1060. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", /* prime */
  1061. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", /* A */
  1062. "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E", /* B */
  1063. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551", /* order */
  1064. "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A", /* Gx */
  1065. "1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3", /* Gy */
  1066. ecc_oid_prime239v3, /* oid/oidSz */
  1067. ecc_oid_prime239v3_sz,
  1068. ECC_PRIME239V3_OID, /* oid sum */
  1069. 1, /* cofactor */
  1070. },
  1071. #endif /* HAVE_ECC_SECPR3 */
  1072. #endif /* ECC239 */
  1073. #ifdef ECC256
  1074. #ifndef NO_ECC_SECP
  1075. {
  1076. 32, /* size/bytes */
  1077. ECC_SECP256R1, /* ID */
  1078. "SECP256R1", /* curve name */
  1079. "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  1080. "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", /* A */
  1081. "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", /* B */
  1082. "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", /* order */
  1083. "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", /* Gx */
  1084. "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", /* Gy */
  1085. ecc_oid_secp256r1, /* oid/oidSz */
  1086. ecc_oid_secp256r1_sz,
  1087. ECC_SECP256R1_OID, /* oid sum */
  1088. 1, /* cofactor */
  1089. },
  1090. #endif /* !NO_ECC_SECP */
  1091. #ifdef HAVE_ECC_KOBLITZ
  1092. {
  1093. 32, /* size/bytes */
  1094. ECC_SECP256K1, /* ID */
  1095. "SECP256K1", /* curve name */
  1096. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", /* prime */
  1097. "0000000000000000000000000000000000000000000000000000000000000000", /* A */
  1098. "0000000000000000000000000000000000000000000000000000000000000007", /* B */
  1099. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", /* order */
  1100. "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", /* Gx */
  1101. "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", /* Gy */
  1102. ecc_oid_secp256k1, /* oid/oidSz */
  1103. ecc_oid_secp256k1_sz,
  1104. ECC_SECP256K1_OID, /* oid sum */
  1105. 1, /* cofactor */
  1106. },
  1107. #endif /* HAVE_ECC_KOBLITZ */
  1108. #ifdef HAVE_ECC_BRAINPOOL
  1109. {
  1110. 32, /* size/bytes */
  1111. ECC_BRAINPOOLP256R1, /* ID */
  1112. "BRAINPOOLP256R1", /* curve name */
  1113. "A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", /* prime */
  1114. "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", /* A */
  1115. "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", /* B */
  1116. "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7", /* order */
  1117. "8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262", /* Gx */
  1118. "547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", /* Gy */
  1119. ecc_oid_brainpoolp256r1, /* oid/oidSz */
  1120. ecc_oid_brainpoolp256r1_sz,
  1121. ECC_BRAINPOOLP256R1_OID, /* oid sum */
  1122. 1, /* cofactor */
  1123. },
  1124. #endif /* HAVE_ECC_BRAINPOOL */
  1125. #endif /* ECC256 */
  1126. #if defined(WOLFSSL_SM2)
  1127. {
  1128. 32, /* size/bytes */
  1129. ECC_SM2P256V1, /* ID */
  1130. "SM2P256V1", /* curve name */
  1131. /* bottom of draft-shen-sm2-ecdsa-02, recommended values */
  1132. "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF", /* prime */
  1133. "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC", /* A */
  1134. "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93", /* B */
  1135. "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123", /* order */
  1136. "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", /* Gx */
  1137. "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0", /* Gy */
  1138. ecc_oid_sm2p256v1, /* oid/oidSz */
  1139. ecc_oid_sm2p256v1_sz,
  1140. ECC_SM2P256V1_OID, /* oid sum */
  1141. 1, /* cofactor */
  1142. },
  1143. #endif /* WOLFSSL_SM2 */
  1144. #ifdef ECC320
  1145. #ifdef HAVE_ECC_BRAINPOOL
  1146. {
  1147. 40, /* size/bytes */
  1148. ECC_BRAINPOOLP320R1, /* ID */
  1149. "BRAINPOOLP320R1", /* curve name */
  1150. "D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27", /* prime */
  1151. "3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4", /* A */
  1152. "520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6", /* B */
  1153. "D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311", /* order */
  1154. "43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E20611", /* Gx */
  1155. "14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1", /* Gy */
  1156. ecc_oid_brainpoolp320r1, ecc_oid_brainpoolp320r1_sz, /* oid/oidSz */
  1157. ECC_BRAINPOOLP320R1_OID, /* oid sum */
  1158. 1, /* cofactor */
  1159. },
  1160. #endif /* HAVE_ECC_BRAINPOOL */
  1161. #endif /* ECC320 */
  1162. #ifdef ECC384
  1163. #ifndef NO_ECC_SECP
  1164. {
  1165. 48, /* size/bytes */
  1166. ECC_SECP384R1, /* ID */
  1167. "SECP384R1", /* curve name */
  1168. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", /* prime */
  1169. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", /* A */
  1170. "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", /* B */
  1171. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", /* order */
  1172. "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", /* Gx */
  1173. "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F", /* Gy */
  1174. ecc_oid_secp384r1, ecc_oid_secp384r1_sz, /* oid/oidSz */
  1175. ECC_SECP384R1_OID, /* oid sum */
  1176. 1, /* cofactor */
  1177. },
  1178. #endif /* !NO_ECC_SECP */
  1179. #ifdef HAVE_ECC_BRAINPOOL
  1180. {
  1181. 48, /* size/bytes */
  1182. ECC_BRAINPOOLP384R1, /* ID */
  1183. "BRAINPOOLP384R1", /* curve name */
  1184. "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53", /* prime */
  1185. "7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826", /* A */
  1186. "04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11", /* B */
  1187. "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565", /* order */
  1188. "1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E", /* Gx */
  1189. "8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315", /* Gy */
  1190. ecc_oid_brainpoolp384r1, ecc_oid_brainpoolp384r1_sz, /* oid/oidSz */
  1191. ECC_BRAINPOOLP384R1_OID, /* oid sum */
  1192. 1, /* cofactor */
  1193. },
  1194. #endif /* HAVE_ECC_BRAINPOOL */
  1195. #endif /* ECC384 */
  1196. #ifdef ECC512
  1197. #ifdef HAVE_ECC_BRAINPOOL
  1198. {
  1199. 64, /* size/bytes */
  1200. ECC_BRAINPOOLP512R1, /* ID */
  1201. "BRAINPOOLP512R1", /* curve name */
  1202. "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3", /* prime */
  1203. "7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA", /* A */
  1204. "3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723", /* B */
  1205. "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069", /* order */
  1206. "81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822", /* Gx */
  1207. "7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892", /* Gy */
  1208. ecc_oid_brainpoolp512r1, ecc_oid_brainpoolp512r1_sz, /* oid/oidSz */
  1209. ECC_BRAINPOOLP512R1_OID, /* oid sum */
  1210. 1, /* cofactor */
  1211. },
  1212. #endif /* HAVE_ECC_BRAINPOOL */
  1213. #endif /* ECC512 */
  1214. #ifdef ECC521
  1215. #ifndef NO_ECC_SECP
  1216. {
  1217. 66, /* size/bytes */
  1218. ECC_SECP521R1, /* ID */
  1219. "SECP521R1", /* curve name */
  1220. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  1221. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", /* A */
  1222. "51953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", /* B */
  1223. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", /* order */
  1224. "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", /* Gx */
  1225. "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650", /* Gy */
  1226. ecc_oid_secp521r1, ecc_oid_secp521r1_sz, /* oid/oidSz */
  1227. ECC_SECP521R1_OID, /* oid sum */
  1228. 1, /* cofactor */
  1229. },
  1230. #endif /* !NO_ECC_SECP */
  1231. #endif /* ECC521 */
  1232. #ifdef WOLFCRYPT_HAVE_SAKKE
  1233. {
  1234. 128,
  1235. ECC_SAKKE_1,
  1236. "SAKKE1",
  1237. "997ABB1F0A563FDA65C61198DAD0657A416C0CE19CB48261BE9AE358B3E01A2EF40AAB27E2FC0F1B228730D531A59CB0E791B39FF7C88A19356D27F4A666A6D0E26C6487326B4CD4512AC5CD65681CE1B6AFF4A831852A82A7CF3C521C3C09AA9F94D6AF56971F1FFCE3E82389857DB080C5DF10AC7ACE87666D807AFEA85FEB",
  1238. "997ABB1F0A563FDA65C61198DAD0657A416C0CE19CB48261BE9AE358B3E01A2EF40AAB27E2FC0F1B228730D531A59CB0E791B39FF7C88A19356D27F4A666A6D0E26C6487326B4CD4512AC5CD65681CE1B6AFF4A831852A82A7CF3C521C3C09AA9F94D6AF56971F1FFCE3E82389857DB080C5DF10AC7ACE87666D807AFEA85FE8",
  1239. "0",
  1240. "265EAEC7C2958FF69971846636B4195E905B0338672D20986FA6B8D62CF8068BBD02AAC9F8BF03C6C8A1CC354C69672C39E46CE7FDF222864D5B49FD2999A9B4389B1921CC9AD335144AB173595A07386DABFD2A0C614AA0A9F3CF14870F026AA7E535ABD5A5C7C7FF38FA08E2615F6C203177C42B1EB3A1D99B601EBFAA17FB",
  1241. "53FC09EE332C29AD0A7990053ED9B52A2B1A2FD60AEC69C698B2F204B6FF7CBFB5EDB6C0F6CE2308AB10DB9030B09E1043D5F22CDB9DFA55718BD9E7406CE8909760AF765DD5BCCB337C86548B72F2E1A702C3397A60DE74A7C1514DBA66910DD5CFB4CC80728D87EE9163A5B63F73EC80EC46C4967E0979880DC8ABEAE63895",
  1242. "0A8249063F6009F1F9F1F0533634A135D3E82016029906963D778D821E141178F5EA69F4654EC2B9E7F7F5E5F0DE55F66B598CCF9A140B2E416CFF0CA9E032B970DAE117AD547C6CCAD696B5B7652FE0AC6F1E80164AA989492D979FC5A4D5F213515AD7E9CB99A980BDAD5AD5BB4636ADB9B5706A67DCDE75573FD71BEF16D7",
  1243. #ifndef WOLFSSL_ECC_CURVE_STATIC
  1244. NULL, 0,
  1245. #else
  1246. {0}, 0,
  1247. #endif
  1248. 0,
  1249. 4,
  1250. },
  1251. #endif
  1252. #if defined(WOLFSSL_CUSTOM_CURVES) && defined(ECC_CACHE_CURVE)
  1253. /* place holder for custom curve index for cache */
  1254. {
  1255. 1, /* non-zero */
  1256. ECC_CURVE_CUSTOM,
  1257. #ifndef WOLFSSL_ECC_CURVE_STATIC
  1258. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  1259. #else
  1260. {0},{0},{0},{0},{0},{0},{0},{0},
  1261. #endif
  1262. 0, 0, 0
  1263. },
  1264. #endif
  1265. {
  1266. 0,
  1267. ECC_CURVE_INVALID,
  1268. #ifndef WOLFSSL_ECC_CURVE_STATIC
  1269. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  1270. #else
  1271. {0},{0},{0},{0},{0},{0},{0},{0},
  1272. #endif
  1273. 0, 0, 0
  1274. }
  1275. };
  1276. #define ECC_SET_COUNT (sizeof(ecc_sets)/sizeof(ecc_set_type))
  1277. const size_t ecc_sets_count = ECC_SET_COUNT - 1;
  1278. #ifdef HAVE_OID_ENCODING
  1279. /* encoded OID cache */
  1280. typedef struct {
  1281. word32 oidSz;
  1282. byte oid[ECC_MAX_OID_LEN];
  1283. } oid_cache_t;
  1284. static oid_cache_t ecc_oid_cache[ECC_SET_COUNT];
  1285. #endif
  1286. /* Forward declarations */
  1287. #if defined(HAVE_COMP_KEY) && defined(HAVE_ECC_KEY_EXPORT)
  1288. static int wc_ecc_export_x963_compressed(ecc_key* key, byte* out, word32* outLen);
  1289. #endif
  1290. #ifdef HAVE_ECC_CHECK_PUBKEY_ORDER
  1291. static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
  1292. mp_int* prime, mp_int* order);
  1293. #endif
  1294. static int _ecc_validate_public_key(ecc_key* key, int partial, int priv);
  1295. #if (FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_ECC_KEYGEN)) && \
  1296. !defined(WOLFSSL_KCAPI_ECC)
  1297. static int _ecc_pairwise_consistency_test(ecc_key* key, WC_RNG* rng);
  1298. #endif
  1299. #ifdef HAVE_COMP_KEY
  1300. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  1301. !defined(WOLFSSL_CRYPTOCELL)
  1302. #ifndef WOLFSSL_SP_MATH
  1303. #if !defined(SQRTMOD_USE_MOD_EXP)
  1304. static int mp_jacobi(mp_int* a, mp_int* n, int* c);
  1305. #endif
  1306. static int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret);
  1307. #endif
  1308. #endif
  1309. #endif
  1310. /* Curve Specs */
  1311. typedef struct ecc_curve_spec {
  1312. const ecc_set_type* dp;
  1313. mp_int* prime;
  1314. mp_int* Af;
  1315. #ifdef USE_ECC_B_PARAM
  1316. mp_int* Bf;
  1317. #endif
  1318. mp_int* order;
  1319. mp_int* Gx;
  1320. mp_int* Gy;
  1321. #ifdef ECC_CACHE_CURVE
  1322. mp_int prime_lcl;
  1323. mp_int Af_lcl;
  1324. #ifdef USE_ECC_B_PARAM
  1325. mp_int Bf_lcl;
  1326. #endif
  1327. mp_int order_lcl;
  1328. mp_int Gx_lcl;
  1329. mp_int Gy_lcl;
  1330. #else
  1331. #ifdef WOLFSSL_SP_MATH_ALL
  1332. unsigned char* spec_ints;
  1333. #else
  1334. mp_int* spec_ints;
  1335. #endif
  1336. word32 spec_count;
  1337. word32 spec_use;
  1338. #endif
  1339. byte load_mask;
  1340. } ecc_curve_spec;
  1341. #define ECC_CURVE_FIELD_NONE 0x00
  1342. #define ECC_CURVE_FIELD_PRIME 0x01
  1343. #define ECC_CURVE_FIELD_AF 0x02
  1344. #ifdef USE_ECC_B_PARAM
  1345. #define ECC_CURVE_FIELD_BF 0x04
  1346. #endif
  1347. #define ECC_CURVE_FIELD_ORDER 0x08
  1348. #define ECC_CURVE_FIELD_GX 0x10
  1349. #define ECC_CURVE_FIELD_GY 0x20
  1350. #ifdef USE_ECC_B_PARAM
  1351. #define ECC_CURVE_FIELD_ALL 0x3F
  1352. #define ECC_CURVE_FIELD_COUNT 6
  1353. #else
  1354. #define ECC_CURVE_FIELD_ALL 0x3B
  1355. #define ECC_CURVE_FIELD_COUNT 5
  1356. #endif
  1357. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  1358. static const u32 xil_curve_type[ECC_CURVE_MAX] = {
  1359. [ECC_SECP384R1] = WOLFSSL_XSECURE_ECC_NIST_P384,
  1360. [ECC_SECP521R1] = WOLFSSL_XSECURE_ECC_NIST_P521,
  1361. };
  1362. static void buf_reverse(byte *outbuf, const byte *inbuf, word32 len)
  1363. {
  1364. word32 up, down;
  1365. up = 0;
  1366. down = len - 1;
  1367. while (up < len)
  1368. outbuf[up++] = inbuf[down--];
  1369. }
  1370. static int xil_mpi_import(mp_int *mpi,
  1371. const byte *inbuf,
  1372. word32 len,
  1373. void* heap)
  1374. {
  1375. int err;
  1376. #ifdef WOLFSSL_SMALL_STACK
  1377. byte* buf = NULL;
  1378. #else
  1379. byte buf[MAX_ECC_BYTES];
  1380. if (len > MAX_ECC_BYTES)
  1381. return BUFFER_E;
  1382. #endif
  1383. #ifdef WOLFSSL_SMALL_STACK
  1384. buf = (byte*)XMALLOC(len, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  1385. if (buf == NULL)
  1386. return MEMORY_E;
  1387. #endif
  1388. buf_reverse(buf, inbuf, len);
  1389. err = mp_read_unsigned_bin(mpi, buf, len);
  1390. ForceZero(buf, len);
  1391. #ifdef WOLFSSL_SMALL_STACK
  1392. XFREE(buf, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  1393. #endif
  1394. return err;
  1395. }
  1396. #endif
  1397. #ifdef ECC_CACHE_CURVE
  1398. /* cache (mp_int) of the curve parameters */
  1399. static ecc_curve_spec* ecc_curve_spec_cache[ECC_SET_COUNT];
  1400. #ifndef SINGLE_THREADED
  1401. static wolfSSL_Mutex ecc_curve_cache_mutex;
  1402. #endif
  1403. #define DECLARE_CURVE_SPECS(intcount) ecc_curve_spec* curve = NULL
  1404. #define ALLOC_CURVE_SPECS(intcount, err) WC_DO_NOTHING
  1405. #define FREE_CURVE_SPECS() WC_DO_NOTHING
  1406. #elif defined(WOLFSSL_SMALL_STACK)
  1407. #ifdef WOLFSSL_SP_MATH_ALL
  1408. #define DECLARE_CURVE_SPECS(intcount) \
  1409. unsigned char* spec_ints = NULL; \
  1410. ecc_curve_spec curve_lcl; \
  1411. ecc_curve_spec* curve = &curve_lcl; \
  1412. XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \
  1413. curve->spec_count = intcount
  1414. #define ALLOC_CURVE_SPECS(intcount, err) \
  1415. spec_ints = (unsigned char*)XMALLOC(MP_INT_SIZEOF(MP_BITS_CNT( \
  1416. MAX_ECC_BITS_USE)) * (intcount), NULL, \
  1417. DYNAMIC_TYPE_ECC); \
  1418. if (spec_ints == NULL) \
  1419. (err) = MEMORY_E; \
  1420. else \
  1421. curve->spec_ints = spec_ints
  1422. #else
  1423. #define DECLARE_CURVE_SPECS(intcount) \
  1424. mp_int* spec_ints = NULL; \
  1425. ecc_curve_spec curve_lcl; \
  1426. ecc_curve_spec* curve = &curve_lcl; \
  1427. XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \
  1428. curve->spec_count = intcount
  1429. #define ALLOC_CURVE_SPECS(intcount, err) \
  1430. spec_ints = (mp_int*)XMALLOC(sizeof(mp_int) * (intcount), NULL, \
  1431. DYNAMIC_TYPE_ECC); \
  1432. if (spec_ints == NULL) \
  1433. (err) = MEMORY_E; \
  1434. else \
  1435. curve->spec_ints = spec_ints
  1436. #endif
  1437. #define FREE_CURVE_SPECS() \
  1438. XFREE(spec_ints, NULL, DYNAMIC_TYPE_ECC)
  1439. #else
  1440. #ifdef WOLFSSL_SP_MATH_ALL
  1441. #define DECLARE_CURVE_SPECS(intcount) \
  1442. unsigned char spec_ints[MP_INT_SIZEOF(MP_BITS_CNT( \
  1443. MAX_ECC_BITS_USE)) * (intcount)]; \
  1444. ecc_curve_spec curve_lcl; \
  1445. ecc_curve_spec* curve = &curve_lcl; \
  1446. XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \
  1447. curve->spec_ints = spec_ints; \
  1448. curve->spec_count = (intcount)
  1449. #else
  1450. #define DECLARE_CURVE_SPECS(intcount) \
  1451. mp_int spec_ints[(intcount)]; \
  1452. ecc_curve_spec curve_lcl; \
  1453. ecc_curve_spec* curve = &curve_lcl; \
  1454. XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \
  1455. curve->spec_ints = spec_ints; \
  1456. curve->spec_count = (intcount)
  1457. #endif
  1458. #define ALLOC_CURVE_SPECS(intcount, err) WC_DO_NOTHING
  1459. #define FREE_CURVE_SPECS() WC_DO_NOTHING
  1460. #endif /* ECC_CACHE_CURVE */
  1461. static void wc_ecc_curve_cache_free_spec_item(ecc_curve_spec* curve, mp_int* item,
  1462. byte mask)
  1463. {
  1464. if (item) {
  1465. #ifdef HAVE_WOLF_BIGINT
  1466. wc_bigint_free(&item->raw);
  1467. #endif
  1468. mp_clear(item);
  1469. }
  1470. curve->load_mask &= ~mask;
  1471. }
  1472. static void wc_ecc_curve_cache_free_spec(ecc_curve_spec* curve)
  1473. {
  1474. if (curve == NULL) {
  1475. return;
  1476. }
  1477. if (curve->load_mask & ECC_CURVE_FIELD_PRIME)
  1478. wc_ecc_curve_cache_free_spec_item(curve, curve->prime, ECC_CURVE_FIELD_PRIME);
  1479. if (curve->load_mask & ECC_CURVE_FIELD_AF)
  1480. wc_ecc_curve_cache_free_spec_item(curve, curve->Af, ECC_CURVE_FIELD_AF);
  1481. #ifdef USE_ECC_B_PARAM
  1482. if (curve->load_mask & ECC_CURVE_FIELD_BF)
  1483. wc_ecc_curve_cache_free_spec_item(curve, curve->Bf, ECC_CURVE_FIELD_BF);
  1484. #endif
  1485. if (curve->load_mask & ECC_CURVE_FIELD_ORDER)
  1486. wc_ecc_curve_cache_free_spec_item(curve, curve->order, ECC_CURVE_FIELD_ORDER);
  1487. if (curve->load_mask & ECC_CURVE_FIELD_GX)
  1488. wc_ecc_curve_cache_free_spec_item(curve, curve->Gx, ECC_CURVE_FIELD_GX);
  1489. if (curve->load_mask & ECC_CURVE_FIELD_GY)
  1490. wc_ecc_curve_cache_free_spec_item(curve, curve->Gy, ECC_CURVE_FIELD_GY);
  1491. curve->load_mask = 0;
  1492. }
  1493. static void wc_ecc_curve_free(ecc_curve_spec* curve)
  1494. {
  1495. if (curve) {
  1496. #ifdef ECC_CACHE_CURVE
  1497. #ifdef WOLFSSL_CUSTOM_CURVES
  1498. /* only free custom curves (rest are globally cached) */
  1499. if (curve->dp && curve->dp->id == ECC_CURVE_CUSTOM) {
  1500. wc_ecc_curve_cache_free_spec(curve);
  1501. XFREE(curve, NULL, DYNAMIC_TYPE_ECC);
  1502. }
  1503. #endif
  1504. #else
  1505. wc_ecc_curve_cache_free_spec(curve);
  1506. #endif
  1507. }
  1508. }
  1509. static int wc_ecc_curve_cache_load_item(ecc_curve_spec* curve, const char* src,
  1510. mp_int** dst, byte mask)
  1511. {
  1512. int err;
  1513. #ifndef ECC_CACHE_CURVE
  1514. /* get mp_int from temp */
  1515. if (curve->spec_use >= curve->spec_count) {
  1516. WOLFSSL_MSG("Invalid DECLARE_CURVE_SPECS count");
  1517. return ECC_BAD_ARG_E;
  1518. }
  1519. #ifdef WOLFSSL_SP_MATH_ALL
  1520. *dst = (mp_int*)(curve->spec_ints + MP_INT_SIZEOF(MP_BITS_CNT(
  1521. MAX_ECC_BITS_USE)) * curve->spec_use++);
  1522. #else
  1523. *dst = &curve->spec_ints[curve->spec_use++];
  1524. #endif
  1525. #endif
  1526. #ifdef WOLFSSL_SP_MATH_ALL
  1527. err = mp_init_size(*dst, MP_BITS_CNT(MAX_ECC_BITS_USE));
  1528. #else
  1529. err = mp_init(*dst);
  1530. #endif
  1531. if (err == MP_OKAY) {
  1532. curve->load_mask |= mask;
  1533. err = mp_read_radix(*dst, src, MP_RADIX_HEX);
  1534. #ifdef HAVE_WOLF_BIGINT
  1535. if (err == MP_OKAY)
  1536. err = wc_mp_to_bigint(*dst, &(*dst)->raw);
  1537. #endif
  1538. }
  1539. return err;
  1540. }
  1541. static int wc_ecc_curve_load(const ecc_set_type* dp, ecc_curve_spec** pCurve,
  1542. byte load_mask)
  1543. {
  1544. int ret = 0;
  1545. ecc_curve_spec* curve;
  1546. byte load_items = 0; /* mask of items to load */
  1547. #ifdef ECC_CACHE_CURVE
  1548. int x;
  1549. #endif
  1550. if (dp == NULL || pCurve == NULL)
  1551. return BAD_FUNC_ARG;
  1552. #ifdef ECC_CACHE_CURVE
  1553. x = wc_ecc_get_curve_idx(dp->id);
  1554. if (x == ECC_CURVE_INVALID)
  1555. return ECC_BAD_ARG_E;
  1556. #if !defined(SINGLE_THREADED)
  1557. ret = wc_LockMutex(&ecc_curve_cache_mutex);
  1558. if (ret != 0) {
  1559. return ret;
  1560. }
  1561. #endif
  1562. /* make sure cache has been allocated */
  1563. if (ecc_curve_spec_cache[x] == NULL
  1564. #ifdef WOLFSSL_CUSTOM_CURVES
  1565. || dp->id == ECC_CURVE_CUSTOM
  1566. #endif
  1567. ) {
  1568. curve = (ecc_curve_spec*)XMALLOC(sizeof(ecc_curve_spec), NULL, DYNAMIC_TYPE_ECC);
  1569. if (curve == NULL) {
  1570. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1571. wc_UnLockMutex(&ecc_curve_cache_mutex);
  1572. #endif
  1573. return MEMORY_E;
  1574. }
  1575. XMEMSET(curve, 0, sizeof(ecc_curve_spec));
  1576. /* set curve pointer to cache */
  1577. #ifdef WOLFSSL_CUSTOM_CURVES
  1578. if (dp->id != ECC_CURVE_CUSTOM)
  1579. #endif
  1580. {
  1581. ecc_curve_spec_cache[x] = curve;
  1582. }
  1583. }
  1584. else {
  1585. curve = ecc_curve_spec_cache[x];
  1586. }
  1587. /* return new or cached curve */
  1588. *pCurve = curve;
  1589. #else
  1590. curve = *pCurve;
  1591. #endif /* ECC_CACHE_CURVE */
  1592. /* make sure the curve is initialized */
  1593. if (curve->dp != dp) {
  1594. curve->load_mask = 0;
  1595. #ifdef ECC_CACHE_CURVE
  1596. curve->prime = &curve->prime_lcl;
  1597. curve->Af = &curve->Af_lcl;
  1598. #ifdef USE_ECC_B_PARAM
  1599. curve->Bf = &curve->Bf_lcl;
  1600. #endif
  1601. curve->order = &curve->order_lcl;
  1602. curve->Gx = &curve->Gx_lcl;
  1603. curve->Gy = &curve->Gy_lcl;
  1604. #endif
  1605. }
  1606. curve->dp = dp; /* set dp info */
  1607. /* determine items to load */
  1608. load_items = (byte)(((byte)~(word32)curve->load_mask) & load_mask);
  1609. curve->load_mask |= load_items;
  1610. /* load items */
  1611. if (load_items & ECC_CURVE_FIELD_PRIME)
  1612. ret += wc_ecc_curve_cache_load_item(curve, dp->prime, &curve->prime,
  1613. ECC_CURVE_FIELD_PRIME);
  1614. if (load_items & ECC_CURVE_FIELD_AF)
  1615. ret += wc_ecc_curve_cache_load_item(curve, dp->Af, &curve->Af,
  1616. ECC_CURVE_FIELD_AF);
  1617. #ifdef USE_ECC_B_PARAM
  1618. if (load_items & ECC_CURVE_FIELD_BF)
  1619. ret += wc_ecc_curve_cache_load_item(curve, dp->Bf, &curve->Bf,
  1620. ECC_CURVE_FIELD_BF);
  1621. #endif
  1622. if (load_items & ECC_CURVE_FIELD_ORDER)
  1623. ret += wc_ecc_curve_cache_load_item(curve, dp->order, &curve->order,
  1624. ECC_CURVE_FIELD_ORDER);
  1625. if (load_items & ECC_CURVE_FIELD_GX)
  1626. ret += wc_ecc_curve_cache_load_item(curve, dp->Gx, &curve->Gx,
  1627. ECC_CURVE_FIELD_GX);
  1628. if (load_items & ECC_CURVE_FIELD_GY)
  1629. ret += wc_ecc_curve_cache_load_item(curve, dp->Gy, &curve->Gy,
  1630. ECC_CURVE_FIELD_GY);
  1631. /* check for error */
  1632. if (ret != 0) {
  1633. wc_ecc_curve_free(curve);
  1634. ret = MP_READ_E;
  1635. }
  1636. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1637. wc_UnLockMutex(&ecc_curve_cache_mutex);
  1638. #endif
  1639. return ret;
  1640. }
  1641. #ifdef ECC_CACHE_CURVE
  1642. int wc_ecc_curve_cache_init(void)
  1643. {
  1644. int ret = 0;
  1645. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1646. ret = wc_InitMutex(&ecc_curve_cache_mutex);
  1647. #endif
  1648. return ret;
  1649. }
  1650. void wc_ecc_curve_cache_free(void)
  1651. {
  1652. int x;
  1653. /* free all ECC curve caches */
  1654. for (x = 0; x < (int)ECC_SET_COUNT; x++) {
  1655. if (ecc_curve_spec_cache[x]) {
  1656. wc_ecc_curve_cache_free_spec(ecc_curve_spec_cache[x]);
  1657. XFREE(ecc_curve_spec_cache[x], NULL, DYNAMIC_TYPE_ECC);
  1658. ecc_curve_spec_cache[x] = NULL;
  1659. }
  1660. }
  1661. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1662. wc_FreeMutex(&ecc_curve_cache_mutex);
  1663. #endif
  1664. }
  1665. #endif /* ECC_CACHE_CURVE */
  1666. /* Retrieve the curve name for the ECC curve id.
  1667. *
  1668. * curve_id The id of the curve.
  1669. * returns the name stored from the curve if available, otherwise NULL.
  1670. */
  1671. const char* wc_ecc_get_name(int curve_id)
  1672. {
  1673. int curve_idx = wc_ecc_get_curve_idx(curve_id);
  1674. if (curve_idx == ECC_CURVE_INVALID)
  1675. return NULL;
  1676. return ecc_sets[curve_idx].name;
  1677. }
  1678. int wc_ecc_set_curve(ecc_key* key, int keysize, int curve_id)
  1679. {
  1680. if (key == NULL || (keysize <= 0 && curve_id < 0)) {
  1681. return BAD_FUNC_ARG;
  1682. }
  1683. if (keysize > ECC_MAXSIZE) {
  1684. return ECC_BAD_ARG_E;
  1685. }
  1686. /* handle custom case */
  1687. if (key->idx != ECC_CUSTOM_IDX) {
  1688. int x;
  1689. /* default values */
  1690. key->idx = 0;
  1691. key->dp = NULL;
  1692. /* find ecc_set based on curve_id or key size */
  1693. for (x = 0; ecc_sets[x].size != 0; x++) {
  1694. if (curve_id > ECC_CURVE_DEF) {
  1695. if (curve_id == ecc_sets[x].id)
  1696. break;
  1697. }
  1698. else if (keysize <= ecc_sets[x].size) {
  1699. break;
  1700. }
  1701. }
  1702. if (ecc_sets[x].size == 0) {
  1703. WOLFSSL_MSG("ECC Curve not found");
  1704. return ECC_CURVE_OID_E;
  1705. }
  1706. key->idx = x;
  1707. key->dp = &ecc_sets[x];
  1708. }
  1709. return 0;
  1710. }
  1711. #ifdef ALT_ECC_SIZE
  1712. static void alt_fp_init(mp_int* a)
  1713. {
  1714. a->size = FP_SIZE_ECC;
  1715. mp_zero(a);
  1716. }
  1717. #endif /* ALT_ECC_SIZE */
  1718. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  1719. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  1720. #if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_PUBLIC_ECC_ADD_DBL)
  1721. static int _ecc_projective_dbl_point(ecc_point *P, ecc_point *R, mp_int* a,
  1722. mp_int* modulus, mp_digit mp);
  1723. /**
  1724. Add two ECC points
  1725. P The point to add
  1726. Q The point to add
  1727. R [out] The destination of the double
  1728. a ECC curve parameter a
  1729. modulus The modulus of the field the ECC curve is in
  1730. mp The "b" value from montgomery_setup()
  1731. return MP_OKAY on success
  1732. */
  1733. static int _ecc_projective_add_point(ecc_point* P, ecc_point* Q, ecc_point* R,
  1734. mp_int* a, mp_int* modulus, mp_digit mp)
  1735. {
  1736. #if !defined(WOLFSSL_SP_MATH)
  1737. DECL_MP_INT_SIZE_DYN(t1, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  1738. DECL_MP_INT_SIZE_DYN(t2, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  1739. #ifdef ALT_ECC_SIZE
  1740. DECL_MP_INT_SIZE_DYN(rx, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  1741. DECL_MP_INT_SIZE_DYN(ry, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  1742. DECL_MP_INT_SIZE_DYN(rz, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  1743. #endif
  1744. mp_int *x, *y, *z;
  1745. int err;
  1746. /* if Q == R then swap P and Q, so we don't require a local x,y,z */
  1747. if (Q == R) {
  1748. ecc_point* tPt = P;
  1749. P = Q;
  1750. Q = tPt;
  1751. }
  1752. #ifdef WOLFSSL_SMALL_STACK
  1753. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1754. if (R->key != NULL) {
  1755. t1 = R->key->t1;
  1756. t2 = R->key->t2;
  1757. #ifdef ALT_ECC_SIZE
  1758. rx = R->key->x;
  1759. ry = R->key->y;
  1760. rz = R->key->z;
  1761. #endif
  1762. }
  1763. else
  1764. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  1765. #endif /* WOLFSSL_SMALL_STACK */
  1766. {
  1767. NEW_MP_INT_SIZE(t1, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  1768. NEW_MP_INT_SIZE(t2, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  1769. #ifdef MP_INT_SIZE_CHECK_NULL
  1770. if (t1 == NULL || t2 == NULL) {
  1771. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  1772. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  1773. return MEMORY_E;
  1774. }
  1775. #endif
  1776. #ifdef ALT_ECC_SIZE
  1777. NEW_MP_INT_SIZE(rx, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  1778. NEW_MP_INT_SIZE(ry, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  1779. NEW_MP_INT_SIZE(rz, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  1780. #ifdef MP_INT_SIZE_CHECK_NULL
  1781. if (rx == NULL || ry == NULL || rz == NULL) {
  1782. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  1783. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  1784. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  1785. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  1786. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  1787. return MEMORY_E;
  1788. }
  1789. #endif
  1790. #endif
  1791. }
  1792. err = INIT_MP_INT_SIZE(t1, mp_bitsused(modulus));
  1793. if (err == MP_OKAY) {
  1794. err = INIT_MP_INT_SIZE(t2, mp_bitsused(modulus));
  1795. }
  1796. if (err != MP_OKAY) {
  1797. #ifdef WOLFSSL_SMALL_STACK
  1798. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1799. if (R->key == NULL)
  1800. #endif
  1801. #endif
  1802. {
  1803. #ifdef ALT_ECC_SIZE
  1804. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  1805. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  1806. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  1807. #endif
  1808. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  1809. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  1810. }
  1811. return err;
  1812. }
  1813. /* should we dbl instead? */
  1814. if (err == MP_OKAY) {
  1815. #ifdef ECC_TIMING_RESISTANT
  1816. err = mp_submod_ct(modulus, Q->y, modulus, t1);
  1817. #else
  1818. err = mp_sub(modulus, Q->y, t1);
  1819. #endif
  1820. }
  1821. if (err == MP_OKAY) {
  1822. if ( (mp_cmp(P->x, Q->x) == MP_EQ) &&
  1823. (get_digit_count(Q->z) && mp_cmp(P->z, Q->z) == MP_EQ) &&
  1824. (mp_cmp(P->y, Q->y) == MP_EQ || mp_cmp(P->y, t1) == MP_EQ)) {
  1825. mp_clear(t1);
  1826. mp_clear(t2);
  1827. #ifdef WOLFSSL_SMALL_STACK
  1828. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1829. if (R->key == NULL)
  1830. #endif
  1831. #endif
  1832. {
  1833. #ifdef ALT_ECC_SIZE
  1834. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  1835. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  1836. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  1837. #endif
  1838. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  1839. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  1840. }
  1841. return _ecc_projective_dbl_point(P, R, a, modulus, mp);
  1842. }
  1843. }
  1844. if (err != MP_OKAY) {
  1845. goto done;
  1846. }
  1847. /* If use ALT_ECC_SIZE we need to use local stack variable since
  1848. ecc_point x,y,z is reduced size */
  1849. #ifdef ALT_ECC_SIZE
  1850. /* Use local stack variable */
  1851. x = rx;
  1852. y = ry;
  1853. z = rz;
  1854. err = INIT_MP_INT_SIZE(x, mp_bitsused(modulus));
  1855. if (err == MP_OKAY) {
  1856. err = INIT_MP_INT_SIZE(y, mp_bitsused(modulus));
  1857. }
  1858. if (err == MP_OKAY) {
  1859. err = INIT_MP_INT_SIZE(z, mp_bitsused(modulus));
  1860. }
  1861. if (err != MP_OKAY) {
  1862. goto done;
  1863. }
  1864. #else
  1865. /* Use destination directly */
  1866. x = R->x;
  1867. y = R->y;
  1868. z = R->z;
  1869. #endif
  1870. if (err == MP_OKAY)
  1871. err = mp_copy(P->x, x);
  1872. if (err == MP_OKAY)
  1873. err = mp_copy(P->y, y);
  1874. if (err == MP_OKAY)
  1875. err = mp_copy(P->z, z);
  1876. /* if Z is one then these are no-operations */
  1877. if (err == MP_OKAY) {
  1878. if (!mp_iszero(Q->z)) {
  1879. /* T1 = Z' * Z' */
  1880. err = mp_sqr(Q->z, t1);
  1881. if (err == MP_OKAY)
  1882. err = mp_montgomery_reduce(t1, modulus, mp);
  1883. /* X = X * T1 */
  1884. if (err == MP_OKAY)
  1885. err = mp_mul(t1, x, x);
  1886. if (err == MP_OKAY)
  1887. err = mp_montgomery_reduce(x, modulus, mp);
  1888. /* T1 = Z' * T1 */
  1889. if (err == MP_OKAY)
  1890. err = mp_mul(Q->z, t1, t1);
  1891. if (err == MP_OKAY)
  1892. err = mp_montgomery_reduce(t1, modulus, mp);
  1893. /* Y = Y * T1 */
  1894. if (err == MP_OKAY)
  1895. err = mp_mul(t1, y, y);
  1896. if (err == MP_OKAY)
  1897. err = mp_montgomery_reduce(y, modulus, mp);
  1898. }
  1899. }
  1900. /* T1 = Z*Z */
  1901. if (err == MP_OKAY)
  1902. err = mp_sqr(z, t1);
  1903. if (err == MP_OKAY)
  1904. err = mp_montgomery_reduce(t1, modulus, mp);
  1905. /* T2 = X' * T1 */
  1906. if (err == MP_OKAY)
  1907. err = mp_mul(Q->x, t1, t2);
  1908. if (err == MP_OKAY)
  1909. err = mp_montgomery_reduce(t2, modulus, mp);
  1910. /* T1 = Z * T1 */
  1911. if (err == MP_OKAY)
  1912. err = mp_mul(z, t1, t1);
  1913. if (err == MP_OKAY)
  1914. err = mp_montgomery_reduce(t1, modulus, mp);
  1915. /* T1 = Y' * T1 */
  1916. if (err == MP_OKAY)
  1917. err = mp_mul(Q->y, t1, t1);
  1918. if (err == MP_OKAY)
  1919. err = mp_montgomery_reduce(t1, modulus, mp);
  1920. /* Y = Y - T1 */
  1921. if (err == MP_OKAY)
  1922. err = mp_submod_ct(y, t1, modulus, y);
  1923. /* T1 = 2T1 */
  1924. if (err == MP_OKAY)
  1925. err = mp_addmod_ct(t1, t1, modulus, t1);
  1926. /* T1 = Y + T1 */
  1927. if (err == MP_OKAY)
  1928. err = mp_addmod_ct(t1, y, modulus, t1);
  1929. /* X = X - T2 */
  1930. if (err == MP_OKAY)
  1931. err = mp_submod_ct(x, t2, modulus, x);
  1932. /* T2 = 2T2 */
  1933. if (err == MP_OKAY)
  1934. err = mp_addmod_ct(t2, t2, modulus, t2);
  1935. /* T2 = X + T2 */
  1936. if (err == MP_OKAY)
  1937. err = mp_addmod_ct(t2, x, modulus, t2);
  1938. if (err == MP_OKAY) {
  1939. if (!mp_iszero(Q->z)) {
  1940. /* Z = Z * Z' */
  1941. err = mp_mul(z, Q->z, z);
  1942. if (err == MP_OKAY)
  1943. err = mp_montgomery_reduce(z, modulus, mp);
  1944. }
  1945. }
  1946. /* Z = Z * X */
  1947. if (err == MP_OKAY)
  1948. err = mp_mul(z, x, z);
  1949. if (err == MP_OKAY)
  1950. err = mp_montgomery_reduce(z, modulus, mp);
  1951. /* T1 = T1 * X */
  1952. if (err == MP_OKAY)
  1953. err = mp_mul(t1, x, t1);
  1954. if (err == MP_OKAY)
  1955. err = mp_montgomery_reduce(t1, modulus, mp);
  1956. /* X = X * X */
  1957. if (err == MP_OKAY)
  1958. err = mp_sqr(x, x);
  1959. if (err == MP_OKAY)
  1960. err = mp_montgomery_reduce(x, modulus, mp);
  1961. /* T2 = T2 * x */
  1962. if (err == MP_OKAY)
  1963. err = mp_mul(t2, x, t2);
  1964. if (err == MP_OKAY)
  1965. err = mp_montgomery_reduce(t2, modulus, mp);
  1966. /* T1 = T1 * X */
  1967. if (err == MP_OKAY)
  1968. err = mp_mul(t1, x, t1);
  1969. if (err == MP_OKAY)
  1970. err = mp_montgomery_reduce(t1, modulus, mp);
  1971. /* X = Y*Y */
  1972. if (err == MP_OKAY)
  1973. err = mp_sqr(y, x);
  1974. if (err == MP_OKAY)
  1975. err = mp_montgomery_reduce(x, modulus, mp);
  1976. /* X = X - T2 */
  1977. if (err == MP_OKAY)
  1978. err = mp_submod_ct(x, t2, modulus, x);
  1979. /* T2 = T2 - X */
  1980. if (err == MP_OKAY)
  1981. err = mp_submod_ct(t2, x, modulus, t2);
  1982. /* T2 = T2 - X */
  1983. if (err == MP_OKAY)
  1984. err = mp_submod_ct(t2, x, modulus, t2);
  1985. /* T2 = T2 * Y */
  1986. if (err == MP_OKAY)
  1987. err = mp_mul(t2, y, t2);
  1988. if (err == MP_OKAY)
  1989. err = mp_montgomery_reduce(t2, modulus, mp);
  1990. /* Y = T2 - T1 */
  1991. if (err == MP_OKAY)
  1992. err = mp_submod_ct(t2, t1, modulus, y);
  1993. /* Y = Y/2 */
  1994. if (err == MP_OKAY)
  1995. err = mp_div_2_mod_ct(y, modulus, y);
  1996. #ifdef ALT_ECC_SIZE
  1997. if (err == MP_OKAY)
  1998. err = mp_copy(x, R->x);
  1999. if (err == MP_OKAY)
  2000. err = mp_copy(y, R->y);
  2001. if (err == MP_OKAY)
  2002. err = mp_copy(z, R->z);
  2003. #endif
  2004. done:
  2005. /* clean up */
  2006. mp_clear(t1);
  2007. mp_clear(t2);
  2008. #ifdef WOLFSSL_SMALL_STACK
  2009. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2010. if (R->key == NULL)
  2011. #endif
  2012. #endif
  2013. {
  2014. #ifdef ALT_ECC_SIZE
  2015. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2016. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2017. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2018. #endif
  2019. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2020. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2021. }
  2022. return err;
  2023. #else
  2024. int modBits = mp_count_bits(modulus);
  2025. (void)a;
  2026. (void)mp;
  2027. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  2028. if ((modBits == 256) && (!mp_is_bit_set(modulus, 224))) {
  2029. return sp_ecc_proj_add_point_sm2_256(P->x, P->y, P->z, Q->x, Q->y, Q->z,
  2030. R->x, R->y, R->z);
  2031. }
  2032. #endif
  2033. #ifndef WOLFSSL_SP_NO_256
  2034. if (modBits == 256) {
  2035. return sp_ecc_proj_add_point_256(P->x, P->y, P->z, Q->x, Q->y, Q->z,
  2036. R->x, R->y, R->z);
  2037. }
  2038. #endif
  2039. #ifdef WOLFSSL_SP_384
  2040. if (modBits == 384) {
  2041. return sp_ecc_proj_add_point_384(P->x, P->y, P->z, Q->x, Q->y, Q->z,
  2042. R->x, R->y, R->z);
  2043. }
  2044. #endif
  2045. #ifdef WOLFSSL_SP_521
  2046. if (modBits == 521) {
  2047. return sp_ecc_proj_add_point_521(P->x, P->y, P->z, Q->x, Q->y, Q->z,
  2048. R->x, R->y, R->z);
  2049. }
  2050. #endif
  2051. return ECC_BAD_ARG_E;
  2052. #endif
  2053. }
  2054. int ecc_projective_add_point(ecc_point* P, ecc_point* Q, ecc_point* R,
  2055. mp_int* a, mp_int* modulus, mp_digit mp)
  2056. {
  2057. if (P == NULL || Q == NULL || R == NULL || modulus == NULL) {
  2058. return ECC_BAD_ARG_E;
  2059. }
  2060. if (mp_cmp(P->x, modulus) != MP_LT ||
  2061. mp_cmp(P->y, modulus) != MP_LT ||
  2062. mp_cmp(P->z, modulus) != MP_LT ||
  2063. mp_cmp(Q->x, modulus) != MP_LT ||
  2064. mp_cmp(Q->y, modulus) != MP_LT ||
  2065. mp_cmp(Q->z, modulus) != MP_LT) {
  2066. return ECC_OUT_OF_RANGE_E;
  2067. }
  2068. return _ecc_projective_add_point(P, Q, R, a, modulus, mp);
  2069. }
  2070. /* ### Point doubling in Jacobian coordinate system ###
  2071. *
  2072. * let us have a curve: y^2 = x^3 + a*x + b
  2073. * in Jacobian coordinates it becomes: y^2 = x^3 + a*x*z^4 + b*z^6
  2074. *
  2075. * The doubling of P = (Xp, Yp, Zp) is given by R = (Xr, Yr, Zr) where:
  2076. * Xr = M^2 - 2*S
  2077. * Yr = M * (S - Xr) - 8*T
  2078. * Zr = 2 * Yp * Zp
  2079. *
  2080. * M = 3 * Xp^2 + a*Zp^4
  2081. * T = Yp^4
  2082. * S = 4 * Xp * Yp^2
  2083. *
  2084. * SPECIAL CASE: when a == 3 we can compute M as
  2085. * M = 3 * (Xp^2 - Zp^4) = 3 * (Xp + Zp^2) * (Xp - Zp^2)
  2086. */
  2087. /**
  2088. Double an ECC point
  2089. P The point to double
  2090. R [out] The destination of the double
  2091. a ECC curve parameter a
  2092. modulus The modulus of the field the ECC curve is in
  2093. mp The "b" value from montgomery_setup()
  2094. return MP_OKAY on success
  2095. */
  2096. static int _ecc_projective_dbl_point(ecc_point *P, ecc_point *R, mp_int* a,
  2097. mp_int* modulus, mp_digit mp)
  2098. {
  2099. #if !defined(WOLFSSL_SP_MATH)
  2100. DECL_MP_INT_SIZE_DYN(t1, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2101. DECL_MP_INT_SIZE_DYN(t2, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2102. #ifdef ALT_ECC_SIZE
  2103. DECL_MP_INT_SIZE_DYN(rx, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2104. DECL_MP_INT_SIZE_DYN(ry, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2105. DECL_MP_INT_SIZE_DYN(rz, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2106. #endif
  2107. mp_int *x, *y, *z;
  2108. int err;
  2109. #ifdef WOLFSSL_SMALL_STACK
  2110. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2111. if (R->key != NULL) {
  2112. t1 = R->key->t1;
  2113. t2 = R->key->t2;
  2114. #ifdef ALT_ECC_SIZE
  2115. rx = R->key->x;
  2116. ry = R->key->y;
  2117. rz = R->key->z;
  2118. #endif
  2119. }
  2120. else
  2121. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  2122. #endif
  2123. {
  2124. NEW_MP_INT_SIZE(t1, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2125. NEW_MP_INT_SIZE(t2, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2126. #ifdef MP_INT_SIZE_CHECK_NULL
  2127. if (t1 == NULL || t2 == NULL) {
  2128. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2129. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2130. return MEMORY_E;
  2131. }
  2132. #endif
  2133. #ifdef ALT_ECC_SIZE
  2134. NEW_MP_INT_SIZE(rx, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2135. NEW_MP_INT_SIZE(ry, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2136. NEW_MP_INT_SIZE(rz, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2137. #ifdef MP_INT_SIZE_CHECK_NULL
  2138. if (rx == NULL || ry == NULL || rz == NULL) {
  2139. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2140. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2141. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2142. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2143. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2144. return MEMORY_E;
  2145. }
  2146. #endif
  2147. #endif
  2148. }
  2149. err = INIT_MP_INT_SIZE(t1, mp_bitsused(modulus));
  2150. if (err == MP_OKAY) {
  2151. err = INIT_MP_INT_SIZE(t2, mp_bitsused(modulus));
  2152. }
  2153. if (err != MP_OKAY) {
  2154. #ifdef WOLFSSL_SMALL_STACK
  2155. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2156. if (R->key == NULL)
  2157. #endif
  2158. #endif
  2159. {
  2160. #ifdef ALT_ECC_SIZE
  2161. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2162. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2163. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2164. #endif
  2165. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2166. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2167. }
  2168. return err;
  2169. }
  2170. /* If use ALT_ECC_SIZE we need to use local stack variable since
  2171. ecc_point x,y,z is reduced size */
  2172. #ifdef ALT_ECC_SIZE
  2173. /* Use local stack variable */
  2174. x = rx;
  2175. y = ry;
  2176. z = rz;
  2177. err = INIT_MP_INT_SIZE(x, mp_bitsused(modulus));
  2178. if (err == MP_OKAY) {
  2179. err = INIT_MP_INT_SIZE(y, mp_bitsused(modulus));
  2180. }
  2181. if (err == MP_OKAY) {
  2182. err = INIT_MP_INT_SIZE(z, mp_bitsused(modulus));
  2183. }
  2184. if (err != MP_OKAY) {
  2185. #ifdef WOLFSSL_SMALL_STACK
  2186. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2187. if (R->key == NULL)
  2188. #endif
  2189. #endif
  2190. {
  2191. #ifdef ALT_ECC_SIZE
  2192. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2193. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2194. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2195. #endif
  2196. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2197. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2198. }
  2199. return err;
  2200. }
  2201. #else
  2202. /* Use destination directly */
  2203. x = R->x;
  2204. y = R->y;
  2205. z = R->z;
  2206. #endif
  2207. if (err == MP_OKAY)
  2208. err = mp_copy(P->x, x);
  2209. if (err == MP_OKAY)
  2210. err = mp_copy(P->y, y);
  2211. if (err == MP_OKAY)
  2212. err = mp_copy(P->z, z);
  2213. /* T1 = Z * Z */
  2214. if (err == MP_OKAY)
  2215. err = mp_sqr(z, t1);
  2216. if (err == MP_OKAY)
  2217. err = mp_montgomery_reduce(t1, modulus, mp);
  2218. /* Z = Y * Z */
  2219. if (err == MP_OKAY)
  2220. err = mp_mul(z, y, z);
  2221. if (err == MP_OKAY)
  2222. err = mp_montgomery_reduce(z, modulus, mp);
  2223. /* Z = 2Z */
  2224. if (err == MP_OKAY)
  2225. err = mp_addmod_ct(z, z, modulus, z);
  2226. /* Determine if curve "a" should be used in calc */
  2227. #ifdef WOLFSSL_CUSTOM_CURVES
  2228. if (err == MP_OKAY) {
  2229. /* Use a and prime to determine if a == 3 */
  2230. err = mp_submod(modulus, a, modulus, t2);
  2231. }
  2232. if (err == MP_OKAY && mp_iszero((MP_INT_SIZE*)t2)) {
  2233. /* T2 = X * X */
  2234. if (err == MP_OKAY)
  2235. err = mp_sqr(x, t2);
  2236. if (err == MP_OKAY)
  2237. err = mp_montgomery_reduce(t2, modulus, mp);
  2238. /* T1 = T2 + T1 */
  2239. if (err == MP_OKAY)
  2240. err = mp_addmod_ct(t2, t2, modulus, t1);
  2241. /* T1 = T2 + T1 */
  2242. if (err == MP_OKAY)
  2243. err = mp_addmod_ct(t1, t2, modulus, t1);
  2244. }
  2245. else if (err == MP_OKAY && mp_cmp_d(t2, 3) != MP_EQ) {
  2246. /* use "a" in calc */
  2247. /* T2 = T1 * T1 */
  2248. if (err == MP_OKAY)
  2249. err = mp_sqr(t1, t2);
  2250. if (err == MP_OKAY)
  2251. err = mp_montgomery_reduce(t2, modulus, mp);
  2252. /* T1 = T2 * a */
  2253. if (err == MP_OKAY)
  2254. err = mp_mulmod(t2, a, modulus, t1);
  2255. /* T2 = X * X */
  2256. if (err == MP_OKAY)
  2257. err = mp_sqr(x, t2);
  2258. if (err == MP_OKAY)
  2259. err = mp_montgomery_reduce(t2, modulus, mp);
  2260. /* T1 = T2 + T1 */
  2261. if (err == MP_OKAY)
  2262. err = mp_addmod_ct(t1, t2, modulus, t1);
  2263. /* T1 = T2 + T1 */
  2264. if (err == MP_OKAY)
  2265. err = mp_addmod_ct(t1, t2, modulus, t1);
  2266. /* T1 = T2 + T1 */
  2267. if (err == MP_OKAY)
  2268. err = mp_addmod_ct(t1, t2, modulus, t1);
  2269. }
  2270. else
  2271. #endif /* WOLFSSL_CUSTOM_CURVES */
  2272. {
  2273. /* assumes "a" == 3 */
  2274. (void)a;
  2275. /* T2 = X - T1 */
  2276. if (err == MP_OKAY)
  2277. err = mp_submod_ct(x, t1, modulus, t2);
  2278. /* T1 = X + T1 */
  2279. if (err == MP_OKAY)
  2280. err = mp_addmod_ct(t1, x, modulus, t1);
  2281. /* T2 = T1 * T2 */
  2282. if (err == MP_OKAY)
  2283. err = mp_mul(t1, t2, t2);
  2284. if (err == MP_OKAY)
  2285. err = mp_montgomery_reduce(t2, modulus, mp);
  2286. /* T1 = 2T2 */
  2287. if (err == MP_OKAY)
  2288. err = mp_addmod_ct(t2, t2, modulus, t1);
  2289. /* T1 = T1 + T2 */
  2290. if (err == MP_OKAY)
  2291. err = mp_addmod_ct(t1, t2, modulus, t1);
  2292. }
  2293. /* Y = 2Y */
  2294. if (err == MP_OKAY)
  2295. err = mp_addmod_ct(y, y, modulus, y);
  2296. /* Y = Y * Y */
  2297. if (err == MP_OKAY)
  2298. err = mp_sqr(y, y);
  2299. if (err == MP_OKAY)
  2300. err = mp_montgomery_reduce(y, modulus, mp);
  2301. /* T2 = Y * Y */
  2302. if (err == MP_OKAY)
  2303. err = mp_sqr(y, t2);
  2304. if (err == MP_OKAY)
  2305. err = mp_montgomery_reduce(t2, modulus, mp);
  2306. /* T2 = T2/2 */
  2307. if (err == MP_OKAY)
  2308. err = mp_div_2_mod_ct(t2, modulus, t2);
  2309. /* Y = Y * X */
  2310. if (err == MP_OKAY)
  2311. err = mp_mul(y, x, y);
  2312. if (err == MP_OKAY)
  2313. err = mp_montgomery_reduce(y, modulus, mp);
  2314. /* X = T1 * T1 */
  2315. if (err == MP_OKAY)
  2316. err = mp_sqr(t1, x);
  2317. if (err == MP_OKAY)
  2318. err = mp_montgomery_reduce(x, modulus, mp);
  2319. /* X = X - Y */
  2320. if (err == MP_OKAY)
  2321. err = mp_submod_ct(x, y, modulus, x);
  2322. /* X = X - Y */
  2323. if (err == MP_OKAY)
  2324. err = mp_submod_ct(x, y, modulus, x);
  2325. /* Y = Y - X */
  2326. if (err == MP_OKAY)
  2327. err = mp_submod_ct(y, x, modulus, y);
  2328. /* Y = Y * T1 */
  2329. if (err == MP_OKAY)
  2330. err = mp_mul(y, t1, y);
  2331. if (err == MP_OKAY)
  2332. err = mp_montgomery_reduce(y, modulus, mp);
  2333. /* Y = Y - T2 */
  2334. if (err == MP_OKAY)
  2335. err = mp_submod_ct(y, t2, modulus, y);
  2336. #ifdef ALT_ECC_SIZE
  2337. if (err == MP_OKAY)
  2338. err = mp_copy(x, R->x);
  2339. if (err == MP_OKAY)
  2340. err = mp_copy(y, R->y);
  2341. if (err == MP_OKAY)
  2342. err = mp_copy(z, R->z);
  2343. #endif
  2344. /* clean up */
  2345. mp_clear(t1);
  2346. mp_clear(t2);
  2347. #ifdef WOLFSSL_SMALL_STACK
  2348. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2349. if (R->key == NULL)
  2350. #endif
  2351. #endif
  2352. {
  2353. #ifdef ALT_ECC_SIZE
  2354. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2355. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2356. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2357. #endif
  2358. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2359. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2360. }
  2361. return err;
  2362. #else
  2363. int modBits = mp_count_bits(modulus);
  2364. (void)a;
  2365. (void)mp;
  2366. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  2367. if ((modBits == 256) && (!mp_is_bit_set(modulus, 224))) {
  2368. return sp_ecc_proj_dbl_point_sm2_256(P->x, P->y, P->z, R->x, R->y, R->z);
  2369. }
  2370. #endif
  2371. #ifndef WOLFSSL_SP_NO_256
  2372. if (modBits == 256) {
  2373. return sp_ecc_proj_dbl_point_256(P->x, P->y, P->z, R->x, R->y, R->z);
  2374. }
  2375. #endif
  2376. #ifdef WOLFSSL_SP_384
  2377. if (modBits == 384) {
  2378. return sp_ecc_proj_dbl_point_384(P->x, P->y, P->z, R->x, R->y, R->z);
  2379. }
  2380. #endif
  2381. #ifdef WOLFSSL_SP_521
  2382. if (modBits == 521) {
  2383. return sp_ecc_proj_dbl_point_521(P->x, P->y, P->z, R->x, R->y, R->z);
  2384. }
  2385. #endif
  2386. return ECC_BAD_ARG_E;
  2387. #endif
  2388. }
  2389. int ecc_projective_dbl_point(ecc_point *P, ecc_point *R, mp_int* a,
  2390. mp_int* modulus, mp_digit mp)
  2391. {
  2392. if (P == NULL || R == NULL || modulus == NULL)
  2393. return ECC_BAD_ARG_E;
  2394. if (mp_cmp(P->x, modulus) != MP_LT ||
  2395. mp_cmp(P->y, modulus) != MP_LT ||
  2396. mp_cmp(P->z, modulus) != MP_LT) {
  2397. return ECC_OUT_OF_RANGE_E;
  2398. }
  2399. return _ecc_projective_dbl_point(P, R, a, modulus, mp);
  2400. }
  2401. #if !defined(FREESCALE_LTC_ECC) && !defined(WOLFSSL_STM32_PKA) && \
  2402. !defined(WOLFSSL_CRYPTOCELL)
  2403. /**
  2404. Map a projective Jacobian point back to affine space
  2405. P [in/out] The point to map
  2406. modulus The modulus of the field the ECC curve is in
  2407. mp The "b" value from montgomery_setup()
  2408. ct Operation should be constant time.
  2409. return MP_OKAY on success
  2410. */
  2411. int ecc_map_ex(ecc_point* P, mp_int* modulus, mp_digit mp, int ct)
  2412. {
  2413. #if !defined(WOLFSSL_SP_MATH)
  2414. DECL_MP_INT_SIZE_DYN(t1, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2415. DECL_MP_INT_SIZE_DYN(t2, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2416. #ifdef ALT_ECC_SIZE
  2417. DECL_MP_INT_SIZE_DYN(rx, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2418. DECL_MP_INT_SIZE_DYN(ry, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2419. DECL_MP_INT_SIZE_DYN(rz, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2420. #endif
  2421. mp_int *x, *y, *z;
  2422. int err;
  2423. (void)ct;
  2424. if (P == NULL || modulus == NULL)
  2425. return ECC_BAD_ARG_E;
  2426. /* special case for point at infinity */
  2427. if (mp_cmp_d(P->z, 0) == MP_EQ) {
  2428. err = mp_set(P->x, 0);
  2429. if (err == MP_OKAY)
  2430. err = mp_set(P->y, 0);
  2431. if (err == MP_OKAY)
  2432. err = mp_set(P->z, 1);
  2433. return err;
  2434. }
  2435. #ifdef WOLFSSL_SMALL_STACK
  2436. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2437. if (P->key != NULL) {
  2438. t1 = P->key->t1;
  2439. t2 = P->key->t2;
  2440. #ifdef ALT_ECC_SIZE
  2441. rx = P->key->x;
  2442. ry = P->key->y;
  2443. rz = P->key->z;
  2444. #endif
  2445. }
  2446. else
  2447. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  2448. #endif
  2449. {
  2450. NEW_MP_INT_SIZE(t1, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2451. NEW_MP_INT_SIZE(t2, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2452. #ifdef MP_INT_SIZE_CHECK_NULL
  2453. if (t1 == NULL || t2 == NULL) {
  2454. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2455. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2456. return MEMORY_E;
  2457. }
  2458. #endif
  2459. #ifdef ALT_ECC_SIZE
  2460. NEW_MP_INT_SIZE(rx, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2461. NEW_MP_INT_SIZE(ry, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2462. NEW_MP_INT_SIZE(rz, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2463. #ifdef MP_INT_SIZE_CHECK_NULL
  2464. if (rx == NULL || ry == NULL || rz == NULL) {
  2465. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2466. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2467. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2468. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2469. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2470. return MEMORY_E;
  2471. }
  2472. #endif
  2473. #endif
  2474. }
  2475. err = INIT_MP_INT_SIZE(t1, mp_bitsused(modulus));
  2476. if (err == MP_OKAY) {
  2477. err = INIT_MP_INT_SIZE(t2, mp_bitsused(modulus));
  2478. }
  2479. if (err != MP_OKAY) {
  2480. #ifdef WOLFSSL_SMALL_STACK
  2481. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2482. if (P->key == NULL)
  2483. #endif
  2484. #endif
  2485. {
  2486. #ifdef ALT_ECC_SIZE
  2487. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2488. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2489. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2490. #endif
  2491. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2492. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2493. }
  2494. return MEMORY_E;
  2495. }
  2496. #ifdef ALT_ECC_SIZE
  2497. /* Use local stack variable */
  2498. x = rx;
  2499. y = ry;
  2500. z = rz;
  2501. err = INIT_MP_INT_SIZE(x, mp_bitsused(modulus));
  2502. if (err == MP_OKAY) {
  2503. err = INIT_MP_INT_SIZE(y, mp_bitsused(modulus));
  2504. }
  2505. if (err == MP_OKAY) {
  2506. err = INIT_MP_INT_SIZE(z, mp_bitsused(modulus));
  2507. }
  2508. if (err != MP_OKAY) {
  2509. goto done;
  2510. }
  2511. if (err == MP_OKAY)
  2512. err = mp_copy(P->x, x);
  2513. if (err == MP_OKAY)
  2514. err = mp_copy(P->y, y);
  2515. if (err == MP_OKAY)
  2516. err = mp_copy(P->z, z);
  2517. if (err != MP_OKAY) {
  2518. goto done;
  2519. }
  2520. #else
  2521. /* Use destination directly */
  2522. x = P->x;
  2523. y = P->y;
  2524. z = P->z;
  2525. #endif
  2526. /* get 1/z */
  2527. if (err == MP_OKAY) {
  2528. #if defined(ECC_TIMING_RESISTANT) && (defined(USE_FAST_MATH) || \
  2529. defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL))
  2530. if (ct) {
  2531. err = mp_invmod_mont_ct(z, modulus, t1, mp);
  2532. if (err == MP_OKAY)
  2533. err = mp_montgomery_reduce(t1, modulus, mp);
  2534. }
  2535. else
  2536. #endif
  2537. {
  2538. /* first map z back to normal */
  2539. err = mp_montgomery_reduce(z, modulus, mp);
  2540. if (err == MP_OKAY)
  2541. err = mp_invmod(z, modulus, t1);
  2542. }
  2543. }
  2544. /* get 1/z^2 and 1/z^3 */
  2545. if (err == MP_OKAY)
  2546. err = mp_sqr(t1, t2);
  2547. if (err == MP_OKAY)
  2548. err = mp_mod(t2, modulus, t2);
  2549. if (err == MP_OKAY)
  2550. err = mp_mul(t1, t2, t1);
  2551. if (err == MP_OKAY)
  2552. err = mp_mod(t1, modulus, t1);
  2553. /* multiply against x/y */
  2554. if (err == MP_OKAY)
  2555. err = mp_mul(x, t2, x);
  2556. if (err == MP_OKAY)
  2557. err = mp_montgomery_reduce(x, modulus, mp);
  2558. if (err == MP_OKAY)
  2559. err = mp_mul(y, t1, y);
  2560. if (err == MP_OKAY)
  2561. err = mp_montgomery_reduce(y, modulus, mp);
  2562. if (err == MP_OKAY)
  2563. err = mp_set(z, 1);
  2564. #ifdef ALT_ECC_SIZE
  2565. /* return result */
  2566. if (err == MP_OKAY)
  2567. err = mp_copy(x, P->x);
  2568. if (err == MP_OKAY)
  2569. err = mp_copy(y, P->y);
  2570. if (err == MP_OKAY)
  2571. err = mp_copy(z, P->z);
  2572. done:
  2573. #endif
  2574. /* clean up */
  2575. mp_clear(t1);
  2576. mp_clear(t2);
  2577. #ifdef WOLFSSL_SMALL_STACK
  2578. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2579. if (P->key == NULL)
  2580. #endif
  2581. #endif
  2582. {
  2583. #ifdef ALT_ECC_SIZE
  2584. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2585. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2586. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2587. #endif
  2588. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2589. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2590. }
  2591. return err;
  2592. #else
  2593. if (P == NULL || modulus == NULL)
  2594. return ECC_BAD_ARG_E;
  2595. (void)mp;
  2596. (void)ct;
  2597. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  2598. if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) {
  2599. return sp_ecc_map_sm2_256(P->x, P->y, P->z);
  2600. }
  2601. #endif
  2602. #ifndef WOLFSSL_SP_NO_256
  2603. if (mp_count_bits(modulus) == 256) {
  2604. return sp_ecc_map_256(P->x, P->y, P->z);
  2605. }
  2606. #endif
  2607. #ifdef WOLFSSL_SP_384
  2608. if (mp_count_bits(modulus) == 384) {
  2609. return sp_ecc_map_384(P->x, P->y, P->z);
  2610. }
  2611. #endif
  2612. #ifdef WOLFSSL_SP_521
  2613. if (mp_count_bits(modulus) == 521) {
  2614. return sp_ecc_map_521(P->x, P->y, P->z);
  2615. }
  2616. #endif
  2617. return ECC_BAD_ARG_E;
  2618. #endif
  2619. }
  2620. #endif /* !FREESCALE_LTC_ECC && !WOLFSSL_STM32_PKA */
  2621. int ecc_map(ecc_point* P, mp_int* modulus, mp_digit mp)
  2622. {
  2623. return ecc_map_ex(P, modulus, mp, 0);
  2624. }
  2625. #endif /* !WOLFSSL_SP_MATH || WOLFSSL_PUBLIC_ECC_ADD_DBL */
  2626. #if !defined(FREESCALE_LTC_ECC) && !defined(WOLFSSL_STM32_PKA) && \
  2627. !defined(WOLFSSL_CRYPTOCELL)
  2628. #if !defined(WOLFSSL_SP_MATH)
  2629. #ifndef ECC_TIMING_RESISTANT
  2630. /* size of sliding window, don't change this! */
  2631. #define WINSIZE 4
  2632. #define M_POINTS 8
  2633. static int ecc_mulmod(const mp_int* k, ecc_point* tG, ecc_point* R,
  2634. ecc_point** M, mp_int* a, mp_int* modulus, mp_digit mp, WC_RNG* rng)
  2635. {
  2636. int err = MP_OKAY;
  2637. int i;
  2638. int first = 1, bitbuf = 0, bitcpy = 0, j;
  2639. int bitcnt = 0, mode = 0, digidx = 0;
  2640. mp_digit buf;
  2641. int infinity;
  2642. (void)rng;
  2643. /* calc the M tab, which holds kG for k==8..15 */
  2644. /* M[0] == 8G */
  2645. if (err == MP_OKAY)
  2646. err = ecc_projective_dbl_point_safe(tG, M[0], a, modulus, mp);
  2647. if (err == MP_OKAY)
  2648. err = ecc_projective_dbl_point_safe(M[0], M[0], a, modulus, mp);
  2649. if (err == MP_OKAY)
  2650. err = ecc_projective_dbl_point_safe(M[0], M[0], a, modulus, mp);
  2651. /* now find (8+k)G for k=1..7 */
  2652. if (err == MP_OKAY)
  2653. for (j = 9; j < 16; j++) {
  2654. err = ecc_projective_add_point_safe(M[j-9], tG, M[j-M_POINTS], a,
  2655. modulus, mp, &infinity);
  2656. if (err != MP_OKAY) break;
  2657. }
  2658. /* setup sliding window */
  2659. if (err == MP_OKAY) {
  2660. mode = 0;
  2661. bitcnt = 1;
  2662. buf = 0;
  2663. digidx = get_digit_count(k) - 1;
  2664. bitcpy = bitbuf = 0;
  2665. first = 1;
  2666. /* perform ops */
  2667. for (;;) {
  2668. /* grab next digit as required */
  2669. if (--bitcnt == 0) {
  2670. if (digidx == -1) {
  2671. break;
  2672. }
  2673. buf = get_digit(k, digidx);
  2674. bitcnt = (int) DIGIT_BIT;
  2675. --digidx;
  2676. }
  2677. /* grab the next msb from the ltiplicand */
  2678. i = (int)(buf >> (DIGIT_BIT - 1)) & 1;
  2679. buf <<= 1;
  2680. /* skip leading zero bits */
  2681. if (mode == 0 && i == 0)
  2682. continue;
  2683. /* if the bit is zero and mode == 1 then we double */
  2684. if (mode == 1 && i == 0) {
  2685. err = ecc_projective_dbl_point_safe(R, R, a, modulus, mp);
  2686. if (err != MP_OKAY) break;
  2687. continue;
  2688. }
  2689. /* else we add it to the window */
  2690. bitbuf |= (i << (WINSIZE - ++bitcpy));
  2691. mode = 2;
  2692. if (bitcpy == WINSIZE) {
  2693. /* if this is the first window we do a simple copy */
  2694. if (first == 1) {
  2695. /* R = kG [k = first window] */
  2696. err = mp_copy(M[bitbuf-M_POINTS]->x, R->x);
  2697. if (err != MP_OKAY) break;
  2698. err = mp_copy(M[bitbuf-M_POINTS]->y, R->y);
  2699. if (err != MP_OKAY) break;
  2700. err = mp_copy(M[bitbuf-M_POINTS]->z, R->z);
  2701. first = 0;
  2702. } else {
  2703. /* normal window */
  2704. /* ok window is filled so double as required and add */
  2705. /* double first */
  2706. for (j = 0; j < WINSIZE; j++) {
  2707. err = ecc_projective_dbl_point_safe(R, R, a, modulus,
  2708. mp);
  2709. if (err != MP_OKAY) break;
  2710. }
  2711. if (err != MP_OKAY) break; /* out of first for(;;) */
  2712. /* now add, bitbuf will be 8..15 [8..2^WINSIZE] guaranteed */
  2713. err = ecc_projective_add_point_safe(R, M[bitbuf-M_POINTS], R,
  2714. a, modulus, mp, &infinity);
  2715. }
  2716. if (err != MP_OKAY) break;
  2717. /* empty window and reset */
  2718. bitcpy = bitbuf = 0;
  2719. mode = 1;
  2720. }
  2721. }
  2722. }
  2723. /* if bits remain then double/add */
  2724. if (err == MP_OKAY) {
  2725. if (mode == 2 && bitcpy > 0) {
  2726. /* double then add */
  2727. for (j = 0; j < bitcpy; j++) {
  2728. /* only double if we have had at least one add first */
  2729. if (first == 0) {
  2730. err = ecc_projective_dbl_point_safe(R, R, a, modulus, mp);
  2731. if (err != MP_OKAY) break;
  2732. }
  2733. bitbuf <<= 1;
  2734. if ((bitbuf & (1 << WINSIZE)) != 0) {
  2735. if (first == 1) {
  2736. /* first add, so copy */
  2737. err = mp_copy(tG->x, R->x);
  2738. if (err != MP_OKAY) break;
  2739. err = mp_copy(tG->y, R->y);
  2740. if (err != MP_OKAY) break;
  2741. err = mp_copy(tG->z, R->z);
  2742. if (err != MP_OKAY) break;
  2743. first = 0;
  2744. } else {
  2745. /* then add */
  2746. err = ecc_projective_add_point_safe(R, tG, R, a, modulus,
  2747. mp, &infinity);
  2748. if (err != MP_OKAY) break;
  2749. }
  2750. }
  2751. }
  2752. }
  2753. }
  2754. #undef WINSIZE
  2755. return err;
  2756. }
  2757. #else
  2758. static int wc_ecc_gen_z(WC_RNG* rng, int size, ecc_point* p, mp_int* modulus,
  2759. mp_digit mp, mp_int* tx, mp_int* ty, mp_int* mu)
  2760. {
  2761. int err = MP_OKAY;
  2762. err = mp_montgomery_calc_normalization(mu, modulus);
  2763. /* Generate random value to multiply into p->z. */
  2764. if (err == MP_OKAY)
  2765. err = wc_ecc_gen_k(rng, size, ty, modulus);
  2766. /* Convert to montogmery form. */
  2767. if (err == MP_OKAY)
  2768. err = mp_mulmod(ty, mu, modulus, ty);
  2769. /* Multiply random value into p->z. */
  2770. if (err == MP_OKAY)
  2771. err = mp_mul(p->z, ty, p->z);
  2772. if (err == MP_OKAY)
  2773. err = mp_montgomery_reduce(p->z, modulus, mp);
  2774. /* Square random value for X (X' = X / Z^2). */
  2775. if (err == MP_OKAY)
  2776. err = mp_sqr(ty, tx);
  2777. if (err == MP_OKAY)
  2778. err = mp_montgomery_reduce(tx, modulus, mp);
  2779. /* Multiply square of random by random value for Y. */
  2780. if (err == MP_OKAY)
  2781. err = mp_mul(ty, tx, ty);
  2782. if (err == MP_OKAY)
  2783. err = mp_montgomery_reduce(ty, modulus, mp);
  2784. /* Multiply square into X. */
  2785. if (err == MP_OKAY)
  2786. err = mp_mul(p->x, tx, p->x);
  2787. if (err == MP_OKAY)
  2788. err = mp_montgomery_reduce(p->x, modulus, mp);
  2789. /* Multiply cube into Y (Y' = Y / Z^3). */
  2790. if (err == MP_OKAY)
  2791. err = mp_mul(p->y, ty, p->y);
  2792. if (err == MP_OKAY)
  2793. err = mp_montgomery_reduce(p->y, modulus, mp);
  2794. return err;
  2795. }
  2796. #ifndef WC_PROTECT_ENCRYPTED_MEM
  2797. #define M_POINTS 3
  2798. /* Joye double-add ladder.
  2799. * "Highly Regular Right-to-Left Algorithms for Scalar Multiplication"
  2800. * by Marc Joye (2007)
  2801. *
  2802. * Algorithm 1':
  2803. * Input: P element of curve, k = (k[t-1],..., k[0]) base 2
  2804. * Output: Q = kP
  2805. * 1: R[0] = P; R[1] = P
  2806. * 2: for j = 1 to t-1 do
  2807. * 3: b = 1 - k[j]; R[b] = 2*R[b] + R[k[j]]
  2808. * 4: end for
  2809. * 5: b = k[0]; R[b] = R[b] - P
  2810. * 6: return R[0]
  2811. *
  2812. * Assumes: k < order.
  2813. */
  2814. static int ecc_mulmod(const mp_int* k, ecc_point* P, ecc_point* Q,
  2815. ecc_point** R, mp_int* a, mp_int* modulus, mp_digit mp, WC_RNG* rng)
  2816. {
  2817. int err = MP_OKAY;
  2818. int bytes = (mp_count_bits(modulus) + 7) / 8;
  2819. int i;
  2820. int j = 1;
  2821. int cnt = DIGIT_BIT;
  2822. int t = 0;
  2823. mp_digit b;
  2824. mp_digit v = 0;
  2825. mp_int* kt = R[2]->x;
  2826. #ifndef WC_NO_CACHE_RESISTANT
  2827. /* First bit always 1 (fix at end) and swap equals first bit */
  2828. int swap = 1;
  2829. #ifdef WOLFSSL_SMALL_STACK
  2830. mp_int* tmp = NULL;
  2831. #else
  2832. mp_int tmp[1];
  2833. #endif
  2834. #endif
  2835. int infinity;
  2836. #ifndef WC_NO_CACHE_RESISTANT
  2837. #ifdef WOLFSSL_SMALL_STACK
  2838. tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  2839. if (tmp == NULL) {
  2840. err = MEMORY_E;
  2841. }
  2842. #endif
  2843. if (err == MP_OKAY)
  2844. err = mp_init(tmp);
  2845. #endif
  2846. /* Step 1: R[0] = P; R[1] = P */
  2847. /* R[0] = P */
  2848. if (err == MP_OKAY)
  2849. err = mp_copy(P->x, R[0]->x);
  2850. if (err == MP_OKAY)
  2851. err = mp_copy(P->y, R[0]->y);
  2852. if (err == MP_OKAY)
  2853. err = mp_copy(P->z, R[0]->z);
  2854. /* R[1] = P */
  2855. if (err == MP_OKAY)
  2856. err = mp_copy(P->x, R[1]->x);
  2857. if (err == MP_OKAY)
  2858. err = mp_copy(P->y, R[1]->y);
  2859. if (err == MP_OKAY)
  2860. err = mp_copy(P->z, R[1]->z);
  2861. /* Randomize z ordinates to obfuscate timing. */
  2862. if ((err == MP_OKAY) && (rng != NULL))
  2863. err = wc_ecc_gen_z(rng, bytes, R[0], modulus, mp, R[2]->x, R[2]->y, kt);
  2864. if ((err == MP_OKAY) && (rng != NULL))
  2865. err = wc_ecc_gen_z(rng, bytes, R[1], modulus, mp, R[2]->x, R[2]->y, kt);
  2866. if (err == MP_OKAY) {
  2867. /* Order could be one greater than the size of the modulus. */
  2868. t = mp_count_bits(modulus) + 1;
  2869. v = k->dp[0] >> 1;
  2870. if (cnt > t) {
  2871. cnt = t;
  2872. }
  2873. err = mp_copy(k, kt);
  2874. }
  2875. if (err == MP_OKAY) {
  2876. err = mp_grow(kt, (int)modulus->used + 1);
  2877. }
  2878. /* Step 2: for j = 1 to t-1 do */
  2879. for (i = 1; (err == MP_OKAY) && (i < t); i++) {
  2880. if (--cnt == 0) {
  2881. v = kt->dp[j++];
  2882. cnt = DIGIT_BIT;
  2883. }
  2884. /* Step 3: b = 1 - k[j]; R[b] = 2*R[b] + R[k[j]] */
  2885. b = v & 1;
  2886. v >>= 1;
  2887. #ifdef WC_NO_CACHE_RESISTANT
  2888. err = ecc_projective_dbl_point_safe(R[b^1], R[b^1], a, modulus, mp);
  2889. if (err == MP_OKAY) {
  2890. err = ecc_projective_add_point_safe(R[b^1], R[b], R[b^1], a,
  2891. modulus, mp, &infinity);
  2892. }
  2893. #else
  2894. /* Swap R[0] and R[1] if other index is needed. */
  2895. swap ^= (int)b;
  2896. if (err == MP_OKAY) {
  2897. err = mp_cond_swap_ct_ex(R[0]->x, R[1]->x, (int)modulus->used, swap,
  2898. tmp);
  2899. }
  2900. if (err == MP_OKAY) {
  2901. err = mp_cond_swap_ct_ex(R[0]->y, R[1]->y, (int)modulus->used, swap,
  2902. tmp);
  2903. }
  2904. if (err == MP_OKAY) {
  2905. err = mp_cond_swap_ct_ex(R[0]->z, R[1]->z, (int)modulus->used, swap,
  2906. tmp);
  2907. }
  2908. swap = (int)b;
  2909. if (err == MP_OKAY)
  2910. err = ecc_projective_dbl_point_safe(R[0], R[0], a, modulus, mp);
  2911. if (err == MP_OKAY) {
  2912. err = ecc_projective_add_point_safe(R[0], R[1], R[0], a, modulus,
  2913. mp, &infinity);
  2914. }
  2915. #endif /* WC_NO_CACHE_RESISTANT */
  2916. }
  2917. /* Step 4: end for */
  2918. #ifndef WC_NO_CACHE_RESISTANT
  2919. /* Swap back if last bit is 0. */
  2920. swap ^= 1;
  2921. if (err == MP_OKAY) {
  2922. err = mp_cond_swap_ct_ex(R[0]->x, R[1]->x, (int)modulus->used, swap,
  2923. tmp);
  2924. }
  2925. if (err == MP_OKAY) {
  2926. err = mp_cond_swap_ct_ex(R[0]->y, R[1]->y, (int)modulus->used, swap,
  2927. tmp);
  2928. }
  2929. if (err == MP_OKAY) {
  2930. err = mp_cond_swap_ct_ex(R[0]->z, R[1]->z, (int)modulus->used, swap,
  2931. tmp);
  2932. }
  2933. #endif
  2934. /* Step 5: b = k[0]; R[b] = R[b] - P */
  2935. /* R[2] = -P */
  2936. if (err == MP_OKAY)
  2937. err = mp_copy(P->x, R[2]->x);
  2938. if (err == MP_OKAY)
  2939. err = mp_sub(modulus, P->y, R[2]->y);
  2940. if (err == MP_OKAY)
  2941. err = mp_copy(P->z, R[2]->z);
  2942. /* Subtract point by adding negative. */
  2943. if (err == MP_OKAY) {
  2944. b = k->dp[0] & 1;
  2945. #ifdef WC_NO_CACHE_RESISTANT
  2946. err = ecc_projective_add_point_safe(R[b], R[2], R[b], a, modulus, mp,
  2947. &infinity);
  2948. #else
  2949. /* Swap R[0] and R[1], if necessary, to operate on the one we want. */
  2950. err = mp_cond_swap_ct_ex(R[0]->x, R[1]->x, (int)modulus->used, (int)b,
  2951. tmp);
  2952. if (err == MP_OKAY) {
  2953. err = mp_cond_swap_ct_ex(R[0]->y, R[1]->y, (int)modulus->used,
  2954. (int)b, tmp);
  2955. }
  2956. if (err == MP_OKAY) {
  2957. err = mp_cond_swap_ct_ex(R[0]->z, R[1]->z, (int)modulus->used,
  2958. (int)b, tmp);
  2959. }
  2960. if (err == MP_OKAY)
  2961. err = ecc_projective_add_point_safe(R[0], R[2], R[0], a, modulus,
  2962. mp, &infinity);
  2963. /* Swap back if necessary. */
  2964. if (err == MP_OKAY) {
  2965. err = mp_cond_swap_ct_ex(R[0]->x, R[1]->x, (int)modulus->used,
  2966. (int)b, tmp);
  2967. }
  2968. if (err == MP_OKAY) {
  2969. err = mp_cond_swap_ct_ex(R[0]->y, R[1]->y, (int)modulus->used,
  2970. (int)b, tmp);
  2971. }
  2972. if (err == MP_OKAY) {
  2973. err = mp_cond_swap_ct_ex(R[0]->z, R[1]->z, (int)modulus->used,
  2974. (int)b, tmp);
  2975. }
  2976. #endif
  2977. }
  2978. /* Step 6: return R[0] */
  2979. if (err == MP_OKAY)
  2980. err = mp_copy(R[0]->x, Q->x);
  2981. if (err == MP_OKAY)
  2982. err = mp_copy(R[0]->y, Q->y);
  2983. if (err == MP_OKAY)
  2984. err = mp_copy(R[0]->z, Q->z);
  2985. #if defined(WOLFSSL_SMALL_STACK) && !defined(WC_NO_CACHE_RESISTANT)
  2986. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  2987. #endif
  2988. return err;
  2989. }
  2990. #else
  2991. /* Number of points to allocate for use during scalar multiplication. */
  2992. #define M_POINTS 5
  2993. /* Last of the points is used as a temporary during calculations. */
  2994. #define TMP_IDX M_POINTS - 1
  2995. static void mp_cond_swap_into_ct(mp_int* ra, mp_int* rb, mp_int* a, mp_int* b,
  2996. int digits, int m)
  2997. {
  2998. int i;
  2999. #if !defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_SP_INT_NEGATIVE)
  3000. /* Only using positive numbers in ECC operations. */
  3001. ra->sign = 0;
  3002. rb->sign = 0;
  3003. #endif
  3004. /* Don't store 0 when mask is 0, it will be in a register. */
  3005. ra->used = (int)(((a->used ^ b->used) & ((mp_digit)0 - (m & 1))) ^ a->used);
  3006. rb->used = (int)(((a->used ^ b->used) & ((mp_digit)0 - (m & 1))) ^ b->used);
  3007. for (i = 0; i < digits; i++) {
  3008. ra->dp[i] = ((a->dp[i] ^ b->dp[i]) & ((mp_digit)0 - (m & 1))) ^
  3009. a->dp[i];
  3010. rb->dp[i] = ((a->dp[i] ^ b->dp[i]) & ((mp_digit)0 - (m & 1))) ^
  3011. b->dp[i];
  3012. }
  3013. }
  3014. static void ecc_cond_swap_into_ct(ecc_point* ra, ecc_point* rb, ecc_point* a,
  3015. ecc_point* b, int digits, int m)
  3016. {
  3017. /* Conditionally swap each ordinate. */
  3018. mp_cond_swap_into_ct(ra->x, rb->x, a->x, b->x, digits, m);
  3019. mp_cond_swap_into_ct(ra->y, rb->y, a->y, b->y, digits, m);
  3020. mp_cond_swap_into_ct(ra->z, rb->z, a->z, b->z, digits, m);
  3021. }
  3022. /* Joye double-add ladder.
  3023. * "Highly Regular Right-to-Left Algorithms for Scalar Multiplication"
  3024. * by Marc Joye (2007)
  3025. *
  3026. * Algorithm 1':
  3027. * Input: P element of curve, k = (k[t-1],..., k[0]) base 2
  3028. * Output: Q = kP
  3029. * 1: R[0] = P; R[1] = P
  3030. * 2: for j = 1 to t-1 do
  3031. * 3: b = 1 - k[j]; R[b] = 2*R[b] + R[k[j]]
  3032. * 4: end for
  3033. * 5: b = k[0]; R[b] = R[b] - P
  3034. * 6: return R[0]
  3035. *
  3036. * Assumes: k < order.
  3037. */
  3038. static int ecc_mulmod(const mp_int* k, ecc_point* P, ecc_point* Q,
  3039. ecc_point** R, mp_int* a, mp_int* modulus, mp_digit mp, WC_RNG* rng)
  3040. {
  3041. int err = MP_OKAY;
  3042. int bytes = (mp_count_bits(modulus) + 7) / 8;
  3043. int i;
  3044. int j = 1;
  3045. int cnt;
  3046. int t = 0;
  3047. mp_int* kt = R[TMP_IDX]->x;
  3048. /* First bit always 1 (fix at end) and swap equals first bit */
  3049. register int swap = 1;
  3050. /* Which pair of points has current value. R[0,1] or R[2,3] */
  3051. int set = 0;
  3052. int infinity;
  3053. /* Step 1: R[0] = P; R[1] = P */
  3054. /* R[0] = P */
  3055. if (err == MP_OKAY)
  3056. err = mp_copy(P->x, R[0]->x);
  3057. if (err == MP_OKAY)
  3058. err = mp_copy(P->y, R[0]->y);
  3059. if (err == MP_OKAY)
  3060. err = mp_copy(P->z, R[0]->z);
  3061. /* R[1] = P */
  3062. if (err == MP_OKAY)
  3063. err = mp_copy(P->x, R[1]->x);
  3064. if (err == MP_OKAY)
  3065. err = mp_copy(P->y, R[1]->y);
  3066. if (err == MP_OKAY)
  3067. err = mp_copy(P->z, R[1]->z);
  3068. /* Randomize z ordinates to obfuscate timing. */
  3069. if ((err == MP_OKAY) && (rng != NULL))
  3070. err = wc_ecc_gen_z(rng, bytes, R[0], modulus, mp, R[TMP_IDX]->x,
  3071. R[TMP_IDX]->y, kt);
  3072. if ((err == MP_OKAY) && (rng != NULL))
  3073. err = wc_ecc_gen_z(rng, bytes, R[1], modulus, mp, R[TMP_IDX]->x,
  3074. R[TMP_IDX]->y, kt);
  3075. if (err == MP_OKAY) {
  3076. /* Order could be one greater than the size of the modulus. */
  3077. t = mp_count_bits(modulus) + 1;
  3078. err = mp_copy(k, kt);
  3079. }
  3080. if (err == MP_OKAY) {
  3081. err = mp_grow(kt, modulus->used + 1);
  3082. }
  3083. /* Step 2: for j = 1 to t-1 do */
  3084. for (i = 1, j = 0, cnt = 0; (err == MP_OKAY) && (i < t); i++) {
  3085. if (++cnt == DIGIT_BIT) {
  3086. j++;
  3087. cnt = 0;
  3088. }
  3089. /* Step 3: b = 1 - k[j]; R[b] = 2*R[b] + R[k[j]] */
  3090. /* Swap R[0] and R[1] if other index is needed. */
  3091. /* Ensure 'swap' changes when shifted word is 0. */
  3092. swap += (kt->dp[j] >> cnt) + 2;
  3093. ecc_cond_swap_into_ct(R[(2 - set) + 0], R[(2 - set) + 1],
  3094. R[set + 0], R[set + 1], modulus->used, swap);
  3095. /* Change to operate on set copied into. */
  3096. set = 2 - set;
  3097. /* Ensure 'swap' changes to a previously unseen value. */
  3098. swap += (kt->dp[j] >> cnt) + swap;
  3099. /* R[0] = 2*R[0] */
  3100. err = ecc_projective_dbl_point_safe(R[set + 0], R[set + 0], a, modulus,
  3101. mp);
  3102. if (err == MP_OKAY) {
  3103. /* R[0] = R[1] + R[0] */
  3104. err = ecc_projective_add_point_safe(R[set + 0], R[set + 1],
  3105. R[set + 0], a, modulus, mp, &infinity);
  3106. }
  3107. /* R[1]->z * 2 - same point. */
  3108. mp_addmod_ct(R[set + 1]->z, R[set + 1]->z, modulus, R[set + 1]->z);
  3109. mp_addmod_ct(R[set + 1]->x, R[set + 1]->x, modulus, R[set + 1]->x);
  3110. mp_addmod_ct(R[set + 1]->x, R[set + 1]->x, modulus, R[set + 1]->x);
  3111. mp_addmod_ct(R[set + 1]->y, R[set + 1]->y, modulus, R[set + 1]->y);
  3112. mp_addmod_ct(R[set + 1]->y, R[set + 1]->y, modulus, R[set + 1]->y);
  3113. mp_addmod_ct(R[set + 1]->y, R[set + 1]->y, modulus, R[set + 1]->y);
  3114. }
  3115. /* Step 4: end for */
  3116. /* Swap back if last bit is 0. */
  3117. /* Ensure 'swap' changes. */
  3118. swap += 1;
  3119. if (err == MP_OKAY) {
  3120. ecc_cond_swap_into_ct(R[(2 - set) + 0], R[(2 - set) + 1],
  3121. R[set + 0], R[set + 1], modulus->used, swap);
  3122. set = 2 - set;
  3123. }
  3124. /* Step 5: b = k[0]; R[b] = R[b] - P */
  3125. /* R[TMP_IDX] = -P */
  3126. if (err == MP_OKAY)
  3127. err = mp_copy(P->x, R[TMP_IDX]->x);
  3128. if (err == MP_OKAY)
  3129. err = mp_sub(modulus, P->y, R[TMP_IDX]->y);
  3130. if (err == MP_OKAY)
  3131. err = mp_copy(P->z, R[TMP_IDX]->z);
  3132. /* Subtract point by adding negative. */
  3133. if (err == MP_OKAY) {
  3134. /* Swap R[0] and R[1], if necessary, to operate on the one we want.
  3135. * Last bit of k->dp[0] is being used to make decision to swap.
  3136. */
  3137. ecc_cond_swap_into_ct(R[(2 - set) + 0], R[(2 - set) + 1],
  3138. R[set + 0], R[set + 1], modulus->used,
  3139. (int)k->dp[0]);
  3140. set = 2 - set;
  3141. err = ecc_projective_add_point_safe(R[set + 0], R[TMP_IDX], R[set + 0],
  3142. a, modulus, mp, &infinity);
  3143. /* Swap back if necessary. */
  3144. if (err == MP_OKAY) {
  3145. ecc_cond_swap_into_ct(R[(2 - set) + 0], R[(2 - set) + 1],
  3146. R[set + 0], R[set + 1], modulus->used,
  3147. (int)k->dp[0]);
  3148. set = 2 - set;
  3149. }
  3150. }
  3151. /* Step 6: return R[0] */
  3152. if (err == MP_OKAY)
  3153. err = mp_copy(R[set + 0]->x, Q->x);
  3154. if (err == MP_OKAY)
  3155. err = mp_copy(R[set + 0]->y, Q->y);
  3156. if (err == MP_OKAY)
  3157. err = mp_copy(R[set + 0]->z, Q->z);
  3158. return err;
  3159. }
  3160. #endif
  3161. #endif
  3162. /* Convert the point to montgomery form.
  3163. *
  3164. * @param [in] p Point to convert.
  3165. * @param [out] r Point in montgomery form.
  3166. * @param [in] modulus Modulus of ordinates.
  3167. * @return 0 on success.
  3168. * @return -ve on failure.
  3169. */
  3170. static int ecc_point_to_mont(ecc_point* p, ecc_point* r, mp_int* modulus,
  3171. void* heap)
  3172. {
  3173. int err = MP_OKAY;
  3174. DECL_MP_INT_SIZE_DYN(mu, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  3175. (void)heap;
  3176. NEW_MP_INT_SIZE(mu, mp_bitsused(modulus), heap, DYNAMIC_TYPE_ECC);
  3177. #ifdef MP_INT_SIZE_CHECK_NULL
  3178. if (mu == NULL)
  3179. err = MEMORY_E;
  3180. #endif
  3181. if (err == MP_OKAY)
  3182. err = INIT_MP_INT_SIZE(mu, mp_bitsused(modulus));
  3183. if (err == MP_OKAY) {
  3184. err = mp_montgomery_calc_normalization(mu, modulus);
  3185. if (err == MP_OKAY) {
  3186. if (mp_cmp_d(mu, 1) == MP_EQ) {
  3187. err = mp_copy(p->x, r->x);
  3188. if (err == MP_OKAY)
  3189. err = mp_copy(p->y, r->y);
  3190. if (err == MP_OKAY)
  3191. err = mp_copy(p->z, r->z);
  3192. }
  3193. else {
  3194. err = mp_mulmod(p->x, mu, modulus, r->x);
  3195. if (err == MP_OKAY)
  3196. err = mp_mulmod(p->y, mu, modulus, r->y);
  3197. if (err == MP_OKAY)
  3198. err = mp_mulmod(p->z, mu, modulus, r->z);
  3199. }
  3200. }
  3201. mp_clear(mu);
  3202. }
  3203. FREE_MP_INT_SIZE(mu, heap, DYNAMIC_TYPE_ECC);
  3204. return err;
  3205. }
  3206. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3207. static int ecc_key_tmp_init(ecc_key* key, void* heap)
  3208. {
  3209. int err = MP_OKAY;
  3210. (void)heap;
  3211. if (key == NULL) {
  3212. return ECC_BAD_ARG_E;
  3213. }
  3214. XMEMSET(key, 0, sizeof(*key));
  3215. #if defined(WOLFSSL_SP_MATH_ALL) && defined(WOLFSSL_SMALL_STACK)
  3216. NEW_MP_INT_SIZE(key->t1, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC);
  3217. NEW_MP_INT_SIZE(key->t2, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC);
  3218. #ifdef ALT_ECC_SIZE
  3219. NEW_MP_INT_SIZE(key->x, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC);
  3220. NEW_MP_INT_SIZE(key->y, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC);
  3221. NEW_MP_INT_SIZE(key->z, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC);
  3222. #endif
  3223. if (key->t1 == NULL || key->t2 == NULL
  3224. #ifdef ALT_ECC_SIZE
  3225. || key->x == NULL || key->y == NULL || key->z == NULL
  3226. #endif
  3227. ) {
  3228. err = MEMORY_E;
  3229. }
  3230. if (err == 0) {
  3231. err = INIT_MP_INT_SIZE(key->t1, ECC_KEY_MAX_BITS(key));
  3232. }
  3233. if (err == 0) {
  3234. err = INIT_MP_INT_SIZE(key->t2, ECC_KEY_MAX_BITS(key));
  3235. }
  3236. #ifdef ALT_ECC_SIZE
  3237. if (err == 0) {
  3238. err = INIT_MP_INT_SIZE(key->x, ECC_KEY_MAX_BITS(key));
  3239. }
  3240. if (err == 0) {
  3241. err = INIT_MP_INT_SIZE(key->y, ECC_KEY_MAX_BITS(key));
  3242. }
  3243. if (err == 0) {
  3244. err = INIT_MP_INT_SIZE(key->z, ECC_KEY_MAX_BITS(key));
  3245. }
  3246. #endif
  3247. #else
  3248. key->t1 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  3249. key->t2 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  3250. #ifdef ALT_ECC_SIZE
  3251. key->x = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  3252. key->y = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  3253. key->z = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  3254. #endif
  3255. if (key->t1 == NULL || key->t2 == NULL
  3256. #ifdef ALT_ECC_SIZE
  3257. || key->x == NULL || key->y == NULL || key->z == NULL
  3258. #endif
  3259. ) {
  3260. err = MEMORY_E;
  3261. }
  3262. #endif
  3263. return err;
  3264. }
  3265. static void ecc_key_tmp_final(ecc_key* key, void* heap)
  3266. {
  3267. (void)heap;
  3268. #if defined(WOLFSSL_SP_MATH_ALL) && defined(WOLFSSL_SMALL_STACK)
  3269. #ifdef ALT_ECC_SIZE
  3270. FREE_MP_INT_SIZE(key->z, heap, DYNAMIC_TYPE_ECC);
  3271. FREE_MP_INT_SIZE(key->y, heap, DYNAMIC_TYPE_ECC);
  3272. FREE_MP_INT_SIZE(key->x, heap, DYNAMIC_TYPE_ECC);
  3273. #endif
  3274. FREE_MP_INT_SIZE(key->t2, heap, DYNAMIC_TYPE_ECC);
  3275. FREE_MP_INT_SIZE(key->t1, heap, DYNAMIC_TYPE_ECC);
  3276. #else
  3277. #ifdef ALT_ECC_SIZE
  3278. if (key->z != NULL)
  3279. XFREE(key->z, heap, DYNAMIC_TYPE_ECC);
  3280. if (key->y != NULL)
  3281. XFREE(key->y, heap, DYNAMIC_TYPE_ECC);
  3282. if (key->x != NULL)
  3283. XFREE(key->x, heap, DYNAMIC_TYPE_ECC);
  3284. #endif
  3285. if (key->t2 != NULL)
  3286. XFREE(key->t2, heap, DYNAMIC_TYPE_ECC);
  3287. if (key->t1 != NULL)
  3288. XFREE(key->t1, heap, DYNAMIC_TYPE_ECC);
  3289. #endif
  3290. }
  3291. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  3292. #endif /* !WOLFSSL_SP_MATH */
  3293. #if !defined(WOLFSSL_SP_MATH) || !defined(FP_ECC)
  3294. /**
  3295. Perform a point multiplication
  3296. k The scalar to multiply by
  3297. G The base point
  3298. R [out] Destination for kG
  3299. a ECC curve parameter a
  3300. modulus The modulus of the field the ECC curve is in
  3301. map Boolean whether to map back to affine or not
  3302. (1==map, 0 == leave in projective)
  3303. return MP_OKAY on success
  3304. */
  3305. #ifdef FP_ECC
  3306. static int normal_ecc_mulmod(const mp_int* k, ecc_point *G, ecc_point *R,
  3307. mp_int* a, mp_int* modulus, WC_RNG* rng, int map,
  3308. void* heap)
  3309. #else
  3310. int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  3311. mp_int* modulus, int map, void* heap)
  3312. #endif
  3313. #if !defined(WOLFSSL_SP_MATH)
  3314. {
  3315. ecc_point *tG, *M[M_POINTS];
  3316. #ifdef WOLFSSL_NO_MALLOC
  3317. ecc_point lcl_tG, lcl_M[M_POINTS];
  3318. #endif
  3319. int i, err;
  3320. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3321. ecc_key *key = (ecc_key *)XMALLOC(sizeof(*key), heap, DYNAMIC_TYPE_ECC);
  3322. #endif
  3323. mp_digit mp;
  3324. /* init variables */
  3325. tG = NULL;
  3326. XMEMSET(M, 0, sizeof(M));
  3327. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  3328. err = ECC_BAD_ARG_E;
  3329. goto exit;
  3330. }
  3331. /* k can't have more bits than modulus count plus 1 */
  3332. if (mp_count_bits(k) > mp_count_bits(modulus) + 1) {
  3333. err = ECC_OUT_OF_RANGE_E;
  3334. goto exit;
  3335. }
  3336. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3337. if (key == NULL) {
  3338. err = MP_MEM;
  3339. goto exit;
  3340. }
  3341. err = ecc_key_tmp_init(key, heap);
  3342. if (err != MP_OKAY)
  3343. goto exit;
  3344. R->key = key;
  3345. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  3346. /* alloc ram for window temps */
  3347. for (i = 0; i < M_POINTS; i++) {
  3348. #ifdef WOLFSSL_NO_MALLOC
  3349. M[i] = &lcl_M[i];
  3350. #endif
  3351. err = wc_ecc_new_point_ex(&M[i], heap);
  3352. if (err != MP_OKAY) {
  3353. goto exit;
  3354. }
  3355. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3356. M[i]->key = key;
  3357. #endif
  3358. }
  3359. /* make a copy of G in case R==G */
  3360. #ifdef WOLFSSL_NO_MALLOC
  3361. tG = &lcl_tG;
  3362. #endif
  3363. err = wc_ecc_new_point_ex(&tG, heap);
  3364. if (err != MP_OKAY) {
  3365. goto exit;
  3366. }
  3367. if ((err = ecc_point_to_mont(G, tG, modulus, heap)) != MP_OKAY) {
  3368. goto exit;
  3369. }
  3370. /* init montgomery reduction */
  3371. if ((err = mp_montgomery_setup(modulus, &mp)) != MP_OKAY) {
  3372. goto exit;
  3373. }
  3374. #ifdef FP_ECC
  3375. err = ecc_mulmod(k, tG, R, M, a, modulus, mp, rng);
  3376. #else
  3377. err = ecc_mulmod(k, tG, R, M, a, modulus, mp, NULL);
  3378. #endif
  3379. /* map R back from projective space */
  3380. if (err == MP_OKAY && map)
  3381. err = ecc_map(R, modulus, mp);
  3382. exit:
  3383. /* done */
  3384. wc_ecc_del_point_ex(tG, heap);
  3385. for (i = 0; i < M_POINTS; i++) {
  3386. wc_ecc_del_point_ex(M[i], heap);
  3387. }
  3388. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3389. if (key) {
  3390. if (R)
  3391. R->key = NULL;
  3392. if (err == MP_OKAY)
  3393. ecc_key_tmp_final(key, heap);
  3394. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  3395. }
  3396. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  3397. return err;
  3398. }
  3399. #else
  3400. {
  3401. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  3402. return ECC_BAD_ARG_E;
  3403. }
  3404. (void)a;
  3405. /* For supported curves the order is the same length in bits as the modulus.
  3406. * Can't have more than order bits for the scalar.
  3407. */
  3408. if (mp_count_bits(k) > mp_count_bits(modulus)) {
  3409. return ECC_OUT_OF_RANGE_E;
  3410. }
  3411. if (mp_count_bits(G->x) > mp_count_bits(modulus) ||
  3412. mp_count_bits(G->y) > mp_count_bits(modulus) ||
  3413. mp_count_bits(G->z) > mp_count_bits(modulus)) {
  3414. return IS_POINT_E;
  3415. }
  3416. #ifdef WOLFSSL_HAVE_SP_ECC
  3417. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  3418. if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) {
  3419. return sp_ecc_mulmod_sm2_256(k, G, R, map, heap);
  3420. }
  3421. #endif
  3422. #ifndef WOLFSSL_SP_NO_256
  3423. if (mp_count_bits(modulus) == 256) {
  3424. return sp_ecc_mulmod_256(k, G, R, map, heap);
  3425. }
  3426. #endif
  3427. #ifdef WOLFSSL_SP_384
  3428. if (mp_count_bits(modulus) == 384) {
  3429. return sp_ecc_mulmod_384(k, G, R, map, heap);
  3430. }
  3431. #endif
  3432. #ifdef WOLFSSL_SP_521
  3433. if (mp_count_bits(modulus) == 521) {
  3434. return sp_ecc_mulmod_521(k, G, R, map, heap);
  3435. }
  3436. #endif
  3437. #else
  3438. (void)map;
  3439. (void)map;
  3440. (void)heap;
  3441. #endif
  3442. return ECC_BAD_ARG_E;
  3443. }
  3444. #endif
  3445. #endif /* !WOLFSSL_SP_MATH || !FP_ECC */
  3446. #ifndef FP_ECC
  3447. #if !defined(WOLFSSL_SP_MATH)
  3448. #ifdef ECC_TIMING_RESISTANT
  3449. static int ecc_check_order_minus_1(const mp_int* k, ecc_point* tG, ecc_point* R,
  3450. mp_int* modulus, mp_int* order)
  3451. {
  3452. int err;
  3453. DECL_MP_INT_SIZE_DYN(t, mp_bitsused(order), MAX_ECC_BITS_USE);
  3454. NEW_MP_INT_SIZE(t, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  3455. #ifdef MP_INT_SIZE_CHECK_NULL
  3456. if (t == NULL) {
  3457. err = MEMORY_E;
  3458. }
  3459. else
  3460. #endif
  3461. {
  3462. err = INIT_MP_INT_SIZE(t, mp_bitsused(modulus));
  3463. }
  3464. if (err == MP_OKAY) {
  3465. /* Check for k == order - 1. Result will be 0 point which is not correct
  3466. * Calculates order / 2 and adds order / 2 + 1 and gets infinity.
  3467. * (with constant time implementation)
  3468. */
  3469. err = mp_sub_d(order, 1, t);
  3470. if (err == MP_OKAY) {
  3471. int kIsMinusOne = (mp_cmp((mp_int*)k, t) == MP_EQ);
  3472. err = mp_cond_copy(tG->x, kIsMinusOne, R->x);
  3473. if (err == MP_OKAY) {
  3474. err = mp_sub(modulus, tG->y, t);
  3475. }
  3476. if (err == MP_OKAY) {
  3477. err = mp_cond_copy(t, kIsMinusOne, R->y);
  3478. }
  3479. if (err == MP_OKAY) {
  3480. err = mp_cond_copy(tG->z, kIsMinusOne, R->z);
  3481. }
  3482. }
  3483. mp_free(t);
  3484. }
  3485. FREE_MP_INT_SIZE(t, NULL, DYNAMIC_TYPE_ECC);
  3486. return err;
  3487. }
  3488. #endif /* ECC_TIMING_RESISTANT */
  3489. #endif
  3490. /**
  3491. Perform a point multiplication
  3492. k The scalar to multiply by
  3493. G The base point
  3494. R [out] Destination for kG
  3495. a ECC curve parameter a
  3496. modulus The modulus of the field the ECC curve is in
  3497. map Boolean whether to map back to affine or not
  3498. (1==map, 0 == leave in projective)
  3499. return MP_OKAY on success
  3500. */
  3501. int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point* G, ecc_point* R, mp_int* a,
  3502. mp_int* modulus, mp_int* order, WC_RNG* rng, int map,
  3503. void* heap)
  3504. #if !defined(WOLFSSL_SP_MATH)
  3505. {
  3506. ecc_point *tG, *M[M_POINTS];
  3507. #ifdef WOLFSSL_NO_MALLOC
  3508. ecc_point lcl_tG, lcl_M[M_POINTS];
  3509. #endif
  3510. int i, err;
  3511. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3512. ecc_key key;
  3513. #endif
  3514. mp_digit mp;
  3515. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  3516. return ECC_BAD_ARG_E;
  3517. }
  3518. #ifdef HAVE_ECC_CDH
  3519. if (mp_count_bits(modulus) > mp_count_bits(order)) {
  3520. if (mp_count_bits(k) > mp_count_bits(modulus)) {
  3521. return ECC_OUT_OF_RANGE_E;
  3522. }
  3523. }
  3524. else
  3525. #endif
  3526. /* k can't have more bits than order */
  3527. if (mp_count_bits(k) > mp_count_bits(order)) {
  3528. return ECC_OUT_OF_RANGE_E;
  3529. }
  3530. /* init variables */
  3531. tG = NULL;
  3532. XMEMSET(M, 0, sizeof(M));
  3533. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3534. err = ecc_key_tmp_init(&key, heap);
  3535. if (err != MP_OKAY)
  3536. goto exit;
  3537. R->key = &key;
  3538. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  3539. /* alloc ram for window temps */
  3540. for (i = 0; i < M_POINTS; i++) {
  3541. #ifdef WOLFSSL_NO_MALLOC
  3542. M[i] = &lcl_M[i];
  3543. #endif
  3544. err = wc_ecc_new_point_ex(&M[i], heap);
  3545. if (err != MP_OKAY) {
  3546. goto exit;
  3547. }
  3548. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3549. M[i]->key = &key;
  3550. #endif
  3551. }
  3552. /* make a copy of G in case R==G */
  3553. #ifdef WOLFSSL_NO_MALLOC
  3554. tG = &lcl_tG;
  3555. #endif
  3556. err = wc_ecc_new_point_ex(&tG, heap);
  3557. if (err != MP_OKAY) {
  3558. goto exit;
  3559. }
  3560. if ((err = ecc_point_to_mont(G, tG, modulus, heap)) != MP_OKAY) {
  3561. goto exit;
  3562. }
  3563. /* init montgomery reduction */
  3564. if ((err = mp_montgomery_setup(modulus, &mp)) != MP_OKAY) {
  3565. goto exit;
  3566. }
  3567. err = ecc_mulmod(k, tG, R, M, a, modulus, mp, rng);
  3568. #ifdef ECC_TIMING_RESISTANT
  3569. if (err == MP_OKAY) {
  3570. err = ecc_check_order_minus_1(k, tG, R, modulus, order);
  3571. }
  3572. #else
  3573. (void)order;
  3574. #endif
  3575. /* map R back from projective space */
  3576. if (err == MP_OKAY && map)
  3577. err = ecc_map(R, modulus, mp);
  3578. exit:
  3579. /* done */
  3580. wc_ecc_del_point_ex(tG, heap);
  3581. for (i = 0; i < M_POINTS; i++) {
  3582. wc_ecc_del_point_ex(M[i], heap);
  3583. }
  3584. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3585. R->key = NULL;
  3586. ecc_key_tmp_final(&key, heap);
  3587. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  3588. return err;
  3589. }
  3590. #else
  3591. {
  3592. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  3593. return ECC_BAD_ARG_E;
  3594. }
  3595. if (mp_count_bits(G->x) > mp_count_bits(modulus) ||
  3596. mp_count_bits(G->y) > mp_count_bits(modulus) ||
  3597. mp_count_bits(G->z) > mp_count_bits(modulus)) {
  3598. return IS_POINT_E;
  3599. }
  3600. (void)a;
  3601. (void)order;
  3602. (void)rng;
  3603. #ifdef WOLFSSL_HAVE_SP_ECC
  3604. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  3605. if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) {
  3606. return sp_ecc_mulmod_sm2_256(k, G, R, map, heap);
  3607. }
  3608. #endif
  3609. #ifndef WOLFSSL_SP_NO_256
  3610. if (mp_count_bits(modulus) == 256) {
  3611. return sp_ecc_mulmod_256(k, G, R, map, heap);
  3612. }
  3613. #endif
  3614. #ifdef WOLFSSL_SP_384
  3615. if (mp_count_bits(modulus) == 384) {
  3616. return sp_ecc_mulmod_384(k, G, R, map, heap);
  3617. }
  3618. #endif
  3619. #ifdef WOLFSSL_SP_521
  3620. if (mp_count_bits(modulus) == 521) {
  3621. return sp_ecc_mulmod_521(k, G, R, map, heap);
  3622. }
  3623. #endif
  3624. #else
  3625. (void)map;
  3626. (void)heap;
  3627. #endif
  3628. return ECC_BAD_ARG_E;
  3629. }
  3630. #endif /* !WOLFSSL_SP_MATH */
  3631. #endif /* !FP_ECC */
  3632. #endif /* !FREESCALE_LTC_ECC && !WOLFSSL_STM32_PKA */
  3633. /** ECC Fixed Point mulmod global
  3634. k The multiplicand
  3635. G Base point to multiply
  3636. R [out] Destination of product
  3637. a ECC curve parameter a
  3638. modulus The modulus for the curve
  3639. map [boolean] If non-zero maps the point back to affine coordinates,
  3640. otherwise it's left in jacobian-montgomery form
  3641. return MP_OKAY if successful
  3642. */
  3643. int wc_ecc_mulmod(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  3644. mp_int* modulus, int map)
  3645. {
  3646. return wc_ecc_mulmod_ex(k, G, R, a, modulus, map, NULL);
  3647. }
  3648. #endif /* !WOLFSSL_ATECC508A */
  3649. /**
  3650. * Allocate a new ECC point (if one not provided)
  3651. * use a heap hint when creating new ecc_point
  3652. * return an allocated point on success or NULL on failure
  3653. */
  3654. static int wc_ecc_new_point_ex(ecc_point** point, void* heap)
  3655. {
  3656. int err = MP_OKAY;
  3657. ecc_point* p;
  3658. if (point == NULL) {
  3659. return BAD_FUNC_ARG;
  3660. }
  3661. p = *point;
  3662. #ifndef WOLFSSL_NO_MALLOC
  3663. if (p == NULL) {
  3664. p = (ecc_point*)XMALLOC(sizeof(ecc_point), heap, DYNAMIC_TYPE_ECC);
  3665. }
  3666. #endif
  3667. if (p == NULL) {
  3668. return MEMORY_E;
  3669. }
  3670. XMEMSET(p, 0, sizeof(ecc_point));
  3671. #ifndef ALT_ECC_SIZE
  3672. err = mp_init_multi(p->x, p->y, p->z, NULL, NULL, NULL);
  3673. if (err != MP_OKAY) {
  3674. #ifndef WOLFSSL_NO_MALLOC
  3675. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  3676. #endif
  3677. return err;
  3678. }
  3679. #else
  3680. p->x = (mp_int*)&p->xyz[0];
  3681. p->y = (mp_int*)&p->xyz[1];
  3682. p->z = (mp_int*)&p->xyz[2];
  3683. alt_fp_init(p->x);
  3684. alt_fp_init(p->y);
  3685. alt_fp_init(p->z);
  3686. #endif
  3687. *point = p;
  3688. (void)heap;
  3689. return err;
  3690. }
  3691. ecc_point* wc_ecc_new_point_h(void* heap)
  3692. {
  3693. ecc_point* p = NULL;
  3694. (void)wc_ecc_new_point_ex(&p, heap);
  3695. return p;
  3696. }
  3697. ecc_point* wc_ecc_new_point(void)
  3698. {
  3699. ecc_point* p = NULL;
  3700. (void)wc_ecc_new_point_ex(&p, NULL);
  3701. return p;
  3702. }
  3703. /** Free an ECC point from memory
  3704. p The point to free
  3705. */
  3706. static void wc_ecc_del_point_ex(ecc_point* p, void* heap)
  3707. {
  3708. if (p != NULL) {
  3709. mp_clear(p->x);
  3710. mp_clear(p->y);
  3711. mp_clear(p->z);
  3712. #ifndef WOLFSSL_NO_MALLOC
  3713. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  3714. #endif
  3715. }
  3716. (void)heap;
  3717. }
  3718. void wc_ecc_del_point_h(ecc_point* p, void* heap)
  3719. {
  3720. wc_ecc_del_point_ex(p, heap);
  3721. }
  3722. void wc_ecc_del_point(ecc_point* p)
  3723. {
  3724. wc_ecc_del_point_ex(p, NULL);
  3725. }
  3726. void wc_ecc_forcezero_point(ecc_point* p)
  3727. {
  3728. if (p != NULL) {
  3729. mp_forcezero(p->x);
  3730. mp_forcezero(p->y);
  3731. mp_forcezero(p->z);
  3732. }
  3733. }
  3734. /** Copy the value of a point to an other one
  3735. p The point to copy
  3736. r The created point
  3737. */
  3738. int wc_ecc_copy_point(const ecc_point* p, ecc_point *r)
  3739. {
  3740. int ret;
  3741. /* prevents null arguments */
  3742. if (p == NULL || r == NULL)
  3743. return ECC_BAD_ARG_E;
  3744. ret = mp_copy(p->x, r->x);
  3745. if (ret != MP_OKAY)
  3746. return ret;
  3747. ret = mp_copy(p->y, r->y);
  3748. if (ret != MP_OKAY)
  3749. return ret;
  3750. ret = mp_copy(p->z, r->z);
  3751. if (ret != MP_OKAY)
  3752. return ret;
  3753. return MP_OKAY;
  3754. }
  3755. /** Compare the value of a point with an other one
  3756. a The point to compare
  3757. b The other point to compare
  3758. return MP_EQ if equal, MP_LT/MP_GT if not, < 0 in case of error
  3759. */
  3760. int wc_ecc_cmp_point(ecc_point* a, ecc_point *b)
  3761. {
  3762. int ret;
  3763. /* prevents null arguments */
  3764. if (a == NULL || b == NULL)
  3765. return BAD_FUNC_ARG;
  3766. ret = mp_cmp(a->x, b->x);
  3767. if (ret != MP_EQ)
  3768. return ret;
  3769. ret = mp_cmp(a->y, b->y);
  3770. if (ret != MP_EQ)
  3771. return ret;
  3772. ret = mp_cmp(a->z, b->z);
  3773. if (ret != MP_EQ)
  3774. return ret;
  3775. return MP_EQ;
  3776. }
  3777. /** Returns whether an ECC idx is valid or not
  3778. n The idx number to check
  3779. return 1 if valid, 0 if not
  3780. */
  3781. int wc_ecc_is_valid_idx(int n)
  3782. {
  3783. int x;
  3784. if (n >= (int)ECC_SET_COUNT)
  3785. return 0;
  3786. for (x = 0; ecc_sets[x].size != 0; x++)
  3787. ;
  3788. /* -1 is a valid index --- indicating that the domain params
  3789. were supplied by the user */
  3790. if ((n >= ECC_CUSTOM_IDX) && (n < x)) {
  3791. return 1;
  3792. }
  3793. return 0;
  3794. }
  3795. int wc_ecc_get_curve_idx(int curve_id)
  3796. {
  3797. int curve_idx;
  3798. for (curve_idx = 0; ecc_sets[curve_idx].size != 0; curve_idx++) {
  3799. if (curve_id == ecc_sets[curve_idx].id)
  3800. break;
  3801. }
  3802. if (ecc_sets[curve_idx].size == 0) {
  3803. return ECC_CURVE_INVALID;
  3804. }
  3805. return curve_idx;
  3806. }
  3807. int wc_ecc_get_curve_id(int curve_idx)
  3808. {
  3809. if (wc_ecc_is_valid_idx(curve_idx)) {
  3810. return ecc_sets[curve_idx].id;
  3811. }
  3812. return ECC_CURVE_INVALID;
  3813. }
  3814. /* Returns the curve size that corresponds to a given ecc_curve_id identifier
  3815. *
  3816. * id curve id, from ecc_curve_id enum in ecc.h
  3817. * return curve size, from ecc_sets[] on success, negative on error
  3818. */
  3819. int wc_ecc_get_curve_size_from_id(int curve_id)
  3820. {
  3821. int curve_idx = wc_ecc_get_curve_idx(curve_id);
  3822. if (curve_idx == ECC_CURVE_INVALID)
  3823. return ECC_BAD_ARG_E;
  3824. return ecc_sets[curve_idx].size;
  3825. }
  3826. /* Returns the curve index that corresponds to a given curve name in
  3827. * ecc_sets[] of ecc.c
  3828. *
  3829. * name curve name, from ecc_sets[].name in ecc.c
  3830. * return curve index in ecc_sets[] on success, negative on error
  3831. */
  3832. int wc_ecc_get_curve_idx_from_name(const char* curveName)
  3833. {
  3834. int curve_idx;
  3835. if (curveName == NULL)
  3836. return BAD_FUNC_ARG;
  3837. for (curve_idx = 0; ecc_sets[curve_idx].size != 0; curve_idx++) {
  3838. if (
  3839. #ifndef WOLFSSL_ECC_CURVE_STATIC
  3840. ecc_sets[curve_idx].name &&
  3841. #endif
  3842. XSTRCASECMP(ecc_sets[curve_idx].name, curveName) == 0) {
  3843. break;
  3844. }
  3845. }
  3846. if (ecc_sets[curve_idx].size == 0) {
  3847. WOLFSSL_MSG("ecc_set curve name not found");
  3848. return ECC_CURVE_INVALID;
  3849. }
  3850. return curve_idx;
  3851. }
  3852. /* Returns the curve size that corresponds to a given curve name,
  3853. * as listed in ecc_sets[] of ecc.c.
  3854. *
  3855. * name curve name, from ecc_sets[].name in ecc.c
  3856. * return curve size, from ecc_sets[] on success, negative on error
  3857. */
  3858. int wc_ecc_get_curve_size_from_name(const char* curveName)
  3859. {
  3860. int curve_idx;
  3861. if (curveName == NULL)
  3862. return BAD_FUNC_ARG;
  3863. curve_idx = wc_ecc_get_curve_idx_from_name(curveName);
  3864. if (curve_idx < 0)
  3865. return curve_idx;
  3866. return ecc_sets[curve_idx].size;
  3867. }
  3868. /* Returns the curve id that corresponds to a given curve name,
  3869. * as listed in ecc_sets[] of ecc.c.
  3870. *
  3871. * name curve name, from ecc_sets[].name in ecc.c
  3872. * return curve id, from ecc_sets[] on success, negative on error
  3873. */
  3874. int wc_ecc_get_curve_id_from_name(const char* curveName)
  3875. {
  3876. int curve_idx;
  3877. if (curveName == NULL)
  3878. return BAD_FUNC_ARG;
  3879. curve_idx = wc_ecc_get_curve_idx_from_name(curveName);
  3880. if (curve_idx < 0)
  3881. return curve_idx;
  3882. return ecc_sets[curve_idx].id;
  3883. }
  3884. /* Compares a curve parameter (hex, from ecc_sets[]) to given input
  3885. * parameter for equality.
  3886. * encType is WC_TYPE_UNSIGNED_BIN or WC_TYPE_HEX_STR
  3887. * Returns MP_EQ on success, negative on error */
  3888. static int wc_ecc_cmp_param(const char* curveParam,
  3889. const byte* param, word32 paramSz, int encType)
  3890. {
  3891. int err = MP_OKAY;
  3892. #ifdef WOLFSSL_SMALL_STACK
  3893. mp_int* a = NULL;
  3894. mp_int* b = NULL;
  3895. #else
  3896. mp_int a[1], b[1];
  3897. #endif
  3898. if (param == NULL || curveParam == NULL)
  3899. return BAD_FUNC_ARG;
  3900. if (encType == WC_TYPE_HEX_STR)
  3901. return XSTRNCMP(curveParam, (char*) param, paramSz);
  3902. #ifdef WOLFSSL_SMALL_STACK
  3903. a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  3904. if (a == NULL)
  3905. return MEMORY_E;
  3906. b = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  3907. if (b == NULL) {
  3908. XFREE(a, NULL, DYNAMIC_TYPE_ECC);
  3909. return MEMORY_E;
  3910. }
  3911. #endif
  3912. if ((err = mp_init_multi(a, b, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  3913. #ifdef WOLFSSL_SMALL_STACK
  3914. XFREE(a, NULL, DYNAMIC_TYPE_ECC);
  3915. XFREE(b, NULL, DYNAMIC_TYPE_ECC);
  3916. #endif
  3917. return err;
  3918. }
  3919. if (err == MP_OKAY) {
  3920. err = mp_read_unsigned_bin(a, param, paramSz);
  3921. }
  3922. if (err == MP_OKAY)
  3923. err = mp_read_radix(b, curveParam, MP_RADIX_HEX);
  3924. if (err == MP_OKAY) {
  3925. if (mp_cmp(a, b) != MP_EQ) {
  3926. err = -1;
  3927. } else {
  3928. err = MP_EQ;
  3929. }
  3930. }
  3931. mp_clear(a);
  3932. mp_clear(b);
  3933. #ifdef WOLFSSL_SMALL_STACK
  3934. XFREE(b, NULL, DYNAMIC_TYPE_ECC);
  3935. XFREE(a, NULL, DYNAMIC_TYPE_ECC);
  3936. #endif
  3937. return err;
  3938. }
  3939. /* Returns the curve id in ecc_sets[] that corresponds to a given set of
  3940. * curve parameters.
  3941. *
  3942. * fieldSize the field size in bits
  3943. * prime prime of the finite field
  3944. * primeSz size of prime in octets
  3945. * Af first coefficient a of the curve
  3946. * AfSz size of Af in octets
  3947. * Bf second coefficient b of the curve
  3948. * BfSz size of Bf in octets
  3949. * order curve order
  3950. * orderSz size of curve in octets
  3951. * Gx affine x coordinate of base point
  3952. * GxSz size of Gx in octets
  3953. * Gy affine y coordinate of base point
  3954. * GySz size of Gy in octets
  3955. * cofactor curve cofactor
  3956. *
  3957. * return curve id, from ecc_sets[] on success, negative on error
  3958. */
  3959. int wc_ecc_get_curve_id_from_params(int fieldSize,
  3960. const byte* prime, word32 primeSz, const byte* Af, word32 AfSz,
  3961. const byte* Bf, word32 BfSz, const byte* order, word32 orderSz,
  3962. const byte* Gx, word32 GxSz, const byte* Gy, word32 GySz, int cofactor)
  3963. {
  3964. int idx;
  3965. int curveSz;
  3966. if (prime == NULL || Af == NULL || Bf == NULL || order == NULL ||
  3967. Gx == NULL || Gy == NULL)
  3968. return BAD_FUNC_ARG;
  3969. curveSz = (fieldSize + 1) / 8; /* round up */
  3970. for (idx = 0; ecc_sets[idx].size != 0; idx++) {
  3971. if (curveSz == ecc_sets[idx].size) {
  3972. if ((wc_ecc_cmp_param(ecc_sets[idx].prime, prime,
  3973. primeSz, WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3974. (wc_ecc_cmp_param(ecc_sets[idx].Af, Af, AfSz,
  3975. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3976. (wc_ecc_cmp_param(ecc_sets[idx].Bf, Bf, BfSz,
  3977. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3978. (wc_ecc_cmp_param(ecc_sets[idx].order, order,
  3979. orderSz, WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3980. (wc_ecc_cmp_param(ecc_sets[idx].Gx, Gx, GxSz,
  3981. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3982. (wc_ecc_cmp_param(ecc_sets[idx].Gy, Gy, GySz,
  3983. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3984. (cofactor == ecc_sets[idx].cofactor)) {
  3985. break;
  3986. }
  3987. }
  3988. }
  3989. if (ecc_sets[idx].size == 0)
  3990. return ECC_CURVE_INVALID;
  3991. return ecc_sets[idx].id;
  3992. }
  3993. /* Returns the curve id in ecc_sets[] that corresponds
  3994. * to a given domain parameters pointer.
  3995. *
  3996. * dp domain parameters pointer
  3997. *
  3998. * return curve id, from ecc_sets[] on success, negative on error
  3999. */
  4000. int wc_ecc_get_curve_id_from_dp_params(const ecc_set_type* dp)
  4001. {
  4002. int idx;
  4003. if (dp == NULL
  4004. #ifndef WOLFSSL_ECC_CURVE_STATIC
  4005. || dp->prime == NULL || dp->Af == NULL ||
  4006. dp->Bf == NULL || dp->order == NULL || dp->Gx == NULL || dp->Gy == NULL
  4007. #endif
  4008. ) {
  4009. return BAD_FUNC_ARG;
  4010. }
  4011. for (idx = 0; ecc_sets[idx].size != 0; idx++) {
  4012. if (dp->size == ecc_sets[idx].size) {
  4013. if ((wc_ecc_cmp_param(ecc_sets[idx].prime, (const byte*)dp->prime,
  4014. (word32)XSTRLEN(dp->prime), WC_TYPE_HEX_STR) == MP_EQ) &&
  4015. (wc_ecc_cmp_param(ecc_sets[idx].Af, (const byte*)dp->Af,
  4016. (word32)XSTRLEN(dp->Af),WC_TYPE_HEX_STR) == MP_EQ) &&
  4017. (wc_ecc_cmp_param(ecc_sets[idx].Bf, (const byte*)dp->Bf,
  4018. (word32)XSTRLEN(dp->Bf),WC_TYPE_HEX_STR) == MP_EQ) &&
  4019. (wc_ecc_cmp_param(ecc_sets[idx].order, (const byte*)dp->order,
  4020. (word32)XSTRLEN(dp->order),WC_TYPE_HEX_STR) == MP_EQ) &&
  4021. (wc_ecc_cmp_param(ecc_sets[idx].Gx, (const byte*)dp->Gx,
  4022. (word32)XSTRLEN(dp->Gx),WC_TYPE_HEX_STR) == MP_EQ) &&
  4023. (wc_ecc_cmp_param(ecc_sets[idx].Gy, (const byte*)dp->Gy,
  4024. (word32)XSTRLEN(dp->Gy),WC_TYPE_HEX_STR) == MP_EQ) &&
  4025. (dp->cofactor == ecc_sets[idx].cofactor)) {
  4026. break;
  4027. }
  4028. }
  4029. }
  4030. if (ecc_sets[idx].size == 0)
  4031. return ECC_CURVE_INVALID;
  4032. return ecc_sets[idx].id;
  4033. }
  4034. /* Returns the curve id that corresponds to a given OID,
  4035. * as listed in ecc_sets[] of ecc.c.
  4036. *
  4037. * oid OID, from ecc_sets[].name in ecc.c
  4038. * len OID len, from ecc_sets[].name in ecc.c
  4039. * return curve id, from ecc_sets[] on success, negative on error
  4040. */
  4041. int wc_ecc_get_curve_id_from_oid(const byte* oid, word32 len)
  4042. {
  4043. int curve_idx;
  4044. #if defined(HAVE_OID_DECODING) || defined(HAVE_OID_ENCODING)
  4045. int ret;
  4046. #ifdef HAVE_OID_DECODING
  4047. word16 decOid[MAX_OID_SZ/sizeof(word16)];
  4048. #else
  4049. byte decOid[MAX_OID_SZ];
  4050. #endif
  4051. word32 decOidSz;
  4052. #endif
  4053. if (oid == NULL)
  4054. return BAD_FUNC_ARG;
  4055. #ifdef HAVE_OID_DECODING
  4056. decOidSz = (word32)sizeof(decOid);
  4057. ret = DecodeObjectId(oid, len, decOid, &decOidSz);
  4058. if (ret != 0) {
  4059. return ret;
  4060. }
  4061. #endif
  4062. #if !defined(HAVE_OID_ENCODING) && !defined(HAVE_OID_DECODING)
  4063. if (len == 0) {
  4064. /* SAKKE has zero oidSz and will otherwise match with len==0. */
  4065. WOLFSSL_MSG("zero oidSz");
  4066. return ECC_CURVE_INVALID;
  4067. }
  4068. #endif
  4069. for (curve_idx = 0; ecc_sets[curve_idx].size != 0; curve_idx++) {
  4070. #if defined(HAVE_OID_ENCODING) && !defined(HAVE_OID_DECODING)
  4071. decOidSz = (word32)sizeof(decOid);
  4072. ret = EncodeObjectId(ecc_sets[curve_idx].oid, ecc_sets[curve_idx].oidSz,
  4073. decOid, &decOidSz);
  4074. if (ret != 0) {
  4075. continue;
  4076. }
  4077. #endif
  4078. if (
  4079. #ifndef WOLFSSL_ECC_CURVE_STATIC
  4080. ecc_sets[curve_idx].oid &&
  4081. #endif
  4082. #if defined(HAVE_OID_ENCODING) && !defined(HAVE_OID_DECODING)
  4083. decOidSz == len &&
  4084. XMEMCMP(decOid, oid, len) == 0
  4085. #elif defined(HAVE_OID_ENCODING) && defined(HAVE_OID_DECODING)
  4086. /* We double because decOidSz is a count of word16 elements. */
  4087. ecc_sets[curve_idx].oidSz == decOidSz &&
  4088. XMEMCMP(ecc_sets[curve_idx].oid, decOid, decOidSz * 2) == 0
  4089. #else
  4090. ecc_sets[curve_idx].oidSz == len &&
  4091. XMEMCMP(ecc_sets[curve_idx].oid, oid, len) == 0
  4092. #endif
  4093. ) {
  4094. break;
  4095. }
  4096. }
  4097. if (ecc_sets[curve_idx].size == 0) {
  4098. WOLFSSL_MSG("ecc_set curve name not found");
  4099. return ECC_CURVE_INVALID;
  4100. }
  4101. return ecc_sets[curve_idx].id;
  4102. }
  4103. /* Get curve parameters using curve index */
  4104. const ecc_set_type* wc_ecc_get_curve_params(int curve_idx)
  4105. {
  4106. const ecc_set_type* ecc_set = NULL;
  4107. if (curve_idx >= 0 && curve_idx < (int)ECC_SET_COUNT) {
  4108. ecc_set = &ecc_sets[curve_idx];
  4109. }
  4110. return ecc_set;
  4111. }
  4112. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4113. static WC_INLINE int wc_ecc_alloc_mpint(ecc_key* key, mp_int** mp)
  4114. {
  4115. if (key == NULL || mp == NULL)
  4116. return BAD_FUNC_ARG;
  4117. if (*mp == NULL) {
  4118. *mp = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_BIGINT);
  4119. if (*mp == NULL) {
  4120. return MEMORY_E;
  4121. }
  4122. XMEMSET(*mp, 0, sizeof(mp_int));
  4123. }
  4124. return 0;
  4125. }
  4126. static WC_INLINE void wc_ecc_free_mpint(ecc_key* key, mp_int** mp)
  4127. {
  4128. if (key && mp && *mp) {
  4129. mp_clear(*mp);
  4130. XFREE(*mp, key->heap, DYNAMIC_TYPE_BIGINT);
  4131. *mp = NULL;
  4132. }
  4133. }
  4134. static int wc_ecc_alloc_async(ecc_key* key)
  4135. {
  4136. int err = wc_ecc_alloc_mpint(key, &key->r);
  4137. if (err == 0)
  4138. err = wc_ecc_alloc_mpint(key, &key->s);
  4139. return err;
  4140. }
  4141. static void wc_ecc_free_async(ecc_key* key)
  4142. {
  4143. wc_ecc_free_mpint(key, &key->r);
  4144. wc_ecc_free_mpint(key, &key->s);
  4145. #ifdef HAVE_CAVIUM_V
  4146. wc_ecc_free_mpint(key, &key->e);
  4147. wc_ecc_free_mpint(key, &key->signK);
  4148. #endif /* HAVE_CAVIUM_V */
  4149. }
  4150. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  4151. #ifdef HAVE_ECC_DHE
  4152. /**
  4153. Create an ECC shared secret between two keys
  4154. private_key The private ECC key (heap hint based off of private key)
  4155. public_key The public key
  4156. out [out] Destination of the shared secret
  4157. Conforms to EC-DH from ANSI X9.63
  4158. outlen [in/out] The max size and resulting size of the shared secret
  4159. return MP_OKAY if successful
  4160. */
  4161. WOLFSSL_ABI
  4162. int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out,
  4163. word32* outlen)
  4164. {
  4165. int err = 0;
  4166. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  4167. !defined(WOLFSSL_ATECC608A)
  4168. CRYS_ECDH_TempData_t tempBuff;
  4169. #endif
  4170. (void)err;
  4171. if (private_key == NULL || public_key == NULL || out == NULL ||
  4172. outlen == NULL) {
  4173. return BAD_FUNC_ARG;
  4174. }
  4175. #ifdef WOLF_CRYPTO_CB
  4176. #ifndef WOLF_CRYPTO_CB_FIND
  4177. if (private_key->devId != INVALID_DEVID)
  4178. #endif
  4179. {
  4180. err = wc_CryptoCb_Ecdh(private_key, public_key, out, outlen);
  4181. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  4182. if (err != CRYPTOCB_UNAVAILABLE)
  4183. return err;
  4184. /* fall-through when unavailable */
  4185. #endif
  4186. #ifdef WOLF_CRYPTO_CB_ONLY_ECC
  4187. if (err == CRYPTOCB_UNAVAILABLE) {
  4188. err = NO_VALID_DEVID;
  4189. }
  4190. #endif
  4191. }
  4192. #endif
  4193. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  4194. /* type valid? */
  4195. if (private_key->type != ECC_PRIVATEKEY &&
  4196. private_key->type != ECC_PRIVATEKEY_ONLY) {
  4197. return ECC_BAD_ARG_E;
  4198. }
  4199. /* Verify domain params supplied */
  4200. if (wc_ecc_is_valid_idx(private_key->idx) == 0 || private_key->dp == NULL ||
  4201. wc_ecc_is_valid_idx(public_key->idx) == 0 || public_key->dp == NULL) {
  4202. return ECC_BAD_ARG_E;
  4203. }
  4204. /* Verify curve id matches */
  4205. if (private_key->dp->id != public_key->dp->id) {
  4206. return ECC_BAD_ARG_E;
  4207. }
  4208. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  4209. /* For SECP256R1 use hardware */
  4210. if (private_key->dp->id == ECC_SECP256R1) {
  4211. err = atmel_ecc_create_pms(private_key->slot, public_key->pubkey_raw, out);
  4212. *outlen = private_key->dp->size;
  4213. }
  4214. else {
  4215. err = NOT_COMPILED_IN;
  4216. }
  4217. #elif defined(WOLFSSL_CRYPTOCELL)
  4218. /* generate a secret*/
  4219. err = CRYS_ECDH_SVDP_DH(&public_key->ctx.pubKey,
  4220. &private_key->ctx.privKey,
  4221. out,
  4222. (uint32_t*)outlen,
  4223. &tempBuff);
  4224. if (err != SA_SILIB_RET_OK){
  4225. WOLFSSL_MSG("CRYS_ECDH_SVDP_DH for secret failed");
  4226. return err;
  4227. }
  4228. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  4229. err = silabs_ecc_shared_secret(private_key, public_key, out, outlen);
  4230. #elif defined(WOLFSSL_KCAPI_ECC)
  4231. err = KcapiEcc_SharedSecret(private_key, public_key, out, outlen);
  4232. #elif defined(WOLFSSL_SE050)
  4233. err = se050_ecc_shared_secret(private_key, public_key, out, outlen);
  4234. #else
  4235. err = wc_ecc_shared_secret_ex(private_key, &public_key->pubkey, out, outlen);
  4236. #endif /* WOLFSSL_ATECC508A */
  4237. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  4238. return err;
  4239. }
  4240. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  4241. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_KCAPI_ECC) && \
  4242. !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  4243. int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point,
  4244. byte* out, word32* outlen)
  4245. {
  4246. int err = MP_OKAY;
  4247. mp_int* k = private_key->k;
  4248. #ifdef HAVE_ECC_CDH
  4249. #ifdef WOLFSSL_SMALL_STACK
  4250. mp_int *k_lcl = NULL;
  4251. #else
  4252. mp_int k_lcl[1];
  4253. #endif
  4254. #endif
  4255. #if defined(WOLFSSL_HAVE_SP_ECC) && defined(WC_ECC_NONBLOCK) && \
  4256. defined(WC_ECC_NONBLOCK_ONLY)
  4257. ecc_nb_ctx_t nb_ctx;
  4258. XMEMSET(&nb_ctx, 0, sizeof(nb_ctx));
  4259. #endif /* WOLFSSL_HAVE_SP_ECC && WC_ECC_NONBLOCK && WC_ECC_NONBLOCK_ONLY */
  4260. #ifdef HAVE_ECC_CDH
  4261. /* if cofactor flag has been set */
  4262. if (private_key->flags & WC_ECC_FLAG_COFACTOR) {
  4263. mp_digit cofactor = (mp_digit)private_key->dp->cofactor;
  4264. /* only perform cofactor calc if not equal to 1 */
  4265. if (cofactor != 1) {
  4266. #ifdef WOLFSSL_SMALL_STACK
  4267. if ((k_lcl = (mp_int *)XMALLOC(sizeof(*k_lcl), private_key->heap, DYNAMIC_TYPE_ECC_BUFFER)) == NULL)
  4268. return MEMORY_E;
  4269. #endif
  4270. k = k_lcl;
  4271. if (mp_init(k) != MP_OKAY) {
  4272. err = MEMORY_E;
  4273. goto errout;
  4274. }
  4275. /* multiply cofactor times private key "k" */
  4276. err = mp_mul_d(private_key->k, cofactor, k);
  4277. if (err != MP_OKAY)
  4278. goto errout;
  4279. }
  4280. }
  4281. #endif
  4282. #ifdef WOLFSSL_HAVE_SP_ECC
  4283. #ifndef WOLFSSL_SP_NO_256
  4284. if (private_key->idx != ECC_CUSTOM_IDX &&
  4285. ecc_sets[private_key->idx].id == ECC_SECP256R1) {
  4286. #ifndef WC_ECC_NONBLOCK
  4287. err = sp_ecc_secret_gen_256(k, point, out, outlen, private_key->heap);
  4288. #else
  4289. if (private_key->nb_ctx) {
  4290. err = sp_ecc_secret_gen_256_nb(&private_key->nb_ctx->sp_ctx, k,
  4291. point, out, outlen,
  4292. private_key->heap);
  4293. }
  4294. else {
  4295. #ifdef WC_ECC_NONBLOCK_ONLY
  4296. do { /* perform blocking call to non-blocking function */
  4297. err = sp_ecc_secret_gen_256_nb(&nb_ctx.sp_ctx, k, point, out,
  4298. outlen, private_key->heap);
  4299. } while (err == FP_WOULDBLOCK);
  4300. #else
  4301. err = sp_ecc_secret_gen_256(k, point, out, outlen,
  4302. private_key->heap);
  4303. #endif /* WC_ECC_NONBLOCK_ONLY */
  4304. }
  4305. #endif /* !WC_ECC_NONBLOCK */
  4306. }
  4307. else
  4308. #endif /* ! WOLFSSL_SP_NO_256 */
  4309. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  4310. if (private_key->idx != ECC_CUSTOM_IDX &&
  4311. ecc_sets[private_key->idx].id == ECC_SM2P256V1) {
  4312. err = sp_ecc_secret_gen_sm2_256(k, point, out, outlen,
  4313. private_key->heap);
  4314. }
  4315. else
  4316. #endif
  4317. #ifdef WOLFSSL_SP_384
  4318. if (private_key->idx != ECC_CUSTOM_IDX &&
  4319. ecc_sets[private_key->idx].id == ECC_SECP384R1) {
  4320. #ifndef WC_ECC_NONBLOCK
  4321. err = sp_ecc_secret_gen_384(k, point, out, outlen, private_key->heap);
  4322. #else
  4323. if (private_key->nb_ctx) {
  4324. err = sp_ecc_secret_gen_384_nb(&private_key->nb_ctx->sp_ctx, k,
  4325. point, out, outlen,
  4326. private_key->heap);
  4327. }
  4328. else {
  4329. #ifdef WC_ECC_NONBLOCK_ONLY
  4330. do { /* perform blocking call to non-blocking function */
  4331. err = sp_ecc_secret_gen_384_nb(&nb_ctx.sp_ctx, k, point, out,
  4332. outlen, private_key->heap);
  4333. } while (err == FP_WOULDBLOCK);
  4334. #else
  4335. err = sp_ecc_secret_gen_384(k, point, out, outlen,
  4336. private_key->heap);
  4337. #endif /* WC_ECC_NONBLOCK_ONLY */
  4338. }
  4339. #endif /* !WC_ECC_NONBLOCK */
  4340. }
  4341. else
  4342. #endif /* WOLFSSL_SP_384 */
  4343. #ifdef WOLFSSL_SP_521
  4344. if (private_key->idx != ECC_CUSTOM_IDX &&
  4345. ecc_sets[private_key->idx].id == ECC_SECP521R1) {
  4346. #ifndef WC_ECC_NONBLOCK
  4347. err = sp_ecc_secret_gen_521(k, point, out, outlen, private_key->heap);
  4348. #else
  4349. if (private_key->nb_ctx) {
  4350. err = sp_ecc_secret_gen_521_nb(&private_key->nb_ctx->sp_ctx, k,
  4351. point, out, outlen,
  4352. private_key->heap);
  4353. }
  4354. else {
  4355. #ifdef WC_ECC_NONBLOCK_ONLY
  4356. do { /* perform blocking call to non-blocking function */
  4357. err = sp_ecc_secret_gen_521_nb(&nb_ctx.sp_ctx, k, point, out,
  4358. outlen, private_key->heap);
  4359. } while (err == FP_WOULDBLOCK);
  4360. #else
  4361. err = sp_ecc_secret_gen_521(k, point, out, outlen,
  4362. private_key->heap);
  4363. #endif /* WC_ECC_NONBLOCK_ONLY */
  4364. }
  4365. #endif /* !WC_ECC_NONBLOCK */
  4366. }
  4367. else
  4368. #endif /* WOLFSSL_SP_521 */
  4369. #else
  4370. (void)point;
  4371. (void)out;
  4372. (void)outlen;
  4373. (void)k;
  4374. #endif
  4375. #if defined(WOLFSSL_SP_MATH)
  4376. {
  4377. err = WC_KEY_SIZE_E;
  4378. goto errout;
  4379. }
  4380. #else
  4381. {
  4382. ecc_point* result = NULL;
  4383. #ifdef WOLFSSL_NO_MALLOC
  4384. ecc_point lcl_result;
  4385. #endif
  4386. int x = 0;
  4387. mp_digit mp = 0;
  4388. DECLARE_CURVE_SPECS(3);
  4389. /* load curve info */
  4390. ALLOC_CURVE_SPECS(3, err);
  4391. if (err == MP_OKAY) {
  4392. err = wc_ecc_curve_load(private_key->dp, &curve,
  4393. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  4394. ECC_CURVE_FIELD_ORDER));
  4395. }
  4396. if (err != MP_OKAY) {
  4397. FREE_CURVE_SPECS();
  4398. goto errout;
  4399. }
  4400. /* make new point */
  4401. #ifdef WOLFSSL_NO_MALLOC
  4402. result = &lcl_result;
  4403. #endif
  4404. err = wc_ecc_new_point_ex(&result, private_key->heap);
  4405. if (err != MP_OKAY) {
  4406. wc_ecc_curve_free(curve);
  4407. FREE_CURVE_SPECS();
  4408. goto errout;
  4409. }
  4410. #ifdef ECC_TIMING_RESISTANT
  4411. if (private_key->rng == NULL) {
  4412. err = MISSING_RNG_E;
  4413. }
  4414. #endif
  4415. if (err == MP_OKAY) {
  4416. /* Map in a separate call as this should be constant time */
  4417. #ifdef ECC_TIMING_RESISTANT
  4418. err = wc_ecc_mulmod_ex2(k, point, result, curve->Af, curve->prime,
  4419. curve->order, private_key->rng, 0,
  4420. private_key->heap);
  4421. #else
  4422. err = wc_ecc_mulmod_ex2(k, point, result, curve->Af, curve->prime,
  4423. curve->order, NULL, 0, private_key->heap);
  4424. #endif
  4425. }
  4426. if (err == MP_OKAY) {
  4427. #ifdef WOLFSSL_CHECK_MEM_ZERO
  4428. mp_memzero_add("wc_ecc_shared_secret_gen_sync result->x",
  4429. result->x);
  4430. mp_memzero_add("wc_ecc_shared_secret_gen_sync result->y",
  4431. result->y);
  4432. #endif
  4433. err = mp_montgomery_setup(curve->prime, &mp);
  4434. }
  4435. if (err == MP_OKAY) {
  4436. /* Use constant time map if compiled in */
  4437. err = ecc_map_ex(result, curve->prime, mp, 1);
  4438. }
  4439. if (err == MP_OKAY) {
  4440. x = mp_unsigned_bin_size(curve->prime);
  4441. if (*outlen < (word32)x || x < mp_unsigned_bin_size(result->x)) {
  4442. err = BUFFER_E;
  4443. }
  4444. }
  4445. if (err == MP_OKAY) {
  4446. XMEMSET(out, 0, (size_t)x);
  4447. err = mp_to_unsigned_bin(result->x, out +
  4448. (x - mp_unsigned_bin_size(result->x)));
  4449. }
  4450. *outlen = (word32)x;
  4451. mp_forcezero(result->x);
  4452. mp_forcezero(result->y);
  4453. wc_ecc_del_point_ex(result, private_key->heap);
  4454. wc_ecc_curve_free(curve);
  4455. FREE_CURVE_SPECS();
  4456. }
  4457. #endif
  4458. errout:
  4459. #ifdef HAVE_ECC_CDH
  4460. if (k == k_lcl)
  4461. mp_clear(k);
  4462. #ifdef WOLFSSL_SMALL_STACK
  4463. if (k_lcl != NULL)
  4464. XFREE(k_lcl, private_key->heap, DYNAMIC_TYPE_ECC_BUFFER);
  4465. #endif
  4466. #endif
  4467. return err;
  4468. }
  4469. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4470. static int wc_ecc_shared_secret_gen_async(ecc_key* private_key,
  4471. ecc_point* point, byte* out, word32 *outlen)
  4472. {
  4473. int err = 0;
  4474. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  4475. DECLARE_CURVE_SPECS(3);
  4476. /* load curve info */
  4477. ALLOC_CURVE_SPECS(3, err);
  4478. if (err == MP_OKAY) {
  4479. err = wc_ecc_curve_load(private_key->dp, &curve,
  4480. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  4481. ECC_CURVE_FIELD_ORDER));
  4482. }
  4483. if (err != MP_OKAY) {
  4484. FREE_CURVE_SPECS();
  4485. return err;
  4486. }
  4487. if (private_key->dp
  4488. #ifdef WOLFSSL_CUSTOM_CURVES
  4489. && private_key->dp->id != ECC_CURVE_CUSTOM
  4490. #endif
  4491. #ifdef HAVE_CAVIUM_V
  4492. /* verify the curve is supported by hardware */
  4493. && NitroxEccIsCurveSupported(private_key)
  4494. #endif
  4495. ) {
  4496. word32 keySz = private_key->dp->size;
  4497. /* sync public key x/y */
  4498. err = wc_mp_to_bigint_sz(private_key->k, &private_key->k->raw, keySz);
  4499. if (err == MP_OKAY)
  4500. err = wc_mp_to_bigint_sz(point->x, &point->x->raw, keySz);
  4501. if (err == MP_OKAY)
  4502. err = wc_mp_to_bigint_sz(point->y, &point->y->raw, keySz);
  4503. #ifdef HAVE_CAVIUM_V
  4504. /* allocate buffer for output */
  4505. if (err == MP_OKAY)
  4506. err = wc_ecc_alloc_mpint(private_key, &private_key->e);
  4507. if (err == MP_OKAY)
  4508. err = wc_bigint_alloc(&private_key->e->raw,
  4509. NitroxEccGetSize(private_key)*2);
  4510. if (err == MP_OKAY)
  4511. err = NitroxEcdh(private_key,
  4512. &private_key->k->raw, &point->x->raw, &point->y->raw,
  4513. private_key->e->raw.buf, &private_key->e->raw.len,
  4514. &curve->prime->raw);
  4515. #else
  4516. if (err == MP_OKAY)
  4517. err = wc_ecc_curve_load(private_key->dp, &curve, ECC_CURVE_FIELD_BF);
  4518. if (err == MP_OKAY)
  4519. err = IntelQaEcdh(&private_key->asyncDev,
  4520. &private_key->k->raw, &point->x->raw, &point->y->raw,
  4521. out, outlen,
  4522. &curve->Af->raw, &curve->Bf->raw, &curve->prime->raw,
  4523. private_key->dp->cofactor);
  4524. #endif
  4525. }
  4526. else
  4527. #elif defined(WOLFSSL_ASYNC_CRYPT_SW)
  4528. if (wc_AsyncSwInit(&private_key->asyncDev, ASYNC_SW_ECC_SHARED_SEC)) {
  4529. WC_ASYNC_SW* sw = &private_key->asyncDev.sw;
  4530. sw->eccSharedSec.private_key = private_key;
  4531. sw->eccSharedSec.public_point = point;
  4532. sw->eccSharedSec.out = out;
  4533. sw->eccSharedSec.outLen = outlen;
  4534. err = WC_PENDING_E;
  4535. }
  4536. else
  4537. #endif
  4538. {
  4539. /* use sync in other cases */
  4540. err = wc_ecc_shared_secret_gen_sync(private_key, point, out, outlen);
  4541. }
  4542. if (err == WC_PENDING_E) {
  4543. private_key->state++;
  4544. }
  4545. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  4546. wc_ecc_curve_free(curve);
  4547. FREE_CURVE_SPECS();
  4548. #endif
  4549. return err;
  4550. }
  4551. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  4552. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  4553. /**
  4554. Create an ECC shared secret between private key and public point
  4555. private_key The private ECC key (heap hint based on private key)
  4556. point The point to use (public key)
  4557. out [out] Destination of the shared secret
  4558. Conforms to EC-DH from ANSI X9.63
  4559. outlen [in/out] The max size and resulting size of the shared secret
  4560. return MP_OKAY if successful
  4561. */
  4562. int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
  4563. byte* out, word32 *outlen)
  4564. {
  4565. int err;
  4566. if (private_key == NULL || point == NULL || out == NULL ||
  4567. outlen == NULL) {
  4568. return BAD_FUNC_ARG;
  4569. }
  4570. /* type valid? */
  4571. if (private_key->type != ECC_PRIVATEKEY &&
  4572. private_key->type != ECC_PRIVATEKEY_ONLY) {
  4573. WOLFSSL_MSG("ECC_BAD_ARG_E");
  4574. return ECC_BAD_ARG_E;
  4575. }
  4576. /* Verify domain params supplied */
  4577. if (wc_ecc_is_valid_idx(private_key->idx) == 0 || private_key->dp == NULL) {
  4578. WOLFSSL_MSG("wc_ecc_is_valid_idx failed");
  4579. return ECC_BAD_ARG_E;
  4580. }
  4581. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  4582. switch (private_key->state) {
  4583. case ECC_STATE_NONE:
  4584. case ECC_STATE_SHARED_SEC_GEN:
  4585. private_key->state = ECC_STATE_SHARED_SEC_GEN;
  4586. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4587. if (private_key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4588. err = wc_ecc_shared_secret_gen_async(private_key, point,
  4589. out, outlen);
  4590. }
  4591. else
  4592. #endif
  4593. {
  4594. err = wc_ecc_shared_secret_gen_sync(private_key, point,
  4595. out, outlen);
  4596. }
  4597. if (err < 0) {
  4598. break;
  4599. }
  4600. FALL_THROUGH;
  4601. case ECC_STATE_SHARED_SEC_RES:
  4602. private_key->state = ECC_STATE_SHARED_SEC_RES;
  4603. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4604. if (private_key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4605. #ifdef HAVE_CAVIUM_V
  4606. /* verify the curve is supported by hardware */
  4607. if (NitroxEccIsCurveSupported(private_key)) {
  4608. /* copy output */
  4609. *outlen = private_key->dp->size;
  4610. XMEMCPY(out, private_key->e->raw.buf, *outlen);
  4611. }
  4612. #endif /* HAVE_CAVIUM_V */
  4613. }
  4614. #endif /* WOLFSSL_ASYNC_CRYPT */
  4615. err = 0;
  4616. break;
  4617. default:
  4618. err = BAD_STATE_E;
  4619. } /* switch */
  4620. RESTORE_VECTOR_REGISTERS();
  4621. /* if async pending then return and skip done cleanup below */
  4622. if (err == WC_PENDING_E) {
  4623. return err;
  4624. }
  4625. /* cleanup */
  4626. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4627. wc_ecc_free_async(private_key);
  4628. #endif
  4629. private_key->state = ECC_STATE_NONE;
  4630. return err;
  4631. }
  4632. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  4633. #elif defined(WOLFSSL_KCAPI_ECC)
  4634. int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
  4635. byte* out, word32 *outlen)
  4636. {
  4637. int err;
  4638. ecc_key public_key;
  4639. err = wc_ecc_init_ex(&public_key, private_key->heap, INVALID_DEVID);
  4640. if (err == MP_OKAY) {
  4641. err = wc_ecc_set_curve(&public_key, private_key->dp->size,
  4642. private_key->dp->id);
  4643. if (err == MP_OKAY) {
  4644. err = mp_copy(point->x, public_key.pubkey.x);
  4645. }
  4646. if (err == MP_OKAY) {
  4647. err = mp_copy(point->y, public_key.pubkey.y);
  4648. }
  4649. if (err == MP_OKAY) {
  4650. err = wc_ecc_shared_secret(private_key, &public_key, out, outlen);
  4651. }
  4652. wc_ecc_free(&public_key);
  4653. }
  4654. return err;
  4655. }
  4656. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL && !WOLFSSL_KCAPI_ECC */
  4657. #endif /* HAVE_ECC_DHE */
  4658. #ifdef USE_ECC_B_PARAM
  4659. /* Checks if a point p lies on the curve with index curve_idx */
  4660. int wc_ecc_point_is_on_curve(ecc_point *p, int curve_idx)
  4661. {
  4662. int err = MP_OKAY;
  4663. DECLARE_CURVE_SPECS(3);
  4664. if (p == NULL)
  4665. return BAD_FUNC_ARG;
  4666. /* is the IDX valid ? */
  4667. if (wc_ecc_is_valid_idx(curve_idx) == 0) {
  4668. return ECC_BAD_ARG_E;
  4669. }
  4670. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  4671. ALLOC_CURVE_SPECS(3, err);
  4672. if (err == MP_OKAY) {
  4673. err = wc_ecc_curve_load(wc_ecc_get_curve_params(curve_idx), &curve,
  4674. ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  4675. ECC_CURVE_FIELD_BF);
  4676. }
  4677. if (err == MP_OKAY) {
  4678. err = wc_ecc_is_point(p, curve->Af, curve->Bf, curve->prime);
  4679. }
  4680. wc_ecc_curve_free(curve);
  4681. FREE_CURVE_SPECS();
  4682. RESTORE_VECTOR_REGISTERS();
  4683. return err;
  4684. }
  4685. #endif /* USE_ECC_B_PARAM */
  4686. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  4687. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  4688. /* return 1 if point is at infinity, 0 if not, < 0 on error */
  4689. int wc_ecc_point_is_at_infinity(ecc_point* p)
  4690. {
  4691. if (p == NULL)
  4692. return BAD_FUNC_ARG;
  4693. if (mp_iszero(p->x) && mp_iszero(p->y))
  4694. return 1;
  4695. return 0;
  4696. }
  4697. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL */
  4698. /* generate random and ensure its greater than 0 and less than order */
  4699. int wc_ecc_gen_k(WC_RNG* rng, int size, mp_int* k, mp_int* order)
  4700. {
  4701. #ifndef WC_NO_RNG
  4702. #ifndef WOLFSSL_ECC_GEN_REJECT_SAMPLING
  4703. int err;
  4704. byte buf[ECC_MAXSIZE_GEN];
  4705. if (rng == NULL || size < 0 || size + 8 > ECC_MAXSIZE_GEN || k == NULL ||
  4706. order == NULL) {
  4707. return BAD_FUNC_ARG;
  4708. }
  4709. /* generate 8 extra bytes to mitigate bias from the modulo operation below */
  4710. /* see section A.1.2 in 'Suite B Implementor's Guide to FIPS 186-3 (ECDSA)' */
  4711. size += 8;
  4712. /* make up random string */
  4713. err = wc_RNG_GenerateBlock(rng, buf, (word32)size);
  4714. #ifdef WOLFSSL_CHECK_MEM_ZERO
  4715. wc_MemZero_Add("wc_ecc_gen_k buf", buf, size);
  4716. #endif
  4717. /* load random buffer data into k */
  4718. if (err == 0)
  4719. err = mp_read_unsigned_bin(k, buf, (word32)size);
  4720. /* the key should be smaller than the order of base point */
  4721. if (err == MP_OKAY) {
  4722. if (mp_cmp(k, order) != MP_LT) {
  4723. err = mp_mod(k, order, k);
  4724. }
  4725. }
  4726. /* quick sanity check to make sure we're not dealing with a 0 key */
  4727. if (err == MP_OKAY) {
  4728. if (mp_iszero(k) == MP_YES)
  4729. err = MP_ZERO_E;
  4730. }
  4731. ForceZero(buf, ECC_MAXSIZE_GEN);
  4732. #ifdef WOLFSSL_CHECK_MEM_ZERO
  4733. wc_MemZero_Check(buf, ECC_MAXSIZE_GEN);
  4734. #endif
  4735. return err;
  4736. #else
  4737. int err;
  4738. byte buf[ECC_MAXSIZE_GEN];
  4739. int bits;
  4740. if ((rng == NULL) || (size < 0) || (size + 8 > ECC_MAXSIZE_GEN) ||
  4741. (k == NULL) || (order == NULL)) {
  4742. return BAD_FUNC_ARG;
  4743. }
  4744. /* Get actual bit count of order. */
  4745. bits = mp_count_bits(order);
  4746. size = (bits + 7) >> 3;
  4747. /* generate number in range of order through rejection sampling. */
  4748. /* see section A.2.2 and A.4.2 in FIPS 186-5 */
  4749. do {
  4750. /* A.2.2 step 3: make up random string */
  4751. err = wc_RNG_GenerateBlock(rng, buf, (word32)size);
  4752. #ifdef WOLFSSL_CHECK_MEM_ZERO
  4753. wc_MemZero_Add("wc_ecc_gen_k buf", buf, size);
  4754. #endif
  4755. /* Generated multiple of 8 bits but now make it size of order. */
  4756. if ((bits & 0x7) > 0) {
  4757. buf[0] &= (1 << (bits & 0x7)) - 1;
  4758. }
  4759. /* A.2.2 step 4: convert to integer. */
  4760. /* A.4.2 step 3: Convert the bit string to integer x. */
  4761. if (err == 0) {
  4762. err = mp_read_unsigned_bin(k, buf, (word32)size);
  4763. }
  4764. /* A.4.2 step 4, 5: x must be in range [1, n-1] */
  4765. if ((err == MP_OKAY) && !mp_iszero(k) &&
  4766. (mp_cmp_ct(k, order, order->used) == MP_LT)) {
  4767. break;
  4768. }
  4769. }
  4770. while (err == MP_OKAY);
  4771. ForceZero(buf, ECC_MAXSIZE_GEN);
  4772. #ifdef WOLFSSL_CHECK_MEM_ZERO
  4773. wc_MemZero_Check(buf, ECC_MAXSIZE_GEN);
  4774. #endif
  4775. return err;
  4776. #endif
  4777. #else
  4778. (void)rng;
  4779. (void)size;
  4780. (void)k;
  4781. (void)order;
  4782. return NOT_COMPILED_IN;
  4783. #endif /* !WC_NO_RNG */
  4784. }
  4785. static WC_INLINE void wc_ecc_reset(ecc_key* key)
  4786. {
  4787. /* make sure required key variables are reset */
  4788. key->state = ECC_STATE_NONE;
  4789. }
  4790. /* create the public ECC key from a private key
  4791. *
  4792. * key an initialized private key to generate public part from
  4793. * curve [in]curve for key, cannot be NULL
  4794. * pubOut [out]ecc_point holding the public key, if NULL then public key part
  4795. * is cached in key instead.
  4796. *
  4797. * Note this function is local to the file because of the argument type
  4798. * ecc_curve_spec. Having this argument allows for not having to load the
  4799. * curve type multiple times when generating a key with wc_ecc_make_key().
  4800. * For async the results are placed directly into pubOut, so this function
  4801. * does not need to be called again
  4802. *
  4803. * returns MP_OKAY on success
  4804. */
  4805. static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curve,
  4806. ecc_point* pubOut, WC_RNG* rng)
  4807. {
  4808. int err = MP_OKAY;
  4809. #ifdef HAVE_ECC_MAKE_PUB
  4810. ecc_point* pub;
  4811. #endif /* HAVE_ECC_MAKE_PUB */
  4812. (void)rng;
  4813. if (key == NULL) {
  4814. return BAD_FUNC_ARG;
  4815. }
  4816. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  4817. #ifdef HAVE_ECC_MAKE_PUB
  4818. /* if ecc_point passed in then use it as output for public key point */
  4819. if (pubOut != NULL) {
  4820. pub = pubOut;
  4821. }
  4822. else {
  4823. /* caching public key making it a ECC_PRIVATEKEY instead of
  4824. ECC_PRIVATEKEY_ONLY */
  4825. pub = &key->pubkey;
  4826. key->type = ECC_PRIVATEKEY_ONLY;
  4827. }
  4828. if ((err == MP_OKAY) && (mp_iszero(key->k) || mp_isneg(key->k) ||
  4829. (mp_cmp(key->k, curve->order) != MP_LT)))
  4830. {
  4831. err = ECC_PRIV_KEY_E;
  4832. }
  4833. if (err == MP_OKAY) {
  4834. #ifndef ALT_ECC_SIZE
  4835. err = mp_init_multi(pub->x, pub->y, pub->z, NULL, NULL, NULL);
  4836. #else
  4837. pub->x = (mp_int*)&pub->xyz[0];
  4838. pub->y = (mp_int*)&pub->xyz[1];
  4839. pub->z = (mp_int*)&pub->xyz[2];
  4840. alt_fp_init(pub->x);
  4841. alt_fp_init(pub->y);
  4842. alt_fp_init(pub->z);
  4843. #endif
  4844. }
  4845. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC_KEYGEN) && \
  4846. defined(HAVE_INTEL_QA)
  4847. if (err == MP_OKAY && key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4848. word32 keySz = key->dp->size;
  4849. /* sync private key to raw */
  4850. err = wc_mp_to_bigint_sz(key->k, &key->k->raw, keySz);
  4851. if (err == MP_OKAY) {
  4852. err = IntelQaEccPointMul(&key->asyncDev,
  4853. &key->k->raw, pub->x, pub->y, pub->z,
  4854. &curve->Gx->raw, &curve->Gy->raw,
  4855. &curve->Af->raw, &curve->Bf->raw, &curve->prime->raw,
  4856. key->dp->cofactor);
  4857. }
  4858. }
  4859. else
  4860. #endif
  4861. { /* BEGIN: Software Crypto */
  4862. #ifdef WOLFSSL_HAVE_SP_ECC
  4863. /* Single-Precision Math (optimized for specific curves) */
  4864. if (err != MP_OKAY) {
  4865. }
  4866. else
  4867. #ifndef WOLFSSL_SP_NO_256
  4868. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  4869. err = sp_ecc_mulmod_base_256(key->k, pub, 1, key->heap);
  4870. }
  4871. else
  4872. #endif /* WOLFSSL_SP_NO_256 */
  4873. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  4874. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SM2P256V1) {
  4875. err = sp_ecc_mulmod_base_sm2_256(key->k, pub, 1, key->heap);
  4876. }
  4877. else
  4878. #endif
  4879. #ifdef WOLFSSL_SP_384
  4880. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  4881. err = sp_ecc_mulmod_base_384(key->k, pub, 1, key->heap);
  4882. }
  4883. else
  4884. #endif
  4885. #ifdef WOLFSSL_SP_521
  4886. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) {
  4887. err = sp_ecc_mulmod_base_521(key->k, pub, 1, key->heap);
  4888. }
  4889. else
  4890. #endif
  4891. #endif /* WOLFSSL_HAVE_SP_ECC */
  4892. #if defined(WOLFSSL_SP_MATH)
  4893. err = WC_KEY_SIZE_E;
  4894. #else
  4895. if (err == MP_OKAY) {
  4896. /* Multi-Precision Math: compute public curve */
  4897. mp_digit mp = 0;
  4898. ecc_point* base = NULL;
  4899. #ifdef WOLFSSL_NO_MALLOC
  4900. ecc_point lcl_base;
  4901. base = &lcl_base;
  4902. #endif
  4903. err = wc_ecc_new_point_ex(&base, key->heap);
  4904. /* read in the x/y for this key */
  4905. if (err == MP_OKAY)
  4906. err = mp_copy(curve->Gx, base->x);
  4907. if (err == MP_OKAY)
  4908. err = mp_copy(curve->Gy, base->y);
  4909. if (err == MP_OKAY)
  4910. err = mp_montgomery_setup(curve->prime, &mp);
  4911. if (err == MP_OKAY)
  4912. err = mp_set(base->z, 1);
  4913. /* make the public key */
  4914. if (err == MP_OKAY) {
  4915. /* Map in a separate call as this should be constant time */
  4916. err = wc_ecc_mulmod_ex2(key->k, base, pub, curve->Af, curve->prime,
  4917. curve->order, rng, 0, key->heap);
  4918. if (err == MP_MEM) {
  4919. err = MEMORY_E;
  4920. }
  4921. }
  4922. if (err == MP_OKAY) {
  4923. /* Use constant time map if compiled in */
  4924. err = ecc_map_ex(pub, curve->prime, mp, 1);
  4925. }
  4926. wc_ecc_del_point_ex(base, key->heap);
  4927. }
  4928. #endif /* WOLFSSL_SP_MATH */
  4929. } /* END: Software Crypto */
  4930. if (err != MP_OKAY
  4931. #ifdef WOLFSSL_ASYNC_CRYPT
  4932. && err != WC_PENDING_E
  4933. #endif
  4934. ) {
  4935. /* clean up if failed */
  4936. #ifndef ALT_ECC_SIZE
  4937. mp_clear(pub->x);
  4938. mp_clear(pub->y);
  4939. mp_clear(pub->z);
  4940. #endif
  4941. }
  4942. #else
  4943. /* Using hardware crypto, that does not support ecc_make_pub_ex */
  4944. (void)curve;
  4945. err = NOT_COMPILED_IN;
  4946. #endif /* HAVE_ECC_MAKE_PUB */
  4947. /* change key state if public part is cached */
  4948. if (key->type == ECC_PRIVATEKEY_ONLY && pubOut == NULL) {
  4949. key->type = ECC_PRIVATEKEY;
  4950. }
  4951. RESTORE_VECTOR_REGISTERS();
  4952. return err;
  4953. }
  4954. /* create the public ECC key from a private key
  4955. *
  4956. * key an initialized private key to generate public part from
  4957. * pubOut [out]ecc_point holding the public key, if NULL then public key part
  4958. * is cached in key instead.
  4959. *
  4960. *
  4961. * returns MP_OKAY on success
  4962. */
  4963. int wc_ecc_make_pub(ecc_key* key, ecc_point* pubOut)
  4964. {
  4965. WOLFSSL_ENTER("wc_ecc_make_pub");
  4966. return wc_ecc_make_pub_ex(key, pubOut, NULL);
  4967. }
  4968. /* create the public ECC key from a private key - mask timing use random z
  4969. *
  4970. * key an initialized private key to generate public part from
  4971. * pubOut [out]ecc_point holding the public key, if NULL then public key part
  4972. * is cached in key instead.
  4973. *
  4974. *
  4975. * returns MP_OKAY on success
  4976. */
  4977. int wc_ecc_make_pub_ex(ecc_key* key, ecc_point* pubOut, WC_RNG* rng)
  4978. {
  4979. int err = MP_OKAY;
  4980. DECLARE_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  4981. WOLFSSL_ENTER("wc_ecc_make_pub_ex");
  4982. if (key == NULL) {
  4983. return BAD_FUNC_ARG;
  4984. }
  4985. /* load curve info */
  4986. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  4987. if (err == MP_OKAY) {
  4988. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  4989. }
  4990. if (err == MP_OKAY) {
  4991. err = ecc_make_pub_ex(key, curve, pubOut, rng);
  4992. }
  4993. wc_ecc_curve_free(curve);
  4994. FREE_CURVE_SPECS();
  4995. return err;
  4996. }
  4997. static int _ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key,
  4998. int curve_id, int flags)
  4999. {
  5000. int err = 0;
  5001. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  5002. !defined(WOLFSSL_ATECC608A)
  5003. const CRYS_ECPKI_Domain_t* pDomain;
  5004. CRYS_ECPKI_KG_TempData_t tempBuff;
  5005. CRYS_ECPKI_KG_FipsContext_t fipsCtx;
  5006. byte ucompressed_key[ECC_MAX_CRYPTO_HW_SIZE*2 + 1];
  5007. word32 raw_size = 0;
  5008. #endif
  5009. #if defined(WOLFSSL_HAVE_SP_ECC) && defined(WC_ECC_NONBLOCK) && \
  5010. defined(WC_ECC_NONBLOCK_ONLY)
  5011. ecc_nb_ctx_t nb_ctx;
  5012. XMEMSET(&nb_ctx, 0, sizeof(nb_ctx));
  5013. #endif /* WOLFSSL_HAVE_SP_ECC && WC_ECC_NONBLOCK && WC_ECC_NONBLOCK_ONLY */
  5014. if (key == NULL || rng == NULL) {
  5015. return BAD_FUNC_ARG;
  5016. }
  5017. /* make sure required variables are reset */
  5018. wc_ecc_reset(key);
  5019. err = wc_ecc_set_curve(key, keysize, curve_id);
  5020. if (err != 0) {
  5021. return err;
  5022. }
  5023. key->flags = (byte)flags;
  5024. #ifdef WOLF_CRYPTO_CB
  5025. #ifndef WOLF_CRYPTO_CB_FIND
  5026. if (key->devId != INVALID_DEVID)
  5027. #endif
  5028. {
  5029. err = wc_CryptoCb_MakeEccKey(rng, keysize, key, curve_id);
  5030. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  5031. if (err != CRYPTOCB_UNAVAILABLE)
  5032. return err;
  5033. /* fall-through when unavailable */
  5034. #endif
  5035. #ifdef WOLF_CRYPTO_CB_ONLY_ECC
  5036. if (err == CRYPTOCB_UNAVAILABLE) {
  5037. return NO_VALID_DEVID;
  5038. }
  5039. return err;
  5040. #endif
  5041. }
  5042. #endif
  5043. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  5044. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5045. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  5046. #ifdef HAVE_CAVIUM
  5047. /* TODO: Not implemented */
  5048. #elif defined(HAVE_INTEL_QA)
  5049. /* Implemented in ecc_make_pub_ex for the pub calc */
  5050. #elif defined(WOLFSSL_ASYNC_CRYPT_SW)
  5051. if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_MAKE)) {
  5052. WC_ASYNC_SW* sw = &key->asyncDev.sw;
  5053. sw->eccMake.rng = rng;
  5054. sw->eccMake.key = key;
  5055. sw->eccMake.size = keysize;
  5056. sw->eccMake.curve_id = curve_id;
  5057. return WC_PENDING_E;
  5058. }
  5059. #endif
  5060. }
  5061. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  5062. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  5063. if (key->dp->id == ECC_SECP256R1) {
  5064. key->type = ECC_PRIVATEKEY;
  5065. key->slot = atmel_ecc_alloc(ATMEL_SLOT_ECDHE);
  5066. err = atmel_ecc_create_key(key->slot, key->pubkey_raw);
  5067. /* populate key->pubkey */
  5068. if (err == 0
  5069. #ifdef ALT_ECC_SIZE
  5070. && key->pubkey.x
  5071. #endif
  5072. ) {
  5073. err = mp_read_unsigned_bin(key->pubkey.x, key->pubkey_raw,
  5074. ECC_MAX_CRYPTO_HW_SIZE);
  5075. }
  5076. if (err == 0
  5077. #ifdef ALT_ECC_SIZE
  5078. && key->pubkey.y
  5079. #endif
  5080. ) {
  5081. err = mp_read_unsigned_bin(key->pubkey.y,
  5082. key->pubkey_raw + ECC_MAX_CRYPTO_HW_SIZE,
  5083. ECC_MAX_CRYPTO_HW_SIZE);
  5084. }
  5085. }
  5086. else {
  5087. err = NOT_COMPILED_IN;
  5088. }
  5089. #elif defined(WOLFSSL_SE050)
  5090. err = se050_ecc_create_key(key, key->dp->id, key->dp->size);
  5091. key->type = ECC_PRIVATEKEY;
  5092. #elif defined(WOLFSSL_CRYPTOCELL)
  5093. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id));
  5094. raw_size = (word32)(key->dp->size)*2 + 1;
  5095. /* generate first key pair */
  5096. err = CRYS_ECPKI_GenKeyPair(&wc_rndState,
  5097. wc_rndGenVectFunc,
  5098. pDomain,
  5099. &key->ctx.privKey,
  5100. &key->ctx.pubKey,
  5101. &tempBuff,
  5102. &fipsCtx);
  5103. if (err != SA_SILIB_RET_OK){
  5104. WOLFSSL_MSG("CRYS_ECPKI_GenKeyPair for key pair failed");
  5105. return err;
  5106. }
  5107. key->type = ECC_PRIVATEKEY;
  5108. err = CRYS_ECPKI_ExportPublKey(&key->ctx.pubKey,
  5109. CRYS_EC_PointUncompressed,
  5110. &ucompressed_key[0],
  5111. (uint32_t*)&raw_size);
  5112. if (err == SA_SILIB_RET_OK && key->pubkey.x && key->pubkey.y) {
  5113. err = mp_read_unsigned_bin(key->pubkey.x,
  5114. &ucompressed_key[1], key->dp->size);
  5115. if (err == MP_OKAY) {
  5116. err = mp_read_unsigned_bin(key->pubkey.y,
  5117. &ucompressed_key[1+key->dp->size],key->dp->size);
  5118. }
  5119. }
  5120. raw_size = key->dp->size;
  5121. if (err == MP_OKAY) {
  5122. err = CRYS_ECPKI_ExportPrivKey(&key->ctx.privKey,
  5123. ucompressed_key,
  5124. (uint32_t*)&raw_size);
  5125. }
  5126. if (err == SA_SILIB_RET_OK) {
  5127. err = mp_read_unsigned_bin(key->k, ucompressed_key, raw_size);
  5128. }
  5129. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  5130. return silabs_ecc_make_key(key, keysize);
  5131. #elif defined(WOLFSSL_KCAPI_ECC)
  5132. err = KcapiEcc_MakeKey(key, keysize, curve_id);
  5133. (void)rng;
  5134. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5135. if (xil_curve_type[key->dp->id] == 0)
  5136. return ECC_CURVE_OID_E;
  5137. err = wc_RNG_GenerateBlock(rng, key->privKey, key->dp->size);
  5138. if (err)
  5139. return err;
  5140. /* Make sure that private key is max. 521 bits */
  5141. if (key->dp->size == 66)
  5142. key->privKey[65] &= 0x1U;
  5143. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->privKey), key->dp->size);
  5144. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->keyRaw),
  5145. 2 * key->dp->size);
  5146. err = XSecure_EllipticGenerateKey(&(key->xSec.cinst),
  5147. xil_curve_type[key->dp->id],
  5148. XIL_CAST_U64(key->privKey),
  5149. XIL_CAST_U64(key->keyRaw));
  5150. if (err != XST_SUCCESS) {
  5151. WOLFSSL_XIL_ERROR("Generate ECC key failed", err);
  5152. err = WC_HW_E;
  5153. }
  5154. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->keyRaw),
  5155. 2 * key->dp->size);
  5156. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  5157. if (err == 0)
  5158. err = XSecure_EllipticValidateKey(&(key->xSec.cinst),
  5159. xil_curve_type[key->dp->id],
  5160. XIL_CAST_U64(key->keyRaw));
  5161. #endif
  5162. if (err == 0)
  5163. err = xil_mpi_import(key->pubkey.x, key->keyRaw, key->dp->size,
  5164. key->heap);
  5165. if (err == 0)
  5166. err = xil_mpi_import(key->pubkey.y, key->keyRaw + key->dp->size,
  5167. key->dp->size, key->heap);
  5168. if (err == 0)
  5169. err = xil_mpi_import(key->k, key->privKey, key->dp->size, key->heap);
  5170. if (err == 0)
  5171. err = mp_set(key->pubkey.z, 1);
  5172. if (err) {
  5173. key->privKey = NULL;
  5174. XMEMSET(key->keyRaw, 0, sizeof(key->keyRaw));
  5175. return err;
  5176. }
  5177. key->type = ECC_PRIVATEKEY;
  5178. #else
  5179. #ifdef WOLFSSL_HAVE_SP_ECC
  5180. #ifndef WOLFSSL_SP_NO_256
  5181. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  5182. #ifndef WC_ECC_NONBLOCK
  5183. err = sp_ecc_make_key_256(rng, key->k, &key->pubkey, key->heap);
  5184. #else
  5185. if (key->nb_ctx) {
  5186. err = sp_ecc_make_key_256_nb(&key->nb_ctx->sp_ctx, rng, key->k,
  5187. &key->pubkey, key->heap);
  5188. }
  5189. else {
  5190. #ifdef WC_ECC_NONBLOCK_ONLY
  5191. do { /* perform blocking call to non-blocking function */
  5192. err = sp_ecc_make_key_256_nb(&nb_ctx.sp_ctx, rng, key->k,
  5193. &key->pubkey, key->heap);
  5194. } while (err == FP_WOULDBLOCK);
  5195. #else
  5196. err = sp_ecc_make_key_256(rng, key->k, &key->pubkey, key->heap);
  5197. #endif /* WC_ECC_NONBLOCK_ONLY */
  5198. }
  5199. #endif /* !WC_ECC_NONBLOCK */
  5200. if (err == MP_OKAY) {
  5201. key->type = ECC_PRIVATEKEY;
  5202. }
  5203. }
  5204. else
  5205. #endif /* !WOLFSSL_SP_NO_256 */
  5206. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  5207. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SM2P256V1) {
  5208. err = sp_ecc_make_key_sm2_256(rng, key->k, &key->pubkey, key->heap);
  5209. if (err == MP_OKAY) {
  5210. key->type = ECC_PRIVATEKEY;
  5211. }
  5212. }
  5213. else
  5214. #endif
  5215. #ifdef WOLFSSL_SP_384
  5216. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  5217. #ifndef WC_ECC_NONBLOCK
  5218. err = sp_ecc_make_key_384(rng, key->k, &key->pubkey, key->heap);
  5219. #else
  5220. if (key->nb_ctx) {
  5221. err = sp_ecc_make_key_384_nb(&key->nb_ctx->sp_ctx, rng, key->k,
  5222. &key->pubkey, key->heap);
  5223. }
  5224. else {
  5225. #ifdef WC_ECC_NONBLOCK_ONLY
  5226. do { /* perform blocking call to non-blocking function */
  5227. err = sp_ecc_make_key_384_nb(&nb_ctx.sp_ctx, rng, key->k,
  5228. &key->pubkey, key->heap);
  5229. } while (err == FP_WOULDBLOCK);
  5230. #else
  5231. err = sp_ecc_make_key_384(rng, key->k, &key->pubkey, key->heap);
  5232. #endif /* WC_ECC_NONBLOCK_ONLY */
  5233. }
  5234. #endif /* !WC_ECC_NONBLOCK */
  5235. if (err == MP_OKAY) {
  5236. key->type = ECC_PRIVATEKEY;
  5237. }
  5238. }
  5239. else
  5240. #endif /* WOLFSSL_SP_384 */
  5241. #ifdef WOLFSSL_SP_521
  5242. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) {
  5243. #ifndef WC_ECC_NONBLOCK
  5244. err = sp_ecc_make_key_521(rng, key->k, &key->pubkey, key->heap);
  5245. #else
  5246. if (key->nb_ctx) {
  5247. err = sp_ecc_make_key_521_nb(&key->nb_ctx->sp_ctx, rng, key->k,
  5248. &key->pubkey, key->heap);
  5249. }
  5250. else {
  5251. #ifdef WC_ECC_NONBLOCK_ONLY
  5252. do { /* perform blocking call to non-blocking function */
  5253. err = sp_ecc_make_key_521_nb(&nb_ctx.sp_ctx, rng, key->k,
  5254. &key->pubkey, key->heap);
  5255. } while (err == FP_WOULDBLOCK);
  5256. #else
  5257. err = sp_ecc_make_key_521(rng, key->k, &key->pubkey, key->heap);
  5258. #endif /* WC_ECC_NONBLOCK_ONLY */
  5259. }
  5260. #endif /* !WC_ECC_NONBLOCK */
  5261. if (err == MP_OKAY) {
  5262. key->type = ECC_PRIVATEKEY;
  5263. }
  5264. }
  5265. else
  5266. #endif /* WOLFSSL_SP_521 */
  5267. #endif /* WOLFSSL_HAVE_SP_ECC */
  5268. { /* software key gen */
  5269. #if defined(WOLFSSL_SP_MATH)
  5270. err = WC_KEY_SIZE_E;
  5271. #else
  5272. DECLARE_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  5273. /* setup the key variables */
  5274. #ifndef ALT_ECC_SIZE
  5275. err = mp_init(key->k);
  5276. #else
  5277. err = 0;
  5278. key->k = (mp_int*)key->ka;
  5279. alt_fp_init(key->k);
  5280. #endif
  5281. /* load curve info */
  5282. if (err == MP_OKAY) {
  5283. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  5284. }
  5285. if (err == MP_OKAY) {
  5286. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  5287. }
  5288. /* generate k */
  5289. if (err == MP_OKAY) {
  5290. err = wc_ecc_gen_k(rng, key->dp->size, key->k, curve->order);
  5291. }
  5292. /* generate public key from k */
  5293. if (err == MP_OKAY) {
  5294. err = ecc_make_pub_ex(key, curve, NULL, rng);
  5295. }
  5296. if (err == MP_OKAY
  5297. #ifdef WOLFSSL_ASYNC_CRYPT
  5298. || err == WC_PENDING_E
  5299. #endif
  5300. ) {
  5301. key->type = ECC_PRIVATEKEY;
  5302. }
  5303. else {
  5304. /* cleanup these on failure case only */
  5305. mp_forcezero(key->k);
  5306. }
  5307. /* cleanup allocations */
  5308. wc_ecc_curve_free(curve);
  5309. FREE_CURVE_SPECS();
  5310. #endif /* WOLFSSL_SP_MATH */
  5311. }
  5312. #ifdef HAVE_WOLF_BIGINT
  5313. if (err == MP_OKAY)
  5314. err = wc_mp_to_bigint(key->k, &key->k->raw);
  5315. if (err == MP_OKAY)
  5316. err = wc_mp_to_bigint(key->pubkey.x, &key->pubkey.x->raw);
  5317. if (err == MP_OKAY)
  5318. err = wc_mp_to_bigint(key->pubkey.y, &key->pubkey.y->raw);
  5319. if (err == MP_OKAY)
  5320. err = wc_mp_to_bigint(key->pubkey.z, &key->pubkey.z->raw);
  5321. #endif
  5322. #endif /* HAVE_ECC_MAKE_PUB */
  5323. return err;
  5324. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  5325. }
  5326. int wc_ecc_make_key_ex2(WC_RNG* rng, int keysize, ecc_key* key, int curve_id,
  5327. int flags)
  5328. {
  5329. int err;
  5330. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  5331. err = _ecc_make_key_ex(rng, keysize, key, curve_id, flags);
  5332. #if (FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_ECC_KEYGEN)) && \
  5333. !defined(WOLFSSL_KCAPI_ECC)
  5334. if (err == MP_OKAY) {
  5335. err = _ecc_validate_public_key(key, 0, 0);
  5336. }
  5337. if (err == MP_OKAY
  5338. #if defined(WOLF_CRYPTO_CB)
  5339. /* even if WOLF_CRYPTO_CB we generate the key if the devId is invalid */
  5340. && key->devId == INVALID_DEVID
  5341. #endif
  5342. ) {
  5343. err = _ecc_pairwise_consistency_test(key, rng);
  5344. }
  5345. #endif
  5346. RESTORE_VECTOR_REGISTERS();
  5347. return err;
  5348. }
  5349. WOLFSSL_ABI
  5350. int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id)
  5351. {
  5352. return wc_ecc_make_key_ex2(rng, keysize, key, curve_id, WC_ECC_FLAG_NONE);
  5353. }
  5354. #ifdef ECC_DUMP_OID
  5355. /* Optional dump of encoded OID for adding new curves */
  5356. static int mOidDumpDone;
  5357. static void wc_ecc_dump_oids(void)
  5358. {
  5359. int x;
  5360. if (mOidDumpDone) {
  5361. return;
  5362. }
  5363. /* find matching OID sum (based on encoded value) */
  5364. for (x = 0; ecc_sets[x].size != 0; x++) {
  5365. int i;
  5366. byte* oid;
  5367. word32 oidSz, sum = 0;
  5368. printf("ECC %s (%d):\n", ecc_sets[x].name, x);
  5369. #ifdef HAVE_OID_ENCODING
  5370. byte oidEnc[ECC_MAX_OID_LEN];
  5371. oid = oidEnc;
  5372. oidSz = ECC_MAX_OID_LEN;
  5373. printf("OID: ");
  5374. for (i = 0; i < (int)ecc_sets[x].oidSz; i++) {
  5375. printf("%d.", ecc_sets[x].oid[i]);
  5376. }
  5377. printf("\n");
  5378. EncodeObjectId(ecc_sets[x].oid, ecc_sets[x].oidSz, oidEnc, &oidSz);
  5379. #else
  5380. oid = (byte*)ecc_sets[x].oid;
  5381. oidSz = ecc_sets[x].oidSz;
  5382. #endif
  5383. printf("OID Encoded: ");
  5384. for (i = 0; i < (int)oidSz; i++) {
  5385. printf("0x%02X,", oid[i]);
  5386. }
  5387. printf("\n");
  5388. for (i = 0; i < (int)oidSz; i++) {
  5389. sum += oid[i];
  5390. }
  5391. printf("Sum: %u\n", sum);
  5392. /* validate sum */
  5393. if (ecc_sets[x].oidSum != sum) {
  5394. fprintf(stderr, " Sum %u Not Valid!\n", ecc_sets[x].oidSum);
  5395. }
  5396. }
  5397. mOidDumpDone = 1;
  5398. }
  5399. #endif /* ECC_DUMP_OID */
  5400. WOLFSSL_ABI
  5401. ecc_key* wc_ecc_key_new(void* heap)
  5402. {
  5403. int devId = INVALID_DEVID;
  5404. ecc_key* key;
  5405. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  5406. /* assume all keys are using CAAM for ECC unless explicitly set otherwise */
  5407. devId = WOLFSSL_CAAM_DEVID;
  5408. #endif
  5409. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  5410. if (key) {
  5411. if (wc_ecc_init_ex(key, heap, devId) != 0) {
  5412. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  5413. key = NULL;
  5414. }
  5415. }
  5416. return key;
  5417. }
  5418. WOLFSSL_ABI
  5419. void wc_ecc_key_free(ecc_key* key)
  5420. {
  5421. if (key) {
  5422. void* heap = key->heap;
  5423. wc_ecc_free(key);
  5424. ForceZero(key, sizeof(ecc_key));
  5425. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  5426. (void)heap;
  5427. }
  5428. }
  5429. /**
  5430. Make a new ECC key
  5431. rng An active RNG state
  5432. keysize The keysize for the new key (in octets from 20 to 65 bytes)
  5433. key [out] Destination of the newly created key
  5434. return MP_OKAY if successful,
  5435. upon error all allocated memory will be freed
  5436. */
  5437. WOLFSSL_ABI
  5438. int wc_ecc_make_key(WC_RNG* rng, int keysize, ecc_key* key)
  5439. {
  5440. return wc_ecc_make_key_ex(rng, keysize, key, ECC_CURVE_DEF);
  5441. }
  5442. /* Setup dynamic pointers if using normal math for proper freeing */
  5443. WOLFSSL_ABI
  5444. int wc_ecc_init_ex(ecc_key* key, void* heap, int devId)
  5445. {
  5446. int ret = 0;
  5447. #if defined(HAVE_PKCS11)
  5448. int isPkcs11 = 0;
  5449. #endif
  5450. if (key == NULL) {
  5451. return BAD_FUNC_ARG;
  5452. }
  5453. #if defined(HAVE_PKCS11)
  5454. if (key->isPkcs11) {
  5455. isPkcs11 = 1;
  5456. }
  5457. #endif
  5458. #ifdef ECC_DUMP_OID
  5459. wc_ecc_dump_oids();
  5460. #endif
  5461. XMEMSET(key, 0, sizeof(ecc_key));
  5462. key->state = ECC_STATE_NONE;
  5463. #if defined(PLUTON_CRYPTO_ECC) || defined(WOLF_CRYPTO_CB)
  5464. key->devId = devId;
  5465. #else
  5466. (void)devId;
  5467. #endif
  5468. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  5469. key->slot = ATECC_INVALID_SLOT;
  5470. #elif defined(WOLFSSL_KCAPI_ECC)
  5471. key->handle = NULL;
  5472. #else
  5473. #ifdef ALT_ECC_SIZE
  5474. key->pubkey.x = (mp_int*)&key->pubkey.xyz[0];
  5475. key->pubkey.y = (mp_int*)&key->pubkey.xyz[1];
  5476. key->pubkey.z = (mp_int*)&key->pubkey.xyz[2];
  5477. alt_fp_init(key->pubkey.x);
  5478. alt_fp_init(key->pubkey.y);
  5479. alt_fp_init(key->pubkey.z);
  5480. key->k = (mp_int*)key->ka;
  5481. alt_fp_init(key->k);
  5482. #else
  5483. ret = mp_init_multi(key->k, key->pubkey.x, key->pubkey.y, key->pubkey.z,
  5484. NULL, NULL);
  5485. if (ret != MP_OKAY) {
  5486. return MEMORY_E;
  5487. }
  5488. #endif /* ALT_ECC_SIZE */
  5489. #endif /* WOLFSSL_ATECC508A */
  5490. #if (defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) || \
  5491. defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  5492. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)) && \
  5493. defined(WOLFSSL_NO_MALLOC)
  5494. ret = mp_init(key->sign_k);
  5495. if (ret != MP_OKAY) {
  5496. return MEMORY_E;
  5497. }
  5498. #endif
  5499. #ifdef WOLFSSL_HEAP_TEST
  5500. key->heap = (void*)WOLFSSL_HEAP_TEST;
  5501. #else
  5502. key->heap = heap;
  5503. #endif
  5504. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5505. #if defined(HAVE_PKCS11)
  5506. if (!isPkcs11)
  5507. #endif
  5508. {
  5509. /* handle as async */
  5510. ret = wolfAsync_DevCtxInit(&key->asyncDev, WOLFSSL_ASYNC_MARKER_ECC,
  5511. key->heap, devId);
  5512. }
  5513. #elif defined(HAVE_PKCS11)
  5514. (void)isPkcs11;
  5515. #endif
  5516. #if defined(WOLFSSL_DSP)
  5517. key->handle = -1;
  5518. #endif
  5519. #ifdef WOLFSSL_SE050
  5520. key->keyId = 0;
  5521. key->keyIdSet = 0;
  5522. #endif
  5523. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5524. mp_memzero_add("ECC k", key->k);
  5525. #endif
  5526. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5527. key->privKey = key->keyRaw + (2 * ECC_MAX_CRYPTO_HW_SIZE);
  5528. if (wc_InitXsecure(&(key->xSec))) {
  5529. WOLFSSL_MSG("Can't initialize Xsecure");
  5530. return WC_HW_E;
  5531. }
  5532. #endif
  5533. return ret;
  5534. }
  5535. WOLFSSL_ABI
  5536. int wc_ecc_init(ecc_key* key)
  5537. {
  5538. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  5539. return wc_ecc_init_ex(key, NULL, WOLFSSL_CAAM_DEVID);
  5540. #else
  5541. return wc_ecc_init_ex(key, NULL, INVALID_DEVID);
  5542. #endif
  5543. }
  5544. #ifdef WOLF_PRIVATE_KEY_ID
  5545. int wc_ecc_init_id(ecc_key* key, unsigned char* id, int len, void* heap,
  5546. int devId)
  5547. {
  5548. int ret = 0;
  5549. #ifdef WOLFSSL_SE050
  5550. /* SE050 TLS users store a word32 at id, need to cast back */
  5551. word32* keyPtr = NULL;
  5552. #endif
  5553. if (key == NULL)
  5554. ret = BAD_FUNC_ARG;
  5555. if (ret == 0 && (len < 0 || len > ECC_MAX_ID_LEN))
  5556. ret = BUFFER_E;
  5557. #if defined(HAVE_PKCS11)
  5558. XMEMSET(key, 0, sizeof(ecc_key));
  5559. key->isPkcs11 = 1;
  5560. #endif
  5561. if (ret == 0)
  5562. ret = wc_ecc_init_ex(key, heap, devId);
  5563. if (ret == 0 && id != NULL && len != 0) {
  5564. XMEMCPY(key->id, id, (size_t)len);
  5565. key->idLen = len;
  5566. #ifdef WOLFSSL_SE050
  5567. /* Set SE050 ID from word32, populate ecc_key with public from SE050 */
  5568. if (len == (int)sizeof(word32)) {
  5569. keyPtr = (word32*)key->id;
  5570. ret = wc_ecc_use_key_id(key, *keyPtr, 0);
  5571. }
  5572. #endif
  5573. }
  5574. return ret;
  5575. }
  5576. int wc_ecc_init_label(ecc_key* key, const char* label, void* heap, int devId)
  5577. {
  5578. int ret = 0;
  5579. int labelLen = 0;
  5580. if (key == NULL || label == NULL)
  5581. ret = BAD_FUNC_ARG;
  5582. if (ret == 0) {
  5583. labelLen = (int)XSTRLEN(label);
  5584. if (labelLen == 0 || labelLen > ECC_MAX_LABEL_LEN)
  5585. ret = BUFFER_E;
  5586. }
  5587. #if defined(HAVE_PKCS11)
  5588. XMEMSET(key, 0, sizeof(ecc_key));
  5589. key->isPkcs11 = 1;
  5590. #endif
  5591. if (ret == 0)
  5592. ret = wc_ecc_init_ex(key, heap, devId);
  5593. if (ret == 0) {
  5594. XMEMCPY(key->label, label, (size_t)labelLen);
  5595. key->labelLen = labelLen;
  5596. }
  5597. return ret;
  5598. }
  5599. #endif /* WOLF_PRIVATE_KEY_ID */
  5600. int wc_ecc_set_flags(ecc_key* key, word32 flags)
  5601. {
  5602. if (key == NULL) {
  5603. return BAD_FUNC_ARG;
  5604. }
  5605. key->flags |= flags;
  5606. return 0;
  5607. }
  5608. static int wc_ecc_get_curve_order_bit_count(const ecc_set_type* dp)
  5609. {
  5610. int err = MP_OKAY;
  5611. int orderBits;
  5612. DECLARE_CURVE_SPECS(1);
  5613. ALLOC_CURVE_SPECS(1, err);
  5614. if (err == MP_OKAY) {
  5615. err = wc_ecc_curve_load(dp, &curve, ECC_CURVE_FIELD_ORDER);
  5616. }
  5617. if (err != 0) {
  5618. FREE_CURVE_SPECS();
  5619. return err;
  5620. }
  5621. orderBits = mp_count_bits(curve->order);
  5622. wc_ecc_curve_free(curve);
  5623. FREE_CURVE_SPECS();
  5624. return orderBits;
  5625. }
  5626. #ifdef HAVE_ECC_SIGN
  5627. #ifndef NO_ASN
  5628. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  5629. defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) || \
  5630. defined(WOLFSSL_SILABS_SE_ACCEL) || defined(WOLFSSL_KCAPI_ECC) || \
  5631. defined(WOLFSSL_SE050) || defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5632. static int wc_ecc_sign_hash_hw(const byte* in, word32 inlen,
  5633. mp_int* r, mp_int* s, byte* out, word32 *outlen, WC_RNG* rng,
  5634. ecc_key* key)
  5635. {
  5636. int err;
  5637. #ifdef PLUTON_CRYPTO_ECC
  5638. if (key->devId != INVALID_DEVID) /* use hardware */
  5639. #endif
  5640. {
  5641. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  5642. !defined(WOLFSSL_ATECC608A)
  5643. CRYS_ECDSA_SignUserContext_t sigCtxTemp;
  5644. word32 raw_sig_size = *outlen;
  5645. word32 msgLenInBytes = inlen;
  5646. CRYS_ECPKI_HASH_OpMode_t hash_mode;
  5647. #endif
  5648. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5649. #ifdef WOLFSSL_SMALL_STACK
  5650. byte* K = NULL;
  5651. byte* incopy = NULL;
  5652. #else
  5653. byte K[MAX_ECC_BYTES] = {0};
  5654. byte incopy[MAX_ECC_BYTES] = {0};
  5655. #endif
  5656. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  5657. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  5658. word32 Ksize;
  5659. #endif
  5660. #endif
  5661. word32 keysize = (word32)key->dp->size;
  5662. #ifdef PLUTON_CRYPTO_ECC
  5663. word32 orderBits = wc_ecc_get_curve_order_bit_count(key->dp);
  5664. #endif
  5665. #ifndef WOLFSSL_KCAPI_ECC
  5666. /* Check args */
  5667. if (keysize > ECC_MAX_CRYPTO_HW_SIZE || *outlen < keysize*2) {
  5668. return ECC_BAD_ARG_E;
  5669. }
  5670. #endif
  5671. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  5672. /* Sign: Result is 32-bytes of R then 32-bytes of S */
  5673. err = atmel_ecc_sign(key->slot, in, out);
  5674. if (err != 0) {
  5675. return err;
  5676. }
  5677. #elif defined(PLUTON_CRYPTO_ECC)
  5678. {
  5679. /* if the input is larger than curve order, we must truncate */
  5680. if ((inlen * WOLFSSL_BIT_SIZE) > orderBits) {
  5681. inlen = (orderBits + WOLFSSL_BIT_SIZE - 1) / WOLFSSL_BIT_SIZE;
  5682. }
  5683. /* perform ECC sign */
  5684. word32 raw_sig_size = *outlen;
  5685. err = Crypto_EccSign(in, inlen, out, &raw_sig_size);
  5686. if (err != CRYPTO_RES_SUCCESS || raw_sig_size != keysize*2){
  5687. return BAD_COND_E;
  5688. }
  5689. }
  5690. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  5691. err = silabs_ecc_sign_hash(in, inlen, out, outlen, key);
  5692. if (err != 0) {
  5693. return WC_HW_E;
  5694. }
  5695. #elif defined(WOLFSSL_CRYPTOCELL)
  5696. /* truncate if hash is longer than key size */
  5697. if (msgLenInBytes > keysize) {
  5698. msgLenInBytes = keysize;
  5699. }
  5700. hash_mode = cc310_hashModeECC(msgLenInBytes);
  5701. if (hash_mode == CRYS_ECPKI_HASH_OpModeLast) {
  5702. (void)cc310_hashModeECC(keysize);
  5703. /* Ignoring returned value */
  5704. hash_mode = CRYS_ECPKI_HASH_SHA256_mode;
  5705. }
  5706. /* create signature from an input buffer using a private key*/
  5707. err = CRYS_ECDSA_Sign(&wc_rndState,
  5708. wc_rndGenVectFunc,
  5709. &sigCtxTemp,
  5710. &key->ctx.privKey,
  5711. hash_mode,
  5712. (byte*)in,
  5713. msgLenInBytes,
  5714. out,
  5715. (uint32_t*)&raw_sig_size);
  5716. if (err != SA_SILIB_RET_OK){
  5717. WOLFSSL_MSG("CRYS_ECDSA_Sign failed");
  5718. return err;
  5719. }
  5720. #elif defined(WOLFSSL_KCAPI_ECC)
  5721. err = KcapiEcc_Sign(key, in, inlen, out, *outlen);
  5722. if (err != MP_OKAY) {
  5723. return err;
  5724. }
  5725. (void)rng;
  5726. #elif defined(WOLFSSL_SE050)
  5727. err = se050_ecc_sign_hash_ex(in, inlen, r, s, out, outlen, key);
  5728. if (err != MP_OKAY) {
  5729. return err;
  5730. }
  5731. (void)rng;
  5732. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5733. #ifdef WOLFSSL_SMALL_STACK
  5734. K = (byte*)XMALLOC(keysize, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5735. incopy = (byte*)XMALLOC(inlen, key->heap, DYNAMIC_TYPE_HASH_TMP);
  5736. if (K == NULL || incopy == NULL) {
  5737. XFREE(incopy, key->heap, DYNAMIC_TYPE_HASH_TMP);
  5738. XFREE(K, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5739. return MEMORY_E;
  5740. }
  5741. #else
  5742. if (inlen > sizeof(incopy))
  5743. return ECC_BAD_ARG_E;
  5744. #endif
  5745. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  5746. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  5747. err = deterministic_sign_helper(in, inlen, key);
  5748. if (err)
  5749. return err;
  5750. Ksize = mp_unsigned_bin_size(key->sign_k);
  5751. if (Ksize > keysize) {
  5752. err = BUFFER_E;
  5753. goto error_out;
  5754. }
  5755. err = mp_to_unsigned_bin(key->sign_k, K);
  5756. if (err)
  5757. goto error_out;
  5758. mp_reverse(K, Ksize);
  5759. #else
  5760. err = wc_RNG_GenerateBlock(rng, K, keysize);
  5761. if (err)
  5762. goto error_out;
  5763. /* Make sure that K is max. 521 bits */
  5764. if (keysize == 66)
  5765. K[65] &= 0x1;
  5766. #endif
  5767. buf_reverse(incopy, in, inlen < keysize ? inlen : keysize);
  5768. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(incopy), keysize);
  5769. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->privKey), keysize);
  5770. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(K), keysize);
  5771. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(out), keysize * 2);
  5772. err = XSecure_EllipticGenerateSign(&(key->xSec.cinst),
  5773. xil_curve_type[key->dp->id],
  5774. XIL_CAST_U64(incopy), keysize,
  5775. XIL_CAST_U64(key->privKey),
  5776. XIL_CAST_U64(K),
  5777. XIL_CAST_U64(out));
  5778. if (err) {
  5779. WOLFSSL_XIL_ERROR("Generate ECC signature failed", err);
  5780. err = WC_HW_E;
  5781. }
  5782. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(out), keysize * 2);
  5783. mp_reverse(&out[0], keysize);
  5784. mp_reverse(&out[keysize], keysize);
  5785. error_out:
  5786. ForceZero(K, MAX_ECC_BYTES);
  5787. #ifdef WOLFSSL_SMALL_STACK
  5788. XFREE(incopy, key->heap, DYNAMIC_TYPE_HASH_TMP);
  5789. XFREE(K, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5790. #endif
  5791. if (err) {
  5792. ForceZero(out, keysize * 2);
  5793. return err;
  5794. }
  5795. #endif /* HW-specific #if-#elif chain */
  5796. #ifndef WOLFSSL_SE050
  5797. /* Load R and S, SE050 does this in port layer */
  5798. err = mp_read_unsigned_bin(r, &out[0], keysize);
  5799. if (err != MP_OKAY) {
  5800. return err;
  5801. }
  5802. err = mp_read_unsigned_bin(s, &out[keysize], keysize);
  5803. if (err != MP_OKAY) {
  5804. return err;
  5805. }
  5806. #endif
  5807. /* Check for zeros */
  5808. if (mp_iszero(r) || mp_iszero(s)) {
  5809. return MP_ZERO_E;
  5810. }
  5811. }
  5812. #ifdef PLUTON_CRYPTO_ECC
  5813. else {
  5814. err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  5815. }
  5816. #endif
  5817. (void)rng;
  5818. return err;
  5819. }
  5820. #endif /* WOLFSSL_ATECC508A || PLUTON_CRYPTO_ECC || WOLFSSL_CRYPTOCELL */
  5821. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5822. static int wc_ecc_sign_hash_async(const byte* in, word32 inlen, byte* out,
  5823. word32 *outlen, WC_RNG* rng, ecc_key* key)
  5824. {
  5825. int err;
  5826. mp_int *r = NULL, *s = NULL;
  5827. if (in == NULL || out == NULL || outlen == NULL || key == NULL ||
  5828. rng == NULL) {
  5829. return ECC_BAD_ARG_E;
  5830. }
  5831. err = wc_ecc_alloc_async(key);
  5832. if (err != 0) {
  5833. return err;
  5834. }
  5835. r = key->r;
  5836. s = key->s;
  5837. switch (key->state) {
  5838. case ECC_STATE_NONE:
  5839. case ECC_STATE_SIGN_DO:
  5840. key->state = ECC_STATE_SIGN_DO;
  5841. if ((err = mp_init_multi(r, s, NULL, NULL, NULL, NULL)) != MP_OKAY){
  5842. break;
  5843. }
  5844. err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  5845. if (err < 0) {
  5846. break;
  5847. }
  5848. FALL_THROUGH;
  5849. case ECC_STATE_SIGN_ENCODE:
  5850. key->state = ECC_STATE_SIGN_ENCODE;
  5851. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  5852. #if !defined(WOLFSSL_ASYNC_CRYPT_SW) && defined(HAVE_ECC_CDH)
  5853. DECLARE_CURVE_SPECS(1);
  5854. ALLOC_CURVE_SPECS(1, err);
  5855. /* get curve order */
  5856. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  5857. #endif
  5858. #ifdef HAVE_CAVIUM_V
  5859. /* Nitrox requires r and s in sep buffer, so split it */
  5860. NitroxEccRsSplit(key, &r->raw, &s->raw);
  5861. #endif
  5862. #ifndef WOLFSSL_ASYNC_CRYPT_SW
  5863. /* only do this if not software, since it overwrites result */
  5864. wc_bigint_to_mp(&r->raw, r);
  5865. wc_bigint_to_mp(&s->raw, s);
  5866. /* if using a curve with cofactor != 1 then reduce by mod order */
  5867. #ifdef HAVE_ECC_CDH
  5868. /* if r is not less than order than reduce */
  5869. if (err == 0 && mp_count_bits(r) > mp_count_bits(curve->order)) {
  5870. err = mp_mod(r, curve->order, r);
  5871. }
  5872. wc_ecc_curve_free(curve);
  5873. FREE_CURVE_SPECS();
  5874. #endif
  5875. #endif /* !WOLFSSL_ASYNC_CRYPT_SW */
  5876. }
  5877. /* encoded with DSA header */
  5878. if (err == 0) {
  5879. err = StoreECC_DSA_Sig(out, outlen, r, s);
  5880. }
  5881. /* done with R/S */
  5882. mp_clear(r);
  5883. mp_clear(s);
  5884. break;
  5885. default:
  5886. err = BAD_STATE_E;
  5887. break;
  5888. }
  5889. /* if async pending then return and skip done cleanup below */
  5890. if (err == WC_PENDING_E) {
  5891. key->state++;
  5892. return err;
  5893. }
  5894. /* cleanup */
  5895. wc_ecc_free_async(key);
  5896. key->state = ECC_STATE_NONE;
  5897. return err;
  5898. }
  5899. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  5900. /**
  5901. Sign a message digest
  5902. in The message digest to sign
  5903. inlen The length of the digest
  5904. out [out] The destination for the signature
  5905. outlen [in/out] The max size and resulting size of the signature
  5906. key A private ECC key
  5907. return MP_OKAY if successful
  5908. */
  5909. WOLFSSL_ABI
  5910. int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen,
  5911. WC_RNG* rng, ecc_key* key)
  5912. {
  5913. int err;
  5914. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(WC_ASYNC_ENABLE_ECC)
  5915. DECL_MP_INT_SIZE_DYN(r, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  5916. DECL_MP_INT_SIZE_DYN(s, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  5917. #endif
  5918. if (in == NULL || out == NULL || outlen == NULL || key == NULL) {
  5919. return ECC_BAD_ARG_E;
  5920. }
  5921. #ifdef WOLF_CRYPTO_CB
  5922. #ifndef WOLF_CRYPTO_CB_FIND
  5923. if (key->devId != INVALID_DEVID)
  5924. #endif
  5925. {
  5926. err = wc_CryptoCb_EccSign(in, inlen, out, outlen, rng, key);
  5927. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  5928. if (err != CRYPTOCB_UNAVAILABLE)
  5929. return err;
  5930. /* fall-through when unavailable */
  5931. #endif
  5932. #ifdef WOLF_CRYPTO_CB_ONLY_ECC
  5933. if (err == CRYPTOCB_UNAVAILABLE) {
  5934. err = NO_VALID_DEVID;
  5935. }
  5936. #endif
  5937. }
  5938. #endif
  5939. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  5940. if (rng == NULL) {
  5941. WOLFSSL_MSG("ECC sign RNG missing");
  5942. return ECC_BAD_ARG_E;
  5943. }
  5944. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5945. /* handle async cases */
  5946. err = wc_ecc_sign_hash_async(in, inlen, out, outlen, rng, key);
  5947. #else
  5948. NEW_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  5949. #ifdef MP_INT_SIZE_CHECK_NULL
  5950. if (r == NULL)
  5951. return MEMORY_E;
  5952. #endif
  5953. NEW_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  5954. #ifdef MP_INT_SIZE_CHECK_NULL
  5955. if (s == NULL) {
  5956. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  5957. return MEMORY_E;
  5958. }
  5959. #endif
  5960. err = INIT_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key));
  5961. if (err != 0) {
  5962. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  5963. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  5964. return err;
  5965. }
  5966. err = INIT_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key));
  5967. if (err != 0) {
  5968. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  5969. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  5970. return err;
  5971. }
  5972. /* hardware crypto */
  5973. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  5974. defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) || \
  5975. defined(WOLFSSL_SILABS_SE_ACCEL) || defined(WOLFSSL_KCAPI_ECC) || \
  5976. defined(WOLFSSL_SE050) || defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5977. err = wc_ecc_sign_hash_hw(in, inlen, r, s, out, outlen, rng, key);
  5978. #else
  5979. err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  5980. #endif
  5981. if (err < 0) {
  5982. mp_clear(r);
  5983. mp_clear(s);
  5984. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  5985. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  5986. return err;
  5987. }
  5988. /* encoded with DSA header */
  5989. err = StoreECC_DSA_Sig(out, outlen, r, s);
  5990. /* cleanup */
  5991. mp_clear(r);
  5992. mp_clear(s);
  5993. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  5994. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  5995. #endif /* WOLFSSL_ASYNC_CRYPT */
  5996. #else
  5997. (void)rng;
  5998. (void)inlen;
  5999. (void)s;
  6000. (void)r;
  6001. (void)err;
  6002. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  6003. return err;
  6004. }
  6005. #endif /* !NO_ASN */
  6006. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6007. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6008. /* returns MP_OKAY on success */
  6009. static int deterministic_sign_helper(const byte* in, word32 inlen, ecc_key* key)
  6010. {
  6011. int err = MP_OKAY;
  6012. DECLARE_CURVE_SPECS(1);
  6013. ALLOC_CURVE_SPECS(1, err);
  6014. /* get curve order */
  6015. if (err == MP_OKAY) {
  6016. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  6017. }
  6018. if (err == MP_OKAY) {
  6019. #ifndef WOLFSSL_NO_MALLOC
  6020. /* if key->sign_k is NULL then create a buffer for the mp_int
  6021. * if not NULL then assume the user correctly set deterministic flag and
  6022. * that the key->sign_k holds a previously malloc'd mp_int buffer */
  6023. if (key->sign_k == NULL) {
  6024. key->sign_k = (mp_int*)XMALLOC(sizeof(mp_int), key->heap,
  6025. DYNAMIC_TYPE_ECC);
  6026. }
  6027. if (key->sign_k != NULL) {
  6028. /* currently limiting to SHA256 for auto create */
  6029. if (mp_init(key->sign_k) != MP_OKAY ||
  6030. wc_ecc_gen_deterministic_k(in, inlen,
  6031. WC_HASH_TYPE_SHA256, key->k, key->sign_k,
  6032. curve->order, key->heap) != 0) {
  6033. mp_free(key->sign_k);
  6034. XFREE(key->sign_k, key->heap, DYNAMIC_TYPE_ECC);
  6035. key->sign_k = NULL;
  6036. err = ECC_PRIV_KEY_E;
  6037. }
  6038. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6039. else {
  6040. mp_memzero_add("deterministic_sign_helper sign_k", key->sign_k);
  6041. }
  6042. #endif
  6043. }
  6044. else {
  6045. err = MEMORY_E;
  6046. }
  6047. #else
  6048. key->sign_k_set = 0;
  6049. /* currently limiting to SHA256 for auto create */
  6050. if (wc_ecc_gen_deterministic_k(in, inlen, WC_HASH_TYPE_SHA256, key->k,
  6051. key->sign_k, curve->order, key->heap) != 0) {
  6052. err = ECC_PRIV_KEY_E;
  6053. }
  6054. else {
  6055. key->sign_k_set = 1;
  6056. }
  6057. #endif
  6058. }
  6059. wc_ecc_curve_free(curve);
  6060. FREE_CURVE_SPECS();
  6061. return err;
  6062. }
  6063. #endif /* WOLFSSL_ECDSA_DETERMINISTIC_K ||
  6064. WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT */
  6065. #if defined(WOLFSSL_STM32_PKA)
  6066. int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
  6067. ecc_key* key, mp_int *r, mp_int *s)
  6068. {
  6069. return stm32_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  6070. }
  6071. #elif !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  6072. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_KCAPI_ECC)
  6073. #ifndef WOLFSSL_SP_MATH
  6074. static int ecc_sign_hash_sw(ecc_key* key, ecc_key* pubkey, WC_RNG* rng,
  6075. ecc_curve_spec* curve, mp_int* e, mp_int* r,
  6076. mp_int* s)
  6077. {
  6078. int err = MP_OKAY;
  6079. int loop_check = 0;
  6080. DECL_MP_INT_SIZE_DYN(b, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  6081. NEW_MP_INT_SIZE(b, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  6082. #ifdef MP_INT_SIZE_CHECK_NULL
  6083. if (b == NULL)
  6084. err = MEMORY_E;
  6085. #endif
  6086. if (err == MP_OKAY) {
  6087. err = INIT_MP_INT_SIZE(b, ECC_KEY_MAX_BITS(key));
  6088. }
  6089. #ifdef WOLFSSL_CUSTOM_CURVES
  6090. /* if custom curve, apply params to pubkey */
  6091. if (err == MP_OKAY && key->idx == ECC_CUSTOM_IDX) {
  6092. err = wc_ecc_set_custom_curve(pubkey, key->dp);
  6093. }
  6094. #endif
  6095. if (err == MP_OKAY) {
  6096. /* Generate blinding value - non-zero value. */
  6097. do {
  6098. if (++loop_check > 64) {
  6099. err = RNG_FAILURE_E;
  6100. break;
  6101. }
  6102. err = wc_ecc_gen_k(rng, key->dp->size, b, curve->order);
  6103. }
  6104. while (err == MP_ZERO_E);
  6105. loop_check = 0;
  6106. }
  6107. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6108. if (err == MP_OKAY) {
  6109. mp_memzero_add("ecc_sign_hash_sw b", b);
  6110. }
  6111. #endif
  6112. for (; err == MP_OKAY;) {
  6113. if (++loop_check > 64) {
  6114. err = RNG_FAILURE_E;
  6115. break;
  6116. }
  6117. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) || \
  6118. defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6119. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6120. #ifndef WOLFSSL_NO_MALLOC
  6121. if (key->sign_k != NULL)
  6122. #else
  6123. if (key->sign_k_set)
  6124. #endif
  6125. {
  6126. if (loop_check > 1) {
  6127. err = RNG_FAILURE_E;
  6128. break;
  6129. }
  6130. /* use provided sign_k */
  6131. err = mp_copy(key->sign_k, pubkey->k);
  6132. if (err != MP_OKAY) break;
  6133. /* free sign_k, so only used once */
  6134. mp_forcezero(key->sign_k);
  6135. #ifndef WOLFSSL_NO_MALLOC
  6136. mp_free(key->sign_k);
  6137. XFREE(key->sign_k, key->heap, DYNAMIC_TYPE_ECC);
  6138. key->sign_k = NULL;
  6139. #else
  6140. key->sign_k_set = 0;
  6141. #endif
  6142. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  6143. loop_check = 64;
  6144. #endif
  6145. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6146. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6147. if (key->deterministic == 1) {
  6148. /* sign_k generated earlier in function for SP calls.
  6149. * Only go through the loop once and fail if error */
  6150. loop_check = 64;
  6151. }
  6152. #endif
  6153. /* compute public key based on provided "k" */
  6154. err = ecc_make_pub_ex(pubkey, curve, NULL, rng);
  6155. }
  6156. else
  6157. #endif
  6158. {
  6159. err = _ecc_make_key_ex(rng, key->dp->size, pubkey, key->dp->id,
  6160. WC_ECC_FLAG_NONE);
  6161. }
  6162. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6163. if (err == MP_OKAY) {
  6164. mp_memzero_add("ecc_sign_hash_sw k", pubkey->k);
  6165. }
  6166. #endif
  6167. #ifdef WOLFSSL_ASYNC_CRYPT
  6168. /* for async do blocking wait here */
  6169. err = wc_AsyncWait(err, &pubkey->asyncDev, WC_ASYNC_FLAG_NONE);
  6170. #endif
  6171. if (err != MP_OKAY) break;
  6172. /* find r = x1 mod n */
  6173. err = mp_mod(pubkey->pubkey.x, curve->order, r);
  6174. if (err != MP_OKAY) break;
  6175. if (mp_iszero(r) == MP_NO) {
  6176. mp_int* ep = pubkey->k;
  6177. mp_int* kp = pubkey->k;
  6178. mp_int* x = key->k;
  6179. /* find s = (e + xr)/k
  6180. = b.(e/k.b + x.r/k.b) */
  6181. /* k' = k.b */
  6182. err = mp_mulmod(pubkey->k, b, curve->order, kp);
  6183. if (err != MP_OKAY) break;
  6184. /* k' = 1/k.b
  6185. = 1/k' */
  6186. err = mp_invmod(kp, curve->order, kp);
  6187. if (err != MP_OKAY) break;
  6188. /* s = x.r */
  6189. err = mp_mulmod(x, r, curve->order, s);
  6190. if (err != MP_OKAY) break;
  6191. /* s = x.r/k.b
  6192. = k'.s */
  6193. err = mp_mulmod(kp, s, curve->order, s);
  6194. if (err != MP_OKAY) break;
  6195. /* e' = e/k.b
  6196. = e.k' */
  6197. err = mp_mulmod(kp, e, curve->order, ep);
  6198. if (err != MP_OKAY) break;
  6199. /* s = e/k.b + x.r/k.b = (e + x.r)/k.b
  6200. = e' + s */
  6201. err = mp_addmod_ct(ep, s, curve->order, s);
  6202. if (err != MP_OKAY) break;
  6203. /* s = b.(e + x.r)/k.b = (e + x.r)/k
  6204. = b.s */
  6205. err = mp_mulmod(s, b, curve->order, s);
  6206. if (err != MP_OKAY) break;
  6207. if (mp_iszero(s) == MP_NO) {
  6208. /* sign successful */
  6209. break;
  6210. }
  6211. }
  6212. #ifndef ALT_ECC_SIZE
  6213. mp_clear(pubkey->pubkey.x);
  6214. mp_clear(pubkey->pubkey.y);
  6215. mp_clear(pubkey->pubkey.z);
  6216. #endif
  6217. mp_forcezero(pubkey->k);
  6218. }
  6219. mp_forcezero(b);
  6220. FREE_MP_INT_SIZE(b, key->heap, DYNAMIC_TYPE_ECC);
  6221. #if !defined(WOLFSSL_SMALL_STACK) && defined(WOLFSSL_CHECK_MEM_ZERO)
  6222. mp_memzero_check(b);
  6223. #endif
  6224. return err;
  6225. }
  6226. #endif
  6227. #ifdef WOLFSSL_HAVE_SP_ECC
  6228. static int ecc_sign_hash_sp(const byte* in, word32 inlen, WC_RNG* rng,
  6229. ecc_key* key, mp_int *r, mp_int *s)
  6230. {
  6231. if (key->idx != ECC_CUSTOM_IDX) {
  6232. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) \
  6233. || defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6234. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6235. mp_int* sign_k = key->sign_k;
  6236. #else
  6237. mp_int* sign_k = NULL;
  6238. #endif
  6239. #if defined(WC_ECC_NONBLOCK) && defined(WC_ECC_NONBLOCK_ONLY)
  6240. /* perform blocking call to non-blocking function */
  6241. ecc_nb_ctx_t nb_ctx;
  6242. XMEMSET(&nb_ctx, 0, sizeof(nb_ctx));
  6243. #endif
  6244. #ifndef WOLFSSL_SP_NO_256
  6245. if (ecc_sets[key->idx].id == ECC_SECP256R1) {
  6246. #ifdef WC_ECC_NONBLOCK
  6247. #ifdef WC_ECC_NONBLOCK_ONLY
  6248. int err;
  6249. #endif
  6250. if (key->nb_ctx) {
  6251. return sp_ecc_sign_256_nb(&key->nb_ctx->sp_ctx, in, inlen, rng,
  6252. key->k, r, s, sign_k, key->heap);
  6253. }
  6254. #ifdef WC_ECC_NONBLOCK_ONLY
  6255. do { /* perform blocking call to non-blocking function */
  6256. err = sp_ecc_sign_256_nb(&nb_ctx.sp_ctx, in, inlen, rng,
  6257. key->k, r, s, sign_k, key->heap);
  6258. } while (err == FP_WOULDBLOCK);
  6259. return err;
  6260. #endif
  6261. #endif /* WC_ECC_NONBLOCK */
  6262. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  6263. {
  6264. int ret;
  6265. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  6266. ret = sp_ecc_sign_256(in, inlen, rng, key->k, r, s, sign_k,
  6267. key->heap);
  6268. RESTORE_VECTOR_REGISTERS();
  6269. return ret;
  6270. }
  6271. #endif
  6272. }
  6273. #endif
  6274. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  6275. if (ecc_sets[key->idx].id == ECC_SM2P256V1) {
  6276. int ret;
  6277. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  6278. ret = sp_ecc_sign_sm2_256(in, inlen, rng, key->k, r, s, sign_k,
  6279. key->heap);
  6280. RESTORE_VECTOR_REGISTERS();
  6281. return ret;
  6282. }
  6283. #endif
  6284. #ifdef WOLFSSL_SP_384
  6285. if (ecc_sets[key->idx].id == ECC_SECP384R1) {
  6286. #ifdef WC_ECC_NONBLOCK
  6287. #ifdef WC_ECC_NONBLOCK_ONLY
  6288. int err;
  6289. #endif
  6290. if (key->nb_ctx) {
  6291. return sp_ecc_sign_384_nb(&key->nb_ctx->sp_ctx, in, inlen, rng,
  6292. key->k, r, s, sign_k, key->heap);
  6293. }
  6294. #ifdef WC_ECC_NONBLOCK_ONLY
  6295. do { /* perform blocking call to non-blocking function */
  6296. err = sp_ecc_sign_384_nb(&nb_ctx.sp_ctx, in, inlen, rng,
  6297. key->k, r, s, sign_k, key->heap);
  6298. } while (err == FP_WOULDBLOCK);
  6299. return err;
  6300. #endif
  6301. #endif /* WC_ECC_NONBLOCK */
  6302. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  6303. {
  6304. int ret;
  6305. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  6306. ret = sp_ecc_sign_384(in, inlen, rng, key->k, r, s, sign_k,
  6307. key->heap);
  6308. RESTORE_VECTOR_REGISTERS();
  6309. return ret;
  6310. }
  6311. #endif
  6312. }
  6313. #endif
  6314. #ifdef WOLFSSL_SP_521
  6315. if (ecc_sets[key->idx].id == ECC_SECP521R1) {
  6316. #ifdef WC_ECC_NONBLOCK
  6317. #ifdef WC_ECC_NONBLOCK_ONLY
  6318. int err;
  6319. #endif
  6320. if (key->nb_ctx) {
  6321. return sp_ecc_sign_521_nb(&key->nb_ctx->sp_ctx, in, inlen, rng,
  6322. key->k, r, s, sign_k, key->heap);
  6323. }
  6324. #ifdef WC_ECC_NONBLOCK_ONLY
  6325. do { /* perform blocking call to non-blocking function */
  6326. err = sp_ecc_sign_521_nb(&nb_ctx.sp_ctx, in, inlen, rng,
  6327. key->k, r, s, sign_k, key->heap);
  6328. } while (err == FP_WOULDBLOCK);
  6329. return err;
  6330. #endif
  6331. #endif /* WC_ECC_NONBLOCK */
  6332. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  6333. {
  6334. int ret;
  6335. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  6336. ret = sp_ecc_sign_521(in, inlen, rng, key->k, r, s, sign_k,
  6337. key->heap);
  6338. RESTORE_VECTOR_REGISTERS();
  6339. return ret;
  6340. }
  6341. #endif
  6342. }
  6343. #endif
  6344. (void)sign_k;
  6345. }
  6346. /* SP doesn't support curve. */
  6347. return WC_KEY_SIZE_E;
  6348. }
  6349. #endif
  6350. /**
  6351. Sign a message digest
  6352. in The message digest to sign
  6353. inlen The length of the digest
  6354. key A private ECC key
  6355. r [out] The destination for r component of the signature
  6356. s [out] The destination for s component of the signature
  6357. return MP_OKAY if successful
  6358. */
  6359. int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
  6360. ecc_key* key, mp_int *r, mp_int *s)
  6361. {
  6362. int err = 0;
  6363. #if !defined(WOLFSSL_SP_MATH)
  6364. mp_int* e;
  6365. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  6366. DECL_MP_INT_SIZE_DYN(e_lcl, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  6367. #endif
  6368. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) || \
  6369. defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6370. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT) || \
  6371. (defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  6372. (defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)))
  6373. DECLARE_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  6374. #else
  6375. DECLARE_CURVE_SPECS(1);
  6376. #endif
  6377. #endif /* !WOLFSSL_SP_MATH */
  6378. if (in == NULL || r == NULL || s == NULL || key == NULL || rng == NULL) {
  6379. return ECC_BAD_ARG_E;
  6380. }
  6381. /* is this a private key? */
  6382. if (key->type != ECC_PRIVATEKEY && key->type != ECC_PRIVATEKEY_ONLY) {
  6383. return ECC_BAD_ARG_E;
  6384. }
  6385. /* is the IDX valid ? */
  6386. if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) {
  6387. return ECC_BAD_ARG_E;
  6388. }
  6389. #if defined(WOLFSSL_SP_MATH)
  6390. if (key->idx == ECC_CUSTOM_IDX || (1
  6391. #ifndef WOLFSSL_SP_NO_256
  6392. && ecc_sets[key->idx].id != ECC_SECP256R1
  6393. #endif
  6394. #ifdef WOLFSSL_SP_SM2
  6395. && ecc_sets[key->idx].id != ECC_SM2P256V1
  6396. #endif
  6397. #ifdef WOLFSSL_SP_384
  6398. && ecc_sets[key->idx].id != ECC_SECP384R1
  6399. #endif
  6400. #ifdef WOLFSSL_SP_521
  6401. && ecc_sets[key->idx].id != ECC_SECP521R1
  6402. #endif
  6403. )) {
  6404. return WC_KEY_SIZE_E;
  6405. }
  6406. #endif
  6407. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6408. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6409. /* generate deterministic 'k' value to be used either with SP or normal */
  6410. if (key->deterministic == 1) {
  6411. if (deterministic_sign_helper(in, inlen, key)) {
  6412. WOLFSSL_MSG("Error generating deterministic k to sign");
  6413. return ECC_PRIV_KEY_E;
  6414. }
  6415. }
  6416. #endif
  6417. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  6418. defined(WOLFSSL_ASYNC_CRYPT_SW)
  6419. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  6420. if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_SIGN)) {
  6421. WC_ASYNC_SW* sw = &key->asyncDev.sw;
  6422. sw->eccSign.in = in;
  6423. sw->eccSign.inSz = inlen;
  6424. sw->eccSign.rng = rng;
  6425. sw->eccSign.key = key;
  6426. sw->eccSign.r = r;
  6427. sw->eccSign.s = s;
  6428. return WC_PENDING_E;
  6429. }
  6430. }
  6431. #endif
  6432. #if defined(WOLFSSL_HAVE_SP_ECC)
  6433. err = ecc_sign_hash_sp(in, inlen, rng, key, r, s);
  6434. if (err != WC_KEY_SIZE_E) {
  6435. return err;
  6436. }
  6437. #else
  6438. (void)inlen;
  6439. #endif
  6440. #if !defined(WOLFSSL_SP_MATH)
  6441. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V)
  6442. err = wc_ecc_alloc_mpint(key, &key->e);
  6443. if (err != 0) {
  6444. return err;
  6445. }
  6446. e = key->e;
  6447. #else
  6448. NEW_MP_INT_SIZE(e_lcl, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  6449. #ifdef MP_INT_SIZE_CHECK_NULL
  6450. if (e_lcl == NULL) {
  6451. return MEMORY_E;
  6452. }
  6453. #endif
  6454. e = e_lcl;
  6455. #endif
  6456. /* get the hash and load it as a bignum into 'e' */
  6457. /* init the bignums */
  6458. if ((err = INIT_MP_INT_SIZE(e, ECC_KEY_MAX_BITS(key))) != MP_OKAY) {
  6459. FREE_MP_INT_SIZE(e_lcl, key->heap, DYNAMIC_TYPE_ECC);
  6460. return err;
  6461. }
  6462. /* load curve info */
  6463. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) || \
  6464. defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6465. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6466. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  6467. if (err == MP_OKAY)
  6468. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  6469. #else
  6470. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  6471. (defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA))
  6472. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  6473. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  6474. if (err == MP_OKAY)
  6475. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  6476. }
  6477. else
  6478. #endif
  6479. {
  6480. ALLOC_CURVE_SPECS(1, err);
  6481. if (err == MP_OKAY)
  6482. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  6483. }
  6484. #endif
  6485. /* load digest into e */
  6486. if (err == MP_OKAY) {
  6487. /* we may need to truncate if hash is longer than key size */
  6488. word32 orderBits = (word32)mp_count_bits(curve->order);
  6489. /* truncate down to byte size, may be all that's needed */
  6490. if ((WOLFSSL_BIT_SIZE * inlen) > orderBits)
  6491. inlen = (orderBits + WOLFSSL_BIT_SIZE - 1) / WOLFSSL_BIT_SIZE;
  6492. err = mp_read_unsigned_bin(e, in, inlen);
  6493. /* may still need bit truncation too */
  6494. if (err == MP_OKAY && (WOLFSSL_BIT_SIZE * inlen) > orderBits)
  6495. mp_rshb(e, (int)(WOLFSSL_BIT_SIZE - (orderBits & 0x7)));
  6496. }
  6497. /* make up a key and export the public copy */
  6498. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  6499. if ((err == MP_OKAY) && (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC)) {
  6500. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  6501. #ifdef HAVE_CAVIUM_V
  6502. if (NitroxEccIsCurveSupported(key))
  6503. #endif
  6504. {
  6505. word32 keySz = key->dp->size;
  6506. mp_int* k;
  6507. #ifdef HAVE_CAVIUM_V
  6508. err = wc_ecc_alloc_mpint(key, &key->signK);
  6509. if (err != 0)
  6510. return err;
  6511. k = key->signK;
  6512. #else
  6513. mp_int k_lcl;
  6514. k = &k_lcl;
  6515. #endif
  6516. err = mp_init(k);
  6517. /* make sure r and s are allocated */
  6518. #ifdef HAVE_CAVIUM_V
  6519. /* Nitrox V needs single buffer for R and S */
  6520. if (err == MP_OKAY)
  6521. err = wc_bigint_alloc(&key->r->raw, NitroxEccGetSize(key)*2);
  6522. /* Nitrox V only needs Prime and Order */
  6523. if (err == MP_OKAY)
  6524. err = wc_ecc_curve_load(key->dp, &curve,
  6525. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_ORDER));
  6526. #else
  6527. if (err == MP_OKAY)
  6528. err = wc_bigint_alloc(&key->r->raw, key->dp->size);
  6529. if (err == MP_OKAY)
  6530. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  6531. #endif
  6532. if (err == MP_OKAY)
  6533. err = wc_bigint_alloc(&key->s->raw, key->dp->size);
  6534. /* load e and k */
  6535. if (err == MP_OKAY)
  6536. err = wc_mp_to_bigint_sz(e, &e->raw, keySz);
  6537. if (err == MP_OKAY)
  6538. err = wc_mp_to_bigint_sz(key->k, &key->k->raw, keySz);
  6539. if (err == MP_OKAY)
  6540. err = wc_ecc_gen_k(rng, key->dp->size, k, curve->order);
  6541. if (err == MP_OKAY)
  6542. err = wc_mp_to_bigint_sz(k, &k->raw, keySz);
  6543. #ifdef HAVE_CAVIUM_V
  6544. if (err == MP_OKAY)
  6545. err = NitroxEcdsaSign(key, &e->raw, &key->k->raw, &k->raw,
  6546. &r->raw, &s->raw, &curve->prime->raw, &curve->order->raw);
  6547. #else
  6548. if (err == MP_OKAY)
  6549. err = IntelQaEcdsaSign(&key->asyncDev, &e->raw, &key->k->raw,
  6550. &k->raw, &r->raw, &s->raw, &curve->Af->raw, &curve->Bf->raw,
  6551. &curve->prime->raw, &curve->order->raw, &curve->Gx->raw,
  6552. &curve->Gy->raw);
  6553. #endif
  6554. #ifndef HAVE_CAVIUM_V
  6555. mp_clear(e);
  6556. mp_clear(k);
  6557. #endif
  6558. wc_ecc_curve_free(curve);
  6559. FREE_CURVE_SPECS();
  6560. return err;
  6561. }
  6562. #endif /* HAVE_CAVIUM_V || HAVE_INTEL_QA */
  6563. }
  6564. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  6565. if (err == MP_OKAY) {
  6566. #ifdef WOLFSSL_SMALL_STACK
  6567. ecc_key* pubkey;
  6568. #else
  6569. ecc_key pubkey[1];
  6570. #endif
  6571. #ifdef WOLFSSL_SMALL_STACK
  6572. pubkey = (ecc_key*)XMALLOC(sizeof(ecc_key), key->heap, DYNAMIC_TYPE_ECC);
  6573. if (pubkey == NULL)
  6574. err = MEMORY_E;
  6575. #endif
  6576. /* don't use async for key, since we don't support async return here */
  6577. if (err == MP_OKAY) {
  6578. err = wc_ecc_init_ex(pubkey, key->heap, INVALID_DEVID);
  6579. if (err == MP_OKAY) {
  6580. err = ecc_sign_hash_sw(key, pubkey, rng, curve, e, r, s);
  6581. wc_ecc_free(pubkey);
  6582. #ifdef WOLFSSL_SMALL_STACK
  6583. XFREE(pubkey, key->heap, DYNAMIC_TYPE_ECC);
  6584. #endif
  6585. }
  6586. }
  6587. }
  6588. mp_clear(e);
  6589. wc_ecc_curve_free(curve);
  6590. FREE_MP_INT_SIZE(e_lcl, key->heap, DYNAMIC_TYPE_ECC);
  6591. FREE_CURVE_SPECS();
  6592. #endif /* !WOLFSSL_SP_MATH */
  6593. return err;
  6594. }
  6595. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6596. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6597. /* helper function to do HMAC operations
  6598. * returns 0 on success and updates "out" buffer
  6599. */
  6600. static int _HMAC_K(byte* K, word32 KSz, byte* V, word32 VSz,
  6601. const byte* h1, word32 h1Sz, byte* x, word32 xSz, byte* oct,
  6602. byte* out, enum wc_HashType hashType, void* heap)
  6603. {
  6604. Hmac hmac;
  6605. int ret, init;
  6606. ret = init = wc_HmacInit(&hmac, heap, 0);
  6607. if (ret == 0)
  6608. ret = wc_HmacSetKey(&hmac, hashType, K, KSz);
  6609. if (ret == 0)
  6610. ret = wc_HmacUpdate(&hmac, V, VSz);
  6611. if (ret == 0 && oct != NULL)
  6612. ret = wc_HmacUpdate(&hmac, oct, 1);
  6613. if (ret == 0)
  6614. ret = wc_HmacUpdate(&hmac, x, xSz);
  6615. if (ret == 0)
  6616. ret = wc_HmacUpdate(&hmac, h1, h1Sz);
  6617. if (ret == 0)
  6618. ret = wc_HmacFinal(&hmac, out);
  6619. if (init == 0)
  6620. wc_HmacFree(&hmac);
  6621. return ret;
  6622. }
  6623. /* Generates a deterministic key based of the message using RFC6979
  6624. * @param [in] hash Hash value to sign
  6625. * @param [in] hashSz Size of 'hash' buffer passed in
  6626. * @param [in] hashType Type of hash to use with deterministic k gen, i.e.
  6627. * WC_HASH_TYPE_SHA256
  6628. * @param [in] priv Current ECC private key set
  6629. * @param [out] k An initialized mp_int to set the k value generated in
  6630. * @param [in] order ECC order parameter to use with generation
  6631. * @return 0 on success.
  6632. */
  6633. int wc_ecc_gen_deterministic_k(const byte* hash, word32 hashSz,
  6634. enum wc_HashType hashType, mp_int* priv, mp_int* k, mp_int* order,
  6635. void* heap)
  6636. {
  6637. int ret = 0, qbits = 0;
  6638. #ifndef WOLFSSL_SMALL_STACK
  6639. byte h1[MAX_ECC_BYTES];
  6640. byte V[WC_MAX_DIGEST_SIZE];
  6641. byte K[WC_MAX_DIGEST_SIZE];
  6642. byte x[MAX_ECC_BYTES];
  6643. mp_int z1[1];
  6644. #else
  6645. byte *h1 = NULL;
  6646. byte *V = NULL;
  6647. byte *K = NULL;
  6648. byte *x = NULL;
  6649. mp_int *z1 = NULL;
  6650. #endif
  6651. word32 xSz, VSz, KSz, h1len, qLen;
  6652. byte intOct;
  6653. if (hash == NULL || k == NULL || order == NULL) {
  6654. return BAD_FUNC_ARG;
  6655. }
  6656. if (hashSz > WC_MAX_DIGEST_SIZE) {
  6657. WOLFSSL_MSG("hash size was too large!");
  6658. return BAD_FUNC_ARG;
  6659. }
  6660. if (hashSz != WC_SHA256_DIGEST_SIZE) {
  6661. WOLFSSL_MSG("Currently only SHA256 digest is supported");
  6662. return BAD_FUNC_ARG;
  6663. }
  6664. if (mp_unsigned_bin_size(priv) > MAX_ECC_BYTES) {
  6665. WOLFSSL_MSG("private key larger than max expected!");
  6666. return BAD_FUNC_ARG;
  6667. }
  6668. #ifdef WOLFSSL_SMALL_STACK
  6669. h1 = (byte*)XMALLOC(MAX_ECC_BYTES, heap, DYNAMIC_TYPE_DIGEST);
  6670. if (h1 == NULL) {
  6671. ret = MEMORY_E;
  6672. }
  6673. if (ret == 0) {
  6674. V = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6675. if (V == NULL)
  6676. ret = MEMORY_E;
  6677. }
  6678. if (ret == 0) {
  6679. K = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6680. if (K == NULL)
  6681. ret = MEMORY_E;
  6682. }
  6683. if (ret == 0) {
  6684. x = (byte*)XMALLOC(MAX_ECC_BYTES, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6685. if (x == NULL)
  6686. ret = MEMORY_E;
  6687. }
  6688. if (ret == 0) {
  6689. z1 = (mp_int *)XMALLOC(sizeof(*z1), heap, DYNAMIC_TYPE_ECC_BUFFER);
  6690. if (z1 == NULL)
  6691. ret = MEMORY_E;
  6692. }
  6693. /* bail out if any error has been hit at this point */
  6694. if (ret != 0) {
  6695. if (x != NULL)
  6696. XFREE(x, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6697. if (K != NULL)
  6698. XFREE(K, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6699. if (V != NULL)
  6700. XFREE(V, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6701. if (h1 != NULL)
  6702. XFREE(h1, heap, DYNAMIC_TYPE_DIGEST);
  6703. return ret;
  6704. }
  6705. #endif
  6706. VSz = KSz = hashSz;
  6707. qLen = xSz = h1len = (word32)mp_unsigned_bin_size(order);
  6708. /* 3.2 b. Set V = 0x01 0x01 ... */
  6709. XMEMSET(V, 0x01, VSz);
  6710. /* 3.2 c. Set K = 0x00 0x00 ... */
  6711. XMEMSET(K, 0x00, KSz);
  6712. mp_init(z1); /* always init z1 and free z1 */
  6713. ret = mp_to_unsigned_bin_len(priv, x, (int)qLen);
  6714. if (ret == 0) {
  6715. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6716. wc_MemZero_Add("wc_ecc_gen_deterministic_k x", x, qLen);
  6717. #endif
  6718. qbits = mp_count_bits(order);
  6719. ret = mp_read_unsigned_bin(z1, hash, hashSz);
  6720. }
  6721. /* bits2octets on h1 */
  6722. if (ret == 0) {
  6723. XMEMSET(h1, 0, MAX_ECC_BYTES);
  6724. #if !defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6725. /* mod reduce by order using conditional subtract
  6726. * RFC6979 lists a variant that uses the hash directly instead of
  6727. * doing bits2octets(H(m)), when variant macro is used avoid this
  6728. * bits2octets operation */
  6729. if (mp_cmp(z1, order) == MP_GT) {
  6730. int z1Sz;
  6731. mp_sub(z1, order, z1);
  6732. z1Sz = mp_unsigned_bin_size(z1);
  6733. if (z1Sz < 0 || z1Sz > MAX_ECC_BYTES) {
  6734. ret = BUFFER_E;
  6735. }
  6736. else {
  6737. ret = mp_to_unsigned_bin_len(z1, h1, h1len);
  6738. }
  6739. }
  6740. else
  6741. #endif
  6742. {
  6743. /* use original hash and keep leading 0's */
  6744. mp_to_unsigned_bin_len(z1, h1, (int)h1len);
  6745. }
  6746. }
  6747. mp_free(z1);
  6748. /* 3.2 step d. K = HMAC_K(V || 0x00 || int2octests(x) || bits2octests(h1) */
  6749. if (ret == 0) {
  6750. intOct = 0x00;
  6751. ret = _HMAC_K(K, KSz, V, VSz, h1, h1len, x, xSz, &intOct, K,
  6752. hashType, heap);
  6753. }
  6754. /* 3.2 step e. V = HMAC_K(V) */
  6755. if (ret == 0) {
  6756. ret = _HMAC_K(K, KSz, V, VSz, NULL, 0, NULL, 0, NULL, V, hashType,
  6757. heap);
  6758. }
  6759. /* 3.2 step f. K = HMAC_K(V || 0x01 || int2octests(x) || bits2octests(h1) */
  6760. if (ret == 0) {
  6761. intOct = 0x01;
  6762. ret = _HMAC_K(K, KSz, V, VSz, h1, h1len, x, xSz, &intOct, K, hashType,
  6763. heap);
  6764. }
  6765. /* 3.2 step g. V = HMAC_K(V) */
  6766. if (ret == 0) {
  6767. ret = _HMAC_K(K, KSz, V, VSz, NULL, 0, NULL, 0, NULL, V, hashType,
  6768. heap);
  6769. }
  6770. /* 3.2 step h. loop through the next steps until a valid value is found */
  6771. if (ret == 0 ) {
  6772. int err;
  6773. intOct = 0x00;
  6774. do {
  6775. xSz = 0; /* used as tLen */
  6776. err = 0; /* start as good until generated k is tested */
  6777. /* 3.2 step h.2 when tlen < qlen do V = HMAC_K(V); T = T || V */
  6778. while (xSz < qLen) {
  6779. ret = _HMAC_K(K, KSz, V, VSz, NULL, 0, NULL, 0, NULL, V,
  6780. hashType, heap);
  6781. if (ret == 0) {
  6782. int sz;
  6783. sz = (int)MIN(qLen - xSz, (size_t)VSz);
  6784. XMEMCPY(x + xSz, V, (size_t)sz);
  6785. xSz += (word32)sz;
  6786. }
  6787. else {
  6788. break; /* error case */
  6789. }
  6790. }
  6791. if (ret == 0) {
  6792. mp_clear(k); /* 3.2 step h.1 clear T */
  6793. ret = mp_read_unsigned_bin(k, x, xSz);
  6794. }
  6795. if ((ret == 0) && ((int)(xSz * WOLFSSL_BIT_SIZE) != qbits)) {
  6796. /* handle odd case where shift of 'k' is needed with RFC 6979
  6797. * k = bits2int(T) in section 3.2 h.3 */
  6798. mp_rshb(k, ((int)xSz * WOLFSSL_BIT_SIZE) - qbits);
  6799. }
  6800. /* 3.2 step h.3 the key should be smaller than the order of base
  6801. * point */
  6802. if (ret == 0) {
  6803. if (mp_cmp(k, order) != MP_LT) {
  6804. err = MP_VAL;
  6805. } else if (mp_iszero(k) == MP_YES) {
  6806. /* no 0 key's */
  6807. err = MP_ZERO_E;
  6808. }
  6809. }
  6810. /* 3.2 step h.3 if there was a problem with 'k' generated then try
  6811. * again K = HMAC_K(V || 0x00) and V = HMAC_K(V) */
  6812. if (ret == 0 && err != 0) {
  6813. ret = _HMAC_K(K, KSz, V, VSz, NULL, 0, NULL, 0, &intOct, K,
  6814. hashType, heap);
  6815. if (ret == 0) {
  6816. ret = _HMAC_K(K, KSz, V, VSz, NULL, 0, NULL, 0, NULL, V,
  6817. hashType, heap);
  6818. }
  6819. }
  6820. } while (ret == 0 && err != 0);
  6821. }
  6822. ForceZero(x, MAX_ECC_BYTES);
  6823. #ifdef WOLFSSL_SMALL_STACK
  6824. if (z1 != NULL)
  6825. XFREE(z1, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6826. if (x != NULL)
  6827. XFREE(x, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6828. if (K != NULL)
  6829. XFREE(K, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6830. if (V != NULL)
  6831. XFREE(V, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6832. if (h1 != NULL)
  6833. XFREE(h1, heap, DYNAMIC_TYPE_DIGEST);
  6834. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  6835. wc_MemZero_Check(x, MAX_ECC_BYTES);
  6836. #endif
  6837. return ret;
  6838. }
  6839. /* Sets the deterministic flag for 'k' generation with sign.
  6840. * returns 0 on success
  6841. */
  6842. int wc_ecc_set_deterministic(ecc_key* key, byte flag)
  6843. {
  6844. if (key == NULL) {
  6845. return BAD_FUNC_ARG;
  6846. }
  6847. key->deterministic = flag ? 1 : 0;
  6848. return 0;
  6849. }
  6850. #endif /* end sign_ex and deterministic sign */
  6851. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP)
  6852. int wc_ecc_sign_set_k(const byte* k, word32 klen, ecc_key* key)
  6853. {
  6854. int ret = MP_OKAY;
  6855. DECLARE_CURVE_SPECS(1);
  6856. if (k == NULL || klen == 0 || key == NULL) {
  6857. return BAD_FUNC_ARG;
  6858. }
  6859. ALLOC_CURVE_SPECS(1, ret);
  6860. if (ret == MP_OKAY) {
  6861. ret = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  6862. }
  6863. if (ret != 0) {
  6864. FREE_CURVE_SPECS();
  6865. return ret;
  6866. }
  6867. #ifndef WOLFSSL_NO_MALLOC
  6868. if (key->sign_k == NULL) {
  6869. key->sign_k = (mp_int*)XMALLOC(sizeof(mp_int), key->heap,
  6870. DYNAMIC_TYPE_ECC);
  6871. if (key->sign_k) {
  6872. ret = mp_init(key->sign_k);
  6873. }
  6874. else {
  6875. ret = MEMORY_E;
  6876. }
  6877. }
  6878. #endif
  6879. if (ret == 0) {
  6880. ret = mp_read_unsigned_bin(key->sign_k, k, klen);
  6881. }
  6882. if (ret == 0 && mp_cmp(key->sign_k, curve->order) != MP_LT) {
  6883. ret = MP_VAL;
  6884. }
  6885. #ifdef WOLFSSL_NO_MALLOC
  6886. if (ret == 0) {
  6887. key->sign_k_set = 1;
  6888. }
  6889. #endif
  6890. wc_ecc_curve_free(curve);
  6891. FREE_CURVE_SPECS();
  6892. return ret;
  6893. }
  6894. #endif /* WOLFSSL_ECDSA_SET_K || WOLFSSL_ECDSA_SET_K_ONE_LOOP */
  6895. #endif /* WOLFSSL_ATECC508A && WOLFSSL_CRYPTOCELL */
  6896. #endif /* !HAVE_ECC_SIGN */
  6897. #ifdef WOLFSSL_CUSTOM_CURVES
  6898. void wc_ecc_free_curve(const ecc_set_type* curve, void* heap)
  6899. {
  6900. #ifndef WOLFSSL_ECC_CURVE_STATIC
  6901. if (curve->prime != NULL)
  6902. XFREE((void*)curve->prime, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6903. if (curve->Af != NULL)
  6904. XFREE((void*)curve->Af, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6905. if (curve->Bf != NULL)
  6906. XFREE((void*)curve->Bf, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6907. if (curve->order != NULL)
  6908. XFREE((void*)curve->order, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6909. if (curve->Gx != NULL)
  6910. XFREE((void*)curve->Gx, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6911. if (curve->Gy != NULL)
  6912. XFREE((void*)curve->Gy, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6913. #endif
  6914. XFREE((void*)curve, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6915. (void)heap;
  6916. }
  6917. #endif /* WOLFSSL_CUSTOM_CURVES */
  6918. /**
  6919. Free an ECC key from memory
  6920. key The key you wish to free
  6921. */
  6922. WOLFSSL_ABI
  6923. int wc_ecc_free(ecc_key* key)
  6924. {
  6925. if (key == NULL) {
  6926. return 0;
  6927. }
  6928. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP)
  6929. #ifndef WOLFSSL_NO_MALLOC
  6930. if (key->sign_k != NULL)
  6931. #endif
  6932. {
  6933. mp_forcezero(key->sign_k);
  6934. mp_free(key->sign_k);
  6935. #ifndef WOLFSSL_NO_MALLOC
  6936. XFREE(key->sign_k, key->heap, DYNAMIC_TYPE_ECC);
  6937. #endif
  6938. }
  6939. #endif
  6940. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  6941. #ifdef WC_ASYNC_ENABLE_ECC
  6942. wolfAsync_DevCtxFree(&key->asyncDev, WOLFSSL_ASYNC_MARKER_ECC);
  6943. #endif
  6944. wc_ecc_free_async(key);
  6945. #endif
  6946. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  6947. /* free secure memory */
  6948. if ((key->blackKey != CAAM_BLACK_KEY_CCM &&
  6949. key->blackKey != CAAM_BLACK_KEY_ECB) && key->blackKey > 0) {
  6950. caamFreePart(key->partNum);
  6951. }
  6952. #endif
  6953. #ifdef WOLFSSL_SE050
  6954. se050_ecc_free_key(key);
  6955. #endif
  6956. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  6957. atmel_ecc_free(key->slot);
  6958. key->slot = ATECC_INVALID_SLOT;
  6959. #endif /* WOLFSSL_ATECC508A */
  6960. #ifdef WOLFSSL_KCAPI_ECC
  6961. KcapiEcc_Free(key);
  6962. #endif
  6963. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  6964. key->privKey = NULL;
  6965. ForceZero(key->keyRaw, sizeof(key->keyRaw));
  6966. ForceZero(&key->xSec, sizeof(key->xSec));
  6967. #endif
  6968. #ifdef WOLFSSL_MAXQ10XX_CRYPTO
  6969. wc_MAXQ10XX_EccFree(key);
  6970. #endif
  6971. mp_clear(key->pubkey.x);
  6972. mp_clear(key->pubkey.y);
  6973. mp_clear(key->pubkey.z);
  6974. #ifdef ALT_ECC_SIZE
  6975. if (key->k)
  6976. #endif
  6977. mp_forcezero(key->k);
  6978. #ifdef WOLFSSL_CUSTOM_CURVES
  6979. if (key->deallocSet && key->dp != NULL)
  6980. wc_ecc_free_curve(key->dp, key->heap);
  6981. #endif
  6982. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6983. wc_MemZero_Check(key, sizeof(ecc_key));
  6984. #endif
  6985. return 0;
  6986. }
  6987. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  6988. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SP_MATH) && \
  6989. !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  6990. /* Handles add failure cases:
  6991. *
  6992. * Before add:
  6993. * Case 1: A is infinity
  6994. * -> Copy B into result.
  6995. * Case 2: B is infinity
  6996. * -> Copy A into result.
  6997. * Case 3: x and z are the same in A and B (same x value in affine)
  6998. * Case 3a: y values the same - same point
  6999. * -> Double instead of add.
  7000. * Case 3b: y values different - negative of the other when points on curve
  7001. * -> Need to set result to infinity.
  7002. *
  7003. * After add:
  7004. * Case 1: A and B are the same point (maybe different z)
  7005. * (Result was: x == y == z == 0)
  7006. * -> Need to double instead.
  7007. *
  7008. * Case 2: A + B = <infinity> = 0.
  7009. * (Result was: z == 0, x and/or y not 0)
  7010. * -> Need to set result to infinity.
  7011. */
  7012. int ecc_projective_add_point_safe(ecc_point* A, ecc_point* B, ecc_point* R,
  7013. mp_int* a, mp_int* modulus, mp_digit mp, int* infinity)
  7014. {
  7015. int err;
  7016. if (mp_iszero(A->x) && mp_iszero(A->y)) {
  7017. /* A is infinity. */
  7018. err = wc_ecc_copy_point(B, R);
  7019. }
  7020. else if (mp_iszero(B->x) && mp_iszero(B->y)) {
  7021. /* B is infinity. */
  7022. err = wc_ecc_copy_point(A, R);
  7023. }
  7024. else if ((mp_cmp(A->x, B->x) == MP_EQ) && (mp_cmp(A->z, B->z) == MP_EQ)) {
  7025. /* x ordinattes the same. */
  7026. if (mp_cmp(A->y, B->y) == MP_EQ) {
  7027. /* A = B */
  7028. err = _ecc_projective_dbl_point(B, R, a, modulus, mp);
  7029. }
  7030. else {
  7031. /* A = -B */
  7032. err = mp_set(R->x, 0);
  7033. if (err == MP_OKAY)
  7034. err = mp_set(R->y, 0);
  7035. if (err == MP_OKAY)
  7036. err = mp_set(R->z, 1);
  7037. if ((err == MP_OKAY) && (infinity != NULL))
  7038. *infinity = 1;
  7039. }
  7040. }
  7041. else {
  7042. err = _ecc_projective_add_point(A, B, R, a, modulus, mp);
  7043. if ((err == MP_OKAY) && mp_iszero(R->z)) {
  7044. /* When all zero then should have done a double */
  7045. if (mp_iszero(R->x) && mp_iszero(R->y)) {
  7046. if (mp_iszero(B->z)) {
  7047. err = wc_ecc_copy_point(B, R);
  7048. if (err == MP_OKAY) {
  7049. err = mp_montgomery_calc_normalization(R->z, modulus);
  7050. }
  7051. if (err == MP_OKAY) {
  7052. err = _ecc_projective_dbl_point(R, R, a, modulus, mp);
  7053. }
  7054. }
  7055. else {
  7056. err = _ecc_projective_dbl_point(B, R, a, modulus, mp);
  7057. }
  7058. }
  7059. /* When only Z zero then result is infinity */
  7060. else {
  7061. err = mp_set(R->x, 0);
  7062. if (err == MP_OKAY)
  7063. err = mp_set(R->y, 0);
  7064. if (err == MP_OKAY)
  7065. err = mp_set(R->z, 1);
  7066. if ((err == MP_OKAY) && (infinity != NULL))
  7067. *infinity = 1;
  7068. }
  7069. }
  7070. }
  7071. return err;
  7072. }
  7073. /* Handles when P is the infinity point.
  7074. *
  7075. * Double infinity -> infinity.
  7076. * Otherwise do normal double - which can't lead to infinity as odd order.
  7077. */
  7078. int ecc_projective_dbl_point_safe(ecc_point *P, ecc_point *R, mp_int* a,
  7079. mp_int* modulus, mp_digit mp)
  7080. {
  7081. int err;
  7082. if (mp_iszero(P->x) && mp_iszero(P->y)) {
  7083. /* P is infinity. */
  7084. err = wc_ecc_copy_point(P, R);
  7085. }
  7086. else {
  7087. err = _ecc_projective_dbl_point(P, R, a, modulus, mp);
  7088. if ((err == MP_OKAY) && mp_iszero(R->z)) {
  7089. err = mp_set(R->x, 0);
  7090. if (err == MP_OKAY)
  7091. err = mp_set(R->y, 0);
  7092. if (err == MP_OKAY)
  7093. err = mp_set(R->z, 1);
  7094. }
  7095. }
  7096. return err;
  7097. }
  7098. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A
  7099. && !WOLFSSL_CRYPTOCELL && !WOLFSSL_SP_MATH */
  7100. #if !defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_ATECC508A) && \
  7101. !defined(WOLFSSL_ATECC608A) && !defined(WOLFSSL_CRYPTOCELL) && \
  7102. !defined(WOLFSSL_KCAPI_ECC) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  7103. #ifdef ECC_SHAMIR
  7104. static int ecc_mont_norm_points(ecc_point* A, ecc_point* Am, ecc_point* B,
  7105. ecc_point* Bm, mp_int* modulus, void* heap)
  7106. {
  7107. int err = MP_OKAY;
  7108. DECL_MP_INT_SIZE_DYN(mu, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  7109. (void)heap;
  7110. NEW_MP_INT_SIZE(mu, mp_bitsused(modulus), heap, DYNAMIC_TYPE_ECC);
  7111. #ifdef MP_INT_SIZE_CHECK_NULL
  7112. if (mu == NULL)
  7113. err = MEMORY_E;
  7114. #endif
  7115. if (err == MP_OKAY) {
  7116. err = INIT_MP_INT_SIZE(mu, mp_bitsused(modulus));
  7117. }
  7118. if (err == MP_OKAY) {
  7119. err = mp_montgomery_calc_normalization(mu, modulus);
  7120. if (err == MP_OKAY) {
  7121. /* copy ones ... */
  7122. err = mp_mulmod(A->x, mu, modulus, Am->x);
  7123. }
  7124. if (err == MP_OKAY)
  7125. err = mp_mulmod(A->y, mu, modulus, Am->y);
  7126. if (err == MP_OKAY)
  7127. err = mp_mulmod(A->z, mu, modulus, Am->z);
  7128. if (err == MP_OKAY)
  7129. err = mp_mulmod(B->x, mu, modulus, Bm->x);
  7130. if (err == MP_OKAY)
  7131. err = mp_mulmod(B->y, mu, modulus, Bm->y);
  7132. if (err == MP_OKAY)
  7133. err = mp_mulmod(B->z, mu, modulus, Bm->z);
  7134. /* done with mu */
  7135. mp_clear(mu);
  7136. }
  7137. FREE_MP_INT_SIZE(mu, heap, DYNAMIC_TYPE_ECC);
  7138. return err;
  7139. }
  7140. /** Computes kA*A + kB*B = C using Shamir's Trick
  7141. A First point to multiply
  7142. kA What to multiple A by
  7143. B Second point to multiply
  7144. kB What to multiple B by
  7145. C [out] Destination point (can overlap with A or B)
  7146. a ECC curve parameter a
  7147. modulus Modulus for curve
  7148. return MP_OKAY on success
  7149. */
  7150. #ifdef FP_ECC
  7151. static int normal_ecc_mul2add(ecc_point* A, mp_int* kA,
  7152. ecc_point* B, mp_int* kB,
  7153. ecc_point* C, mp_int* a, mp_int* modulus,
  7154. void* heap)
  7155. #else
  7156. int ecc_mul2add(ecc_point* A, mp_int* kA,
  7157. ecc_point* B, mp_int* kB,
  7158. ecc_point* C, mp_int* a, mp_int* modulus,
  7159. void* heap)
  7160. #endif
  7161. {
  7162. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7163. ecc_key *key = NULL;
  7164. #endif
  7165. #ifdef WOLFSSL_SMALL_STACK
  7166. ecc_point** precomp = NULL;
  7167. #else
  7168. ecc_point* precomp[SHAMIR_PRECOMP_SZ];
  7169. #ifdef WOLFSSL_NO_MALLOC
  7170. ecc_point lcl_precomp[SHAMIR_PRECOMP_SZ];
  7171. #endif
  7172. #endif
  7173. unsigned int bitbufA, bitbufB, lenA, lenB, len, nA, nB, nibble;
  7174. #ifdef WOLFSSL_NO_MALLOC
  7175. unsigned char tA[ECC_BUFSIZE];
  7176. unsigned char tB[ECC_BUFSIZE];
  7177. #else
  7178. unsigned char* tA = NULL;
  7179. unsigned char* tB = NULL;
  7180. #endif
  7181. int err = MP_OKAY, first, x, y;
  7182. mp_digit mp = 0;
  7183. /* argchks */
  7184. if (A == NULL || kA == NULL || B == NULL || kB == NULL || C == NULL ||
  7185. modulus == NULL) {
  7186. return ECC_BAD_ARG_E;
  7187. }
  7188. #ifndef WOLFSSL_NO_MALLOC
  7189. /* allocate memory */
  7190. tA = (unsigned char*)XMALLOC(ECC_BUFSIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7191. if (tA == NULL) {
  7192. return GEN_MEM_ERR;
  7193. }
  7194. tB = (unsigned char*)XMALLOC(ECC_BUFSIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7195. if (tB == NULL) {
  7196. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7197. return GEN_MEM_ERR;
  7198. }
  7199. #endif
  7200. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7201. key = (ecc_key *)XMALLOC(sizeof(*key), heap, DYNAMIC_TYPE_ECC_BUFFER);
  7202. if (key == NULL) {
  7203. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7204. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7205. return GEN_MEM_ERR;
  7206. }
  7207. #endif
  7208. #ifdef WOLFSSL_SMALL_STACK
  7209. precomp = (ecc_point**)XMALLOC(sizeof(ecc_point*) * SHAMIR_PRECOMP_SZ, heap,
  7210. DYNAMIC_TYPE_ECC_BUFFER);
  7211. if (precomp == NULL) {
  7212. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7213. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7214. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7215. XFREE(key, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7216. #endif
  7217. return GEN_MEM_ERR;
  7218. }
  7219. #endif
  7220. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7221. key->t1 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  7222. key->t2 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  7223. #ifdef ALT_ECC_SIZE
  7224. key->x = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  7225. key->y = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  7226. key->z = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  7227. #endif
  7228. if (key->t1 == NULL || key->t2 == NULL
  7229. #ifdef ALT_ECC_SIZE
  7230. || key->x == NULL || key->y == NULL || key->z == NULL
  7231. #endif
  7232. ) {
  7233. #ifdef ALT_ECC_SIZE
  7234. XFREE(key->z, heap, DYNAMIC_TYPE_ECC);
  7235. XFREE(key->y, heap, DYNAMIC_TYPE_ECC);
  7236. XFREE(key->x, heap, DYNAMIC_TYPE_ECC);
  7237. #endif
  7238. XFREE(key->t2, heap, DYNAMIC_TYPE_ECC);
  7239. XFREE(key->t1, heap, DYNAMIC_TYPE_ECC);
  7240. XFREE(precomp, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7241. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7242. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7243. XFREE(key, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7244. return MEMORY_E;
  7245. }
  7246. C->key = key;
  7247. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  7248. /* init variables */
  7249. XMEMSET(tA, 0, ECC_BUFSIZE);
  7250. XMEMSET(tB, 0, ECC_BUFSIZE);
  7251. #ifndef WOLFSSL_SMALL_STACK
  7252. XMEMSET(precomp, 0, sizeof(precomp));
  7253. #else
  7254. XMEMSET(precomp, 0, sizeof(ecc_point*) * SHAMIR_PRECOMP_SZ);
  7255. #endif
  7256. #ifdef WOLFSSL_CHECK_MEM_ZERO
  7257. wc_MemZero_Add("ecc_mul2add tA", tA, ECC_BUFSIZE);
  7258. wc_MemZero_Add("ecc_mul2add tB", tB, ECC_BUFSIZE);
  7259. #endif
  7260. /* get sizes */
  7261. lenA = (unsigned int)mp_unsigned_bin_size(kA);
  7262. lenB = (unsigned int)mp_unsigned_bin_size(kB);
  7263. len = MAX(lenA, lenB);
  7264. /* sanity check */
  7265. if ((lenA > ECC_BUFSIZE) || (lenB > ECC_BUFSIZE)) {
  7266. err = BAD_FUNC_ARG;
  7267. }
  7268. if (err == MP_OKAY) {
  7269. /* extract and justify kA */
  7270. err = mp_to_unsigned_bin(kA, (len - lenA) + tA);
  7271. /* extract and justify kB */
  7272. if (err == MP_OKAY)
  7273. err = mp_to_unsigned_bin(kB, (len - lenB) + tB);
  7274. /* allocate the table */
  7275. if (err == MP_OKAY) {
  7276. for (x = 0; x < SHAMIR_PRECOMP_SZ; x++) {
  7277. #ifdef WOLFSSL_NO_MALLOC
  7278. precomp[x] = &lcl_precomp[x];
  7279. #endif
  7280. err = wc_ecc_new_point_ex(&precomp[x], heap);
  7281. if (err != MP_OKAY)
  7282. break;
  7283. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7284. precomp[x]->key = key;
  7285. #endif
  7286. }
  7287. }
  7288. }
  7289. if (err == MP_OKAY)
  7290. /* init montgomery reduction */
  7291. err = mp_montgomery_setup(modulus, &mp);
  7292. if (err == MP_OKAY) {
  7293. err = ecc_mont_norm_points(A, precomp[1], B, precomp[1<<2], modulus, heap);
  7294. }
  7295. if (err == MP_OKAY) {
  7296. /* precomp [i,0](A + B) table */
  7297. err = ecc_projective_dbl_point_safe(precomp[1], precomp[2], a, modulus, mp);
  7298. }
  7299. if (err == MP_OKAY) {
  7300. err = ecc_projective_add_point_safe(precomp[1], precomp[2], precomp[3],
  7301. a, modulus, mp, NULL);
  7302. }
  7303. if (err == MP_OKAY) {
  7304. /* precomp [0,i](A + B) table */
  7305. err = ecc_projective_dbl_point_safe(precomp[4], precomp[8], a, modulus, mp);
  7306. }
  7307. if (err == MP_OKAY) {
  7308. err = ecc_projective_add_point_safe(precomp[4], precomp[8], precomp[12], a,
  7309. modulus, mp, NULL);
  7310. }
  7311. if (err == MP_OKAY) {
  7312. /* precomp [i,j](A + B) table (i != 0, j != 0) */
  7313. for (x = 1; x < 4; x++) {
  7314. for (y = 1; y < 4; y++) {
  7315. if (err == MP_OKAY) {
  7316. err = ecc_projective_add_point_safe(precomp[x], precomp[(y<<2)],
  7317. precomp[x+(y<<2)], a, modulus,
  7318. mp, NULL);
  7319. }
  7320. }
  7321. }
  7322. }
  7323. if (err == MP_OKAY) {
  7324. nibble = 3;
  7325. first = 1;
  7326. bitbufA = tA[0];
  7327. bitbufB = tB[0];
  7328. /* for every byte of the multiplicands */
  7329. for (x = 0; x < (int)len || nibble != 3; ) {
  7330. /* grab a nibble */
  7331. if (++nibble == 4) {
  7332. if (x == (int)len) break;
  7333. bitbufA = tA[x];
  7334. bitbufB = tB[x];
  7335. nibble = 0;
  7336. x++;
  7337. }
  7338. /* extract two bits from both, shift/update */
  7339. nA = (bitbufA >> 6) & 0x03;
  7340. nB = (bitbufB >> 6) & 0x03;
  7341. bitbufA = (bitbufA << 2) & 0xFF;
  7342. bitbufB = (bitbufB << 2) & 0xFF;
  7343. /* if both zero, if first, continue */
  7344. if ((nA == 0) && (nB == 0) && (first == 1)) {
  7345. continue;
  7346. }
  7347. /* double twice, only if this isn't the first */
  7348. if (first == 0) {
  7349. /* double twice */
  7350. if (err == MP_OKAY)
  7351. err = ecc_projective_dbl_point_safe(C, C, a, modulus, mp);
  7352. if (err == MP_OKAY)
  7353. err = ecc_projective_dbl_point_safe(C, C, a, modulus, mp);
  7354. else
  7355. break;
  7356. }
  7357. /* if not both zero */
  7358. if ((nA != 0) || (nB != 0)) {
  7359. unsigned int i = nA + (nB<<2);
  7360. if (first == 1) {
  7361. /* if first, copy from table */
  7362. first = 0;
  7363. if (err == MP_OKAY)
  7364. err = mp_copy(precomp[i]->x, C->x);
  7365. if (err == MP_OKAY)
  7366. err = mp_copy(precomp[i]->y, C->y);
  7367. if (err == MP_OKAY)
  7368. err = mp_copy(precomp[i]->z, C->z);
  7369. else
  7370. break;
  7371. } else {
  7372. /* if not first, add from table */
  7373. if (err == MP_OKAY)
  7374. err = ecc_projective_add_point_safe(C, precomp[i],
  7375. C, a, modulus, mp,
  7376. &first);
  7377. if (err != MP_OKAY)
  7378. break;
  7379. }
  7380. }
  7381. }
  7382. }
  7383. /* reduce to affine */
  7384. if (err == MP_OKAY)
  7385. err = ecc_map(C, modulus, mp);
  7386. /* clean up */
  7387. for (x = 0; x < SHAMIR_PRECOMP_SZ; x++) {
  7388. wc_ecc_del_point_ex(precomp[x], heap);
  7389. }
  7390. ForceZero(tA, ECC_BUFSIZE);
  7391. ForceZero(tB, ECC_BUFSIZE);
  7392. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7393. #ifdef ALT_ECC_SIZE
  7394. XFREE(key->z, heap, DYNAMIC_TYPE_ECC);
  7395. XFREE(key->y, heap, DYNAMIC_TYPE_ECC);
  7396. XFREE(key->x, heap, DYNAMIC_TYPE_ECC);
  7397. #endif
  7398. XFREE(key->t2, heap, DYNAMIC_TYPE_ECC);
  7399. XFREE(key->t1, heap, DYNAMIC_TYPE_ECC);
  7400. XFREE(key, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7401. C->key = NULL;
  7402. #endif
  7403. #ifdef WOLFSSL_SMALL_STACK
  7404. XFREE(precomp, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7405. #endif
  7406. #ifndef WOLFSSL_NO_MALLOC
  7407. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7408. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7409. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  7410. wc_MemZero_Check(tB, ECC_BUFSIZE);
  7411. wc_MemZero_Check(tA, ECC_BUFSIZE);
  7412. #endif
  7413. return err;
  7414. }
  7415. #endif /* ECC_SHAMIR */
  7416. #endif /* (!WOLFSSL_SP_MATH && !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A &&
  7417. * !WOLFSSL_CRYPTOCEL */
  7418. #ifdef HAVE_ECC_VERIFY
  7419. #ifndef NO_ASN
  7420. /* verify
  7421. *
  7422. * w = s^-1 mod n
  7423. * u1 = xw
  7424. * u2 = rw
  7425. * X = u1*G + u2*Q
  7426. * v = X_x1 mod n
  7427. * accept if v == r
  7428. */
  7429. /**
  7430. Verify an ECC signature
  7431. sig The signature to verify
  7432. siglen The length of the signature (octets)
  7433. hash The hash (message digest) that was signed
  7434. hashlen The length of the hash (octets)
  7435. res Result of signature, 1==valid, 0==invalid
  7436. key The corresponding public ECC key
  7437. return MP_OKAY if successful (even if the signature is not valid)
  7438. Caller should check the *res value to determine if the signature
  7439. is valid or invalid. Other negative values are returned on error.
  7440. */
  7441. WOLFSSL_ABI
  7442. int wc_ecc_verify_hash(const byte* sig, word32 siglen, const byte* hash,
  7443. word32 hashlen, int* res, ecc_key* key)
  7444. {
  7445. int err;
  7446. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  7447. mp_int *r = NULL, *s = NULL;
  7448. #else
  7449. DECL_MP_INT_SIZE_DYN(r, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  7450. DECL_MP_INT_SIZE_DYN(s, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  7451. #endif
  7452. #ifdef WOLFSSL_ASYNC_CRYPT
  7453. int isPrivateKeyOnly = 0;
  7454. #endif
  7455. if (sig == NULL || hash == NULL || res == NULL || key == NULL) {
  7456. return ECC_BAD_ARG_E;
  7457. }
  7458. #ifdef WOLF_CRYPTO_CB
  7459. #ifndef WOLF_CRYPTO_CB_FIND
  7460. if (key->devId != INVALID_DEVID)
  7461. #endif
  7462. {
  7463. err = wc_CryptoCb_EccVerify(sig, siglen, hash, hashlen, res, key);
  7464. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  7465. if (err != CRYPTOCB_UNAVAILABLE)
  7466. return err;
  7467. /* fall-through when unavailable */
  7468. #endif
  7469. #ifdef WOLF_CRYPTO_CB_ONLY_ECC
  7470. if (err == CRYPTOCB_UNAVAILABLE) {
  7471. err = NO_VALID_DEVID;
  7472. }
  7473. #endif
  7474. }
  7475. #endif
  7476. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  7477. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  7478. err = wc_ecc_alloc_async(key);
  7479. if (err != 0)
  7480. return err;
  7481. r = key->r;
  7482. s = key->s;
  7483. #else
  7484. NEW_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  7485. #ifdef MP_INT_SIZE_CHECK_NULL
  7486. if (r == NULL)
  7487. return MEMORY_E;
  7488. #endif
  7489. NEW_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  7490. #ifdef MP_INT_SIZE_CHECK_NULL
  7491. if (s == NULL) {
  7492. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  7493. return MEMORY_E;
  7494. }
  7495. #endif
  7496. err = INIT_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key));
  7497. if (err != 0) {
  7498. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  7499. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  7500. return err;
  7501. }
  7502. err = INIT_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key));
  7503. if (err != 0) {
  7504. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  7505. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  7506. return err;
  7507. }
  7508. #endif /* WOLFSSL_ASYNC_CRYPT */
  7509. switch (key->state) {
  7510. case ECC_STATE_NONE:
  7511. case ECC_STATE_VERIFY_DECODE:
  7512. key->state = ECC_STATE_VERIFY_DECODE;
  7513. /* default to invalid signature */
  7514. *res = 0;
  7515. /* Decode ASN.1 ECDSA signature. */
  7516. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  7517. /* Note, DecodeECC_DSA_Sig() calls mp_init() on r and s.
  7518. * If either of those don't allocate correctly, none of
  7519. * the rest of this function will execute, and everything
  7520. * gets cleaned up at the end. */
  7521. err = DecodeECC_DSA_Sig(sig, siglen, r, s);
  7522. #else
  7523. /* r and s are initialized. */
  7524. err = DecodeECC_DSA_Sig_Ex(sig, siglen, r, s, 0);
  7525. #endif
  7526. if (err < 0) {
  7527. break;
  7528. }
  7529. FALL_THROUGH;
  7530. case ECC_STATE_VERIFY_DO:
  7531. key->state = ECC_STATE_VERIFY_DO;
  7532. #ifdef WOLFSSL_ASYNC_CRYPT
  7533. if (key->type == ECC_PRIVATEKEY_ONLY) {
  7534. isPrivateKeyOnly = 1;
  7535. }
  7536. #endif
  7537. err = wc_ecc_verify_hash_ex(r, s, hash, hashlen, res, key);
  7538. #ifndef WOLFSSL_ASYNC_CRYPT
  7539. /* done with R/S */
  7540. mp_clear(r);
  7541. mp_clear(s);
  7542. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  7543. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  7544. #ifdef MP_INT_SIZE_CHECK_NULL
  7545. r = NULL;
  7546. s = NULL;
  7547. #endif
  7548. #endif
  7549. if (err < 0) {
  7550. break;
  7551. }
  7552. FALL_THROUGH;
  7553. case ECC_STATE_VERIFY_RES:
  7554. key->state = ECC_STATE_VERIFY_RES;
  7555. err = 0;
  7556. break;
  7557. default:
  7558. err = BAD_STATE_E;
  7559. }
  7560. #ifdef WOLFSSL_ASYNC_CRYPT
  7561. /* if async pending then return and skip done cleanup below */
  7562. if (err == WC_PENDING_E) {
  7563. if (!isPrivateKeyOnly) /* do not advance state if doing make pub key */
  7564. key->state++;
  7565. return err;
  7566. }
  7567. #endif
  7568. /* cleanup */
  7569. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  7570. wc_ecc_free_async(key);
  7571. #else
  7572. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  7573. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  7574. #endif
  7575. /* make sure required variables are reset */
  7576. wc_ecc_reset(key);
  7577. #else
  7578. (void)siglen;
  7579. (void)hashlen;
  7580. (void)s;
  7581. (void)r;
  7582. (void)err;
  7583. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  7584. return err;
  7585. }
  7586. #endif /* !NO_ASN */
  7587. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  7588. #if !defined(WOLFSSL_STM32_PKA) && !defined(WOLFSSL_PSOC6_CRYPTO) && \
  7589. !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  7590. static int wc_ecc_check_r_s_range(ecc_key* key, mp_int* r, mp_int* s)
  7591. {
  7592. int err = MP_OKAY;
  7593. DECLARE_CURVE_SPECS(1);
  7594. ALLOC_CURVE_SPECS(1, err);
  7595. if (err == MP_OKAY) {
  7596. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  7597. }
  7598. if (err != 0) {
  7599. FREE_CURVE_SPECS();
  7600. return err;
  7601. }
  7602. if (mp_iszero(r) || mp_iszero(s)) {
  7603. err = MP_ZERO_E;
  7604. }
  7605. if ((err == 0) && (mp_cmp(r, curve->order) != MP_LT)) {
  7606. err = MP_VAL;
  7607. }
  7608. if ((err == 0) && (mp_cmp(s, curve->order) != MP_LT)) {
  7609. err = MP_VAL;
  7610. }
  7611. wc_ecc_curve_free(curve);
  7612. FREE_CURVE_SPECS();
  7613. return err;
  7614. }
  7615. #endif /* !WOLFSSL_STM32_PKA && !WOLFSSL_PSOC6_CRYPTO */
  7616. #ifdef HAVE_ECC_VERIFY_HELPER
  7617. static int ecc_verify_hash_sp(mp_int *r, mp_int *s, const byte* hash,
  7618. word32 hashlen, int* res, ecc_key* key)
  7619. {
  7620. (void)r;
  7621. (void)s;
  7622. (void)hash;
  7623. (void)hashlen;
  7624. (void)res;
  7625. (void)key;
  7626. #if defined(WOLFSSL_DSP) && !defined(FREESCALE_LTC_ECC)
  7627. if (key->handle != -1) {
  7628. return sp_dsp_ecc_verify_256(key->handle, hash, hashlen, key->pubkey.x,
  7629. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7630. }
  7631. if (wolfSSL_GetHandleCbSet() == 1) {
  7632. return sp_dsp_ecc_verify_256(0, hash, hashlen, key->pubkey.x,
  7633. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7634. }
  7635. #endif
  7636. #if defined(WOLFSSL_SP_MATH) && !defined(FREESCALE_LTC_ECC)
  7637. if (key->idx == ECC_CUSTOM_IDX || (1
  7638. #ifndef WOLFSSL_SP_NO_256
  7639. && ecc_sets[key->idx].id != ECC_SECP256R1
  7640. #endif
  7641. #ifdef WOLFSSL_SP_SM2
  7642. && ecc_sets[key->idx].id != ECC_SM2P256V1
  7643. #endif
  7644. #ifdef WOLFSSL_SP_384
  7645. && ecc_sets[key->idx].id != ECC_SECP384R1
  7646. #endif
  7647. #ifdef WOLFSSL_SP_521
  7648. && ecc_sets[key->idx].id != ECC_SECP521R1
  7649. #endif
  7650. )) {
  7651. return WC_KEY_SIZE_E;
  7652. }
  7653. #endif
  7654. #if defined(WOLFSSL_HAVE_SP_ECC)
  7655. if (key->idx != ECC_CUSTOM_IDX) {
  7656. #if defined(WC_ECC_NONBLOCK) && defined(WC_ECC_NONBLOCK_ONLY)
  7657. /* perform blocking call to non-blocking function */
  7658. ecc_nb_ctx_t nb_ctx;
  7659. int err;
  7660. XMEMSET(&nb_ctx, 0, sizeof(nb_ctx));
  7661. err = NOT_COMPILED_IN; /* set default error */
  7662. #endif
  7663. #ifndef WOLFSSL_SP_NO_256
  7664. if (ecc_sets[key->idx].id == ECC_SECP256R1) {
  7665. #ifdef WC_ECC_NONBLOCK
  7666. if (key->nb_ctx) {
  7667. return sp_ecc_verify_256_nb(&key->nb_ctx->sp_ctx, hash, hashlen,
  7668. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7669. key->heap);
  7670. }
  7671. #ifdef WC_ECC_NONBLOCK_ONLY
  7672. do { /* perform blocking call to non-blocking function */
  7673. err = sp_ecc_verify_256_nb(&nb_ctx.sp_ctx, hash, hashlen,
  7674. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7675. key->heap);
  7676. } while (err == FP_WOULDBLOCK);
  7677. return err;
  7678. #endif
  7679. #endif /* WC_ECC_NONBLOCK */
  7680. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  7681. {
  7682. int ret;
  7683. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  7684. ret = sp_ecc_verify_256(hash, hashlen, key->pubkey.x,
  7685. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7686. RESTORE_VECTOR_REGISTERS();
  7687. return ret;
  7688. }
  7689. #endif
  7690. }
  7691. #endif
  7692. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  7693. if (ecc_sets[key->idx].id == ECC_SM2P256V1) {
  7694. #if defined(FP_ECC_CONTROL) && !defined(WOLFSSL_DSP_BUILD)
  7695. return sp_ecc_cache_verify_sm2_256(hash, hashlen, key->pubkey.x,
  7696. key->pubkey.y, key->pubkey.z, r, s, res,
  7697. sp_ecc_get_cache_entry_256(&(key->pubkey), ECC_SM2P256V1,
  7698. key->fpIdx, key->fpBuild, key->heap),
  7699. key->heap);
  7700. #endif
  7701. #if !defined(FP_ECC_CONTROL)
  7702. return sp_ecc_verify_sm2_256(hash, hashlen, key->pubkey.x,
  7703. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7704. #endif
  7705. }
  7706. #endif
  7707. #ifdef WOLFSSL_SP_384
  7708. if (ecc_sets[key->idx].id == ECC_SECP384R1) {
  7709. #ifdef WC_ECC_NONBLOCK
  7710. if (key->nb_ctx) {
  7711. return sp_ecc_verify_384_nb(&key->nb_ctx->sp_ctx, hash, hashlen,
  7712. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7713. key->heap);
  7714. }
  7715. #ifdef WC_ECC_NONBLOCK_ONLY
  7716. do { /* perform blocking call to non-blocking function */
  7717. err = sp_ecc_verify_384_nb(&nb_ctx.sp_ctx, hash, hashlen,
  7718. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7719. key->heap);
  7720. } while (err == FP_WOULDBLOCK);
  7721. return err;
  7722. #endif
  7723. #endif /* WC_ECC_NONBLOCK */
  7724. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  7725. {
  7726. int ret;
  7727. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  7728. ret = sp_ecc_verify_384(hash, hashlen, key->pubkey.x,
  7729. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7730. RESTORE_VECTOR_REGISTERS();
  7731. return ret;
  7732. }
  7733. #endif
  7734. }
  7735. #endif
  7736. #ifdef WOLFSSL_SP_521
  7737. if (ecc_sets[key->idx].id == ECC_SECP521R1) {
  7738. #ifdef WC_ECC_NONBLOCK
  7739. if (key->nb_ctx) {
  7740. return sp_ecc_verify_521_nb(&key->nb_ctx->sp_ctx, hash, hashlen,
  7741. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7742. key->heap);
  7743. }
  7744. #ifdef WC_ECC_NONBLOCK_ONLY
  7745. do { /* perform blocking call to non-blocking function */
  7746. err = sp_ecc_verify_521_nb(&nb_ctx.sp_ctx, hash, hashlen,
  7747. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7748. key->heap);
  7749. } while (err == FP_WOULDBLOCK);
  7750. return err;
  7751. #endif
  7752. #endif /* WC_ECC_NONBLOCK */
  7753. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  7754. {
  7755. int ret;
  7756. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  7757. ret = sp_ecc_verify_521(hash, hashlen, key->pubkey.x,
  7758. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7759. RESTORE_VECTOR_REGISTERS();
  7760. return ret;
  7761. }
  7762. #endif
  7763. }
  7764. #endif
  7765. }
  7766. #endif
  7767. return NOT_COMPILED_IN;
  7768. }
  7769. #if !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC)
  7770. static int ecc_verify_hash(mp_int *r, mp_int *s, const byte* hash,
  7771. word32 hashlen, int* res, ecc_key* key, ecc_curve_spec* curve)
  7772. {
  7773. int err;
  7774. ecc_point* mG = NULL;
  7775. ecc_point* mQ = NULL;
  7776. #ifdef WOLFSSL_NO_MALLOC
  7777. ecc_point lcl_mG;
  7778. ecc_point lcl_mQ;
  7779. #endif
  7780. DECL_MP_INT_SIZE_DYN(w, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  7781. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  7782. DECL_MP_INT_SIZE_DYN(e_lcl, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  7783. #endif
  7784. mp_int* e;
  7785. mp_int* v = NULL; /* Will be w. */
  7786. mp_int* u1 = NULL; /* Will be e. */
  7787. mp_int* u2 = NULL; /* Will be w. */
  7788. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V)
  7789. err = wc_ecc_alloc_mpint(key, &key->e);
  7790. if (err != 0) {
  7791. return err;
  7792. }
  7793. e = key->e;
  7794. err = mp_init(e);
  7795. #else
  7796. NEW_MP_INT_SIZE(e_lcl, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  7797. #ifdef MP_INT_SIZE_CHECK_NULL
  7798. if (e_lcl == NULL) {
  7799. return MEMORY_E;
  7800. }
  7801. #endif
  7802. e = e_lcl;
  7803. err = INIT_MP_INT_SIZE(e, ECC_KEY_MAX_BITS(key));
  7804. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_CAVIUM_V */
  7805. if (err != MP_OKAY) {
  7806. #ifdef WOLFSSL_SMALL_STACK
  7807. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  7808. XFREE(e_lcl, key->heap, DYNAMIC_TYPE_ECC);
  7809. #endif
  7810. #endif
  7811. return MEMORY_E;
  7812. }
  7813. /* read hash */
  7814. if (err == MP_OKAY) {
  7815. /* we may need to truncate if hash is longer than key size */
  7816. unsigned int orderBits = (unsigned int)mp_count_bits(curve->order);
  7817. /* truncate down to byte size, may be all that's needed */
  7818. if ( (WOLFSSL_BIT_SIZE * hashlen) > orderBits)
  7819. hashlen = (orderBits + WOLFSSL_BIT_SIZE - 1) / WOLFSSL_BIT_SIZE;
  7820. err = mp_read_unsigned_bin(e, hash, hashlen);
  7821. /* may still need bit truncation too */
  7822. if (err == MP_OKAY && (WOLFSSL_BIT_SIZE * hashlen) > orderBits)
  7823. mp_rshb(e, (int)(WOLFSSL_BIT_SIZE - (orderBits & 0x7)));
  7824. }
  7825. /* check for async hardware acceleration */
  7826. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  7827. if (err == MP_OKAY && key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  7828. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  7829. #ifdef HAVE_CAVIUM_V
  7830. if (NitroxEccIsCurveSupported(key))
  7831. #endif
  7832. {
  7833. word32 keySz = (word32)key->dp->size;
  7834. err = wc_mp_to_bigint_sz(e, &e->raw, keySz);
  7835. if (err == MP_OKAY)
  7836. err = wc_mp_to_bigint_sz(key->pubkey.x, &key->pubkey.x->raw, keySz);
  7837. if (err == MP_OKAY)
  7838. err = wc_mp_to_bigint_sz(key->pubkey.y, &key->pubkey.y->raw, keySz);
  7839. if (err == MP_OKAY)
  7840. #ifdef HAVE_CAVIUM_V
  7841. err = NitroxEcdsaVerify(key, &e->raw, &key->pubkey.x->raw,
  7842. &key->pubkey.y->raw, &r->raw, &s->raw,
  7843. &curve->prime->raw, &curve->order->raw, res);
  7844. #else
  7845. err = IntelQaEcdsaVerify(&key->asyncDev, &e->raw, &key->pubkey.x->raw,
  7846. &key->pubkey.y->raw, &r->raw, &s->raw, &curve->Af->raw,
  7847. &curve->Bf->raw, &curve->prime->raw, &curve->order->raw,
  7848. &curve->Gx->raw, &curve->Gy->raw, res);
  7849. #endif
  7850. #ifndef HAVE_CAVIUM_V
  7851. mp_clear(e);
  7852. #endif
  7853. return err;
  7854. }
  7855. #endif /* HAVE_CAVIUM_V || HAVE_INTEL_QA */
  7856. }
  7857. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  7858. NEW_MP_INT_SIZE(w, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  7859. #ifdef MP_INT_SIZE_CHECK_NULL
  7860. if (w == NULL) {
  7861. err = MEMORY_E;
  7862. }
  7863. #endif
  7864. if (err == MP_OKAY) {
  7865. u1 = e;
  7866. u2 = w;
  7867. v = w;
  7868. }
  7869. if (err == MP_OKAY) {
  7870. err = INIT_MP_INT_SIZE(w, ECC_KEY_MAX_BITS(key));
  7871. }
  7872. /* allocate points */
  7873. if (err == MP_OKAY) {
  7874. #ifdef WOLFSSL_NO_MALLOC
  7875. mG = &lcl_mG;
  7876. #endif
  7877. err = wc_ecc_new_point_ex(&mG, key->heap);
  7878. }
  7879. if (err == MP_OKAY) {
  7880. #ifdef WOLFSSL_NO_MALLOC
  7881. mQ = &lcl_mQ;
  7882. #endif
  7883. err = wc_ecc_new_point_ex(&mQ, key->heap);
  7884. }
  7885. /* w = s^-1 mod n */
  7886. if (err == MP_OKAY)
  7887. err = mp_invmod(s, curve->order, w);
  7888. /* u1 = ew */
  7889. if (err == MP_OKAY)
  7890. err = mp_mulmod(e, w, curve->order, u1);
  7891. /* u2 = rw */
  7892. if (err == MP_OKAY)
  7893. err = mp_mulmod(r, w, curve->order, u2);
  7894. /* find mG and mQ */
  7895. if (err == MP_OKAY)
  7896. err = mp_copy(curve->Gx, mG->x);
  7897. if (err == MP_OKAY)
  7898. err = mp_copy(curve->Gy, mG->y);
  7899. if (err == MP_OKAY)
  7900. err = mp_set(mG->z, 1);
  7901. if (err == MP_OKAY)
  7902. err = mp_copy(key->pubkey.x, mQ->x);
  7903. if (err == MP_OKAY)
  7904. err = mp_copy(key->pubkey.y, mQ->y);
  7905. if (err == MP_OKAY)
  7906. err = mp_copy(key->pubkey.z, mQ->z);
  7907. #if defined(FREESCALE_LTC_ECC)
  7908. /* use PKHA to compute u1*mG + u2*mQ */
  7909. if (err == MP_OKAY)
  7910. err = wc_ecc_mulmod_ex(u1, mG, mG, curve->Af, curve->prime, 0, key->heap);
  7911. if (err == MP_OKAY)
  7912. err = wc_ecc_mulmod_ex(u2, mQ, mQ, curve->Af, curve->prime, 0, key->heap);
  7913. if (err == MP_OKAY)
  7914. err = wc_ecc_point_add(mG, mQ, mG, curve->prime);
  7915. #else
  7916. #ifndef ECC_SHAMIR
  7917. if (err == MP_OKAY)
  7918. {
  7919. mp_digit mp = 0;
  7920. if (!mp_iszero((MP_INT_SIZE*)u1)) {
  7921. /* compute u1*mG + u2*mQ = mG */
  7922. err = wc_ecc_mulmod_ex(u1, mG, mG, curve->Af, curve->prime, 0,
  7923. key->heap);
  7924. if (err == MP_OKAY) {
  7925. err = wc_ecc_mulmod_ex(u2, mQ, mQ, curve->Af, curve->prime, 0,
  7926. key->heap);
  7927. }
  7928. /* find the montgomery mp */
  7929. if (err == MP_OKAY)
  7930. err = mp_montgomery_setup(curve->prime, &mp);
  7931. /* add them */
  7932. if (err == MP_OKAY)
  7933. err = ecc_projective_add_point_safe(mQ, mG, mG, curve->Af,
  7934. curve->prime, mp, NULL);
  7935. }
  7936. else {
  7937. /* compute 0*mG + u2*mQ = mG */
  7938. err = wc_ecc_mulmod_ex(u2, mQ, mG, curve->Af, curve->prime, 0,
  7939. key->heap);
  7940. /* find the montgomery mp */
  7941. if (err == MP_OKAY)
  7942. err = mp_montgomery_setup(curve->prime, &mp);
  7943. }
  7944. /* reduce */
  7945. if (err == MP_OKAY)
  7946. err = ecc_map(mG, curve->prime, mp);
  7947. }
  7948. #else
  7949. /* use Shamir's trick to compute u1*mG + u2*mQ using half the doubles */
  7950. if (err == MP_OKAY) {
  7951. err = ecc_mul2add(mG, u1, mQ, u2, mG, curve->Af, curve->prime,
  7952. key->heap);
  7953. }
  7954. #endif /* ECC_SHAMIR */
  7955. #endif /* FREESCALE_LTC_ECC */
  7956. /* v = X_x1 mod n */
  7957. if (err == MP_OKAY)
  7958. err = mp_mod(mG->x, curve->order, v);
  7959. /* does v == r */
  7960. if (err == MP_OKAY) {
  7961. if (mp_cmp(v, r) == MP_EQ)
  7962. *res = 1;
  7963. }
  7964. /* cleanup */
  7965. wc_ecc_del_point_ex(mG, key->heap);
  7966. wc_ecc_del_point_ex(mQ, key->heap);
  7967. mp_clear(e);
  7968. mp_clear(w);
  7969. FREE_MP_INT_SIZE(w, key->heap, DYNAMIC_TYPE_ECC);
  7970. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  7971. FREE_MP_INT_SIZE(e_lcl, key->heap, DYNAMIC_TYPE_ECC);
  7972. #endif
  7973. return err;
  7974. }
  7975. #endif /* !WOLFSSL_SP_MATH || FREESCALE_LTC_ECC */
  7976. #endif /* HAVE_ECC_VERIFY_HELPER */
  7977. /**
  7978. Verify an ECC signature
  7979. r The signature R component to verify
  7980. s The signature S component to verify
  7981. hash The hash (message digest) that was signed
  7982. hashlen The length of the hash (octets)
  7983. res Result of signature, 1==valid, 0==invalid
  7984. key The corresponding public ECC key
  7985. return MP_OKAY if successful (even if the signature is not valid)
  7986. Caller should check the *res value to determine if the signature
  7987. is valid or invalid. Other negative values are returned on error.
  7988. */
  7989. int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
  7990. word32 hashlen, int* res, ecc_key* key)
  7991. {
  7992. #if defined(WOLFSSL_STM32_PKA)
  7993. return stm32_ecc_verify_hash_ex(r, s, hash, hashlen, res, key);
  7994. #elif defined(WOLFSSL_PSOC6_CRYPTO)
  7995. return psoc6_ecc_verify_hash_ex(r, s, hash, hashlen, res, key);
  7996. #else
  7997. int err;
  7998. word32 keySz = 0;
  7999. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  8000. byte sigRS[ATECC_KEY_SIZE*2];
  8001. #elif defined(WOLFSSL_CRYPTOCELL)
  8002. byte sigRS[ECC_MAX_CRYPTO_HW_SIZE*2];
  8003. CRYS_ECDSA_VerifyUserContext_t sigCtxTemp;
  8004. word32 msgLenInBytes = hashlen;
  8005. CRYS_ECPKI_HASH_OpMode_t hash_mode;
  8006. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  8007. byte sigRS[ECC_MAX_CRYPTO_HW_SIZE * 2];
  8008. #elif defined(WOLFSSL_KCAPI_ECC)
  8009. byte sigRS[MAX_ECC_BYTES*2];
  8010. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  8011. byte sigRS[ECC_MAX_CRYPTO_HW_SIZE * 2];
  8012. byte hashcopy[ECC_MAX_CRYPTO_HW_SIZE] = {0};
  8013. #else
  8014. int curveLoaded = 0;
  8015. DECLARE_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  8016. #endif
  8017. if (r == NULL || s == NULL || hash == NULL || res == NULL || key == NULL)
  8018. return ECC_BAD_ARG_E;
  8019. /* default to invalid signature */
  8020. *res = 0;
  8021. /* is the IDX valid ? */
  8022. if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) {
  8023. return ECC_BAD_ARG_E;
  8024. }
  8025. err = wc_ecc_check_r_s_range(key, r, s);
  8026. if (err != MP_OKAY) {
  8027. return err;
  8028. }
  8029. keySz = (word32)key->dp->size;
  8030. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  8031. defined(WOLFSSL_ASYNC_CRYPT_SW)
  8032. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  8033. if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_VERIFY)) {
  8034. WC_ASYNC_SW* sw = &key->asyncDev.sw;
  8035. sw->eccVerify.r = r;
  8036. sw->eccVerify.s = s;
  8037. sw->eccVerify.hash = hash;
  8038. sw->eccVerify.hashlen = hashlen;
  8039. sw->eccVerify.stat = res;
  8040. sw->eccVerify.key = key;
  8041. return WC_PENDING_E;
  8042. }
  8043. }
  8044. #endif
  8045. #ifndef HAVE_ECC_VERIFY_HELPER
  8046. #ifndef WOLFSSL_SE050
  8047. /* Extract R and S with front zero padding (if required),
  8048. * SE050 does this in port layer */
  8049. XMEMSET(sigRS, 0, sizeof(sigRS));
  8050. err = mp_to_unsigned_bin(r, sigRS +
  8051. (keySz - mp_unsigned_bin_size(r)));
  8052. if (err != MP_OKAY) {
  8053. return err;
  8054. }
  8055. err = mp_to_unsigned_bin(s, sigRS + keySz +
  8056. (keySz - mp_unsigned_bin_size(s)));
  8057. if (err != MP_OKAY) {
  8058. return err;
  8059. }
  8060. #endif /* WOLFSSL_SE050 */
  8061. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  8062. err = atmel_ecc_verify(hash, sigRS, key->pubkey_raw, res);
  8063. if (err != 0) {
  8064. return err;
  8065. }
  8066. (void)hashlen;
  8067. #elif defined(WOLFSSL_CRYPTOCELL)
  8068. /* truncate if hash is longer than key size */
  8069. if (msgLenInBytes > keySz) {
  8070. msgLenInBytes = keySz;
  8071. }
  8072. hash_mode = cc310_hashModeECC(msgLenInBytes);
  8073. if (hash_mode == CRYS_ECPKI_HASH_OpModeLast) {
  8074. /* hash_mode = */ cc310_hashModeECC(keySz);
  8075. hash_mode = CRYS_ECPKI_HASH_SHA256_mode;
  8076. }
  8077. /* verify the signature using the public key */
  8078. err = CRYS_ECDSA_Verify(&sigCtxTemp,
  8079. &key->ctx.pubKey,
  8080. hash_mode,
  8081. &sigRS[0],
  8082. keySz*2,
  8083. (byte*)hash,
  8084. msgLenInBytes);
  8085. if (err == CRYS_ECDSA_VERIFY_INCONSISTENT_VERIFY_ERROR) {
  8086. /* signature verification reported invalid signature. */
  8087. *res = 0; /* Redundant, added for code clarity */
  8088. err = MP_OKAY;
  8089. }
  8090. else if (err != SA_SILIB_RET_OK) {
  8091. WOLFSSL_MSG("CRYS_ECDSA_Verify failed");
  8092. return err;
  8093. }
  8094. else {
  8095. /* valid signature. */
  8096. *res = 1;
  8097. err = MP_OKAY;
  8098. }
  8099. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  8100. err = silabs_ecc_verify_hash(&sigRS[0], keySz * 2,
  8101. hash, hashlen,
  8102. res, key);
  8103. #elif defined(WOLFSSL_KCAPI_ECC)
  8104. err = KcapiEcc_Verify(key, hash, hashlen, sigRS, keySz * 2);
  8105. if (err == 0) {
  8106. *res = 1;
  8107. }
  8108. #elif defined(WOLFSSL_SE050)
  8109. err = se050_ecc_verify_hash_ex(hash, hashlen, r, s, key, res);
  8110. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  8111. if (hashlen > sizeof(hashcopy))
  8112. return ECC_BAD_ARG_E;
  8113. buf_reverse(hashcopy, hash, (hashlen < keySz) ? hashlen : keySz);
  8114. mp_reverse(sigRS, keySz);
  8115. mp_reverse(sigRS + keySz, keySz);
  8116. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(hashcopy), keySz);
  8117. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->keyRaw), keySz * 2);
  8118. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(sigRS), keySz * 2);
  8119. err = XSecure_EllipticVerifySign(&(key->xSec.cinst),
  8120. xil_curve_type[key->dp->id],
  8121. XIL_CAST_U64(hashcopy), keySz,
  8122. XIL_CAST_U64(key->keyRaw),
  8123. XIL_CAST_U64(sigRS));
  8124. if (err != XST_SUCCESS) {
  8125. WOLFSSL_XIL_ERROR("Verify ECC signature failed", err);
  8126. err = WC_HW_E;
  8127. } else {
  8128. *res = 1;
  8129. }
  8130. #endif
  8131. #else
  8132. /* checking if private key with no public part */
  8133. if (key->type == ECC_PRIVATEKEY_ONLY) {
  8134. WOLFSSL_MSG("Verify called with private key, generating public part");
  8135. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  8136. if (err != MP_OKAY) {
  8137. return err;
  8138. }
  8139. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  8140. if (err != MP_OKAY) {
  8141. FREE_CURVE_SPECS();
  8142. return err;
  8143. }
  8144. err = ecc_make_pub_ex(key, curve, NULL, NULL);
  8145. if (err != MP_OKAY) {
  8146. WOLFSSL_MSG("Unable to extract public key");
  8147. wc_ecc_curve_free(curve);
  8148. FREE_CURVE_SPECS();
  8149. return err;
  8150. }
  8151. curveLoaded = 1;
  8152. }
  8153. err = ecc_verify_hash_sp(r, s, hash, hashlen, res, key);
  8154. if (err != NOT_COMPILED_IN) {
  8155. if (curveLoaded) {
  8156. wc_ecc_curve_free(curve);
  8157. FREE_CURVE_SPECS();
  8158. }
  8159. return err;
  8160. }
  8161. #if !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC)
  8162. if (!curveLoaded) {
  8163. err = 0; /* potential for NOT_COMPILED_IN error from SP attempt */
  8164. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  8165. if (err != 0) {
  8166. return err;
  8167. }
  8168. /* read in the specs for this curve */
  8169. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  8170. if (err != 0) {
  8171. FREE_CURVE_SPECS();
  8172. return err;
  8173. }
  8174. }
  8175. err = ecc_verify_hash(r, s, hash, hashlen, res, key, curve);
  8176. #endif /* !WOLFSSL_SP_MATH || FREESCALE_LTC_ECC */
  8177. (void)curveLoaded;
  8178. wc_ecc_curve_free(curve);
  8179. FREE_CURVE_SPECS();
  8180. #endif /* HAVE_ECC_VERIFY_HELPER */
  8181. (void)keySz;
  8182. (void)hashlen;
  8183. return err;
  8184. #endif /* WOLFSSL_STM32_PKA */
  8185. }
  8186. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  8187. #endif /* HAVE_ECC_VERIFY */
  8188. #ifdef HAVE_ECC_KEY_IMPORT
  8189. /* import point from der
  8190. * if shortKeySize != 0 then keysize is always (inLen-1)>>1 */
  8191. int wc_ecc_import_point_der_ex(const byte* in, word32 inLen,
  8192. const int curve_idx, ecc_point* point,
  8193. int shortKeySize)
  8194. {
  8195. int err = 0;
  8196. #ifdef HAVE_COMP_KEY
  8197. int compressed = 0;
  8198. #endif
  8199. int keysize;
  8200. byte pointType;
  8201. #ifndef HAVE_COMP_KEY
  8202. (void)shortKeySize;
  8203. #endif
  8204. if (in == NULL || point == NULL || (curve_idx < 0) ||
  8205. (wc_ecc_is_valid_idx(curve_idx) == 0))
  8206. return ECC_BAD_ARG_E;
  8207. /* must be odd */
  8208. if ((inLen & 1) == 0) {
  8209. return ECC_BAD_ARG_E;
  8210. }
  8211. /* clear if previously allocated */
  8212. mp_clear(point->x);
  8213. mp_clear(point->y);
  8214. mp_clear(point->z);
  8215. /* init point */
  8216. #ifdef ALT_ECC_SIZE
  8217. point->x = (mp_int*)&point->xyz[0];
  8218. point->y = (mp_int*)&point->xyz[1];
  8219. point->z = (mp_int*)&point->xyz[2];
  8220. alt_fp_init(point->x);
  8221. alt_fp_init(point->y);
  8222. alt_fp_init(point->z);
  8223. #else
  8224. err = mp_init_multi(point->x, point->y, point->z, NULL, NULL, NULL);
  8225. #endif
  8226. if (err != MP_OKAY)
  8227. return MEMORY_E;
  8228. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  8229. /* check for point type (4, 2, or 3) */
  8230. pointType = in[0];
  8231. if (pointType != ECC_POINT_UNCOMP && pointType != ECC_POINT_COMP_EVEN &&
  8232. pointType != ECC_POINT_COMP_ODD) {
  8233. err = ASN_PARSE_E;
  8234. }
  8235. if (pointType == ECC_POINT_COMP_EVEN || pointType == ECC_POINT_COMP_ODD) {
  8236. #ifdef HAVE_COMP_KEY
  8237. compressed = 1;
  8238. #else
  8239. err = NOT_COMPILED_IN;
  8240. #endif
  8241. }
  8242. /* adjust to skip first byte */
  8243. inLen -= 1;
  8244. in += 1;
  8245. /* calculate key size based on inLen / 2 if uncompressed or shortKeySize
  8246. * is true */
  8247. #ifdef HAVE_COMP_KEY
  8248. keysize = (int)((compressed && !shortKeySize) ? inLen : inLen>>1);
  8249. #else
  8250. keysize = (int)(inLen>>1);
  8251. #endif
  8252. /* read data */
  8253. if (err == MP_OKAY)
  8254. err = mp_read_unsigned_bin(point->x, in, (word32)keysize);
  8255. #ifdef HAVE_COMP_KEY
  8256. if (err == MP_OKAY && compressed == 1) { /* build y */
  8257. #if defined(WOLFSSL_HAVE_SP_ECC)
  8258. #ifndef WOLFSSL_SP_NO_256
  8259. if (curve_idx != ECC_CUSTOM_IDX &&
  8260. ecc_sets[curve_idx].id == ECC_SECP256R1) {
  8261. err = sp_ecc_uncompress_256(point->x, pointType, point->y);
  8262. }
  8263. else
  8264. #endif
  8265. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  8266. if (curve_idx != ECC_CUSTOM_IDX &&
  8267. ecc_sets[curve_idx].id == ECC_SM2P256V1) {
  8268. sp_ecc_uncompress_sm2_256(point->x, pointType, point->y);
  8269. }
  8270. else
  8271. #endif
  8272. #ifdef WOLFSSL_SP_384
  8273. if (curve_idx != ECC_CUSTOM_IDX &&
  8274. ecc_sets[curve_idx].id == ECC_SECP384R1) {
  8275. err = sp_ecc_uncompress_384(point->x, pointType, point->y);
  8276. }
  8277. else
  8278. #endif
  8279. #ifdef WOLFSSL_SP_521
  8280. if (curve_idx != ECC_CUSTOM_IDX &&
  8281. ecc_sets[curve_idx].id == ECC_SECP521R1) {
  8282. err = sp_ecc_uncompress_521(point->x, pointType, point->y);
  8283. }
  8284. else
  8285. #endif
  8286. #endif
  8287. #if !defined(WOLFSSL_SP_MATH)
  8288. {
  8289. int did_init = 0;
  8290. #ifdef WOLFSSL_SMALL_STACK
  8291. mp_int* t1 = NULL;
  8292. mp_int* t2 = NULL;
  8293. #else
  8294. mp_int t1[1], t2[1];
  8295. #endif
  8296. DECLARE_CURVE_SPECS(3);
  8297. ALLOC_CURVE_SPECS(3, err);
  8298. #ifdef WOLFSSL_SMALL_STACK
  8299. if (err == MP_OKAY) {
  8300. t1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL,
  8301. DYNAMIC_TYPE_BIGINT);
  8302. if (t1 == NULL) {
  8303. err = MEMORY_E;
  8304. }
  8305. }
  8306. if (err == MP_OKAY) {
  8307. t2 = (mp_int*)XMALLOC(sizeof(mp_int), NULL,
  8308. DYNAMIC_TYPE_BIGINT);
  8309. if (t2 == NULL) {
  8310. err = MEMORY_E;
  8311. }
  8312. }
  8313. #endif
  8314. if (err == MP_OKAY) {
  8315. if (mp_init_multi(t1, t2, NULL, NULL, NULL, NULL) != MP_OKAY)
  8316. err = MEMORY_E;
  8317. else
  8318. did_init = 1;
  8319. }
  8320. /* load curve info */
  8321. if (err == MP_OKAY)
  8322. err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve,
  8323. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  8324. ECC_CURVE_FIELD_BF));
  8325. #if defined(WOLFSSL_CUSTOM_CURVES) && \
  8326. defined(WOLFSSL_VALIDATE_ECC_IMPORT)
  8327. /* validate prime is prime for custom curves */
  8328. if (err == MP_OKAY && curve_idx == ECC_CUSTOM_IDX) {
  8329. int isPrime = MP_NO;
  8330. err = mp_prime_is_prime(curve->prime, 8, &isPrime);
  8331. if (err == MP_OKAY && isPrime == MP_NO)
  8332. err = MP_VAL;
  8333. }
  8334. #endif
  8335. /* compute x^3 */
  8336. if (err == MP_OKAY)
  8337. err = mp_sqr(point->x, t1);
  8338. if (err == MP_OKAY)
  8339. err = mp_mulmod(t1, point->x, curve->prime, t1);
  8340. /* compute x^3 + a*x */
  8341. if (err == MP_OKAY)
  8342. err = mp_mulmod(curve->Af, point->x, curve->prime, t2);
  8343. if (err == MP_OKAY)
  8344. err = mp_add(t1, t2, t1);
  8345. /* compute x^3 + a*x + b */
  8346. if (err == MP_OKAY)
  8347. err = mp_add(t1, curve->Bf, t1);
  8348. /* compute sqrt(x^3 + a*x + b) */
  8349. if (err == MP_OKAY)
  8350. err = mp_sqrtmod_prime(t1, curve->prime, t2);
  8351. /* adjust y */
  8352. if (err == MP_OKAY) {
  8353. if ((mp_isodd(t2) == MP_YES &&
  8354. pointType == ECC_POINT_COMP_ODD) ||
  8355. (mp_isodd(t2) == MP_NO &&
  8356. pointType == ECC_POINT_COMP_EVEN)) {
  8357. err = mp_mod(t2, curve->prime, point->y);
  8358. }
  8359. else {
  8360. err = mp_submod(curve->prime, t2, curve->prime, point->y);
  8361. }
  8362. }
  8363. if (did_init) {
  8364. mp_clear(t2);
  8365. mp_clear(t1);
  8366. }
  8367. #ifdef WOLFSSL_SMALL_STACK
  8368. if (t1 != NULL) {
  8369. XFREE(t1, NULL, DYNAMIC_TYPE_BIGINT);
  8370. }
  8371. if (t2 != NULL) {
  8372. XFREE(t2, NULL, DYNAMIC_TYPE_BIGINT);
  8373. }
  8374. #endif
  8375. wc_ecc_curve_free(curve);
  8376. FREE_CURVE_SPECS();
  8377. }
  8378. #else
  8379. {
  8380. err = WC_KEY_SIZE_E;
  8381. }
  8382. #endif
  8383. }
  8384. #endif
  8385. if (err == MP_OKAY) {
  8386. #ifdef HAVE_COMP_KEY
  8387. if (compressed == 0)
  8388. #endif
  8389. err = mp_read_unsigned_bin(point->y, in + keysize, (word32)keysize);
  8390. }
  8391. if (err == MP_OKAY)
  8392. err = mp_set(point->z, 1);
  8393. if (err != MP_OKAY) {
  8394. mp_clear(point->x);
  8395. mp_clear(point->y);
  8396. mp_clear(point->z);
  8397. }
  8398. RESTORE_VECTOR_REGISTERS();
  8399. return err;
  8400. }
  8401. /* function for backwards compatibility with previous implementations */
  8402. int wc_ecc_import_point_der(const byte* in, word32 inLen, const int curve_idx,
  8403. ecc_point* point)
  8404. {
  8405. return wc_ecc_import_point_der_ex(in, inLen, curve_idx, point, 1);
  8406. }
  8407. #endif /* HAVE_ECC_KEY_IMPORT */
  8408. #ifdef HAVE_ECC_KEY_EXPORT
  8409. /* export point to der */
  8410. int wc_ecc_export_point_der_ex(const int curve_idx, ecc_point* point, byte* out,
  8411. word32* outLen, int compressed)
  8412. {
  8413. if (compressed == 0)
  8414. return wc_ecc_export_point_der(curve_idx, point, out, outLen);
  8415. #ifdef HAVE_COMP_KEY
  8416. else
  8417. return wc_ecc_export_point_der_compressed(curve_idx, point, out, outLen);
  8418. #else
  8419. return NOT_COMPILED_IN;
  8420. #endif
  8421. }
  8422. int wc_ecc_export_point_der(const int curve_idx, ecc_point* point, byte* out,
  8423. word32* outLen)
  8424. {
  8425. int ret = MP_OKAY;
  8426. word32 numlen;
  8427. #ifdef WOLFSSL_SMALL_STACK
  8428. byte* buf;
  8429. #else
  8430. byte buf[ECC_BUFSIZE];
  8431. #endif
  8432. if ((curve_idx < 0) || (wc_ecc_is_valid_idx(curve_idx) == 0))
  8433. return ECC_BAD_ARG_E;
  8434. numlen = (word32)ecc_sets[curve_idx].size;
  8435. /* return length needed only */
  8436. if (point != NULL && out == NULL && outLen != NULL) {
  8437. *outLen = 1 + 2*numlen;
  8438. return LENGTH_ONLY_E;
  8439. }
  8440. if (point == NULL || out == NULL || outLen == NULL)
  8441. return ECC_BAD_ARG_E;
  8442. if (*outLen < (1 + 2*numlen)) {
  8443. *outLen = 1 + 2*numlen;
  8444. return BUFFER_E;
  8445. }
  8446. /* Sanity check the ordinates' sizes. */
  8447. if (((word32)mp_unsigned_bin_size(point->x) > numlen) ||
  8448. ((word32)mp_unsigned_bin_size(point->y) > numlen)) {
  8449. return ECC_BAD_ARG_E;
  8450. }
  8451. /* store byte point type */
  8452. out[0] = ECC_POINT_UNCOMP;
  8453. #ifdef WOLFSSL_SMALL_STACK
  8454. buf = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8455. if (buf == NULL)
  8456. return MEMORY_E;
  8457. #endif
  8458. /* pad and store x */
  8459. XMEMSET(buf, 0, ECC_BUFSIZE);
  8460. ret = mp_to_unsigned_bin(point->x, buf +
  8461. (numlen - (word32)mp_unsigned_bin_size(point->x)));
  8462. if (ret != MP_OKAY)
  8463. goto done;
  8464. XMEMCPY(out+1, buf, numlen);
  8465. /* pad and store y */
  8466. XMEMSET(buf, 0, ECC_BUFSIZE);
  8467. ret = mp_to_unsigned_bin(point->y, buf +
  8468. (numlen - (word32)mp_unsigned_bin_size(point->y)));
  8469. if (ret != MP_OKAY)
  8470. goto done;
  8471. XMEMCPY(out+1+numlen, buf, numlen);
  8472. *outLen = 1 + 2*numlen;
  8473. done:
  8474. #ifdef WOLFSSL_SMALL_STACK
  8475. XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8476. #endif
  8477. return ret;
  8478. }
  8479. /* export point to der */
  8480. #ifdef HAVE_COMP_KEY
  8481. int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point,
  8482. byte* out, word32* outLen)
  8483. {
  8484. int ret = MP_OKAY;
  8485. word32 numlen;
  8486. word32 output_len;
  8487. #ifdef WOLFSSL_SMALL_STACK
  8488. byte* buf;
  8489. #else
  8490. byte buf[ECC_BUFSIZE];
  8491. #endif
  8492. if ((curve_idx < 0) || (wc_ecc_is_valid_idx(curve_idx) == 0))
  8493. return ECC_BAD_ARG_E;
  8494. numlen = (word32)ecc_sets[curve_idx].size;
  8495. output_len = 1 + numlen; /* y point type + x */
  8496. /* return length needed only */
  8497. if (point != NULL && out == NULL && outLen != NULL) {
  8498. *outLen = output_len;
  8499. return LENGTH_ONLY_E;
  8500. }
  8501. if (point == NULL || out == NULL || outLen == NULL)
  8502. return ECC_BAD_ARG_E;
  8503. if (*outLen < output_len) {
  8504. *outLen = output_len;
  8505. return BUFFER_E;
  8506. }
  8507. /* Sanity check the ordinate's size. */
  8508. if ((word32)mp_unsigned_bin_size(point->x) > numlen) {
  8509. return ECC_BAD_ARG_E;
  8510. }
  8511. /* store byte point type */
  8512. out[0] = mp_isodd(point->y) == MP_YES ? ECC_POINT_COMP_ODD :
  8513. ECC_POINT_COMP_EVEN;
  8514. #ifdef WOLFSSL_SMALL_STACK
  8515. buf = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8516. if (buf == NULL)
  8517. return MEMORY_E;
  8518. #endif
  8519. /* pad and store x */
  8520. XMEMSET(buf, 0, ECC_BUFSIZE);
  8521. ret = mp_to_unsigned_bin(point->x, buf +
  8522. (numlen - (word32)mp_unsigned_bin_size(point->x)));
  8523. if (ret != MP_OKAY)
  8524. goto done;
  8525. XMEMCPY(out+1, buf, numlen);
  8526. *outLen = output_len;
  8527. done:
  8528. #ifdef WOLFSSL_SMALL_STACK
  8529. XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8530. #endif
  8531. return ret;
  8532. }
  8533. #endif /* HAVE_COMP_KEY */
  8534. /* export public ECC key in ANSI X9.63 format */
  8535. WOLFSSL_ABI
  8536. int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen)
  8537. {
  8538. int ret = MP_OKAY;
  8539. word32 numlen;
  8540. #ifdef WOLFSSL_SMALL_STACK
  8541. byte* buf;
  8542. #else
  8543. byte buf[ECC_BUFSIZE];
  8544. #endif
  8545. word32 pubxlen, pubylen;
  8546. /* return length needed only */
  8547. if (key != NULL && out == NULL && outLen != NULL) {
  8548. /* if key hasn't been setup assume max bytes for size estimation */
  8549. numlen = key->dp ? (word32)key->dp->size : MAX_ECC_BYTES;
  8550. *outLen = 1 + 2 * numlen;
  8551. return LENGTH_ONLY_E;
  8552. }
  8553. if (key == NULL || out == NULL || outLen == NULL)
  8554. return ECC_BAD_ARG_E;
  8555. if (key->type == ECC_PRIVATEKEY_ONLY)
  8556. return ECC_PRIVATEONLY_E;
  8557. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  8558. /* check if public key in secure memory */
  8559. if (key->securePubKey > 0) {
  8560. int keySz = wc_ecc_size(key);
  8561. /* store byte point type */
  8562. out[0] = ECC_POINT_UNCOMP;
  8563. if (caamReadPartition((CAAM_ADDRESS)key->securePubKey, out+1, keySz*2) != 0)
  8564. return WC_HW_E;
  8565. *outLen = 1 + 2*keySz;
  8566. return MP_OKAY;
  8567. }
  8568. #endif
  8569. if (key->type == 0 || wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL){
  8570. return ECC_BAD_ARG_E;
  8571. }
  8572. numlen = (word32)key->dp->size;
  8573. /* verify room in out buffer */
  8574. if (*outLen < (1 + 2*numlen)) {
  8575. *outLen = 1 + 2*numlen;
  8576. return BUFFER_E;
  8577. }
  8578. /* verify public key length is less than key size */
  8579. pubxlen = (word32)mp_unsigned_bin_size(key->pubkey.x);
  8580. pubylen = (word32)mp_unsigned_bin_size(key->pubkey.y);
  8581. if ((pubxlen > numlen) || (pubylen > numlen)) {
  8582. WOLFSSL_MSG("Public key x/y invalid!");
  8583. return BUFFER_E;
  8584. }
  8585. /* store byte point type */
  8586. out[0] = ECC_POINT_UNCOMP;
  8587. #ifdef WOLFSSL_SMALL_STACK
  8588. buf = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8589. if (buf == NULL)
  8590. return MEMORY_E;
  8591. #endif
  8592. /* pad and store x */
  8593. XMEMSET(buf, 0, ECC_BUFSIZE);
  8594. ret = mp_to_unsigned_bin(key->pubkey.x, buf + (numlen - pubxlen));
  8595. if (ret != MP_OKAY)
  8596. goto done;
  8597. XMEMCPY(out+1, buf, numlen);
  8598. /* pad and store y */
  8599. XMEMSET(buf, 0, ECC_BUFSIZE);
  8600. ret = mp_to_unsigned_bin(key->pubkey.y, buf + (numlen - pubylen));
  8601. if (ret != MP_OKAY)
  8602. goto done;
  8603. XMEMCPY(out+1+numlen, buf, numlen);
  8604. *outLen = 1 + 2*numlen;
  8605. done:
  8606. #ifdef WOLFSSL_SMALL_STACK
  8607. XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8608. #endif
  8609. return ret;
  8610. }
  8611. /* export public ECC key in ANSI X9.63 format, extended with
  8612. * compression option */
  8613. WOLFSSL_ABI
  8614. int wc_ecc_export_x963_ex(ecc_key* key, byte* out, word32* outLen,
  8615. int compressed)
  8616. {
  8617. if (compressed == 0)
  8618. return wc_ecc_export_x963(key, out, outLen);
  8619. #ifdef HAVE_COMP_KEY
  8620. else
  8621. return wc_ecc_export_x963_compressed(key, out, outLen);
  8622. #else
  8623. return NOT_COMPILED_IN;
  8624. #endif
  8625. }
  8626. #endif /* HAVE_ECC_KEY_EXPORT */
  8627. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  8628. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SE050) && \
  8629. !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(WOLFSSL_STM32_PKA)
  8630. /* is ecc point on curve described by dp ? */
  8631. static int _ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
  8632. {
  8633. #if !defined(WOLFSSL_SP_MATH)
  8634. int err;
  8635. #ifdef WOLFSSL_SMALL_STACK
  8636. mp_int* t1;
  8637. mp_int* t2;
  8638. #else
  8639. mp_int t1[1], t2[1];
  8640. #endif
  8641. #ifdef WOLFSSL_SMALL_STACK
  8642. t1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  8643. if (t1 == NULL)
  8644. return MEMORY_E;
  8645. t2 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  8646. if (t2 == NULL) {
  8647. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  8648. return MEMORY_E;
  8649. }
  8650. #endif
  8651. if ((err = mp_init_multi(t1, t2, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  8652. #ifdef WOLFSSL_SMALL_STACK
  8653. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  8654. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  8655. #endif
  8656. return err;
  8657. }
  8658. SAVE_VECTOR_REGISTERS(err = _svr_ret;);
  8659. /* compute y^2 */
  8660. if (err == MP_OKAY)
  8661. err = mp_sqr(ecp->y, t1);
  8662. /* compute x^3 */
  8663. if (err == MP_OKAY)
  8664. err = mp_sqr(ecp->x, t2);
  8665. if (err == MP_OKAY)
  8666. err = mp_mod(t2, prime, t2);
  8667. if (err == MP_OKAY)
  8668. err = mp_mul(ecp->x, t2, t2);
  8669. /* compute y^2 - x^3 */
  8670. if (err == MP_OKAY)
  8671. err = mp_submod(t1, t2, prime, t1);
  8672. /* Determine if curve "a" should be used in calc */
  8673. #ifdef WOLFSSL_CUSTOM_CURVES
  8674. if (err == MP_OKAY) {
  8675. /* Use a and prime to determine if a == 3 */
  8676. err = mp_set(t2, 0);
  8677. if (err == MP_OKAY)
  8678. err = mp_submod(prime, a, prime, t2);
  8679. }
  8680. if (err == MP_OKAY && mp_cmp_d(t2, 3) != MP_EQ) {
  8681. /* compute y^2 - x^3 + a*x */
  8682. if (err == MP_OKAY)
  8683. err = mp_mulmod(t2, ecp->x, prime, t2);
  8684. if (err == MP_OKAY)
  8685. err = mp_addmod(t1, t2, prime, t1);
  8686. }
  8687. else
  8688. #endif /* WOLFSSL_CUSTOM_CURVES */
  8689. {
  8690. /* assumes "a" == 3 */
  8691. (void)a;
  8692. /* compute y^2 - x^3 + 3x */
  8693. if (err == MP_OKAY)
  8694. err = mp_add(t1, ecp->x, t1);
  8695. if (err == MP_OKAY)
  8696. err = mp_add(t1, ecp->x, t1);
  8697. if (err == MP_OKAY)
  8698. err = mp_add(t1, ecp->x, t1);
  8699. if (err == MP_OKAY)
  8700. err = mp_mod(t1, prime, t1);
  8701. }
  8702. /* adjust range (0, prime) */
  8703. while (err == MP_OKAY && mp_isneg(t1)) {
  8704. err = mp_add(t1, prime, t1);
  8705. }
  8706. while (err == MP_OKAY && mp_cmp(t1, prime) != MP_LT) {
  8707. err = mp_sub(t1, prime, t1);
  8708. }
  8709. /* compare to b */
  8710. if (err == MP_OKAY) {
  8711. if (mp_cmp(t1, b) != MP_EQ) {
  8712. err = IS_POINT_E;
  8713. } else {
  8714. err = MP_OKAY;
  8715. }
  8716. }
  8717. mp_clear(t1);
  8718. mp_clear(t2);
  8719. RESTORE_VECTOR_REGISTERS();
  8720. #ifdef WOLFSSL_SMALL_STACK
  8721. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  8722. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  8723. #endif
  8724. return err;
  8725. #else
  8726. (void)a;
  8727. (void)b;
  8728. #ifdef WOLFSSL_HAVE_SP_ECC
  8729. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  8730. if ((mp_count_bits(prime) == 256) && (!mp_is_bit_set(prime, 224))) {
  8731. return sp_ecc_is_point_sm2_256(ecp->x, ecp->y);
  8732. }
  8733. #endif
  8734. #ifndef WOLFSSL_SP_NO_256
  8735. if (mp_count_bits(prime) == 256) {
  8736. return sp_ecc_is_point_256(ecp->x, ecp->y);
  8737. }
  8738. #endif
  8739. #ifdef WOLFSSL_SP_384
  8740. if (mp_count_bits(prime) == 384) {
  8741. return sp_ecc_is_point_384(ecp->x, ecp->y);
  8742. }
  8743. #endif
  8744. #ifdef WOLFSSL_SP_521
  8745. if (mp_count_bits(prime) == 521) {
  8746. return sp_ecc_is_point_521(ecp->x, ecp->y);
  8747. }
  8748. #endif
  8749. #else
  8750. (void)ecp;
  8751. (void)prime;
  8752. #endif
  8753. return WC_KEY_SIZE_E;
  8754. #endif
  8755. }
  8756. int wc_ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
  8757. {
  8758. int err = MP_OKAY;
  8759. /* Validate parameters. */
  8760. if ((ecp == NULL) || (a == NULL) || (b == NULL) || (prime == NULL)) {
  8761. err = BAD_FUNC_ARG;
  8762. }
  8763. if (err == MP_OKAY) {
  8764. /* x must be in the range [0, p-1] */
  8765. if ((mp_cmp(ecp->x, prime) != MP_LT) || mp_isneg(ecp->x)) {
  8766. err = ECC_OUT_OF_RANGE_E;
  8767. }
  8768. }
  8769. if (err == MP_OKAY) {
  8770. /* y must be in the range [0, p-1] */
  8771. if ((mp_cmp(ecp->y, prime) != MP_LT) || mp_isneg(ecp->y)) {
  8772. err = ECC_OUT_OF_RANGE_E;
  8773. }
  8774. }
  8775. if (err == MP_OKAY) {
  8776. /* z must be one, that is point must be in affine form. */
  8777. if (!mp_isone(ecp->z)) {
  8778. err = ECC_BAD_ARG_E;
  8779. }
  8780. }
  8781. if (err == MP_OKAY) {
  8782. /* Check x and y are valid for curve equation. */
  8783. err = _ecc_is_point(ecp, a, b, prime);
  8784. }
  8785. return err;
  8786. }
  8787. #if (FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || \
  8788. (defined(WOLFSSL_VALIDATE_ECC_IMPORT) && !defined(WOLFSSL_SP_MATH))) && \
  8789. !defined(WOLFSSL_KCAPI_ECC) || defined(WOLFSSL_CAAM)
  8790. /* validate privkey * generator == pubkey, 0 on success */
  8791. static int ecc_check_privkey_gen(ecc_key* key, mp_int* a, mp_int* prime)
  8792. {
  8793. int err;
  8794. ecc_point* base = NULL;
  8795. ecc_point* res = NULL;
  8796. #ifdef WOLFSSL_NO_MALLOC
  8797. ecc_point lcl_base;
  8798. ecc_point lcl_res;
  8799. #endif
  8800. DECLARE_CURVE_SPECS(3);
  8801. if (key == NULL)
  8802. return BAD_FUNC_ARG;
  8803. ALLOC_CURVE_SPECS(3, err);
  8804. #ifdef WOLFSSL_NO_MALLOC
  8805. res = &lcl_res;
  8806. #endif
  8807. err = wc_ecc_new_point_ex(&res, key->heap);
  8808. #ifdef WOLFSSL_HAVE_SP_ECC
  8809. #ifndef WOLFSSL_SP_NO_256
  8810. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  8811. if (err == MP_OKAY) {
  8812. err = sp_ecc_mulmod_base_256(key->k, res, 1, key->heap);
  8813. }
  8814. }
  8815. else
  8816. #endif
  8817. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  8818. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SM2P256V1) {
  8819. if (err == MP_OKAY) {
  8820. err = sp_ecc_mulmod_base_sm2_256(key->k, res, 1, key->heap);
  8821. }
  8822. }
  8823. else
  8824. #endif
  8825. #ifdef WOLFSSL_SP_384
  8826. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  8827. if (err == MP_OKAY) {
  8828. err = sp_ecc_mulmod_base_384(key->k, res, 1, key->heap);
  8829. }
  8830. }
  8831. else
  8832. #endif
  8833. #ifdef WOLFSSL_SP_521
  8834. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) {
  8835. if (err == MP_OKAY) {
  8836. err = sp_ecc_mulmod_base_521(key->k, res, 1, key->heap);
  8837. }
  8838. }
  8839. else
  8840. #endif
  8841. #endif
  8842. {
  8843. if (err == MP_OKAY) {
  8844. #ifdef WOLFSSL_NO_MALLOC
  8845. base = &lcl_base;
  8846. #endif
  8847. err = wc_ecc_new_point_ex(&base, key->heap);
  8848. }
  8849. if (err == MP_OKAY) {
  8850. /* load curve info */
  8851. err = wc_ecc_curve_load(key->dp, &curve, (ECC_CURVE_FIELD_GX |
  8852. ECC_CURVE_FIELD_GY | ECC_CURVE_FIELD_ORDER));
  8853. }
  8854. /* set up base generator */
  8855. if (err == MP_OKAY)
  8856. err = mp_copy(curve->Gx, base->x);
  8857. if (err == MP_OKAY)
  8858. err = mp_copy(curve->Gy, base->y);
  8859. if (err == MP_OKAY)
  8860. err = mp_set(base->z, 1);
  8861. #ifdef WOLFSSL_KCAPI_ECC
  8862. if (err == MP_OKAY) {
  8863. word32 pubkey_sz = (word32)key->dp->size*2;
  8864. if (key->handle == NULL) {
  8865. /* if handle loaded, then pubkey_raw already populated */
  8866. err = KcapiEcc_LoadKey(key, key->pubkey_raw, &pubkey_sz, 1);
  8867. }
  8868. if (err == 0) {
  8869. err = mp_read_unsigned_bin(res->x, key->pubkey_raw,
  8870. pubkey_sz/2);
  8871. }
  8872. if (err == MP_OKAY) {
  8873. err = mp_read_unsigned_bin(res->y,
  8874. key->pubkey_raw + pubkey_sz/2,
  8875. pubkey_sz/2);
  8876. }
  8877. if (err == MP_OKAY) {
  8878. err = mp_set(res->z, 1);
  8879. }
  8880. }
  8881. (void)a;
  8882. (void)prime;
  8883. #else
  8884. #ifdef ECC_TIMING_RESISTANT
  8885. if (err == MP_OKAY)
  8886. err = wc_ecc_mulmod_ex2(key->k, base, res, a, prime, curve->order,
  8887. key->rng, 1, key->heap);
  8888. #else
  8889. if (err == MP_OKAY)
  8890. err = wc_ecc_mulmod_ex2(key->k, base, res, a, prime, curve->order,
  8891. NULL, 1, key->heap);
  8892. #endif
  8893. #endif /* WOLFSSL_KCAPI_ECC */
  8894. }
  8895. if (err == MP_OKAY) {
  8896. /* compare result to public key */
  8897. if (mp_cmp(res->x, key->pubkey.x) != MP_EQ ||
  8898. mp_cmp(res->y, key->pubkey.y) != MP_EQ ||
  8899. mp_cmp(res->z, key->pubkey.z) != MP_EQ) {
  8900. /* didn't match */
  8901. err = ECC_PRIV_KEY_E;
  8902. }
  8903. }
  8904. wc_ecc_curve_free(curve);
  8905. wc_ecc_del_point_ex(res, key->heap);
  8906. wc_ecc_del_point_ex(base, key->heap);
  8907. FREE_CURVE_SPECS();
  8908. return err;
  8909. }
  8910. #endif /* FIPS_VERSION_GE(5,0) || WOLFSSL_VALIDATE_ECC_KEYGEN ||
  8911. * (!WOLFSSL_SP_MATH && WOLFSSL_VALIDATE_ECC_IMPORT) */
  8912. #if (FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_ECC_KEYGEN)) && \
  8913. !defined(WOLFSSL_KCAPI_ECC)
  8914. /* check privkey generator helper, creates prime needed */
  8915. static int ecc_check_privkey_gen_helper(ecc_key* key)
  8916. {
  8917. int err;
  8918. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A)
  8919. DECLARE_CURVE_SPECS(2);
  8920. #endif
  8921. if (key == NULL)
  8922. return BAD_FUNC_ARG;
  8923. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  8924. /* Hardware based private key, so this operation is not supported */
  8925. err = MP_OKAY; /* just report success */
  8926. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  8927. /* Hardware based private key, so this operation is not supported */
  8928. err = MP_OKAY; /* just report success */
  8929. #elif defined(WOLFSSL_KCAPI_ECC)
  8930. /* Hardware based private key, so this operation is not supported */
  8931. err = MP_OKAY; /* just report success */
  8932. #else
  8933. err = MP_OKAY;
  8934. ALLOC_CURVE_SPECS(2, err);
  8935. /* load curve info */
  8936. if (err == MP_OKAY)
  8937. err = wc_ecc_curve_load(key->dp, &curve,
  8938. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF));
  8939. if (err == MP_OKAY)
  8940. err = ecc_check_privkey_gen(key, curve->Af, curve->prime);
  8941. wc_ecc_curve_free(curve);
  8942. FREE_CURVE_SPECS();
  8943. #endif /* WOLFSSL_ATECC508A */
  8944. return err;
  8945. }
  8946. /* Performs a Pairwise Consistency Test on an ECC key pair. */
  8947. static int _ecc_pairwise_consistency_test(ecc_key* key, WC_RNG* rng)
  8948. {
  8949. int err = 0;
  8950. word32 flags = key->flags;
  8951. /* If flags not set default to cofactor and dec/sign */
  8952. if ((flags & (WC_ECC_FLAG_COFACTOR | WC_ECC_FLAG_DEC_SIGN)) == 0) {
  8953. flags = (WC_ECC_FLAG_COFACTOR | WC_ECC_FLAG_DEC_SIGN);
  8954. }
  8955. if (flags & WC_ECC_FLAG_COFACTOR) {
  8956. err = ecc_check_privkey_gen_helper(key);
  8957. }
  8958. if (!err && (flags & WC_ECC_FLAG_DEC_SIGN)) {
  8959. byte* sig;
  8960. byte* digest;
  8961. word32 sigLen, digestLen;
  8962. int dynRng = 0, res = 0;
  8963. sigLen = (word32)wc_ecc_sig_size(key);
  8964. digestLen = WC_SHA256_DIGEST_SIZE;
  8965. sig = (byte*)XMALLOC(sigLen + digestLen, NULL, DYNAMIC_TYPE_ECC);
  8966. if (sig == NULL)
  8967. return MEMORY_E;
  8968. digest = sig + sigLen;
  8969. if (rng == NULL) {
  8970. dynRng = 1;
  8971. rng = wc_rng_new(NULL, 0, NULL);
  8972. if (rng == NULL) {
  8973. XFREE(sig, NULL, DYNAMIC_TYPE_ECC);
  8974. return MEMORY_E;
  8975. }
  8976. }
  8977. err = wc_RNG_GenerateBlock(rng, digest, digestLen);
  8978. if (!err)
  8979. err = wc_ecc_sign_hash(digest, WC_SHA256_DIGEST_SIZE, sig, &sigLen,
  8980. rng, key);
  8981. if (!err)
  8982. err = wc_ecc_verify_hash(sig, sigLen,
  8983. digest, WC_SHA256_DIGEST_SIZE, &res, key);
  8984. if (res == 0)
  8985. err = ECC_PCT_E;
  8986. if (dynRng) {
  8987. wc_rng_free(rng);
  8988. }
  8989. ForceZero(sig, sigLen + digestLen);
  8990. XFREE(sig, NULL, DYNAMIC_TYPE_ECC);
  8991. }
  8992. (void)rng;
  8993. if (err != 0)
  8994. err = ECC_PCT_E;
  8995. return err;
  8996. }
  8997. #endif /* (FIPS v5 or later || WOLFSSL_VALIDATE_ECC_KEYGEN) &&!WOLFSSL_KCAPI_ECC */
  8998. #ifdef HAVE_ECC_CHECK_PUBKEY_ORDER
  8999. /* validate order * pubkey = point at infinity, 0 on success */
  9000. static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
  9001. mp_int* prime, mp_int* order)
  9002. {
  9003. ecc_point* inf = NULL;
  9004. #ifdef WOLFSSL_NO_MALLOC
  9005. ecc_point lcl_inf;
  9006. #endif
  9007. int err;
  9008. if (key == NULL)
  9009. return BAD_FUNC_ARG;
  9010. if (mp_count_bits(pubkey->x) > mp_count_bits(prime) ||
  9011. mp_count_bits(pubkey->y) > mp_count_bits(prime) ||
  9012. mp_count_bits(pubkey->z) > mp_count_bits(prime)) {
  9013. return IS_POINT_E;
  9014. }
  9015. #ifdef WOLFSSL_NO_MALLOC
  9016. inf = &lcl_inf;
  9017. #endif
  9018. err = wc_ecc_new_point_ex(&inf, key->heap);
  9019. if (err == MP_OKAY) {
  9020. #ifdef WOLFSSL_HAVE_SP_ECC
  9021. #ifndef WOLFSSL_SP_NO_256
  9022. if (key->idx != ECC_CUSTOM_IDX &&
  9023. ecc_sets[key->idx].id == ECC_SECP256R1) {
  9024. err = sp_ecc_mulmod_256(order, pubkey, inf, 1, key->heap);
  9025. }
  9026. else
  9027. #endif
  9028. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  9029. if (key->idx != ECC_CUSTOM_IDX &&
  9030. ecc_sets[key->idx].id == ECC_SM2P256V1) {
  9031. err = sp_ecc_mulmod_sm2_256(order, pubkey, inf, 1, key->heap);
  9032. }
  9033. else
  9034. #endif
  9035. #ifdef WOLFSSL_SP_384
  9036. if (key->idx != ECC_CUSTOM_IDX &&
  9037. ecc_sets[key->idx].id == ECC_SECP384R1) {
  9038. err = sp_ecc_mulmod_384(order, pubkey, inf, 1, key->heap);
  9039. }
  9040. else
  9041. #endif
  9042. #ifdef WOLFSSL_SP_521
  9043. if (key->idx != ECC_CUSTOM_IDX &&
  9044. ecc_sets[key->idx].id == ECC_SECP521R1) {
  9045. err = sp_ecc_mulmod_521(order, pubkey, inf, 1, key->heap);
  9046. }
  9047. else
  9048. #endif
  9049. #endif
  9050. #if !defined(WOLFSSL_SP_MATH)
  9051. err = wc_ecc_mulmod_ex(order, pubkey, inf, a, prime, 1, key->heap);
  9052. if (err == MP_OKAY && !wc_ecc_point_is_at_infinity(inf))
  9053. err = ECC_INF_E;
  9054. #else
  9055. {
  9056. (void)a;
  9057. (void)prime;
  9058. err = WC_KEY_SIZE_E;
  9059. }
  9060. #endif
  9061. }
  9062. wc_ecc_del_point_ex(inf, key->heap);
  9063. return err;
  9064. }
  9065. #endif /* !WOLFSSL_SP_MATH */
  9066. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL*/
  9067. #ifdef OPENSSL_EXTRA
  9068. int wc_ecc_get_generator(ecc_point* ecp, int curve_idx)
  9069. {
  9070. int err = MP_OKAY;
  9071. DECLARE_CURVE_SPECS(2);
  9072. if (!ecp || curve_idx < 0 || curve_idx > (int)(ECC_SET_COUNT-1))
  9073. return BAD_FUNC_ARG;
  9074. ALLOC_CURVE_SPECS(2, err);
  9075. if (err == MP_OKAY)
  9076. err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve,
  9077. (ECC_CURVE_FIELD_GX | ECC_CURVE_FIELD_GY));
  9078. if (err == MP_OKAY)
  9079. err = mp_copy(curve->Gx, ecp->x);
  9080. if (err == MP_OKAY)
  9081. err = mp_copy(curve->Gy, ecp->y);
  9082. if (err == MP_OKAY)
  9083. err = mp_set(ecp->z, 1);
  9084. wc_ecc_curve_free(curve);
  9085. FREE_CURVE_SPECS();
  9086. return err;
  9087. }
  9088. #endif /* OPENSSLALL */
  9089. /* Validate the public key per SP 800-56Ar3 section 5.6.2.3.3,
  9090. * ECC Full Public Key Validation Routine. If the parameter
  9091. * partial is set, then it follows section 5.6.2.3.4, the ECC
  9092. * Partial Public Key Validation Routine.
  9093. * If the parameter priv is set, add in a few extra
  9094. * checks on the bounds of the private key. */
  9095. static int _ecc_validate_public_key(ecc_key* key, int partial, int priv)
  9096. {
  9097. int err = MP_OKAY;
  9098. #ifndef WOLFSSL_SP_MATH
  9099. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  9100. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \
  9101. !defined(WOLFSSL_SE050) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) && \
  9102. !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(WOLFSSL_STM32_PKA)
  9103. mp_int* b = NULL;
  9104. #ifdef USE_ECC_B_PARAM
  9105. DECLARE_CURVE_SPECS(4);
  9106. #else
  9107. #ifndef WOLFSSL_SMALL_STACK
  9108. mp_int b_lcl;
  9109. #endif
  9110. DECLARE_CURVE_SPECS(3);
  9111. #endif /* USE_ECC_B_PARAM */
  9112. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A &&
  9113. !WOLFSSL_CRYPTOCELL && !WOLFSSL_SILABS_SE_ACCEL && !WOLFSSL_SE050 */
  9114. #endif /* !WOLFSSL_SP_MATH */
  9115. ASSERT_SAVED_VECTOR_REGISTERS();
  9116. if (key == NULL)
  9117. return BAD_FUNC_ARG;
  9118. #ifdef WOLFSSL_HAVE_SP_ECC
  9119. #ifndef WOLFSSL_SP_NO_256
  9120. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  9121. return sp_ecc_check_key_256(key->pubkey.x, key->pubkey.y,
  9122. key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap);
  9123. }
  9124. #endif
  9125. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  9126. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SM2P256V1) {
  9127. return sp_ecc_check_key_sm2_256(key->pubkey.x, key->pubkey.y,
  9128. key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap);
  9129. }
  9130. #endif
  9131. #ifdef WOLFSSL_SP_384
  9132. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  9133. return sp_ecc_check_key_384(key->pubkey.x, key->pubkey.y,
  9134. key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap);
  9135. }
  9136. #endif
  9137. #ifdef WOLFSSL_SP_521
  9138. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) {
  9139. return sp_ecc_check_key_521(key->pubkey.x, key->pubkey.y,
  9140. key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap);
  9141. }
  9142. #endif
  9143. #if defined(WOLFSSL_SP_1024) && defined(WOLFCRYPT_HAVE_SAKKE)
  9144. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SAKKE_1) {
  9145. return sp_ecc_check_key_1024(key->pubkey.x, key->pubkey.y,
  9146. key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap);
  9147. }
  9148. #endif
  9149. #endif
  9150. #ifndef WOLFSSL_SP_MATH
  9151. #ifndef HAVE_ECC_CHECK_PUBKEY_ORDER
  9152. /* consider key check success on HW crypto
  9153. * ex: ATECC508/608A, CryptoCell and Silabs
  9154. *
  9155. * consider key check success on Crypt Cb
  9156. */
  9157. err = MP_OKAY;
  9158. #else
  9159. #ifdef USE_ECC_B_PARAM
  9160. ALLOC_CURVE_SPECS(4, err);
  9161. #else
  9162. ALLOC_CURVE_SPECS(3, err);
  9163. #ifndef WOLFSSL_SMALL_STACK
  9164. b = &b_lcl;
  9165. #else
  9166. b = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  9167. if (b == NULL) {
  9168. FREE_CURVE_SPECS();
  9169. return MEMORY_E;
  9170. }
  9171. #endif
  9172. XMEMSET(b, 0, sizeof(mp_int));
  9173. #endif
  9174. #ifdef WOLFSSL_CAAM
  9175. /* keys can be black encrypted ones which can not be checked like plain text
  9176. * keys */
  9177. if (key->blackKey > 0) {
  9178. /* encrypted key was used */
  9179. #ifdef WOLFSSL_SMALL_STACK
  9180. XFREE(b, key->heap, DYNAMIC_TYPE_ECC);
  9181. #endif
  9182. FREE_CURVE_SPECS();
  9183. return 0;
  9184. }
  9185. #endif
  9186. /* SP 800-56Ar3, section 5.6.2.3.3, process step 1 */
  9187. /* SP 800-56Ar3, section 5.6.2.3.4, process step 1 */
  9188. /* pubkey point cannot be at infinity */
  9189. if (wc_ecc_point_is_at_infinity(&key->pubkey)) {
  9190. #ifdef WOLFSSL_SMALL_STACK
  9191. XFREE(b, key->heap, DYNAMIC_TYPE_ECC);
  9192. #endif
  9193. FREE_CURVE_SPECS();
  9194. return ECC_INF_E;
  9195. }
  9196. /* load curve info */
  9197. if (err == MP_OKAY)
  9198. err = wc_ecc_curve_load(key->dp, &curve, (ECC_CURVE_FIELD_PRIME |
  9199. ECC_CURVE_FIELD_AF | ECC_CURVE_FIELD_ORDER
  9200. #ifdef USE_ECC_B_PARAM
  9201. | ECC_CURVE_FIELD_BF
  9202. #endif
  9203. ));
  9204. #ifndef USE_ECC_B_PARAM
  9205. /* load curve b parameter */
  9206. if (err == MP_OKAY)
  9207. err = mp_init(b);
  9208. if (err == MP_OKAY)
  9209. err = mp_read_radix(b, key->dp->Bf, MP_RADIX_HEX);
  9210. #else
  9211. if (err == MP_OKAY)
  9212. b = curve->Bf;
  9213. #endif
  9214. /* SP 800-56Ar3, section 5.6.2.3.3, process step 2 */
  9215. /* SP 800-56Ar3, section 5.6.2.3.4, process step 2 */
  9216. /* Qx must be in the range [0, p-1] */
  9217. if (err == MP_OKAY) {
  9218. if ((mp_cmp(key->pubkey.x, curve->prime) != MP_LT) ||
  9219. mp_isneg(key->pubkey.x)) {
  9220. err = ECC_OUT_OF_RANGE_E;
  9221. }
  9222. }
  9223. /* Qy must be in the range [0, p-1] */
  9224. if (err == MP_OKAY) {
  9225. if ((mp_cmp(key->pubkey.y, curve->prime) != MP_LT) ||
  9226. mp_isneg(key->pubkey.y)) {
  9227. err = ECC_OUT_OF_RANGE_E;
  9228. }
  9229. }
  9230. /* SP 800-56Ar3, section 5.6.2.3.3, process step 3 */
  9231. /* SP 800-56Ar3, section 5.6.2.3.4, process step 3 */
  9232. /* make sure point is actually on curve */
  9233. if (err == MP_OKAY)
  9234. err = _ecc_is_point(&key->pubkey, curve->Af, b, curve->prime);
  9235. if (!partial) {
  9236. /* SP 800-56Ar3, section 5.6.2.3.3, process step 4 */
  9237. /* pubkey * order must be at infinity */
  9238. if (err == MP_OKAY)
  9239. err = ecc_check_pubkey_order(key, &key->pubkey, curve->Af,
  9240. curve->prime, curve->order);
  9241. }
  9242. if (priv) {
  9243. /* SP 800-56Ar3, section 5.6.2.1.2 */
  9244. /* private keys must be in the range [1, n-1] */
  9245. if ((err == MP_OKAY) && (key->type == ECC_PRIVATEKEY) &&
  9246. (mp_iszero(key->k) || mp_isneg(key->k) ||
  9247. (mp_cmp(key->k, curve->order) != MP_LT))
  9248. #ifdef WOLFSSL_KCAPI_ECC
  9249. && key->handle == NULL
  9250. #endif
  9251. ) {
  9252. err = ECC_PRIV_KEY_E;
  9253. }
  9254. #if defined(WOLFSSL_VALIDATE_ECC_IMPORT) || defined(WOLFSSL_CAAM)
  9255. /* SP 800-56Ar3, section 5.6.2.1.4, method (b) for ECC */
  9256. /* private * base generator must equal pubkey */
  9257. if (err == MP_OKAY && key->type == ECC_PRIVATEKEY)
  9258. err = ecc_check_privkey_gen(key, curve->Af, curve->prime);
  9259. #endif
  9260. }
  9261. wc_ecc_curve_free(curve);
  9262. #ifndef USE_ECC_B_PARAM
  9263. mp_clear(b);
  9264. #ifdef WOLFSSL_SMALL_STACK
  9265. XFREE(b, key->heap, DYNAMIC_TYPE_ECC);
  9266. #endif
  9267. #endif
  9268. FREE_CURVE_SPECS();
  9269. #endif /* HAVE_ECC_CHECK_PUBKEY_ORDER */
  9270. #else
  9271. err = WC_KEY_SIZE_E;
  9272. #endif /* !WOLFSSL_SP_MATH */
  9273. (void)partial;
  9274. (void)priv;
  9275. return err;
  9276. }
  9277. /* perform sanity checks on ecc key validity, 0 on success */
  9278. WOLFSSL_ABI
  9279. int wc_ecc_check_key(ecc_key* key)
  9280. {
  9281. int ret;
  9282. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  9283. ret = _ecc_validate_public_key(key, 0, 1);
  9284. RESTORE_VECTOR_REGISTERS();
  9285. return ret;
  9286. }
  9287. #ifdef HAVE_ECC_KEY_IMPORT
  9288. /* import public ECC key in ANSI X9.63 format */
  9289. int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key,
  9290. int curve_id)
  9291. {
  9292. int err = MP_OKAY;
  9293. #ifdef HAVE_COMP_KEY
  9294. int compressed = 0;
  9295. #endif
  9296. int keysize = 0;
  9297. byte pointType;
  9298. #ifdef WOLFSSL_CRYPTOCELL
  9299. const CRYS_ECPKI_Domain_t* pDomain;
  9300. CRYS_ECPKI_BUILD_TempData_t tempBuff;
  9301. #endif
  9302. if (in == NULL || key == NULL)
  9303. return BAD_FUNC_ARG;
  9304. /* must be odd */
  9305. if ((inLen & 1) == 0) {
  9306. return ECC_BAD_ARG_E;
  9307. }
  9308. /* make sure required variables are reset */
  9309. wc_ecc_reset(key);
  9310. /* init key */
  9311. #ifdef ALT_ECC_SIZE
  9312. key->pubkey.x = (mp_int*)&key->pubkey.xyz[0];
  9313. key->pubkey.y = (mp_int*)&key->pubkey.xyz[1];
  9314. key->pubkey.z = (mp_int*)&key->pubkey.xyz[2];
  9315. alt_fp_init(key->pubkey.x);
  9316. alt_fp_init(key->pubkey.y);
  9317. alt_fp_init(key->pubkey.z);
  9318. key->k = (mp_int*)key->ka;
  9319. alt_fp_init(key->k);
  9320. #else
  9321. err = mp_init_multi(key->k,
  9322. key->pubkey.x, key->pubkey.y, key->pubkey.z, NULL, NULL);
  9323. #endif
  9324. if (err != MP_OKAY)
  9325. return MEMORY_E;
  9326. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  9327. /* check for point type (4, 2, or 3) */
  9328. pointType = in[0];
  9329. if (pointType != ECC_POINT_UNCOMP && pointType != ECC_POINT_COMP_EVEN &&
  9330. pointType != ECC_POINT_COMP_ODD) {
  9331. err = ASN_PARSE_E;
  9332. }
  9333. if (pointType == ECC_POINT_COMP_EVEN || pointType == ECC_POINT_COMP_ODD) {
  9334. #ifdef HAVE_COMP_KEY
  9335. compressed = 1;
  9336. #else
  9337. err = NOT_COMPILED_IN;
  9338. #endif
  9339. }
  9340. /* adjust to skip first byte */
  9341. inLen -= 1;
  9342. in += 1;
  9343. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  9344. /* For SECP256R1 only save raw public key for hardware */
  9345. if (curve_id == ECC_SECP256R1 && inLen <= (word32)sizeof(key->pubkey_raw)) {
  9346. #ifdef HAVE_COMP_KEY
  9347. if (!compressed)
  9348. #endif
  9349. XMEMCPY(key->pubkey_raw, (byte*)in, inLen);
  9350. }
  9351. #elif defined(WOLFSSL_KCAPI_ECC)
  9352. XMEMCPY(key->pubkey_raw, (byte*)in, inLen);
  9353. #endif
  9354. if (err == MP_OKAY) {
  9355. #ifdef HAVE_COMP_KEY
  9356. /* adjust inLen if compressed */
  9357. if (compressed)
  9358. inLen = inLen*2 + 1; /* used uncompressed len */
  9359. #endif
  9360. /* determine key size */
  9361. keysize = (int)(inLen>>1);
  9362. err = wc_ecc_set_curve(key, keysize, curve_id);
  9363. key->type = ECC_PUBLICKEY;
  9364. }
  9365. /* read data */
  9366. if (err == MP_OKAY)
  9367. err = mp_read_unsigned_bin(key->pubkey.x, in, (word32)keysize);
  9368. #ifdef HAVE_COMP_KEY
  9369. if (err == MP_OKAY && compressed == 1) { /* build y */
  9370. #if !defined(WOLFSSL_SP_MATH)
  9371. #ifdef WOLFSSL_SMALL_STACK
  9372. mp_int* t1 = NULL;
  9373. mp_int* t2 = NULL;
  9374. #else
  9375. mp_int t1[1], t2[1];
  9376. #endif
  9377. int did_init = 0;
  9378. DECLARE_CURVE_SPECS(3);
  9379. ALLOC_CURVE_SPECS(3, err);
  9380. #ifdef WOLFSSL_SMALL_STACK
  9381. if (err == MP_OKAY) {
  9382. t1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  9383. if (t1 == NULL) {
  9384. err = MEMORY_E;
  9385. }
  9386. }
  9387. if (err == MP_OKAY) {
  9388. t2 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  9389. if (t2 == NULL) {
  9390. err = MEMORY_E;
  9391. }
  9392. }
  9393. #endif
  9394. if (err == MP_OKAY) {
  9395. if (mp_init_multi(t1, t2, NULL, NULL, NULL, NULL) != MP_OKAY)
  9396. err = MEMORY_E;
  9397. else
  9398. did_init = 1;
  9399. }
  9400. /* load curve info */
  9401. if (err == MP_OKAY)
  9402. err = wc_ecc_curve_load(key->dp, &curve,
  9403. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  9404. ECC_CURVE_FIELD_BF));
  9405. #if defined(WOLFSSL_CUSTOM_CURVES) && \
  9406. defined(WOLFSSL_VALIDATE_ECC_IMPORT)
  9407. /* validate prime is prime for custom curves */
  9408. if (err == MP_OKAY && key->idx == ECC_CUSTOM_IDX) {
  9409. int isPrime = MP_NO;
  9410. err = mp_prime_is_prime(curve->prime, 8, &isPrime);
  9411. if (err == MP_OKAY && isPrime == MP_NO)
  9412. err = MP_VAL;
  9413. }
  9414. #endif
  9415. /* compute x^3 */
  9416. if (err == MP_OKAY)
  9417. err = mp_sqrmod(key->pubkey.x, curve->prime, t1);
  9418. if (err == MP_OKAY)
  9419. err = mp_mulmod(t1, key->pubkey.x, curve->prime, t1);
  9420. /* compute x^3 + a*x */
  9421. if (err == MP_OKAY)
  9422. err = mp_mulmod(curve->Af, key->pubkey.x, curve->prime, t2);
  9423. if (err == MP_OKAY)
  9424. err = mp_add(t1, t2, t1);
  9425. /* compute x^3 + a*x + b */
  9426. if (err == MP_OKAY)
  9427. err = mp_add(t1, curve->Bf, t1);
  9428. /* compute sqrt(x^3 + a*x + b) */
  9429. if (err == MP_OKAY)
  9430. err = mp_sqrtmod_prime(t1, curve->prime, t2);
  9431. /* adjust y */
  9432. if (err == MP_OKAY) {
  9433. if ((mp_isodd(t2) == MP_YES && pointType == ECC_POINT_COMP_ODD) ||
  9434. (mp_isodd(t2) == MP_NO && pointType == ECC_POINT_COMP_EVEN)) {
  9435. err = mp_mod(t2, curve->prime, t2);
  9436. }
  9437. else {
  9438. err = mp_submod(curve->prime, t2, curve->prime, t2);
  9439. }
  9440. if (err == MP_OKAY)
  9441. err = mp_copy(t2, key->pubkey.y);
  9442. }
  9443. if (did_init) {
  9444. mp_clear(t2);
  9445. mp_clear(t1);
  9446. }
  9447. #ifdef WOLFSSL_SMALL_STACK
  9448. if (t1 != NULL) {
  9449. XFREE(t1, NULL, DYNAMIC_TYPE_BIGINT);
  9450. }
  9451. if (t2 != NULL) {
  9452. XFREE(t2, NULL, DYNAMIC_TYPE_BIGINT);
  9453. }
  9454. #endif
  9455. wc_ecc_curve_free(curve);
  9456. FREE_CURVE_SPECS();
  9457. #else
  9458. #ifndef WOLFSSL_SP_NO_256
  9459. if (key->dp->id == ECC_SECP256R1) {
  9460. err = sp_ecc_uncompress_256(key->pubkey.x, pointType,
  9461. key->pubkey.y);
  9462. }
  9463. else
  9464. #endif
  9465. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  9466. if (key->dp->id == ECC_SM2P256V1) {
  9467. sp_ecc_uncompress_sm2_256(key->pubkey.x, pointType, key->pubkey.y);
  9468. }
  9469. else
  9470. #endif
  9471. #ifdef WOLFSSL_SP_384
  9472. if (key->dp->id == ECC_SECP384R1) {
  9473. err = sp_ecc_uncompress_384(key->pubkey.x, pointType,
  9474. key->pubkey.y);
  9475. }
  9476. else
  9477. #endif
  9478. #ifdef WOLFSSL_SP_521
  9479. if (key->dp->id == ECC_SECP521R1) {
  9480. err = sp_ecc_uncompress_521(key->pubkey.x, pointType,
  9481. key->pubkey.y);
  9482. }
  9483. else
  9484. #endif
  9485. {
  9486. err = WC_KEY_SIZE_E;
  9487. }
  9488. #endif
  9489. }
  9490. #endif /* HAVE_COMP_KEY */
  9491. if (err == MP_OKAY) {
  9492. #ifdef HAVE_COMP_KEY
  9493. if (compressed == 0)
  9494. #endif
  9495. {
  9496. err = mp_read_unsigned_bin(key->pubkey.y, in + keysize,
  9497. (word32)keysize);
  9498. }
  9499. }
  9500. if (err == MP_OKAY)
  9501. err = mp_set(key->pubkey.z, 1);
  9502. #ifdef WOLFSSL_CRYPTOCELL
  9503. if (err == MP_OKAY) {
  9504. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id));
  9505. /* create public key from external key buffer */
  9506. err = CRYS_ECPKI_BuildPublKeyFullCheck(pDomain,
  9507. (byte*)in-1, /* re-adjust */
  9508. inLen+1, /* original input */
  9509. &key->ctx.pubKey,
  9510. &tempBuff);
  9511. if (err != SA_SILIB_RET_OK){
  9512. WOLFSSL_MSG("CRYS_ECPKI_BuildPublKeyFullCheck failed");
  9513. }
  9514. }
  9515. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  9516. if (err == MP_OKAY)
  9517. err = silabs_ecc_import(key, keysize, 1, 0);
  9518. #elif defined(WOLFSSL_SE050)
  9519. if (err == MP_OKAY) {
  9520. /* reset key ID, in case used before */
  9521. key->keyId = 0;
  9522. key->keyIdSet = 0;
  9523. }
  9524. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  9525. #ifndef HAVE_COMP_KEY
  9526. if (err == MP_OKAY) {
  9527. #else
  9528. if (err == MP_OKAY && !compressed) {
  9529. #endif
  9530. buf_reverse(&key->keyRaw[0], &in[0], keysize);
  9531. buf_reverse(&key->keyRaw[keysize], &in[keysize], keysize);
  9532. }
  9533. #endif
  9534. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9535. if (err == MP_OKAY)
  9536. err = wc_ecc_check_key(key);
  9537. #endif
  9538. #ifdef WOLFSSL_MAXQ10XX_CRYPTO
  9539. if (err == MP_OKAY) {
  9540. err = wc_MAXQ10XX_EccSetKey(key, keysize);
  9541. }
  9542. #endif
  9543. if (err != MP_OKAY) {
  9544. mp_clear(key->pubkey.x);
  9545. mp_clear(key->pubkey.y);
  9546. mp_clear(key->pubkey.z);
  9547. mp_clear(key->k);
  9548. }
  9549. RESTORE_VECTOR_REGISTERS();
  9550. return err;
  9551. }
  9552. WOLFSSL_ABI
  9553. int wc_ecc_import_x963(const byte* in, word32 inLen, ecc_key* key)
  9554. {
  9555. return wc_ecc_import_x963_ex(in, inLen, key, ECC_CURVE_DEF);
  9556. }
  9557. #endif /* HAVE_ECC_KEY_IMPORT */
  9558. #ifdef HAVE_ECC_KEY_EXPORT
  9559. /* export ecc key to component form, d is optional if only exporting public
  9560. * encType is WC_TYPE_UNSIGNED_BIN or WC_TYPE_HEX_STR
  9561. * return MP_OKAY on success */
  9562. int wc_ecc_export_ex(ecc_key* key, byte* qx, word32* qxLen,
  9563. byte* qy, word32* qyLen, byte* d, word32* dLen, int encType)
  9564. {
  9565. int err = 0;
  9566. word32 keySz;
  9567. if (key == NULL) {
  9568. return BAD_FUNC_ARG;
  9569. }
  9570. if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) {
  9571. return ECC_BAD_ARG_E;
  9572. }
  9573. keySz = (word32)key->dp->size;
  9574. /* private key, d */
  9575. if (d != NULL) {
  9576. if (dLen == NULL ||
  9577. (key->type != ECC_PRIVATEKEY && key->type != ECC_PRIVATEKEY_ONLY))
  9578. return BAD_FUNC_ARG;
  9579. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  9580. /* Hardware cannot export private portion */
  9581. return NOT_COMPILED_IN;
  9582. #else
  9583. #if defined(WOLFSSL_SECO_CAAM)
  9584. if (key->blackKey > 0 && key->devId == WOLFSSL_SECO_DEVID) {
  9585. /* Hardware cannot export private portion */
  9586. WOLFSSL_MSG("Can not export private key from HSM");
  9587. return NOT_COMPILED_IN;
  9588. }
  9589. #endif
  9590. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  9591. if (key->blackKey == CAAM_BLACK_KEY_CCM) {
  9592. if (*dLen < keySz + WC_CAAM_MAC_SZ) {
  9593. *dLen = keySz + WC_CAAM_MAC_SZ;
  9594. return BUFFER_E;
  9595. }
  9596. err = wc_export_int(key->k, d, dLen, keySz + WC_CAAM_MAC_SZ,
  9597. encType);
  9598. *dLen = keySz + WC_CAAM_MAC_SZ;
  9599. }
  9600. else if (encType == WC_TYPE_BLACK_KEY &&
  9601. key->blackKey != CAAM_BLACK_KEY_ECB &&
  9602. key->blackKey > 0) {
  9603. if (*dLen < keySz + WC_CAAM_MAC_SZ) {
  9604. *dLen = keySz + WC_CAAM_MAC_SZ;
  9605. return BUFFER_E;
  9606. }
  9607. if (key->blackKey != CAAM_BLACK_KEY_CCM) {
  9608. if (caamReadPartition(key->blackKey, d, keySz + WC_CAAM_MAC_SZ) != 0)
  9609. return WC_HW_E;
  9610. }
  9611. *dLen = keySz + WC_CAAM_MAC_SZ;
  9612. }
  9613. else
  9614. #endif
  9615. {
  9616. err = wc_export_int(key->k, d, dLen, keySz, encType);
  9617. if (err != MP_OKAY)
  9618. return err;
  9619. }
  9620. #endif
  9621. }
  9622. /* public x component */
  9623. if (qx != NULL) {
  9624. if (qxLen == NULL || key->type == ECC_PRIVATEKEY_ONLY)
  9625. return BAD_FUNC_ARG;
  9626. err = wc_export_int(key->pubkey.x, qx, qxLen, keySz, encType);
  9627. if (err != MP_OKAY)
  9628. return err;
  9629. }
  9630. /* public y component */
  9631. if (qy != NULL) {
  9632. if (qyLen == NULL || key->type == ECC_PRIVATEKEY_ONLY)
  9633. return BAD_FUNC_ARG;
  9634. err = wc_export_int(key->pubkey.y, qy, qyLen, keySz, encType);
  9635. if (err != MP_OKAY)
  9636. return err;
  9637. }
  9638. return err;
  9639. }
  9640. /* export ecc private key only raw, outLen is in/out size as unsigned bin
  9641. return MP_OKAY on success */
  9642. WOLFSSL_ABI
  9643. int wc_ecc_export_private_only(ecc_key* key, byte* out, word32* outLen)
  9644. {
  9645. if (out == NULL || outLen == NULL) {
  9646. return BAD_FUNC_ARG;
  9647. }
  9648. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  9649. /* check if black key in secure memory */
  9650. if ((key->blackKey != CAAM_BLACK_KEY_CCM &&
  9651. key->blackKey != CAAM_BLACK_KEY_ECB) && key->blackKey > 0) {
  9652. return wc_ecc_export_ex(key, NULL, NULL, NULL, NULL, out, outLen,
  9653. WC_TYPE_BLACK_KEY);
  9654. }
  9655. #endif
  9656. return wc_ecc_export_ex(key, NULL, NULL, NULL, NULL, out, outLen,
  9657. WC_TYPE_UNSIGNED_BIN);
  9658. }
  9659. /* export public key to raw elements including public (Qx,Qy) as unsigned bin
  9660. * return MP_OKAY on success, negative on error */
  9661. int wc_ecc_export_public_raw(ecc_key* key, byte* qx, word32* qxLen,
  9662. byte* qy, word32* qyLen)
  9663. {
  9664. if (qx == NULL || qxLen == NULL || qy == NULL || qyLen == NULL) {
  9665. return BAD_FUNC_ARG;
  9666. }
  9667. return wc_ecc_export_ex(key, qx, qxLen, qy, qyLen, NULL, NULL,
  9668. WC_TYPE_UNSIGNED_BIN);
  9669. }
  9670. /* export ecc key to raw elements including public (Qx,Qy) and
  9671. * private (d) as unsigned bin
  9672. * return MP_OKAY on success, negative on error */
  9673. int wc_ecc_export_private_raw(ecc_key* key, byte* qx, word32* qxLen,
  9674. byte* qy, word32* qyLen, byte* d, word32* dLen)
  9675. {
  9676. return wc_ecc_export_ex(key, qx, qxLen, qy, qyLen, d, dLen,
  9677. WC_TYPE_UNSIGNED_BIN);
  9678. }
  9679. #endif /* HAVE_ECC_KEY_EXPORT */
  9680. #ifdef HAVE_ECC_KEY_IMPORT
  9681. /* import private key, public part optional if (pub) passed as NULL */
  9682. int wc_ecc_import_private_key_ex(const byte* priv, word32 privSz,
  9683. const byte* pub, word32 pubSz, ecc_key* key,
  9684. int curve_id)
  9685. {
  9686. int ret;
  9687. #ifdef WOLFSSL_CRYPTOCELL
  9688. const CRYS_ECPKI_Domain_t* pDomain;
  9689. #endif
  9690. if (key == NULL || priv == NULL)
  9691. return BAD_FUNC_ARG;
  9692. /* public optional, NULL if only importing private */
  9693. if (pub != NULL) {
  9694. #ifndef NO_ASN
  9695. word32 idx = 0;
  9696. ret = wc_ecc_import_x963_ex(pub, pubSz, key, curve_id);
  9697. if (ret < 0)
  9698. ret = wc_EccPublicKeyDecode(pub, &idx, key, pubSz);
  9699. key->type = ECC_PRIVATEKEY;
  9700. #else
  9701. (void)pubSz;
  9702. ret = NOT_COMPILED_IN;
  9703. #endif
  9704. }
  9705. else {
  9706. /* make sure required variables are reset */
  9707. wc_ecc_reset(key);
  9708. /* set key size */
  9709. ret = wc_ecc_set_curve(key, (int)privSz, curve_id);
  9710. key->type = ECC_PRIVATEKEY_ONLY;
  9711. }
  9712. if (ret != 0)
  9713. return ret;
  9714. #ifdef WOLFSSL_CRYPTOCELL
  9715. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id));
  9716. /* import private key - priv checked for NULL at top */
  9717. if (priv[0] != '\0') {
  9718. /* Create private key from external key buffer*/
  9719. ret = CRYS_ECPKI_BuildPrivKey(pDomain,
  9720. priv,
  9721. privSz,
  9722. &key->ctx.privKey);
  9723. if (ret != SA_SILIB_RET_OK) {
  9724. WOLFSSL_MSG("CRYS_ECPKI_BuildPrivKey failed");
  9725. return ret;
  9726. }
  9727. ret = mp_read_unsigned_bin(key->k, priv, privSz);
  9728. }
  9729. #elif defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  9730. if ((wc_ecc_size(key) + WC_CAAM_MAC_SZ) == (int)privSz) {
  9731. #ifdef WOLFSSL_CAAM_BLACK_KEY_SM
  9732. int part = caamFindUnusedPartition();
  9733. if (part >= 0) {
  9734. CAAM_ADDRESS vaddr = caamGetPartition(part, privSz*3);
  9735. if (vaddr == 0) {
  9736. WOLFSSL_MSG("Unable to get partition");
  9737. return MEMORY_E;
  9738. }
  9739. key->partNum = part;
  9740. key->blackKey = (word32)vaddr;
  9741. if (caamWriteToPartition(vaddr, priv, privSz) != 0)
  9742. return WC_HW_E;
  9743. if (pub != NULL) {
  9744. /* +1 to account for x963 compressed bit */
  9745. if (caamWriteToPartition(vaddr + privSz, pub + 1, pubSz - 1) != 0)
  9746. return WC_HW_E;
  9747. key->securePubKey = (word32)vaddr + privSz;
  9748. }
  9749. }
  9750. else {
  9751. WOLFSSL_MSG("Unable to find an unused partition");
  9752. return MEMORY_E;
  9753. }
  9754. #else
  9755. key->blackKey = CAAM_BLACK_KEY_CCM;
  9756. ret = mp_read_unsigned_bin(key->k, priv, privSz);
  9757. #endif
  9758. }
  9759. else {
  9760. key->blackKey = 0;
  9761. ret = mp_read_unsigned_bin(key->k, priv, privSz);
  9762. /* If using AES-ECB encrypted black keys check here if key is valid,
  9763. * if not valid than assume is an encrypted key. A public key is needed
  9764. * for testing validity. */
  9765. if (key->devId == WOLFSSL_CAAM_DEVID && (
  9766. wc_ecc_get_curve_id(key->idx) == ECC_SECP256R1 ||
  9767. wc_ecc_get_curve_id(key->idx) == ECC_SECP384R1)) {
  9768. if ((pub != NULL) && (ret == MP_OKAY) &&
  9769. (_ecc_validate_public_key(key, 1, 1) != MP_OKAY)) {
  9770. key->blackKey = CAAM_BLACK_KEY_ECB;
  9771. }
  9772. else if ((pub == NULL) && (ret == MP_OKAY)) {
  9773. WOLFSSL_MSG("Assuming encrypted key with no public key to check");
  9774. key->blackKey = CAAM_BLACK_KEY_ECB;
  9775. }
  9776. else {
  9777. WOLFSSL_MSG("Importing key that is not a black key!");
  9778. }
  9779. }
  9780. }
  9781. #else
  9782. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9783. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  9784. #endif
  9785. ret = mp_read_unsigned_bin(key->k, priv, privSz);
  9786. #ifdef HAVE_WOLF_BIGINT
  9787. if (ret == 0 &&
  9788. wc_bigint_from_unsigned_bin(&key->k->raw, priv, privSz) != 0) {
  9789. mp_clear(key->k);
  9790. ret = ASN_GETINT_E;
  9791. }
  9792. #endif /* HAVE_WOLF_BIGINT */
  9793. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9794. if (ret == 0) {
  9795. #ifdef WOLFSSL_SMALL_STACK
  9796. mp_int* order = NULL;
  9797. #else
  9798. mp_int order[1];
  9799. #endif
  9800. #ifdef WOLFSSL_SMALL_STACK
  9801. order = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  9802. if (order == NULL) {
  9803. ret = MEMORY_E;
  9804. }
  9805. #endif
  9806. if (ret == 0) {
  9807. ret = mp_init(order);
  9808. }
  9809. if (ret == 0) {
  9810. ret = mp_read_radix(order, key->dp->order, MP_RADIX_HEX);
  9811. }
  9812. #ifdef WOLFSSL_SM2
  9813. /* SM2 curve: private key must be less than order-1. */
  9814. if ((ret == 0) && (key->idx != ECC_CUSTOM_IDX) &&
  9815. (ecc_sets[key->idx].id == ECC_SM2P256V1)) {
  9816. ret = mp_sub_d(order, 1, order);
  9817. }
  9818. #endif
  9819. if ((ret == 0) && (mp_cmp(key->k, order) != MP_LT)) {
  9820. ret = ECC_PRIV_KEY_E;
  9821. }
  9822. #ifdef WOLFSSL_SMALL_STACK
  9823. XFREE(order, key->heap, DYNAMIC_TYPE_ECC);
  9824. #endif
  9825. }
  9826. #endif /* WOLFSSL_VALIDATE_ECC_IMPORT */
  9827. #endif /* WOLFSSL_CRYPTOCELL */
  9828. #if defined(WOLFSSL_VALIDATE_ECC_IMPORT) && !defined(WOLFSSL_KCAPI_ECC)
  9829. if ((pub != NULL) && (ret == MP_OKAY))
  9830. /* public key needed to perform key validation */
  9831. ret = _ecc_validate_public_key(key, 1, 1);
  9832. #endif
  9833. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9834. RESTORE_VECTOR_REGISTERS();
  9835. #endif
  9836. #ifdef WOLFSSL_MAXQ10XX_CRYPTO
  9837. if (ret == 0) {
  9838. ret = wc_MAXQ10XX_EccSetKey(key, key->dp->size);
  9839. }
  9840. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  9841. if (ret == 0) {
  9842. ret = silabs_ecc_import(key, key->dp->size, (pub != NULL), 1);
  9843. }
  9844. #endif
  9845. return ret;
  9846. }
  9847. /* ecc private key import, public key in ANSI X9.63 format, private raw */
  9848. WOLFSSL_ABI
  9849. int wc_ecc_import_private_key(const byte* priv, word32 privSz, const byte* pub,
  9850. word32 pubSz, ecc_key* key)
  9851. {
  9852. return wc_ecc_import_private_key_ex(priv, privSz, pub, pubSz, key,
  9853. ECC_CURVE_DEF);
  9854. }
  9855. #endif /* HAVE_ECC_KEY_IMPORT */
  9856. #ifndef NO_ASN
  9857. /**
  9858. Convert ECC R,S to signature
  9859. r R component of signature
  9860. s S component of signature
  9861. out DER-encoded ECDSA signature
  9862. outlen [in/out] output buffer size, output signature size
  9863. return MP_OKAY on success
  9864. */
  9865. WOLFSSL_ABI
  9866. int wc_ecc_rs_to_sig(const char* r, const char* s, byte* out, word32* outlen)
  9867. {
  9868. int err;
  9869. #ifdef WOLFSSL_SMALL_STACK
  9870. mp_int* rtmp = NULL;
  9871. mp_int* stmp = NULL;
  9872. #else
  9873. mp_int rtmp[1];
  9874. mp_int stmp[1];
  9875. #endif
  9876. if (r == NULL || s == NULL || out == NULL || outlen == NULL)
  9877. return ECC_BAD_ARG_E;
  9878. #ifdef WOLFSSL_SMALL_STACK
  9879. rtmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  9880. if (rtmp == NULL)
  9881. return MEMORY_E;
  9882. stmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  9883. if (stmp == NULL) {
  9884. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  9885. return MEMORY_E;
  9886. }
  9887. #endif
  9888. err = mp_init_multi(rtmp, stmp, NULL, NULL, NULL, NULL);
  9889. if (err != MP_OKAY) {
  9890. #ifdef WOLFSSL_SMALL_STACK
  9891. XFREE(stmp, NULL, DYNAMIC_TYPE_ECC);
  9892. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  9893. #endif
  9894. return err;
  9895. }
  9896. err = mp_read_radix(rtmp, r, MP_RADIX_HEX);
  9897. if (err == MP_OKAY)
  9898. err = mp_read_radix(stmp, s, MP_RADIX_HEX);
  9899. if (err == MP_OKAY) {
  9900. if (mp_iszero(rtmp) == MP_YES || mp_iszero(stmp) == MP_YES)
  9901. err = MP_ZERO_E;
  9902. }
  9903. if (err == MP_OKAY) {
  9904. if (mp_isneg(rtmp) == MP_YES || mp_isneg(stmp) == MP_YES) {
  9905. err = MP_READ_E;
  9906. }
  9907. }
  9908. /* convert mp_ints to ECDSA sig, initializes rtmp and stmp internally */
  9909. if (err == MP_OKAY)
  9910. err = StoreECC_DSA_Sig(out, outlen, rtmp, stmp);
  9911. mp_clear(rtmp);
  9912. mp_clear(stmp);
  9913. #ifdef WOLFSSL_SMALL_STACK
  9914. XFREE(stmp, NULL, DYNAMIC_TYPE_ECC);
  9915. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  9916. #endif
  9917. return err;
  9918. }
  9919. /**
  9920. Convert ECC R,S raw unsigned bin to signature
  9921. r R component of signature
  9922. rSz R size
  9923. s S component of signature
  9924. sSz S size
  9925. out DER-encoded ECDSA signature
  9926. outlen [in/out] output buffer size, output signature size
  9927. return MP_OKAY on success
  9928. */
  9929. int wc_ecc_rs_raw_to_sig(const byte* r, word32 rSz, const byte* s, word32 sSz,
  9930. byte* out, word32* outlen)
  9931. {
  9932. if (r == NULL || s == NULL || out == NULL || outlen == NULL)
  9933. return ECC_BAD_ARG_E;
  9934. /* convert mp_ints to ECDSA sig, initializes rtmp and stmp internally */
  9935. return StoreECC_DSA_Sig_Bin(out, outlen, r, rSz, s, sSz);
  9936. }
  9937. /**
  9938. Convert ECC signature to R,S
  9939. sig DER-encoded ECDSA signature
  9940. sigLen length of signature in octets
  9941. r R component of signature
  9942. rLen [in/out] output "r" buffer size, output "r" size
  9943. s S component of signature
  9944. sLen [in/out] output "s" buffer size, output "s" size
  9945. return MP_OKAY on success, negative on error
  9946. */
  9947. int wc_ecc_sig_to_rs(const byte* sig, word32 sigLen, byte* r, word32* rLen,
  9948. byte* s, word32* sLen)
  9949. {
  9950. if (sig == NULL || r == NULL || rLen == NULL || s == NULL || sLen == NULL)
  9951. return ECC_BAD_ARG_E;
  9952. return DecodeECC_DSA_Sig_Bin(sig, sigLen, r, rLen, s, sLen);
  9953. }
  9954. #endif /* !NO_ASN */
  9955. #ifdef HAVE_ECC_KEY_IMPORT
  9956. static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
  9957. const char* qy, const char* d, int curve_id, int encType)
  9958. {
  9959. int err = MP_OKAY;
  9960. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  9961. !defined(WOLFSSL_ATECC608A)
  9962. const CRYS_ECPKI_Domain_t* pDomain;
  9963. CRYS_ECPKI_BUILD_TempData_t tempBuff;
  9964. byte keyRaw[ECC_MAX_CRYPTO_HW_SIZE*2 + 1];
  9965. #endif
  9966. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  9967. defined(WOLFSSL_CRYPTOCELL)
  9968. word32 keySz = 0;
  9969. #endif
  9970. /* if d is NULL, only import as public key using Qx,Qy */
  9971. if (key == NULL || qx == NULL || qy == NULL) {
  9972. return BAD_FUNC_ARG;
  9973. }
  9974. /* make sure required variables are reset */
  9975. wc_ecc_reset(key);
  9976. /* set curve type and index */
  9977. err = wc_ecc_set_curve(key, 0, curve_id);
  9978. if (err != 0) {
  9979. return err;
  9980. }
  9981. /* init key */
  9982. #ifdef ALT_ECC_SIZE
  9983. key->pubkey.x = (mp_int*)&key->pubkey.xyz[0];
  9984. key->pubkey.y = (mp_int*)&key->pubkey.xyz[1];
  9985. key->pubkey.z = (mp_int*)&key->pubkey.xyz[2];
  9986. alt_fp_init(key->pubkey.x);
  9987. alt_fp_init(key->pubkey.y);
  9988. alt_fp_init(key->pubkey.z);
  9989. key->k = (mp_int*)key->ka;
  9990. alt_fp_init(key->k);
  9991. #else
  9992. err = mp_init_multi(key->k, key->pubkey.x, key->pubkey.y, key->pubkey.z,
  9993. NULL, NULL);
  9994. #endif
  9995. if (err != MP_OKAY)
  9996. return MEMORY_E;
  9997. /* read Qx */
  9998. if (err == MP_OKAY) {
  9999. if (encType == WC_TYPE_HEX_STR)
  10000. err = mp_read_radix(key->pubkey.x, qx, MP_RADIX_HEX);
  10001. else
  10002. err = mp_read_unsigned_bin(key->pubkey.x, (const byte*)qx,
  10003. (word32)key->dp->size);
  10004. if (mp_isneg(key->pubkey.x)) {
  10005. WOLFSSL_MSG("Invalid Qx");
  10006. err = BAD_FUNC_ARG;
  10007. }
  10008. if (mp_unsigned_bin_size(key->pubkey.x) > key->dp->size) {
  10009. err = BAD_FUNC_ARG;
  10010. }
  10011. }
  10012. /* read Qy */
  10013. if (err == MP_OKAY) {
  10014. if (encType == WC_TYPE_HEX_STR)
  10015. err = mp_read_radix(key->pubkey.y, qy, MP_RADIX_HEX);
  10016. else
  10017. err = mp_read_unsigned_bin(key->pubkey.y, (const byte*)qy,
  10018. (word32)key->dp->size);
  10019. if (mp_isneg(key->pubkey.y)) {
  10020. WOLFSSL_MSG("Invalid Qy");
  10021. err = BAD_FUNC_ARG;
  10022. }
  10023. if (mp_unsigned_bin_size(key->pubkey.y) > key->dp->size) {
  10024. err = BAD_FUNC_ARG;
  10025. }
  10026. }
  10027. if (err == MP_OKAY) {
  10028. if (mp_iszero(key->pubkey.x) && mp_iszero(key->pubkey.y)) {
  10029. WOLFSSL_MSG("Invalid Qx and Qy");
  10030. err = ECC_INF_E;
  10031. }
  10032. }
  10033. if (err == MP_OKAY)
  10034. err = mp_set(key->pubkey.z, 1);
  10035. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  10036. /* For SECP256R1 only save raw public key for hardware */
  10037. if (err == MP_OKAY && curve_id == ECC_SECP256R1) {
  10038. keySz = key->dp->size;
  10039. err = wc_export_int(key->pubkey.x, key->pubkey_raw,
  10040. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  10041. if (err == MP_OKAY)
  10042. err = wc_export_int(key->pubkey.y, &key->pubkey_raw[keySz],
  10043. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  10044. }
  10045. #elif defined(WOLFSSL_CRYPTOCELL)
  10046. if (err == MP_OKAY) {
  10047. keyRaw[0] = ECC_POINT_UNCOMP;
  10048. keySz = (word32)key->dp->size;
  10049. err = wc_export_int(key->pubkey.x, &keyRaw[1], &keySz, keySz,
  10050. WC_TYPE_UNSIGNED_BIN);
  10051. if (err == MP_OKAY) {
  10052. err = wc_export_int(key->pubkey.y, &keyRaw[1+keySz],
  10053. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  10054. }
  10055. if (err == MP_OKAY) {
  10056. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id));
  10057. /* create public key from external key buffer */
  10058. err = CRYS_ECPKI_BuildPublKeyFullCheck(pDomain,
  10059. keyRaw,
  10060. keySz*2 + 1,
  10061. &key->ctx.pubKey,
  10062. &tempBuff);
  10063. }
  10064. if (err != SA_SILIB_RET_OK){
  10065. WOLFSSL_MSG("CRYS_ECPKI_BuildPublKeyFullCheck failed");
  10066. return err;
  10067. }
  10068. }
  10069. #elif defined(WOLFSSL_KCAPI_ECC)
  10070. if (err == MP_OKAY) {
  10071. word32 keySz = key->dp->size;
  10072. err = wc_export_int(key->pubkey.x, key->pubkey_raw,
  10073. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  10074. if (err == MP_OKAY) {
  10075. err = wc_export_int(key->pubkey.y,
  10076. &key->pubkey_raw[keySz], &keySz, keySz,
  10077. WC_TYPE_UNSIGNED_BIN);
  10078. }
  10079. }
  10080. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  10081. if (err == MP_OKAY) {
  10082. const word32 keySize = key->dp->size;
  10083. word32 bufSize = sizeof(key->keyRaw);
  10084. err = wc_export_int(key->pubkey.x, key->keyRaw, &bufSize, keySize,
  10085. WC_TYPE_UNSIGNED_BIN);
  10086. if (err == MP_OKAY) {
  10087. const word32 offset = bufSize;
  10088. bufSize = sizeof(key->keyRaw) - offset;
  10089. err = wc_export_int(key->pubkey.y, &key->keyRaw[offset], &bufSize,
  10090. keySize, WC_TYPE_UNSIGNED_BIN);
  10091. }
  10092. if (err == MP_OKAY) {
  10093. mp_reverse(key->keyRaw, keySize);
  10094. mp_reverse(&key->keyRaw[keySize], keySize);
  10095. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->keyRaw),
  10096. keySize * 2);
  10097. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  10098. err = XSecure_EllipticValidateKey(&(key->xSec.cinst),
  10099. xil_curve_type[key->dp->id],
  10100. XIL_CAST_U64(key->keyRaw));
  10101. if (err) {
  10102. WOLFSSL_XIL_ERROR("Validation of ECC key failed", err);
  10103. err = WC_HW_E;
  10104. }
  10105. #endif
  10106. }
  10107. }
  10108. #endif
  10109. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  10110. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  10111. #endif
  10112. /* import private key */
  10113. if (err == MP_OKAY) {
  10114. if (d != NULL) {
  10115. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  10116. /* Hardware doesn't support loading private key */
  10117. err = NOT_COMPILED_IN;
  10118. #elif defined(WOLFSSL_CRYPTOCELL)
  10119. key->type = ECC_PRIVATEKEY;
  10120. if (encType == WC_TYPE_HEX_STR)
  10121. err = mp_read_radix(key->k, d, MP_RADIX_HEX);
  10122. else
  10123. err = mp_read_unsigned_bin(key->k, (const byte*)d,
  10124. key->dp->size);
  10125. if (err == MP_OKAY) {
  10126. err = wc_export_int(key->k, &keyRaw[0], &keySz, keySz,
  10127. WC_TYPE_UNSIGNED_BIN);
  10128. }
  10129. if (err == MP_OKAY) {
  10130. /* Create private key from external key buffer*/
  10131. err = CRYS_ECPKI_BuildPrivKey(pDomain,
  10132. keyRaw,
  10133. keySz,
  10134. &key->ctx.privKey);
  10135. if (err != SA_SILIB_RET_OK){
  10136. WOLFSSL_MSG("CRYS_ECPKI_BuildPrivKey failed");
  10137. return err;
  10138. }
  10139. }
  10140. #else
  10141. key->type = ECC_PRIVATEKEY;
  10142. if (encType == WC_TYPE_HEX_STR)
  10143. err = mp_read_radix(key->k, d, MP_RADIX_HEX);
  10144. else {
  10145. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  10146. if (key->blackKey == CAAM_BLACK_KEY_CCM) {
  10147. err = mp_read_unsigned_bin(key->k, (const byte*)d,
  10148. key->dp->size + WC_CAAM_MAC_SZ);
  10149. }
  10150. else
  10151. #endif /* WOLFSSL_QNX_CAAM */
  10152. {
  10153. err = mp_read_unsigned_bin(key->k, (const byte*)d,
  10154. (word32)key->dp->size);
  10155. }
  10156. }
  10157. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  10158. if (err == MP_OKAY) {
  10159. const word32 key_size = key->dp->size;
  10160. word32 buf_size = key_size;
  10161. err = wc_export_int(key->k, key->privKey,
  10162. &buf_size, key_size, WC_TYPE_UNSIGNED_BIN);
  10163. mp_reverse(key->privKey, key_size);
  10164. }
  10165. #endif
  10166. #endif /* #else-case of custom HW-specific implementations */
  10167. if (mp_iszero(key->k) || mp_isneg(key->k)) {
  10168. WOLFSSL_MSG("Invalid private key");
  10169. err = BAD_FUNC_ARG;
  10170. }
  10171. } else {
  10172. key->type = ECC_PUBLICKEY;
  10173. }
  10174. }
  10175. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  10176. if (err == MP_OKAY) {
  10177. err = wc_ecc_check_key(key);
  10178. if (err == IS_POINT_E && (mp_iszero(key->pubkey.x) ||
  10179. mp_iszero(key->pubkey.y))) {
  10180. err = BAD_FUNC_ARG;
  10181. }
  10182. }
  10183. #endif
  10184. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  10185. RESTORE_VECTOR_REGISTERS();
  10186. #endif
  10187. #ifdef WOLFSSL_MAXQ10XX_CRYPTO
  10188. if (err == MP_OKAY) {
  10189. err = wc_MAXQ10XX_EccSetKey(key, key->dp->size);
  10190. }
  10191. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  10192. if (err == MP_OKAY) {
  10193. err = silabs_ecc_import(key, key->dp->size, 1, (d != NULL));
  10194. }
  10195. #endif
  10196. if (err != MP_OKAY) {
  10197. mp_clear(key->pubkey.x);
  10198. mp_clear(key->pubkey.y);
  10199. mp_clear(key->pubkey.z);
  10200. mp_clear(key->k);
  10201. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  10202. ForceZero(key->keyRaw, sizeof(key->keyRaw));
  10203. #endif
  10204. }
  10205. return err;
  10206. }
  10207. /**
  10208. Import raw ECC key
  10209. key The destination ecc_key structure
  10210. qx x component of the public key, as ASCII hex string
  10211. qy y component of the public key, as ASCII hex string
  10212. d private key, as ASCII hex string, optional if importing public
  10213. key only
  10214. dp Custom ecc_set_type
  10215. return MP_OKAY on success
  10216. */
  10217. int wc_ecc_import_raw_ex(ecc_key* key, const char* qx, const char* qy,
  10218. const char* d, int curve_id)
  10219. {
  10220. return wc_ecc_import_raw_private(key, qx, qy, d, curve_id,
  10221. WC_TYPE_HEX_STR);
  10222. }
  10223. /* Import x, y and optional private (d) as unsigned binary */
  10224. int wc_ecc_import_unsigned(ecc_key* key, const byte* qx, const byte* qy,
  10225. const byte* d, int curve_id)
  10226. {
  10227. return wc_ecc_import_raw_private(key, (const char*)qx, (const char*)qy,
  10228. (const char*)d, curve_id, WC_TYPE_UNSIGNED_BIN);
  10229. }
  10230. /**
  10231. Import raw ECC key
  10232. key The destination ecc_key structure
  10233. qx x component of the public key, as ASCII hex string
  10234. qy y component of the public key, as ASCII hex string
  10235. d private key, as ASCII hex string, optional if importing public
  10236. key only
  10237. curveName ECC curve name, from ecc_sets[]
  10238. return MP_OKAY on success
  10239. */
  10240. WOLFSSL_ABI
  10241. int wc_ecc_import_raw(ecc_key* key, const char* qx, const char* qy,
  10242. const char* d, const char* curveName)
  10243. {
  10244. int err, x;
  10245. /* if d is NULL, only import as public key using Qx,Qy */
  10246. if (key == NULL || qx == NULL || qy == NULL || curveName == NULL) {
  10247. return BAD_FUNC_ARG;
  10248. }
  10249. /* set curve type and index */
  10250. for (x = 0; ecc_sets[x].size != 0; x++) {
  10251. if (XSTRNCMP(ecc_sets[x].name, curveName,
  10252. XSTRLEN(curveName)) == 0) {
  10253. break;
  10254. }
  10255. }
  10256. if (ecc_sets[x].size == 0) {
  10257. WOLFSSL_MSG("ecc_set curve name not found");
  10258. err = ASN_PARSE_E;
  10259. } else {
  10260. return wc_ecc_import_raw_private(key, qx, qy, d, ecc_sets[x].id,
  10261. WC_TYPE_HEX_STR);
  10262. }
  10263. return err;
  10264. }
  10265. #endif /* HAVE_ECC_KEY_IMPORT */
  10266. #if defined(HAVE_ECC_ENCRYPT) && !defined(WOLFSSL_ECIES_OLD)
  10267. /* public key size in octets */
  10268. static int ecc_public_key_size(ecc_key* key, word32* sz)
  10269. {
  10270. if (key == NULL || key->dp == NULL)
  10271. return BAD_FUNC_ARG;
  10272. /* 'Uncompressed' | x | y */
  10273. *sz = 1 + 2 * (word32)key->dp->size;
  10274. return 0;
  10275. }
  10276. #endif
  10277. /* key size in octets */
  10278. WOLFSSL_ABI
  10279. int wc_ecc_size(ecc_key* key)
  10280. {
  10281. if (key == NULL || key->dp == NULL)
  10282. return 0;
  10283. return key->dp->size;
  10284. }
  10285. /* maximum signature size based on key size */
  10286. WOLFSSL_ABI
  10287. int wc_ecc_sig_size_calc(int sz)
  10288. {
  10289. int maxSigSz = 0;
  10290. /* calculate based on key bits */
  10291. /* maximum possible signature header size is 7 bytes plus 2 bytes padding */
  10292. maxSigSz = (sz * 2) + SIG_HEADER_SZ + ECC_MAX_PAD_SZ;
  10293. /* if total length is less than 128 + SEQ(1)+LEN(1) then subtract 1 */
  10294. if (maxSigSz < (128 + 2)) {
  10295. maxSigSz -= 1;
  10296. }
  10297. return maxSigSz;
  10298. }
  10299. /* maximum signature size based on actual key curve */
  10300. WOLFSSL_ABI
  10301. int wc_ecc_sig_size(const ecc_key* key)
  10302. {
  10303. int maxSigSz;
  10304. int orderBits, keySz;
  10305. if (key == NULL || key->dp == NULL)
  10306. return 0;
  10307. /* the signature r and s will always be less than order */
  10308. /* if the order MSB (top bit of byte) is set then ASN encoding needs
  10309. extra byte for r and s, so add 2 */
  10310. keySz = key->dp->size;
  10311. orderBits = wc_ecc_get_curve_order_bit_count(key->dp);
  10312. if (orderBits > keySz * 8) {
  10313. keySz = (orderBits + 7) / 8;
  10314. }
  10315. /* maximum possible signature header size is 7 bytes */
  10316. maxSigSz = (keySz * 2) + SIG_HEADER_SZ;
  10317. if ((orderBits % 8) == 0) {
  10318. /* MSB can be set, so add 2 */
  10319. maxSigSz += ECC_MAX_PAD_SZ;
  10320. }
  10321. /* if total length is less than 128 + SEQ(1)+LEN(1) then subtract 1 */
  10322. if (maxSigSz < (128 + 2)) {
  10323. maxSigSz -= 1;
  10324. }
  10325. return maxSigSz;
  10326. }
  10327. #ifdef FP_ECC
  10328. /* fixed point ECC cache */
  10329. /* number of entries in the cache */
  10330. #ifndef FP_ENTRIES
  10331. #define FP_ENTRIES 15
  10332. #endif
  10333. /* number of bits in LUT */
  10334. #ifndef FP_LUT
  10335. #define FP_LUT 8U
  10336. #endif
  10337. #ifdef ECC_SHAMIR
  10338. /* Sharmir requires a bigger LUT, TAO */
  10339. #if (FP_LUT > 12) || (FP_LUT < 4)
  10340. #error FP_LUT must be between 4 and 12 inclusively
  10341. #endif
  10342. #else
  10343. #if (FP_LUT > 12) || (FP_LUT < 2)
  10344. #error FP_LUT must be between 2 and 12 inclusively
  10345. #endif
  10346. #endif
  10347. #if !defined(WOLFSSL_SP_MATH)
  10348. /** Our FP cache */
  10349. typedef struct {
  10350. ecc_point* g; /* cached COPY of base point */
  10351. ecc_point* LUT[1U<<FP_LUT]; /* fixed point lookup */
  10352. int LUT_set; /* flag to determine if the LUT has been computed */
  10353. mp_int mu; /* copy of the montgomery constant */
  10354. int lru_count; /* amount of times this entry has been used */
  10355. int lock; /* flag to indicate cache eviction */
  10356. /* permitted (0) or not (1) */
  10357. } fp_cache_t;
  10358. /* if HAVE_THREAD_LS this cache is per thread, no locking needed */
  10359. static THREAD_LS_T fp_cache_t fp_cache[FP_ENTRIES];
  10360. #ifndef HAVE_THREAD_LS
  10361. static volatile int initMutex = 0; /* prevent multiple mutex inits */
  10362. static wolfSSL_Mutex ecc_fp_lock;
  10363. #endif /* HAVE_THREAD_LS */
  10364. /* simple table to help direct the generation of the LUT */
  10365. static const struct {
  10366. int ham, terma, termb;
  10367. } lut_orders[] = {
  10368. { 0, 0, 0 }, { 1, 0, 0 }, { 1, 0, 0 }, { 2, 1, 2 }, { 1, 0, 0 }, { 2, 1, 4 }, { 2, 2, 4 }, { 3, 3, 4 },
  10369. { 1, 0, 0 }, { 2, 1, 8 }, { 2, 2, 8 }, { 3, 3, 8 }, { 2, 4, 8 }, { 3, 5, 8 }, { 3, 6, 8 }, { 4, 7, 8 },
  10370. { 1, 0, 0 }, { 2, 1, 16 }, { 2, 2, 16 }, { 3, 3, 16 }, { 2, 4, 16 }, { 3, 5, 16 }, { 3, 6, 16 }, { 4, 7, 16 },
  10371. { 2, 8, 16 }, { 3, 9, 16 }, { 3, 10, 16 }, { 4, 11, 16 }, { 3, 12, 16 }, { 4, 13, 16 }, { 4, 14, 16 }, { 5, 15, 16 },
  10372. { 1, 0, 0 }, { 2, 1, 32 }, { 2, 2, 32 }, { 3, 3, 32 }, { 2, 4, 32 }, { 3, 5, 32 }, { 3, 6, 32 }, { 4, 7, 32 },
  10373. { 2, 8, 32 }, { 3, 9, 32 }, { 3, 10, 32 }, { 4, 11, 32 }, { 3, 12, 32 }, { 4, 13, 32 }, { 4, 14, 32 }, { 5, 15, 32 },
  10374. { 2, 16, 32 }, { 3, 17, 32 }, { 3, 18, 32 }, { 4, 19, 32 }, { 3, 20, 32 }, { 4, 21, 32 }, { 4, 22, 32 }, { 5, 23, 32 },
  10375. { 3, 24, 32 }, { 4, 25, 32 }, { 4, 26, 32 }, { 5, 27, 32 }, { 4, 28, 32 }, { 5, 29, 32 }, { 5, 30, 32 }, { 6, 31, 32 },
  10376. #if FP_LUT > 6
  10377. { 1, 0, 0 }, { 2, 1, 64 }, { 2, 2, 64 }, { 3, 3, 64 }, { 2, 4, 64 }, { 3, 5, 64 }, { 3, 6, 64 }, { 4, 7, 64 },
  10378. { 2, 8, 64 }, { 3, 9, 64 }, { 3, 10, 64 }, { 4, 11, 64 }, { 3, 12, 64 }, { 4, 13, 64 }, { 4, 14, 64 }, { 5, 15, 64 },
  10379. { 2, 16, 64 }, { 3, 17, 64 }, { 3, 18, 64 }, { 4, 19, 64 }, { 3, 20, 64 }, { 4, 21, 64 }, { 4, 22, 64 }, { 5, 23, 64 },
  10380. { 3, 24, 64 }, { 4, 25, 64 }, { 4, 26, 64 }, { 5, 27, 64 }, { 4, 28, 64 }, { 5, 29, 64 }, { 5, 30, 64 }, { 6, 31, 64 },
  10381. { 2, 32, 64 }, { 3, 33, 64 }, { 3, 34, 64 }, { 4, 35, 64 }, { 3, 36, 64 }, { 4, 37, 64 }, { 4, 38, 64 }, { 5, 39, 64 },
  10382. { 3, 40, 64 }, { 4, 41, 64 }, { 4, 42, 64 }, { 5, 43, 64 }, { 4, 44, 64 }, { 5, 45, 64 }, { 5, 46, 64 }, { 6, 47, 64 },
  10383. { 3, 48, 64 }, { 4, 49, 64 }, { 4, 50, 64 }, { 5, 51, 64 }, { 4, 52, 64 }, { 5, 53, 64 }, { 5, 54, 64 }, { 6, 55, 64 },
  10384. { 4, 56, 64 }, { 5, 57, 64 }, { 5, 58, 64 }, { 6, 59, 64 }, { 5, 60, 64 }, { 6, 61, 64 }, { 6, 62, 64 }, { 7, 63, 64 },
  10385. #if FP_LUT > 7
  10386. { 1, 0, 0 }, { 2, 1, 128 }, { 2, 2, 128 }, { 3, 3, 128 }, { 2, 4, 128 }, { 3, 5, 128 }, { 3, 6, 128 }, { 4, 7, 128 },
  10387. { 2, 8, 128 }, { 3, 9, 128 }, { 3, 10, 128 }, { 4, 11, 128 }, { 3, 12, 128 }, { 4, 13, 128 }, { 4, 14, 128 }, { 5, 15, 128 },
  10388. { 2, 16, 128 }, { 3, 17, 128 }, { 3, 18, 128 }, { 4, 19, 128 }, { 3, 20, 128 }, { 4, 21, 128 }, { 4, 22, 128 }, { 5, 23, 128 },
  10389. { 3, 24, 128 }, { 4, 25, 128 }, { 4, 26, 128 }, { 5, 27, 128 }, { 4, 28, 128 }, { 5, 29, 128 }, { 5, 30, 128 }, { 6, 31, 128 },
  10390. { 2, 32, 128 }, { 3, 33, 128 }, { 3, 34, 128 }, { 4, 35, 128 }, { 3, 36, 128 }, { 4, 37, 128 }, { 4, 38, 128 }, { 5, 39, 128 },
  10391. { 3, 40, 128 }, { 4, 41, 128 }, { 4, 42, 128 }, { 5, 43, 128 }, { 4, 44, 128 }, { 5, 45, 128 }, { 5, 46, 128 }, { 6, 47, 128 },
  10392. { 3, 48, 128 }, { 4, 49, 128 }, { 4, 50, 128 }, { 5, 51, 128 }, { 4, 52, 128 }, { 5, 53, 128 }, { 5, 54, 128 }, { 6, 55, 128 },
  10393. { 4, 56, 128 }, { 5, 57, 128 }, { 5, 58, 128 }, { 6, 59, 128 }, { 5, 60, 128 }, { 6, 61, 128 }, { 6, 62, 128 }, { 7, 63, 128 },
  10394. { 2, 64, 128 }, { 3, 65, 128 }, { 3, 66, 128 }, { 4, 67, 128 }, { 3, 68, 128 }, { 4, 69, 128 }, { 4, 70, 128 }, { 5, 71, 128 },
  10395. { 3, 72, 128 }, { 4, 73, 128 }, { 4, 74, 128 }, { 5, 75, 128 }, { 4, 76, 128 }, { 5, 77, 128 }, { 5, 78, 128 }, { 6, 79, 128 },
  10396. { 3, 80, 128 }, { 4, 81, 128 }, { 4, 82, 128 }, { 5, 83, 128 }, { 4, 84, 128 }, { 5, 85, 128 }, { 5, 86, 128 }, { 6, 87, 128 },
  10397. { 4, 88, 128 }, { 5, 89, 128 }, { 5, 90, 128 }, { 6, 91, 128 }, { 5, 92, 128 }, { 6, 93, 128 }, { 6, 94, 128 }, { 7, 95, 128 },
  10398. { 3, 96, 128 }, { 4, 97, 128 }, { 4, 98, 128 }, { 5, 99, 128 }, { 4, 100, 128 }, { 5, 101, 128 }, { 5, 102, 128 }, { 6, 103, 128 },
  10399. { 4, 104, 128 }, { 5, 105, 128 }, { 5, 106, 128 }, { 6, 107, 128 }, { 5, 108, 128 }, { 6, 109, 128 }, { 6, 110, 128 }, { 7, 111, 128 },
  10400. { 4, 112, 128 }, { 5, 113, 128 }, { 5, 114, 128 }, { 6, 115, 128 }, { 5, 116, 128 }, { 6, 117, 128 }, { 6, 118, 128 }, { 7, 119, 128 },
  10401. { 5, 120, 128 }, { 6, 121, 128 }, { 6, 122, 128 }, { 7, 123, 128 }, { 6, 124, 128 }, { 7, 125, 128 }, { 7, 126, 128 }, { 8, 127, 128 },
  10402. #if FP_LUT > 8
  10403. { 1, 0, 0 }, { 2, 1, 256 }, { 2, 2, 256 }, { 3, 3, 256 }, { 2, 4, 256 }, { 3, 5, 256 }, { 3, 6, 256 }, { 4, 7, 256 },
  10404. { 2, 8, 256 }, { 3, 9, 256 }, { 3, 10, 256 }, { 4, 11, 256 }, { 3, 12, 256 }, { 4, 13, 256 }, { 4, 14, 256 }, { 5, 15, 256 },
  10405. { 2, 16, 256 }, { 3, 17, 256 }, { 3, 18, 256 }, { 4, 19, 256 }, { 3, 20, 256 }, { 4, 21, 256 }, { 4, 22, 256 }, { 5, 23, 256 },
  10406. { 3, 24, 256 }, { 4, 25, 256 }, { 4, 26, 256 }, { 5, 27, 256 }, { 4, 28, 256 }, { 5, 29, 256 }, { 5, 30, 256 }, { 6, 31, 256 },
  10407. { 2, 32, 256 }, { 3, 33, 256 }, { 3, 34, 256 }, { 4, 35, 256 }, { 3, 36, 256 }, { 4, 37, 256 }, { 4, 38, 256 }, { 5, 39, 256 },
  10408. { 3, 40, 256 }, { 4, 41, 256 }, { 4, 42, 256 }, { 5, 43, 256 }, { 4, 44, 256 }, { 5, 45, 256 }, { 5, 46, 256 }, { 6, 47, 256 },
  10409. { 3, 48, 256 }, { 4, 49, 256 }, { 4, 50, 256 }, { 5, 51, 256 }, { 4, 52, 256 }, { 5, 53, 256 }, { 5, 54, 256 }, { 6, 55, 256 },
  10410. { 4, 56, 256 }, { 5, 57, 256 }, { 5, 58, 256 }, { 6, 59, 256 }, { 5, 60, 256 }, { 6, 61, 256 }, { 6, 62, 256 }, { 7, 63, 256 },
  10411. { 2, 64, 256 }, { 3, 65, 256 }, { 3, 66, 256 }, { 4, 67, 256 }, { 3, 68, 256 }, { 4, 69, 256 }, { 4, 70, 256 }, { 5, 71, 256 },
  10412. { 3, 72, 256 }, { 4, 73, 256 }, { 4, 74, 256 }, { 5, 75, 256 }, { 4, 76, 256 }, { 5, 77, 256 }, { 5, 78, 256 }, { 6, 79, 256 },
  10413. { 3, 80, 256 }, { 4, 81, 256 }, { 4, 82, 256 }, { 5, 83, 256 }, { 4, 84, 256 }, { 5, 85, 256 }, { 5, 86, 256 }, { 6, 87, 256 },
  10414. { 4, 88, 256 }, { 5, 89, 256 }, { 5, 90, 256 }, { 6, 91, 256 }, { 5, 92, 256 }, { 6, 93, 256 }, { 6, 94, 256 }, { 7, 95, 256 },
  10415. { 3, 96, 256 }, { 4, 97, 256 }, { 4, 98, 256 }, { 5, 99, 256 }, { 4, 100, 256 }, { 5, 101, 256 }, { 5, 102, 256 }, { 6, 103, 256 },
  10416. { 4, 104, 256 }, { 5, 105, 256 }, { 5, 106, 256 }, { 6, 107, 256 }, { 5, 108, 256 }, { 6, 109, 256 }, { 6, 110, 256 }, { 7, 111, 256 },
  10417. { 4, 112, 256 }, { 5, 113, 256 }, { 5, 114, 256 }, { 6, 115, 256 }, { 5, 116, 256 }, { 6, 117, 256 }, { 6, 118, 256 }, { 7, 119, 256 },
  10418. { 5, 120, 256 }, { 6, 121, 256 }, { 6, 122, 256 }, { 7, 123, 256 }, { 6, 124, 256 }, { 7, 125, 256 }, { 7, 126, 256 }, { 8, 127, 256 },
  10419. { 2, 128, 256 }, { 3, 129, 256 }, { 3, 130, 256 }, { 4, 131, 256 }, { 3, 132, 256 }, { 4, 133, 256 }, { 4, 134, 256 }, { 5, 135, 256 },
  10420. { 3, 136, 256 }, { 4, 137, 256 }, { 4, 138, 256 }, { 5, 139, 256 }, { 4, 140, 256 }, { 5, 141, 256 }, { 5, 142, 256 }, { 6, 143, 256 },
  10421. { 3, 144, 256 }, { 4, 145, 256 }, { 4, 146, 256 }, { 5, 147, 256 }, { 4, 148, 256 }, { 5, 149, 256 }, { 5, 150, 256 }, { 6, 151, 256 },
  10422. { 4, 152, 256 }, { 5, 153, 256 }, { 5, 154, 256 }, { 6, 155, 256 }, { 5, 156, 256 }, { 6, 157, 256 }, { 6, 158, 256 }, { 7, 159, 256 },
  10423. { 3, 160, 256 }, { 4, 161, 256 }, { 4, 162, 256 }, { 5, 163, 256 }, { 4, 164, 256 }, { 5, 165, 256 }, { 5, 166, 256 }, { 6, 167, 256 },
  10424. { 4, 168, 256 }, { 5, 169, 256 }, { 5, 170, 256 }, { 6, 171, 256 }, { 5, 172, 256 }, { 6, 173, 256 }, { 6, 174, 256 }, { 7, 175, 256 },
  10425. { 4, 176, 256 }, { 5, 177, 256 }, { 5, 178, 256 }, { 6, 179, 256 }, { 5, 180, 256 }, { 6, 181, 256 }, { 6, 182, 256 }, { 7, 183, 256 },
  10426. { 5, 184, 256 }, { 6, 185, 256 }, { 6, 186, 256 }, { 7, 187, 256 }, { 6, 188, 256 }, { 7, 189, 256 }, { 7, 190, 256 }, { 8, 191, 256 },
  10427. { 3, 192, 256 }, { 4, 193, 256 }, { 4, 194, 256 }, { 5, 195, 256 }, { 4, 196, 256 }, { 5, 197, 256 }, { 5, 198, 256 }, { 6, 199, 256 },
  10428. { 4, 200, 256 }, { 5, 201, 256 }, { 5, 202, 256 }, { 6, 203, 256 }, { 5, 204, 256 }, { 6, 205, 256 }, { 6, 206, 256 }, { 7, 207, 256 },
  10429. { 4, 208, 256 }, { 5, 209, 256 }, { 5, 210, 256 }, { 6, 211, 256 }, { 5, 212, 256 }, { 6, 213, 256 }, { 6, 214, 256 }, { 7, 215, 256 },
  10430. { 5, 216, 256 }, { 6, 217, 256 }, { 6, 218, 256 }, { 7, 219, 256 }, { 6, 220, 256 }, { 7, 221, 256 }, { 7, 222, 256 }, { 8, 223, 256 },
  10431. { 4, 224, 256 }, { 5, 225, 256 }, { 5, 226, 256 }, { 6, 227, 256 }, { 5, 228, 256 }, { 6, 229, 256 }, { 6, 230, 256 }, { 7, 231, 256 },
  10432. { 5, 232, 256 }, { 6, 233, 256 }, { 6, 234, 256 }, { 7, 235, 256 }, { 6, 236, 256 }, { 7, 237, 256 }, { 7, 238, 256 }, { 8, 239, 256 },
  10433. { 5, 240, 256 }, { 6, 241, 256 }, { 6, 242, 256 }, { 7, 243, 256 }, { 6, 244, 256 }, { 7, 245, 256 }, { 7, 246, 256 }, { 8, 247, 256 },
  10434. { 6, 248, 256 }, { 7, 249, 256 }, { 7, 250, 256 }, { 8, 251, 256 }, { 7, 252, 256 }, { 8, 253, 256 }, { 8, 254, 256 }, { 9, 255, 256 },
  10435. #if FP_LUT > 9
  10436. { 1, 0, 0 }, { 2, 1, 512 }, { 2, 2, 512 }, { 3, 3, 512 }, { 2, 4, 512 }, { 3, 5, 512 }, { 3, 6, 512 }, { 4, 7, 512 },
  10437. { 2, 8, 512 }, { 3, 9, 512 }, { 3, 10, 512 }, { 4, 11, 512 }, { 3, 12, 512 }, { 4, 13, 512 }, { 4, 14, 512 }, { 5, 15, 512 },
  10438. { 2, 16, 512 }, { 3, 17, 512 }, { 3, 18, 512 }, { 4, 19, 512 }, { 3, 20, 512 }, { 4, 21, 512 }, { 4, 22, 512 }, { 5, 23, 512 },
  10439. { 3, 24, 512 }, { 4, 25, 512 }, { 4, 26, 512 }, { 5, 27, 512 }, { 4, 28, 512 }, { 5, 29, 512 }, { 5, 30, 512 }, { 6, 31, 512 },
  10440. { 2, 32, 512 }, { 3, 33, 512 }, { 3, 34, 512 }, { 4, 35, 512 }, { 3, 36, 512 }, { 4, 37, 512 }, { 4, 38, 512 }, { 5, 39, 512 },
  10441. { 3, 40, 512 }, { 4, 41, 512 }, { 4, 42, 512 }, { 5, 43, 512 }, { 4, 44, 512 }, { 5, 45, 512 }, { 5, 46, 512 }, { 6, 47, 512 },
  10442. { 3, 48, 512 }, { 4, 49, 512 }, { 4, 50, 512 }, { 5, 51, 512 }, { 4, 52, 512 }, { 5, 53, 512 }, { 5, 54, 512 }, { 6, 55, 512 },
  10443. { 4, 56, 512 }, { 5, 57, 512 }, { 5, 58, 512 }, { 6, 59, 512 }, { 5, 60, 512 }, { 6, 61, 512 }, { 6, 62, 512 }, { 7, 63, 512 },
  10444. { 2, 64, 512 }, { 3, 65, 512 }, { 3, 66, 512 }, { 4, 67, 512 }, { 3, 68, 512 }, { 4, 69, 512 }, { 4, 70, 512 }, { 5, 71, 512 },
  10445. { 3, 72, 512 }, { 4, 73, 512 }, { 4, 74, 512 }, { 5, 75, 512 }, { 4, 76, 512 }, { 5, 77, 512 }, { 5, 78, 512 }, { 6, 79, 512 },
  10446. { 3, 80, 512 }, { 4, 81, 512 }, { 4, 82, 512 }, { 5, 83, 512 }, { 4, 84, 512 }, { 5, 85, 512 }, { 5, 86, 512 }, { 6, 87, 512 },
  10447. { 4, 88, 512 }, { 5, 89, 512 }, { 5, 90, 512 }, { 6, 91, 512 }, { 5, 92, 512 }, { 6, 93, 512 }, { 6, 94, 512 }, { 7, 95, 512 },
  10448. { 3, 96, 512 }, { 4, 97, 512 }, { 4, 98, 512 }, { 5, 99, 512 }, { 4, 100, 512 }, { 5, 101, 512 }, { 5, 102, 512 }, { 6, 103, 512 },
  10449. { 4, 104, 512 }, { 5, 105, 512 }, { 5, 106, 512 }, { 6, 107, 512 }, { 5, 108, 512 }, { 6, 109, 512 }, { 6, 110, 512 }, { 7, 111, 512 },
  10450. { 4, 112, 512 }, { 5, 113, 512 }, { 5, 114, 512 }, { 6, 115, 512 }, { 5, 116, 512 }, { 6, 117, 512 }, { 6, 118, 512 }, { 7, 119, 512 },
  10451. { 5, 120, 512 }, { 6, 121, 512 }, { 6, 122, 512 }, { 7, 123, 512 }, { 6, 124, 512 }, { 7, 125, 512 }, { 7, 126, 512 }, { 8, 127, 512 },
  10452. { 2, 128, 512 }, { 3, 129, 512 }, { 3, 130, 512 }, { 4, 131, 512 }, { 3, 132, 512 }, { 4, 133, 512 }, { 4, 134, 512 }, { 5, 135, 512 },
  10453. { 3, 136, 512 }, { 4, 137, 512 }, { 4, 138, 512 }, { 5, 139, 512 }, { 4, 140, 512 }, { 5, 141, 512 }, { 5, 142, 512 }, { 6, 143, 512 },
  10454. { 3, 144, 512 }, { 4, 145, 512 }, { 4, 146, 512 }, { 5, 147, 512 }, { 4, 148, 512 }, { 5, 149, 512 }, { 5, 150, 512 }, { 6, 151, 512 },
  10455. { 4, 152, 512 }, { 5, 153, 512 }, { 5, 154, 512 }, { 6, 155, 512 }, { 5, 156, 512 }, { 6, 157, 512 }, { 6, 158, 512 }, { 7, 159, 512 },
  10456. { 3, 160, 512 }, { 4, 161, 512 }, { 4, 162, 512 }, { 5, 163, 512 }, { 4, 164, 512 }, { 5, 165, 512 }, { 5, 166, 512 }, { 6, 167, 512 },
  10457. { 4, 168, 512 }, { 5, 169, 512 }, { 5, 170, 512 }, { 6, 171, 512 }, { 5, 172, 512 }, { 6, 173, 512 }, { 6, 174, 512 }, { 7, 175, 512 },
  10458. { 4, 176, 512 }, { 5, 177, 512 }, { 5, 178, 512 }, { 6, 179, 512 }, { 5, 180, 512 }, { 6, 181, 512 }, { 6, 182, 512 }, { 7, 183, 512 },
  10459. { 5, 184, 512 }, { 6, 185, 512 }, { 6, 186, 512 }, { 7, 187, 512 }, { 6, 188, 512 }, { 7, 189, 512 }, { 7, 190, 512 }, { 8, 191, 512 },
  10460. { 3, 192, 512 }, { 4, 193, 512 }, { 4, 194, 512 }, { 5, 195, 512 }, { 4, 196, 512 }, { 5, 197, 512 }, { 5, 198, 512 }, { 6, 199, 512 },
  10461. { 4, 200, 512 }, { 5, 201, 512 }, { 5, 202, 512 }, { 6, 203, 512 }, { 5, 204, 512 }, { 6, 205, 512 }, { 6, 206, 512 }, { 7, 207, 512 },
  10462. { 4, 208, 512 }, { 5, 209, 512 }, { 5, 210, 512 }, { 6, 211, 512 }, { 5, 212, 512 }, { 6, 213, 512 }, { 6, 214, 512 }, { 7, 215, 512 },
  10463. { 5, 216, 512 }, { 6, 217, 512 }, { 6, 218, 512 }, { 7, 219, 512 }, { 6, 220, 512 }, { 7, 221, 512 }, { 7, 222, 512 }, { 8, 223, 512 },
  10464. { 4, 224, 512 }, { 5, 225, 512 }, { 5, 226, 512 }, { 6, 227, 512 }, { 5, 228, 512 }, { 6, 229, 512 }, { 6, 230, 512 }, { 7, 231, 512 },
  10465. { 5, 232, 512 }, { 6, 233, 512 }, { 6, 234, 512 }, { 7, 235, 512 }, { 6, 236, 512 }, { 7, 237, 512 }, { 7, 238, 512 }, { 8, 239, 512 },
  10466. { 5, 240, 512 }, { 6, 241, 512 }, { 6, 242, 512 }, { 7, 243, 512 }, { 6, 244, 512 }, { 7, 245, 512 }, { 7, 246, 512 }, { 8, 247, 512 },
  10467. { 6, 248, 512 }, { 7, 249, 512 }, { 7, 250, 512 }, { 8, 251, 512 }, { 7, 252, 512 }, { 8, 253, 512 }, { 8, 254, 512 }, { 9, 255, 512 },
  10468. { 2, 256, 512 }, { 3, 257, 512 }, { 3, 258, 512 }, { 4, 259, 512 }, { 3, 260, 512 }, { 4, 261, 512 }, { 4, 262, 512 }, { 5, 263, 512 },
  10469. { 3, 264, 512 }, { 4, 265, 512 }, { 4, 266, 512 }, { 5, 267, 512 }, { 4, 268, 512 }, { 5, 269, 512 }, { 5, 270, 512 }, { 6, 271, 512 },
  10470. { 3, 272, 512 }, { 4, 273, 512 }, { 4, 274, 512 }, { 5, 275, 512 }, { 4, 276, 512 }, { 5, 277, 512 }, { 5, 278, 512 }, { 6, 279, 512 },
  10471. { 4, 280, 512 }, { 5, 281, 512 }, { 5, 282, 512 }, { 6, 283, 512 }, { 5, 284, 512 }, { 6, 285, 512 }, { 6, 286, 512 }, { 7, 287, 512 },
  10472. { 3, 288, 512 }, { 4, 289, 512 }, { 4, 290, 512 }, { 5, 291, 512 }, { 4, 292, 512 }, { 5, 293, 512 }, { 5, 294, 512 }, { 6, 295, 512 },
  10473. { 4, 296, 512 }, { 5, 297, 512 }, { 5, 298, 512 }, { 6, 299, 512 }, { 5, 300, 512 }, { 6, 301, 512 }, { 6, 302, 512 }, { 7, 303, 512 },
  10474. { 4, 304, 512 }, { 5, 305, 512 }, { 5, 306, 512 }, { 6, 307, 512 }, { 5, 308, 512 }, { 6, 309, 512 }, { 6, 310, 512 }, { 7, 311, 512 },
  10475. { 5, 312, 512 }, { 6, 313, 512 }, { 6, 314, 512 }, { 7, 315, 512 }, { 6, 316, 512 }, { 7, 317, 512 }, { 7, 318, 512 }, { 8, 319, 512 },
  10476. { 3, 320, 512 }, { 4, 321, 512 }, { 4, 322, 512 }, { 5, 323, 512 }, { 4, 324, 512 }, { 5, 325, 512 }, { 5, 326, 512 }, { 6, 327, 512 },
  10477. { 4, 328, 512 }, { 5, 329, 512 }, { 5, 330, 512 }, { 6, 331, 512 }, { 5, 332, 512 }, { 6, 333, 512 }, { 6, 334, 512 }, { 7, 335, 512 },
  10478. { 4, 336, 512 }, { 5, 337, 512 }, { 5, 338, 512 }, { 6, 339, 512 }, { 5, 340, 512 }, { 6, 341, 512 }, { 6, 342, 512 }, { 7, 343, 512 },
  10479. { 5, 344, 512 }, { 6, 345, 512 }, { 6, 346, 512 }, { 7, 347, 512 }, { 6, 348, 512 }, { 7, 349, 512 }, { 7, 350, 512 }, { 8, 351, 512 },
  10480. { 4, 352, 512 }, { 5, 353, 512 }, { 5, 354, 512 }, { 6, 355, 512 }, { 5, 356, 512 }, { 6, 357, 512 }, { 6, 358, 512 }, { 7, 359, 512 },
  10481. { 5, 360, 512 }, { 6, 361, 512 }, { 6, 362, 512 }, { 7, 363, 512 }, { 6, 364, 512 }, { 7, 365, 512 }, { 7, 366, 512 }, { 8, 367, 512 },
  10482. { 5, 368, 512 }, { 6, 369, 512 }, { 6, 370, 512 }, { 7, 371, 512 }, { 6, 372, 512 }, { 7, 373, 512 }, { 7, 374, 512 }, { 8, 375, 512 },
  10483. { 6, 376, 512 }, { 7, 377, 512 }, { 7, 378, 512 }, { 8, 379, 512 }, { 7, 380, 512 }, { 8, 381, 512 }, { 8, 382, 512 }, { 9, 383, 512 },
  10484. { 3, 384, 512 }, { 4, 385, 512 }, { 4, 386, 512 }, { 5, 387, 512 }, { 4, 388, 512 }, { 5, 389, 512 }, { 5, 390, 512 }, { 6, 391, 512 },
  10485. { 4, 392, 512 }, { 5, 393, 512 }, { 5, 394, 512 }, { 6, 395, 512 }, { 5, 396, 512 }, { 6, 397, 512 }, { 6, 398, 512 }, { 7, 399, 512 },
  10486. { 4, 400, 512 }, { 5, 401, 512 }, { 5, 402, 512 }, { 6, 403, 512 }, { 5, 404, 512 }, { 6, 405, 512 }, { 6, 406, 512 }, { 7, 407, 512 },
  10487. { 5, 408, 512 }, { 6, 409, 512 }, { 6, 410, 512 }, { 7, 411, 512 }, { 6, 412, 512 }, { 7, 413, 512 }, { 7, 414, 512 }, { 8, 415, 512 },
  10488. { 4, 416, 512 }, { 5, 417, 512 }, { 5, 418, 512 }, { 6, 419, 512 }, { 5, 420, 512 }, { 6, 421, 512 }, { 6, 422, 512 }, { 7, 423, 512 },
  10489. { 5, 424, 512 }, { 6, 425, 512 }, { 6, 426, 512 }, { 7, 427, 512 }, { 6, 428, 512 }, { 7, 429, 512 }, { 7, 430, 512 }, { 8, 431, 512 },
  10490. { 5, 432, 512 }, { 6, 433, 512 }, { 6, 434, 512 }, { 7, 435, 512 }, { 6, 436, 512 }, { 7, 437, 512 }, { 7, 438, 512 }, { 8, 439, 512 },
  10491. { 6, 440, 512 }, { 7, 441, 512 }, { 7, 442, 512 }, { 8, 443, 512 }, { 7, 444, 512 }, { 8, 445, 512 }, { 8, 446, 512 }, { 9, 447, 512 },
  10492. { 4, 448, 512 }, { 5, 449, 512 }, { 5, 450, 512 }, { 6, 451, 512 }, { 5, 452, 512 }, { 6, 453, 512 }, { 6, 454, 512 }, { 7, 455, 512 },
  10493. { 5, 456, 512 }, { 6, 457, 512 }, { 6, 458, 512 }, { 7, 459, 512 }, { 6, 460, 512 }, { 7, 461, 512 }, { 7, 462, 512 }, { 8, 463, 512 },
  10494. { 5, 464, 512 }, { 6, 465, 512 }, { 6, 466, 512 }, { 7, 467, 512 }, { 6, 468, 512 }, { 7, 469, 512 }, { 7, 470, 512 }, { 8, 471, 512 },
  10495. { 6, 472, 512 }, { 7, 473, 512 }, { 7, 474, 512 }, { 8, 475, 512 }, { 7, 476, 512 }, { 8, 477, 512 }, { 8, 478, 512 }, { 9, 479, 512 },
  10496. { 5, 480, 512 }, { 6, 481, 512 }, { 6, 482, 512 }, { 7, 483, 512 }, { 6, 484, 512 }, { 7, 485, 512 }, { 7, 486, 512 }, { 8, 487, 512 },
  10497. { 6, 488, 512 }, { 7, 489, 512 }, { 7, 490, 512 }, { 8, 491, 512 }, { 7, 492, 512 }, { 8, 493, 512 }, { 8, 494, 512 }, { 9, 495, 512 },
  10498. { 6, 496, 512 }, { 7, 497, 512 }, { 7, 498, 512 }, { 8, 499, 512 }, { 7, 500, 512 }, { 8, 501, 512 }, { 8, 502, 512 }, { 9, 503, 512 },
  10499. { 7, 504, 512 }, { 8, 505, 512 }, { 8, 506, 512 }, { 9, 507, 512 }, { 8, 508, 512 }, { 9, 509, 512 }, { 9, 510, 512 }, { 10, 511, 512 },
  10500. #if FP_LUT > 10
  10501. { 1, 0, 0 }, { 2, 1, 1024 }, { 2, 2, 1024 }, { 3, 3, 1024 }, { 2, 4, 1024 }, { 3, 5, 1024 }, { 3, 6, 1024 }, { 4, 7, 1024 },
  10502. { 2, 8, 1024 }, { 3, 9, 1024 }, { 3, 10, 1024 }, { 4, 11, 1024 }, { 3, 12, 1024 }, { 4, 13, 1024 }, { 4, 14, 1024 }, { 5, 15, 1024 },
  10503. { 2, 16, 1024 }, { 3, 17, 1024 }, { 3, 18, 1024 }, { 4, 19, 1024 }, { 3, 20, 1024 }, { 4, 21, 1024 }, { 4, 22, 1024 }, { 5, 23, 1024 },
  10504. { 3, 24, 1024 }, { 4, 25, 1024 }, { 4, 26, 1024 }, { 5, 27, 1024 }, { 4, 28, 1024 }, { 5, 29, 1024 }, { 5, 30, 1024 }, { 6, 31, 1024 },
  10505. { 2, 32, 1024 }, { 3, 33, 1024 }, { 3, 34, 1024 }, { 4, 35, 1024 }, { 3, 36, 1024 }, { 4, 37, 1024 }, { 4, 38, 1024 }, { 5, 39, 1024 },
  10506. { 3, 40, 1024 }, { 4, 41, 1024 }, { 4, 42, 1024 }, { 5, 43, 1024 }, { 4, 44, 1024 }, { 5, 45, 1024 }, { 5, 46, 1024 }, { 6, 47, 1024 },
  10507. { 3, 48, 1024 }, { 4, 49, 1024 }, { 4, 50, 1024 }, { 5, 51, 1024 }, { 4, 52, 1024 }, { 5, 53, 1024 }, { 5, 54, 1024 }, { 6, 55, 1024 },
  10508. { 4, 56, 1024 }, { 5, 57, 1024 }, { 5, 58, 1024 }, { 6, 59, 1024 }, { 5, 60, 1024 }, { 6, 61, 1024 }, { 6, 62, 1024 }, { 7, 63, 1024 },
  10509. { 2, 64, 1024 }, { 3, 65, 1024 }, { 3, 66, 1024 }, { 4, 67, 1024 }, { 3, 68, 1024 }, { 4, 69, 1024 }, { 4, 70, 1024 }, { 5, 71, 1024 },
  10510. { 3, 72, 1024 }, { 4, 73, 1024 }, { 4, 74, 1024 }, { 5, 75, 1024 }, { 4, 76, 1024 }, { 5, 77, 1024 }, { 5, 78, 1024 }, { 6, 79, 1024 },
  10511. { 3, 80, 1024 }, { 4, 81, 1024 }, { 4, 82, 1024 }, { 5, 83, 1024 }, { 4, 84, 1024 }, { 5, 85, 1024 }, { 5, 86, 1024 }, { 6, 87, 1024 },
  10512. { 4, 88, 1024 }, { 5, 89, 1024 }, { 5, 90, 1024 }, { 6, 91, 1024 }, { 5, 92, 1024 }, { 6, 93, 1024 }, { 6, 94, 1024 }, { 7, 95, 1024 },
  10513. { 3, 96, 1024 }, { 4, 97, 1024 }, { 4, 98, 1024 }, { 5, 99, 1024 }, { 4, 100, 1024 }, { 5, 101, 1024 }, { 5, 102, 1024 }, { 6, 103, 1024 },
  10514. { 4, 104, 1024 }, { 5, 105, 1024 }, { 5, 106, 1024 }, { 6, 107, 1024 }, { 5, 108, 1024 }, { 6, 109, 1024 }, { 6, 110, 1024 }, { 7, 111, 1024 },
  10515. { 4, 112, 1024 }, { 5, 113, 1024 }, { 5, 114, 1024 }, { 6, 115, 1024 }, { 5, 116, 1024 }, { 6, 117, 1024 }, { 6, 118, 1024 }, { 7, 119, 1024 },
  10516. { 5, 120, 1024 }, { 6, 121, 1024 }, { 6, 122, 1024 }, { 7, 123, 1024 }, { 6, 124, 1024 }, { 7, 125, 1024 }, { 7, 126, 1024 }, { 8, 127, 1024 },
  10517. { 2, 128, 1024 }, { 3, 129, 1024 }, { 3, 130, 1024 }, { 4, 131, 1024 }, { 3, 132, 1024 }, { 4, 133, 1024 }, { 4, 134, 1024 }, { 5, 135, 1024 },
  10518. { 3, 136, 1024 }, { 4, 137, 1024 }, { 4, 138, 1024 }, { 5, 139, 1024 }, { 4, 140, 1024 }, { 5, 141, 1024 }, { 5, 142, 1024 }, { 6, 143, 1024 },
  10519. { 3, 144, 1024 }, { 4, 145, 1024 }, { 4, 146, 1024 }, { 5, 147, 1024 }, { 4, 148, 1024 }, { 5, 149, 1024 }, { 5, 150, 1024 }, { 6, 151, 1024 },
  10520. { 4, 152, 1024 }, { 5, 153, 1024 }, { 5, 154, 1024 }, { 6, 155, 1024 }, { 5, 156, 1024 }, { 6, 157, 1024 }, { 6, 158, 1024 }, { 7, 159, 1024 },
  10521. { 3, 160, 1024 }, { 4, 161, 1024 }, { 4, 162, 1024 }, { 5, 163, 1024 }, { 4, 164, 1024 }, { 5, 165, 1024 }, { 5, 166, 1024 }, { 6, 167, 1024 },
  10522. { 4, 168, 1024 }, { 5, 169, 1024 }, { 5, 170, 1024 }, { 6, 171, 1024 }, { 5, 172, 1024 }, { 6, 173, 1024 }, { 6, 174, 1024 }, { 7, 175, 1024 },
  10523. { 4, 176, 1024 }, { 5, 177, 1024 }, { 5, 178, 1024 }, { 6, 179, 1024 }, { 5, 180, 1024 }, { 6, 181, 1024 }, { 6, 182, 1024 }, { 7, 183, 1024 },
  10524. { 5, 184, 1024 }, { 6, 185, 1024 }, { 6, 186, 1024 }, { 7, 187, 1024 }, { 6, 188, 1024 }, { 7, 189, 1024 }, { 7, 190, 1024 }, { 8, 191, 1024 },
  10525. { 3, 192, 1024 }, { 4, 193, 1024 }, { 4, 194, 1024 }, { 5, 195, 1024 }, { 4, 196, 1024 }, { 5, 197, 1024 }, { 5, 198, 1024 }, { 6, 199, 1024 },
  10526. { 4, 200, 1024 }, { 5, 201, 1024 }, { 5, 202, 1024 }, { 6, 203, 1024 }, { 5, 204, 1024 }, { 6, 205, 1024 }, { 6, 206, 1024 }, { 7, 207, 1024 },
  10527. { 4, 208, 1024 }, { 5, 209, 1024 }, { 5, 210, 1024 }, { 6, 211, 1024 }, { 5, 212, 1024 }, { 6, 213, 1024 }, { 6, 214, 1024 }, { 7, 215, 1024 },
  10528. { 5, 216, 1024 }, { 6, 217, 1024 }, { 6, 218, 1024 }, { 7, 219, 1024 }, { 6, 220, 1024 }, { 7, 221, 1024 }, { 7, 222, 1024 }, { 8, 223, 1024 },
  10529. { 4, 224, 1024 }, { 5, 225, 1024 }, { 5, 226, 1024 }, { 6, 227, 1024 }, { 5, 228, 1024 }, { 6, 229, 1024 }, { 6, 230, 1024 }, { 7, 231, 1024 },
  10530. { 5, 232, 1024 }, { 6, 233, 1024 }, { 6, 234, 1024 }, { 7, 235, 1024 }, { 6, 236, 1024 }, { 7, 237, 1024 }, { 7, 238, 1024 }, { 8, 239, 1024 },
  10531. { 5, 240, 1024 }, { 6, 241, 1024 }, { 6, 242, 1024 }, { 7, 243, 1024 }, { 6, 244, 1024 }, { 7, 245, 1024 }, { 7, 246, 1024 }, { 8, 247, 1024 },
  10532. { 6, 248, 1024 }, { 7, 249, 1024 }, { 7, 250, 1024 }, { 8, 251, 1024 }, { 7, 252, 1024 }, { 8, 253, 1024 }, { 8, 254, 1024 }, { 9, 255, 1024 },
  10533. { 2, 256, 1024 }, { 3, 257, 1024 }, { 3, 258, 1024 }, { 4, 259, 1024 }, { 3, 260, 1024 }, { 4, 261, 1024 }, { 4, 262, 1024 }, { 5, 263, 1024 },
  10534. { 3, 264, 1024 }, { 4, 265, 1024 }, { 4, 266, 1024 }, { 5, 267, 1024 }, { 4, 268, 1024 }, { 5, 269, 1024 }, { 5, 270, 1024 }, { 6, 271, 1024 },
  10535. { 3, 272, 1024 }, { 4, 273, 1024 }, { 4, 274, 1024 }, { 5, 275, 1024 }, { 4, 276, 1024 }, { 5, 277, 1024 }, { 5, 278, 1024 }, { 6, 279, 1024 },
  10536. { 4, 280, 1024 }, { 5, 281, 1024 }, { 5, 282, 1024 }, { 6, 283, 1024 }, { 5, 284, 1024 }, { 6, 285, 1024 }, { 6, 286, 1024 }, { 7, 287, 1024 },
  10537. { 3, 288, 1024 }, { 4, 289, 1024 }, { 4, 290, 1024 }, { 5, 291, 1024 }, { 4, 292, 1024 }, { 5, 293, 1024 }, { 5, 294, 1024 }, { 6, 295, 1024 },
  10538. { 4, 296, 1024 }, { 5, 297, 1024 }, { 5, 298, 1024 }, { 6, 299, 1024 }, { 5, 300, 1024 }, { 6, 301, 1024 }, { 6, 302, 1024 }, { 7, 303, 1024 },
  10539. { 4, 304, 1024 }, { 5, 305, 1024 }, { 5, 306, 1024 }, { 6, 307, 1024 }, { 5, 308, 1024 }, { 6, 309, 1024 }, { 6, 310, 1024 }, { 7, 311, 1024 },
  10540. { 5, 312, 1024 }, { 6, 313, 1024 }, { 6, 314, 1024 }, { 7, 315, 1024 }, { 6, 316, 1024 }, { 7, 317, 1024 }, { 7, 318, 1024 }, { 8, 319, 1024 },
  10541. { 3, 320, 1024 }, { 4, 321, 1024 }, { 4, 322, 1024 }, { 5, 323, 1024 }, { 4, 324, 1024 }, { 5, 325, 1024 }, { 5, 326, 1024 }, { 6, 327, 1024 },
  10542. { 4, 328, 1024 }, { 5, 329, 1024 }, { 5, 330, 1024 }, { 6, 331, 1024 }, { 5, 332, 1024 }, { 6, 333, 1024 }, { 6, 334, 1024 }, { 7, 335, 1024 },
  10543. { 4, 336, 1024 }, { 5, 337, 1024 }, { 5, 338, 1024 }, { 6, 339, 1024 }, { 5, 340, 1024 }, { 6, 341, 1024 }, { 6, 342, 1024 }, { 7, 343, 1024 },
  10544. { 5, 344, 1024 }, { 6, 345, 1024 }, { 6, 346, 1024 }, { 7, 347, 1024 }, { 6, 348, 1024 }, { 7, 349, 1024 }, { 7, 350, 1024 }, { 8, 351, 1024 },
  10545. { 4, 352, 1024 }, { 5, 353, 1024 }, { 5, 354, 1024 }, { 6, 355, 1024 }, { 5, 356, 1024 }, { 6, 357, 1024 }, { 6, 358, 1024 }, { 7, 359, 1024 },
  10546. { 5, 360, 1024 }, { 6, 361, 1024 }, { 6, 362, 1024 }, { 7, 363, 1024 }, { 6, 364, 1024 }, { 7, 365, 1024 }, { 7, 366, 1024 }, { 8, 367, 1024 },
  10547. { 5, 368, 1024 }, { 6, 369, 1024 }, { 6, 370, 1024 }, { 7, 371, 1024 }, { 6, 372, 1024 }, { 7, 373, 1024 }, { 7, 374, 1024 }, { 8, 375, 1024 },
  10548. { 6, 376, 1024 }, { 7, 377, 1024 }, { 7, 378, 1024 }, { 8, 379, 1024 }, { 7, 380, 1024 }, { 8, 381, 1024 }, { 8, 382, 1024 }, { 9, 383, 1024 },
  10549. { 3, 384, 1024 }, { 4, 385, 1024 }, { 4, 386, 1024 }, { 5, 387, 1024 }, { 4, 388, 1024 }, { 5, 389, 1024 }, { 5, 390, 1024 }, { 6, 391, 1024 },
  10550. { 4, 392, 1024 }, { 5, 393, 1024 }, { 5, 394, 1024 }, { 6, 395, 1024 }, { 5, 396, 1024 }, { 6, 397, 1024 }, { 6, 398, 1024 }, { 7, 399, 1024 },
  10551. { 4, 400, 1024 }, { 5, 401, 1024 }, { 5, 402, 1024 }, { 6, 403, 1024 }, { 5, 404, 1024 }, { 6, 405, 1024 }, { 6, 406, 1024 }, { 7, 407, 1024 },
  10552. { 5, 408, 1024 }, { 6, 409, 1024 }, { 6, 410, 1024 }, { 7, 411, 1024 }, { 6, 412, 1024 }, { 7, 413, 1024 }, { 7, 414, 1024 }, { 8, 415, 1024 },
  10553. { 4, 416, 1024 }, { 5, 417, 1024 }, { 5, 418, 1024 }, { 6, 419, 1024 }, { 5, 420, 1024 }, { 6, 421, 1024 }, { 6, 422, 1024 }, { 7, 423, 1024 },
  10554. { 5, 424, 1024 }, { 6, 425, 1024 }, { 6, 426, 1024 }, { 7, 427, 1024 }, { 6, 428, 1024 }, { 7, 429, 1024 }, { 7, 430, 1024 }, { 8, 431, 1024 },
  10555. { 5, 432, 1024 }, { 6, 433, 1024 }, { 6, 434, 1024 }, { 7, 435, 1024 }, { 6, 436, 1024 }, { 7, 437, 1024 }, { 7, 438, 1024 }, { 8, 439, 1024 },
  10556. { 6, 440, 1024 }, { 7, 441, 1024 }, { 7, 442, 1024 }, { 8, 443, 1024 }, { 7, 444, 1024 }, { 8, 445, 1024 }, { 8, 446, 1024 }, { 9, 447, 1024 },
  10557. { 4, 448, 1024 }, { 5, 449, 1024 }, { 5, 450, 1024 }, { 6, 451, 1024 }, { 5, 452, 1024 }, { 6, 453, 1024 }, { 6, 454, 1024 }, { 7, 455, 1024 },
  10558. { 5, 456, 1024 }, { 6, 457, 1024 }, { 6, 458, 1024 }, { 7, 459, 1024 }, { 6, 460, 1024 }, { 7, 461, 1024 }, { 7, 462, 1024 }, { 8, 463, 1024 },
  10559. { 5, 464, 1024 }, { 6, 465, 1024 }, { 6, 466, 1024 }, { 7, 467, 1024 }, { 6, 468, 1024 }, { 7, 469, 1024 }, { 7, 470, 1024 }, { 8, 471, 1024 },
  10560. { 6, 472, 1024 }, { 7, 473, 1024 }, { 7, 474, 1024 }, { 8, 475, 1024 }, { 7, 476, 1024 }, { 8, 477, 1024 }, { 8, 478, 1024 }, { 9, 479, 1024 },
  10561. { 5, 480, 1024 }, { 6, 481, 1024 }, { 6, 482, 1024 }, { 7, 483, 1024 }, { 6, 484, 1024 }, { 7, 485, 1024 }, { 7, 486, 1024 }, { 8, 487, 1024 },
  10562. { 6, 488, 1024 }, { 7, 489, 1024 }, { 7, 490, 1024 }, { 8, 491, 1024 }, { 7, 492, 1024 }, { 8, 493, 1024 }, { 8, 494, 1024 }, { 9, 495, 1024 },
  10563. { 6, 496, 1024 }, { 7, 497, 1024 }, { 7, 498, 1024 }, { 8, 499, 1024 }, { 7, 500, 1024 }, { 8, 501, 1024 }, { 8, 502, 1024 }, { 9, 503, 1024 },
  10564. { 7, 504, 1024 }, { 8, 505, 1024 }, { 8, 506, 1024 }, { 9, 507, 1024 }, { 8, 508, 1024 }, { 9, 509, 1024 }, { 9, 510, 1024 }, { 10, 511, 1024 },
  10565. { 2, 512, 1024 }, { 3, 513, 1024 }, { 3, 514, 1024 }, { 4, 515, 1024 }, { 3, 516, 1024 }, { 4, 517, 1024 }, { 4, 518, 1024 }, { 5, 519, 1024 },
  10566. { 3, 520, 1024 }, { 4, 521, 1024 }, { 4, 522, 1024 }, { 5, 523, 1024 }, { 4, 524, 1024 }, { 5, 525, 1024 }, { 5, 526, 1024 }, { 6, 527, 1024 },
  10567. { 3, 528, 1024 }, { 4, 529, 1024 }, { 4, 530, 1024 }, { 5, 531, 1024 }, { 4, 532, 1024 }, { 5, 533, 1024 }, { 5, 534, 1024 }, { 6, 535, 1024 },
  10568. { 4, 536, 1024 }, { 5, 537, 1024 }, { 5, 538, 1024 }, { 6, 539, 1024 }, { 5, 540, 1024 }, { 6, 541, 1024 }, { 6, 542, 1024 }, { 7, 543, 1024 },
  10569. { 3, 544, 1024 }, { 4, 545, 1024 }, { 4, 546, 1024 }, { 5, 547, 1024 }, { 4, 548, 1024 }, { 5, 549, 1024 }, { 5, 550, 1024 }, { 6, 551, 1024 },
  10570. { 4, 552, 1024 }, { 5, 553, 1024 }, { 5, 554, 1024 }, { 6, 555, 1024 }, { 5, 556, 1024 }, { 6, 557, 1024 }, { 6, 558, 1024 }, { 7, 559, 1024 },
  10571. { 4, 560, 1024 }, { 5, 561, 1024 }, { 5, 562, 1024 }, { 6, 563, 1024 }, { 5, 564, 1024 }, { 6, 565, 1024 }, { 6, 566, 1024 }, { 7, 567, 1024 },
  10572. { 5, 568, 1024 }, { 6, 569, 1024 }, { 6, 570, 1024 }, { 7, 571, 1024 }, { 6, 572, 1024 }, { 7, 573, 1024 }, { 7, 574, 1024 }, { 8, 575, 1024 },
  10573. { 3, 576, 1024 }, { 4, 577, 1024 }, { 4, 578, 1024 }, { 5, 579, 1024 }, { 4, 580, 1024 }, { 5, 581, 1024 }, { 5, 582, 1024 }, { 6, 583, 1024 },
  10574. { 4, 584, 1024 }, { 5, 585, 1024 }, { 5, 586, 1024 }, { 6, 587, 1024 }, { 5, 588, 1024 }, { 6, 589, 1024 }, { 6, 590, 1024 }, { 7, 591, 1024 },
  10575. { 4, 592, 1024 }, { 5, 593, 1024 }, { 5, 594, 1024 }, { 6, 595, 1024 }, { 5, 596, 1024 }, { 6, 597, 1024 }, { 6, 598, 1024 }, { 7, 599, 1024 },
  10576. { 5, 600, 1024 }, { 6, 601, 1024 }, { 6, 602, 1024 }, { 7, 603, 1024 }, { 6, 604, 1024 }, { 7, 605, 1024 }, { 7, 606, 1024 }, { 8, 607, 1024 },
  10577. { 4, 608, 1024 }, { 5, 609, 1024 }, { 5, 610, 1024 }, { 6, 611, 1024 }, { 5, 612, 1024 }, { 6, 613, 1024 }, { 6, 614, 1024 }, { 7, 615, 1024 },
  10578. { 5, 616, 1024 }, { 6, 617, 1024 }, { 6, 618, 1024 }, { 7, 619, 1024 }, { 6, 620, 1024 }, { 7, 621, 1024 }, { 7, 622, 1024 }, { 8, 623, 1024 },
  10579. { 5, 624, 1024 }, { 6, 625, 1024 }, { 6, 626, 1024 }, { 7, 627, 1024 }, { 6, 628, 1024 }, { 7, 629, 1024 }, { 7, 630, 1024 }, { 8, 631, 1024 },
  10580. { 6, 632, 1024 }, { 7, 633, 1024 }, { 7, 634, 1024 }, { 8, 635, 1024 }, { 7, 636, 1024 }, { 8, 637, 1024 }, { 8, 638, 1024 }, { 9, 639, 1024 },
  10581. { 3, 640, 1024 }, { 4, 641, 1024 }, { 4, 642, 1024 }, { 5, 643, 1024 }, { 4, 644, 1024 }, { 5, 645, 1024 }, { 5, 646, 1024 }, { 6, 647, 1024 },
  10582. { 4, 648, 1024 }, { 5, 649, 1024 }, { 5, 650, 1024 }, { 6, 651, 1024 }, { 5, 652, 1024 }, { 6, 653, 1024 }, { 6, 654, 1024 }, { 7, 655, 1024 },
  10583. { 4, 656, 1024 }, { 5, 657, 1024 }, { 5, 658, 1024 }, { 6, 659, 1024 }, { 5, 660, 1024 }, { 6, 661, 1024 }, { 6, 662, 1024 }, { 7, 663, 1024 },
  10584. { 5, 664, 1024 }, { 6, 665, 1024 }, { 6, 666, 1024 }, { 7, 667, 1024 }, { 6, 668, 1024 }, { 7, 669, 1024 }, { 7, 670, 1024 }, { 8, 671, 1024 },
  10585. { 4, 672, 1024 }, { 5, 673, 1024 }, { 5, 674, 1024 }, { 6, 675, 1024 }, { 5, 676, 1024 }, { 6, 677, 1024 }, { 6, 678, 1024 }, { 7, 679, 1024 },
  10586. { 5, 680, 1024 }, { 6, 681, 1024 }, { 6, 682, 1024 }, { 7, 683, 1024 }, { 6, 684, 1024 }, { 7, 685, 1024 }, { 7, 686, 1024 }, { 8, 687, 1024 },
  10587. { 5, 688, 1024 }, { 6, 689, 1024 }, { 6, 690, 1024 }, { 7, 691, 1024 }, { 6, 692, 1024 }, { 7, 693, 1024 }, { 7, 694, 1024 }, { 8, 695, 1024 },
  10588. { 6, 696, 1024 }, { 7, 697, 1024 }, { 7, 698, 1024 }, { 8, 699, 1024 }, { 7, 700, 1024 }, { 8, 701, 1024 }, { 8, 702, 1024 }, { 9, 703, 1024 },
  10589. { 4, 704, 1024 }, { 5, 705, 1024 }, { 5, 706, 1024 }, { 6, 707, 1024 }, { 5, 708, 1024 }, { 6, 709, 1024 }, { 6, 710, 1024 }, { 7, 711, 1024 },
  10590. { 5, 712, 1024 }, { 6, 713, 1024 }, { 6, 714, 1024 }, { 7, 715, 1024 }, { 6, 716, 1024 }, { 7, 717, 1024 }, { 7, 718, 1024 }, { 8, 719, 1024 },
  10591. { 5, 720, 1024 }, { 6, 721, 1024 }, { 6, 722, 1024 }, { 7, 723, 1024 }, { 6, 724, 1024 }, { 7, 725, 1024 }, { 7, 726, 1024 }, { 8, 727, 1024 },
  10592. { 6, 728, 1024 }, { 7, 729, 1024 }, { 7, 730, 1024 }, { 8, 731, 1024 }, { 7, 732, 1024 }, { 8, 733, 1024 }, { 8, 734, 1024 }, { 9, 735, 1024 },
  10593. { 5, 736, 1024 }, { 6, 737, 1024 }, { 6, 738, 1024 }, { 7, 739, 1024 }, { 6, 740, 1024 }, { 7, 741, 1024 }, { 7, 742, 1024 }, { 8, 743, 1024 },
  10594. { 6, 744, 1024 }, { 7, 745, 1024 }, { 7, 746, 1024 }, { 8, 747, 1024 }, { 7, 748, 1024 }, { 8, 749, 1024 }, { 8, 750, 1024 }, { 9, 751, 1024 },
  10595. { 6, 752, 1024 }, { 7, 753, 1024 }, { 7, 754, 1024 }, { 8, 755, 1024 }, { 7, 756, 1024 }, { 8, 757, 1024 }, { 8, 758, 1024 }, { 9, 759, 1024 },
  10596. { 7, 760, 1024 }, { 8, 761, 1024 }, { 8, 762, 1024 }, { 9, 763, 1024 }, { 8, 764, 1024 }, { 9, 765, 1024 }, { 9, 766, 1024 }, { 10, 767, 1024 },
  10597. { 3, 768, 1024 }, { 4, 769, 1024 }, { 4, 770, 1024 }, { 5, 771, 1024 }, { 4, 772, 1024 }, { 5, 773, 1024 }, { 5, 774, 1024 }, { 6, 775, 1024 },
  10598. { 4, 776, 1024 }, { 5, 777, 1024 }, { 5, 778, 1024 }, { 6, 779, 1024 }, { 5, 780, 1024 }, { 6, 781, 1024 }, { 6, 782, 1024 }, { 7, 783, 1024 },
  10599. { 4, 784, 1024 }, { 5, 785, 1024 }, { 5, 786, 1024 }, { 6, 787, 1024 }, { 5, 788, 1024 }, { 6, 789, 1024 }, { 6, 790, 1024 }, { 7, 791, 1024 },
  10600. { 5, 792, 1024 }, { 6, 793, 1024 }, { 6, 794, 1024 }, { 7, 795, 1024 }, { 6, 796, 1024 }, { 7, 797, 1024 }, { 7, 798, 1024 }, { 8, 799, 1024 },
  10601. { 4, 800, 1024 }, { 5, 801, 1024 }, { 5, 802, 1024 }, { 6, 803, 1024 }, { 5, 804, 1024 }, { 6, 805, 1024 }, { 6, 806, 1024 }, { 7, 807, 1024 },
  10602. { 5, 808, 1024 }, { 6, 809, 1024 }, { 6, 810, 1024 }, { 7, 811, 1024 }, { 6, 812, 1024 }, { 7, 813, 1024 }, { 7, 814, 1024 }, { 8, 815, 1024 },
  10603. { 5, 816, 1024 }, { 6, 817, 1024 }, { 6, 818, 1024 }, { 7, 819, 1024 }, { 6, 820, 1024 }, { 7, 821, 1024 }, { 7, 822, 1024 }, { 8, 823, 1024 },
  10604. { 6, 824, 1024 }, { 7, 825, 1024 }, { 7, 826, 1024 }, { 8, 827, 1024 }, { 7, 828, 1024 }, { 8, 829, 1024 }, { 8, 830, 1024 }, { 9, 831, 1024 },
  10605. { 4, 832, 1024 }, { 5, 833, 1024 }, { 5, 834, 1024 }, { 6, 835, 1024 }, { 5, 836, 1024 }, { 6, 837, 1024 }, { 6, 838, 1024 }, { 7, 839, 1024 },
  10606. { 5, 840, 1024 }, { 6, 841, 1024 }, { 6, 842, 1024 }, { 7, 843, 1024 }, { 6, 844, 1024 }, { 7, 845, 1024 }, { 7, 846, 1024 }, { 8, 847, 1024 },
  10607. { 5, 848, 1024 }, { 6, 849, 1024 }, { 6, 850, 1024 }, { 7, 851, 1024 }, { 6, 852, 1024 }, { 7, 853, 1024 }, { 7, 854, 1024 }, { 8, 855, 1024 },
  10608. { 6, 856, 1024 }, { 7, 857, 1024 }, { 7, 858, 1024 }, { 8, 859, 1024 }, { 7, 860, 1024 }, { 8, 861, 1024 }, { 8, 862, 1024 }, { 9, 863, 1024 },
  10609. { 5, 864, 1024 }, { 6, 865, 1024 }, { 6, 866, 1024 }, { 7, 867, 1024 }, { 6, 868, 1024 }, { 7, 869, 1024 }, { 7, 870, 1024 }, { 8, 871, 1024 },
  10610. { 6, 872, 1024 }, { 7, 873, 1024 }, { 7, 874, 1024 }, { 8, 875, 1024 }, { 7, 876, 1024 }, { 8, 877, 1024 }, { 8, 878, 1024 }, { 9, 879, 1024 },
  10611. { 6, 880, 1024 }, { 7, 881, 1024 }, { 7, 882, 1024 }, { 8, 883, 1024 }, { 7, 884, 1024 }, { 8, 885, 1024 }, { 8, 886, 1024 }, { 9, 887, 1024 },
  10612. { 7, 888, 1024 }, { 8, 889, 1024 }, { 8, 890, 1024 }, { 9, 891, 1024 }, { 8, 892, 1024 }, { 9, 893, 1024 }, { 9, 894, 1024 }, { 10, 895, 1024 },
  10613. { 4, 896, 1024 }, { 5, 897, 1024 }, { 5, 898, 1024 }, { 6, 899, 1024 }, { 5, 900, 1024 }, { 6, 901, 1024 }, { 6, 902, 1024 }, { 7, 903, 1024 },
  10614. { 5, 904, 1024 }, { 6, 905, 1024 }, { 6, 906, 1024 }, { 7, 907, 1024 }, { 6, 908, 1024 }, { 7, 909, 1024 }, { 7, 910, 1024 }, { 8, 911, 1024 },
  10615. { 5, 912, 1024 }, { 6, 913, 1024 }, { 6, 914, 1024 }, { 7, 915, 1024 }, { 6, 916, 1024 }, { 7, 917, 1024 }, { 7, 918, 1024 }, { 8, 919, 1024 },
  10616. { 6, 920, 1024 }, { 7, 921, 1024 }, { 7, 922, 1024 }, { 8, 923, 1024 }, { 7, 924, 1024 }, { 8, 925, 1024 }, { 8, 926, 1024 }, { 9, 927, 1024 },
  10617. { 5, 928, 1024 }, { 6, 929, 1024 }, { 6, 930, 1024 }, { 7, 931, 1024 }, { 6, 932, 1024 }, { 7, 933, 1024 }, { 7, 934, 1024 }, { 8, 935, 1024 },
  10618. { 6, 936, 1024 }, { 7, 937, 1024 }, { 7, 938, 1024 }, { 8, 939, 1024 }, { 7, 940, 1024 }, { 8, 941, 1024 }, { 8, 942, 1024 }, { 9, 943, 1024 },
  10619. { 6, 944, 1024 }, { 7, 945, 1024 }, { 7, 946, 1024 }, { 8, 947, 1024 }, { 7, 948, 1024 }, { 8, 949, 1024 }, { 8, 950, 1024 }, { 9, 951, 1024 },
  10620. { 7, 952, 1024 }, { 8, 953, 1024 }, { 8, 954, 1024 }, { 9, 955, 1024 }, { 8, 956, 1024 }, { 9, 957, 1024 }, { 9, 958, 1024 }, { 10, 959, 1024 },
  10621. { 5, 960, 1024 }, { 6, 961, 1024 }, { 6, 962, 1024 }, { 7, 963, 1024 }, { 6, 964, 1024 }, { 7, 965, 1024 }, { 7, 966, 1024 }, { 8, 967, 1024 },
  10622. { 6, 968, 1024 }, { 7, 969, 1024 }, { 7, 970, 1024 }, { 8, 971, 1024 }, { 7, 972, 1024 }, { 8, 973, 1024 }, { 8, 974, 1024 }, { 9, 975, 1024 },
  10623. { 6, 976, 1024 }, { 7, 977, 1024 }, { 7, 978, 1024 }, { 8, 979, 1024 }, { 7, 980, 1024 }, { 8, 981, 1024 }, { 8, 982, 1024 }, { 9, 983, 1024 },
  10624. { 7, 984, 1024 }, { 8, 985, 1024 }, { 8, 986, 1024 }, { 9, 987, 1024 }, { 8, 988, 1024 }, { 9, 989, 1024 }, { 9, 990, 1024 }, { 10, 991, 1024 },
  10625. { 6, 992, 1024 }, { 7, 993, 1024 }, { 7, 994, 1024 }, { 8, 995, 1024 }, { 7, 996, 1024 }, { 8, 997, 1024 }, { 8, 998, 1024 }, { 9, 999, 1024 },
  10626. { 7, 1000, 1024 }, { 8, 1001, 1024 }, { 8, 1002, 1024 }, { 9, 1003, 1024 }, { 8, 1004, 1024 }, { 9, 1005, 1024 }, { 9, 1006, 1024 }, { 10, 1007, 1024 },
  10627. { 7, 1008, 1024 }, { 8, 1009, 1024 }, { 8, 1010, 1024 }, { 9, 1011, 1024 }, { 8, 1012, 1024 }, { 9, 1013, 1024 }, { 9, 1014, 1024 }, { 10, 1015, 1024 },
  10628. { 8, 1016, 1024 }, { 9, 1017, 1024 }, { 9, 1018, 1024 }, { 10, 1019, 1024 }, { 9, 1020, 1024 }, { 10, 1021, 1024 }, { 10, 1022, 1024 }, { 11, 1023, 1024 },
  10629. #if FP_LUT > 11
  10630. { 1, 0, 0 }, { 2, 1, 2048 }, { 2, 2, 2048 }, { 3, 3, 2048 }, { 2, 4, 2048 }, { 3, 5, 2048 }, { 3, 6, 2048 }, { 4, 7, 2048 },
  10631. { 2, 8, 2048 }, { 3, 9, 2048 }, { 3, 10, 2048 }, { 4, 11, 2048 }, { 3, 12, 2048 }, { 4, 13, 2048 }, { 4, 14, 2048 }, { 5, 15, 2048 },
  10632. { 2, 16, 2048 }, { 3, 17, 2048 }, { 3, 18, 2048 }, { 4, 19, 2048 }, { 3, 20, 2048 }, { 4, 21, 2048 }, { 4, 22, 2048 }, { 5, 23, 2048 },
  10633. { 3, 24, 2048 }, { 4, 25, 2048 }, { 4, 26, 2048 }, { 5, 27, 2048 }, { 4, 28, 2048 }, { 5, 29, 2048 }, { 5, 30, 2048 }, { 6, 31, 2048 },
  10634. { 2, 32, 2048 }, { 3, 33, 2048 }, { 3, 34, 2048 }, { 4, 35, 2048 }, { 3, 36, 2048 }, { 4, 37, 2048 }, { 4, 38, 2048 }, { 5, 39, 2048 },
  10635. { 3, 40, 2048 }, { 4, 41, 2048 }, { 4, 42, 2048 }, { 5, 43, 2048 }, { 4, 44, 2048 }, { 5, 45, 2048 }, { 5, 46, 2048 }, { 6, 47, 2048 },
  10636. { 3, 48, 2048 }, { 4, 49, 2048 }, { 4, 50, 2048 }, { 5, 51, 2048 }, { 4, 52, 2048 }, { 5, 53, 2048 }, { 5, 54, 2048 }, { 6, 55, 2048 },
  10637. { 4, 56, 2048 }, { 5, 57, 2048 }, { 5, 58, 2048 }, { 6, 59, 2048 }, { 5, 60, 2048 }, { 6, 61, 2048 }, { 6, 62, 2048 }, { 7, 63, 2048 },
  10638. { 2, 64, 2048 }, { 3, 65, 2048 }, { 3, 66, 2048 }, { 4, 67, 2048 }, { 3, 68, 2048 }, { 4, 69, 2048 }, { 4, 70, 2048 }, { 5, 71, 2048 },
  10639. { 3, 72, 2048 }, { 4, 73, 2048 }, { 4, 74, 2048 }, { 5, 75, 2048 }, { 4, 76, 2048 }, { 5, 77, 2048 }, { 5, 78, 2048 }, { 6, 79, 2048 },
  10640. { 3, 80, 2048 }, { 4, 81, 2048 }, { 4, 82, 2048 }, { 5, 83, 2048 }, { 4, 84, 2048 }, { 5, 85, 2048 }, { 5, 86, 2048 }, { 6, 87, 2048 },
  10641. { 4, 88, 2048 }, { 5, 89, 2048 }, { 5, 90, 2048 }, { 6, 91, 2048 }, { 5, 92, 2048 }, { 6, 93, 2048 }, { 6, 94, 2048 }, { 7, 95, 2048 },
  10642. { 3, 96, 2048 }, { 4, 97, 2048 }, { 4, 98, 2048 }, { 5, 99, 2048 }, { 4, 100, 2048 }, { 5, 101, 2048 }, { 5, 102, 2048 }, { 6, 103, 2048 },
  10643. { 4, 104, 2048 }, { 5, 105, 2048 }, { 5, 106, 2048 }, { 6, 107, 2048 }, { 5, 108, 2048 }, { 6, 109, 2048 }, { 6, 110, 2048 }, { 7, 111, 2048 },
  10644. { 4, 112, 2048 }, { 5, 113, 2048 }, { 5, 114, 2048 }, { 6, 115, 2048 }, { 5, 116, 2048 }, { 6, 117, 2048 }, { 6, 118, 2048 }, { 7, 119, 2048 },
  10645. { 5, 120, 2048 }, { 6, 121, 2048 }, { 6, 122, 2048 }, { 7, 123, 2048 }, { 6, 124, 2048 }, { 7, 125, 2048 }, { 7, 126, 2048 }, { 8, 127, 2048 },
  10646. { 2, 128, 2048 }, { 3, 129, 2048 }, { 3, 130, 2048 }, { 4, 131, 2048 }, { 3, 132, 2048 }, { 4, 133, 2048 }, { 4, 134, 2048 }, { 5, 135, 2048 },
  10647. { 3, 136, 2048 }, { 4, 137, 2048 }, { 4, 138, 2048 }, { 5, 139, 2048 }, { 4, 140, 2048 }, { 5, 141, 2048 }, { 5, 142, 2048 }, { 6, 143, 2048 },
  10648. { 3, 144, 2048 }, { 4, 145, 2048 }, { 4, 146, 2048 }, { 5, 147, 2048 }, { 4, 148, 2048 }, { 5, 149, 2048 }, { 5, 150, 2048 }, { 6, 151, 2048 },
  10649. { 4, 152, 2048 }, { 5, 153, 2048 }, { 5, 154, 2048 }, { 6, 155, 2048 }, { 5, 156, 2048 }, { 6, 157, 2048 }, { 6, 158, 2048 }, { 7, 159, 2048 },
  10650. { 3, 160, 2048 }, { 4, 161, 2048 }, { 4, 162, 2048 }, { 5, 163, 2048 }, { 4, 164, 2048 }, { 5, 165, 2048 }, { 5, 166, 2048 }, { 6, 167, 2048 },
  10651. { 4, 168, 2048 }, { 5, 169, 2048 }, { 5, 170, 2048 }, { 6, 171, 2048 }, { 5, 172, 2048 }, { 6, 173, 2048 }, { 6, 174, 2048 }, { 7, 175, 2048 },
  10652. { 4, 176, 2048 }, { 5, 177, 2048 }, { 5, 178, 2048 }, { 6, 179, 2048 }, { 5, 180, 2048 }, { 6, 181, 2048 }, { 6, 182, 2048 }, { 7, 183, 2048 },
  10653. { 5, 184, 2048 }, { 6, 185, 2048 }, { 6, 186, 2048 }, { 7, 187, 2048 }, { 6, 188, 2048 }, { 7, 189, 2048 }, { 7, 190, 2048 }, { 8, 191, 2048 },
  10654. { 3, 192, 2048 }, { 4, 193, 2048 }, { 4, 194, 2048 }, { 5, 195, 2048 }, { 4, 196, 2048 }, { 5, 197, 2048 }, { 5, 198, 2048 }, { 6, 199, 2048 },
  10655. { 4, 200, 2048 }, { 5, 201, 2048 }, { 5, 202, 2048 }, { 6, 203, 2048 }, { 5, 204, 2048 }, { 6, 205, 2048 }, { 6, 206, 2048 }, { 7, 207, 2048 },
  10656. { 4, 208, 2048 }, { 5, 209, 2048 }, { 5, 210, 2048 }, { 6, 211, 2048 }, { 5, 212, 2048 }, { 6, 213, 2048 }, { 6, 214, 2048 }, { 7, 215, 2048 },
  10657. { 5, 216, 2048 }, { 6, 217, 2048 }, { 6, 218, 2048 }, { 7, 219, 2048 }, { 6, 220, 2048 }, { 7, 221, 2048 }, { 7, 222, 2048 }, { 8, 223, 2048 },
  10658. { 4, 224, 2048 }, { 5, 225, 2048 }, { 5, 226, 2048 }, { 6, 227, 2048 }, { 5, 228, 2048 }, { 6, 229, 2048 }, { 6, 230, 2048 }, { 7, 231, 2048 },
  10659. { 5, 232, 2048 }, { 6, 233, 2048 }, { 6, 234, 2048 }, { 7, 235, 2048 }, { 6, 236, 2048 }, { 7, 237, 2048 }, { 7, 238, 2048 }, { 8, 239, 2048 },
  10660. { 5, 240, 2048 }, { 6, 241, 2048 }, { 6, 242, 2048 }, { 7, 243, 2048 }, { 6, 244, 2048 }, { 7, 245, 2048 }, { 7, 246, 2048 }, { 8, 247, 2048 },
  10661. { 6, 248, 2048 }, { 7, 249, 2048 }, { 7, 250, 2048 }, { 8, 251, 2048 }, { 7, 252, 2048 }, { 8, 253, 2048 }, { 8, 254, 2048 }, { 9, 255, 2048 },
  10662. { 2, 256, 2048 }, { 3, 257, 2048 }, { 3, 258, 2048 }, { 4, 259, 2048 }, { 3, 260, 2048 }, { 4, 261, 2048 }, { 4, 262, 2048 }, { 5, 263, 2048 },
  10663. { 3, 264, 2048 }, { 4, 265, 2048 }, { 4, 266, 2048 }, { 5, 267, 2048 }, { 4, 268, 2048 }, { 5, 269, 2048 }, { 5, 270, 2048 }, { 6, 271, 2048 },
  10664. { 3, 272, 2048 }, { 4, 273, 2048 }, { 4, 274, 2048 }, { 5, 275, 2048 }, { 4, 276, 2048 }, { 5, 277, 2048 }, { 5, 278, 2048 }, { 6, 279, 2048 },
  10665. { 4, 280, 2048 }, { 5, 281, 2048 }, { 5, 282, 2048 }, { 6, 283, 2048 }, { 5, 284, 2048 }, { 6, 285, 2048 }, { 6, 286, 2048 }, { 7, 287, 2048 },
  10666. { 3, 288, 2048 }, { 4, 289, 2048 }, { 4, 290, 2048 }, { 5, 291, 2048 }, { 4, 292, 2048 }, { 5, 293, 2048 }, { 5, 294, 2048 }, { 6, 295, 2048 },
  10667. { 4, 296, 2048 }, { 5, 297, 2048 }, { 5, 298, 2048 }, { 6, 299, 2048 }, { 5, 300, 2048 }, { 6, 301, 2048 }, { 6, 302, 2048 }, { 7, 303, 2048 },
  10668. { 4, 304, 2048 }, { 5, 305, 2048 }, { 5, 306, 2048 }, { 6, 307, 2048 }, { 5, 308, 2048 }, { 6, 309, 2048 }, { 6, 310, 2048 }, { 7, 311, 2048 },
  10669. { 5, 312, 2048 }, { 6, 313, 2048 }, { 6, 314, 2048 }, { 7, 315, 2048 }, { 6, 316, 2048 }, { 7, 317, 2048 }, { 7, 318, 2048 }, { 8, 319, 2048 },
  10670. { 3, 320, 2048 }, { 4, 321, 2048 }, { 4, 322, 2048 }, { 5, 323, 2048 }, { 4, 324, 2048 }, { 5, 325, 2048 }, { 5, 326, 2048 }, { 6, 327, 2048 },
  10671. { 4, 328, 2048 }, { 5, 329, 2048 }, { 5, 330, 2048 }, { 6, 331, 2048 }, { 5, 332, 2048 }, { 6, 333, 2048 }, { 6, 334, 2048 }, { 7, 335, 2048 },
  10672. { 4, 336, 2048 }, { 5, 337, 2048 }, { 5, 338, 2048 }, { 6, 339, 2048 }, { 5, 340, 2048 }, { 6, 341, 2048 }, { 6, 342, 2048 }, { 7, 343, 2048 },
  10673. { 5, 344, 2048 }, { 6, 345, 2048 }, { 6, 346, 2048 }, { 7, 347, 2048 }, { 6, 348, 2048 }, { 7, 349, 2048 }, { 7, 350, 2048 }, { 8, 351, 2048 },
  10674. { 4, 352, 2048 }, { 5, 353, 2048 }, { 5, 354, 2048 }, { 6, 355, 2048 }, { 5, 356, 2048 }, { 6, 357, 2048 }, { 6, 358, 2048 }, { 7, 359, 2048 },
  10675. { 5, 360, 2048 }, { 6, 361, 2048 }, { 6, 362, 2048 }, { 7, 363, 2048 }, { 6, 364, 2048 }, { 7, 365, 2048 }, { 7, 366, 2048 }, { 8, 367, 2048 },
  10676. { 5, 368, 2048 }, { 6, 369, 2048 }, { 6, 370, 2048 }, { 7, 371, 2048 }, { 6, 372, 2048 }, { 7, 373, 2048 }, { 7, 374, 2048 }, { 8, 375, 2048 },
  10677. { 6, 376, 2048 }, { 7, 377, 2048 }, { 7, 378, 2048 }, { 8, 379, 2048 }, { 7, 380, 2048 }, { 8, 381, 2048 }, { 8, 382, 2048 }, { 9, 383, 2048 },
  10678. { 3, 384, 2048 }, { 4, 385, 2048 }, { 4, 386, 2048 }, { 5, 387, 2048 }, { 4, 388, 2048 }, { 5, 389, 2048 }, { 5, 390, 2048 }, { 6, 391, 2048 },
  10679. { 4, 392, 2048 }, { 5, 393, 2048 }, { 5, 394, 2048 }, { 6, 395, 2048 }, { 5, 396, 2048 }, { 6, 397, 2048 }, { 6, 398, 2048 }, { 7, 399, 2048 },
  10680. { 4, 400, 2048 }, { 5, 401, 2048 }, { 5, 402, 2048 }, { 6, 403, 2048 }, { 5, 404, 2048 }, { 6, 405, 2048 }, { 6, 406, 2048 }, { 7, 407, 2048 },
  10681. { 5, 408, 2048 }, { 6, 409, 2048 }, { 6, 410, 2048 }, { 7, 411, 2048 }, { 6, 412, 2048 }, { 7, 413, 2048 }, { 7, 414, 2048 }, { 8, 415, 2048 },
  10682. { 4, 416, 2048 }, { 5, 417, 2048 }, { 5, 418, 2048 }, { 6, 419, 2048 }, { 5, 420, 2048 }, { 6, 421, 2048 }, { 6, 422, 2048 }, { 7, 423, 2048 },
  10683. { 5, 424, 2048 }, { 6, 425, 2048 }, { 6, 426, 2048 }, { 7, 427, 2048 }, { 6, 428, 2048 }, { 7, 429, 2048 }, { 7, 430, 2048 }, { 8, 431, 2048 },
  10684. { 5, 432, 2048 }, { 6, 433, 2048 }, { 6, 434, 2048 }, { 7, 435, 2048 }, { 6, 436, 2048 }, { 7, 437, 2048 }, { 7, 438, 2048 }, { 8, 439, 2048 },
  10685. { 6, 440, 2048 }, { 7, 441, 2048 }, { 7, 442, 2048 }, { 8, 443, 2048 }, { 7, 444, 2048 }, { 8, 445, 2048 }, { 8, 446, 2048 }, { 9, 447, 2048 },
  10686. { 4, 448, 2048 }, { 5, 449, 2048 }, { 5, 450, 2048 }, { 6, 451, 2048 }, { 5, 452, 2048 }, { 6, 453, 2048 }, { 6, 454, 2048 }, { 7, 455, 2048 },
  10687. { 5, 456, 2048 }, { 6, 457, 2048 }, { 6, 458, 2048 }, { 7, 459, 2048 }, { 6, 460, 2048 }, { 7, 461, 2048 }, { 7, 462, 2048 }, { 8, 463, 2048 },
  10688. { 5, 464, 2048 }, { 6, 465, 2048 }, { 6, 466, 2048 }, { 7, 467, 2048 }, { 6, 468, 2048 }, { 7, 469, 2048 }, { 7, 470, 2048 }, { 8, 471, 2048 },
  10689. { 6, 472, 2048 }, { 7, 473, 2048 }, { 7, 474, 2048 }, { 8, 475, 2048 }, { 7, 476, 2048 }, { 8, 477, 2048 }, { 8, 478, 2048 }, { 9, 479, 2048 },
  10690. { 5, 480, 2048 }, { 6, 481, 2048 }, { 6, 482, 2048 }, { 7, 483, 2048 }, { 6, 484, 2048 }, { 7, 485, 2048 }, { 7, 486, 2048 }, { 8, 487, 2048 },
  10691. { 6, 488, 2048 }, { 7, 489, 2048 }, { 7, 490, 2048 }, { 8, 491, 2048 }, { 7, 492, 2048 }, { 8, 493, 2048 }, { 8, 494, 2048 }, { 9, 495, 2048 },
  10692. { 6, 496, 2048 }, { 7, 497, 2048 }, { 7, 498, 2048 }, { 8, 499, 2048 }, { 7, 500, 2048 }, { 8, 501, 2048 }, { 8, 502, 2048 }, { 9, 503, 2048 },
  10693. { 7, 504, 2048 }, { 8, 505, 2048 }, { 8, 506, 2048 }, { 9, 507, 2048 }, { 8, 508, 2048 }, { 9, 509, 2048 }, { 9, 510, 2048 }, { 10, 511, 2048 },
  10694. { 2, 512, 2048 }, { 3, 513, 2048 }, { 3, 514, 2048 }, { 4, 515, 2048 }, { 3, 516, 2048 }, { 4, 517, 2048 }, { 4, 518, 2048 }, { 5, 519, 2048 },
  10695. { 3, 520, 2048 }, { 4, 521, 2048 }, { 4, 522, 2048 }, { 5, 523, 2048 }, { 4, 524, 2048 }, { 5, 525, 2048 }, { 5, 526, 2048 }, { 6, 527, 2048 },
  10696. { 3, 528, 2048 }, { 4, 529, 2048 }, { 4, 530, 2048 }, { 5, 531, 2048 }, { 4, 532, 2048 }, { 5, 533, 2048 }, { 5, 534, 2048 }, { 6, 535, 2048 },
  10697. { 4, 536, 2048 }, { 5, 537, 2048 }, { 5, 538, 2048 }, { 6, 539, 2048 }, { 5, 540, 2048 }, { 6, 541, 2048 }, { 6, 542, 2048 }, { 7, 543, 2048 },
  10698. { 3, 544, 2048 }, { 4, 545, 2048 }, { 4, 546, 2048 }, { 5, 547, 2048 }, { 4, 548, 2048 }, { 5, 549, 2048 }, { 5, 550, 2048 }, { 6, 551, 2048 },
  10699. { 4, 552, 2048 }, { 5, 553, 2048 }, { 5, 554, 2048 }, { 6, 555, 2048 }, { 5, 556, 2048 }, { 6, 557, 2048 }, { 6, 558, 2048 }, { 7, 559, 2048 },
  10700. { 4, 560, 2048 }, { 5, 561, 2048 }, { 5, 562, 2048 }, { 6, 563, 2048 }, { 5, 564, 2048 }, { 6, 565, 2048 }, { 6, 566, 2048 }, { 7, 567, 2048 },
  10701. { 5, 568, 2048 }, { 6, 569, 2048 }, { 6, 570, 2048 }, { 7, 571, 2048 }, { 6, 572, 2048 }, { 7, 573, 2048 }, { 7, 574, 2048 }, { 8, 575, 2048 },
  10702. { 3, 576, 2048 }, { 4, 577, 2048 }, { 4, 578, 2048 }, { 5, 579, 2048 }, { 4, 580, 2048 }, { 5, 581, 2048 }, { 5, 582, 2048 }, { 6, 583, 2048 },
  10703. { 4, 584, 2048 }, { 5, 585, 2048 }, { 5, 586, 2048 }, { 6, 587, 2048 }, { 5, 588, 2048 }, { 6, 589, 2048 }, { 6, 590, 2048 }, { 7, 591, 2048 },
  10704. { 4, 592, 2048 }, { 5, 593, 2048 }, { 5, 594, 2048 }, { 6, 595, 2048 }, { 5, 596, 2048 }, { 6, 597, 2048 }, { 6, 598, 2048 }, { 7, 599, 2048 },
  10705. { 5, 600, 2048 }, { 6, 601, 2048 }, { 6, 602, 2048 }, { 7, 603, 2048 }, { 6, 604, 2048 }, { 7, 605, 2048 }, { 7, 606, 2048 }, { 8, 607, 2048 },
  10706. { 4, 608, 2048 }, { 5, 609, 2048 }, { 5, 610, 2048 }, { 6, 611, 2048 }, { 5, 612, 2048 }, { 6, 613, 2048 }, { 6, 614, 2048 }, { 7, 615, 2048 },
  10707. { 5, 616, 2048 }, { 6, 617, 2048 }, { 6, 618, 2048 }, { 7, 619, 2048 }, { 6, 620, 2048 }, { 7, 621, 2048 }, { 7, 622, 2048 }, { 8, 623, 2048 },
  10708. { 5, 624, 2048 }, { 6, 625, 2048 }, { 6, 626, 2048 }, { 7, 627, 2048 }, { 6, 628, 2048 }, { 7, 629, 2048 }, { 7, 630, 2048 }, { 8, 631, 2048 },
  10709. { 6, 632, 2048 }, { 7, 633, 2048 }, { 7, 634, 2048 }, { 8, 635, 2048 }, { 7, 636, 2048 }, { 8, 637, 2048 }, { 8, 638, 2048 }, { 9, 639, 2048 },
  10710. { 3, 640, 2048 }, { 4, 641, 2048 }, { 4, 642, 2048 }, { 5, 643, 2048 }, { 4, 644, 2048 }, { 5, 645, 2048 }, { 5, 646, 2048 }, { 6, 647, 2048 },
  10711. { 4, 648, 2048 }, { 5, 649, 2048 }, { 5, 650, 2048 }, { 6, 651, 2048 }, { 5, 652, 2048 }, { 6, 653, 2048 }, { 6, 654, 2048 }, { 7, 655, 2048 },
  10712. { 4, 656, 2048 }, { 5, 657, 2048 }, { 5, 658, 2048 }, { 6, 659, 2048 }, { 5, 660, 2048 }, { 6, 661, 2048 }, { 6, 662, 2048 }, { 7, 663, 2048 },
  10713. { 5, 664, 2048 }, { 6, 665, 2048 }, { 6, 666, 2048 }, { 7, 667, 2048 }, { 6, 668, 2048 }, { 7, 669, 2048 }, { 7, 670, 2048 }, { 8, 671, 2048 },
  10714. { 4, 672, 2048 }, { 5, 673, 2048 }, { 5, 674, 2048 }, { 6, 675, 2048 }, { 5, 676, 2048 }, { 6, 677, 2048 }, { 6, 678, 2048 }, { 7, 679, 2048 },
  10715. { 5, 680, 2048 }, { 6, 681, 2048 }, { 6, 682, 2048 }, { 7, 683, 2048 }, { 6, 684, 2048 }, { 7, 685, 2048 }, { 7, 686, 2048 }, { 8, 687, 2048 },
  10716. { 5, 688, 2048 }, { 6, 689, 2048 }, { 6, 690, 2048 }, { 7, 691, 2048 }, { 6, 692, 2048 }, { 7, 693, 2048 }, { 7, 694, 2048 }, { 8, 695, 2048 },
  10717. { 6, 696, 2048 }, { 7, 697, 2048 }, { 7, 698, 2048 }, { 8, 699, 2048 }, { 7, 700, 2048 }, { 8, 701, 2048 }, { 8, 702, 2048 }, { 9, 703, 2048 },
  10718. { 4, 704, 2048 }, { 5, 705, 2048 }, { 5, 706, 2048 }, { 6, 707, 2048 }, { 5, 708, 2048 }, { 6, 709, 2048 }, { 6, 710, 2048 }, { 7, 711, 2048 },
  10719. { 5, 712, 2048 }, { 6, 713, 2048 }, { 6, 714, 2048 }, { 7, 715, 2048 }, { 6, 716, 2048 }, { 7, 717, 2048 }, { 7, 718, 2048 }, { 8, 719, 2048 },
  10720. { 5, 720, 2048 }, { 6, 721, 2048 }, { 6, 722, 2048 }, { 7, 723, 2048 }, { 6, 724, 2048 }, { 7, 725, 2048 }, { 7, 726, 2048 }, { 8, 727, 2048 },
  10721. { 6, 728, 2048 }, { 7, 729, 2048 }, { 7, 730, 2048 }, { 8, 731, 2048 }, { 7, 732, 2048 }, { 8, 733, 2048 }, { 8, 734, 2048 }, { 9, 735, 2048 },
  10722. { 5, 736, 2048 }, { 6, 737, 2048 }, { 6, 738, 2048 }, { 7, 739, 2048 }, { 6, 740, 2048 }, { 7, 741, 2048 }, { 7, 742, 2048 }, { 8, 743, 2048 },
  10723. { 6, 744, 2048 }, { 7, 745, 2048 }, { 7, 746, 2048 }, { 8, 747, 2048 }, { 7, 748, 2048 }, { 8, 749, 2048 }, { 8, 750, 2048 }, { 9, 751, 2048 },
  10724. { 6, 752, 2048 }, { 7, 753, 2048 }, { 7, 754, 2048 }, { 8, 755, 2048 }, { 7, 756, 2048 }, { 8, 757, 2048 }, { 8, 758, 2048 }, { 9, 759, 2048 },
  10725. { 7, 760, 2048 }, { 8, 761, 2048 }, { 8, 762, 2048 }, { 9, 763, 2048 }, { 8, 764, 2048 }, { 9, 765, 2048 }, { 9, 766, 2048 }, { 10, 767, 2048 },
  10726. { 3, 768, 2048 }, { 4, 769, 2048 }, { 4, 770, 2048 }, { 5, 771, 2048 }, { 4, 772, 2048 }, { 5, 773, 2048 }, { 5, 774, 2048 }, { 6, 775, 2048 },
  10727. { 4, 776, 2048 }, { 5, 777, 2048 }, { 5, 778, 2048 }, { 6, 779, 2048 }, { 5, 780, 2048 }, { 6, 781, 2048 }, { 6, 782, 2048 }, { 7, 783, 2048 },
  10728. { 4, 784, 2048 }, { 5, 785, 2048 }, { 5, 786, 2048 }, { 6, 787, 2048 }, { 5, 788, 2048 }, { 6, 789, 2048 }, { 6, 790, 2048 }, { 7, 791, 2048 },
  10729. { 5, 792, 2048 }, { 6, 793, 2048 }, { 6, 794, 2048 }, { 7, 795, 2048 }, { 6, 796, 2048 }, { 7, 797, 2048 }, { 7, 798, 2048 }, { 8, 799, 2048 },
  10730. { 4, 800, 2048 }, { 5, 801, 2048 }, { 5, 802, 2048 }, { 6, 803, 2048 }, { 5, 804, 2048 }, { 6, 805, 2048 }, { 6, 806, 2048 }, { 7, 807, 2048 },
  10731. { 5, 808, 2048 }, { 6, 809, 2048 }, { 6, 810, 2048 }, { 7, 811, 2048 }, { 6, 812, 2048 }, { 7, 813, 2048 }, { 7, 814, 2048 }, { 8, 815, 2048 },
  10732. { 5, 816, 2048 }, { 6, 817, 2048 }, { 6, 818, 2048 }, { 7, 819, 2048 }, { 6, 820, 2048 }, { 7, 821, 2048 }, { 7, 822, 2048 }, { 8, 823, 2048 },
  10733. { 6, 824, 2048 }, { 7, 825, 2048 }, { 7, 826, 2048 }, { 8, 827, 2048 }, { 7, 828, 2048 }, { 8, 829, 2048 }, { 8, 830, 2048 }, { 9, 831, 2048 },
  10734. { 4, 832, 2048 }, { 5, 833, 2048 }, { 5, 834, 2048 }, { 6, 835, 2048 }, { 5, 836, 2048 }, { 6, 837, 2048 }, { 6, 838, 2048 }, { 7, 839, 2048 },
  10735. { 5, 840, 2048 }, { 6, 841, 2048 }, { 6, 842, 2048 }, { 7, 843, 2048 }, { 6, 844, 2048 }, { 7, 845, 2048 }, { 7, 846, 2048 }, { 8, 847, 2048 },
  10736. { 5, 848, 2048 }, { 6, 849, 2048 }, { 6, 850, 2048 }, { 7, 851, 2048 }, { 6, 852, 2048 }, { 7, 853, 2048 }, { 7, 854, 2048 }, { 8, 855, 2048 },
  10737. { 6, 856, 2048 }, { 7, 857, 2048 }, { 7, 858, 2048 }, { 8, 859, 2048 }, { 7, 860, 2048 }, { 8, 861, 2048 }, { 8, 862, 2048 }, { 9, 863, 2048 },
  10738. { 5, 864, 2048 }, { 6, 865, 2048 }, { 6, 866, 2048 }, { 7, 867, 2048 }, { 6, 868, 2048 }, { 7, 869, 2048 }, { 7, 870, 2048 }, { 8, 871, 2048 },
  10739. { 6, 872, 2048 }, { 7, 873, 2048 }, { 7, 874, 2048 }, { 8, 875, 2048 }, { 7, 876, 2048 }, { 8, 877, 2048 }, { 8, 878, 2048 }, { 9, 879, 2048 },
  10740. { 6, 880, 2048 }, { 7, 881, 2048 }, { 7, 882, 2048 }, { 8, 883, 2048 }, { 7, 884, 2048 }, { 8, 885, 2048 }, { 8, 886, 2048 }, { 9, 887, 2048 },
  10741. { 7, 888, 2048 }, { 8, 889, 2048 }, { 8, 890, 2048 }, { 9, 891, 2048 }, { 8, 892, 2048 }, { 9, 893, 2048 }, { 9, 894, 2048 }, { 10, 895, 2048 },
  10742. { 4, 896, 2048 }, { 5, 897, 2048 }, { 5, 898, 2048 }, { 6, 899, 2048 }, { 5, 900, 2048 }, { 6, 901, 2048 }, { 6, 902, 2048 }, { 7, 903, 2048 },
  10743. { 5, 904, 2048 }, { 6, 905, 2048 }, { 6, 906, 2048 }, { 7, 907, 2048 }, { 6, 908, 2048 }, { 7, 909, 2048 }, { 7, 910, 2048 }, { 8, 911, 2048 },
  10744. { 5, 912, 2048 }, { 6, 913, 2048 }, { 6, 914, 2048 }, { 7, 915, 2048 }, { 6, 916, 2048 }, { 7, 917, 2048 }, { 7, 918, 2048 }, { 8, 919, 2048 },
  10745. { 6, 920, 2048 }, { 7, 921, 2048 }, { 7, 922, 2048 }, { 8, 923, 2048 }, { 7, 924, 2048 }, { 8, 925, 2048 }, { 8, 926, 2048 }, { 9, 927, 2048 },
  10746. { 5, 928, 2048 }, { 6, 929, 2048 }, { 6, 930, 2048 }, { 7, 931, 2048 }, { 6, 932, 2048 }, { 7, 933, 2048 }, { 7, 934, 2048 }, { 8, 935, 2048 },
  10747. { 6, 936, 2048 }, { 7, 937, 2048 }, { 7, 938, 2048 }, { 8, 939, 2048 }, { 7, 940, 2048 }, { 8, 941, 2048 }, { 8, 942, 2048 }, { 9, 943, 2048 },
  10748. { 6, 944, 2048 }, { 7, 945, 2048 }, { 7, 946, 2048 }, { 8, 947, 2048 }, { 7, 948, 2048 }, { 8, 949, 2048 }, { 8, 950, 2048 }, { 9, 951, 2048 },
  10749. { 7, 952, 2048 }, { 8, 953, 2048 }, { 8, 954, 2048 }, { 9, 955, 2048 }, { 8, 956, 2048 }, { 9, 957, 2048 }, { 9, 958, 2048 }, { 10, 959, 2048 },
  10750. { 5, 960, 2048 }, { 6, 961, 2048 }, { 6, 962, 2048 }, { 7, 963, 2048 }, { 6, 964, 2048 }, { 7, 965, 2048 }, { 7, 966, 2048 }, { 8, 967, 2048 },
  10751. { 6, 968, 2048 }, { 7, 969, 2048 }, { 7, 970, 2048 }, { 8, 971, 2048 }, { 7, 972, 2048 }, { 8, 973, 2048 }, { 8, 974, 2048 }, { 9, 975, 2048 },
  10752. { 6, 976, 2048 }, { 7, 977, 2048 }, { 7, 978, 2048 }, { 8, 979, 2048 }, { 7, 980, 2048 }, { 8, 981, 2048 }, { 8, 982, 2048 }, { 9, 983, 2048 },
  10753. { 7, 984, 2048 }, { 8, 985, 2048 }, { 8, 986, 2048 }, { 9, 987, 2048 }, { 8, 988, 2048 }, { 9, 989, 2048 }, { 9, 990, 2048 }, { 10, 991, 2048 },
  10754. { 6, 992, 2048 }, { 7, 993, 2048 }, { 7, 994, 2048 }, { 8, 995, 2048 }, { 7, 996, 2048 }, { 8, 997, 2048 }, { 8, 998, 2048 }, { 9, 999, 2048 },
  10755. { 7, 1000, 2048 }, { 8, 1001, 2048 }, { 8, 1002, 2048 }, { 9, 1003, 2048 }, { 8, 1004, 2048 }, { 9, 1005, 2048 }, { 9, 1006, 2048 }, { 10, 1007, 2048 },
  10756. { 7, 1008, 2048 }, { 8, 1009, 2048 }, { 8, 1010, 2048 }, { 9, 1011, 2048 }, { 8, 1012, 2048 }, { 9, 1013, 2048 }, { 9, 1014, 2048 }, { 10, 1015, 2048 },
  10757. { 8, 1016, 2048 }, { 9, 1017, 2048 }, { 9, 1018, 2048 }, { 10, 1019, 2048 }, { 9, 1020, 2048 }, { 10, 1021, 2048 }, { 10, 1022, 2048 }, { 11, 1023, 2048 },
  10758. { 2, 1024, 2048 }, { 3, 1025, 2048 }, { 3, 1026, 2048 }, { 4, 1027, 2048 }, { 3, 1028, 2048 }, { 4, 1029, 2048 }, { 4, 1030, 2048 }, { 5, 1031, 2048 },
  10759. { 3, 1032, 2048 }, { 4, 1033, 2048 }, { 4, 1034, 2048 }, { 5, 1035, 2048 }, { 4, 1036, 2048 }, { 5, 1037, 2048 }, { 5, 1038, 2048 }, { 6, 1039, 2048 },
  10760. { 3, 1040, 2048 }, { 4, 1041, 2048 }, { 4, 1042, 2048 }, { 5, 1043, 2048 }, { 4, 1044, 2048 }, { 5, 1045, 2048 }, { 5, 1046, 2048 }, { 6, 1047, 2048 },
  10761. { 4, 1048, 2048 }, { 5, 1049, 2048 }, { 5, 1050, 2048 }, { 6, 1051, 2048 }, { 5, 1052, 2048 }, { 6, 1053, 2048 }, { 6, 1054, 2048 }, { 7, 1055, 2048 },
  10762. { 3, 1056, 2048 }, { 4, 1057, 2048 }, { 4, 1058, 2048 }, { 5, 1059, 2048 }, { 4, 1060, 2048 }, { 5, 1061, 2048 }, { 5, 1062, 2048 }, { 6, 1063, 2048 },
  10763. { 4, 1064, 2048 }, { 5, 1065, 2048 }, { 5, 1066, 2048 }, { 6, 1067, 2048 }, { 5, 1068, 2048 }, { 6, 1069, 2048 }, { 6, 1070, 2048 }, { 7, 1071, 2048 },
  10764. { 4, 1072, 2048 }, { 5, 1073, 2048 }, { 5, 1074, 2048 }, { 6, 1075, 2048 }, { 5, 1076, 2048 }, { 6, 1077, 2048 }, { 6, 1078, 2048 }, { 7, 1079, 2048 },
  10765. { 5, 1080, 2048 }, { 6, 1081, 2048 }, { 6, 1082, 2048 }, { 7, 1083, 2048 }, { 6, 1084, 2048 }, { 7, 1085, 2048 }, { 7, 1086, 2048 }, { 8, 1087, 2048 },
  10766. { 3, 1088, 2048 }, { 4, 1089, 2048 }, { 4, 1090, 2048 }, { 5, 1091, 2048 }, { 4, 1092, 2048 }, { 5, 1093, 2048 }, { 5, 1094, 2048 }, { 6, 1095, 2048 },
  10767. { 4, 1096, 2048 }, { 5, 1097, 2048 }, { 5, 1098, 2048 }, { 6, 1099, 2048 }, { 5, 1100, 2048 }, { 6, 1101, 2048 }, { 6, 1102, 2048 }, { 7, 1103, 2048 },
  10768. { 4, 1104, 2048 }, { 5, 1105, 2048 }, { 5, 1106, 2048 }, { 6, 1107, 2048 }, { 5, 1108, 2048 }, { 6, 1109, 2048 }, { 6, 1110, 2048 }, { 7, 1111, 2048 },
  10769. { 5, 1112, 2048 }, { 6, 1113, 2048 }, { 6, 1114, 2048 }, { 7, 1115, 2048 }, { 6, 1116, 2048 }, { 7, 1117, 2048 }, { 7, 1118, 2048 }, { 8, 1119, 2048 },
  10770. { 4, 1120, 2048 }, { 5, 1121, 2048 }, { 5, 1122, 2048 }, { 6, 1123, 2048 }, { 5, 1124, 2048 }, { 6, 1125, 2048 }, { 6, 1126, 2048 }, { 7, 1127, 2048 },
  10771. { 5, 1128, 2048 }, { 6, 1129, 2048 }, { 6, 1130, 2048 }, { 7, 1131, 2048 }, { 6, 1132, 2048 }, { 7, 1133, 2048 }, { 7, 1134, 2048 }, { 8, 1135, 2048 },
  10772. { 5, 1136, 2048 }, { 6, 1137, 2048 }, { 6, 1138, 2048 }, { 7, 1139, 2048 }, { 6, 1140, 2048 }, { 7, 1141, 2048 }, { 7, 1142, 2048 }, { 8, 1143, 2048 },
  10773. { 6, 1144, 2048 }, { 7, 1145, 2048 }, { 7, 1146, 2048 }, { 8, 1147, 2048 }, { 7, 1148, 2048 }, { 8, 1149, 2048 }, { 8, 1150, 2048 }, { 9, 1151, 2048 },
  10774. { 3, 1152, 2048 }, { 4, 1153, 2048 }, { 4, 1154, 2048 }, { 5, 1155, 2048 }, { 4, 1156, 2048 }, { 5, 1157, 2048 }, { 5, 1158, 2048 }, { 6, 1159, 2048 },
  10775. { 4, 1160, 2048 }, { 5, 1161, 2048 }, { 5, 1162, 2048 }, { 6, 1163, 2048 }, { 5, 1164, 2048 }, { 6, 1165, 2048 }, { 6, 1166, 2048 }, { 7, 1167, 2048 },
  10776. { 4, 1168, 2048 }, { 5, 1169, 2048 }, { 5, 1170, 2048 }, { 6, 1171, 2048 }, { 5, 1172, 2048 }, { 6, 1173, 2048 }, { 6, 1174, 2048 }, { 7, 1175, 2048 },
  10777. { 5, 1176, 2048 }, { 6, 1177, 2048 }, { 6, 1178, 2048 }, { 7, 1179, 2048 }, { 6, 1180, 2048 }, { 7, 1181, 2048 }, { 7, 1182, 2048 }, { 8, 1183, 2048 },
  10778. { 4, 1184, 2048 }, { 5, 1185, 2048 }, { 5, 1186, 2048 }, { 6, 1187, 2048 }, { 5, 1188, 2048 }, { 6, 1189, 2048 }, { 6, 1190, 2048 }, { 7, 1191, 2048 },
  10779. { 5, 1192, 2048 }, { 6, 1193, 2048 }, { 6, 1194, 2048 }, { 7, 1195, 2048 }, { 6, 1196, 2048 }, { 7, 1197, 2048 }, { 7, 1198, 2048 }, { 8, 1199, 2048 },
  10780. { 5, 1200, 2048 }, { 6, 1201, 2048 }, { 6, 1202, 2048 }, { 7, 1203, 2048 }, { 6, 1204, 2048 }, { 7, 1205, 2048 }, { 7, 1206, 2048 }, { 8, 1207, 2048 },
  10781. { 6, 1208, 2048 }, { 7, 1209, 2048 }, { 7, 1210, 2048 }, { 8, 1211, 2048 }, { 7, 1212, 2048 }, { 8, 1213, 2048 }, { 8, 1214, 2048 }, { 9, 1215, 2048 },
  10782. { 4, 1216, 2048 }, { 5, 1217, 2048 }, { 5, 1218, 2048 }, { 6, 1219, 2048 }, { 5, 1220, 2048 }, { 6, 1221, 2048 }, { 6, 1222, 2048 }, { 7, 1223, 2048 },
  10783. { 5, 1224, 2048 }, { 6, 1225, 2048 }, { 6, 1226, 2048 }, { 7, 1227, 2048 }, { 6, 1228, 2048 }, { 7, 1229, 2048 }, { 7, 1230, 2048 }, { 8, 1231, 2048 },
  10784. { 5, 1232, 2048 }, { 6, 1233, 2048 }, { 6, 1234, 2048 }, { 7, 1235, 2048 }, { 6, 1236, 2048 }, { 7, 1237, 2048 }, { 7, 1238, 2048 }, { 8, 1239, 2048 },
  10785. { 6, 1240, 2048 }, { 7, 1241, 2048 }, { 7, 1242, 2048 }, { 8, 1243, 2048 }, { 7, 1244, 2048 }, { 8, 1245, 2048 }, { 8, 1246, 2048 }, { 9, 1247, 2048 },
  10786. { 5, 1248, 2048 }, { 6, 1249, 2048 }, { 6, 1250, 2048 }, { 7, 1251, 2048 }, { 6, 1252, 2048 }, { 7, 1253, 2048 }, { 7, 1254, 2048 }, { 8, 1255, 2048 },
  10787. { 6, 1256, 2048 }, { 7, 1257, 2048 }, { 7, 1258, 2048 }, { 8, 1259, 2048 }, { 7, 1260, 2048 }, { 8, 1261, 2048 }, { 8, 1262, 2048 }, { 9, 1263, 2048 },
  10788. { 6, 1264, 2048 }, { 7, 1265, 2048 }, { 7, 1266, 2048 }, { 8, 1267, 2048 }, { 7, 1268, 2048 }, { 8, 1269, 2048 }, { 8, 1270, 2048 }, { 9, 1271, 2048 },
  10789. { 7, 1272, 2048 }, { 8, 1273, 2048 }, { 8, 1274, 2048 }, { 9, 1275, 2048 }, { 8, 1276, 2048 }, { 9, 1277, 2048 }, { 9, 1278, 2048 }, { 10, 1279, 2048 },
  10790. { 3, 1280, 2048 }, { 4, 1281, 2048 }, { 4, 1282, 2048 }, { 5, 1283, 2048 }, { 4, 1284, 2048 }, { 5, 1285, 2048 }, { 5, 1286, 2048 }, { 6, 1287, 2048 },
  10791. { 4, 1288, 2048 }, { 5, 1289, 2048 }, { 5, 1290, 2048 }, { 6, 1291, 2048 }, { 5, 1292, 2048 }, { 6, 1293, 2048 }, { 6, 1294, 2048 }, { 7, 1295, 2048 },
  10792. { 4, 1296, 2048 }, { 5, 1297, 2048 }, { 5, 1298, 2048 }, { 6, 1299, 2048 }, { 5, 1300, 2048 }, { 6, 1301, 2048 }, { 6, 1302, 2048 }, { 7, 1303, 2048 },
  10793. { 5, 1304, 2048 }, { 6, 1305, 2048 }, { 6, 1306, 2048 }, { 7, 1307, 2048 }, { 6, 1308, 2048 }, { 7, 1309, 2048 }, { 7, 1310, 2048 }, { 8, 1311, 2048 },
  10794. { 4, 1312, 2048 }, { 5, 1313, 2048 }, { 5, 1314, 2048 }, { 6, 1315, 2048 }, { 5, 1316, 2048 }, { 6, 1317, 2048 }, { 6, 1318, 2048 }, { 7, 1319, 2048 },
  10795. { 5, 1320, 2048 }, { 6, 1321, 2048 }, { 6, 1322, 2048 }, { 7, 1323, 2048 }, { 6, 1324, 2048 }, { 7, 1325, 2048 }, { 7, 1326, 2048 }, { 8, 1327, 2048 },
  10796. { 5, 1328, 2048 }, { 6, 1329, 2048 }, { 6, 1330, 2048 }, { 7, 1331, 2048 }, { 6, 1332, 2048 }, { 7, 1333, 2048 }, { 7, 1334, 2048 }, { 8, 1335, 2048 },
  10797. { 6, 1336, 2048 }, { 7, 1337, 2048 }, { 7, 1338, 2048 }, { 8, 1339, 2048 }, { 7, 1340, 2048 }, { 8, 1341, 2048 }, { 8, 1342, 2048 }, { 9, 1343, 2048 },
  10798. { 4, 1344, 2048 }, { 5, 1345, 2048 }, { 5, 1346, 2048 }, { 6, 1347, 2048 }, { 5, 1348, 2048 }, { 6, 1349, 2048 }, { 6, 1350, 2048 }, { 7, 1351, 2048 },
  10799. { 5, 1352, 2048 }, { 6, 1353, 2048 }, { 6, 1354, 2048 }, { 7, 1355, 2048 }, { 6, 1356, 2048 }, { 7, 1357, 2048 }, { 7, 1358, 2048 }, { 8, 1359, 2048 },
  10800. { 5, 1360, 2048 }, { 6, 1361, 2048 }, { 6, 1362, 2048 }, { 7, 1363, 2048 }, { 6, 1364, 2048 }, { 7, 1365, 2048 }, { 7, 1366, 2048 }, { 8, 1367, 2048 },
  10801. { 6, 1368, 2048 }, { 7, 1369, 2048 }, { 7, 1370, 2048 }, { 8, 1371, 2048 }, { 7, 1372, 2048 }, { 8, 1373, 2048 }, { 8, 1374, 2048 }, { 9, 1375, 2048 },
  10802. { 5, 1376, 2048 }, { 6, 1377, 2048 }, { 6, 1378, 2048 }, { 7, 1379, 2048 }, { 6, 1380, 2048 }, { 7, 1381, 2048 }, { 7, 1382, 2048 }, { 8, 1383, 2048 },
  10803. { 6, 1384, 2048 }, { 7, 1385, 2048 }, { 7, 1386, 2048 }, { 8, 1387, 2048 }, { 7, 1388, 2048 }, { 8, 1389, 2048 }, { 8, 1390, 2048 }, { 9, 1391, 2048 },
  10804. { 6, 1392, 2048 }, { 7, 1393, 2048 }, { 7, 1394, 2048 }, { 8, 1395, 2048 }, { 7, 1396, 2048 }, { 8, 1397, 2048 }, { 8, 1398, 2048 }, { 9, 1399, 2048 },
  10805. { 7, 1400, 2048 }, { 8, 1401, 2048 }, { 8, 1402, 2048 }, { 9, 1403, 2048 }, { 8, 1404, 2048 }, { 9, 1405, 2048 }, { 9, 1406, 2048 }, { 10, 1407, 2048 },
  10806. { 4, 1408, 2048 }, { 5, 1409, 2048 }, { 5, 1410, 2048 }, { 6, 1411, 2048 }, { 5, 1412, 2048 }, { 6, 1413, 2048 }, { 6, 1414, 2048 }, { 7, 1415, 2048 },
  10807. { 5, 1416, 2048 }, { 6, 1417, 2048 }, { 6, 1418, 2048 }, { 7, 1419, 2048 }, { 6, 1420, 2048 }, { 7, 1421, 2048 }, { 7, 1422, 2048 }, { 8, 1423, 2048 },
  10808. { 5, 1424, 2048 }, { 6, 1425, 2048 }, { 6, 1426, 2048 }, { 7, 1427, 2048 }, { 6, 1428, 2048 }, { 7, 1429, 2048 }, { 7, 1430, 2048 }, { 8, 1431, 2048 },
  10809. { 6, 1432, 2048 }, { 7, 1433, 2048 }, { 7, 1434, 2048 }, { 8, 1435, 2048 }, { 7, 1436, 2048 }, { 8, 1437, 2048 }, { 8, 1438, 2048 }, { 9, 1439, 2048 },
  10810. { 5, 1440, 2048 }, { 6, 1441, 2048 }, { 6, 1442, 2048 }, { 7, 1443, 2048 }, { 6, 1444, 2048 }, { 7, 1445, 2048 }, { 7, 1446, 2048 }, { 8, 1447, 2048 },
  10811. { 6, 1448, 2048 }, { 7, 1449, 2048 }, { 7, 1450, 2048 }, { 8, 1451, 2048 }, { 7, 1452, 2048 }, { 8, 1453, 2048 }, { 8, 1454, 2048 }, { 9, 1455, 2048 },
  10812. { 6, 1456, 2048 }, { 7, 1457, 2048 }, { 7, 1458, 2048 }, { 8, 1459, 2048 }, { 7, 1460, 2048 }, { 8, 1461, 2048 }, { 8, 1462, 2048 }, { 9, 1463, 2048 },
  10813. { 7, 1464, 2048 }, { 8, 1465, 2048 }, { 8, 1466, 2048 }, { 9, 1467, 2048 }, { 8, 1468, 2048 }, { 9, 1469, 2048 }, { 9, 1470, 2048 }, { 10, 1471, 2048 },
  10814. { 5, 1472, 2048 }, { 6, 1473, 2048 }, { 6, 1474, 2048 }, { 7, 1475, 2048 }, { 6, 1476, 2048 }, { 7, 1477, 2048 }, { 7, 1478, 2048 }, { 8, 1479, 2048 },
  10815. { 6, 1480, 2048 }, { 7, 1481, 2048 }, { 7, 1482, 2048 }, { 8, 1483, 2048 }, { 7, 1484, 2048 }, { 8, 1485, 2048 }, { 8, 1486, 2048 }, { 9, 1487, 2048 },
  10816. { 6, 1488, 2048 }, { 7, 1489, 2048 }, { 7, 1490, 2048 }, { 8, 1491, 2048 }, { 7, 1492, 2048 }, { 8, 1493, 2048 }, { 8, 1494, 2048 }, { 9, 1495, 2048 },
  10817. { 7, 1496, 2048 }, { 8, 1497, 2048 }, { 8, 1498, 2048 }, { 9, 1499, 2048 }, { 8, 1500, 2048 }, { 9, 1501, 2048 }, { 9, 1502, 2048 }, { 10, 1503, 2048 },
  10818. { 6, 1504, 2048 }, { 7, 1505, 2048 }, { 7, 1506, 2048 }, { 8, 1507, 2048 }, { 7, 1508, 2048 }, { 8, 1509, 2048 }, { 8, 1510, 2048 }, { 9, 1511, 2048 },
  10819. { 7, 1512, 2048 }, { 8, 1513, 2048 }, { 8, 1514, 2048 }, { 9, 1515, 2048 }, { 8, 1516, 2048 }, { 9, 1517, 2048 }, { 9, 1518, 2048 }, { 10, 1519, 2048 },
  10820. { 7, 1520, 2048 }, { 8, 1521, 2048 }, { 8, 1522, 2048 }, { 9, 1523, 2048 }, { 8, 1524, 2048 }, { 9, 1525, 2048 }, { 9, 1526, 2048 }, { 10, 1527, 2048 },
  10821. { 8, 1528, 2048 }, { 9, 1529, 2048 }, { 9, 1530, 2048 }, { 10, 1531, 2048 }, { 9, 1532, 2048 }, { 10, 1533, 2048 }, { 10, 1534, 2048 }, { 11, 1535, 2048 },
  10822. { 3, 1536, 2048 }, { 4, 1537, 2048 }, { 4, 1538, 2048 }, { 5, 1539, 2048 }, { 4, 1540, 2048 }, { 5, 1541, 2048 }, { 5, 1542, 2048 }, { 6, 1543, 2048 },
  10823. { 4, 1544, 2048 }, { 5, 1545, 2048 }, { 5, 1546, 2048 }, { 6, 1547, 2048 }, { 5, 1548, 2048 }, { 6, 1549, 2048 }, { 6, 1550, 2048 }, { 7, 1551, 2048 },
  10824. { 4, 1552, 2048 }, { 5, 1553, 2048 }, { 5, 1554, 2048 }, { 6, 1555, 2048 }, { 5, 1556, 2048 }, { 6, 1557, 2048 }, { 6, 1558, 2048 }, { 7, 1559, 2048 },
  10825. { 5, 1560, 2048 }, { 6, 1561, 2048 }, { 6, 1562, 2048 }, { 7, 1563, 2048 }, { 6, 1564, 2048 }, { 7, 1565, 2048 }, { 7, 1566, 2048 }, { 8, 1567, 2048 },
  10826. { 4, 1568, 2048 }, { 5, 1569, 2048 }, { 5, 1570, 2048 }, { 6, 1571, 2048 }, { 5, 1572, 2048 }, { 6, 1573, 2048 }, { 6, 1574, 2048 }, { 7, 1575, 2048 },
  10827. { 5, 1576, 2048 }, { 6, 1577, 2048 }, { 6, 1578, 2048 }, { 7, 1579, 2048 }, { 6, 1580, 2048 }, { 7, 1581, 2048 }, { 7, 1582, 2048 }, { 8, 1583, 2048 },
  10828. { 5, 1584, 2048 }, { 6, 1585, 2048 }, { 6, 1586, 2048 }, { 7, 1587, 2048 }, { 6, 1588, 2048 }, { 7, 1589, 2048 }, { 7, 1590, 2048 }, { 8, 1591, 2048 },
  10829. { 6, 1592, 2048 }, { 7, 1593, 2048 }, { 7, 1594, 2048 }, { 8, 1595, 2048 }, { 7, 1596, 2048 }, { 8, 1597, 2048 }, { 8, 1598, 2048 }, { 9, 1599, 2048 },
  10830. { 4, 1600, 2048 }, { 5, 1601, 2048 }, { 5, 1602, 2048 }, { 6, 1603, 2048 }, { 5, 1604, 2048 }, { 6, 1605, 2048 }, { 6, 1606, 2048 }, { 7, 1607, 2048 },
  10831. { 5, 1608, 2048 }, { 6, 1609, 2048 }, { 6, 1610, 2048 }, { 7, 1611, 2048 }, { 6, 1612, 2048 }, { 7, 1613, 2048 }, { 7, 1614, 2048 }, { 8, 1615, 2048 },
  10832. { 5, 1616, 2048 }, { 6, 1617, 2048 }, { 6, 1618, 2048 }, { 7, 1619, 2048 }, { 6, 1620, 2048 }, { 7, 1621, 2048 }, { 7, 1622, 2048 }, { 8, 1623, 2048 },
  10833. { 6, 1624, 2048 }, { 7, 1625, 2048 }, { 7, 1626, 2048 }, { 8, 1627, 2048 }, { 7, 1628, 2048 }, { 8, 1629, 2048 }, { 8, 1630, 2048 }, { 9, 1631, 2048 },
  10834. { 5, 1632, 2048 }, { 6, 1633, 2048 }, { 6, 1634, 2048 }, { 7, 1635, 2048 }, { 6, 1636, 2048 }, { 7, 1637, 2048 }, { 7, 1638, 2048 }, { 8, 1639, 2048 },
  10835. { 6, 1640, 2048 }, { 7, 1641, 2048 }, { 7, 1642, 2048 }, { 8, 1643, 2048 }, { 7, 1644, 2048 }, { 8, 1645, 2048 }, { 8, 1646, 2048 }, { 9, 1647, 2048 },
  10836. { 6, 1648, 2048 }, { 7, 1649, 2048 }, { 7, 1650, 2048 }, { 8, 1651, 2048 }, { 7, 1652, 2048 }, { 8, 1653, 2048 }, { 8, 1654, 2048 }, { 9, 1655, 2048 },
  10837. { 7, 1656, 2048 }, { 8, 1657, 2048 }, { 8, 1658, 2048 }, { 9, 1659, 2048 }, { 8, 1660, 2048 }, { 9, 1661, 2048 }, { 9, 1662, 2048 }, { 10, 1663, 2048 },
  10838. { 4, 1664, 2048 }, { 5, 1665, 2048 }, { 5, 1666, 2048 }, { 6, 1667, 2048 }, { 5, 1668, 2048 }, { 6, 1669, 2048 }, { 6, 1670, 2048 }, { 7, 1671, 2048 },
  10839. { 5, 1672, 2048 }, { 6, 1673, 2048 }, { 6, 1674, 2048 }, { 7, 1675, 2048 }, { 6, 1676, 2048 }, { 7, 1677, 2048 }, { 7, 1678, 2048 }, { 8, 1679, 2048 },
  10840. { 5, 1680, 2048 }, { 6, 1681, 2048 }, { 6, 1682, 2048 }, { 7, 1683, 2048 }, { 6, 1684, 2048 }, { 7, 1685, 2048 }, { 7, 1686, 2048 }, { 8, 1687, 2048 },
  10841. { 6, 1688, 2048 }, { 7, 1689, 2048 }, { 7, 1690, 2048 }, { 8, 1691, 2048 }, { 7, 1692, 2048 }, { 8, 1693, 2048 }, { 8, 1694, 2048 }, { 9, 1695, 2048 },
  10842. { 5, 1696, 2048 }, { 6, 1697, 2048 }, { 6, 1698, 2048 }, { 7, 1699, 2048 }, { 6, 1700, 2048 }, { 7, 1701, 2048 }, { 7, 1702, 2048 }, { 8, 1703, 2048 },
  10843. { 6, 1704, 2048 }, { 7, 1705, 2048 }, { 7, 1706, 2048 }, { 8, 1707, 2048 }, { 7, 1708, 2048 }, { 8, 1709, 2048 }, { 8, 1710, 2048 }, { 9, 1711, 2048 },
  10844. { 6, 1712, 2048 }, { 7, 1713, 2048 }, { 7, 1714, 2048 }, { 8, 1715, 2048 }, { 7, 1716, 2048 }, { 8, 1717, 2048 }, { 8, 1718, 2048 }, { 9, 1719, 2048 },
  10845. { 7, 1720, 2048 }, { 8, 1721, 2048 }, { 8, 1722, 2048 }, { 9, 1723, 2048 }, { 8, 1724, 2048 }, { 9, 1725, 2048 }, { 9, 1726, 2048 }, { 10, 1727, 2048 },
  10846. { 5, 1728, 2048 }, { 6, 1729, 2048 }, { 6, 1730, 2048 }, { 7, 1731, 2048 }, { 6, 1732, 2048 }, { 7, 1733, 2048 }, { 7, 1734, 2048 }, { 8, 1735, 2048 },
  10847. { 6, 1736, 2048 }, { 7, 1737, 2048 }, { 7, 1738, 2048 }, { 8, 1739, 2048 }, { 7, 1740, 2048 }, { 8, 1741, 2048 }, { 8, 1742, 2048 }, { 9, 1743, 2048 },
  10848. { 6, 1744, 2048 }, { 7, 1745, 2048 }, { 7, 1746, 2048 }, { 8, 1747, 2048 }, { 7, 1748, 2048 }, { 8, 1749, 2048 }, { 8, 1750, 2048 }, { 9, 1751, 2048 },
  10849. { 7, 1752, 2048 }, { 8, 1753, 2048 }, { 8, 1754, 2048 }, { 9, 1755, 2048 }, { 8, 1756, 2048 }, { 9, 1757, 2048 }, { 9, 1758, 2048 }, { 10, 1759, 2048 },
  10850. { 6, 1760, 2048 }, { 7, 1761, 2048 }, { 7, 1762, 2048 }, { 8, 1763, 2048 }, { 7, 1764, 2048 }, { 8, 1765, 2048 }, { 8, 1766, 2048 }, { 9, 1767, 2048 },
  10851. { 7, 1768, 2048 }, { 8, 1769, 2048 }, { 8, 1770, 2048 }, { 9, 1771, 2048 }, { 8, 1772, 2048 }, { 9, 1773, 2048 }, { 9, 1774, 2048 }, { 10, 1775, 2048 },
  10852. { 7, 1776, 2048 }, { 8, 1777, 2048 }, { 8, 1778, 2048 }, { 9, 1779, 2048 }, { 8, 1780, 2048 }, { 9, 1781, 2048 }, { 9, 1782, 2048 }, { 10, 1783, 2048 },
  10853. { 8, 1784, 2048 }, { 9, 1785, 2048 }, { 9, 1786, 2048 }, { 10, 1787, 2048 }, { 9, 1788, 2048 }, { 10, 1789, 2048 }, { 10, 1790, 2048 }, { 11, 1791, 2048 },
  10854. { 4, 1792, 2048 }, { 5, 1793, 2048 }, { 5, 1794, 2048 }, { 6, 1795, 2048 }, { 5, 1796, 2048 }, { 6, 1797, 2048 }, { 6, 1798, 2048 }, { 7, 1799, 2048 },
  10855. { 5, 1800, 2048 }, { 6, 1801, 2048 }, { 6, 1802, 2048 }, { 7, 1803, 2048 }, { 6, 1804, 2048 }, { 7, 1805, 2048 }, { 7, 1806, 2048 }, { 8, 1807, 2048 },
  10856. { 5, 1808, 2048 }, { 6, 1809, 2048 }, { 6, 1810, 2048 }, { 7, 1811, 2048 }, { 6, 1812, 2048 }, { 7, 1813, 2048 }, { 7, 1814, 2048 }, { 8, 1815, 2048 },
  10857. { 6, 1816, 2048 }, { 7, 1817, 2048 }, { 7, 1818, 2048 }, { 8, 1819, 2048 }, { 7, 1820, 2048 }, { 8, 1821, 2048 }, { 8, 1822, 2048 }, { 9, 1823, 2048 },
  10858. { 5, 1824, 2048 }, { 6, 1825, 2048 }, { 6, 1826, 2048 }, { 7, 1827, 2048 }, { 6, 1828, 2048 }, { 7, 1829, 2048 }, { 7, 1830, 2048 }, { 8, 1831, 2048 },
  10859. { 6, 1832, 2048 }, { 7, 1833, 2048 }, { 7, 1834, 2048 }, { 8, 1835, 2048 }, { 7, 1836, 2048 }, { 8, 1837, 2048 }, { 8, 1838, 2048 }, { 9, 1839, 2048 },
  10860. { 6, 1840, 2048 }, { 7, 1841, 2048 }, { 7, 1842, 2048 }, { 8, 1843, 2048 }, { 7, 1844, 2048 }, { 8, 1845, 2048 }, { 8, 1846, 2048 }, { 9, 1847, 2048 },
  10861. { 7, 1848, 2048 }, { 8, 1849, 2048 }, { 8, 1850, 2048 }, { 9, 1851, 2048 }, { 8, 1852, 2048 }, { 9, 1853, 2048 }, { 9, 1854, 2048 }, { 10, 1855, 2048 },
  10862. { 5, 1856, 2048 }, { 6, 1857, 2048 }, { 6, 1858, 2048 }, { 7, 1859, 2048 }, { 6, 1860, 2048 }, { 7, 1861, 2048 }, { 7, 1862, 2048 }, { 8, 1863, 2048 },
  10863. { 6, 1864, 2048 }, { 7, 1865, 2048 }, { 7, 1866, 2048 }, { 8, 1867, 2048 }, { 7, 1868, 2048 }, { 8, 1869, 2048 }, { 8, 1870, 2048 }, { 9, 1871, 2048 },
  10864. { 6, 1872, 2048 }, { 7, 1873, 2048 }, { 7, 1874, 2048 }, { 8, 1875, 2048 }, { 7, 1876, 2048 }, { 8, 1877, 2048 }, { 8, 1878, 2048 }, { 9, 1879, 2048 },
  10865. { 7, 1880, 2048 }, { 8, 1881, 2048 }, { 8, 1882, 2048 }, { 9, 1883, 2048 }, { 8, 1884, 2048 }, { 9, 1885, 2048 }, { 9, 1886, 2048 }, { 10, 1887, 2048 },
  10866. { 6, 1888, 2048 }, { 7, 1889, 2048 }, { 7, 1890, 2048 }, { 8, 1891, 2048 }, { 7, 1892, 2048 }, { 8, 1893, 2048 }, { 8, 1894, 2048 }, { 9, 1895, 2048 },
  10867. { 7, 1896, 2048 }, { 8, 1897, 2048 }, { 8, 1898, 2048 }, { 9, 1899, 2048 }, { 8, 1900, 2048 }, { 9, 1901, 2048 }, { 9, 1902, 2048 }, { 10, 1903, 2048 },
  10868. { 7, 1904, 2048 }, { 8, 1905, 2048 }, { 8, 1906, 2048 }, { 9, 1907, 2048 }, { 8, 1908, 2048 }, { 9, 1909, 2048 }, { 9, 1910, 2048 }, { 10, 1911, 2048 },
  10869. { 8, 1912, 2048 }, { 9, 1913, 2048 }, { 9, 1914, 2048 }, { 10, 1915, 2048 }, { 9, 1916, 2048 }, { 10, 1917, 2048 }, { 10, 1918, 2048 }, { 11, 1919, 2048 },
  10870. { 5, 1920, 2048 }, { 6, 1921, 2048 }, { 6, 1922, 2048 }, { 7, 1923, 2048 }, { 6, 1924, 2048 }, { 7, 1925, 2048 }, { 7, 1926, 2048 }, { 8, 1927, 2048 },
  10871. { 6, 1928, 2048 }, { 7, 1929, 2048 }, { 7, 1930, 2048 }, { 8, 1931, 2048 }, { 7, 1932, 2048 }, { 8, 1933, 2048 }, { 8, 1934, 2048 }, { 9, 1935, 2048 },
  10872. { 6, 1936, 2048 }, { 7, 1937, 2048 }, { 7, 1938, 2048 }, { 8, 1939, 2048 }, { 7, 1940, 2048 }, { 8, 1941, 2048 }, { 8, 1942, 2048 }, { 9, 1943, 2048 },
  10873. { 7, 1944, 2048 }, { 8, 1945, 2048 }, { 8, 1946, 2048 }, { 9, 1947, 2048 }, { 8, 1948, 2048 }, { 9, 1949, 2048 }, { 9, 1950, 2048 }, { 10, 1951, 2048 },
  10874. { 6, 1952, 2048 }, { 7, 1953, 2048 }, { 7, 1954, 2048 }, { 8, 1955, 2048 }, { 7, 1956, 2048 }, { 8, 1957, 2048 }, { 8, 1958, 2048 }, { 9, 1959, 2048 },
  10875. { 7, 1960, 2048 }, { 8, 1961, 2048 }, { 8, 1962, 2048 }, { 9, 1963, 2048 }, { 8, 1964, 2048 }, { 9, 1965, 2048 }, { 9, 1966, 2048 }, { 10, 1967, 2048 },
  10876. { 7, 1968, 2048 }, { 8, 1969, 2048 }, { 8, 1970, 2048 }, { 9, 1971, 2048 }, { 8, 1972, 2048 }, { 9, 1973, 2048 }, { 9, 1974, 2048 }, { 10, 1975, 2048 },
  10877. { 8, 1976, 2048 }, { 9, 1977, 2048 }, { 9, 1978, 2048 }, { 10, 1979, 2048 }, { 9, 1980, 2048 }, { 10, 1981, 2048 }, { 10, 1982, 2048 }, { 11, 1983, 2048 },
  10878. { 6, 1984, 2048 }, { 7, 1985, 2048 }, { 7, 1986, 2048 }, { 8, 1987, 2048 }, { 7, 1988, 2048 }, { 8, 1989, 2048 }, { 8, 1990, 2048 }, { 9, 1991, 2048 },
  10879. { 7, 1992, 2048 }, { 8, 1993, 2048 }, { 8, 1994, 2048 }, { 9, 1995, 2048 }, { 8, 1996, 2048 }, { 9, 1997, 2048 }, { 9, 1998, 2048 }, { 10, 1999, 2048 },
  10880. { 7, 2000, 2048 }, { 8, 2001, 2048 }, { 8, 2002, 2048 }, { 9, 2003, 2048 }, { 8, 2004, 2048 }, { 9, 2005, 2048 }, { 9, 2006, 2048 }, { 10, 2007, 2048 },
  10881. { 8, 2008, 2048 }, { 9, 2009, 2048 }, { 9, 2010, 2048 }, { 10, 2011, 2048 }, { 9, 2012, 2048 }, { 10, 2013, 2048 }, { 10, 2014, 2048 }, { 11, 2015, 2048 },
  10882. { 7, 2016, 2048 }, { 8, 2017, 2048 }, { 8, 2018, 2048 }, { 9, 2019, 2048 }, { 8, 2020, 2048 }, { 9, 2021, 2048 }, { 9, 2022, 2048 }, { 10, 2023, 2048 },
  10883. { 8, 2024, 2048 }, { 9, 2025, 2048 }, { 9, 2026, 2048 }, { 10, 2027, 2048 }, { 9, 2028, 2048 }, { 10, 2029, 2048 }, { 10, 2030, 2048 }, { 11, 2031, 2048 },
  10884. { 8, 2032, 2048 }, { 9, 2033, 2048 }, { 9, 2034, 2048 }, { 10, 2035, 2048 }, { 9, 2036, 2048 }, { 10, 2037, 2048 }, { 10, 2038, 2048 }, { 11, 2039, 2048 },
  10885. { 9, 2040, 2048 }, { 10, 2041, 2048 }, { 10, 2042, 2048 }, { 11, 2043, 2048 }, { 10, 2044, 2048 }, { 11, 2045, 2048 }, { 11, 2046, 2048 }, { 12, 2047, 2048 },
  10886. #endif
  10887. #endif
  10888. #endif
  10889. #endif
  10890. #endif
  10891. #endif
  10892. };
  10893. /* find a hole and free as required, return -1 if no hole found */
  10894. static int find_hole(void)
  10895. {
  10896. int x, y, z;
  10897. for (z = -1, y = INT_MAX, x = 0; x < FP_ENTRIES; x++) {
  10898. if (fp_cache[x].lru_count < y && fp_cache[x].lock == 0) {
  10899. z = x;
  10900. y = fp_cache[x].lru_count;
  10901. }
  10902. }
  10903. /* decrease all */
  10904. for (x = 0; x < FP_ENTRIES; x++) {
  10905. if (fp_cache[x].lru_count > 3) {
  10906. --(fp_cache[x].lru_count);
  10907. }
  10908. }
  10909. /* free entry z */
  10910. if (z >= 0 && fp_cache[z].g) {
  10911. mp_clear(&fp_cache[z].mu);
  10912. wc_ecc_del_point(fp_cache[z].g);
  10913. fp_cache[z].g = NULL;
  10914. for (x = 0; x < (1<<FP_LUT); x++) {
  10915. wc_ecc_del_point(fp_cache[z].LUT[x]);
  10916. fp_cache[z].LUT[x] = NULL;
  10917. }
  10918. fp_cache[z].LUT_set = 0;
  10919. fp_cache[z].lru_count = 0;
  10920. }
  10921. return z;
  10922. }
  10923. /* determine if a base is already in the cache and if so, where */
  10924. static int find_base(ecc_point* g)
  10925. {
  10926. int x;
  10927. for (x = 0; x < FP_ENTRIES; x++) {
  10928. if (fp_cache[x].g != NULL &&
  10929. mp_cmp(fp_cache[x].g->x, g->x) == MP_EQ &&
  10930. mp_cmp(fp_cache[x].g->y, g->y) == MP_EQ &&
  10931. mp_cmp(fp_cache[x].g->z, g->z) == MP_EQ) {
  10932. break;
  10933. }
  10934. }
  10935. if (x == FP_ENTRIES) {
  10936. x = -1;
  10937. }
  10938. return x;
  10939. }
  10940. /* add a new base to the cache */
  10941. static int add_entry(int idx, ecc_point *g)
  10942. {
  10943. unsigned x, y;
  10944. /* allocate base and LUT */
  10945. fp_cache[idx].g = wc_ecc_new_point();
  10946. if (fp_cache[idx].g == NULL) {
  10947. return GEN_MEM_ERR;
  10948. }
  10949. /* copy x and y */
  10950. if ((mp_copy(g->x, fp_cache[idx].g->x) != MP_OKAY) ||
  10951. (mp_copy(g->y, fp_cache[idx].g->y) != MP_OKAY) ||
  10952. (mp_copy(g->z, fp_cache[idx].g->z) != MP_OKAY)) {
  10953. wc_ecc_del_point(fp_cache[idx].g);
  10954. fp_cache[idx].g = NULL;
  10955. return GEN_MEM_ERR;
  10956. }
  10957. for (x = 0; x < (1U<<FP_LUT); x++) {
  10958. fp_cache[idx].LUT[x] = wc_ecc_new_point();
  10959. if (fp_cache[idx].LUT[x] == NULL) {
  10960. for (y = 0; y < x; y++) {
  10961. wc_ecc_del_point(fp_cache[idx].LUT[y]);
  10962. fp_cache[idx].LUT[y] = NULL;
  10963. }
  10964. wc_ecc_del_point(fp_cache[idx].g);
  10965. fp_cache[idx].g = NULL;
  10966. fp_cache[idx].lru_count = 0;
  10967. return GEN_MEM_ERR;
  10968. }
  10969. }
  10970. fp_cache[idx].LUT_set = 0;
  10971. fp_cache[idx].lru_count = 0;
  10972. return MP_OKAY;
  10973. }
  10974. #endif
  10975. #if !defined(WOLFSSL_SP_MATH)
  10976. /* build the LUT by spacing the bits of the input by #modulus/FP_LUT bits apart
  10977. *
  10978. * The algorithm builds patterns in increasing bit order by first making all
  10979. * single bit input patterns, then all two bit input patterns and so on
  10980. */
  10981. static int build_lut(int idx, mp_int* a, mp_int* modulus, mp_digit mp,
  10982. mp_int* mu)
  10983. {
  10984. int err;
  10985. unsigned x, y, bitlen, lut_gap;
  10986. #ifdef WOLFSSL_SMALL_STACK
  10987. mp_int *tmp = NULL;
  10988. #else
  10989. mp_int tmp[1];
  10990. #endif
  10991. int infinity;
  10992. #ifdef WOLFSSL_SMALL_STACK
  10993. if ((tmp = (mp_int *)XMALLOC(sizeof(*tmp), NULL, DYNAMIC_TYPE_ECC_BUFFER)) == NULL)
  10994. return MEMORY_E;
  10995. #endif
  10996. err = mp_init(tmp);
  10997. if (err != MP_OKAY) {
  10998. err = GEN_MEM_ERR;
  10999. goto errout;
  11000. }
  11001. /* sanity check to make sure lut_order table is of correct size,
  11002. should compile out to a NOP if true */
  11003. if ((sizeof(lut_orders) / sizeof(lut_orders[0])) < (1U<<FP_LUT)) {
  11004. err = BAD_FUNC_ARG;
  11005. goto errout;
  11006. }
  11007. /* get bitlen and round up to next multiple of FP_LUT */
  11008. bitlen = (unsigned)mp_unsigned_bin_size(modulus) << 3;
  11009. x = bitlen % FP_LUT;
  11010. if (x) {
  11011. bitlen += FP_LUT - x;
  11012. }
  11013. lut_gap = bitlen / FP_LUT;
  11014. /* init the mu */
  11015. err = mp_init_copy(&fp_cache[idx].mu, mu);
  11016. if (err != MP_OKAY)
  11017. goto errout;
  11018. /* copy base */
  11019. if ((mp_mulmod(fp_cache[idx].g->x, mu, modulus,
  11020. fp_cache[idx].LUT[1]->x) != MP_OKAY) ||
  11021. (mp_mulmod(fp_cache[idx].g->y, mu, modulus,
  11022. fp_cache[idx].LUT[1]->y) != MP_OKAY) ||
  11023. (mp_mulmod(fp_cache[idx].g->z, mu, modulus,
  11024. fp_cache[idx].LUT[1]->z) != MP_OKAY)) {
  11025. err = MP_MULMOD_E;
  11026. goto errout;
  11027. }
  11028. /* make all single bit entries */
  11029. for (x = 1; x < FP_LUT; x++) {
  11030. if ((mp_copy(fp_cache[idx].LUT[1<<(x-1)]->x,
  11031. fp_cache[idx].LUT[1<<x]->x) != MP_OKAY) ||
  11032. (mp_copy(fp_cache[idx].LUT[1<<(x-1)]->y,
  11033. fp_cache[idx].LUT[1<<x]->y) != MP_OKAY) ||
  11034. (mp_copy(fp_cache[idx].LUT[1<<(x-1)]->z,
  11035. fp_cache[idx].LUT[1<<x]->z) != MP_OKAY)){
  11036. err = MP_INIT_E;
  11037. goto errout;
  11038. } else {
  11039. /* now double it bitlen/FP_LUT times */
  11040. for (y = 0; y < lut_gap; y++) {
  11041. if ((err = ecc_projective_dbl_point_safe(fp_cache[idx].LUT[1<<x],
  11042. fp_cache[idx].LUT[1<<x], a, modulus, mp)) != MP_OKAY) {
  11043. goto errout;
  11044. }
  11045. }
  11046. }
  11047. }
  11048. /* now make all entries in increase order of hamming weight */
  11049. for (x = 2; x <= FP_LUT; x++) {
  11050. if (err != MP_OKAY)
  11051. goto errout;
  11052. for (y = 0; y < (1UL<<FP_LUT); y++) {
  11053. if (lut_orders[y].ham != (int)x) continue;
  11054. /* perform the add */
  11055. if ((err = ecc_projective_add_point_safe(
  11056. fp_cache[idx].LUT[lut_orders[y].terma],
  11057. fp_cache[idx].LUT[lut_orders[y].termb],
  11058. fp_cache[idx].LUT[y], a, modulus, mp,
  11059. &infinity)) != MP_OKAY) {
  11060. goto errout;
  11061. }
  11062. }
  11063. }
  11064. /* now map all entries back to affine space to make point addition faster */
  11065. for (x = 1; x < (1UL<<FP_LUT); x++) {
  11066. if (err != MP_OKAY)
  11067. break;
  11068. /* convert z to normal from montgomery */
  11069. err = mp_montgomery_reduce(fp_cache[idx].LUT[x]->z, modulus, mp);
  11070. /* invert it */
  11071. if (err == MP_OKAY)
  11072. err = mp_invmod(fp_cache[idx].LUT[x]->z, modulus,
  11073. fp_cache[idx].LUT[x]->z);
  11074. if (err == MP_OKAY)
  11075. /* now square it */
  11076. err = mp_sqrmod(fp_cache[idx].LUT[x]->z, modulus, tmp);
  11077. if (err == MP_OKAY)
  11078. /* fix x */
  11079. err = mp_mulmod(fp_cache[idx].LUT[x]->x, tmp, modulus,
  11080. fp_cache[idx].LUT[x]->x);
  11081. if (err == MP_OKAY)
  11082. /* get 1/z^3 */
  11083. err = mp_mulmod(tmp, fp_cache[idx].LUT[x]->z, modulus, tmp);
  11084. if (err == MP_OKAY)
  11085. /* fix y */
  11086. err = mp_mulmod(fp_cache[idx].LUT[x]->y, tmp, modulus,
  11087. fp_cache[idx].LUT[x]->y);
  11088. if (err == MP_OKAY)
  11089. /* free z */
  11090. mp_clear(fp_cache[idx].LUT[x]->z);
  11091. }
  11092. errout:
  11093. mp_clear(tmp);
  11094. #ifdef WOLFSSL_SMALL_STACK
  11095. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11096. #endif
  11097. if (err == MP_OKAY) {
  11098. fp_cache[idx].LUT_set = 1;
  11099. return MP_OKAY;
  11100. }
  11101. /* err cleanup */
  11102. for (y = 0; y < (1U<<FP_LUT); y++) {
  11103. wc_ecc_del_point(fp_cache[idx].LUT[y]);
  11104. fp_cache[idx].LUT[y] = NULL;
  11105. }
  11106. wc_ecc_del_point(fp_cache[idx].g);
  11107. fp_cache[idx].g = NULL;
  11108. fp_cache[idx].LUT_set = 0;
  11109. fp_cache[idx].lru_count = 0;
  11110. mp_clear(&fp_cache[idx].mu);
  11111. return err;
  11112. }
  11113. /* perform a fixed point ECC mulmod */
  11114. static int accel_fp_mul(int idx, const mp_int* k, ecc_point *R, mp_int* a,
  11115. mp_int* modulus, mp_digit mp, int map)
  11116. {
  11117. #ifdef WOLFCRYPT_HAVE_SAKKE
  11118. #define KB_SIZE 256
  11119. #else
  11120. #define KB_SIZE 128
  11121. #endif
  11122. #ifdef WOLFSSL_SMALL_STACK
  11123. unsigned char* kb = NULL;
  11124. mp_int* tk = NULL;
  11125. mp_int* order = NULL;
  11126. #else
  11127. unsigned char kb[KB_SIZE];
  11128. mp_int tk[1];
  11129. mp_int order[1];
  11130. #endif
  11131. int x, err;
  11132. unsigned y, z = 0, bitlen, bitpos, lut_gap;
  11133. int first;
  11134. int tk_zeroize = 0;
  11135. #ifdef WOLFSSL_SMALL_STACK
  11136. tk = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  11137. if (tk == NULL) {
  11138. err = MEMORY_E; goto done;
  11139. }
  11140. order = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  11141. if (order == NULL) {
  11142. err = MEMORY_E; goto done;
  11143. }
  11144. #endif
  11145. if (mp_init_multi(tk, order, NULL, NULL, NULL, NULL) != MP_OKAY) {
  11146. err = MP_INIT_E; goto done;
  11147. }
  11148. if ((err = mp_copy(k, tk)) != MP_OKAY)
  11149. goto done;
  11150. tk_zeroize = 1;
  11151. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11152. mp_memzero_add("accel_fp_mul tk", tk);
  11153. #endif
  11154. /* if it's smaller than modulus we fine */
  11155. if (mp_unsigned_bin_size(k) > mp_unsigned_bin_size(modulus)) {
  11156. /* find order */
  11157. y = (unsigned)mp_unsigned_bin_size(modulus);
  11158. for (x = 0; ecc_sets[x].size; x++) {
  11159. if (y <= (unsigned)ecc_sets[x].size) break;
  11160. }
  11161. /* back off if we are on the 521 bit curve */
  11162. if (y == 66) --x;
  11163. if ((err = mp_read_radix(order, ecc_sets[x].order,
  11164. MP_RADIX_HEX)) != MP_OKAY) {
  11165. goto done;
  11166. }
  11167. /* k must be less than modulus */
  11168. if (mp_cmp(tk, order) != MP_LT) {
  11169. if ((err = mp_mod(tk, order, tk)) != MP_OKAY) {
  11170. goto done;
  11171. }
  11172. }
  11173. }
  11174. /* get bitlen and round up to next multiple of FP_LUT */
  11175. bitlen = (unsigned)mp_unsigned_bin_size(modulus) << 3;
  11176. x = bitlen % FP_LUT;
  11177. if (x) {
  11178. bitlen += FP_LUT - (unsigned)x;
  11179. }
  11180. lut_gap = bitlen / FP_LUT;
  11181. /* get the k value */
  11182. if (mp_unsigned_bin_size(tk) > (int)(KB_SIZE - 2)) {
  11183. err = BUFFER_E; goto done;
  11184. }
  11185. /* store k */
  11186. #ifdef WOLFSSL_SMALL_STACK
  11187. kb = (unsigned char*)XMALLOC(KB_SIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11188. if (kb == NULL) {
  11189. err = MEMORY_E; goto done;
  11190. }
  11191. #endif
  11192. XMEMSET(kb, 0, KB_SIZE);
  11193. if ((err = mp_to_unsigned_bin(tk, kb)) == MP_OKAY) {
  11194. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11195. wc_MemZero_Add("accel_fp_mul kb", kb, KB_SIZE);
  11196. #endif
  11197. /* let's reverse kb so it's little endian */
  11198. x = 0;
  11199. y = (unsigned)mp_unsigned_bin_size(tk);
  11200. if (y > 0) {
  11201. y -= 1;
  11202. }
  11203. while ((unsigned)x < y) {
  11204. z = kb[x]; kb[x] = kb[y]; kb[y] = (byte)z;
  11205. ++x; --y;
  11206. }
  11207. /* at this point we can start, yipee */
  11208. first = 1;
  11209. for (x = (int)lut_gap-1; x >= 0; x--) {
  11210. /* extract FP_LUT bits from kb spread out by lut_gap bits and offset
  11211. by x bits from the start */
  11212. bitpos = (unsigned)x;
  11213. for (y = z = 0; y < FP_LUT; y++) {
  11214. z |= ((kb[bitpos>>3] >> (bitpos&7)) & 1) << y;
  11215. bitpos += lut_gap; /* it's y*lut_gap + x, but here we can avoid
  11216. the mult in each loop */
  11217. }
  11218. /* double if not first */
  11219. if (!first) {
  11220. if ((err = ecc_projective_dbl_point_safe(R, R, a, modulus,
  11221. mp)) != MP_OKAY) {
  11222. break;
  11223. }
  11224. }
  11225. /* add if not first, otherwise copy */
  11226. if (!first && z) {
  11227. if ((err = ecc_projective_add_point_safe(R, fp_cache[idx].LUT[z],
  11228. R, a, modulus, mp, &first)) != MP_OKAY) {
  11229. break;
  11230. }
  11231. } else if (z) {
  11232. if ((mp_copy(fp_cache[idx].LUT[z]->x, R->x) != MP_OKAY) ||
  11233. (mp_copy(fp_cache[idx].LUT[z]->y, R->y) != MP_OKAY) ||
  11234. (mp_copy(&fp_cache[idx].mu, R->z) != MP_OKAY)) {
  11235. err = GEN_MEM_ERR;
  11236. break;
  11237. }
  11238. first = 0;
  11239. }
  11240. }
  11241. }
  11242. if (err == MP_OKAY) {
  11243. (void) z; /* Acknowledge the unused assignment */
  11244. ForceZero(kb, KB_SIZE);
  11245. /* map R back from projective space */
  11246. if (map) {
  11247. err = ecc_map(R, modulus, mp);
  11248. } else {
  11249. err = MP_OKAY;
  11250. }
  11251. }
  11252. done:
  11253. /* cleanup */
  11254. mp_clear(order);
  11255. /* Ensure it was initialized. */
  11256. if (tk_zeroize) {
  11257. mp_forcezero(tk);
  11258. }
  11259. #ifdef WOLFSSL_SMALL_STACK
  11260. XFREE(kb, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11261. XFREE(order, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11262. XFREE(tk, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11263. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  11264. wc_MemZero_Check(kb, KB_SIZE);
  11265. mp_memzero_check(tk);
  11266. #endif
  11267. #undef KB_SIZE
  11268. return err;
  11269. }
  11270. #endif
  11271. #ifdef ECC_SHAMIR
  11272. #if !defined(WOLFSSL_SP_MATH)
  11273. /* perform a fixed point ECC mulmod */
  11274. static int accel_fp_mul2add(int idx1, int idx2,
  11275. mp_int* kA, mp_int* kB,
  11276. ecc_point *R, mp_int* a,
  11277. mp_int* modulus, mp_digit mp)
  11278. {
  11279. #define KB_SIZE 128
  11280. #ifdef WOLFSSL_SMALL_STACK
  11281. unsigned char* kb[2] = {NULL, NULL};
  11282. mp_int* tka = NULL;
  11283. mp_int* tkb = NULL;
  11284. mp_int* order = NULL;
  11285. #else
  11286. unsigned char kb[2][KB_SIZE];
  11287. mp_int tka[1];
  11288. mp_int tkb[1];
  11289. mp_int order[1];
  11290. #endif
  11291. int x, err;
  11292. unsigned y, z, bitlen, bitpos, lut_gap, zA, zB;
  11293. int first;
  11294. #ifdef WOLFSSL_SMALL_STACK
  11295. tka = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  11296. if (tka == NULL) {
  11297. err = MEMORY_E; goto done;
  11298. }
  11299. tkb = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  11300. if (tkb == NULL) {
  11301. err = MEMORY_E; goto done;
  11302. }
  11303. order = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  11304. if (order == NULL) {
  11305. err = MEMORY_E; goto done;
  11306. }
  11307. #endif
  11308. if (mp_init_multi(tka, tkb, order, NULL, NULL, NULL) != MP_OKAY) {
  11309. err = MP_INIT_E; goto done;
  11310. }
  11311. /* if it's smaller than modulus we fine */
  11312. if (mp_unsigned_bin_size(kA) > mp_unsigned_bin_size(modulus)) {
  11313. /* find order */
  11314. y = (unsigned)mp_unsigned_bin_size(modulus);
  11315. for (x = 0; ecc_sets[x].size; x++) {
  11316. if (y <= (unsigned)ecc_sets[x].size) break;
  11317. }
  11318. /* back off if we are on the 521 bit curve */
  11319. if (y == 66) --x;
  11320. if ((err = mp_read_radix(order, ecc_sets[x].order,
  11321. MP_RADIX_HEX)) != MP_OKAY) {
  11322. goto done;
  11323. }
  11324. /* kA must be less than modulus */
  11325. if (mp_cmp(kA, order) != MP_LT) {
  11326. if ((err = mp_mod(kA, order, tka)) != MP_OKAY) {
  11327. goto done;
  11328. }
  11329. } else {
  11330. if ((err = mp_copy(kA, tka)) != MP_OKAY) {
  11331. goto done;
  11332. }
  11333. }
  11334. } else {
  11335. if ((err = mp_copy(kA, tka)) != MP_OKAY) {
  11336. goto done;
  11337. }
  11338. }
  11339. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11340. mp_memzero_add("accel_fp_mul2add tka", tka);
  11341. #endif
  11342. /* if it's smaller than modulus we fine */
  11343. if (mp_unsigned_bin_size(kB) > mp_unsigned_bin_size(modulus)) {
  11344. /* find order */
  11345. y = (unsigned)mp_unsigned_bin_size(modulus);
  11346. for (x = 0; ecc_sets[x].size; x++) {
  11347. if (y <= (unsigned)ecc_sets[x].size) break;
  11348. }
  11349. /* back off if we are on the 521 bit curve */
  11350. if (y == 66) --x;
  11351. if ((err = mp_read_radix(order, ecc_sets[x].order,
  11352. MP_RADIX_HEX)) != MP_OKAY) {
  11353. goto done;
  11354. }
  11355. /* kB must be less than modulus */
  11356. if (mp_cmp(kB, order) != MP_LT) {
  11357. if ((err = mp_mod(kB, order, tkb)) != MP_OKAY) {
  11358. goto done;
  11359. }
  11360. } else {
  11361. if ((err = mp_copy(kB, tkb)) != MP_OKAY) {
  11362. goto done;
  11363. }
  11364. }
  11365. } else {
  11366. if ((err = mp_copy(kB, tkb)) != MP_OKAY) {
  11367. goto done;
  11368. }
  11369. }
  11370. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11371. mp_memzero_add("accel_fp_mul2add tkb", tkb);
  11372. #endif
  11373. /* get bitlen and round up to next multiple of FP_LUT */
  11374. bitlen = (unsigned)mp_unsigned_bin_size(modulus) << 3;
  11375. x = bitlen % FP_LUT;
  11376. if (x) {
  11377. bitlen += FP_LUT - (unsigned)x;
  11378. }
  11379. lut_gap = bitlen / FP_LUT;
  11380. /* get the k value */
  11381. if ((mp_unsigned_bin_size(tka) > (int)(KB_SIZE - 2)) ||
  11382. (mp_unsigned_bin_size(tkb) > (int)(KB_SIZE - 2)) ) {
  11383. err = BUFFER_E; goto done;
  11384. }
  11385. /* store k */
  11386. #ifdef WOLFSSL_SMALL_STACK
  11387. kb[0] = (unsigned char*)XMALLOC(KB_SIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11388. if (kb[0] == NULL) {
  11389. err = MEMORY_E; goto done;
  11390. }
  11391. #endif
  11392. XMEMSET(kb[0], 0, KB_SIZE);
  11393. if ((err = mp_to_unsigned_bin(tka, kb[0])) != MP_OKAY) {
  11394. goto done;
  11395. }
  11396. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11397. wc_MemZero_Add("accel_fp_mul2add kb[0]", kb[0], KB_SIZE);
  11398. #endif
  11399. /* let's reverse kb so it's little endian */
  11400. x = 0;
  11401. y = (unsigned)mp_unsigned_bin_size(tka);
  11402. if (y > 0) {
  11403. y -= 1;
  11404. }
  11405. mp_clear(tka);
  11406. while ((unsigned)x < y) {
  11407. z = kb[0][x]; kb[0][x] = kb[0][y]; kb[0][y] = (byte)z;
  11408. ++x; --y;
  11409. }
  11410. /* store b */
  11411. #ifdef WOLFSSL_SMALL_STACK
  11412. kb[1] = (unsigned char*)XMALLOC(KB_SIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11413. if (kb[1] == NULL) {
  11414. err = MEMORY_E; goto done;
  11415. }
  11416. #endif
  11417. XMEMSET(kb[1], 0, KB_SIZE);
  11418. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11419. wc_MemZero_Add("accel_fp_mul2add kb[1]", kb[1], KB_SIZE);
  11420. #endif
  11421. if ((err = mp_to_unsigned_bin(tkb, kb[1])) == MP_OKAY) {
  11422. x = 0;
  11423. y = (unsigned)mp_unsigned_bin_size(tkb);
  11424. if (y > 0) {
  11425. y -= 1;
  11426. }
  11427. while ((unsigned)x < y) {
  11428. z = kb[1][x]; kb[1][x] = kb[1][y]; kb[1][y] = (byte)z;
  11429. ++x; --y;
  11430. }
  11431. /* at this point we can start, yipee */
  11432. first = 1;
  11433. for (x = (int)lut_gap-1; x >= 0; x--) {
  11434. /* extract FP_LUT bits from kb spread out by lut_gap bits and
  11435. offset by x bits from the start */
  11436. bitpos = (unsigned)x;
  11437. for (y = zA = zB = 0; y < FP_LUT; y++) {
  11438. zA |= ((kb[0][bitpos>>3] >> (bitpos&7)) & 1) << y;
  11439. zB |= ((kb[1][bitpos>>3] >> (bitpos&7)) & 1) << y;
  11440. bitpos += lut_gap; /* it's y*lut_gap + x, but here we can avoid
  11441. the mult in each loop */
  11442. }
  11443. /* double if not first */
  11444. if (!first) {
  11445. if ((err = ecc_projective_dbl_point_safe(R, R, a, modulus,
  11446. mp)) != MP_OKAY) {
  11447. break;
  11448. }
  11449. /* add if not first, otherwise copy */
  11450. if (zA) {
  11451. if ((err = ecc_projective_add_point_safe(R,
  11452. fp_cache[idx1].LUT[zA], R, a,
  11453. modulus, mp, &first)) != MP_OKAY) {
  11454. break;
  11455. }
  11456. }
  11457. if (zB) {
  11458. if ((err = ecc_projective_add_point_safe(R,
  11459. fp_cache[idx2].LUT[zB], R, a,
  11460. modulus, mp, &first)) != MP_OKAY) {
  11461. break;
  11462. }
  11463. }
  11464. } else {
  11465. if (zA) {
  11466. if ((mp_copy(fp_cache[idx1].LUT[zA]->x, R->x) != MP_OKAY) ||
  11467. (mp_copy(fp_cache[idx1].LUT[zA]->y, R->y) != MP_OKAY) ||
  11468. (mp_copy(&fp_cache[idx1].mu, R->z) != MP_OKAY)) {
  11469. err = GEN_MEM_ERR;
  11470. break;
  11471. }
  11472. first = 0;
  11473. }
  11474. if (zB && first == 0) {
  11475. if ((err = ecc_projective_add_point_safe(R,
  11476. fp_cache[idx2].LUT[zB], R, a,
  11477. modulus, mp, &first)) != MP_OKAY){
  11478. break;
  11479. }
  11480. } else if (zB && first == 1) {
  11481. if ((mp_copy(fp_cache[idx2].LUT[zB]->x, R->x) != MP_OKAY) ||
  11482. (mp_copy(fp_cache[idx2].LUT[zB]->y, R->y) != MP_OKAY) ||
  11483. (mp_copy(&fp_cache[idx2].mu, R->z) != MP_OKAY)) {
  11484. err = GEN_MEM_ERR;
  11485. break;
  11486. }
  11487. first = 0;
  11488. }
  11489. }
  11490. }
  11491. }
  11492. done:
  11493. /* cleanup */
  11494. mp_forcezero(tkb);
  11495. mp_forcezero(tka);
  11496. mp_clear(order);
  11497. #ifdef WOLFSSL_SMALL_STACK
  11498. if (kb[0])
  11499. #endif
  11500. ForceZero(kb[0], KB_SIZE);
  11501. #ifdef WOLFSSL_SMALL_STACK
  11502. if (kb[1])
  11503. #endif
  11504. ForceZero(kb[1], KB_SIZE);
  11505. #ifdef WOLFSSL_SMALL_STACK
  11506. XFREE(kb[1], NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11507. XFREE(kb[0], NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11508. XFREE(order, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11509. XFREE(tkb, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11510. XFREE(tka, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11511. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  11512. wc_MemZero_Check(kb[1], KB_SIZE);
  11513. wc_MemZero_Check(kb[0], KB_SIZE);
  11514. mp_memzero_check(tkb);
  11515. mp_memzero_check(tka);
  11516. #endif
  11517. #undef KB_SIZE
  11518. if (err != MP_OKAY)
  11519. return err;
  11520. return ecc_map(R, modulus, mp);
  11521. }
  11522. /** ECC Fixed Point mulmod global with heap hint used
  11523. Computes kA*A + kB*B = C using Shamir's Trick
  11524. A First point to multiply
  11525. kA What to multiple A by
  11526. B Second point to multiply
  11527. kB What to multiple B by
  11528. C [out] Destination point (can overlap with A or B)
  11529. a ECC curve parameter a
  11530. modulus Modulus for curve
  11531. return MP_OKAY on success
  11532. */
  11533. int ecc_mul2add(ecc_point* A, mp_int* kA,
  11534. ecc_point* B, mp_int* kB,
  11535. ecc_point* C, mp_int* a, mp_int* modulus, void* heap)
  11536. {
  11537. int idx1 = -1, idx2 = -1, err, mpInit = 0;
  11538. mp_digit mp;
  11539. #ifdef WOLFSSL_SMALL_STACK
  11540. mp_int *mu = (mp_int *)XMALLOC(sizeof *mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11541. if (mu == NULL)
  11542. return MP_MEM;
  11543. #else
  11544. mp_int mu[1];
  11545. #endif
  11546. err = mp_init(mu);
  11547. if (err != MP_OKAY) {
  11548. #ifdef WOLFSSL_SMALL_STACK
  11549. XFREE(mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11550. #endif
  11551. return err;
  11552. }
  11553. #ifndef HAVE_THREAD_LS
  11554. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  11555. wc_InitMutex(&ecc_fp_lock);
  11556. initMutex = 1;
  11557. }
  11558. if (wc_LockMutex(&ecc_fp_lock) != 0) {
  11559. #ifdef WOLFSSL_SMALL_STACK
  11560. XFREE(mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11561. #endif
  11562. return BAD_MUTEX_E;
  11563. }
  11564. #endif /* HAVE_THREAD_LS */
  11565. SAVE_VECTOR_REGISTERS(err = _svr_ret;);
  11566. /* find point */
  11567. idx1 = find_base(A);
  11568. /* no entry? */
  11569. if (idx1 == -1) {
  11570. /* find hole and add it */
  11571. if ((idx1 = find_hole()) >= 0) {
  11572. err = add_entry(idx1, A);
  11573. }
  11574. }
  11575. if (err == MP_OKAY && idx1 != -1) {
  11576. /* increment LRU */
  11577. ++(fp_cache[idx1].lru_count);
  11578. }
  11579. if (err == MP_OKAY) {
  11580. /* find point */
  11581. idx2 = find_base(B);
  11582. /* no entry? */
  11583. if (idx2 == -1) {
  11584. /* find hole and add it */
  11585. if ((idx2 = find_hole()) >= 0)
  11586. err = add_entry(idx2, B);
  11587. }
  11588. }
  11589. if (err == MP_OKAY && idx2 != -1) {
  11590. /* increment LRU */
  11591. ++(fp_cache[idx2].lru_count);
  11592. }
  11593. if (err == MP_OKAY) {
  11594. /* if it's >= 2 AND the LUT is not set build the LUT */
  11595. if (idx1 >= 0 && fp_cache[idx1].lru_count >= 2 && !fp_cache[idx1].LUT_set) {
  11596. /* compute mp */
  11597. err = mp_montgomery_setup(modulus, &mp);
  11598. if (err == MP_OKAY) {
  11599. mpInit = 1;
  11600. err = mp_montgomery_calc_normalization(mu, modulus);
  11601. }
  11602. if (err == MP_OKAY)
  11603. /* build the LUT */
  11604. err = build_lut(idx1, a, modulus, mp, mu);
  11605. }
  11606. }
  11607. if (err == MP_OKAY) {
  11608. /* if it's >= 2 AND the LUT is not set build the LUT */
  11609. if (idx2 >= 0 && fp_cache[idx2].lru_count >= 2 && !fp_cache[idx2].LUT_set) {
  11610. if (mpInit == 0) {
  11611. /* compute mp */
  11612. err = mp_montgomery_setup(modulus, &mp);
  11613. if (err == MP_OKAY) {
  11614. mpInit = 1;
  11615. err = mp_montgomery_calc_normalization(mu, modulus);
  11616. }
  11617. }
  11618. if (err == MP_OKAY)
  11619. /* build the LUT */
  11620. err = build_lut(idx2, a, modulus, mp, mu);
  11621. }
  11622. }
  11623. if (err == MP_OKAY) {
  11624. if (idx1 >=0 && idx2 >= 0 && fp_cache[idx1].LUT_set &&
  11625. fp_cache[idx2].LUT_set) {
  11626. if (mpInit == 0) {
  11627. /* compute mp */
  11628. err = mp_montgomery_setup(modulus, &mp);
  11629. }
  11630. if (err == MP_OKAY)
  11631. err = accel_fp_mul2add(idx1, idx2, kA, kB, C, a, modulus, mp);
  11632. } else {
  11633. err = normal_ecc_mul2add(A, kA, B, kB, C, a, modulus, heap);
  11634. }
  11635. }
  11636. RESTORE_VECTOR_REGISTERS();
  11637. #ifndef HAVE_THREAD_LS
  11638. wc_UnLockMutex(&ecc_fp_lock);
  11639. #endif /* HAVE_THREAD_LS */
  11640. mp_clear(mu);
  11641. #ifdef WOLFSSL_SMALL_STACK
  11642. XFREE(mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11643. #endif
  11644. return err;
  11645. }
  11646. #endif
  11647. #endif /* ECC_SHAMIR */
  11648. /** ECC Fixed Point mulmod global
  11649. k The multiplicand
  11650. G Base point to multiply
  11651. R [out] Destination of product
  11652. a ECC curve parameter a
  11653. modulus The modulus for the curve
  11654. map [boolean] If non-zero maps the point back to affine coordinates,
  11655. otherwise it's left in jacobian-montgomery form
  11656. return MP_OKAY if successful
  11657. */
  11658. int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  11659. mp_int* modulus, int map, void* heap)
  11660. {
  11661. #if !defined(WOLFSSL_SP_MATH)
  11662. int idx, err = MP_OKAY;
  11663. mp_digit mp;
  11664. #ifdef WOLFSSL_SMALL_STACK
  11665. mp_int *mu = NULL;
  11666. #else
  11667. mp_int mu[1];
  11668. #endif
  11669. int mpSetup = 0;
  11670. #ifndef HAVE_THREAD_LS
  11671. int got_ecc_fp_lock = 0;
  11672. #endif
  11673. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL) {
  11674. return ECC_BAD_ARG_E;
  11675. }
  11676. /* k can't have more bits than modulus count plus 1 */
  11677. if (mp_count_bits(k) > mp_count_bits(modulus) + 1) {
  11678. return ECC_OUT_OF_RANGE_E;
  11679. }
  11680. #ifdef WOLFSSL_SMALL_STACK
  11681. if ((mu = (mp_int *)XMALLOC(sizeof(*mu), NULL, DYNAMIC_TYPE_ECC_BUFFER)) == NULL)
  11682. return MP_MEM;
  11683. #endif
  11684. if (mp_init(mu) != MP_OKAY) {
  11685. err = MP_INIT_E;
  11686. goto out;
  11687. }
  11688. #ifndef HAVE_THREAD_LS
  11689. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  11690. wc_InitMutex(&ecc_fp_lock);
  11691. initMutex = 1;
  11692. }
  11693. if (wc_LockMutex(&ecc_fp_lock) != 0) {
  11694. err = BAD_MUTEX_E;
  11695. goto out;
  11696. }
  11697. got_ecc_fp_lock = 1;
  11698. #endif /* HAVE_THREAD_LS */
  11699. SAVE_VECTOR_REGISTERS(err = _svr_ret; goto out;);
  11700. /* find point */
  11701. idx = find_base(G);
  11702. /* no entry? */
  11703. if (idx == -1) {
  11704. /* find hole and add it */
  11705. idx = find_hole();
  11706. if (idx >= 0)
  11707. err = add_entry(idx, G);
  11708. }
  11709. if (err == MP_OKAY && idx >= 0) {
  11710. /* increment LRU */
  11711. ++(fp_cache[idx].lru_count);
  11712. }
  11713. if (err == MP_OKAY) {
  11714. /* if it's 2 build the LUT, if it's higher just use the LUT */
  11715. if (idx >= 0 && fp_cache[idx].lru_count >= 2 && !fp_cache[idx].LUT_set) {
  11716. /* compute mp */
  11717. err = mp_montgomery_setup(modulus, &mp);
  11718. if (err == MP_OKAY) {
  11719. /* compute mu */
  11720. mpSetup = 1;
  11721. err = mp_montgomery_calc_normalization(mu, modulus);
  11722. }
  11723. if (err == MP_OKAY)
  11724. /* build the LUT */
  11725. err = build_lut(idx, a, modulus, mp, mu);
  11726. }
  11727. }
  11728. if (err == MP_OKAY) {
  11729. if (idx >= 0 && fp_cache[idx].LUT_set) {
  11730. if (mpSetup == 0) {
  11731. /* compute mp */
  11732. err = mp_montgomery_setup(modulus, &mp);
  11733. }
  11734. if (err == MP_OKAY)
  11735. err = accel_fp_mul(idx, k, R, a, modulus, mp, map);
  11736. } else {
  11737. err = normal_ecc_mulmod(k, G, R, a, modulus, NULL, map, heap);
  11738. }
  11739. }
  11740. RESTORE_VECTOR_REGISTERS();
  11741. out:
  11742. #ifndef HAVE_THREAD_LS
  11743. if (got_ecc_fp_lock)
  11744. wc_UnLockMutex(&ecc_fp_lock);
  11745. #endif /* HAVE_THREAD_LS */
  11746. mp_clear(mu);
  11747. #ifdef WOLFSSL_SMALL_STACK
  11748. XFREE(mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11749. #endif
  11750. return err;
  11751. #else /* WOLFSSL_SP_MATH */
  11752. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL) {
  11753. return ECC_BAD_ARG_E;
  11754. }
  11755. if (mp_count_bits(G->x) > mp_count_bits(modulus) ||
  11756. mp_count_bits(G->y) > mp_count_bits(modulus) ||
  11757. mp_count_bits(G->z) > mp_count_bits(modulus)) {
  11758. return IS_POINT_E;
  11759. }
  11760. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  11761. if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) {
  11762. int ret;
  11763. SAVE_VECTOR_REGISTERS(return _svr_ret);
  11764. ret = sp_ecc_mulmod_sm2_256(k, G, R, map, heap);
  11765. RESTORE_VECTOR_REGISTERS();
  11766. return ret;
  11767. }
  11768. #endif
  11769. #ifndef WOLFSSL_SP_NO_256
  11770. if (mp_count_bits(modulus) == 256) {
  11771. int ret;
  11772. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  11773. ret = sp_ecc_mulmod_256(k, G, R, map, heap);
  11774. RESTORE_VECTOR_REGISTERS();
  11775. return ret;
  11776. }
  11777. #endif
  11778. #ifdef WOLFSSL_SP_384
  11779. if (mp_count_bits(modulus) == 384) {
  11780. int ret;
  11781. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  11782. ret = sp_ecc_mulmod_384(k, G, R, map, heap);
  11783. RESTORE_VECTOR_REGISTERS();
  11784. return ret;
  11785. }
  11786. #endif
  11787. #ifdef WOLFSSL_SP_521
  11788. if (mp_count_bits(modulus) == 521) {
  11789. int ret;
  11790. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  11791. ret = sp_ecc_mulmod_521(k, G, R, map, heap);
  11792. RESTORE_VECTOR_REGISTERS();
  11793. return ret;
  11794. }
  11795. #endif
  11796. return WC_KEY_SIZE_E;
  11797. #endif /* WOLFSSL_SP_MATH */
  11798. }
  11799. /** ECC Fixed Point mulmod global
  11800. k The multiplicand
  11801. G Base point to multiply
  11802. R [out] Destination of product
  11803. a ECC curve parameter a
  11804. modulus The modulus for the curve
  11805. map [boolean] If non-zero maps the point back to affine coordinates,
  11806. otherwise it's left in jacobian-montgomery form
  11807. return MP_OKAY if successful
  11808. */
  11809. int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  11810. mp_int* modulus, mp_int* order, WC_RNG* rng, int map, void* heap)
  11811. {
  11812. #if !defined(WOLFSSL_SP_MATH)
  11813. int idx, err = MP_OKAY;
  11814. mp_digit mp;
  11815. #ifdef WOLFSSL_SMALL_STACK
  11816. mp_int *mu = NULL;
  11817. #else
  11818. mp_int mu[1];
  11819. #endif
  11820. int mpSetup = 0;
  11821. #ifndef HAVE_THREAD_LS
  11822. int got_ecc_fp_lock = 0;
  11823. #endif
  11824. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL ||
  11825. order == NULL) {
  11826. return ECC_BAD_ARG_E;
  11827. }
  11828. /* k can't have more bits than order */
  11829. if (mp_count_bits(k) > mp_count_bits(order)) {
  11830. return ECC_OUT_OF_RANGE_E;
  11831. }
  11832. #ifdef WOLFSSL_SMALL_STACK
  11833. if ((mu = (mp_int *)XMALLOC(sizeof(*mu), NULL, DYNAMIC_TYPE_ECC_BUFFER)) == NULL)
  11834. return MP_MEM;
  11835. #endif
  11836. if (mp_init(mu) != MP_OKAY) {
  11837. err = MP_INIT_E;
  11838. goto out;
  11839. }
  11840. #ifndef HAVE_THREAD_LS
  11841. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  11842. wc_InitMutex(&ecc_fp_lock);
  11843. initMutex = 1;
  11844. }
  11845. if (wc_LockMutex(&ecc_fp_lock) != 0) {
  11846. err = BAD_MUTEX_E;
  11847. goto out;
  11848. }
  11849. got_ecc_fp_lock = 1;
  11850. #endif /* HAVE_THREAD_LS */
  11851. SAVE_VECTOR_REGISTERS(err = _svr_ret; goto out;);
  11852. /* find point */
  11853. idx = find_base(G);
  11854. /* no entry? */
  11855. if (idx == -1) {
  11856. /* find hole and add it */
  11857. idx = find_hole();
  11858. if (idx >= 0)
  11859. err = add_entry(idx, G);
  11860. }
  11861. if (err == MP_OKAY && idx >= 0) {
  11862. /* increment LRU */
  11863. ++(fp_cache[idx].lru_count);
  11864. }
  11865. if (err == MP_OKAY) {
  11866. /* if it's 2 build the LUT, if it's higher just use the LUT */
  11867. if (idx >= 0 && fp_cache[idx].lru_count >= 2 && !fp_cache[idx].LUT_set) {
  11868. /* compute mp */
  11869. err = mp_montgomery_setup(modulus, &mp);
  11870. if (err == MP_OKAY) {
  11871. /* compute mu */
  11872. mpSetup = 1;
  11873. err = mp_montgomery_calc_normalization(mu, modulus);
  11874. }
  11875. if (err == MP_OKAY)
  11876. /* build the LUT */
  11877. err = build_lut(idx, a, modulus, mp, mu);
  11878. }
  11879. }
  11880. if (err == MP_OKAY) {
  11881. if (idx >= 0 && fp_cache[idx].LUT_set) {
  11882. if (mpSetup == 0) {
  11883. /* compute mp */
  11884. err = mp_montgomery_setup(modulus, &mp);
  11885. }
  11886. if (err == MP_OKAY)
  11887. err = accel_fp_mul(idx, k, R, a, modulus, mp, map);
  11888. } else {
  11889. err = normal_ecc_mulmod(k, G, R, a, modulus, rng, map, heap);
  11890. }
  11891. }
  11892. RESTORE_VECTOR_REGISTERS();
  11893. out:
  11894. #ifndef HAVE_THREAD_LS
  11895. if (got_ecc_fp_lock)
  11896. wc_UnLockMutex(&ecc_fp_lock);
  11897. #endif /* HAVE_THREAD_LS */
  11898. mp_clear(mu);
  11899. #ifdef WOLFSSL_SMALL_STACK
  11900. XFREE(mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11901. #endif
  11902. return err;
  11903. #else /* WOLFSSL_SP_MATH */
  11904. (void)rng;
  11905. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL ||
  11906. order == NULL) {
  11907. return ECC_BAD_ARG_E;
  11908. }
  11909. if (mp_count_bits(G->x) > mp_count_bits(modulus) ||
  11910. mp_count_bits(G->y) > mp_count_bits(modulus) ||
  11911. mp_count_bits(G->z) > mp_count_bits(modulus)) {
  11912. return IS_POINT_E;
  11913. }
  11914. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
  11915. if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) {
  11916. int ret;
  11917. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  11918. ret = sp_ecc_mulmod_sm2_256(k, G, R, map, heap);
  11919. RESTORE_VECTOR_REGISTERS();
  11920. return ret;
  11921. }
  11922. #endif
  11923. #ifndef WOLFSSL_SP_NO_256
  11924. if (mp_count_bits(modulus) == 256) {
  11925. int ret;
  11926. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  11927. ret = sp_ecc_mulmod_256(k, G, R, map, heap);
  11928. RESTORE_VECTOR_REGISTERS();
  11929. return ret;
  11930. }
  11931. #endif
  11932. #ifdef WOLFSSL_SP_384
  11933. if (mp_count_bits(modulus) == 384) {
  11934. int ret;
  11935. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  11936. ret = sp_ecc_mulmod_384(k, G, R, map, heap);
  11937. RESTORE_VECTOR_REGISTERS();
  11938. return ret;
  11939. }
  11940. #endif
  11941. #ifdef WOLFSSL_SP_521
  11942. if (mp_count_bits(modulus) == 521) {
  11943. int ret;
  11944. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  11945. ret = sp_ecc_mulmod_521(k, G, R, map, heap);
  11946. RESTORE_VECTOR_REGISTERS();
  11947. return ret;
  11948. }
  11949. #endif
  11950. return WC_KEY_SIZE_E;
  11951. #endif /* WOLFSSL_SP_MATH */
  11952. }
  11953. #if !defined(WOLFSSL_SP_MATH)
  11954. /* helper function for freeing the cache ...
  11955. must be called with the cache mutex locked */
  11956. static void wc_ecc_fp_free_cache(void)
  11957. {
  11958. unsigned x, y;
  11959. for (x = 0; x < FP_ENTRIES; x++) {
  11960. if (fp_cache[x].g != NULL) {
  11961. for (y = 0; y < (1U<<FP_LUT); y++) {
  11962. wc_ecc_del_point(fp_cache[x].LUT[y]);
  11963. fp_cache[x].LUT[y] = NULL;
  11964. }
  11965. wc_ecc_del_point(fp_cache[x].g);
  11966. fp_cache[x].g = NULL;
  11967. mp_clear(&fp_cache[x].mu);
  11968. fp_cache[x].LUT_set = 0;
  11969. fp_cache[x].lru_count = 0;
  11970. fp_cache[x].lock = 0;
  11971. }
  11972. }
  11973. }
  11974. #endif
  11975. /** Init the Fixed Point cache */
  11976. void wc_ecc_fp_init(void)
  11977. {
  11978. #ifndef WOLFSSL_SP_MATH
  11979. #ifndef HAVE_THREAD_LS
  11980. if (initMutex == 0) {
  11981. wc_InitMutex(&ecc_fp_lock);
  11982. initMutex = 1;
  11983. }
  11984. #endif
  11985. #endif
  11986. }
  11987. /** Free the Fixed Point cache */
  11988. WOLFSSL_ABI
  11989. void wc_ecc_fp_free(void)
  11990. {
  11991. #if !defined(WOLFSSL_SP_MATH)
  11992. #ifndef HAVE_THREAD_LS
  11993. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  11994. wc_InitMutex(&ecc_fp_lock);
  11995. initMutex = 1;
  11996. }
  11997. if (wc_LockMutex(&ecc_fp_lock) == 0) {
  11998. #endif /* HAVE_THREAD_LS */
  11999. wc_ecc_fp_free_cache();
  12000. #ifndef HAVE_THREAD_LS
  12001. wc_UnLockMutex(&ecc_fp_lock);
  12002. wc_FreeMutex(&ecc_fp_lock);
  12003. initMutex = 0;
  12004. }
  12005. #endif /* HAVE_THREAD_LS */
  12006. #endif
  12007. }
  12008. #endif /* FP_ECC */
  12009. int wc_ecc_set_rng(ecc_key* key, WC_RNG* rng)
  12010. {
  12011. int err = 0;
  12012. #ifdef ECC_TIMING_RESISTANT
  12013. if (key == NULL) {
  12014. err = BAD_FUNC_ARG;
  12015. }
  12016. else {
  12017. key->rng = rng;
  12018. }
  12019. #else
  12020. (void)key;
  12021. (void)rng;
  12022. /* report success, not an error if ECC_TIMING_RESISTANT is not defined */
  12023. #endif
  12024. return err;
  12025. }
  12026. #ifdef HAVE_ECC_ENCRYPT
  12027. enum ecCliState {
  12028. ecCLI_INIT = 1,
  12029. ecCLI_SALT_GET = 2,
  12030. ecCLI_SALT_SET = 3,
  12031. ecCLI_SENT_REQ = 4,
  12032. ecCLI_RECV_RESP = 5,
  12033. ecCLI_BAD_STATE = 99
  12034. };
  12035. enum ecSrvState {
  12036. ecSRV_INIT = 1,
  12037. ecSRV_SALT_GET = 2,
  12038. ecSRV_SALT_SET = 3,
  12039. ecSRV_RECV_REQ = 4,
  12040. ecSRV_SENT_RESP = 5,
  12041. ecSRV_BAD_STATE = 99
  12042. };
  12043. struct ecEncCtx {
  12044. const byte* kdfSalt; /* optional salt for kdf */
  12045. const byte* kdfInfo; /* optional info for kdf */
  12046. const byte* macSalt; /* optional salt for mac */
  12047. word32 kdfSaltSz; /* size of kdfSalt */
  12048. word32 kdfInfoSz; /* size of kdfInfo */
  12049. word32 macSaltSz; /* size of macSalt */
  12050. void* heap; /* heap hint for memory used */
  12051. byte clientSalt[EXCHANGE_SALT_SZ]; /* for msg exchange */
  12052. byte serverSalt[EXCHANGE_SALT_SZ]; /* for msg exchange */
  12053. byte encAlgo; /* which encryption type */
  12054. byte kdfAlgo; /* which key derivation function type */
  12055. byte macAlgo; /* which mac function type */
  12056. byte protocol; /* are we REQ_RESP client or server ? */
  12057. byte cliSt; /* protocol state, for sanity checks */
  12058. byte srvSt; /* protocol state, for sanity checks */
  12059. WC_RNG* rng;
  12060. };
  12061. /* optional set info, can be called before or after set_peer_salt */
  12062. int wc_ecc_ctx_set_algo(ecEncCtx* ctx, byte encAlgo, byte kdfAlgo, byte macAlgo)
  12063. {
  12064. if (ctx == NULL)
  12065. return BAD_FUNC_ARG;
  12066. ctx->encAlgo = encAlgo;
  12067. ctx->kdfAlgo = kdfAlgo;
  12068. ctx->macAlgo = macAlgo;
  12069. return 0;
  12070. }
  12071. const byte* wc_ecc_ctx_get_own_salt(ecEncCtx* ctx)
  12072. {
  12073. if (ctx == NULL || ctx->protocol == 0)
  12074. return NULL;
  12075. if (ctx->protocol == REQ_RESP_CLIENT) {
  12076. if (ctx->cliSt == ecCLI_INIT) {
  12077. ctx->cliSt = ecCLI_SALT_GET;
  12078. return ctx->clientSalt;
  12079. }
  12080. else {
  12081. ctx->cliSt = ecCLI_BAD_STATE;
  12082. return NULL;
  12083. }
  12084. }
  12085. else if (ctx->protocol == REQ_RESP_SERVER) {
  12086. if (ctx->srvSt == ecSRV_INIT) {
  12087. ctx->srvSt = ecSRV_SALT_GET;
  12088. return ctx->serverSalt;
  12089. }
  12090. else {
  12091. ctx->srvSt = ecSRV_BAD_STATE;
  12092. return NULL;
  12093. }
  12094. }
  12095. return NULL;
  12096. }
  12097. /* optional set info, can be called before or after set_peer_salt */
  12098. int wc_ecc_ctx_set_info(ecEncCtx* ctx, const byte* info, int sz)
  12099. {
  12100. if (ctx == NULL || info == 0 || sz < 0)
  12101. return BAD_FUNC_ARG;
  12102. ctx->kdfInfo = info;
  12103. ctx->kdfInfoSz = (word32)sz;
  12104. return 0;
  12105. }
  12106. static const char* exchange_info = "Secure Message Exchange";
  12107. int wc_ecc_ctx_set_peer_salt(ecEncCtx* ctx, const byte* salt)
  12108. {
  12109. byte tmp[EXCHANGE_SALT_SZ/2];
  12110. int halfSz = EXCHANGE_SALT_SZ/2;
  12111. if (ctx == NULL || ctx->protocol == 0 || salt == NULL)
  12112. return BAD_FUNC_ARG;
  12113. if (ctx->protocol == REQ_RESP_CLIENT) {
  12114. XMEMCPY(ctx->serverSalt, salt, EXCHANGE_SALT_SZ);
  12115. if (ctx->cliSt == ecCLI_SALT_GET)
  12116. ctx->cliSt = ecCLI_SALT_SET;
  12117. else {
  12118. ctx->cliSt = ecCLI_BAD_STATE;
  12119. return BAD_STATE_E;
  12120. }
  12121. }
  12122. else {
  12123. XMEMCPY(ctx->clientSalt, salt, EXCHANGE_SALT_SZ);
  12124. if (ctx->srvSt == ecSRV_SALT_GET)
  12125. ctx->srvSt = ecSRV_SALT_SET;
  12126. else {
  12127. ctx->srvSt = ecSRV_BAD_STATE;
  12128. return BAD_STATE_E;
  12129. }
  12130. }
  12131. /* mix half and half */
  12132. /* tmp stores 2nd half of client before overwrite */
  12133. XMEMCPY(tmp, ctx->clientSalt + halfSz, (size_t)halfSz);
  12134. XMEMCPY(ctx->clientSalt + halfSz, ctx->serverSalt, (size_t)halfSz);
  12135. XMEMCPY(ctx->serverSalt, tmp, (size_t)halfSz);
  12136. ctx->kdfSalt = ctx->clientSalt;
  12137. ctx->kdfSaltSz = EXCHANGE_SALT_SZ;
  12138. ctx->macSalt = ctx->serverSalt;
  12139. ctx->macSaltSz = EXCHANGE_SALT_SZ;
  12140. if (ctx->kdfInfo == NULL) {
  12141. /* default info */
  12142. ctx->kdfInfo = (const byte*)exchange_info;
  12143. ctx->kdfInfoSz = EXCHANGE_INFO_SZ;
  12144. }
  12145. return 0;
  12146. }
  12147. /* Set the salt pointer into context.
  12148. *
  12149. * @param [in, out] ctx ECIES context object.
  12150. * @param [in] salt Salt to use with KDF.
  12151. * @param [in] len Length of salt in bytes.
  12152. * @return 0 on success.
  12153. * @return BAD_FUNC_ARG when ctx is NULL or salt is NULL and len is not 0.
  12154. */
  12155. int wc_ecc_ctx_set_kdf_salt(ecEncCtx* ctx, const byte* salt, word32 len)
  12156. {
  12157. if (ctx == NULL || (salt == NULL && len != 0))
  12158. return BAD_FUNC_ARG;
  12159. ctx->kdfSalt = salt;
  12160. ctx->kdfSaltSz = len;
  12161. if (ctx->protocol == REQ_RESP_CLIENT) {
  12162. ctx->cliSt = ecCLI_SALT_SET;
  12163. }
  12164. else if (ctx->protocol == REQ_RESP_SERVER) {
  12165. ctx->srvSt = ecSRV_SALT_SET;
  12166. }
  12167. return 0;
  12168. }
  12169. static int ecc_ctx_set_salt(ecEncCtx* ctx, int flags)
  12170. {
  12171. byte* saltBuffer = NULL;
  12172. if (ctx == NULL || flags == 0)
  12173. return BAD_FUNC_ARG;
  12174. saltBuffer = (flags == REQ_RESP_CLIENT) ? ctx->clientSalt : ctx->serverSalt;
  12175. return wc_RNG_GenerateBlock(ctx->rng, saltBuffer, EXCHANGE_SALT_SZ);
  12176. }
  12177. static void ecc_ctx_init(ecEncCtx* ctx, int flags, WC_RNG* rng)
  12178. {
  12179. if (ctx) {
  12180. XMEMSET(ctx, 0, sizeof(ecEncCtx));
  12181. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  12182. #ifdef WOLFSSL_AES_128
  12183. ctx->encAlgo = ecAES_128_CBC;
  12184. #else
  12185. ctx->encAlgo = ecAES_256_CBC;
  12186. #endif
  12187. #elif !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
  12188. #ifdef WOLFSSL_AES_256
  12189. ctx->encAlgo = ecAES_256_CTR;
  12190. #else
  12191. ctx->encAlgo = ecAES_128_CTR;
  12192. #endif
  12193. #else
  12194. #error "No valid encryption algorithm for ECIES configured."
  12195. #endif
  12196. ctx->kdfAlgo = ecHKDF_SHA256;
  12197. ctx->macAlgo = ecHMAC_SHA256;
  12198. ctx->protocol = (byte)flags;
  12199. ctx->rng = rng;
  12200. if (flags == REQ_RESP_CLIENT)
  12201. ctx->cliSt = ecCLI_INIT;
  12202. if (flags == REQ_RESP_SERVER)
  12203. ctx->srvSt = ecSRV_INIT;
  12204. }
  12205. }
  12206. /* allow ecc context reset so user doesn't have to init/free for reuse */
  12207. WOLFSSL_ABI
  12208. int wc_ecc_ctx_reset(ecEncCtx* ctx, WC_RNG* rng)
  12209. {
  12210. if (ctx == NULL || rng == NULL)
  12211. return BAD_FUNC_ARG;
  12212. ecc_ctx_init(ctx, ctx->protocol, rng);
  12213. return ecc_ctx_set_salt(ctx, ctx->protocol);
  12214. }
  12215. ecEncCtx* wc_ecc_ctx_new_ex(int flags, WC_RNG* rng, void* heap)
  12216. {
  12217. int ret = 0;
  12218. ecEncCtx* ctx = (ecEncCtx*)XMALLOC(sizeof(ecEncCtx), heap,
  12219. DYNAMIC_TYPE_ECC);
  12220. if (ctx) {
  12221. ctx->protocol = (byte)flags;
  12222. ctx->heap = heap;
  12223. }
  12224. ret = wc_ecc_ctx_reset(ctx, rng);
  12225. if (ret != 0) {
  12226. wc_ecc_ctx_free(ctx);
  12227. ctx = NULL;
  12228. }
  12229. return ctx;
  12230. }
  12231. /* alloc/init and set defaults, return new Context */
  12232. WOLFSSL_ABI
  12233. ecEncCtx* wc_ecc_ctx_new(int flags, WC_RNG* rng)
  12234. {
  12235. return wc_ecc_ctx_new_ex(flags, rng, NULL);
  12236. }
  12237. /* free any resources, clear any keys */
  12238. WOLFSSL_ABI
  12239. void wc_ecc_ctx_free(ecEncCtx* ctx)
  12240. {
  12241. if (ctx) {
  12242. void* heap = ctx->heap;
  12243. ForceZero(ctx, sizeof(ecEncCtx));
  12244. XFREE(ctx, heap, DYNAMIC_TYPE_ECC);
  12245. (void)heap;
  12246. }
  12247. }
  12248. static int ecc_get_key_sizes(ecEncCtx* ctx, int* encKeySz, int* ivSz,
  12249. int* keysLen, word32* digestSz, word32* blockSz)
  12250. {
  12251. if (ctx) {
  12252. switch (ctx->encAlgo) {
  12253. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  12254. case ecAES_128_CBC:
  12255. *encKeySz = KEY_SIZE_128;
  12256. *ivSz = IV_SIZE_128;
  12257. *blockSz = AES_BLOCK_SIZE;
  12258. break;
  12259. case ecAES_256_CBC:
  12260. *encKeySz = KEY_SIZE_256;
  12261. *ivSz = IV_SIZE_128;
  12262. *blockSz = AES_BLOCK_SIZE;
  12263. break;
  12264. #endif
  12265. #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
  12266. case ecAES_128_CTR:
  12267. *encKeySz = KEY_SIZE_128;
  12268. *ivSz = 12;
  12269. *blockSz = 1;
  12270. break;
  12271. case ecAES_256_CTR:
  12272. *encKeySz = KEY_SIZE_256;
  12273. *ivSz = 12;
  12274. *blockSz = 1;
  12275. break;
  12276. #endif
  12277. default:
  12278. return BAD_FUNC_ARG;
  12279. }
  12280. switch (ctx->macAlgo) {
  12281. case ecHMAC_SHA256:
  12282. *digestSz = WC_SHA256_DIGEST_SIZE;
  12283. break;
  12284. default:
  12285. return BAD_FUNC_ARG;
  12286. }
  12287. } else
  12288. return BAD_FUNC_ARG;
  12289. #ifdef WOLFSSL_ECIES_OLD
  12290. *keysLen = *encKeySz + *ivSz + (int)*digestSz;
  12291. #else
  12292. *keysLen = *encKeySz + (int)*digestSz;
  12293. #endif
  12294. return 0;
  12295. }
  12296. /* ecc encrypt with shared secret run through kdf
  12297. ctx holds non default algos and inputs
  12298. msgSz should be the right size for encAlgo, i.e., already padded
  12299. return 0 on success */
  12300. int wc_ecc_encrypt_ex(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  12301. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx, int compressed)
  12302. {
  12303. int ret = 0;
  12304. word32 blockSz = 0;
  12305. #ifndef WOLFSSL_ECIES_OLD
  12306. #ifndef WOLFSSL_ECIES_GEN_IV
  12307. byte iv[ECC_MAX_IV_SIZE];
  12308. #endif
  12309. word32 pubKeySz = 0;
  12310. #endif
  12311. word32 digestSz = 0;
  12312. ecEncCtx localCtx;
  12313. #ifdef WOLFSSL_SMALL_STACK
  12314. byte* sharedSecret;
  12315. byte* keys;
  12316. #else
  12317. #if defined(WOLFSSL_ECIES_OLD) || !defined(WOLFSSL_ECIES_ISO18033)
  12318. byte sharedSecret[ECC_MAXSIZE]; /* 521 max size */
  12319. #else
  12320. byte sharedSecret[ECC_MAXSIZE * 3 + 1]; /* Public key too */
  12321. #endif
  12322. byte keys[ECC_BUFSIZE]; /* max size */
  12323. #endif
  12324. #if defined(WOLFSSL_ECIES_OLD) || !defined(WOLFSSL_ECIES_ISO18033)
  12325. word32 sharedSz = ECC_MAXSIZE;
  12326. #else
  12327. /* 'Uncompressed' byte | public key x | public key y | secret */
  12328. word32 sharedSz = 1 + ECC_MAXSIZE * 3;
  12329. #endif
  12330. int keysLen = 0;
  12331. int encKeySz = 0;
  12332. int ivSz = 0;
  12333. int offset = 0; /* keys offset if doing msg exchange */
  12334. byte* encKey = NULL;
  12335. byte* encIv = NULL;
  12336. byte* macKey = NULL;
  12337. if (privKey == NULL || pubKey == NULL || msg == NULL || out == NULL ||
  12338. outSz == NULL)
  12339. return BAD_FUNC_ARG;
  12340. if (ctx == NULL) { /* use defaults */
  12341. ecc_ctx_init(&localCtx, 0, NULL);
  12342. ctx = &localCtx;
  12343. }
  12344. ret = ecc_get_key_sizes(ctx, &encKeySz, &ivSz, &keysLen, &digestSz,
  12345. &blockSz);
  12346. if (ret != 0)
  12347. return ret;
  12348. #ifndef WOLFSSL_ECIES_OLD
  12349. if (!compressed) {
  12350. pubKeySz = 1 + (word32)wc_ecc_size(privKey) * 2;
  12351. }
  12352. else {
  12353. pubKeySz = 1 + (word32)wc_ecc_size(privKey);
  12354. }
  12355. #else
  12356. (void) compressed; /* avoid unused parameter if WOLFSSL_ECIES_OLD is defined */
  12357. #endif
  12358. if (ctx->protocol == REQ_RESP_SERVER) {
  12359. offset = keysLen;
  12360. keysLen *= 2;
  12361. if (ctx->srvSt != ecSRV_RECV_REQ)
  12362. return BAD_STATE_E;
  12363. ctx->srvSt = ecSRV_BAD_STATE; /* we're done no more ops allowed */
  12364. }
  12365. else if (ctx->protocol == REQ_RESP_CLIENT) {
  12366. if (ctx->cliSt != ecCLI_SALT_SET)
  12367. return BAD_STATE_E;
  12368. ctx->cliSt = ecCLI_SENT_REQ; /* only do this once */
  12369. }
  12370. if (keysLen > ECC_BUFSIZE) /* keys size */
  12371. return BUFFER_E;
  12372. if ((msgSz % blockSz) != 0)
  12373. return BAD_PADDING_E;
  12374. #ifdef WOLFSSL_ECIES_OLD
  12375. if (*outSz < (msgSz + digestSz))
  12376. return BUFFER_E;
  12377. #elif defined(WOLFSSL_ECIES_GEN_IV)
  12378. if (*outSz < (pubKeySz + ivSz + msgSz + digestSz))
  12379. return BUFFER_E;
  12380. #else
  12381. if (*outSz < (pubKeySz + msgSz + digestSz))
  12382. return BUFFER_E;
  12383. #endif
  12384. #ifdef ECC_TIMING_RESISTANT
  12385. if (ctx->rng != NULL && privKey->rng == NULL)
  12386. privKey->rng = ctx->rng;
  12387. #endif
  12388. #ifndef WOLFSSL_ECIES_OLD
  12389. if (privKey->type == ECC_PRIVATEKEY_ONLY) {
  12390. #ifdef ECC_TIMING_RESISTANT
  12391. ret = wc_ecc_make_pub_ex(privKey, NULL, privKey->rng);
  12392. #else
  12393. ret = wc_ecc_make_pub_ex(privKey, NULL, NULL);
  12394. #endif
  12395. if (ret != 0)
  12396. return ret;
  12397. }
  12398. ret = wc_ecc_export_x963_ex(privKey, out, &pubKeySz, compressed);
  12399. if (ret != 0)
  12400. return ret;
  12401. out += pubKeySz;
  12402. #endif
  12403. #ifdef WOLFSSL_SMALL_STACK
  12404. sharedSecret = (byte*)XMALLOC(sharedSz, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12405. if (sharedSecret == NULL)
  12406. return MEMORY_E;
  12407. keys = (byte*)XMALLOC(ECC_BUFSIZE, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12408. if (keys == NULL) {
  12409. XFREE(sharedSecret, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12410. return MEMORY_E;
  12411. }
  12412. #endif
  12413. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  12414. #ifdef WOLFSSL_ECIES_ISO18033
  12415. XMEMCPY(sharedSecret, out - pubKeySz, pubKeySz);
  12416. sharedSz -= pubKeySz;
  12417. #endif
  12418. do {
  12419. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  12420. ret = wc_AsyncWait(ret, &privKey->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  12421. if (ret != 0)
  12422. break;
  12423. #endif
  12424. #ifndef WOLFSSL_ECIES_ISO18033
  12425. ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret, &sharedSz);
  12426. #else
  12427. ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret + pubKeySz,
  12428. &sharedSz);
  12429. #endif
  12430. }
  12431. while (ret == WC_PENDING_E);
  12432. if (ret == 0) {
  12433. #ifdef WOLFSSL_ECIES_ISO18033
  12434. /* KDF data is encoded public key and secret. */
  12435. sharedSz += pubKeySz;
  12436. #endif
  12437. switch (ctx->kdfAlgo) {
  12438. case ecHKDF_SHA256 :
  12439. ret = wc_HKDF(WC_SHA256, sharedSecret, sharedSz, ctx->kdfSalt,
  12440. ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
  12441. keys, (word32)keysLen);
  12442. break;
  12443. case ecHKDF_SHA1 :
  12444. ret = wc_HKDF(WC_SHA, sharedSecret, sharedSz, ctx->kdfSalt,
  12445. ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
  12446. keys, (word32)keysLen);
  12447. break;
  12448. #if defined(HAVE_X963_KDF) && !defined(NO_HASH_WRAPPER)
  12449. case ecKDF_X963_SHA1 :
  12450. ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz,
  12451. ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen);
  12452. break;
  12453. case ecKDF_X963_SHA256 :
  12454. ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz,
  12455. ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen);
  12456. break;
  12457. case ecKDF_SHA1 :
  12458. ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz,
  12459. NULL, 0, keys, (word32)keysLen);
  12460. break;
  12461. case ecKDF_SHA256 :
  12462. ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz,
  12463. NULL, 0, keys, (word32)keysLen);
  12464. break;
  12465. #endif
  12466. default:
  12467. ret = BAD_FUNC_ARG;
  12468. break;
  12469. }
  12470. }
  12471. if (ret == 0) {
  12472. #ifdef WOLFSSL_ECIES_OLD
  12473. encKey = keys + offset;
  12474. encIv = encKey + encKeySz;
  12475. macKey = encKey + encKeySz + ivSz;
  12476. #elif defined(WOLFSSL_ECIES_GEN_IV)
  12477. encKey = keys + offset;
  12478. encIv = out;
  12479. out += ivSz;
  12480. macKey = encKey + encKeySz;
  12481. ret = wc_RNG_GenerateBlock(privKey->rng, encIv, ivSz);
  12482. #else
  12483. XMEMSET(iv, 0, (size_t)ivSz);
  12484. encKey = keys + offset;
  12485. encIv = iv;
  12486. macKey = encKey + encKeySz;
  12487. #endif
  12488. }
  12489. if (ret == 0) {
  12490. switch (ctx->encAlgo) {
  12491. case ecAES_128_CBC:
  12492. case ecAES_256_CBC:
  12493. {
  12494. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  12495. #ifdef WOLFSSL_SMALL_STACK
  12496. Aes *aes = (Aes *)XMALLOC(sizeof *aes, ctx->heap,
  12497. DYNAMIC_TYPE_AES);
  12498. if (aes == NULL) {
  12499. ret = MEMORY_E;
  12500. break;
  12501. }
  12502. #else
  12503. Aes aes[1];
  12504. #endif
  12505. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  12506. if (ret == 0) {
  12507. ret = wc_AesSetKey(aes, encKey, (word32)encKeySz, encIv,
  12508. AES_ENCRYPTION);
  12509. if (ret == 0) {
  12510. ret = wc_AesCbcEncrypt(aes, out, msg, msgSz);
  12511. #if defined(WOLFSSL_ASYNC_CRYPT) && \
  12512. defined(WC_ASYNC_ENABLE_AES)
  12513. ret = wc_AsyncWait(ret, &aes->asyncDev,
  12514. WC_ASYNC_FLAG_NONE);
  12515. #endif
  12516. }
  12517. wc_AesFree(aes);
  12518. }
  12519. #ifdef WOLFSSL_SMALL_STACK
  12520. XFREE(aes, ctx->heap, DYNAMIC_TYPE_AES);
  12521. #endif
  12522. #else
  12523. ret = NOT_COMPILED_IN;
  12524. #endif
  12525. break;
  12526. }
  12527. case ecAES_128_CTR:
  12528. case ecAES_256_CTR:
  12529. {
  12530. #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
  12531. byte ctr_iv[AES_BLOCK_SIZE];
  12532. #ifndef WOLFSSL_SMALL_STACK
  12533. Aes aes[1];
  12534. #else
  12535. Aes *aes = (Aes *)XMALLOC(sizeof *aes, ctx->heap,
  12536. DYNAMIC_TYPE_AES);
  12537. if (aes == NULL) {
  12538. ret = MEMORY_E;
  12539. break;
  12540. }
  12541. #endif
  12542. /* Include 4 byte counter starting at all zeros. */
  12543. XMEMCPY(ctr_iv, encIv, WOLFSSL_ECIES_GEN_IV_SIZE);
  12544. XMEMSET(ctr_iv + WOLFSSL_ECIES_GEN_IV_SIZE, 0,
  12545. AES_BLOCK_SIZE - WOLFSSL_ECIES_GEN_IV_SIZE);
  12546. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  12547. if (ret == 0) {
  12548. ret = wc_AesSetKey(aes, encKey, (word32)encKeySz, ctr_iv,
  12549. AES_ENCRYPTION);
  12550. if (ret == 0) {
  12551. ret = wc_AesCtrEncrypt(aes, out, msg, msgSz);
  12552. #if defined(WOLFSSL_ASYNC_CRYPT) && \
  12553. defined(WC_ASYNC_ENABLE_AES)
  12554. ret = wc_AsyncWait(ret, &aes->asyncDev,
  12555. WC_ASYNC_FLAG_NONE);
  12556. #endif
  12557. }
  12558. wc_AesFree(aes);
  12559. }
  12560. #ifdef WOLFSSL_SMALL_STACK
  12561. XFREE(aes, ctx->heap, DYNAMIC_TYPE_AES);
  12562. #endif
  12563. #else
  12564. ret = NOT_COMPILED_IN;
  12565. #endif
  12566. break;
  12567. }
  12568. default:
  12569. ret = BAD_FUNC_ARG;
  12570. break;
  12571. }
  12572. }
  12573. if (ret == 0) {
  12574. switch (ctx->macAlgo) {
  12575. case ecHMAC_SHA256:
  12576. {
  12577. #ifdef WOLFSSL_SMALL_STACK
  12578. Hmac *hmac = (Hmac *)XMALLOC(sizeof *hmac, ctx->heap,
  12579. DYNAMIC_TYPE_HMAC);
  12580. if (hmac == NULL) {
  12581. ret = MEMORY_E;
  12582. break;
  12583. }
  12584. #else
  12585. Hmac hmac[1];
  12586. #endif
  12587. ret = wc_HmacInit(hmac, NULL, INVALID_DEVID);
  12588. if (ret == 0) {
  12589. ret = wc_HmacSetKey(hmac, WC_SHA256, macKey,
  12590. WC_SHA256_DIGEST_SIZE);
  12591. if (ret == 0) {
  12592. #if !defined(WOLFSSL_ECIES_GEN_IV)
  12593. ret = wc_HmacUpdate(hmac, out, msgSz);
  12594. #else
  12595. /* IV is before encrypted message. */
  12596. ret = wc_HmacUpdate(hmac, encIv, ivSz + msgSz);
  12597. #endif
  12598. }
  12599. if (ret == 0)
  12600. ret = wc_HmacUpdate(hmac, ctx->macSalt, ctx->macSaltSz);
  12601. if (ret == 0)
  12602. ret = wc_HmacFinal(hmac, out+msgSz);
  12603. wc_HmacFree(hmac);
  12604. }
  12605. #ifdef WOLFSSL_SMALL_STACK
  12606. XFREE(hmac, ctx->heap, DYNAMIC_TYPE_HMAC);
  12607. #endif
  12608. break;
  12609. }
  12610. default:
  12611. ret = BAD_FUNC_ARG;
  12612. break;
  12613. }
  12614. }
  12615. if (ret == 0) {
  12616. #ifdef WOLFSSL_ECIES_OLD
  12617. *outSz = msgSz + digestSz;
  12618. #elif defined(WOLFSSL_ECIES_GEN_IV)
  12619. *outSz = pubKeySz + ivSz + msgSz + digestSz;
  12620. #else
  12621. *outSz = pubKeySz + msgSz + digestSz;
  12622. #endif
  12623. }
  12624. RESTORE_VECTOR_REGISTERS();
  12625. #ifdef WOLFSSL_SMALL_STACK
  12626. XFREE(sharedSecret, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12627. XFREE(keys, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12628. #endif
  12629. return ret;
  12630. }
  12631. /* ecc encrypt with shared secret run through kdf
  12632. ctx holds non default algos and inputs
  12633. msgSz should be the right size for encAlgo, i.e., already padded
  12634. return 0 on success */
  12635. WOLFSSL_ABI
  12636. int wc_ecc_encrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  12637. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx)
  12638. {
  12639. return wc_ecc_encrypt_ex(privKey, pubKey, msg, msgSz, out, outSz, ctx, 0);
  12640. }
  12641. /* ecc decrypt with shared secret run through kdf
  12642. ctx holds non default algos and inputs
  12643. return 0 on success */
  12644. WOLFSSL_ABI
  12645. int wc_ecc_decrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  12646. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx)
  12647. {
  12648. int ret = 0;
  12649. word32 blockSz = 0;
  12650. #ifndef WOLFSSL_ECIES_OLD
  12651. #ifndef WOLFSSL_ECIES_GEN_IV
  12652. byte iv[ECC_MAX_IV_SIZE];
  12653. #endif
  12654. word32 pubKeySz = 0;
  12655. #ifdef WOLFSSL_SMALL_STACK
  12656. ecc_key* peerKey = NULL;
  12657. #else
  12658. ecc_key peerKey[1];
  12659. #endif
  12660. #endif
  12661. word32 digestSz = 0;
  12662. ecEncCtx localCtx;
  12663. #ifdef WOLFSSL_SMALL_STACK
  12664. byte* sharedSecret;
  12665. byte* keys;
  12666. #else
  12667. #if defined(WOLFSSL_ECIES_OLD) || !defined(WOLFSSL_ECIES_ISO18033)
  12668. byte sharedSecret[ECC_MAXSIZE]; /* 521 max size */
  12669. #else
  12670. byte sharedSecret[ECC_MAXSIZE * 3 + 1]; /* Public key too */
  12671. #endif
  12672. byte keys[ECC_BUFSIZE]; /* max size */
  12673. #endif
  12674. #if defined(WOLFSSL_ECIES_OLD) || !defined(WOLFSSL_ECIES_ISO18033)
  12675. word32 sharedSz = ECC_MAXSIZE;
  12676. #else
  12677. word32 sharedSz = ECC_MAXSIZE * 3 + 1;
  12678. #endif
  12679. int keysLen = 0;
  12680. int encKeySz = 0;
  12681. int ivSz = 0;
  12682. int offset = 0; /* in case using msg exchange */
  12683. byte* encKey = NULL;
  12684. const byte* encIv = NULL;
  12685. byte* macKey = NULL;
  12686. if (privKey == NULL || msg == NULL || out == NULL || outSz == NULL)
  12687. return BAD_FUNC_ARG;
  12688. #ifdef WOLFSSL_ECIES_OLD
  12689. if (pubKey == NULL)
  12690. return BAD_FUNC_ARG;
  12691. #endif
  12692. if (ctx == NULL) { /* use defaults */
  12693. ecc_ctx_init(&localCtx, 0, NULL);
  12694. ctx = &localCtx;
  12695. }
  12696. ret = ecc_get_key_sizes(ctx, &encKeySz, &ivSz, &keysLen, &digestSz,
  12697. &blockSz);
  12698. if (ret != 0)
  12699. return ret;
  12700. #ifndef WOLFSSL_ECIES_OLD
  12701. ret = ecc_public_key_size(privKey, &pubKeySz);
  12702. if (ret != 0)
  12703. return ret;
  12704. #ifdef HAVE_COMP_KEY
  12705. if ((msgSz > 1) && ((msg[0] == 0x02) || (msg[0] == 0x03))) {
  12706. pubKeySz = (pubKeySz / 2) + 1;
  12707. }
  12708. #endif /* HAVE_COMP_KEY */
  12709. #endif /* WOLFSSL_ECIES_OLD */
  12710. if (ctx->protocol == REQ_RESP_CLIENT) {
  12711. offset = keysLen;
  12712. keysLen *= 2;
  12713. if (ctx->cliSt != ecCLI_SENT_REQ)
  12714. return BAD_STATE_E;
  12715. ctx->cliSt = ecSRV_BAD_STATE; /* we're done no more ops allowed */
  12716. }
  12717. else if (ctx->protocol == REQ_RESP_SERVER) {
  12718. if (ctx->srvSt != ecSRV_SALT_SET)
  12719. return BAD_STATE_E;
  12720. ctx->srvSt = ecSRV_RECV_REQ; /* only do this once */
  12721. }
  12722. if (keysLen > ECC_BUFSIZE) /* keys size */
  12723. return BUFFER_E;
  12724. #ifdef WOLFSSL_ECIES_OLD
  12725. if (((msgSz - digestSz) % blockSz) != 0)
  12726. return BAD_PADDING_E;
  12727. if (*outSz < (msgSz - digestSz))
  12728. return BUFFER_E;
  12729. #elif defined(WOLFSSL_ECIES_GEN_IV)
  12730. if (((msgSz - ivSz - digestSz - pubKeySz) % blockSz) != 0)
  12731. return BAD_PADDING_E;
  12732. if (msgSz < pubKeySz + ivSz + blockSz + digestSz)
  12733. return BAD_FUNC_ARG;
  12734. if (*outSz < (msgSz - ivSz - digestSz - pubKeySz))
  12735. return BUFFER_E;
  12736. #else
  12737. if (((msgSz - digestSz - pubKeySz) % blockSz) != 0)
  12738. return BAD_PADDING_E;
  12739. if (msgSz < pubKeySz + blockSz + digestSz)
  12740. return BAD_FUNC_ARG;
  12741. if (*outSz < (msgSz - digestSz - pubKeySz))
  12742. return BUFFER_E;
  12743. #endif
  12744. #ifdef ECC_TIMING_RESISTANT
  12745. if (ctx->rng != NULL && privKey->rng == NULL)
  12746. privKey->rng = ctx->rng;
  12747. #endif
  12748. #ifdef WOLFSSL_SMALL_STACK
  12749. sharedSecret = (byte*)XMALLOC(sharedSz, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12750. if (sharedSecret == NULL) {
  12751. #ifndef WOLFSSL_ECIES_OLD
  12752. if (pubKey == peerKey)
  12753. wc_ecc_free(peerKey);
  12754. #endif
  12755. return MEMORY_E;
  12756. }
  12757. keys = (byte*)XMALLOC(ECC_BUFSIZE, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12758. if (keys == NULL) {
  12759. XFREE(sharedSecret, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12760. #ifndef WOLFSSL_ECIES_OLD
  12761. if (pubKey == peerKey)
  12762. wc_ecc_free(peerKey);
  12763. #endif
  12764. return MEMORY_E;
  12765. }
  12766. #endif
  12767. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  12768. #ifndef WOLFSSL_ECIES_OLD
  12769. if (pubKey == NULL) {
  12770. #ifdef WOLFSSL_SMALL_STACK
  12771. peerKey = (ecc_key*)XMALLOC(sizeof(*peerKey), ctx->heap,
  12772. DYNAMIC_TYPE_ECC_BUFFER);
  12773. if (peerKey == NULL)
  12774. ret = MEMORY_E;
  12775. #endif
  12776. pubKey = peerKey;
  12777. }
  12778. else {
  12779. /* if a public key was passed in we should free it here before init
  12780. * and import */
  12781. wc_ecc_free(pubKey);
  12782. }
  12783. if (ret == 0) {
  12784. ret = wc_ecc_init_ex(pubKey, privKey->heap, INVALID_DEVID);
  12785. }
  12786. if (ret == 0) {
  12787. ret = wc_ecc_import_x963_ex(msg, pubKeySz, pubKey, privKey->dp->id);
  12788. }
  12789. if (ret == 0) {
  12790. /* Point is not MACed. */
  12791. msg += pubKeySz;
  12792. msgSz -= pubKeySz;
  12793. }
  12794. #endif
  12795. if (ret == 0) {
  12796. #ifdef WOLFSSL_ECIES_ISO18033
  12797. XMEMCPY(sharedSecret, msg - pubKeySz, pubKeySz);
  12798. sharedSz -= pubKeySz;
  12799. #endif
  12800. do {
  12801. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  12802. ret = wc_AsyncWait(ret, &privKey->asyncDev,
  12803. WC_ASYNC_FLAG_CALL_AGAIN);
  12804. if (ret != 0)
  12805. break;
  12806. #endif
  12807. #ifndef WOLFSSL_ECIES_ISO18033
  12808. ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret,
  12809. &sharedSz);
  12810. #else
  12811. ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret +
  12812. pubKeySz, &sharedSz);
  12813. #endif
  12814. } while (ret == WC_PENDING_E);
  12815. }
  12816. if (ret == 0) {
  12817. #ifdef WOLFSSL_ECIES_ISO18033
  12818. /* KDF data is encoded public key and secret. */
  12819. sharedSz += pubKeySz;
  12820. #endif
  12821. switch (ctx->kdfAlgo) {
  12822. case ecHKDF_SHA256 :
  12823. ret = wc_HKDF(WC_SHA256, sharedSecret, sharedSz, ctx->kdfSalt,
  12824. ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
  12825. keys, (word32)keysLen);
  12826. break;
  12827. case ecHKDF_SHA1 :
  12828. ret = wc_HKDF(WC_SHA, sharedSecret, sharedSz, ctx->kdfSalt,
  12829. ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
  12830. keys, (word32)keysLen);
  12831. break;
  12832. #if defined(HAVE_X963_KDF) && !defined(NO_HASH_WRAPPER)
  12833. case ecKDF_X963_SHA1 :
  12834. ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz,
  12835. ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen);
  12836. break;
  12837. case ecKDF_X963_SHA256 :
  12838. ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz,
  12839. ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen);
  12840. break;
  12841. case ecKDF_SHA1 :
  12842. ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz,
  12843. NULL, 0, keys, (word32)keysLen);
  12844. break;
  12845. case ecKDF_SHA256 :
  12846. ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz,
  12847. NULL, 0, keys, (word32)keysLen);
  12848. break;
  12849. #endif
  12850. default:
  12851. ret = BAD_FUNC_ARG;
  12852. break;
  12853. }
  12854. }
  12855. if (ret == 0) {
  12856. #ifdef WOLFSSL_ECIES_OLD
  12857. encKey = keys + offset;
  12858. encIv = encKey + encKeySz;
  12859. macKey = encKey + encKeySz + ivSz;
  12860. #elif defined(WOLFSSL_ECIES_GEN_IV)
  12861. encKey = keys + offset;
  12862. encIv = msg;
  12863. msg += ivSz;
  12864. msgSz -= ivSz;
  12865. macKey = encKey + encKeySz;
  12866. #else
  12867. XMEMSET(iv, 0, (size_t)ivSz);
  12868. encKey = keys + offset;
  12869. encIv = iv;
  12870. macKey = encKey + encKeySz;
  12871. #endif
  12872. switch (ctx->macAlgo) {
  12873. case ecHMAC_SHA256:
  12874. {
  12875. byte verify[WC_SHA256_DIGEST_SIZE];
  12876. #ifdef WOLFSSL_SMALL_STACK
  12877. Hmac *hmac = (Hmac *)XMALLOC(sizeof *hmac, ctx->heap,
  12878. DYNAMIC_TYPE_HMAC);
  12879. if (hmac == NULL) {
  12880. ret = MEMORY_E;
  12881. break;
  12882. }
  12883. #else
  12884. Hmac hmac[1];
  12885. #endif
  12886. ret = wc_HmacInit(hmac, NULL, INVALID_DEVID);
  12887. if (ret == 0) {
  12888. ret = wc_HmacSetKey(hmac, WC_SHA256, macKey,
  12889. WC_SHA256_DIGEST_SIZE);
  12890. if (ret == 0)
  12891. #if !defined(WOLFSSL_ECIES_GEN_IV)
  12892. ret = wc_HmacUpdate(hmac, msg, msgSz-digestSz);
  12893. #else
  12894. /* IV is before encrypted message. */
  12895. ret = wc_HmacUpdate(hmac, encIv, ivSz+msgSz-digestSz);
  12896. #endif
  12897. if (ret == 0)
  12898. ret = wc_HmacUpdate(hmac, ctx->macSalt, ctx->macSaltSz);
  12899. if (ret == 0)
  12900. ret = wc_HmacFinal(hmac, verify);
  12901. if ((ret == 0) && (XMEMCMP(verify, msg + msgSz - digestSz,
  12902. digestSz) != 0)) {
  12903. ret = -1;
  12904. }
  12905. wc_HmacFree(hmac);
  12906. }
  12907. #ifdef WOLFSSL_SMALL_STACK
  12908. XFREE(hmac, ctx->heap, DYNAMIC_TYPE_HMAC);
  12909. #endif
  12910. break;
  12911. }
  12912. default:
  12913. ret = BAD_FUNC_ARG;
  12914. break;
  12915. }
  12916. }
  12917. if (ret == 0) {
  12918. switch (ctx->encAlgo) {
  12919. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  12920. case ecAES_128_CBC:
  12921. case ecAES_256_CBC:
  12922. {
  12923. #ifdef WOLFSSL_SMALL_STACK
  12924. Aes *aes = (Aes *)XMALLOC(sizeof *aes, ctx->heap,
  12925. DYNAMIC_TYPE_AES);
  12926. if (aes == NULL) {
  12927. ret = MEMORY_E;
  12928. break;
  12929. }
  12930. #else
  12931. Aes aes[1];
  12932. #endif
  12933. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  12934. if (ret == 0) {
  12935. ret = wc_AesSetKey(aes, encKey, (word32)encKeySz, encIv,
  12936. AES_DECRYPTION);
  12937. if (ret == 0) {
  12938. ret = wc_AesCbcDecrypt(aes, out, msg, msgSz-digestSz);
  12939. #if defined(WOLFSSL_ASYNC_CRYPT) && \
  12940. defined(WC_ASYNC_ENABLE_AES)
  12941. ret = wc_AsyncWait(ret, &aes->asyncDev,
  12942. WC_ASYNC_FLAG_NONE);
  12943. #endif
  12944. }
  12945. wc_AesFree(aes);
  12946. }
  12947. #ifdef WOLFSSL_SMALL_STACK
  12948. XFREE(aes, ctx->heap, DYNAMIC_TYPE_AES);
  12949. #endif
  12950. break;
  12951. }
  12952. #endif
  12953. #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
  12954. case ecAES_128_CTR:
  12955. case ecAES_256_CTR:
  12956. {
  12957. #ifdef WOLFSSL_SMALL_STACK
  12958. Aes *aes = (Aes *)XMALLOC(sizeof *aes, ctx->heap,
  12959. DYNAMIC_TYPE_AES);
  12960. if (aes == NULL) {
  12961. ret = MEMORY_E;
  12962. break;
  12963. }
  12964. #else
  12965. Aes aes[1];
  12966. #endif
  12967. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  12968. if (ret == 0) {
  12969. byte ctr_iv[AES_BLOCK_SIZE];
  12970. /* Make a 16 byte IV from the bytes passed in. */
  12971. XMEMCPY(ctr_iv, encIv, WOLFSSL_ECIES_GEN_IV_SIZE);
  12972. XMEMSET(ctr_iv + WOLFSSL_ECIES_GEN_IV_SIZE, 0,
  12973. AES_BLOCK_SIZE - WOLFSSL_ECIES_GEN_IV_SIZE);
  12974. ret = wc_AesSetKey(aes, encKey, (word32)encKeySz, ctr_iv,
  12975. AES_ENCRYPTION);
  12976. if (ret == 0) {
  12977. ret = wc_AesCtrEncrypt(aes, out, msg, msgSz-digestSz);
  12978. #if defined(WOLFSSL_ASYNC_CRYPT) && \
  12979. defined(WC_ASYNC_ENABLE_AES)
  12980. ret = wc_AsyncWait(ret, &aes->asyncDev,
  12981. WC_ASYNC_FLAG_NONE);
  12982. #endif
  12983. }
  12984. wc_AesFree(aes);
  12985. }
  12986. #ifdef WOLFSSL_SMALL_STACK
  12987. XFREE(aes, ctx->heap, DYNAMIC_TYPE_AES);
  12988. #endif
  12989. break;
  12990. }
  12991. #endif
  12992. default:
  12993. ret = BAD_FUNC_ARG;
  12994. break;
  12995. }
  12996. }
  12997. if (ret == 0)
  12998. *outSz = msgSz - digestSz;
  12999. RESTORE_VECTOR_REGISTERS();
  13000. #ifndef WOLFSSL_ECIES_OLD
  13001. if (pubKey == peerKey)
  13002. wc_ecc_free(peerKey);
  13003. #endif
  13004. #ifdef WOLFSSL_SMALL_STACK
  13005. #ifndef WOLFSSL_ECIES_OLD
  13006. if (peerKey != NULL) {
  13007. XFREE(peerKey, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  13008. }
  13009. #endif
  13010. XFREE(sharedSecret, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  13011. XFREE(keys, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  13012. #endif
  13013. return ret;
  13014. }
  13015. #endif /* HAVE_ECC_ENCRYPT */
  13016. #ifdef HAVE_COMP_KEY
  13017. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  13018. !defined(WOLFSSL_CRYPTOCELL)
  13019. #ifndef WOLFSSL_SP_MATH
  13020. #if !defined(SQRTMOD_USE_MOD_EXP)
  13021. /* computes the jacobi c = (a | n) (or Legendre if n is prime)
  13022. */
  13023. static int mp_jacobi(mp_int* a, mp_int* n, int* c)
  13024. {
  13025. #ifdef WOLFSSL_SMALL_STACK
  13026. mp_int* a1 = NULL;
  13027. mp_int* n1 = NULL;
  13028. #else
  13029. mp_int a1[1], n1[1];
  13030. #endif
  13031. int res;
  13032. int s = 1;
  13033. int k;
  13034. mp_int* t[2];
  13035. mp_int* ts;
  13036. mp_digit residue;
  13037. if (mp_isneg(a) == MP_YES) {
  13038. return MP_VAL;
  13039. }
  13040. if (mp_isneg(n) == MP_YES) {
  13041. return MP_VAL;
  13042. }
  13043. if (mp_iseven(n) == MP_YES) {
  13044. return MP_VAL;
  13045. }
  13046. #ifdef WOLFSSL_SMALL_STACK
  13047. a1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  13048. if (a1 == NULL) {
  13049. return MP_MEM;
  13050. }
  13051. n1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  13052. if (n1 == NULL) {
  13053. XFREE(a1, NULL, DYNAMIC_TYPE_BIGINT);
  13054. return MP_MEM;
  13055. }
  13056. #endif
  13057. if ((res = mp_init_multi(a1, n1, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  13058. #ifdef WOLFSSL_SMALL_STACK
  13059. XFREE(a1, NULL, DYNAMIC_TYPE_BIGINT);
  13060. XFREE(n1, NULL, DYNAMIC_TYPE_BIGINT);
  13061. #endif
  13062. return res;
  13063. }
  13064. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  13065. if ((res = mp_mod(a, n, a1)) != MP_OKAY) {
  13066. goto done;
  13067. }
  13068. if ((res = mp_copy(n, n1)) != MP_OKAY) {
  13069. goto done;
  13070. }
  13071. t[0] = a1;
  13072. t[1] = n1;
  13073. /* Keep reducing until first number is 0. */
  13074. while (!mp_iszero(t[0])) {
  13075. /* Divide by 2 until odd. */
  13076. k = mp_cnt_lsb(t[0]);
  13077. if (k > 0) {
  13078. mp_rshb(t[0], k);
  13079. /* Negate s each time we divide by 2 if t[1] mod 8 == 3 or 5.
  13080. * Odd number of divides results in a negate.
  13081. */
  13082. residue = t[1]->dp[0] & 7;
  13083. if ((k & 1) && ((residue == 3) || (residue == 5))) {
  13084. s = -s;
  13085. }
  13086. }
  13087. /* Swap t[0] and t[1]. */
  13088. ts = t[0];
  13089. t[0] = t[1];
  13090. t[1] = ts;
  13091. /* Negate s if both numbers == 3 mod 4. */
  13092. if (((t[0]->dp[0] & 3) == 3) && ((t[1]->dp[0] & 3) == 3)) {
  13093. s = -s;
  13094. }
  13095. /* Reduce first number modulo second. */
  13096. if ((k == 0) && (mp_count_bits(t[0]) == mp_count_bits(t[1]))) {
  13097. res = mp_sub(t[0], t[1], t[0]);
  13098. }
  13099. else {
  13100. res = mp_mod(t[0], t[1], t[0]);
  13101. }
  13102. if (res != MP_OKAY) {
  13103. goto done;
  13104. }
  13105. }
  13106. /* When the two numbers have divisors in common. */
  13107. if (!mp_isone(t[1])) {
  13108. s = 0;
  13109. }
  13110. *c = s;
  13111. done:
  13112. RESTORE_VECTOR_REGISTERS();
  13113. /* cleanup */
  13114. mp_clear(n1);
  13115. mp_clear(a1);
  13116. #ifdef WOLFSSL_SMALL_STACK
  13117. XFREE(a1, NULL, DYNAMIC_TYPE_BIGINT);
  13118. XFREE(n1, NULL, DYNAMIC_TYPE_BIGINT);
  13119. #endif
  13120. return res;
  13121. }
  13122. #endif /* !SQRTMOD_USE_MOD_EXP */
  13123. /* Solves the modular equation x^2 = n (mod p)
  13124. * where prime number is greater than 2 (odd prime).
  13125. * The result is returned in the third argument x
  13126. * the function returns MP_OKAY on success, MP_VAL or another error on failure
  13127. */
  13128. static int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret)
  13129. {
  13130. #if defined(SQRTMOD_USE_MOD_EXP)
  13131. int res;
  13132. mp_digit i;
  13133. mp_int e;
  13134. /* first handle the simple cases n = 0 or n = 1 */
  13135. if (mp_cmp_d(n, 0) == MP_EQ) {
  13136. mp_zero(ret);
  13137. return MP_OKAY;
  13138. }
  13139. if (mp_cmp_d(n, 1) == MP_EQ) {
  13140. return mp_set(ret, 1);
  13141. }
  13142. if (mp_iseven(prime)) {
  13143. return MP_VAL;
  13144. }
  13145. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  13146. res = mp_init(&e);
  13147. if (res == MP_OKAY)
  13148. res = mp_mod_d(prime, 8, &i);
  13149. if (res == MP_OKAY && i == 1) {
  13150. return MP_VAL;
  13151. }
  13152. /* prime mod 8 = 5 */
  13153. else if (res == MP_OKAY && i == 5) {
  13154. res = mp_sub_d(prime, 1, &e);
  13155. if (res == MP_OKAY)
  13156. res = mp_div_2d(&e, 2, &e, NULL);
  13157. }
  13158. /* prime mod 4 = 3 */
  13159. else if (res == MP_OKAY && ((i == 3) || (i == 7))) {
  13160. res = mp_add_d(prime, 1, &e);
  13161. if (res == MP_OKAY)
  13162. res = mp_div_2d(&e, 2, &e, NULL);
  13163. }
  13164. if (res == MP_OKAY)
  13165. res = mp_exptmod(n, &e, prime, ret);
  13166. mp_clear(&e);
  13167. RESTORE_VECTOR_REGISTERS();
  13168. return res;
  13169. #else
  13170. int res, legendre, done = 0;
  13171. mp_digit i;
  13172. #ifdef WOLFSSL_SMALL_STACK
  13173. mp_int *t1 = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13174. mp_int *C = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13175. mp_int *Q = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13176. mp_int *S = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13177. mp_int *Z = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13178. mp_int *M = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13179. mp_int *T = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13180. mp_int *R = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13181. mp_int *N = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13182. mp_int *two = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13183. #else
  13184. mp_int t1[1], C[1], Q[1], S[1], Z[1], M[1], T[1], R[1], N[1], two[1];
  13185. #endif
  13186. SAVE_VECTOR_REGISTERS(res = _svr_ret; goto out;);
  13187. if ((mp_init_multi(t1, C, Q, S, Z, M) != MP_OKAY) ||
  13188. (mp_init_multi(T, R, N, two, NULL, NULL) != MP_OKAY)) {
  13189. res = MP_INIT_E;
  13190. goto out;
  13191. }
  13192. #ifdef WOLFSSL_SMALL_STACK
  13193. if ((t1 == NULL) ||
  13194. (C == NULL) ||
  13195. (Q == NULL) ||
  13196. (S == NULL) ||
  13197. (Z == NULL) ||
  13198. (M == NULL) ||
  13199. (T == NULL) ||
  13200. (R == NULL) ||
  13201. (N == NULL) ||
  13202. (two == NULL)) {
  13203. res = MP_MEM;
  13204. goto out;
  13205. }
  13206. #endif
  13207. /* first handle the simple cases n = 0 or n = 1 */
  13208. if (mp_cmp_d(n, 0) == MP_EQ) {
  13209. mp_zero(ret);
  13210. res = MP_OKAY;
  13211. goto out;
  13212. }
  13213. if (mp_cmp_d(n, 1) == MP_EQ) {
  13214. res = mp_set(ret, 1);
  13215. goto out;
  13216. }
  13217. /* prime must be odd */
  13218. if (mp_cmp_d(prime, 2) == MP_EQ) {
  13219. res = MP_VAL;
  13220. goto out;
  13221. }
  13222. /* reduce n to less than prime */
  13223. res = mp_mod(n, prime, N);
  13224. if (res != MP_OKAY) {
  13225. goto out;
  13226. }
  13227. /* when N is zero, sqrt is zero */
  13228. if (mp_iszero(N)) {
  13229. mp_set(ret, 0);
  13230. goto out;
  13231. }
  13232. /* is quadratic non-residue mod prime */
  13233. if ((res = mp_jacobi(N, prime, &legendre)) != MP_OKAY) {
  13234. goto out;
  13235. }
  13236. if (legendre == -1) {
  13237. res = MP_VAL;
  13238. goto out;
  13239. }
  13240. /* SPECIAL CASE: if prime mod 4 == 3
  13241. * compute directly: res = n^(prime+1)/4 mod prime
  13242. * Handbook of Applied Cryptography algorithm 3.36
  13243. */
  13244. res = mp_mod_d(prime, 4, &i);
  13245. if (res == MP_OKAY && i == 3) {
  13246. res = mp_add_d(prime, 1, t1);
  13247. if (res == MP_OKAY)
  13248. res = mp_div_2(t1, t1);
  13249. if (res == MP_OKAY)
  13250. res = mp_div_2(t1, t1);
  13251. if (res == MP_OKAY)
  13252. res = mp_exptmod(N, t1, prime, ret);
  13253. done = 1;
  13254. }
  13255. /* NOW: TonelliShanks algorithm */
  13256. if (res == MP_OKAY && done == 0) {
  13257. /* factor out powers of 2 from prime-1, defining Q and S
  13258. * as: prime-1 = Q*2^S */
  13259. /* Q = prime - 1 */
  13260. res = mp_copy(prime, Q);
  13261. if (res == MP_OKAY)
  13262. res = mp_sub_d(Q, 1, Q);
  13263. /* S = 0 */
  13264. if (res == MP_OKAY)
  13265. mp_zero(S);
  13266. while (res == MP_OKAY && mp_iseven(Q) == MP_YES) {
  13267. /* Q = Q / 2 */
  13268. res = mp_div_2(Q, Q);
  13269. /* S = S + 1 */
  13270. if (res == MP_OKAY)
  13271. res = mp_add_d(S, 1, S);
  13272. }
  13273. /* find a Z such that the Legendre symbol (Z|prime) == -1 */
  13274. /* Z = 2 */
  13275. if (res == MP_OKAY)
  13276. res = mp_set_int(Z, 2);
  13277. while (res == MP_OKAY) {
  13278. res = mp_jacobi(Z, prime, &legendre);
  13279. if (res == MP_OKAY && legendre == -1)
  13280. break;
  13281. #if defined(WOLFSSL_CUSTOM_CURVES)
  13282. /* P224R1 succeeds with a value of 11. */
  13283. if (mp_cmp_d(Z, 22) == MP_EQ) {
  13284. /* This is to clamp the loop in case 'prime' is not really prime */
  13285. res = MP_VAL;
  13286. break;
  13287. }
  13288. #endif
  13289. /* Z = Z + 1 */
  13290. if (res == MP_OKAY)
  13291. res = mp_add_d(Z, 1, Z);
  13292. if ((res == MP_OKAY) && (mp_cmp(Z,prime) == MP_EQ)) {
  13293. /* This is to clamp the loop in case 'prime' is not really prime */
  13294. res = MP_VAL;
  13295. break;
  13296. }
  13297. }
  13298. /* C = Z ^ Q mod prime */
  13299. if (res == MP_OKAY)
  13300. res = mp_exptmod(Z, Q, prime, C);
  13301. /* t1 = (Q + 1) / 2 */
  13302. if (res == MP_OKAY)
  13303. res = mp_add_d(Q, 1, t1);
  13304. if (res == MP_OKAY)
  13305. res = mp_div_2(t1, t1);
  13306. /* R = n ^ ((Q + 1) / 2) mod prime */
  13307. if (res == MP_OKAY)
  13308. res = mp_exptmod(N, t1, prime, R);
  13309. /* T = n ^ Q mod prime */
  13310. if (res == MP_OKAY)
  13311. res = mp_exptmod(N, Q, prime, T);
  13312. /* M = S */
  13313. if (res == MP_OKAY)
  13314. res = mp_copy(S, M);
  13315. if (res == MP_OKAY)
  13316. res = mp_set_int(two, 2);
  13317. while (res == MP_OKAY && done == 0) {
  13318. res = mp_copy(T, t1);
  13319. /* reduce to 1 and count */
  13320. i = 0;
  13321. while (res == MP_OKAY) {
  13322. if (mp_cmp_d(t1, 1) == MP_EQ)
  13323. break;
  13324. res = mp_exptmod(t1, two, prime, t1);
  13325. if ((res == MP_OKAY) && (mp_cmp_d(M,i) == MP_EQ)) {
  13326. /* This is to clamp the loop in case 'prime' is not really prime */
  13327. res = MP_VAL;
  13328. break;
  13329. }
  13330. if (res == MP_OKAY)
  13331. i++;
  13332. }
  13333. if (res == MP_OKAY && i == 0) {
  13334. res = mp_copy(R, ret);
  13335. done = 1;
  13336. }
  13337. if (done == 0) {
  13338. /* t1 = 2 ^ (M - i - 1) */
  13339. if (res == MP_OKAY)
  13340. res = mp_sub_d(M, i, t1);
  13341. if (res == MP_OKAY)
  13342. res = mp_sub_d(t1, 1, t1);
  13343. if (res == MP_OKAY)
  13344. res = mp_exptmod(two, t1, prime, t1);
  13345. /* t1 = C ^ (2 ^ (M - i - 1)) mod prime */
  13346. if (res == MP_OKAY)
  13347. res = mp_exptmod(C, t1, prime, t1);
  13348. /* C = (t1 * t1) mod prime */
  13349. if (res == MP_OKAY)
  13350. res = mp_sqrmod(t1, prime, C);
  13351. /* R = (R * t1) mod prime */
  13352. if (res == MP_OKAY)
  13353. res = mp_mulmod(R, t1, prime, R);
  13354. /* T = (T * C) mod prime */
  13355. if (res == MP_OKAY)
  13356. res = mp_mulmod(T, C, prime, T);
  13357. /* M = i */
  13358. if (res == MP_OKAY)
  13359. res = mp_set(M, i);
  13360. }
  13361. }
  13362. }
  13363. out:
  13364. RESTORE_VECTOR_REGISTERS();
  13365. #ifdef WOLFSSL_SMALL_STACK
  13366. if (t1) {
  13367. if (res != MP_INIT_E)
  13368. mp_clear(t1);
  13369. XFREE(t1, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13370. }
  13371. if (C) {
  13372. if (res != MP_INIT_E)
  13373. mp_clear(C);
  13374. XFREE(C, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13375. }
  13376. if (Q) {
  13377. if (res != MP_INIT_E)
  13378. mp_clear(Q);
  13379. XFREE(Q, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13380. }
  13381. if (S) {
  13382. if (res != MP_INIT_E)
  13383. mp_clear(S);
  13384. XFREE(S, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13385. }
  13386. if (Z) {
  13387. if (res != MP_INIT_E)
  13388. mp_clear(Z);
  13389. XFREE(Z, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13390. }
  13391. if (M) {
  13392. if (res != MP_INIT_E)
  13393. mp_clear(M);
  13394. XFREE(M, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13395. }
  13396. if (T) {
  13397. if (res != MP_INIT_E)
  13398. mp_clear(T);
  13399. XFREE(T, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13400. }
  13401. if (R) {
  13402. if (res != MP_INIT_E)
  13403. mp_clear(R);
  13404. XFREE(R, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13405. }
  13406. if (N) {
  13407. if (res != MP_INIT_E)
  13408. mp_clear(N);
  13409. XFREE(N, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13410. }
  13411. if (two) {
  13412. if (res != MP_INIT_E)
  13413. mp_clear(two);
  13414. XFREE(two, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13415. }
  13416. #else
  13417. if (res != MP_INIT_E) {
  13418. mp_clear(t1);
  13419. mp_clear(C);
  13420. mp_clear(Q);
  13421. mp_clear(S);
  13422. mp_clear(Z);
  13423. mp_clear(M);
  13424. mp_clear(T);
  13425. mp_clear(R);
  13426. mp_clear(N);
  13427. mp_clear(two);
  13428. }
  13429. #endif
  13430. return res;
  13431. #endif
  13432. }
  13433. #endif /* !WOLFSSL_SP_MATH */
  13434. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A && !WOLFSSL_CRYPTOCELL */
  13435. #ifdef HAVE_ECC_KEY_EXPORT
  13436. /* export public ECC key in ANSI X9.63 format compressed */
  13437. static int wc_ecc_export_x963_compressed(ecc_key* key, byte* out, word32* outLen)
  13438. {
  13439. word32 numlen;
  13440. int ret = MP_OKAY;
  13441. if (key == NULL || outLen == NULL)
  13442. return BAD_FUNC_ARG;
  13443. if (key->type == ECC_PRIVATEKEY_ONLY)
  13444. return ECC_PRIVATEONLY_E;
  13445. if (key->type == 0 || wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL){
  13446. return ECC_BAD_ARG_E;
  13447. }
  13448. numlen = (word32)key->dp->size;
  13449. if (*outLen < (1 + numlen)) {
  13450. *outLen = 1 + numlen;
  13451. return LENGTH_ONLY_E;
  13452. }
  13453. if (out == NULL)
  13454. return BAD_FUNC_ARG;
  13455. if (mp_unsigned_bin_size(key->pubkey.x) > (int)numlen)
  13456. return ECC_BAD_ARG_E;
  13457. /* store first byte */
  13458. out[0] = mp_isodd(key->pubkey.y) == MP_YES ? ECC_POINT_COMP_ODD : ECC_POINT_COMP_EVEN;
  13459. /* pad and store x */
  13460. XMEMSET(out+1, 0, numlen);
  13461. ret = mp_to_unsigned_bin(
  13462. key->pubkey.x,
  13463. out+1 + (numlen - (word32)mp_unsigned_bin_size(key->pubkey.x)));
  13464. *outLen = 1 + numlen;
  13465. return ret;
  13466. }
  13467. #endif /* HAVE_ECC_KEY_EXPORT */
  13468. #endif /* HAVE_COMP_KEY */
  13469. int wc_ecc_get_oid(word32 oidSum, const byte** oid, word32* oidSz)
  13470. {
  13471. int x;
  13472. if (oidSum == 0) {
  13473. return BAD_FUNC_ARG;
  13474. }
  13475. /* find matching OID sum (based on encoded value) */
  13476. for (x = 0; ecc_sets[x].size != 0; x++) {
  13477. if (ecc_sets[x].oidSum == oidSum) {
  13478. int ret;
  13479. #ifdef HAVE_OID_ENCODING
  13480. ret = 0;
  13481. /* check cache */
  13482. oid_cache_t* o = &ecc_oid_cache[x];
  13483. if (o->oidSz == 0) {
  13484. o->oidSz = sizeof(o->oid);
  13485. ret = EncodeObjectId(ecc_sets[x].oid, ecc_sets[x].oidSz,
  13486. o->oid, &o->oidSz);
  13487. }
  13488. if (oidSz) {
  13489. *oidSz = o->oidSz;
  13490. }
  13491. if (oid) {
  13492. *oid = o->oid;
  13493. }
  13494. /* on success return curve id */
  13495. if (ret == 0) {
  13496. ret = ecc_sets[x].id;
  13497. }
  13498. #else
  13499. if (oidSz) {
  13500. *oidSz = ecc_sets[x].oidSz;
  13501. }
  13502. if (oid) {
  13503. *oid = ecc_sets[x].oid;
  13504. }
  13505. ret = ecc_sets[x].id;
  13506. #endif
  13507. return ret;
  13508. }
  13509. }
  13510. return NOT_COMPILED_IN;
  13511. }
  13512. #ifdef WOLFSSL_CUSTOM_CURVES
  13513. int wc_ecc_set_custom_curve(ecc_key* key, const ecc_set_type* dp)
  13514. {
  13515. if (key == NULL || dp == NULL) {
  13516. return BAD_FUNC_ARG;
  13517. }
  13518. key->idx = ECC_CUSTOM_IDX;
  13519. key->dp = dp;
  13520. return 0;
  13521. }
  13522. #endif /* WOLFSSL_CUSTOM_CURVES */
  13523. #if defined(HAVE_X963_KDF) && !defined(NO_HASH_WRAPPER)
  13524. static WC_INLINE void IncrementX963KdfCounter(byte* inOutCtr)
  13525. {
  13526. int i;
  13527. /* in network byte order so start at end and work back */
  13528. for (i = 3; i >= 0; i--) {
  13529. if (++inOutCtr[i]) /* we're done unless we overflow */
  13530. return;
  13531. }
  13532. }
  13533. /* ASN X9.63 Key Derivation Function (SEC1) */
  13534. int wc_X963_KDF(enum wc_HashType type, const byte* secret, word32 secretSz,
  13535. const byte* sinfo, word32 sinfoSz, byte* out, word32 outSz)
  13536. {
  13537. int ret;
  13538. word32 digestSz, copySz, remaining = outSz;
  13539. byte* outIdx;
  13540. byte counter[4];
  13541. byte tmp[WC_MAX_DIGEST_SIZE];
  13542. #ifdef WOLFSSL_SMALL_STACK
  13543. wc_HashAlg* hash;
  13544. #else
  13545. wc_HashAlg hash[1];
  13546. #endif
  13547. if (secret == NULL || secretSz == 0 || out == NULL)
  13548. return BAD_FUNC_ARG;
  13549. /* X9.63 allowed algos only */
  13550. if (type != WC_HASH_TYPE_SHA && type != WC_HASH_TYPE_SHA224 &&
  13551. type != WC_HASH_TYPE_SHA256 && type != WC_HASH_TYPE_SHA384 &&
  13552. type != WC_HASH_TYPE_SHA512)
  13553. return BAD_FUNC_ARG;
  13554. ret = wc_HashGetDigestSize(type);
  13555. if (ret < 0)
  13556. return ret;
  13557. digestSz = (word32)ret;
  13558. #ifdef WOLFSSL_SMALL_STACK
  13559. hash = (wc_HashAlg*)XMALLOC(sizeof(wc_HashAlg), NULL,
  13560. DYNAMIC_TYPE_HASHES);
  13561. if (hash == NULL)
  13562. return MEMORY_E;
  13563. #endif
  13564. ret = wc_HashInit(hash, type);
  13565. if (ret != 0) {
  13566. #ifdef WOLFSSL_SMALL_STACK
  13567. XFREE(hash, NULL, DYNAMIC_TYPE_HASHES);
  13568. #endif
  13569. return ret;
  13570. }
  13571. outIdx = out;
  13572. XMEMSET(counter, 0, sizeof(counter));
  13573. while (remaining > 0) {
  13574. IncrementX963KdfCounter(counter);
  13575. ret = wc_HashUpdate(hash, type, secret, secretSz);
  13576. if (ret != 0) {
  13577. break;
  13578. }
  13579. ret = wc_HashUpdate(hash, type, counter, sizeof(counter));
  13580. if (ret != 0) {
  13581. break;
  13582. }
  13583. if (sinfo) {
  13584. ret = wc_HashUpdate(hash, type, sinfo, sinfoSz);
  13585. if (ret != 0) {
  13586. break;
  13587. }
  13588. }
  13589. ret = wc_HashFinal(hash, type, tmp);
  13590. if (ret != 0) {
  13591. break;
  13592. }
  13593. copySz = min(remaining, digestSz);
  13594. XMEMCPY(outIdx, tmp, copySz);
  13595. remaining -= copySz;
  13596. outIdx += copySz;
  13597. }
  13598. wc_HashFree(hash, type);
  13599. #ifdef WOLFSSL_SMALL_STACK
  13600. XFREE(hash, NULL, DYNAMIC_TYPE_HASHES);
  13601. #endif
  13602. return ret;
  13603. }
  13604. #endif /* HAVE_X963_KDF && !NO_HASH_WRAPPER */
  13605. #ifdef WOLFSSL_SE050
  13606. /* Use specified hardware key ID with ecc_key operations. Unlike devId,
  13607. * keyId is a word32, can be used for key IDs larger than an int.
  13608. *
  13609. * key initialized ecc_key struct
  13610. * keyId hardware key ID which stores ECC key
  13611. * flags optional flags, currently unused
  13612. *
  13613. * Return 0 on success, negative on error */
  13614. int wc_ecc_use_key_id(ecc_key* key, word32 keyId, word32 flags)
  13615. {
  13616. (void)flags;
  13617. if (key == NULL) {
  13618. return BAD_FUNC_ARG;
  13619. }
  13620. return se050_ecc_use_key_id(key, keyId);
  13621. }
  13622. /* Get hardware key ID associated with this ecc_key structure.
  13623. *
  13624. * key initialized ecc_key struct
  13625. * keyId [OUT] output for key ID associated with this structure
  13626. *
  13627. * Returns 0 on success, negative on error.
  13628. */
  13629. int wc_ecc_get_key_id(ecc_key* key, word32* keyId)
  13630. {
  13631. if (key == NULL || keyId == NULL) {
  13632. return BAD_FUNC_ARG;
  13633. }
  13634. return se050_ecc_get_key_id(key, keyId);
  13635. }
  13636. #endif /* WOLFSSL_SE050 */
  13637. #ifdef WC_ECC_NONBLOCK
  13638. /* Enable ECC support for non-blocking operations */
  13639. int wc_ecc_set_nonblock(ecc_key *key, ecc_nb_ctx_t* ctx)
  13640. {
  13641. if (key) {
  13642. if (ctx) {
  13643. XMEMSET(ctx, 0, sizeof(ecc_nb_ctx_t));
  13644. }
  13645. key->nb_ctx = ctx;
  13646. }
  13647. return 0;
  13648. }
  13649. #endif /* WC_ECC_NONBLOCK */
  13650. #endif /* HAVE_ECC */