ecc.c 391 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234
  1. /* ecc.c
  2. *
  3. * Copyright (C) 2006-2020 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. /* in case user set HAVE_ECC there */
  25. #include <wolfssl/wolfcrypt/settings.h>
  26. /* public ASN interface */
  27. #include <wolfssl/wolfcrypt/asn_public.h>
  28. /*
  29. Possible ECC enable options:
  30. * HAVE_ECC: Overall control of ECC default: on
  31. * HAVE_ECC_ENCRYPT: ECC encrypt/decrypt w/AES and HKDF default: off
  32. * HAVE_ECC_SIGN: ECC sign default: on
  33. * HAVE_ECC_VERIFY: ECC verify default: on
  34. * HAVE_ECC_DHE: ECC build shared secret default: on
  35. * HAVE_ECC_CDH: ECC cofactor DH shared secret default: off
  36. * HAVE_ECC_KEY_IMPORT: ECC Key import default: on
  37. * HAVE_ECC_KEY_EXPORT: ECC Key export default: on
  38. * ECC_SHAMIR: Enables Shamir calc method default: on
  39. * HAVE_COMP_KEY: Enables compressed key default: off
  40. * WOLFSSL_VALIDATE_ECC_IMPORT: Validate ECC key on import default: off
  41. * WOLFSSL_VALIDATE_ECC_KEYGEN: Validate ECC key gen default: off
  42. * WOLFSSL_CUSTOM_CURVES: Allow non-standard curves. default: off
  43. * Includes the curve "a" variable in calculation
  44. * ECC_DUMP_OID: Enables dump of OID encoding and sum default: off
  45. * ECC_CACHE_CURVE: Enables cache of curve info to improve performance
  46. default: off
  47. * FP_ECC: ECC Fixed Point Cache default: off
  48. * USE_ECC_B_PARAM: Enable ECC curve B param default: off
  49. (on for HAVE_COMP_KEY)
  50. * WOLFSSL_ECC_CURVE_STATIC: default off (on for windows)
  51. For the ECC curve paramaters `ecc_set_type` use fixed
  52. array for hex string
  53. * WC_ECC_NONBLOCK: Enable non-blocking support for sign/verify.
  54. Requires SP with WOLFSSL_SP_NONBLOCK
  55. * WC_ECC_NONBLOCK_ONLY Enable the non-blocking function only, no fall-back to
  56. normal blocking API's
  57. */
  58. /*
  59. ECC Curve Types:
  60. * NO_ECC_SECP Disables SECP curves default: off (not defined)
  61. * HAVE_ECC_SECPR2 Enables SECP R2 curves default: off
  62. * HAVE_ECC_SECPR3 Enables SECP R3 curves default: off
  63. * HAVE_ECC_BRAINPOOL Enables Brainpool curves default: off
  64. * HAVE_ECC_KOBLITZ Enables Koblitz curves default: off
  65. */
  66. /*
  67. ECC Curve Sizes:
  68. * ECC_USER_CURVES: Allows custom combination of key sizes below
  69. * HAVE_ALL_CURVES: Enable all key sizes (on unless ECC_USER_CURVES is defined)
  70. * HAVE_ECC112: 112 bit key
  71. * HAVE_ECC128: 128 bit key
  72. * HAVE_ECC160: 160 bit key
  73. * HAVE_ECC192: 192 bit key
  74. * HAVE_ECC224: 224 bit key
  75. * HAVE_ECC239: 239 bit key
  76. * NO_ECC256: Disables 256 bit key (on by default)
  77. * HAVE_ECC320: 320 bit key
  78. * HAVE_ECC384: 384 bit key
  79. * HAVE_ECC512: 512 bit key
  80. * HAVE_ECC521: 521 bit key
  81. */
  82. #ifdef HAVE_ECC
  83. /* Make sure custom curves is enabled for Brainpool or Koblitz curve types */
  84. #if (defined(HAVE_ECC_BRAINPOOL) || defined(HAVE_ECC_KOBLITZ)) &&\
  85. !defined(WOLFSSL_CUSTOM_CURVES)
  86. #error Brainpool and Koblitz curves requires WOLFSSL_CUSTOM_CURVES
  87. #endif
  88. #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)
  89. /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */
  90. #define FIPS_NO_WRAPPERS
  91. #ifdef USE_WINDOWS_API
  92. #pragma code_seg(".fipsA$f")
  93. #pragma const_seg(".fipsB$f")
  94. #endif
  95. #endif
  96. #include <wolfssl/wolfcrypt/ecc.h>
  97. #include <wolfssl/wolfcrypt/asn.h>
  98. #include <wolfssl/wolfcrypt/error-crypt.h>
  99. #include <wolfssl/wolfcrypt/logging.h>
  100. #include <wolfssl/wolfcrypt/types.h>
  101. #ifdef WOLFSSL_HAVE_SP_ECC
  102. #include <wolfssl/wolfcrypt/sp.h>
  103. #endif
  104. #ifdef HAVE_ECC_ENCRYPT
  105. #include <wolfssl/wolfcrypt/hmac.h>
  106. #include <wolfssl/wolfcrypt/aes.h>
  107. #endif
  108. #ifdef HAVE_X963_KDF
  109. #include <wolfssl/wolfcrypt/hash.h>
  110. #endif
  111. #ifdef WOLF_CRYPTO_CB
  112. #include <wolfssl/wolfcrypt/cryptocb.h>
  113. #endif
  114. #ifdef NO_INLINE
  115. #include <wolfssl/wolfcrypt/misc.h>
  116. #else
  117. #define WOLFSSL_MISC_INCLUDED
  118. #include <wolfcrypt/src/misc.c>
  119. #endif
  120. #if defined(FREESCALE_LTC_ECC)
  121. #include <wolfssl/wolfcrypt/port/nxp/ksdk_port.h>
  122. #endif
  123. #if defined(WOLFSSL_STM32_PKA)
  124. #include <wolfssl/wolfcrypt/port/st/stm32.h>
  125. #endif
  126. #if defined(WOLFSSL_PSOC6_CRYPTO)
  127. #include <wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h>
  128. #endif
  129. #ifdef WOLFSSL_SP_MATH
  130. #define GEN_MEM_ERR MP_MEM
  131. #elif defined(USE_FAST_MATH)
  132. #define GEN_MEM_ERR FP_MEM
  133. #else
  134. #define GEN_MEM_ERR MP_MEM
  135. #endif
  136. /* internal ECC states */
  137. enum {
  138. ECC_STATE_NONE = 0,
  139. ECC_STATE_SHARED_SEC_GEN,
  140. ECC_STATE_SHARED_SEC_RES,
  141. ECC_STATE_SIGN_DO,
  142. ECC_STATE_SIGN_ENCODE,
  143. ECC_STATE_VERIFY_DECODE,
  144. ECC_STATE_VERIFY_DO,
  145. ECC_STATE_VERIFY_RES,
  146. };
  147. /* map
  148. ptmul -> mulmod
  149. */
  150. /* 256-bit curve on by default whether user curves or not */
  151. #if defined(HAVE_ECC112) || defined(HAVE_ALL_CURVES)
  152. #define ECC112
  153. #endif
  154. #if defined(HAVE_ECC128) || defined(HAVE_ALL_CURVES)
  155. #define ECC128
  156. #endif
  157. #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
  158. #define ECC160
  159. #endif
  160. #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
  161. #define ECC192
  162. #endif
  163. #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
  164. #define ECC224
  165. #endif
  166. #if defined(HAVE_ECC239) || defined(HAVE_ALL_CURVES)
  167. #define ECC239
  168. #endif
  169. #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
  170. #define ECC256
  171. #endif
  172. #if defined(HAVE_ECC320) || defined(HAVE_ALL_CURVES)
  173. #define ECC320
  174. #endif
  175. #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
  176. #define ECC384
  177. #endif
  178. #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
  179. #define ECC512
  180. #endif
  181. #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
  182. #define ECC521
  183. #endif
  184. /* The encoded OID's for ECC curves */
  185. #ifdef ECC112
  186. #ifndef NO_ECC_SECP
  187. #ifdef HAVE_OID_ENCODING
  188. #define CODED_SECP112R1 {1,3,132,0,6}
  189. #define CODED_SECP112R1_SZ 5
  190. #else
  191. #define CODED_SECP112R1 {0x2B,0x81,0x04,0x00,0x06}
  192. #define CODED_SECP112R1_SZ 5
  193. #endif
  194. #ifndef WOLFSSL_ECC_CURVE_STATIC
  195. static const ecc_oid_t ecc_oid_secp112r1[] = CODED_SECP112R1;
  196. #else
  197. #define ecc_oid_secp112r1 CODED_SECP112R1
  198. #endif
  199. #define ecc_oid_secp112r1_sz CODED_SECP112R1_SZ
  200. #endif /* !NO_ECC_SECP */
  201. #ifdef HAVE_ECC_SECPR2
  202. #ifdef HAVE_OID_ENCODING
  203. #define CODED_SECP112R2 {1,3,132,0,7}
  204. #define CODED_SECP112R2_SZ 5
  205. #else
  206. #define CODED_SECP112R2 {0x2B,0x81,0x04,0x00,0x07}
  207. #define CODED_SECP112R2_SZ 5
  208. #endif
  209. #ifndef WOLFSSL_ECC_CURVE_STATIC
  210. static const ecc_oid_t ecc_oid_secp112r2[] = CODED_SECP112R2;
  211. #else
  212. #define ecc_oid_secp112r2 CODED_SECP112R2
  213. #endif
  214. #define ecc_oid_secp112r2_sz CODED_SECP112R2_SZ
  215. #endif /* HAVE_ECC_SECPR2 */
  216. #endif /* ECC112 */
  217. #ifdef ECC128
  218. #ifndef NO_ECC_SECP
  219. #ifdef HAVE_OID_ENCODING
  220. #define CODED_SECP128R1 {1,3,132,0,28}
  221. #define CODED_SECP128R1_SZ 5
  222. #else
  223. #define CODED_SECP128R1 {0x2B,0x81,0x04,0x00,0x1C}
  224. #define CODED_SECP128R1_SZ 5
  225. #endif
  226. #ifndef WOLFSSL_ECC_CURVE_STATIC
  227. static const ecc_oid_t ecc_oid_secp128r1[] = CODED_SECP128R1;
  228. #else
  229. #define ecc_oid_secp128r1 CODED_SECP128R1
  230. #endif
  231. #define ecc_oid_secp128r1_sz CODED_SECP128R1_SZ
  232. #endif /* !NO_ECC_SECP */
  233. #ifdef HAVE_ECC_SECPR2
  234. #ifdef HAVE_OID_ENCODING
  235. #define CODED_SECP128R2 {1,3,132,0,29}
  236. #define CODED_SECP128R2_SZ 5
  237. #else
  238. #define CODED_SECP128R2 {0x2B,0x81,0x04,0x00,0x1D}
  239. #define CODED_SECP128R2_SZ 5
  240. #endif
  241. #ifndef WOLFSSL_ECC_CURVE_STATIC
  242. static const ecc_oid_t ecc_oid_secp128r2[] = CODED_SECP128R2;
  243. #else
  244. #define ecc_oid_secp128r2 CODED_SECP128R2
  245. #endif
  246. #define ecc_oid_secp128r2_sz CODED_SECP128R2_SZ
  247. #endif /* HAVE_ECC_SECPR2 */
  248. #endif /* ECC128 */
  249. #ifdef ECC160
  250. #ifndef NO_ECC_SECP
  251. #ifdef HAVE_OID_ENCODING
  252. #define CODED_SECP160R1 {1,3,132,0,8}
  253. #define CODED_SECP160R1_SZ 5
  254. #else
  255. #define CODED_SECP160R1 {0x2B,0x81,0x04,0x00,0x08}
  256. #define CODED_SECP160R1_SZ 5
  257. #endif
  258. #ifndef WOLFSSL_ECC_CURVE_STATIC
  259. static const ecc_oid_t ecc_oid_secp160r1[] = CODED_SECP160R1;
  260. #else
  261. #define ecc_oid_secp160r1 CODED_SECP160R1
  262. #endif
  263. #define ecc_oid_secp160r1_sz CODED_SECP160R1_SZ
  264. #endif /* !NO_ECC_SECP */
  265. #ifdef HAVE_ECC_SECPR2
  266. #ifdef HAVE_OID_ENCODING
  267. #define CODED_SECP160R2 {1,3,132,0,30}
  268. #define CODED_SECP160R2_SZ 5
  269. #else
  270. #define CODED_SECP160R2 {0x2B,0x81,0x04,0x00,0x1E}
  271. #define CODED_SECP160R2_SZ 5
  272. #endif
  273. #ifndef WOLFSSL_ECC_CURVE_STATIC
  274. static const ecc_oid_t ecc_oid_secp160r2[] = CODED_SECP160R2;
  275. #else
  276. #define ecc_oid_secp160r2 CODED_SECP160R2
  277. #endif
  278. #define ecc_oid_secp160r2_sz CODED_SECP160R2_SZ
  279. #endif /* HAVE_ECC_SECPR2 */
  280. #ifdef HAVE_ECC_KOBLITZ
  281. #ifdef HAVE_OID_ENCODING
  282. #define CODED_SECP160K1 {1,3,132,0,9}
  283. #define CODED_SECP160K1_SZ 5
  284. #else
  285. #define CODED_SECP160K1 {0x2B,0x81,0x04,0x00,0x09}
  286. #define CODED_SECP160K1_SZ 5
  287. #endif
  288. #ifndef WOLFSSL_ECC_CURVE_STATIC
  289. static const ecc_oid_t ecc_oid_secp160k1[] = CODED_SECP160K1;
  290. #else
  291. #define ecc_oid_secp160k1 CODED_SECP160K1
  292. #endif
  293. #define ecc_oid_secp160k1_sz CODED_SECP160K1_SZ
  294. #endif /* HAVE_ECC_KOBLITZ */
  295. #ifdef HAVE_ECC_BRAINPOOL
  296. #ifdef HAVE_OID_ENCODING
  297. #define CODED_BRAINPOOLP160R1 {1,3,36,3,3,2,8,1,1,1}
  298. #define CODED_BRAINPOOLP160R1_SZ 10
  299. #else
  300. #define CODED_BRAINPOOLP160R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x01}
  301. #define CODED_BRAINPOOLP160R1_SZ 9
  302. #endif
  303. #ifndef WOLFSSL_ECC_CURVE_STATIC
  304. static const ecc_oid_t ecc_oid_brainpoolp160r1[] = CODED_BRAINPOOLP160R1;
  305. #else
  306. #define ecc_oid_brainpoolp160r1 CODED_BRAINPOOLP160R1
  307. #endif
  308. #define ecc_oid_brainpoolp160r1_sz CODED_BRAINPOOLP160R1_SZ
  309. #endif /* HAVE_ECC_BRAINPOOL */
  310. #endif /* ECC160 */
  311. #ifdef ECC192
  312. #ifndef NO_ECC_SECP
  313. #ifdef HAVE_OID_ENCODING
  314. #define CODED_SECP192R1 {1,2,840,10045,3,1,1}
  315. #define CODED_SECP192R1_SZ 7
  316. #else
  317. #define CODED_SECP192R1 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x01}
  318. #define CODED_SECP192R1_SZ 8
  319. #endif
  320. #ifndef WOLFSSL_ECC_CURVE_STATIC
  321. static const ecc_oid_t ecc_oid_secp192r1[] = CODED_SECP192R1;
  322. #else
  323. #define ecc_oid_secp192r1 CODED_SECP192R1
  324. #endif
  325. #define ecc_oid_secp192r1_sz CODED_SECP192R1_SZ
  326. #endif /* !NO_ECC_SECP */
  327. #ifdef HAVE_ECC_SECPR2
  328. #ifdef HAVE_OID_ENCODING
  329. #define CODED_PRIME192V2 {1,2,840,10045,3,1,2}
  330. #define CODED_PRIME192V2_SZ 7
  331. #else
  332. #define CODED_PRIME192V2 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x02}
  333. #define CODED_PRIME192V2_SZ 8
  334. #endif
  335. #ifndef WOLFSSL_ECC_CURVE_STATIC
  336. static const ecc_oid_t ecc_oid_prime192v2[] = CODED_PRIME192V2;
  337. #else
  338. #define ecc_oid_prime192v2 CODED_PRIME192V2
  339. #endif
  340. #define ecc_oid_prime192v2_sz CODED_PRIME192V2_SZ
  341. #endif /* HAVE_ECC_SECPR2 */
  342. #ifdef HAVE_ECC_SECPR3
  343. #ifdef HAVE_OID_ENCODING
  344. #define CODED_PRIME192V3 {1,2,840,10045,3,1,3}
  345. #define CODED_PRIME192V3_SZ 7
  346. #else
  347. #define CODED_PRIME192V3 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x03}
  348. #define CODED_PRIME192V3_SZ 8
  349. #endif
  350. #ifndef WOLFSSL_ECC_CURVE_STATIC
  351. static const ecc_oid_t ecc_oid_prime192v3[] = CODED_PRIME192V3;
  352. #else
  353. #define ecc_oid_prime192v3 CODED_PRIME192V3
  354. #endif
  355. #define ecc_oid_prime192v3_sz CODED_PRIME192V3_SZ
  356. #endif /* HAVE_ECC_SECPR3 */
  357. #ifdef HAVE_ECC_KOBLITZ
  358. #ifdef HAVE_OID_ENCODING
  359. #define CODED_SECP192K1 {1,3,132,0,31}
  360. #define CODED_SECP192K1_SZ 5
  361. #else
  362. #define CODED_SECP192K1 {0x2B,0x81,0x04,0x00,0x1F}
  363. #define CODED_SECP192K1_SZ 5
  364. #endif
  365. #ifndef WOLFSSL_ECC_CURVE_STATIC
  366. static const ecc_oid_t ecc_oid_secp192k1[] = CODED_SECP192K1;
  367. #else
  368. #define ecc_oid_secp192k1 CODED_SECP192K1
  369. #endif
  370. #define ecc_oid_secp192k1_sz CODED_SECP192K1_SZ
  371. #endif /* HAVE_ECC_KOBLITZ */
  372. #ifdef HAVE_ECC_BRAINPOOL
  373. #ifdef HAVE_OID_ENCODING
  374. #define CODED_BRAINPOOLP192R1 {1,3,36,3,3,2,8,1,1,3}
  375. #define CODED_BRAINPOOLP192R1_SZ 10
  376. #else
  377. #define CODED_BRAINPOOLP192R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x03}
  378. #define CODED_BRAINPOOLP192R1_SZ 9
  379. #endif
  380. #ifndef WOLFSSL_ECC_CURVE_STATIC
  381. static const ecc_oid_t ecc_oid_brainpoolp192r1[] = CODED_BRAINPOOLP192R1;
  382. #else
  383. #define ecc_oid_brainpoolp192r1 CODED_BRAINPOOLP192R1
  384. #endif
  385. #define ecc_oid_brainpoolp192r1_sz CODED_BRAINPOOLP192R1_SZ
  386. #endif /* HAVE_ECC_BRAINPOOL */
  387. #endif /* ECC192 */
  388. #ifdef ECC224
  389. #ifndef NO_ECC_SECP
  390. #ifdef HAVE_OID_ENCODING
  391. #define CODED_SECP224R1 {1,3,132,0,33}
  392. #define CODED_SECP224R1_SZ 5
  393. #else
  394. #define CODED_SECP224R1 {0x2B,0x81,0x04,0x00,0x21}
  395. #define CODED_SECP224R1_SZ 5
  396. #endif
  397. #ifndef WOLFSSL_ECC_CURVE_STATIC
  398. static const ecc_oid_t ecc_oid_secp224r1[] = CODED_SECP224R1;
  399. #else
  400. #define ecc_oid_secp224r1 CODED_SECP224R1
  401. #endif
  402. #define ecc_oid_secp224r1_sz CODED_SECP224R1_SZ
  403. #endif /* !NO_ECC_SECP */
  404. #ifdef HAVE_ECC_KOBLITZ
  405. #ifdef HAVE_OID_ENCODING
  406. #define CODED_SECP224K1 {1,3,132,0,32}
  407. #define CODED_SECP224K1_SZ 5
  408. #else
  409. #define CODED_SECP224K1 {0x2B,0x81,0x04,0x00,0x20}
  410. #define CODED_SECP224K1_SZ 5
  411. #endif
  412. #ifndef WOLFSSL_ECC_CURVE_STATIC
  413. static const ecc_oid_t ecc_oid_secp224k1[] = CODED_SECP224K1;
  414. #else
  415. #define ecc_oid_secp224k1 CODED_SECP224K1
  416. #endif
  417. #define ecc_oid_secp224k1_sz CODED_SECP224K1_SZ
  418. #endif /* HAVE_ECC_KOBLITZ */
  419. #ifdef HAVE_ECC_BRAINPOOL
  420. #ifdef HAVE_OID_ENCODING
  421. #define CODED_BRAINPOOLP224R1 {1,3,36,3,3,2,8,1,1,5}
  422. #define CODED_BRAINPOOLP224R1_SZ 10
  423. #else
  424. #define CODED_BRAINPOOLP224R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x05}
  425. #define CODED_BRAINPOOLP224R1_SZ 9
  426. #endif
  427. #ifndef WOLFSSL_ECC_CURVE_STATIC
  428. static const ecc_oid_t ecc_oid_brainpoolp224r1[] = CODED_BRAINPOOLP224R1;
  429. #else
  430. #define ecc_oid_brainpoolp224r1 CODED_BRAINPOOLP224R1
  431. #endif
  432. #define ecc_oid_brainpoolp224r1_sz CODED_BRAINPOOLP224R1_SZ
  433. #endif /* HAVE_ECC_BRAINPOOL */
  434. #endif /* ECC224 */
  435. #ifdef ECC239
  436. #ifndef NO_ECC_SECP
  437. #ifdef HAVE_OID_ENCODING
  438. #define CODED_PRIME239V1 {1,2,840,10045,3,1,4}
  439. #define CODED_PRIME239V1_SZ 7
  440. #else
  441. #define CODED_PRIME239V1 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x04}
  442. #define CODED_PRIME239V1_SZ 8
  443. #endif
  444. #ifndef WOLFSSL_ECC_CURVE_STATIC
  445. static const ecc_oid_t ecc_oid_prime239v1[] = CODED_PRIME239V1;
  446. #else
  447. #define ecc_oid_prime239v1 CODED_PRIME239V1
  448. #endif
  449. #define ecc_oid_prime239v1_sz CODED_PRIME239V1_SZ
  450. #endif /* !NO_ECC_SECP */
  451. #ifdef HAVE_ECC_SECPR2
  452. #ifdef HAVE_OID_ENCODING
  453. #define CODED_PRIME239V2 {1,2,840,10045,3,1,5}
  454. #define CODED_PRIME239V2_SZ 7
  455. #else
  456. #define CODED_PRIME239V2 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x05}
  457. #define CODED_PRIME239V2_SZ 8
  458. #endif
  459. #ifndef WOLFSSL_ECC_CURVE_STATIC
  460. static const ecc_oid_t ecc_oid_prime239v2[] = CODED_PRIME239V2;
  461. #else
  462. #define ecc_oid_prime239v2 CODED_PRIME239V2
  463. #endif
  464. #define ecc_oid_prime239v2_sz CODED_PRIME239V2_SZ
  465. #endif /* HAVE_ECC_SECPR2 */
  466. #ifdef HAVE_ECC_SECPR3
  467. #ifdef HAVE_OID_ENCODING
  468. #define CODED_PRIME239V3 {1,2,840,10045,3,1,6}
  469. #define CODED_PRIME239V3_SZ 7
  470. #else
  471. #define CODED_PRIME239V3 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x06}
  472. #define CODED_PRIME239V3_SZ 8
  473. #endif
  474. #ifndef WOLFSSL_ECC_CURVE_STATIC
  475. static const ecc_oid_t ecc_oid_prime239v3[] = CODED_PRIME239V3;
  476. #else
  477. #define ecc_oid_prime239v3 CODED_PRIME239V3
  478. #endif
  479. #define ecc_oid_prime239v3_sz CODED_PRIME239V3_SZ
  480. #endif /* HAVE_ECC_SECPR3 */
  481. #endif /* ECC239 */
  482. #ifdef ECC256
  483. #ifndef NO_ECC_SECP
  484. #ifdef HAVE_OID_ENCODING
  485. #define CODED_SECP256R1 {1,2,840,10045,3,1,7}
  486. #define CODED_SECP256R1_SZ 7
  487. #else
  488. #define CODED_SECP256R1 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x07}
  489. #define CODED_SECP256R1_SZ 8
  490. #endif
  491. #ifndef WOLFSSL_ECC_CURVE_STATIC
  492. static const ecc_oid_t ecc_oid_secp256r1[] = CODED_SECP256R1;
  493. #else
  494. #define ecc_oid_secp256r1 CODED_SECP256R1
  495. #endif
  496. #define ecc_oid_secp256r1_sz CODED_SECP256R1_SZ
  497. #endif /* !NO_ECC_SECP */
  498. #ifdef HAVE_ECC_KOBLITZ
  499. #ifdef HAVE_OID_ENCODING
  500. #define CODED_SECP256K1 {1,3,132,0,10}
  501. #define CODED_SECP256K1_SZ 5
  502. #else
  503. #define CODED_SECP256K1 {0x2B,0x81,0x04,0x00,0x0A}
  504. #define CODED_SECP256K1_SZ 5
  505. #endif
  506. #ifndef WOLFSSL_ECC_CURVE_STATIC
  507. static const ecc_oid_t ecc_oid_secp256k1[] = CODED_SECP256K1;
  508. #else
  509. #define ecc_oid_secp256k1 CODED_SECP256K1
  510. #endif
  511. #define ecc_oid_secp256k1_sz CODED_SECP256K1_SZ
  512. #endif /* HAVE_ECC_KOBLITZ */
  513. #ifdef HAVE_ECC_BRAINPOOL
  514. #ifdef HAVE_OID_ENCODING
  515. #define CODED_BRAINPOOLP256R1 {1,3,36,3,3,2,8,1,1,7}
  516. #define CODED_BRAINPOOLP256R1_SZ 10
  517. #else
  518. #define CODED_BRAINPOOLP256R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x07}
  519. #define CODED_BRAINPOOLP256R1_SZ 9
  520. #endif
  521. #ifndef WOLFSSL_ECC_CURVE_STATIC
  522. static const ecc_oid_t ecc_oid_brainpoolp256r1[] = CODED_BRAINPOOLP256R1;
  523. #else
  524. #define ecc_oid_brainpoolp256r1 CODED_BRAINPOOLP256R1
  525. #endif
  526. #define ecc_oid_brainpoolp256r1_sz CODED_BRAINPOOLP256R1_SZ
  527. #endif /* HAVE_ECC_BRAINPOOL */
  528. #endif /* ECC256 */
  529. #ifdef ECC320
  530. #ifdef HAVE_ECC_BRAINPOOL
  531. #ifdef HAVE_OID_ENCODING
  532. #define CODED_BRAINPOOLP320R1 {1,3,36,3,3,2,8,1,1,9}
  533. #define CODED_BRAINPOOLP320R1_SZ 10
  534. #else
  535. #define CODED_BRAINPOOLP320R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x09}
  536. #define CODED_BRAINPOOLP320R1_SZ 9
  537. #endif
  538. #ifndef WOLFSSL_ECC_CURVE_STATIC
  539. static const ecc_oid_t ecc_oid_brainpoolp320r1[] = CODED_BRAINPOOLP320R1;
  540. #else
  541. #define ecc_oid_brainpoolp320r1 CODED_BRAINPOOLP320R1
  542. #endif
  543. #define ecc_oid_brainpoolp320r1_sz CODED_BRAINPOOLP320R1_SZ
  544. #endif /* HAVE_ECC_BRAINPOOL */
  545. #endif /* ECC320 */
  546. #ifdef ECC384
  547. #ifndef NO_ECC_SECP
  548. #ifdef HAVE_OID_ENCODING
  549. #define CODED_SECP384R1 {1,3,132,0,34}
  550. #define CODED_SECP384R1_SZ 5
  551. #else
  552. #define CODED_SECP384R1 {0x2B,0x81,0x04,0x00,0x22}
  553. #define CODED_SECP384R1_SZ 5
  554. #endif
  555. #ifndef WOLFSSL_ECC_CURVE_STATIC
  556. static const ecc_oid_t ecc_oid_secp384r1[] = CODED_SECP384R1;
  557. #define CODED_SECP384R1_OID ecc_oid_secp384r1
  558. #else
  559. #define ecc_oid_secp384r1 CODED_SECP384R1
  560. #endif
  561. #define ecc_oid_secp384r1_sz CODED_SECP384R1_SZ
  562. #endif /* !NO_ECC_SECP */
  563. #ifdef HAVE_ECC_BRAINPOOL
  564. #ifdef HAVE_OID_ENCODING
  565. #define CODED_BRAINPOOLP384R1 {1,3,36,3,3,2,8,1,1,11}
  566. #define CODED_BRAINPOOLP384R1_SZ 10
  567. #else
  568. #define CODED_BRAINPOOLP384R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0B}
  569. #define CODED_BRAINPOOLP384R1_SZ 9
  570. #endif
  571. #ifndef WOLFSSL_ECC_CURVE_STATIC
  572. static const ecc_oid_t ecc_oid_brainpoolp384r1[] = CODED_BRAINPOOLP384R1;
  573. #else
  574. #define ecc_oid_brainpoolp384r1 CODED_BRAINPOOLP384R1
  575. #endif
  576. #define ecc_oid_brainpoolp384r1_sz CODED_BRAINPOOLP384R1_SZ
  577. #endif /* HAVE_ECC_BRAINPOOL */
  578. #endif /* ECC384 */
  579. #ifdef ECC512
  580. #ifdef HAVE_ECC_BRAINPOOL
  581. #ifdef HAVE_OID_ENCODING
  582. #define CODED_BRAINPOOLP512R1 {1,3,36,3,3,2,8,1,1,13}
  583. #define CODED_BRAINPOOLP512R1_SZ 10
  584. #else
  585. #define CODED_BRAINPOOLP512R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0D}
  586. #define CODED_BRAINPOOLP512R1_SZ 9
  587. #endif
  588. #ifndef WOLFSSL_ECC_CURVE_STATIC
  589. static const ecc_oid_t ecc_oid_brainpoolp512r1[] = CODED_BRAINPOOLP512R1;
  590. #else
  591. #define ecc_oid_brainpoolp512r1 CODED_BRAINPOOLP512R1
  592. #endif
  593. #define ecc_oid_brainpoolp512r1_sz CODED_BRAINPOOLP512R1_SZ
  594. #endif /* HAVE_ECC_BRAINPOOL */
  595. #endif /* ECC512 */
  596. #ifdef ECC521
  597. #ifndef NO_ECC_SECP
  598. #ifdef HAVE_OID_ENCODING
  599. #define CODED_SECP521R1 {1,3,132,0,35}
  600. #define CODED_SECP521R1_SZ 5
  601. #else
  602. #define CODED_SECP521R1 {0x2B,0x81,0x04,0x00,0x23}
  603. #define CODED_SECP521R1_SZ 5
  604. #endif
  605. #ifndef WOLFSSL_ECC_CURVE_STATIC
  606. static const ecc_oid_t ecc_oid_secp521r1[] = CODED_SECP521R1;
  607. #else
  608. #define ecc_oid_secp521r1 CODED_SECP521R1
  609. #endif
  610. #define ecc_oid_secp521r1_sz CODED_SECP521R1_SZ
  611. #endif /* !NO_ECC_SECP */
  612. #endif /* ECC521 */
  613. /* This holds the key settings.
  614. ***MUST*** be organized by size from smallest to largest. */
  615. const ecc_set_type ecc_sets[] = {
  616. #ifdef ECC112
  617. #ifndef NO_ECC_SECP
  618. {
  619. 14, /* size/bytes */
  620. ECC_SECP112R1, /* ID */
  621. "SECP112R1", /* curve name */
  622. "DB7C2ABF62E35E668076BEAD208B", /* prime */
  623. "DB7C2ABF62E35E668076BEAD2088", /* A */
  624. "659EF8BA043916EEDE8911702B22", /* B */
  625. "DB7C2ABF62E35E7628DFAC6561C5", /* order */
  626. "9487239995A5EE76B55F9C2F098", /* Gx */
  627. "A89CE5AF8724C0A23E0E0FF77500", /* Gy */
  628. ecc_oid_secp112r1, /* oid/oidSz */
  629. ecc_oid_secp112r1_sz,
  630. ECC_SECP112R1_OID, /* oid sum */
  631. 1, /* cofactor */
  632. },
  633. #endif /* !NO_ECC_SECP */
  634. #ifdef HAVE_ECC_SECPR2
  635. {
  636. 14, /* size/bytes */
  637. ECC_SECP112R2, /* ID */
  638. "SECP112R2", /* curve name */
  639. "DB7C2ABF62E35E668076BEAD208B", /* prime */
  640. "6127C24C05F38A0AAAF65C0EF02C", /* A */
  641. "51DEF1815DB5ED74FCC34C85D709", /* B */
  642. "36DF0AAFD8B8D7597CA10520D04B", /* order */
  643. "4BA30AB5E892B4E1649DD0928643", /* Gx */
  644. "ADCD46F5882E3747DEF36E956E97", /* Gy */
  645. ecc_oid_secp112r2, /* oid/oidSz */
  646. ecc_oid_secp112r2_sz,
  647. ECC_SECP112R2_OID, /* oid sum */
  648. 4, /* cofactor */
  649. },
  650. #endif /* HAVE_ECC_SECPR2 */
  651. #endif /* ECC112 */
  652. #ifdef ECC128
  653. #ifndef NO_ECC_SECP
  654. {
  655. 16, /* size/bytes */
  656. ECC_SECP128R1, /* ID */
  657. "SECP128R1", /* curve name */
  658. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  659. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", /* A */
  660. "E87579C11079F43DD824993C2CEE5ED3", /* B */
  661. "FFFFFFFE0000000075A30D1B9038A115", /* order */
  662. "161FF7528B899B2D0C28607CA52C5B86", /* Gx */
  663. "CF5AC8395BAFEB13C02DA292DDED7A83", /* Gy */
  664. ecc_oid_secp128r1, /* oid/oidSz */
  665. ecc_oid_secp128r1_sz,
  666. ECC_SECP128R1_OID, /* oid sum */
  667. 1, /* cofactor */
  668. },
  669. #endif /* !NO_ECC_SECP */
  670. #ifdef HAVE_ECC_SECPR2
  671. {
  672. 16, /* size/bytes */
  673. ECC_SECP128R2, /* ID */
  674. "SECP128R2", /* curve name */
  675. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  676. "D6031998D1B3BBFEBF59CC9BBFF9AEE1", /* A */
  677. "5EEEFCA380D02919DC2C6558BB6D8A5D", /* B */
  678. "3FFFFFFF7FFFFFFFBE0024720613B5A3", /* order */
  679. "7B6AA5D85E572983E6FB32A7CDEBC140", /* Gx */
  680. "27B6916A894D3AEE7106FE805FC34B44", /* Gy */
  681. ecc_oid_secp128r2, /* oid/oidSz */
  682. ecc_oid_secp128r2_sz,
  683. ECC_SECP128R2_OID, /* oid sum */
  684. 4, /* cofactor */
  685. },
  686. #endif /* HAVE_ECC_SECPR2 */
  687. #endif /* ECC128 */
  688. #ifdef ECC160
  689. #ifndef NO_ECC_SECP
  690. {
  691. 20, /* size/bytes */
  692. ECC_SECP160R1, /* ID */
  693. "SECP160R1", /* curve name */
  694. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", /* prime */
  695. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", /* A */
  696. "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", /* B */
  697. "100000000000000000001F4C8F927AED3CA752257",/* order */
  698. "4A96B5688EF573284664698968C38BB913CBFC82", /* Gx */
  699. "23A628553168947D59DCC912042351377AC5FB32", /* Gy */
  700. ecc_oid_secp160r1, /* oid/oidSz */
  701. ecc_oid_secp160r1_sz,
  702. ECC_SECP160R1_OID, /* oid sum */
  703. 1, /* cofactor */
  704. },
  705. #endif /* !NO_ECC_SECP */
  706. #ifdef HAVE_ECC_SECPR2
  707. {
  708. 20, /* size/bytes */
  709. ECC_SECP160R2, /* ID */
  710. "SECP160R2", /* curve name */
  711. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", /* prime */
  712. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70", /* A */
  713. "B4E134D3FB59EB8BAB57274904664D5AF50388BA", /* B */
  714. "100000000000000000000351EE786A818F3A1A16B",/* order */
  715. "52DCB034293A117E1F4FF11B30F7199D3144CE6D", /* Gx */
  716. "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E", /* Gy */
  717. ecc_oid_secp160r2, /* oid/oidSz */
  718. ecc_oid_secp160r2_sz,
  719. ECC_SECP160R2_OID, /* oid sum */
  720. 1, /* cofactor */
  721. },
  722. #endif /* HAVE_ECC_SECPR2 */
  723. #ifdef HAVE_ECC_KOBLITZ
  724. {
  725. 20, /* size/bytes */
  726. ECC_SECP160K1, /* ID */
  727. "SECP160K1", /* curve name */
  728. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", /* prime */
  729. "0000000000000000000000000000000000000000", /* A */
  730. "0000000000000000000000000000000000000007", /* B */
  731. "100000000000000000001B8FA16DFAB9ACA16B6B3",/* order */
  732. "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", /* Gx */
  733. "938CF935318FDCED6BC28286531733C3F03C4FEE", /* Gy */
  734. ecc_oid_secp160k1, /* oid/oidSz */
  735. ecc_oid_secp160k1_sz,
  736. ECC_SECP160K1_OID, /* oid sum */
  737. 1, /* cofactor */
  738. },
  739. #endif /* HAVE_ECC_KOBLITZ */
  740. #ifdef HAVE_ECC_BRAINPOOL
  741. {
  742. 20, /* size/bytes */
  743. ECC_BRAINPOOLP160R1, /* ID */
  744. "BRAINPOOLP160R1", /* curve name */
  745. "E95E4A5F737059DC60DFC7AD95B3D8139515620F", /* prime */
  746. "340E7BE2A280EB74E2BE61BADA745D97E8F7C300", /* A */
  747. "1E589A8595423412134FAA2DBDEC95C8D8675E58", /* B */
  748. "E95E4A5F737059DC60DF5991D45029409E60FC09", /* order */
  749. "BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3", /* Gx */
  750. "1667CB477A1A8EC338F94741669C976316DA6321", /* Gy */
  751. ecc_oid_brainpoolp160r1, /* oid/oidSz */
  752. ecc_oid_brainpoolp160r1_sz,
  753. ECC_BRAINPOOLP160R1_OID, /* oid sum */
  754. 1, /* cofactor */
  755. },
  756. #endif /* HAVE_ECC_BRAINPOOL */
  757. #endif /* ECC160 */
  758. #ifdef ECC192
  759. #ifndef NO_ECC_SECP
  760. {
  761. 24, /* size/bytes */
  762. ECC_SECP192R1, /* ID */
  763. "SECP192R1", /* curve name */
  764. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", /* prime */
  765. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", /* A */
  766. "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", /* B */
  767. "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", /* order */
  768. "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", /* Gx */
  769. "7192B95FFC8DA78631011ED6B24CDD573F977A11E794811", /* Gy */
  770. ecc_oid_secp192r1, /* oid/oidSz */
  771. ecc_oid_secp192r1_sz,
  772. ECC_SECP192R1_OID, /* oid sum */
  773. 1, /* cofactor */
  774. },
  775. #endif /* !NO_ECC_SECP */
  776. #ifdef HAVE_ECC_SECPR2
  777. {
  778. 24, /* size/bytes */
  779. ECC_PRIME192V2, /* ID */
  780. "PRIME192V2", /* curve name */
  781. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", /* prime */
  782. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", /* A */
  783. "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953", /* B */
  784. "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31", /* order */
  785. "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A", /* Gx */
  786. "6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15", /* Gy */
  787. ecc_oid_prime192v2, /* oid/oidSz */
  788. ecc_oid_prime192v2_sz,
  789. ECC_PRIME192V2_OID, /* oid sum */
  790. 1, /* cofactor */
  791. },
  792. #endif /* HAVE_ECC_SECPR2 */
  793. #ifdef HAVE_ECC_SECPR3
  794. {
  795. 24, /* size/bytes */
  796. ECC_PRIME192V3, /* ID */
  797. "PRIME192V3", /* curve name */
  798. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", /* prime */
  799. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", /* A */
  800. "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916", /* B */
  801. "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13", /* order */
  802. "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896", /* Gx */
  803. "38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0", /* Gy */
  804. ecc_oid_prime192v3, /* oid/oidSz */
  805. ecc_oid_prime192v3_sz,
  806. ECC_PRIME192V3_OID, /* oid sum */
  807. 1, /* cofactor */
  808. },
  809. #endif /* HAVE_ECC_SECPR3 */
  810. #ifdef HAVE_ECC_KOBLITZ
  811. {
  812. 24, /* size/bytes */
  813. ECC_SECP192K1, /* ID */
  814. "SECP192K1", /* curve name */
  815. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", /* prime */
  816. "000000000000000000000000000000000000000000000000", /* A */
  817. "000000000000000000000000000000000000000000000003", /* B */
  818. "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", /* order */
  819. "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", /* Gx */
  820. "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", /* Gy */
  821. ecc_oid_secp192k1, /* oid/oidSz */
  822. ecc_oid_secp192k1_sz,
  823. ECC_SECP192K1_OID, /* oid sum */
  824. 1, /* cofactor */
  825. },
  826. #endif /* HAVE_ECC_KOBLITZ */
  827. #ifdef HAVE_ECC_BRAINPOOL
  828. {
  829. 24, /* size/bytes */
  830. ECC_BRAINPOOLP192R1, /* ID */
  831. "BRAINPOOLP192R1", /* curve name */
  832. "C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297", /* prime */
  833. "6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF", /* A */
  834. "469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9", /* B */
  835. "C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1", /* order */
  836. "C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6", /* Gx */
  837. "14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F", /* Gy */
  838. ecc_oid_brainpoolp192r1, /* oid/oidSz */
  839. ecc_oid_brainpoolp192r1_sz,
  840. ECC_BRAINPOOLP192R1_OID, /* oid sum */
  841. 1, /* cofactor */
  842. },
  843. #endif /* HAVE_ECC_BRAINPOOL */
  844. #endif /* ECC192 */
  845. #ifdef ECC224
  846. #ifndef NO_ECC_SECP
  847. {
  848. 28, /* size/bytes */
  849. ECC_SECP224R1, /* ID */
  850. "SECP224R1", /* curve name */
  851. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", /* prime */
  852. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", /* A */
  853. "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", /* B */
  854. "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", /* order */
  855. "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", /* Gx */
  856. "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", /* Gy */
  857. ecc_oid_secp224r1, /* oid/oidSz */
  858. ecc_oid_secp224r1_sz,
  859. ECC_SECP224R1_OID, /* oid sum */
  860. 1, /* cofactor */
  861. },
  862. #endif /* !NO_ECC_SECP */
  863. #ifdef HAVE_ECC_KOBLITZ
  864. {
  865. 28, /* size/bytes */
  866. ECC_SECP224K1, /* ID */
  867. "SECP224K1", /* curve name */
  868. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D", /* prime */
  869. "00000000000000000000000000000000000000000000000000000000", /* A */
  870. "00000000000000000000000000000000000000000000000000000005", /* B */
  871. "10000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",/* order */
  872. "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C", /* Gx */
  873. "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5", /* Gy */
  874. ecc_oid_secp224k1, /* oid/oidSz */
  875. ecc_oid_secp224k1_sz,
  876. ECC_SECP224K1_OID, /* oid sum */
  877. 1, /* cofactor */
  878. },
  879. #endif /* HAVE_ECC_KOBLITZ */
  880. #ifdef HAVE_ECC_BRAINPOOL
  881. {
  882. 28, /* size/bytes */
  883. ECC_BRAINPOOLP224R1, /* ID */
  884. "BRAINPOOLP224R1", /* curve name */
  885. "D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF", /* prime */
  886. "68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43", /* A */
  887. "2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B", /* B */
  888. "D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F", /* order */
  889. "0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D", /* Gx */
  890. "58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD", /* Gy */
  891. ecc_oid_brainpoolp224r1, /* oid/oidSz */
  892. ecc_oid_brainpoolp224r1_sz,
  893. ECC_BRAINPOOLP224R1_OID, /* oid sum */
  894. 1, /* cofactor */
  895. },
  896. #endif /* HAVE_ECC_BRAINPOOL */
  897. #endif /* ECC224 */
  898. #ifdef ECC239
  899. #ifndef NO_ECC_SECP
  900. {
  901. 30, /* size/bytes */
  902. ECC_PRIME239V1, /* ID */
  903. "PRIME239V1", /* curve name */
  904. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", /* prime */
  905. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", /* A */
  906. "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A", /* B */
  907. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B", /* order */
  908. "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF", /* Gx */
  909. "7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE", /* Gy */
  910. ecc_oid_prime239v1, /* oid/oidSz */
  911. ecc_oid_prime239v1_sz,
  912. ECC_PRIME239V1_OID, /* oid sum */
  913. 1, /* cofactor */
  914. },
  915. #endif /* !NO_ECC_SECP */
  916. #ifdef HAVE_ECC_SECPR2
  917. {
  918. 30, /* size/bytes */
  919. ECC_PRIME239V2, /* ID */
  920. "PRIME239V2", /* curve name */
  921. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", /* prime */
  922. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", /* A */
  923. "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C", /* B */
  924. "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063", /* order */
  925. "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7", /* Gx */
  926. "5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA", /* Gy */
  927. ecc_oid_prime239v2, /* oid/oidSz */
  928. ecc_oid_prime239v2_sz,
  929. ECC_PRIME239V2_OID, /* oid sum */
  930. 1, /* cofactor */
  931. },
  932. #endif /* HAVE_ECC_SECPR2 */
  933. #ifdef HAVE_ECC_SECPR3
  934. {
  935. 30, /* size/bytes */
  936. ECC_PRIME239V3, /* ID */
  937. "PRIME239V3", /* curve name */
  938. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", /* prime */
  939. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", /* A */
  940. "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E", /* B */
  941. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551", /* order */
  942. "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A", /* Gx */
  943. "1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3", /* Gy */
  944. ecc_oid_prime239v3, /* oid/oidSz */
  945. ecc_oid_prime239v3_sz,
  946. ECC_PRIME239V3_OID, /* oid sum */
  947. 1, /* cofactor */
  948. },
  949. #endif /* HAVE_ECC_SECPR3 */
  950. #endif /* ECC239 */
  951. #ifdef ECC256
  952. #ifndef NO_ECC_SECP
  953. {
  954. 32, /* size/bytes */
  955. ECC_SECP256R1, /* ID */
  956. "SECP256R1", /* curve name */
  957. "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  958. "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", /* A */
  959. "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", /* B */
  960. "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", /* order */
  961. "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", /* Gx */
  962. "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", /* Gy */
  963. ecc_oid_secp256r1, /* oid/oidSz */
  964. ecc_oid_secp256r1_sz,
  965. ECC_SECP256R1_OID, /* oid sum */
  966. 1, /* cofactor */
  967. },
  968. #endif /* !NO_ECC_SECP */
  969. #ifdef HAVE_ECC_KOBLITZ
  970. {
  971. 32, /* size/bytes */
  972. ECC_SECP256K1, /* ID */
  973. "SECP256K1", /* curve name */
  974. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", /* prime */
  975. "0000000000000000000000000000000000000000000000000000000000000000", /* A */
  976. "0000000000000000000000000000000000000000000000000000000000000007", /* B */
  977. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", /* order */
  978. "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", /* Gx */
  979. "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", /* Gy */
  980. ecc_oid_secp256k1, /* oid/oidSz */
  981. ecc_oid_secp256k1_sz,
  982. ECC_SECP256K1_OID, /* oid sum */
  983. 1, /* cofactor */
  984. },
  985. #endif /* HAVE_ECC_KOBLITZ */
  986. #ifdef HAVE_ECC_BRAINPOOL
  987. {
  988. 32, /* size/bytes */
  989. ECC_BRAINPOOLP256R1, /* ID */
  990. "BRAINPOOLP256R1", /* curve name */
  991. "A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", /* prime */
  992. "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", /* A */
  993. "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", /* B */
  994. "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7", /* order */
  995. "8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262", /* Gx */
  996. "547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", /* Gy */
  997. ecc_oid_brainpoolp256r1, /* oid/oidSz */
  998. ecc_oid_brainpoolp256r1_sz,
  999. ECC_BRAINPOOLP256R1_OID, /* oid sum */
  1000. 1, /* cofactor */
  1001. },
  1002. #endif /* HAVE_ECC_BRAINPOOL */
  1003. #endif /* ECC256 */
  1004. #ifdef ECC320
  1005. #ifdef HAVE_ECC_BRAINPOOL
  1006. {
  1007. 40, /* size/bytes */
  1008. ECC_BRAINPOOLP320R1, /* ID */
  1009. "BRAINPOOLP320R1", /* curve name */
  1010. "D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27", /* prime */
  1011. "3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4", /* A */
  1012. "520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6", /* B */
  1013. "D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311", /* order */
  1014. "43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E20611", /* Gx */
  1015. "14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1", /* Gy */
  1016. ecc_oid_brainpoolp320r1, ecc_oid_brainpoolp320r1_sz, /* oid/oidSz */
  1017. ECC_BRAINPOOLP320R1_OID, /* oid sum */
  1018. 1, /* cofactor */
  1019. },
  1020. #endif /* HAVE_ECC_BRAINPOOL */
  1021. #endif /* ECC320 */
  1022. #ifdef ECC384
  1023. #ifndef NO_ECC_SECP
  1024. {
  1025. 48, /* size/bytes */
  1026. ECC_SECP384R1, /* ID */
  1027. "SECP384R1", /* curve name */
  1028. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", /* prime */
  1029. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", /* A */
  1030. "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", /* B */
  1031. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", /* order */
  1032. "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", /* Gx */
  1033. "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F", /* Gy */
  1034. ecc_oid_secp384r1, ecc_oid_secp384r1_sz, /* oid/oidSz */
  1035. ECC_SECP384R1_OID, /* oid sum */
  1036. 1, /* cofactor */
  1037. },
  1038. #endif /* !NO_ECC_SECP */
  1039. #ifdef HAVE_ECC_BRAINPOOL
  1040. {
  1041. 48, /* size/bytes */
  1042. ECC_BRAINPOOLP384R1, /* ID */
  1043. "BRAINPOOLP384R1", /* curve name */
  1044. "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53", /* prime */
  1045. "7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826", /* A */
  1046. "04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11", /* B */
  1047. "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565", /* order */
  1048. "1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E", /* Gx */
  1049. "8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315", /* Gy */
  1050. ecc_oid_brainpoolp384r1, ecc_oid_brainpoolp384r1_sz, /* oid/oidSz */
  1051. ECC_BRAINPOOLP384R1_OID, /* oid sum */
  1052. 1, /* cofactor */
  1053. },
  1054. #endif /* HAVE_ECC_BRAINPOOL */
  1055. #endif /* ECC384 */
  1056. #ifdef ECC512
  1057. #ifdef HAVE_ECC_BRAINPOOL
  1058. {
  1059. 64, /* size/bytes */
  1060. ECC_BRAINPOOLP512R1, /* ID */
  1061. "BRAINPOOLP512R1", /* curve name */
  1062. "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3", /* prime */
  1063. "7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA", /* A */
  1064. "3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723", /* B */
  1065. "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069", /* order */
  1066. "81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822", /* Gx */
  1067. "7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892", /* Gy */
  1068. ecc_oid_brainpoolp512r1, ecc_oid_brainpoolp512r1_sz, /* oid/oidSz */
  1069. ECC_BRAINPOOLP512R1_OID, /* oid sum */
  1070. 1, /* cofactor */
  1071. },
  1072. #endif /* HAVE_ECC_BRAINPOOL */
  1073. #endif /* ECC512 */
  1074. #ifdef ECC521
  1075. #ifndef NO_ECC_SECP
  1076. {
  1077. 66, /* size/bytes */
  1078. ECC_SECP521R1, /* ID */
  1079. "SECP521R1", /* curve name */
  1080. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  1081. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", /* A */
  1082. "51953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", /* B */
  1083. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", /* order */
  1084. "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", /* Gx */
  1085. "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650", /* Gy */
  1086. ecc_oid_secp521r1, ecc_oid_secp521r1_sz, /* oid/oidSz */
  1087. ECC_SECP521R1_OID, /* oid sum */
  1088. 1, /* cofactor */
  1089. },
  1090. #endif /* !NO_ECC_SECP */
  1091. #endif /* ECC521 */
  1092. #if defined(WOLFSSL_CUSTOM_CURVES) && defined(ECC_CACHE_CURVE)
  1093. /* place holder for custom curve index for cache */
  1094. {
  1095. 1, /* non-zero */
  1096. ECC_CURVE_CUSTOM,
  1097. #ifndef WOLFSSL_ECC_CURVE_STATIC
  1098. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  1099. #else
  1100. {0},{0},{0},{0},{0},{0},{0},{0},
  1101. #endif
  1102. 0, 0, 0
  1103. },
  1104. #endif
  1105. {
  1106. 0,
  1107. ECC_CURVE_INVALID,
  1108. #ifndef WOLFSSL_ECC_CURVE_STATIC
  1109. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  1110. #else
  1111. {0},{0},{0},{0},{0},{0},{0},{0},
  1112. #endif
  1113. 0, 0, 0
  1114. }
  1115. };
  1116. #define ECC_SET_COUNT (sizeof(ecc_sets)/sizeof(ecc_set_type))
  1117. const size_t ecc_sets_count = ECC_SET_COUNT - 1;
  1118. #ifdef HAVE_OID_ENCODING
  1119. /* encoded OID cache */
  1120. typedef struct {
  1121. word32 oidSz;
  1122. byte oid[ECC_MAX_OID_LEN];
  1123. } oid_cache_t;
  1124. static oid_cache_t ecc_oid_cache[ECC_SET_COUNT];
  1125. #endif
  1126. #ifdef HAVE_COMP_KEY
  1127. static int wc_ecc_export_x963_compressed(ecc_key*, byte* out, word32* outLen);
  1128. #endif
  1129. #if (defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || !defined(WOLFSSL_SP_MATH)) && \
  1130. !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A)
  1131. static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
  1132. mp_int* prime, mp_int* order);
  1133. #endif
  1134. int mp_jacobi(mp_int* a, mp_int* n, int* c);
  1135. int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret);
  1136. /* Curve Specs */
  1137. typedef struct ecc_curve_spec {
  1138. const ecc_set_type* dp;
  1139. mp_int* prime;
  1140. mp_int* Af;
  1141. #ifdef USE_ECC_B_PARAM
  1142. mp_int* Bf;
  1143. #endif
  1144. mp_int* order;
  1145. mp_int* Gx;
  1146. mp_int* Gy;
  1147. #ifdef ECC_CACHE_CURVE
  1148. mp_int prime_lcl;
  1149. mp_int Af_lcl;
  1150. #ifdef USE_ECC_B_PARAM
  1151. mp_int Bf_lcl;
  1152. #endif
  1153. mp_int order_lcl;
  1154. mp_int Gx_lcl;
  1155. mp_int Gy_lcl;
  1156. #else
  1157. mp_int* spec_ints;
  1158. word32 spec_count;
  1159. word32 spec_use;
  1160. #endif
  1161. byte load_mask;
  1162. } ecc_curve_spec;
  1163. enum ecc_curve_load_mask {
  1164. ECC_CURVE_FIELD_NONE = 0x00,
  1165. ECC_CURVE_FIELD_PRIME = 0x01,
  1166. ECC_CURVE_FIELD_AF = 0x02,
  1167. #ifdef USE_ECC_B_PARAM
  1168. ECC_CURVE_FIELD_BF = 0x04,
  1169. #endif
  1170. ECC_CURVE_FIELD_ORDER = 0x08,
  1171. ECC_CURVE_FIELD_GX = 0x10,
  1172. ECC_CURVE_FIELD_GY = 0x20,
  1173. #ifdef USE_ECC_B_PARAM
  1174. ECC_CURVE_FIELD_ALL = 0x3F,
  1175. ECC_CURVE_FIELD_COUNT = 6,
  1176. #else
  1177. ECC_CURVE_FIELD_ALL = 0x3B,
  1178. ECC_CURVE_FIELD_COUNT = 5,
  1179. #endif
  1180. };
  1181. #ifdef ECC_CACHE_CURVE
  1182. /* cache (mp_int) of the curve parameters */
  1183. static ecc_curve_spec* ecc_curve_spec_cache[ECC_SET_COUNT];
  1184. #ifndef SINGLE_THREADED
  1185. static wolfSSL_Mutex ecc_curve_cache_mutex;
  1186. #endif
  1187. #define DECLARE_CURVE_SPECS(curve, intcount) ecc_curve_spec* curve = NULL
  1188. #define ALLOC_CURVE_SPECS(intcount)
  1189. #define FREE_CURVE_SPECS()
  1190. #elif defined(WOLFSSL_SMALL_STACK)
  1191. #define DECLARE_CURVE_SPECS(curve, intcount) \
  1192. mp_int* spec_ints = NULL; \
  1193. ecc_curve_spec curve_lcl; \
  1194. ecc_curve_spec* curve = &curve_lcl; \
  1195. XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \
  1196. curve->spec_count = intcount
  1197. #define ALLOC_CURVE_SPECS(intcount) \
  1198. spec_ints = (mp_int*)XMALLOC(sizeof(mp_int) * (intcount), NULL, \
  1199. DYNAMIC_TYPE_ECC); \
  1200. if (spec_ints == NULL) \
  1201. return MEMORY_E; \
  1202. curve->spec_ints = spec_ints
  1203. #define FREE_CURVE_SPECS() \
  1204. XFREE(spec_ints, NULL, DYNAMIC_TYPE_ECC)
  1205. #else
  1206. #define DECLARE_CURVE_SPECS(curve, intcount) \
  1207. mp_int spec_ints[(intcount)]; \
  1208. ecc_curve_spec curve_lcl; \
  1209. ecc_curve_spec* curve = &curve_lcl; \
  1210. XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \
  1211. curve->spec_ints = spec_ints; \
  1212. curve->spec_count = intcount
  1213. #define ALLOC_CURVE_SPECS(intcount)
  1214. #define FREE_CURVE_SPECS()
  1215. #endif /* ECC_CACHE_CURVE */
  1216. static void _wc_ecc_curve_free(ecc_curve_spec* curve)
  1217. {
  1218. if (curve == NULL) {
  1219. return;
  1220. }
  1221. if (curve->load_mask & ECC_CURVE_FIELD_PRIME)
  1222. mp_clear(curve->prime);
  1223. if (curve->load_mask & ECC_CURVE_FIELD_AF)
  1224. mp_clear(curve->Af);
  1225. #ifdef USE_ECC_B_PARAM
  1226. if (curve->load_mask & ECC_CURVE_FIELD_BF)
  1227. mp_clear(curve->Bf);
  1228. #endif
  1229. if (curve->load_mask & ECC_CURVE_FIELD_ORDER)
  1230. mp_clear(curve->order);
  1231. if (curve->load_mask & ECC_CURVE_FIELD_GX)
  1232. mp_clear(curve->Gx);
  1233. if (curve->load_mask & ECC_CURVE_FIELD_GY)
  1234. mp_clear(curve->Gy);
  1235. curve->load_mask = 0;
  1236. }
  1237. static void wc_ecc_curve_free(ecc_curve_spec* curve)
  1238. {
  1239. /* don't free cached curves */
  1240. #ifndef ECC_CACHE_CURVE
  1241. _wc_ecc_curve_free(curve);
  1242. #endif
  1243. (void)curve;
  1244. }
  1245. static int wc_ecc_curve_load_item(const char* src, mp_int** dst,
  1246. ecc_curve_spec* curve, byte mask)
  1247. {
  1248. int err;
  1249. #ifndef ECC_CACHE_CURVE
  1250. /* get mp_int from temp */
  1251. if (curve->spec_use >= curve->spec_count) {
  1252. WOLFSSL_MSG("Invalid DECLARE_CURVE_SPECS count");
  1253. return ECC_BAD_ARG_E;
  1254. }
  1255. *dst = &curve->spec_ints[curve->spec_use++];
  1256. #endif
  1257. err = mp_init(*dst);
  1258. if (err == MP_OKAY) {
  1259. curve->load_mask |= mask;
  1260. err = mp_read_radix(*dst, src, MP_RADIX_HEX);
  1261. #ifdef HAVE_WOLF_BIGINT
  1262. if (err == MP_OKAY)
  1263. err = wc_mp_to_bigint(*dst, &(*dst)->raw);
  1264. #endif
  1265. }
  1266. return err;
  1267. }
  1268. static int wc_ecc_curve_load(const ecc_set_type* dp, ecc_curve_spec** pCurve,
  1269. byte load_mask)
  1270. {
  1271. int ret = 0, x;
  1272. ecc_curve_spec* curve;
  1273. byte load_items = 0; /* mask of items to load */
  1274. if (dp == NULL || pCurve == NULL)
  1275. return BAD_FUNC_ARG;
  1276. #ifdef ECC_CACHE_CURVE
  1277. x = wc_ecc_get_curve_idx(dp->id);
  1278. if (x == ECC_CURVE_INVALID)
  1279. return ECC_BAD_ARG_E;
  1280. #if !defined(SINGLE_THREADED)
  1281. ret = wc_LockMutex(&ecc_curve_cache_mutex);
  1282. if (ret != 0) {
  1283. return ret;
  1284. }
  1285. #endif
  1286. /* make sure cache has been allocated */
  1287. if (ecc_curve_spec_cache[x] == NULL) {
  1288. ecc_curve_spec_cache[x] = (ecc_curve_spec*)XMALLOC(
  1289. sizeof(ecc_curve_spec), NULL, DYNAMIC_TYPE_ECC);
  1290. if (ecc_curve_spec_cache[x] == NULL) {
  1291. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1292. wc_UnLockMutex(&ecc_curve_cache_mutex);
  1293. #endif
  1294. return MEMORY_E;
  1295. }
  1296. XMEMSET(ecc_curve_spec_cache[x], 0, sizeof(ecc_curve_spec));
  1297. }
  1298. /* set curve pointer to cache */
  1299. *pCurve = ecc_curve_spec_cache[x];
  1300. #endif /* ECC_CACHE_CURVE */
  1301. curve = *pCurve;
  1302. /* make sure the curve is initialized */
  1303. if (curve->dp != dp) {
  1304. curve->load_mask = 0;
  1305. #ifdef ECC_CACHE_CURVE
  1306. curve->prime = &curve->prime_lcl;
  1307. curve->Af = &curve->Af_lcl;
  1308. #ifdef USE_ECC_B_PARAM
  1309. curve->Bf = &curve->Bf_lcl;
  1310. #endif
  1311. curve->order = &curve->order_lcl;
  1312. curve->Gx = &curve->Gx_lcl;
  1313. curve->Gy = &curve->Gy_lcl;
  1314. #endif
  1315. }
  1316. curve->dp = dp; /* set dp info */
  1317. /* determine items to load */
  1318. load_items = (((byte)~(word32)curve->load_mask) & load_mask);
  1319. curve->load_mask |= load_items;
  1320. /* load items */
  1321. x = 0;
  1322. if (load_items & ECC_CURVE_FIELD_PRIME)
  1323. x += wc_ecc_curve_load_item(dp->prime, &curve->prime, curve,
  1324. ECC_CURVE_FIELD_PRIME);
  1325. if (load_items & ECC_CURVE_FIELD_AF)
  1326. x += wc_ecc_curve_load_item(dp->Af, &curve->Af, curve,
  1327. ECC_CURVE_FIELD_AF);
  1328. #ifdef USE_ECC_B_PARAM
  1329. if (load_items & ECC_CURVE_FIELD_BF)
  1330. x += wc_ecc_curve_load_item(dp->Bf, &curve->Bf, curve,
  1331. ECC_CURVE_FIELD_BF);
  1332. #endif
  1333. if (load_items & ECC_CURVE_FIELD_ORDER)
  1334. x += wc_ecc_curve_load_item(dp->order, &curve->order, curve,
  1335. ECC_CURVE_FIELD_ORDER);
  1336. if (load_items & ECC_CURVE_FIELD_GX)
  1337. x += wc_ecc_curve_load_item(dp->Gx, &curve->Gx, curve,
  1338. ECC_CURVE_FIELD_GX);
  1339. if (load_items & ECC_CURVE_FIELD_GY)
  1340. x += wc_ecc_curve_load_item(dp->Gy, &curve->Gy, curve,
  1341. ECC_CURVE_FIELD_GY);
  1342. /* check for error */
  1343. if (x != 0) {
  1344. wc_ecc_curve_free(curve);
  1345. ret = MP_READ_E;
  1346. }
  1347. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1348. wc_UnLockMutex(&ecc_curve_cache_mutex);
  1349. #endif
  1350. return ret;
  1351. }
  1352. #ifdef ECC_CACHE_CURVE
  1353. int wc_ecc_curve_cache_init(void)
  1354. {
  1355. int ret = 0;
  1356. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1357. ret = wc_InitMutex(&ecc_curve_cache_mutex);
  1358. #endif
  1359. return ret;
  1360. }
  1361. void wc_ecc_curve_cache_free(void)
  1362. {
  1363. int x;
  1364. /* free all ECC curve caches */
  1365. for (x = 0; x < (int)ECC_SET_COUNT; x++) {
  1366. if (ecc_curve_spec_cache[x]) {
  1367. _wc_ecc_curve_free(ecc_curve_spec_cache[x]);
  1368. XFREE(ecc_curve_spec_cache[x], NULL, DYNAMIC_TYPE_ECC);
  1369. ecc_curve_spec_cache[x] = NULL;
  1370. }
  1371. }
  1372. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1373. wc_FreeMutex(&ecc_curve_cache_mutex);
  1374. #endif
  1375. }
  1376. #endif /* ECC_CACHE_CURVE */
  1377. /* Retrieve the curve name for the ECC curve id.
  1378. *
  1379. * curve_id The id of the curve.
  1380. * returns the name stored from the curve if available, otherwise NULL.
  1381. */
  1382. const char* wc_ecc_get_name(int curve_id)
  1383. {
  1384. int curve_idx = wc_ecc_get_curve_idx(curve_id);
  1385. if (curve_idx == ECC_CURVE_INVALID)
  1386. return NULL;
  1387. return ecc_sets[curve_idx].name;
  1388. }
  1389. int wc_ecc_set_curve(ecc_key* key, int keysize, int curve_id)
  1390. {
  1391. if (keysize <= 0 && curve_id < 0) {
  1392. return BAD_FUNC_ARG;
  1393. }
  1394. if (keysize > ECC_MAXSIZE) {
  1395. return ECC_BAD_ARG_E;
  1396. }
  1397. /* handle custom case */
  1398. if (key->idx != ECC_CUSTOM_IDX) {
  1399. int x;
  1400. /* default values */
  1401. key->idx = 0;
  1402. key->dp = NULL;
  1403. /* find ecc_set based on curve_id or key size */
  1404. for (x = 0; ecc_sets[x].size != 0; x++) {
  1405. if (curve_id > ECC_CURVE_DEF) {
  1406. if (curve_id == ecc_sets[x].id)
  1407. break;
  1408. }
  1409. else if (keysize <= ecc_sets[x].size) {
  1410. break;
  1411. }
  1412. }
  1413. if (ecc_sets[x].size == 0) {
  1414. WOLFSSL_MSG("ECC Curve not found");
  1415. return ECC_CURVE_OID_E;
  1416. }
  1417. key->idx = x;
  1418. key->dp = &ecc_sets[x];
  1419. }
  1420. return 0;
  1421. }
  1422. #ifdef ALT_ECC_SIZE
  1423. static void alt_fp_init(mp_int* a)
  1424. {
  1425. a->size = FP_SIZE_ECC;
  1426. mp_zero(a);
  1427. }
  1428. #endif /* ALT_ECC_SIZE */
  1429. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A)
  1430. #if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_PUBLIC_ECC_ADD_DBL)
  1431. /**
  1432. Add two ECC points
  1433. P The point to add
  1434. Q The point to add
  1435. R [out] The destination of the double
  1436. a ECC curve parameter a
  1437. modulus The modulus of the field the ECC curve is in
  1438. mp The "b" value from montgomery_setup()
  1439. return MP_OKAY on success
  1440. */
  1441. int ecc_projective_add_point(ecc_point* P, ecc_point* Q, ecc_point* R,
  1442. mp_int* a, mp_int* modulus, mp_digit mp)
  1443. {
  1444. #ifndef WOLFSSL_SP_MATH
  1445. #ifdef WOLFSSL_SMALL_STACK
  1446. mp_int* t1 = NULL;
  1447. mp_int* t2 = NULL;
  1448. #ifdef ALT_ECC_SIZE
  1449. mp_int* rx = NULL;
  1450. mp_int* ry = NULL;
  1451. mp_int* rz = NULL;
  1452. #endif
  1453. #else
  1454. mp_int t1[1], t2[1];
  1455. #ifdef ALT_ECC_SIZE
  1456. mp_int rx[1], ry[1], rz[1];
  1457. #endif
  1458. #endif
  1459. mp_int *x, *y, *z;
  1460. int err;
  1461. if (P == NULL || Q == NULL || R == NULL || modulus == NULL) {
  1462. return ECC_BAD_ARG_E;
  1463. }
  1464. /* if Q == R then swap P and Q, so we don't require a local x,y,z */
  1465. if (Q == R) {
  1466. ecc_point* tPt = P;
  1467. P = Q;
  1468. Q = tPt;
  1469. }
  1470. #ifdef WOLFSSL_SMALL_STACK
  1471. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1472. if (R->key != NULL) {
  1473. t1 = R->key->t1;
  1474. t2 = R->key->t2;
  1475. #ifdef ALT_ECC_SIZE
  1476. rx = R->key->x;
  1477. ry = R->key->y;
  1478. rz = R->key->z;
  1479. #endif
  1480. }
  1481. else
  1482. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  1483. {
  1484. t1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  1485. t2 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  1486. if (t1 == NULL || t2 == NULL) {
  1487. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  1488. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  1489. return MEMORY_E;
  1490. }
  1491. #ifdef ALT_ECC_SIZE
  1492. rx = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  1493. ry = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  1494. rz = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  1495. if (rx == NULL || ry == NULL || rz == NULL) {
  1496. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  1497. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  1498. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  1499. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  1500. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  1501. return MEMORY_E;
  1502. }
  1503. #endif
  1504. }
  1505. #endif /* WOLFSSL_SMALL_STACK */
  1506. if ((err = mp_init_multi(t1, t2, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  1507. #ifdef WOLFSSL_SMALL_STACK
  1508. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1509. if (R->key == NULL)
  1510. #endif
  1511. {
  1512. #ifdef ALT_ECC_SIZE
  1513. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  1514. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  1515. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  1516. #endif
  1517. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  1518. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  1519. }
  1520. #endif
  1521. return err;
  1522. }
  1523. /* should we dbl instead? */
  1524. if (err == MP_OKAY) {
  1525. #ifdef ECC_TIMING_RESISTANT
  1526. err = mp_submod_ct(modulus, Q->y, modulus, t1);
  1527. #else
  1528. err = mp_sub(modulus, Q->y, t1);
  1529. #endif
  1530. }
  1531. if (err == MP_OKAY) {
  1532. if ( (mp_cmp(P->x, Q->x) == MP_EQ) &&
  1533. (get_digit_count(Q->z) && mp_cmp(P->z, Q->z) == MP_EQ) &&
  1534. (mp_cmp(P->y, Q->y) == MP_EQ || mp_cmp(P->y, t1) == MP_EQ)) {
  1535. mp_clear(t1);
  1536. mp_clear(t2);
  1537. #ifdef WOLFSSL_SMALL_STACK
  1538. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1539. if (R->key == NULL)
  1540. #endif
  1541. {
  1542. #ifdef ALT_ECC_SIZE
  1543. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  1544. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  1545. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  1546. #endif
  1547. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  1548. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  1549. }
  1550. #endif
  1551. return ecc_projective_dbl_point(P, R, a, modulus, mp);
  1552. }
  1553. }
  1554. if (err != MP_OKAY) {
  1555. goto done;
  1556. }
  1557. /* If use ALT_ECC_SIZE we need to use local stack variable since
  1558. ecc_point x,y,z is reduced size */
  1559. #ifdef ALT_ECC_SIZE
  1560. /* Use local stack variable */
  1561. x = rx;
  1562. y = ry;
  1563. z = rz;
  1564. if ((err = mp_init_multi(x, y, z, NULL, NULL, NULL)) != MP_OKAY) {
  1565. goto done;
  1566. }
  1567. #else
  1568. /* Use destination directly */
  1569. x = R->x;
  1570. y = R->y;
  1571. z = R->z;
  1572. #endif
  1573. if (err == MP_OKAY)
  1574. err = mp_copy(P->x, x);
  1575. if (err == MP_OKAY)
  1576. err = mp_copy(P->y, y);
  1577. if (err == MP_OKAY)
  1578. err = mp_copy(P->z, z);
  1579. /* if Z is one then these are no-operations */
  1580. if (err == MP_OKAY) {
  1581. if (!mp_iszero(Q->z)) {
  1582. /* T1 = Z' * Z' */
  1583. err = mp_sqr(Q->z, t1);
  1584. if (err == MP_OKAY)
  1585. err = mp_montgomery_reduce(t1, modulus, mp);
  1586. /* X = X * T1 */
  1587. if (err == MP_OKAY)
  1588. err = mp_mul(t1, x, x);
  1589. if (err == MP_OKAY)
  1590. err = mp_montgomery_reduce(x, modulus, mp);
  1591. /* T1 = Z' * T1 */
  1592. if (err == MP_OKAY)
  1593. err = mp_mul(Q->z, t1, t1);
  1594. if (err == MP_OKAY)
  1595. err = mp_montgomery_reduce(t1, modulus, mp);
  1596. /* Y = Y * T1 */
  1597. if (err == MP_OKAY)
  1598. err = mp_mul(t1, y, y);
  1599. if (err == MP_OKAY)
  1600. err = mp_montgomery_reduce(y, modulus, mp);
  1601. }
  1602. }
  1603. /* T1 = Z*Z */
  1604. if (err == MP_OKAY)
  1605. err = mp_sqr(z, t1);
  1606. if (err == MP_OKAY)
  1607. err = mp_montgomery_reduce(t1, modulus, mp);
  1608. /* T2 = X' * T1 */
  1609. if (err == MP_OKAY)
  1610. err = mp_mul(Q->x, t1, t2);
  1611. if (err == MP_OKAY)
  1612. err = mp_montgomery_reduce(t2, modulus, mp);
  1613. /* T1 = Z * T1 */
  1614. if (err == MP_OKAY)
  1615. err = mp_mul(z, t1, t1);
  1616. if (err == MP_OKAY)
  1617. err = mp_montgomery_reduce(t1, modulus, mp);
  1618. /* T1 = Y' * T1 */
  1619. if (err == MP_OKAY)
  1620. err = mp_mul(Q->y, t1, t1);
  1621. if (err == MP_OKAY)
  1622. err = mp_montgomery_reduce(t1, modulus, mp);
  1623. /* Y = Y - T1 */
  1624. if (err == MP_OKAY)
  1625. err = mp_submod_ct(y, t1, modulus, y);
  1626. /* T1 = 2T1 */
  1627. if (err == MP_OKAY)
  1628. err = mp_addmod_ct(t1, t1, modulus, t1);
  1629. /* T1 = Y + T1 */
  1630. if (err == MP_OKAY)
  1631. err = mp_addmod_ct(t1, y, modulus, t1);
  1632. /* X = X - T2 */
  1633. if (err == MP_OKAY)
  1634. err = mp_submod_ct(x, t2, modulus, x);
  1635. /* T2 = 2T2 */
  1636. if (err == MP_OKAY)
  1637. err = mp_addmod_ct(t2, t2, modulus, t2);
  1638. /* T2 = X + T2 */
  1639. if (err == MP_OKAY)
  1640. err = mp_addmod_ct(t2, x, modulus, t2);
  1641. if (err == MP_OKAY) {
  1642. if (!mp_iszero(Q->z)) {
  1643. /* Z = Z * Z' */
  1644. err = mp_mul(z, Q->z, z);
  1645. if (err == MP_OKAY)
  1646. err = mp_montgomery_reduce(z, modulus, mp);
  1647. }
  1648. }
  1649. /* Z = Z * X */
  1650. if (err == MP_OKAY)
  1651. err = mp_mul(z, x, z);
  1652. if (err == MP_OKAY)
  1653. err = mp_montgomery_reduce(z, modulus, mp);
  1654. /* T1 = T1 * X */
  1655. if (err == MP_OKAY)
  1656. err = mp_mul(t1, x, t1);
  1657. if (err == MP_OKAY)
  1658. err = mp_montgomery_reduce(t1, modulus, mp);
  1659. /* X = X * X */
  1660. if (err == MP_OKAY)
  1661. err = mp_sqr(x, x);
  1662. if (err == MP_OKAY)
  1663. err = mp_montgomery_reduce(x, modulus, mp);
  1664. /* T2 = T2 * x */
  1665. if (err == MP_OKAY)
  1666. err = mp_mul(t2, x, t2);
  1667. if (err == MP_OKAY)
  1668. err = mp_montgomery_reduce(t2, modulus, mp);
  1669. /* T1 = T1 * X */
  1670. if (err == MP_OKAY)
  1671. err = mp_mul(t1, x, t1);
  1672. if (err == MP_OKAY)
  1673. err = mp_montgomery_reduce(t1, modulus, mp);
  1674. /* X = Y*Y */
  1675. if (err == MP_OKAY)
  1676. err = mp_sqr(y, x);
  1677. if (err == MP_OKAY)
  1678. err = mp_montgomery_reduce(x, modulus, mp);
  1679. /* X = X - T2 */
  1680. if (err == MP_OKAY)
  1681. err = mp_submod_ct(x, t2, modulus, x);
  1682. /* T2 = T2 - X */
  1683. if (err == MP_OKAY)
  1684. err = mp_submod_ct(t2, x, modulus, t2);
  1685. /* T2 = T2 - X */
  1686. if (err == MP_OKAY)
  1687. err = mp_submod_ct(t2, x, modulus, t2);
  1688. /* T2 = T2 * Y */
  1689. if (err == MP_OKAY)
  1690. err = mp_mul(t2, y, t2);
  1691. if (err == MP_OKAY)
  1692. err = mp_montgomery_reduce(t2, modulus, mp);
  1693. /* Y = T2 - T1 */
  1694. if (err == MP_OKAY)
  1695. err = mp_submod_ct(t2, t1, modulus, y);
  1696. /* Y = Y/2 */
  1697. if (err == MP_OKAY)
  1698. err = mp_div_2_mod_ct(y, modulus, y);
  1699. #ifdef ALT_ECC_SIZE
  1700. if (err == MP_OKAY)
  1701. err = mp_copy(x, R->x);
  1702. if (err == MP_OKAY)
  1703. err = mp_copy(y, R->y);
  1704. if (err == MP_OKAY)
  1705. err = mp_copy(z, R->z);
  1706. #endif
  1707. done:
  1708. /* clean up */
  1709. mp_clear(t1);
  1710. mp_clear(t2);
  1711. #ifdef WOLFSSL_SMALL_STACK
  1712. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1713. if (R->key == NULL)
  1714. #endif
  1715. {
  1716. #ifdef ALT_ECC_SIZE
  1717. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  1718. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  1719. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  1720. #endif
  1721. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  1722. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  1723. }
  1724. #endif
  1725. return err;
  1726. #else
  1727. if (P == NULL || Q == NULL || R == NULL || modulus == NULL) {
  1728. return ECC_BAD_ARG_E;
  1729. }
  1730. (void)a;
  1731. (void)mp;
  1732. #ifndef WOLFSSL_SP_NO_256
  1733. if (mp_count_bits(modulus) == 256) {
  1734. return sp_ecc_proj_add_point_256(P->x, P->y, P->z, Q->x, Q->y, Q->z,
  1735. R->x, R->y, R->z);
  1736. }
  1737. #endif
  1738. #ifdef WOLFSSL_SP_384
  1739. if (mp_count_bits(modulus) == 384) {
  1740. return sp_ecc_proj_add_point_384(P->x, P->y, P->z, Q->x, Q->y, Q->z,
  1741. R->x, R->y, R->z);
  1742. }
  1743. #endif
  1744. return ECC_BAD_ARG_E;
  1745. #endif
  1746. }
  1747. /* ### Point doubling in Jacobian coordinate system ###
  1748. *
  1749. * let us have a curve: y^2 = x^3 + a*x + b
  1750. * in Jacobian coordinates it becomes: y^2 = x^3 + a*x*z^4 + b*z^6
  1751. *
  1752. * The doubling of P = (Xp, Yp, Zp) is given by R = (Xr, Yr, Zr) where:
  1753. * Xr = M^2 - 2*S
  1754. * Yr = M * (S - Xr) - 8*T
  1755. * Zr = 2 * Yp * Zp
  1756. *
  1757. * M = 3 * Xp^2 + a*Zp^4
  1758. * T = Yp^4
  1759. * S = 4 * Xp * Yp^2
  1760. *
  1761. * SPECIAL CASE: when a == 3 we can compute M as
  1762. * M = 3 * (Xp^2 - Zp^4) = 3 * (Xp + Zp^2) * (Xp - Zp^2)
  1763. */
  1764. /**
  1765. Double an ECC point
  1766. P The point to double
  1767. R [out] The destination of the double
  1768. a ECC curve parameter a
  1769. modulus The modulus of the field the ECC curve is in
  1770. mp The "b" value from montgomery_setup()
  1771. return MP_OKAY on success
  1772. */
  1773. int ecc_projective_dbl_point(ecc_point *P, ecc_point *R, mp_int* a,
  1774. mp_int* modulus, mp_digit mp)
  1775. {
  1776. #ifndef WOLFSSL_SP_MATH
  1777. #ifdef WOLFSSL_SMALL_STACK
  1778. mp_int* t1 = NULL;
  1779. mp_int* t2 = NULL;
  1780. #ifdef ALT_ECC_SIZE
  1781. mp_int* rx = NULL;
  1782. mp_int* ry = NULL;
  1783. mp_int* rz = NULL;
  1784. #endif
  1785. #else
  1786. mp_int t1[1], t2[1];
  1787. #ifdef ALT_ECC_SIZE
  1788. mp_int rx[1], ry[1], rz[1];
  1789. #endif
  1790. #endif
  1791. mp_int *x, *y, *z;
  1792. int err;
  1793. if (P == NULL || R == NULL || modulus == NULL)
  1794. return ECC_BAD_ARG_E;
  1795. #ifdef WOLFSSL_SMALL_STACK
  1796. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1797. if (R->key != NULL) {
  1798. t1 = R->key->t1;
  1799. t2 = R->key->t2;
  1800. #ifdef ALT_ECC_SIZE
  1801. rx = R->key->x;
  1802. ry = R->key->y;
  1803. rz = R->key->z;
  1804. #endif
  1805. }
  1806. else
  1807. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  1808. {
  1809. t1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  1810. t2 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  1811. if (t1 == NULL || t2 == NULL) {
  1812. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  1813. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  1814. return MEMORY_E;
  1815. }
  1816. #ifdef ALT_ECC_SIZE
  1817. rx = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  1818. ry = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  1819. rz = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  1820. if (rx == NULL || ry == NULL || rz == NULL) {
  1821. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  1822. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  1823. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  1824. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  1825. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  1826. return MEMORY_E;
  1827. }
  1828. #endif
  1829. }
  1830. #endif
  1831. if ((err = mp_init_multi(t1, t2, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  1832. #ifdef WOLFSSL_SMALL_STACK
  1833. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1834. if (R->key == NULL)
  1835. #endif
  1836. {
  1837. #ifdef ALT_ECC_SIZE
  1838. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  1839. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  1840. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  1841. #endif
  1842. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  1843. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  1844. }
  1845. #endif
  1846. return err;
  1847. }
  1848. /* If use ALT_ECC_SIZE we need to use local stack variable since
  1849. ecc_point x,y,z is reduced size */
  1850. #ifdef ALT_ECC_SIZE
  1851. /* Use local stack variable */
  1852. x = rx;
  1853. y = ry;
  1854. z = rz;
  1855. if ((err = mp_init_multi(x, y, z, NULL, NULL, NULL)) != MP_OKAY) {
  1856. mp_clear(t1);
  1857. mp_clear(t2);
  1858. #ifdef WOLFSSL_SMALL_STACK
  1859. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1860. if (R->key == NULL)
  1861. #endif
  1862. {
  1863. #ifdef ALT_ECC_SIZE
  1864. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  1865. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  1866. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  1867. #endif
  1868. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  1869. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  1870. }
  1871. #endif
  1872. return err;
  1873. }
  1874. #else
  1875. /* Use destination directly */
  1876. x = R->x;
  1877. y = R->y;
  1878. z = R->z;
  1879. #endif
  1880. if (err == MP_OKAY)
  1881. err = mp_copy(P->x, x);
  1882. if (err == MP_OKAY)
  1883. err = mp_copy(P->y, y);
  1884. if (err == MP_OKAY)
  1885. err = mp_copy(P->z, z);
  1886. /* T1 = Z * Z */
  1887. if (err == MP_OKAY)
  1888. err = mp_sqr(z, t1);
  1889. if (err == MP_OKAY)
  1890. err = mp_montgomery_reduce(t1, modulus, mp);
  1891. /* Z = Y * Z */
  1892. if (err == MP_OKAY)
  1893. err = mp_mul(z, y, z);
  1894. if (err == MP_OKAY)
  1895. err = mp_montgomery_reduce(z, modulus, mp);
  1896. /* Z = 2Z */
  1897. if (err == MP_OKAY)
  1898. err = mp_addmod_ct(z, z, modulus, z);
  1899. /* Determine if curve "a" should be used in calc */
  1900. #ifdef WOLFSSL_CUSTOM_CURVES
  1901. if (err == MP_OKAY) {
  1902. /* Use a and prime to determine if a == 3 */
  1903. err = mp_submod(modulus, a, modulus, t2);
  1904. }
  1905. if (err == MP_OKAY && mp_cmp_d(t2, 3) != MP_EQ) {
  1906. /* use "a" in calc */
  1907. /* T2 = T1 * T1 */
  1908. if (err == MP_OKAY)
  1909. err = mp_sqr(t1, t2);
  1910. if (err == MP_OKAY)
  1911. err = mp_montgomery_reduce(t2, modulus, mp);
  1912. /* T1 = T2 * a */
  1913. if (err == MP_OKAY)
  1914. err = mp_mulmod(t2, a, modulus, t1);
  1915. /* T2 = X * X */
  1916. if (err == MP_OKAY)
  1917. err = mp_sqr(x, t2);
  1918. if (err == MP_OKAY)
  1919. err = mp_montgomery_reduce(t2, modulus, mp);
  1920. /* T1 = T2 + T1 */
  1921. if (err == MP_OKAY)
  1922. err = mp_addmod_ct(t1, t2, modulus, t1);
  1923. /* T1 = T2 + T1 */
  1924. if (err == MP_OKAY)
  1925. err = mp_addmod_ct(t1, t2, modulus, t1);
  1926. /* T1 = T2 + T1 */
  1927. if (err == MP_OKAY)
  1928. err = mp_addmod_ct(t1, t2, modulus, t1);
  1929. }
  1930. else
  1931. #endif /* WOLFSSL_CUSTOM_CURVES */
  1932. {
  1933. /* assumes "a" == 3 */
  1934. (void)a;
  1935. /* T2 = X - T1 */
  1936. if (err == MP_OKAY)
  1937. err = mp_submod_ct(x, t1, modulus, t2);
  1938. /* T1 = X + T1 */
  1939. if (err == MP_OKAY)
  1940. err = mp_addmod_ct(t1, x, modulus, t1);
  1941. /* T2 = T1 * T2 */
  1942. if (err == MP_OKAY)
  1943. err = mp_mul(t1, t2, t2);
  1944. if (err == MP_OKAY)
  1945. err = mp_montgomery_reduce(t2, modulus, mp);
  1946. /* T1 = 2T2 */
  1947. if (err == MP_OKAY)
  1948. err = mp_addmod_ct(t2, t2, modulus, t1);
  1949. /* T1 = T1 + T2 */
  1950. if (err == MP_OKAY)
  1951. err = mp_addmod_ct(t1, t2, modulus, t1);
  1952. }
  1953. /* Y = 2Y */
  1954. if (err == MP_OKAY)
  1955. err = mp_addmod_ct(y, y, modulus, y);
  1956. /* Y = Y * Y */
  1957. if (err == MP_OKAY)
  1958. err = mp_sqr(y, y);
  1959. if (err == MP_OKAY)
  1960. err = mp_montgomery_reduce(y, modulus, mp);
  1961. /* T2 = Y * Y */
  1962. if (err == MP_OKAY)
  1963. err = mp_sqr(y, t2);
  1964. if (err == MP_OKAY)
  1965. err = mp_montgomery_reduce(t2, modulus, mp);
  1966. /* T2 = T2/2 */
  1967. if (err == MP_OKAY)
  1968. err = mp_div_2_mod_ct(t2, modulus, t2);
  1969. /* Y = Y * X */
  1970. if (err == MP_OKAY)
  1971. err = mp_mul(y, x, y);
  1972. if (err == MP_OKAY)
  1973. err = mp_montgomery_reduce(y, modulus, mp);
  1974. /* X = T1 * T1 */
  1975. if (err == MP_OKAY)
  1976. err = mp_sqr(t1, x);
  1977. if (err == MP_OKAY)
  1978. err = mp_montgomery_reduce(x, modulus, mp);
  1979. /* X = X - Y */
  1980. if (err == MP_OKAY)
  1981. err = mp_submod_ct(x, y, modulus, x);
  1982. /* X = X - Y */
  1983. if (err == MP_OKAY)
  1984. err = mp_submod_ct(x, y, modulus, x);
  1985. /* Y = Y - X */
  1986. if (err == MP_OKAY)
  1987. err = mp_submod_ct(y, x, modulus, y);
  1988. /* Y = Y * T1 */
  1989. if (err == MP_OKAY)
  1990. err = mp_mul(y, t1, y);
  1991. if (err == MP_OKAY)
  1992. err = mp_montgomery_reduce(y, modulus, mp);
  1993. /* Y = Y - T2 */
  1994. if (err == MP_OKAY)
  1995. err = mp_submod_ct(y, t2, 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. /* clean up */
  2005. mp_clear(t1);
  2006. mp_clear(t2);
  2007. #ifdef WOLFSSL_SMALL_STACK
  2008. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2009. if (R->key == NULL)
  2010. #endif
  2011. {
  2012. #ifdef ALT_ECC_SIZE
  2013. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  2014. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  2015. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  2016. #endif
  2017. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  2018. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  2019. }
  2020. #endif
  2021. return err;
  2022. #else
  2023. if (P == NULL || R == NULL || modulus == NULL)
  2024. return ECC_BAD_ARG_E;
  2025. (void)a;
  2026. (void)mp;
  2027. #ifndef WOLFSSL_SP_NO_256
  2028. if (mp_count_bits(modulus) == 256) {
  2029. return sp_ecc_proj_dbl_point_256(P->x, P->y, P->z, R->x, R->y, R->z);
  2030. }
  2031. #endif
  2032. #ifdef WOLFSSL_SP_384
  2033. if (mp_count_bits(modulus) == 384) {
  2034. return sp_ecc_proj_dbl_point_384(P->x, P->y, P->z, R->x, R->y, R->z);
  2035. }
  2036. #endif
  2037. return ECC_BAD_ARG_E;
  2038. #endif
  2039. }
  2040. /**
  2041. Map a projective Jacobian point back to affine space
  2042. P [in/out] The point to map
  2043. modulus The modulus of the field the ECC curve is in
  2044. mp The "b" value from montgomery_setup()
  2045. ct Operation should be constant time.
  2046. return MP_OKAY on success
  2047. */
  2048. int ecc_map_ex(ecc_point* P, mp_int* modulus, mp_digit mp, int ct)
  2049. {
  2050. #ifndef WOLFSSL_SP_MATH
  2051. #ifdef WOLFSSL_SMALL_STACK
  2052. mp_int* t1 = NULL;
  2053. mp_int* t2 = NULL;
  2054. #ifdef ALT_ECC_SIZE
  2055. mp_int* rx = NULL;
  2056. mp_int* ry = NULL;
  2057. mp_int* rz = NULL;
  2058. #endif
  2059. #else
  2060. mp_int t1[1], t2[1];
  2061. #ifdef ALT_ECC_SIZE
  2062. mp_int rx[1], ry[1], rz[1];
  2063. #endif
  2064. #endif /* WOLFSSL_SMALL_STACK */
  2065. mp_int *x, *y, *z;
  2066. int err;
  2067. (void)ct;
  2068. if (P == NULL || modulus == NULL)
  2069. return ECC_BAD_ARG_E;
  2070. /* special case for point at infinity */
  2071. if (mp_cmp_d(P->z, 0) == MP_EQ) {
  2072. err = mp_set(P->x, 0);
  2073. if (err == MP_OKAY)
  2074. err = mp_set(P->y, 0);
  2075. if (err == MP_OKAY)
  2076. err = mp_set(P->z, 1);
  2077. return err;
  2078. }
  2079. #ifdef WOLFSSL_SMALL_STACK
  2080. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2081. if (P->key != NULL) {
  2082. t1 = P->key->t1;
  2083. t2 = P->key->t2;
  2084. #ifdef ALT_ECC_SIZE
  2085. rx = P->key->x;
  2086. ry = P->key->y;
  2087. rz = P->key->z;
  2088. #endif
  2089. }
  2090. else
  2091. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  2092. {
  2093. t1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  2094. t2 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  2095. if (t1 == NULL || t2 == NULL) {
  2096. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  2097. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  2098. return MEMORY_E;
  2099. }
  2100. #ifdef ALT_ECC_SIZE
  2101. rx = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  2102. ry = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  2103. rz = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  2104. if (rx == NULL || ry == NULL || rz == NULL) {
  2105. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  2106. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  2107. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  2108. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  2109. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  2110. return MEMORY_E;
  2111. }
  2112. #endif
  2113. }
  2114. #endif /* WOLFSSL_SMALL_STACK */
  2115. if ((err = mp_init_multi(t1, t2, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  2116. #ifdef WOLFSSL_SMALL_STACK
  2117. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2118. if (P->key == NULL)
  2119. #endif
  2120. {
  2121. #ifdef ALT_ECC_SIZE
  2122. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  2123. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  2124. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  2125. #endif
  2126. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  2127. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  2128. }
  2129. #endif
  2130. return MEMORY_E;
  2131. }
  2132. #ifdef ALT_ECC_SIZE
  2133. /* Use local stack variable */
  2134. x = rx;
  2135. y = ry;
  2136. z = rz;
  2137. if ((err = mp_init_multi(x, y, z, NULL, NULL, NULL)) != MP_OKAY) {
  2138. goto done;
  2139. }
  2140. if (err == MP_OKAY)
  2141. err = mp_copy(P->x, x);
  2142. if (err == MP_OKAY)
  2143. err = mp_copy(P->y, y);
  2144. if (err == MP_OKAY)
  2145. err = mp_copy(P->z, z);
  2146. if (err != MP_OKAY) {
  2147. goto done;
  2148. }
  2149. #else
  2150. /* Use destination directly */
  2151. x = P->x;
  2152. y = P->y;
  2153. z = P->z;
  2154. #endif
  2155. /* get 1/z */
  2156. if (err == MP_OKAY) {
  2157. #if defined(ECC_TIMING_RESISTANT) && defined(USE_FAST_MATH)
  2158. if (ct) {
  2159. err = mp_invmod_mont_ct(z, modulus, t1, mp);
  2160. if (err == MP_OKAY)
  2161. err = mp_montgomery_reduce(t1, modulus, mp);
  2162. }
  2163. else
  2164. #endif
  2165. {
  2166. /* first map z back to normal */
  2167. err = mp_montgomery_reduce(z, modulus, mp);
  2168. if (err == MP_OKAY)
  2169. err = mp_invmod(z, modulus, t1);
  2170. }
  2171. }
  2172. /* get 1/z^2 and 1/z^3 */
  2173. if (err == MP_OKAY)
  2174. err = mp_sqr(t1, t2);
  2175. if (err == MP_OKAY)
  2176. err = mp_mod(t2, modulus, t2);
  2177. if (err == MP_OKAY)
  2178. err = mp_mul(t1, t2, t1);
  2179. if (err == MP_OKAY)
  2180. err = mp_mod(t1, modulus, t1);
  2181. /* multiply against x/y */
  2182. if (err == MP_OKAY)
  2183. err = mp_mul(x, t2, x);
  2184. if (err == MP_OKAY)
  2185. err = mp_montgomery_reduce(x, modulus, mp);
  2186. if (err == MP_OKAY)
  2187. err = mp_mul(y, t1, y);
  2188. if (err == MP_OKAY)
  2189. err = mp_montgomery_reduce(y, modulus, mp);
  2190. if (err == MP_OKAY)
  2191. err = mp_set(z, 1);
  2192. #ifdef ALT_ECC_SIZE
  2193. /* return result */
  2194. if (err == MP_OKAY)
  2195. err = mp_copy(x, P->x);
  2196. if (err == MP_OKAY)
  2197. err = mp_copy(y, P->y);
  2198. if (err == MP_OKAY)
  2199. err = mp_copy(z, P->z);
  2200. done:
  2201. #endif
  2202. /* clean up */
  2203. mp_clear(t1);
  2204. mp_clear(t2);
  2205. #ifdef WOLFSSL_SMALL_STACK
  2206. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2207. if (P->key == NULL)
  2208. #endif
  2209. {
  2210. #ifdef ALT_ECC_SIZE
  2211. XFREE(rz, NULL, DYNAMIC_TYPE_ECC);
  2212. XFREE(ry, NULL, DYNAMIC_TYPE_ECC);
  2213. XFREE(rx, NULL, DYNAMIC_TYPE_ECC);
  2214. #endif
  2215. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  2216. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  2217. }
  2218. #endif
  2219. return err;
  2220. #else
  2221. if (P == NULL || modulus == NULL)
  2222. return ECC_BAD_ARG_E;
  2223. (void)mp;
  2224. #ifndef WOLFSSL_SP_NO_256
  2225. if (mp_count_bits(modulus) == 256) {
  2226. return sp_ecc_map_256(P->x, P->y, P->z);
  2227. }
  2228. #endif
  2229. #ifdef WOLFSSL_SP_384
  2230. if (mp_count_bits(modulus) == 384) {
  2231. return sp_ecc_map_384(P->x, P->y, P->z);
  2232. }
  2233. #endif
  2234. return ECC_BAD_ARG_E;
  2235. #endif
  2236. }
  2237. int ecc_map(ecc_point* P, mp_int* modulus, mp_digit mp)
  2238. {
  2239. return ecc_map_ex(P, modulus, mp, 0);
  2240. }
  2241. #endif /* !WOLFSSL_SP_MATH || WOLFSSL_PUBLIC_ECC_ADD_DBL */
  2242. #if !defined(FREESCALE_LTC_ECC) && !defined(WOLFSSL_STM32_PKA)
  2243. #ifndef WOLFSSL_SP_MATH
  2244. #ifndef ECC_TIMING_RESISTANT
  2245. /* size of sliding window, don't change this! */
  2246. #define WINSIZE 4
  2247. #define M_POINTS 8
  2248. static int ecc_mulmod(mp_int* k, ecc_point* tG, ecc_point* R, ecc_point** M,
  2249. mp_int* a, mp_int* modulus, mp_digit mp, WC_RNG* rng)
  2250. {
  2251. int err = MP_OKAY;
  2252. int i;
  2253. int first = 1, bitbuf = 0, bitcpy = 0, j;
  2254. int bitcnt = 0, mode = 0, digidx = 0;
  2255. mp_digit buf;
  2256. (void)rng;
  2257. /* calc the M tab, which holds kG for k==8..15 */
  2258. /* M[0] == 8G */
  2259. if (err == MP_OKAY)
  2260. err = ecc_projective_dbl_point(tG, M[0], a, modulus, mp);
  2261. if (err == MP_OKAY)
  2262. err = ecc_projective_dbl_point(M[0], M[0], a, modulus, mp);
  2263. if (err == MP_OKAY)
  2264. err = ecc_projective_dbl_point(M[0], M[0], a, modulus, mp);
  2265. /* now find (8+k)G for k=1..7 */
  2266. if (err == MP_OKAY)
  2267. for (j = 9; j < 16; j++) {
  2268. err = ecc_projective_add_point(M[j-9], tG, M[j-M_POINTS], a, modulus,
  2269. mp);
  2270. if (err != MP_OKAY) break;
  2271. }
  2272. /* setup sliding window */
  2273. if (err == MP_OKAY) {
  2274. mode = 0;
  2275. bitcnt = 1;
  2276. buf = 0;
  2277. digidx = get_digit_count(k) - 1;
  2278. bitcpy = bitbuf = 0;
  2279. first = 1;
  2280. /* perform ops */
  2281. for (;;) {
  2282. /* grab next digit as required */
  2283. if (--bitcnt == 0) {
  2284. if (digidx == -1) {
  2285. break;
  2286. }
  2287. buf = get_digit(k, digidx);
  2288. bitcnt = (int) DIGIT_BIT;
  2289. --digidx;
  2290. }
  2291. /* grab the next msb from the ltiplicand */
  2292. i = (int)(buf >> (DIGIT_BIT - 1)) & 1;
  2293. buf <<= 1;
  2294. /* skip leading zero bits */
  2295. if (mode == 0 && i == 0)
  2296. continue;
  2297. /* if the bit is zero and mode == 1 then we double */
  2298. if (mode == 1 && i == 0) {
  2299. err = ecc_projective_dbl_point(R, R, a, modulus, mp);
  2300. if (err != MP_OKAY) break;
  2301. continue;
  2302. }
  2303. /* else we add it to the window */
  2304. bitbuf |= (i << (WINSIZE - ++bitcpy));
  2305. mode = 2;
  2306. if (bitcpy == WINSIZE) {
  2307. /* if this is the first window we do a simple copy */
  2308. if (first == 1) {
  2309. /* R = kG [k = first window] */
  2310. err = mp_copy(M[bitbuf-M_POINTS]->x, R->x);
  2311. if (err != MP_OKAY) break;
  2312. err = mp_copy(M[bitbuf-M_POINTS]->y, R->y);
  2313. if (err != MP_OKAY) break;
  2314. err = mp_copy(M[bitbuf-M_POINTS]->z, R->z);
  2315. first = 0;
  2316. } else {
  2317. /* normal window */
  2318. /* ok window is filled so double as required and add */
  2319. /* double first */
  2320. for (j = 0; j < WINSIZE; j++) {
  2321. err = ecc_projective_dbl_point(R, R, a, modulus, mp);
  2322. if (err != MP_OKAY) break;
  2323. }
  2324. if (err != MP_OKAY) break; /* out of first for(;;) */
  2325. /* now add, bitbuf will be 8..15 [8..2^WINSIZE] guaranteed */
  2326. err = ecc_projective_add_point(R, M[bitbuf-M_POINTS], R, a,
  2327. modulus, mp);
  2328. }
  2329. if (err != MP_OKAY) break;
  2330. /* empty window and reset */
  2331. bitcpy = bitbuf = 0;
  2332. mode = 1;
  2333. }
  2334. }
  2335. }
  2336. /* if bits remain then double/add */
  2337. if (err == MP_OKAY) {
  2338. if (mode == 2 && bitcpy > 0) {
  2339. /* double then add */
  2340. for (j = 0; j < bitcpy; j++) {
  2341. /* only double if we have had at least one add first */
  2342. if (first == 0) {
  2343. err = ecc_projective_dbl_point(R, R, a, modulus, mp);
  2344. if (err != MP_OKAY) break;
  2345. }
  2346. bitbuf <<= 1;
  2347. if ((bitbuf & (1 << WINSIZE)) != 0) {
  2348. if (first == 1) {
  2349. /* first add, so copy */
  2350. err = mp_copy(tG->x, R->x);
  2351. if (err != MP_OKAY) break;
  2352. err = mp_copy(tG->y, R->y);
  2353. if (err != MP_OKAY) break;
  2354. err = mp_copy(tG->z, R->z);
  2355. if (err != MP_OKAY) break;
  2356. first = 0;
  2357. } else {
  2358. /* then add */
  2359. err = ecc_projective_add_point(R, tG, R, a, modulus, mp);
  2360. if (err != MP_OKAY) break;
  2361. }
  2362. }
  2363. }
  2364. }
  2365. }
  2366. #undef WINSIZE
  2367. return err;
  2368. }
  2369. #else
  2370. static int wc_ecc_gen_z(WC_RNG* rng, int size, ecc_point* p,
  2371. mp_int* modulus, mp_digit mp, mp_int* tx, mp_int* ty)
  2372. {
  2373. int err;
  2374. err = wc_ecc_gen_k(rng, size, ty, modulus);
  2375. if (err == MP_OKAY)
  2376. err = mp_mul(p->z, ty, p->z);
  2377. if (err == MP_OKAY)
  2378. err = mp_montgomery_reduce(p->z, modulus, mp);
  2379. if (err == MP_OKAY)
  2380. err = mp_sqr(ty, tx);
  2381. if (err == MP_OKAY)
  2382. err = mp_montgomery_reduce(tx, modulus, mp);
  2383. if (err == MP_OKAY)
  2384. err = mp_mul(ty, tx, ty);
  2385. if (err == MP_OKAY)
  2386. err = mp_montgomery_reduce(ty, modulus, mp);
  2387. if (err == MP_OKAY)
  2388. err = mp_mul(p->x, tx, p->x);
  2389. if (err == MP_OKAY)
  2390. err = mp_montgomery_reduce(p->x, modulus, mp);
  2391. if (err == MP_OKAY)
  2392. err = mp_mul(p->y, ty, p->y);
  2393. if (err == MP_OKAY)
  2394. err = mp_montgomery_reduce(p->y, modulus, mp);
  2395. return err;
  2396. }
  2397. #if defined(WC_NO_CACHE_RESISTANT)
  2398. #define M_POINTS 4
  2399. #else
  2400. #define M_POINTS 5
  2401. #endif
  2402. static int ecc_mulmod(mp_int* k, ecc_point* tG, ecc_point* R, ecc_point** M,
  2403. mp_int* a, mp_int* modulus, mp_digit mp, WC_RNG* rng)
  2404. {
  2405. int err = MP_OKAY;
  2406. int i;
  2407. int bitcnt = 0, mode = 0, digidx = 0;
  2408. mp_digit buf;
  2409. /* calc the M tab */
  2410. /* M[0] == G */
  2411. if (err == MP_OKAY)
  2412. err = mp_copy(tG->x, M[0]->x);
  2413. if (err == MP_OKAY)
  2414. err = mp_copy(tG->y, M[0]->y);
  2415. if (err == MP_OKAY)
  2416. err = mp_copy(tG->z, M[0]->z);
  2417. /* M[1] == 2G */
  2418. if (err == MP_OKAY)
  2419. err = ecc_projective_dbl_point(tG, M[1], a, modulus, mp);
  2420. #ifdef WC_NO_CACHE_RESISTANT
  2421. if (err == MP_OKAY)
  2422. err = wc_ecc_copy_point(M[0], M[2]);
  2423. if (rng != NULL) {
  2424. if (err == MP_OKAY) {
  2425. err = wc_ecc_gen_z(rng, (mp_count_bits(modulus) + 7) / 8, M[0],
  2426. modulus, mp, M[3]->x, M[3]->y);
  2427. }
  2428. if (err == MP_OKAY) {
  2429. err = wc_ecc_gen_z(rng, (mp_count_bits(modulus) + 7) / 8, M[1],
  2430. modulus, mp, M[3]->x, M[3]->y);
  2431. }
  2432. }
  2433. #else
  2434. if (err == MP_OKAY)
  2435. err = wc_ecc_copy_point(M[0], M[3]);
  2436. if (err == MP_OKAY)
  2437. err = wc_ecc_copy_point(M[1], M[4]);
  2438. if (rng != NULL) {
  2439. if (err == MP_OKAY) {
  2440. err = wc_ecc_gen_z(rng, (mp_count_bits(modulus) + 7) / 8, M[3],
  2441. modulus, mp, M[2]->x, M[2]->y);
  2442. }
  2443. if (err == MP_OKAY) {
  2444. err = wc_ecc_gen_z(rng, (mp_count_bits(modulus) + 7) / 8, M[4],
  2445. modulus, mp, M[2]->x, M[2]->y);
  2446. }
  2447. }
  2448. #endif
  2449. /* setup sliding window */
  2450. mode = 0;
  2451. digidx = get_digit_count(modulus) - 1;
  2452. /* The order MAY be 1 bit longer than the modulus.
  2453. * k MAY be 1 bit longer than the order.
  2454. */
  2455. bitcnt = (mp_count_bits(modulus) + 2) % DIGIT_BIT;
  2456. digidx += (bitcnt <= 3);
  2457. buf = get_digit(k, digidx) << (DIGIT_BIT - bitcnt);
  2458. bitcnt = (bitcnt + 1) % DIGIT_BIT;
  2459. digidx -= bitcnt != 1;
  2460. /* perform ops */
  2461. if (err == MP_OKAY) {
  2462. for (;;) {
  2463. /* grab next digit as required */
  2464. if (--bitcnt == 0) {
  2465. if (digidx == -1) {
  2466. break;
  2467. }
  2468. buf = get_digit(k, digidx);
  2469. bitcnt = (int)DIGIT_BIT;
  2470. --digidx;
  2471. }
  2472. /* grab the next msb from the multiplicand */
  2473. i = (buf >> (DIGIT_BIT - 1)) & 1;
  2474. buf <<= 1;
  2475. #ifdef WC_NO_CACHE_RESISTANT
  2476. if (mode == 0) {
  2477. /* timing resistant - dummy operations */
  2478. if (err == MP_OKAY)
  2479. err = ecc_projective_add_point(M[1], M[2], M[3], a, modulus,
  2480. mp);
  2481. if (err == MP_OKAY)
  2482. err = ecc_projective_dbl_point(M[3], M[2], a, modulus, mp);
  2483. }
  2484. else {
  2485. if (err == MP_OKAY)
  2486. err = ecc_projective_add_point(M[0], M[1], M[i^1], a,
  2487. modulus, mp);
  2488. if (err == MP_OKAY)
  2489. err = ecc_projective_dbl_point(M[i], M[i], a, modulus, mp);
  2490. }
  2491. #else
  2492. if (err == MP_OKAY)
  2493. err = ecc_projective_add_point(M[0], M[1], M[2], a, modulus, mp);
  2494. if (err == MP_OKAY)
  2495. err = mp_cond_copy(M[2]->x, i, M[0]->x);
  2496. if (err == MP_OKAY)
  2497. err = mp_cond_copy(M[2]->y, i, M[0]->y);
  2498. if (err == MP_OKAY)
  2499. err = mp_cond_copy(M[2]->z, i, M[0]->z);
  2500. if (err == MP_OKAY)
  2501. err = mp_cond_copy(M[2]->x, i ^ 1, M[1]->x);
  2502. if (err == MP_OKAY)
  2503. err = mp_cond_copy(M[2]->y, i ^ 1, M[1]->y);
  2504. if (err == MP_OKAY)
  2505. err = mp_cond_copy(M[2]->z, i ^ 1, M[1]->z);
  2506. if (err == MP_OKAY)
  2507. err = mp_cond_copy(M[0]->x, i ^ 1, M[2]->x);
  2508. if (err == MP_OKAY)
  2509. err = mp_cond_copy(M[0]->y, i ^ 1, M[2]->y);
  2510. if (err == MP_OKAY)
  2511. err = mp_cond_copy(M[0]->z, i ^ 1, M[2]->z);
  2512. if (err == MP_OKAY)
  2513. err = mp_cond_copy(M[1]->x, i, M[2]->x);
  2514. if (err == MP_OKAY)
  2515. err = mp_cond_copy(M[1]->y, i, M[2]->y);
  2516. if (err == MP_OKAY)
  2517. err = mp_cond_copy(M[1]->z, i, M[2]->z);
  2518. if (err == MP_OKAY)
  2519. err = ecc_projective_dbl_point(M[2], M[2], a, modulus, mp);
  2520. if (err == MP_OKAY)
  2521. err = mp_cond_copy(M[2]->x, i ^ 1, M[0]->x);
  2522. if (err == MP_OKAY)
  2523. err = mp_cond_copy(M[2]->y, i ^ 1, M[0]->y);
  2524. if (err == MP_OKAY)
  2525. err = mp_cond_copy(M[2]->z, i ^ 1, M[0]->z);
  2526. if (err == MP_OKAY)
  2527. err = mp_cond_copy(M[2]->x, i, M[1]->x);
  2528. if (err == MP_OKAY)
  2529. err = mp_cond_copy(M[2]->y, i, M[1]->y);
  2530. if (err == MP_OKAY)
  2531. err = mp_cond_copy(M[2]->z, i, M[1]->z);
  2532. if (err == MP_OKAY)
  2533. err = mp_cond_copy(M[3]->x, (mode ^ 1) & i, M[0]->x);
  2534. if (err == MP_OKAY)
  2535. err = mp_cond_copy(M[3]->y, (mode ^ 1) & i, M[0]->y);
  2536. if (err == MP_OKAY)
  2537. err = mp_cond_copy(M[3]->z, (mode ^ 1) & i, M[0]->z);
  2538. if (err == MP_OKAY)
  2539. err = mp_cond_copy(M[4]->x, (mode ^ 1) & i, M[1]->x);
  2540. if (err == MP_OKAY)
  2541. err = mp_cond_copy(M[4]->y, (mode ^ 1) & i, M[1]->y);
  2542. if (err == MP_OKAY)
  2543. err = mp_cond_copy(M[4]->z, (mode ^ 1) & i, M[1]->z);
  2544. #endif /* WC_NO_CACHE_RESISTANT */
  2545. if (err != MP_OKAY)
  2546. break;
  2547. mode |= i;
  2548. } /* end for */
  2549. }
  2550. /* copy result out */
  2551. if (err == MP_OKAY)
  2552. err = mp_copy(M[0]->x, R->x);
  2553. if (err == MP_OKAY)
  2554. err = mp_copy(M[0]->y, R->y);
  2555. if (err == MP_OKAY)
  2556. err = mp_copy(M[0]->z, R->z);
  2557. return err;
  2558. }
  2559. #endif
  2560. #ifndef WOLFSSL_SP_MATH
  2561. /* Convert the point to montogmery form.
  2562. *
  2563. * @param [in] p Point to convert.
  2564. * @param [out] r Point in montgomery form.
  2565. * @param [in] modulus Modulus of ordinates.
  2566. * @return 0 on success.
  2567. * @return -ve on failure.
  2568. */
  2569. static int ecc_point_to_mont(ecc_point* p, ecc_point* r, mp_int* modulus,
  2570. void* heap)
  2571. {
  2572. int err = MP_OKAY;
  2573. #ifdef WOLFSSL_SMALL_STACK
  2574. mp_int* mu = NULL;
  2575. #else
  2576. mp_int mu[1];
  2577. #endif
  2578. (void)heap;
  2579. #ifdef WOLFSSL_SMALL_STACK
  2580. mu = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  2581. if (mu == NULL)
  2582. err = MEMORY_E;
  2583. #endif
  2584. if (err == MP_OKAY)
  2585. err = mp_init(mu);
  2586. if (err == MP_OKAY) {
  2587. err = mp_montgomery_calc_normalization(mu, modulus);
  2588. }
  2589. if (err == MP_OKAY) {
  2590. if (mp_cmp_d(mu, 1) == MP_EQ) {
  2591. err = mp_copy(p->x, r->x);
  2592. if (err == MP_OKAY)
  2593. err = mp_copy(p->y, r->y);
  2594. if (err == MP_OKAY)
  2595. err = mp_copy(p->z, r->z);
  2596. }
  2597. else {
  2598. err = mp_mulmod(p->x, mu, modulus, r->x);
  2599. if (err == MP_OKAY)
  2600. err = mp_mulmod(p->y, mu, modulus, r->y);
  2601. if (err == MP_OKAY)
  2602. err = mp_mulmod(p->z, mu, modulus, r->z);
  2603. }
  2604. }
  2605. #ifdef WOLFSSL_SMALL_STACK
  2606. if (mu != NULL)
  2607. XFREE(mu, heap, DYNAMIC_TYPE_ECC);
  2608. #endif
  2609. return err;
  2610. }
  2611. #endif /* !WOLFSSL_SP_MATH */
  2612. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2613. static int ecc_key_tmp_init(ecc_key* key, void* heap)
  2614. {
  2615. int err = MP_OKAY;
  2616. XMEMSET(*key, 0, sizeof(key));
  2617. key->t1 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  2618. key->t2 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  2619. #ifdef ALT_ECC_SIZE
  2620. key->x = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  2621. key->y = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  2622. key->z = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  2623. #endif
  2624. if (key->t1 == NULL || key->t2 == NULL
  2625. #ifdef ALT_ECC_SIZE
  2626. || key->x == NULL || key->y == NULL || key->z == NULL
  2627. #endif
  2628. ) {
  2629. err = MEMORY_E;
  2630. }
  2631. return err;
  2632. }
  2633. static void ecc_key_tmp_final(ecc_key* key, void* heap)
  2634. {
  2635. #ifdef ALT_ECC_SIZE
  2636. if (key->z != NULL)
  2637. XFREE(key->z, heap, DYNAMIC_TYPE_ECC);
  2638. if (key->y != NULL)
  2639. XFREE(key->y, heap, DYNAMIC_TYPE_ECC);
  2640. if (key->x != NULL)
  2641. XFREE(key->x, heap, DYNAMIC_TYPE_ECC);
  2642. #endif
  2643. if (key->t2 != NULL)
  2644. XFREE(key->t2, heap, DYNAMIC_TYPE_ECC);
  2645. if (key.t1 != NULL)
  2646. XFREE(key->t1, heap, DYNAMIC_TYPE_ECC);
  2647. }
  2648. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  2649. #endif /* !WOLFSSL_SP_MATH */
  2650. #if !defined(WOLFSSL_SP_MATH) || !defined(FP_ECC)
  2651. /**
  2652. Perform a point multiplication
  2653. k The scalar to multiply by
  2654. G The base point
  2655. R [out] Destination for kG
  2656. a ECC curve parameter a
  2657. modulus The modulus of the field the ECC curve is in
  2658. map Boolean whether to map back to affine or not
  2659. (1==map, 0 == leave in projective)
  2660. return MP_OKAY on success
  2661. */
  2662. #ifdef FP_ECC
  2663. static int normal_ecc_mulmod(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  2664. mp_int* modulus, WC_RNG* rng, int map, void* heap)
  2665. #else
  2666. int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  2667. mp_int* modulus, int map, void* heap)
  2668. #endif
  2669. #ifndef WOLFSSL_SP_MATH
  2670. {
  2671. ecc_point *tG, *M[M_POINTS];
  2672. int i, err;
  2673. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2674. ecc_key key;
  2675. #endif
  2676. mp_digit mp;
  2677. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  2678. return ECC_BAD_ARG_E;
  2679. }
  2680. /* init variables */
  2681. tG = NULL;
  2682. XMEMSET(M, 0, sizeof(M));
  2683. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2684. err = ecc_key_tmp_init(&key, heap);
  2685. if (err != MP_OKAY)
  2686. goto exit;
  2687. R->key = &key;
  2688. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  2689. /* alloc ram for window temps */
  2690. for (i = 0; i < M_POINTS; i++) {
  2691. M[i] = wc_ecc_new_point_h(heap);
  2692. if (M[i] == NULL) {
  2693. err = MEMORY_E;
  2694. goto exit;
  2695. }
  2696. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2697. M[i]->key = &key;
  2698. #endif
  2699. }
  2700. /* make a copy of G in case R==G */
  2701. tG = wc_ecc_new_point_h(heap);
  2702. if (tG == NULL) {
  2703. err = MEMORY_E;
  2704. goto exit;
  2705. }
  2706. if ((err = ecc_point_to_mont(G, tG, modulus, heap)) != MP_OKAY) {
  2707. goto exit;
  2708. }
  2709. /* init montgomery reduction */
  2710. if ((err = mp_montgomery_setup(modulus, &mp)) != MP_OKAY) {
  2711. goto exit;
  2712. }
  2713. #ifdef FP_ECC
  2714. err = ecc_mulmod(k, tG, R, M, a, modulus, mp, rng);
  2715. #else
  2716. err = ecc_mulmod(k, tG, R, M, a, modulus, mp, NULL);
  2717. #endif
  2718. /* map R back from projective space */
  2719. if (err == MP_OKAY && map)
  2720. err = ecc_map(R, modulus, mp);
  2721. exit:
  2722. /* done */
  2723. wc_ecc_del_point_h(tG, heap);
  2724. for (i = 0; i < M_POINTS; i++) {
  2725. wc_ecc_del_point_h(M[i], heap);
  2726. }
  2727. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2728. R->key = NULL;
  2729. ecc_key_tmp_free(&key, heap);
  2730. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  2731. return err;
  2732. }
  2733. #else
  2734. {
  2735. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  2736. return ECC_BAD_ARG_E;
  2737. }
  2738. (void)a;
  2739. #ifndef WOLFSSL_SP_NO_256
  2740. if (mp_count_bits(modulus) == 256) {
  2741. return sp_ecc_mulmod_256(k, G, R, map, heap);
  2742. }
  2743. #endif
  2744. #ifdef WOLFSSL_SP_384
  2745. if (mp_count_bits(modulus) == 384) {
  2746. return sp_ecc_mulmod_384(k, G, R, map, heap);
  2747. }
  2748. #endif
  2749. return ECC_BAD_ARG_E;
  2750. }
  2751. #endif
  2752. #endif /* !defined(WOLFSSL_SP_MATH) && !defined(FP_ECC) */
  2753. #ifndef FP_ECC
  2754. /**
  2755. Perform a point multiplication
  2756. k The scalar to multiply by
  2757. G The base point
  2758. R [out] Destination for kG
  2759. a ECC curve parameter a
  2760. modulus The modulus of the field the ECC curve is in
  2761. map Boolean whether to map back to affine or not
  2762. (1==map, 0 == leave in projective)
  2763. return MP_OKAY on success
  2764. */
  2765. int wc_ecc_mulmod_ex2(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  2766. mp_int* modulus, mp_int* order, WC_RNG* rng, int map,
  2767. void* heap)
  2768. #ifndef WOLFSSL_SP_MATH
  2769. {
  2770. ecc_point *tG, *M[M_POINTS];
  2771. int i, err;
  2772. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2773. ecc_key key;
  2774. #endif
  2775. mp_digit mp;
  2776. #ifdef ECC_TIMING_RESISTANT
  2777. mp_int t;
  2778. mp_int o;
  2779. mp_digit mask;
  2780. #endif
  2781. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  2782. return ECC_BAD_ARG_E;
  2783. }
  2784. /* init variables */
  2785. tG = NULL;
  2786. XMEMSET(M, 0, sizeof(M));
  2787. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2788. err = ecc_key_tmp_init(&key, heap);
  2789. if (err != MP_OKAY)
  2790. goto exit;
  2791. R->key = &key;
  2792. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  2793. /* alloc ram for window temps */
  2794. for (i = 0; i < M_POINTS; i++) {
  2795. M[i] = wc_ecc_new_point_h(heap);
  2796. if (M[i] == NULL) {
  2797. err = MEMORY_E;
  2798. goto exit;
  2799. }
  2800. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2801. M[i]->key = &key;
  2802. #endif
  2803. }
  2804. /* make a copy of G in case R==G */
  2805. tG = wc_ecc_new_point_h(heap);
  2806. if (tG == NULL) {
  2807. err = MEMORY_E;
  2808. goto exit;
  2809. }
  2810. if ((err = ecc_point_to_mont(G, tG, modulus, heap)) != MP_OKAY) {
  2811. goto exit;
  2812. }
  2813. /* init montgomery reduction */
  2814. if ((err = mp_montgomery_setup(modulus, &mp)) != MP_OKAY) {
  2815. goto exit;
  2816. }
  2817. #ifdef ECC_TIMING_RESISTANT
  2818. if ((err = mp_init(&t)) != MP_OKAY)
  2819. goto exit;
  2820. if ((err = mp_init(&o)) != MP_OKAY) {
  2821. mp_free(&t);
  2822. goto exit;
  2823. }
  2824. /* Make k at 1 bit longer than order. */
  2825. if (err == MP_OKAY) {
  2826. err = mp_add(k, order, &t);
  2827. }
  2828. if (err == MP_OKAY) {
  2829. err = mp_copy(order, &o);
  2830. }
  2831. if (err == MP_OKAY) {
  2832. /* Only add if order + k has same number of bits as order */
  2833. mask = (mp_digit)0 - (mp_count_bits(&t) == mp_count_bits(order));
  2834. for (i = 0; i < o.used; i++) {
  2835. o.dp[i] &= mask;
  2836. }
  2837. err = mp_add(&t, &o, &t);
  2838. }
  2839. mp_free(&o);
  2840. if (err == MP_OKAY)
  2841. err = ecc_mulmod(&t, tG, R, M, a, modulus, mp, rng);
  2842. mp_forcezero(&t);
  2843. mp_free(&t);
  2844. #else
  2845. err = ecc_mulmod(k, tG, R, M, a, modulus, mp, rng);
  2846. (void)order;
  2847. #endif
  2848. /* map R back from projective space */
  2849. if (err == MP_OKAY && map)
  2850. err = ecc_map(R, modulus, mp);
  2851. exit:
  2852. /* done */
  2853. wc_ecc_del_point_h(tG, heap);
  2854. for (i = 0; i < M_POINTS; i++) {
  2855. wc_ecc_del_point_h(M[i], heap);
  2856. }
  2857. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2858. R->key = NULL;
  2859. ecc_key_tmp_free(&key, heap);
  2860. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  2861. return err;
  2862. }
  2863. #else
  2864. {
  2865. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  2866. return ECC_BAD_ARG_E;
  2867. }
  2868. (void)a;
  2869. (void)order;
  2870. (void)rng;
  2871. #ifndef WOLFSSL_SP_NO_256
  2872. if (mp_count_bits(modulus) == 256) {
  2873. return sp_ecc_mulmod_256(k, G, R, map, heap);
  2874. }
  2875. #endif
  2876. #ifdef WOLFSSL_SP_384
  2877. if (mp_count_bits(modulus) == 384) {
  2878. return sp_ecc_mulmod_384(k, G, R, map, heap);
  2879. }
  2880. #endif
  2881. return ECC_BAD_ARG_E;
  2882. }
  2883. #endif /* !WOLFSSL_SP_MATH */
  2884. #endif /* !FP_ECC */
  2885. #endif /* !FREESCALE_LTC_ECC && !WOLFSSL_STM32_PKA */
  2886. /** ECC Fixed Point mulmod global
  2887. k The multiplicand
  2888. G Base point to multiply
  2889. R [out] Destination of product
  2890. a ECC curve parameter a
  2891. modulus The modulus for the curve
  2892. map [boolean] If non-zero maps the point back to affine coordinates,
  2893. otherwise it's left in jacobian-montgomery form
  2894. return MP_OKAY if successful
  2895. */
  2896. int wc_ecc_mulmod(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  2897. mp_int* modulus, int map)
  2898. {
  2899. return wc_ecc_mulmod_ex(k, G, R, a, modulus, map, NULL);
  2900. }
  2901. #endif /* !WOLFSSL_ATECC508A */
  2902. /**
  2903. * use a heap hint when creating new ecc_point
  2904. * return an allocated point on success or NULL on failure
  2905. */
  2906. ecc_point* wc_ecc_new_point_h(void* heap)
  2907. {
  2908. ecc_point* p;
  2909. (void)heap;
  2910. p = (ecc_point*)XMALLOC(sizeof(ecc_point), heap, DYNAMIC_TYPE_ECC);
  2911. if (p == NULL) {
  2912. return NULL;
  2913. }
  2914. XMEMSET(p, 0, sizeof(ecc_point));
  2915. #ifndef ALT_ECC_SIZE
  2916. if (mp_init_multi(p->x, p->y, p->z, NULL, NULL, NULL) != MP_OKAY) {
  2917. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  2918. return NULL;
  2919. }
  2920. #else
  2921. p->x = (mp_int*)&p->xyz[0];
  2922. p->y = (mp_int*)&p->xyz[1];
  2923. p->z = (mp_int*)&p->xyz[2];
  2924. alt_fp_init(p->x);
  2925. alt_fp_init(p->y);
  2926. alt_fp_init(p->z);
  2927. #endif
  2928. return p;
  2929. }
  2930. /**
  2931. Allocate a new ECC point
  2932. return A newly allocated point or NULL on error
  2933. */
  2934. ecc_point* wc_ecc_new_point(void)
  2935. {
  2936. return wc_ecc_new_point_h(NULL);
  2937. }
  2938. void wc_ecc_del_point_h(ecc_point* p, void* heap)
  2939. {
  2940. /* prevents free'ing null arguments */
  2941. if (p != NULL) {
  2942. mp_clear(p->x);
  2943. mp_clear(p->y);
  2944. mp_clear(p->z);
  2945. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  2946. }
  2947. (void)heap;
  2948. }
  2949. /** Free an ECC point from memory
  2950. p The point to free
  2951. */
  2952. void wc_ecc_del_point(ecc_point* p)
  2953. {
  2954. wc_ecc_del_point_h(p, NULL);
  2955. }
  2956. /** Copy the value of a point to an other one
  2957. p The point to copy
  2958. r The created point
  2959. */
  2960. int wc_ecc_copy_point(ecc_point* p, ecc_point *r)
  2961. {
  2962. int ret;
  2963. /* prevents null arguments */
  2964. if (p == NULL || r == NULL)
  2965. return ECC_BAD_ARG_E;
  2966. ret = mp_copy(p->x, r->x);
  2967. if (ret != MP_OKAY)
  2968. return ret;
  2969. ret = mp_copy(p->y, r->y);
  2970. if (ret != MP_OKAY)
  2971. return ret;
  2972. ret = mp_copy(p->z, r->z);
  2973. if (ret != MP_OKAY)
  2974. return ret;
  2975. return MP_OKAY;
  2976. }
  2977. /** Compare the value of a point with an other one
  2978. a The point to compare
  2979. b The other point to compare
  2980. return MP_EQ if equal, MP_LT/MP_GT if not, < 0 in case of error
  2981. */
  2982. int wc_ecc_cmp_point(ecc_point* a, ecc_point *b)
  2983. {
  2984. int ret;
  2985. /* prevents null arguments */
  2986. if (a == NULL || b == NULL)
  2987. return BAD_FUNC_ARG;
  2988. ret = mp_cmp(a->x, b->x);
  2989. if (ret != MP_EQ)
  2990. return ret;
  2991. ret = mp_cmp(a->y, b->y);
  2992. if (ret != MP_EQ)
  2993. return ret;
  2994. ret = mp_cmp(a->z, b->z);
  2995. if (ret != MP_EQ)
  2996. return ret;
  2997. return MP_EQ;
  2998. }
  2999. /** Returns whether an ECC idx is valid or not
  3000. n The idx number to check
  3001. return 1 if valid, 0 if not
  3002. */
  3003. int wc_ecc_is_valid_idx(int n)
  3004. {
  3005. int x;
  3006. for (x = 0; ecc_sets[x].size != 0; x++)
  3007. ;
  3008. /* -1 is a valid index --- indicating that the domain params
  3009. were supplied by the user */
  3010. if ((n >= ECC_CUSTOM_IDX) && (n < x)) {
  3011. return 1;
  3012. }
  3013. return 0;
  3014. }
  3015. int wc_ecc_get_curve_idx(int curve_id)
  3016. {
  3017. int curve_idx;
  3018. for (curve_idx = 0; ecc_sets[curve_idx].size != 0; curve_idx++) {
  3019. if (curve_id == ecc_sets[curve_idx].id)
  3020. break;
  3021. }
  3022. if (ecc_sets[curve_idx].size == 0) {
  3023. return ECC_CURVE_INVALID;
  3024. }
  3025. return curve_idx;
  3026. }
  3027. int wc_ecc_get_curve_id(int curve_idx)
  3028. {
  3029. if (wc_ecc_is_valid_idx(curve_idx)) {
  3030. return ecc_sets[curve_idx].id;
  3031. }
  3032. return ECC_CURVE_INVALID;
  3033. }
  3034. /* Returns the curve size that corresponds to a given ecc_curve_id identifier
  3035. *
  3036. * id curve id, from ecc_curve_id enum in ecc.h
  3037. * return curve size, from ecc_sets[] on success, negative on error
  3038. */
  3039. int wc_ecc_get_curve_size_from_id(int curve_id)
  3040. {
  3041. int curve_idx = wc_ecc_get_curve_idx(curve_id);
  3042. if (curve_idx == ECC_CURVE_INVALID)
  3043. return ECC_BAD_ARG_E;
  3044. return ecc_sets[curve_idx].size;
  3045. }
  3046. /* Returns the curve index that corresponds to a given curve name in
  3047. * ecc_sets[] of ecc.c
  3048. *
  3049. * name curve name, from ecc_sets[].name in ecc.c
  3050. * return curve index in ecc_sets[] on success, negative on error
  3051. */
  3052. int wc_ecc_get_curve_idx_from_name(const char* curveName)
  3053. {
  3054. int curve_idx;
  3055. word32 len;
  3056. if (curveName == NULL)
  3057. return BAD_FUNC_ARG;
  3058. len = (word32)XSTRLEN(curveName);
  3059. for (curve_idx = 0; ecc_sets[curve_idx].size != 0; curve_idx++) {
  3060. if (
  3061. #ifndef WOLFSSL_ECC_CURVE_STATIC
  3062. ecc_sets[curve_idx].name &&
  3063. #endif
  3064. XSTRNCASECMP(ecc_sets[curve_idx].name, curveName, len) == 0) {
  3065. break;
  3066. }
  3067. }
  3068. if (ecc_sets[curve_idx].size == 0) {
  3069. WOLFSSL_MSG("ecc_set curve name not found");
  3070. return ECC_CURVE_INVALID;
  3071. }
  3072. return curve_idx;
  3073. }
  3074. /* Returns the curve size that corresponds to a given curve name,
  3075. * as listed in ecc_sets[] of ecc.c.
  3076. *
  3077. * name curve name, from ecc_sets[].name in ecc.c
  3078. * return curve size, from ecc_sets[] on success, negative on error
  3079. */
  3080. int wc_ecc_get_curve_size_from_name(const char* curveName)
  3081. {
  3082. int curve_idx;
  3083. if (curveName == NULL)
  3084. return BAD_FUNC_ARG;
  3085. curve_idx = wc_ecc_get_curve_idx_from_name(curveName);
  3086. if (curve_idx < 0)
  3087. return curve_idx;
  3088. return ecc_sets[curve_idx].size;
  3089. }
  3090. /* Returns the curve id that corresponds to a given curve name,
  3091. * as listed in ecc_sets[] of ecc.c.
  3092. *
  3093. * name curve name, from ecc_sets[].name in ecc.c
  3094. * return curve id, from ecc_sets[] on success, negative on error
  3095. */
  3096. int wc_ecc_get_curve_id_from_name(const char* curveName)
  3097. {
  3098. int curve_idx;
  3099. if (curveName == NULL)
  3100. return BAD_FUNC_ARG;
  3101. curve_idx = wc_ecc_get_curve_idx_from_name(curveName);
  3102. if (curve_idx < 0)
  3103. return curve_idx;
  3104. return ecc_sets[curve_idx].id;
  3105. }
  3106. /* Compares a curve parameter (hex, from ecc_sets[]) to given input
  3107. * parameter for equality.
  3108. * encType is WC_TYPE_UNSIGNED_BIN or WC_TYPE_HEX_STR
  3109. * Returns MP_EQ on success, negative on error */
  3110. static int wc_ecc_cmp_param(const char* curveParam,
  3111. const byte* param, word32 paramSz, int encType)
  3112. {
  3113. int err = MP_OKAY;
  3114. #ifdef WOLFSSL_SMALL_STACK
  3115. mp_int* a = NULL;
  3116. mp_int* b = NULL;
  3117. #else
  3118. mp_int a[1], b[1];
  3119. #endif
  3120. if (param == NULL || curveParam == NULL)
  3121. return BAD_FUNC_ARG;
  3122. if (encType == WC_TYPE_HEX_STR)
  3123. return XSTRNCMP(curveParam, (char*) param, paramSz);
  3124. #ifdef WOLFSSL_SMALL_STACK
  3125. a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  3126. if (a == NULL)
  3127. return MEMORY_E;
  3128. b = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  3129. if (b == NULL) {
  3130. XFREE(a, NULL, DYNAMIC_TYPE_ECC);
  3131. return MEMORY_E;
  3132. }
  3133. #endif
  3134. if ((err = mp_init_multi(a, b, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  3135. #ifdef WOLFSSL_SMALL_STACK
  3136. XFREE(a, NULL, DYNAMIC_TYPE_ECC);
  3137. XFREE(b, NULL, DYNAMIC_TYPE_ECC);
  3138. #endif
  3139. return err;
  3140. }
  3141. if (err == MP_OKAY) {
  3142. err = mp_read_unsigned_bin(a, param, paramSz);
  3143. }
  3144. if (err == MP_OKAY)
  3145. err = mp_read_radix(b, curveParam, MP_RADIX_HEX);
  3146. if (err == MP_OKAY) {
  3147. if (mp_cmp(a, b) != MP_EQ) {
  3148. err = -1;
  3149. } else {
  3150. err = MP_EQ;
  3151. }
  3152. }
  3153. mp_clear(a);
  3154. mp_clear(b);
  3155. #ifdef WOLFSSL_SMALL_STACK
  3156. XFREE(b, NULL, DYNAMIC_TYPE_ECC);
  3157. XFREE(a, NULL, DYNAMIC_TYPE_ECC);
  3158. #endif
  3159. return err;
  3160. }
  3161. /* Returns the curve id in ecc_sets[] that corresponds to a given set of
  3162. * curve parameters.
  3163. *
  3164. * fieldSize the field size in bits
  3165. * prime prime of the finite field
  3166. * primeSz size of prime in octets
  3167. * Af first coefficient a of the curve
  3168. * AfSz size of Af in octets
  3169. * Bf second coefficient b of the curve
  3170. * BfSz size of Bf in octets
  3171. * order curve order
  3172. * orderSz size of curve in octets
  3173. * Gx affine x coordinate of base point
  3174. * GxSz size of Gx in octets
  3175. * Gy affine y coordinate of base point
  3176. * GySz size of Gy in octets
  3177. * cofactor curve cofactor
  3178. *
  3179. * return curve id, from ecc_sets[] on success, negative on error
  3180. */
  3181. int wc_ecc_get_curve_id_from_params(int fieldSize,
  3182. const byte* prime, word32 primeSz, const byte* Af, word32 AfSz,
  3183. const byte* Bf, word32 BfSz, const byte* order, word32 orderSz,
  3184. const byte* Gx, word32 GxSz, const byte* Gy, word32 GySz, int cofactor)
  3185. {
  3186. int idx;
  3187. int curveSz;
  3188. if (prime == NULL || Af == NULL || Bf == NULL || order == NULL ||
  3189. Gx == NULL || Gy == NULL)
  3190. return BAD_FUNC_ARG;
  3191. curveSz = (fieldSize + 1) / 8; /* round up */
  3192. for (idx = 0; ecc_sets[idx].size != 0; idx++) {
  3193. if (curveSz == ecc_sets[idx].size) {
  3194. if ((wc_ecc_cmp_param(ecc_sets[idx].prime, prime,
  3195. primeSz, WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3196. (wc_ecc_cmp_param(ecc_sets[idx].Af, Af, AfSz,
  3197. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3198. (wc_ecc_cmp_param(ecc_sets[idx].Bf, Bf, BfSz,
  3199. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3200. (wc_ecc_cmp_param(ecc_sets[idx].order, order,
  3201. orderSz, WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3202. (wc_ecc_cmp_param(ecc_sets[idx].Gx, Gx, GxSz,
  3203. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3204. (wc_ecc_cmp_param(ecc_sets[idx].Gy, Gy, GySz,
  3205. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3206. (cofactor == ecc_sets[idx].cofactor)) {
  3207. break;
  3208. }
  3209. }
  3210. }
  3211. if (ecc_sets[idx].size == 0)
  3212. return ECC_CURVE_INVALID;
  3213. return ecc_sets[idx].id;
  3214. }
  3215. /* Returns the curve id in ecc_sets[] that corresponds
  3216. * to a given domain parameters pointer.
  3217. *
  3218. * dp domain parameters pointer
  3219. *
  3220. * return curve id, from ecc_sets[] on success, negative on error
  3221. */
  3222. int wc_ecc_get_curve_id_from_dp_params(const ecc_set_type* dp)
  3223. {
  3224. int idx;
  3225. if (dp == NULL
  3226. #ifndef WOLFSSL_ECC_CURVE_STATIC
  3227. || dp->prime == NULL || dp->Af == NULL ||
  3228. dp->Bf == NULL || dp->order == NULL || dp->Gx == NULL || dp->Gy == NULL
  3229. #endif
  3230. ) {
  3231. return BAD_FUNC_ARG;
  3232. }
  3233. for (idx = 0; ecc_sets[idx].size != 0; idx++) {
  3234. if (dp->size == ecc_sets[idx].size) {
  3235. if ((wc_ecc_cmp_param(ecc_sets[idx].prime, (const byte*)dp->prime,
  3236. (word32)XSTRLEN(dp->prime), WC_TYPE_HEX_STR) == MP_EQ) &&
  3237. (wc_ecc_cmp_param(ecc_sets[idx].Af, (const byte*)dp->Af,
  3238. (word32)XSTRLEN(dp->Af),WC_TYPE_HEX_STR) == MP_EQ) &&
  3239. (wc_ecc_cmp_param(ecc_sets[idx].Bf, (const byte*)dp->Bf,
  3240. (word32)XSTRLEN(dp->Bf),WC_TYPE_HEX_STR) == MP_EQ) &&
  3241. (wc_ecc_cmp_param(ecc_sets[idx].order, (const byte*)dp->order,
  3242. (word32)XSTRLEN(dp->order),WC_TYPE_HEX_STR) == MP_EQ) &&
  3243. (wc_ecc_cmp_param(ecc_sets[idx].Gx, (const byte*)dp->Gx,
  3244. (word32)XSTRLEN(dp->Gx),WC_TYPE_HEX_STR) == MP_EQ) &&
  3245. (wc_ecc_cmp_param(ecc_sets[idx].Gy, (const byte*)dp->Gy,
  3246. (word32)XSTRLEN(dp->Gy),WC_TYPE_HEX_STR) == MP_EQ) &&
  3247. (dp->cofactor == ecc_sets[idx].cofactor)) {
  3248. break;
  3249. }
  3250. }
  3251. }
  3252. if (ecc_sets[idx].size == 0)
  3253. return ECC_CURVE_INVALID;
  3254. return ecc_sets[idx].id;
  3255. }
  3256. /* Returns the curve id that corresponds to a given OID,
  3257. * as listed in ecc_sets[] of ecc.c.
  3258. *
  3259. * oid OID, from ecc_sets[].name in ecc.c
  3260. * len OID len, from ecc_sets[].name in ecc.c
  3261. * return curve id, from ecc_sets[] on success, negative on error
  3262. */
  3263. int wc_ecc_get_curve_id_from_oid(const byte* oid, word32 len)
  3264. {
  3265. int curve_idx;
  3266. if (oid == NULL)
  3267. return BAD_FUNC_ARG;
  3268. for (curve_idx = 0; ecc_sets[curve_idx].size != 0; curve_idx++) {
  3269. if (
  3270. #ifndef WOLFSSL_ECC_CURVE_STATIC
  3271. ecc_sets[curve_idx].oid &&
  3272. #endif
  3273. ecc_sets[curve_idx].oidSz == len &&
  3274. XMEMCMP(ecc_sets[curve_idx].oid, oid, len) == 0) {
  3275. break;
  3276. }
  3277. }
  3278. if (ecc_sets[curve_idx].size == 0) {
  3279. WOLFSSL_MSG("ecc_set curve name not found");
  3280. return ECC_CURVE_INVALID;
  3281. }
  3282. return ecc_sets[curve_idx].id;
  3283. }
  3284. /* Get curve parameters using curve index */
  3285. const ecc_set_type* wc_ecc_get_curve_params(int curve_idx)
  3286. {
  3287. const ecc_set_type* ecc_set = NULL;
  3288. if (curve_idx >= 0 && curve_idx < (int)ECC_SET_COUNT) {
  3289. ecc_set = &ecc_sets[curve_idx];
  3290. }
  3291. return ecc_set;
  3292. }
  3293. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  3294. static WC_INLINE int wc_ecc_alloc_mpint(ecc_key* key, mp_int** mp)
  3295. {
  3296. if (key == NULL || mp == NULL)
  3297. return BAD_FUNC_ARG;
  3298. if (*mp == NULL) {
  3299. *mp = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_BIGINT);
  3300. if (*mp == NULL) {
  3301. return MEMORY_E;
  3302. }
  3303. XMEMSET(*mp, 0, sizeof(mp_int));
  3304. }
  3305. return 0;
  3306. }
  3307. static WC_INLINE void wc_ecc_free_mpint(ecc_key* key, mp_int** mp)
  3308. {
  3309. if (key && mp && *mp) {
  3310. mp_clear(*mp);
  3311. XFREE(*mp, key->heap, DYNAMIC_TYPE_BIGINT);
  3312. *mp = NULL;
  3313. }
  3314. }
  3315. static int wc_ecc_alloc_async(ecc_key* key)
  3316. {
  3317. int err = wc_ecc_alloc_mpint(key, &key->r);
  3318. if (err == 0)
  3319. err = wc_ecc_alloc_mpint(key, &key->s);
  3320. return err;
  3321. }
  3322. static void wc_ecc_free_async(ecc_key* key)
  3323. {
  3324. wc_ecc_free_mpint(key, &key->r);
  3325. wc_ecc_free_mpint(key, &key->s);
  3326. #ifdef HAVE_CAVIUM_V
  3327. wc_ecc_free_mpint(key, &key->e);
  3328. wc_ecc_free_mpint(key, &key->signK);
  3329. #endif /* HAVE_CAVIUM_V */
  3330. }
  3331. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  3332. #ifdef HAVE_ECC_DHE
  3333. /**
  3334. Create an ECC shared secret between two keys
  3335. private_key The private ECC key (heap hint based off of private key)
  3336. public_key The public key
  3337. out [out] Destination of the shared secret
  3338. Conforms to EC-DH from ANSI X9.63
  3339. outlen [in/out] The max size and resulting size of the shared secret
  3340. return MP_OKAY if successful
  3341. */
  3342. int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out,
  3343. word32* outlen)
  3344. {
  3345. int err;
  3346. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  3347. !defined(WOLFSSL_ATECC608A)
  3348. CRYS_ECDH_TempData_t tempBuff;
  3349. #endif
  3350. if (private_key == NULL || public_key == NULL || out == NULL ||
  3351. outlen == NULL) {
  3352. return BAD_FUNC_ARG;
  3353. }
  3354. #ifdef WOLF_CRYPTO_CB
  3355. if (private_key->devId != INVALID_DEVID) {
  3356. err = wc_CryptoCb_Ecdh(private_key, public_key, out, outlen);
  3357. if (err != CRYPTOCB_UNAVAILABLE)
  3358. return err;
  3359. /* fall-through when unavailable */
  3360. }
  3361. #endif
  3362. /* type valid? */
  3363. if (private_key->type != ECC_PRIVATEKEY &&
  3364. private_key->type != ECC_PRIVATEKEY_ONLY) {
  3365. return ECC_BAD_ARG_E;
  3366. }
  3367. /* Verify domain params supplied */
  3368. if (wc_ecc_is_valid_idx(private_key->idx) == 0 ||
  3369. wc_ecc_is_valid_idx(public_key->idx) == 0) {
  3370. return ECC_BAD_ARG_E;
  3371. }
  3372. /* Verify curve id matches */
  3373. if (private_key->dp->id != public_key->dp->id) {
  3374. return ECC_BAD_ARG_E;
  3375. }
  3376. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  3377. /* For SECP256R1 use hardware */
  3378. if (private_key->dp->id == ECC_SECP256R1) {
  3379. err = atmel_ecc_create_pms(private_key->slot, public_key->pubkey_raw, out);
  3380. *outlen = private_key->dp->size;
  3381. }
  3382. else {
  3383. err = NOT_COMPILED_IN;
  3384. }
  3385. #elif defined(WOLFSSL_CRYPTOCELL)
  3386. /* generate a secret*/
  3387. err = CRYS_ECDH_SVDP_DH(&public_key->ctx.pubKey,
  3388. &private_key->ctx.privKey,
  3389. out,
  3390. outlen,
  3391. &tempBuff);
  3392. if (err != SA_SILIB_RET_OK){
  3393. WOLFSSL_MSG("CRYS_ECDH_SVDP_DH for secret failed");
  3394. return err;
  3395. }
  3396. #else
  3397. err = wc_ecc_shared_secret_ex(private_key, &public_key->pubkey, out, outlen);
  3398. #endif /* WOLFSSL_ATECC508A */
  3399. return err;
  3400. }
  3401. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  3402. !defined(WOLFSSL_CRYPTOCELL)
  3403. static int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point,
  3404. byte* out, word32* outlen, ecc_curve_spec* curve)
  3405. {
  3406. int err = MP_OKAY;
  3407. #ifndef WOLFSSL_SP_MATH
  3408. ecc_point* result = NULL;
  3409. word32 x = 0;
  3410. #endif
  3411. mp_int* k = &private_key->k;
  3412. #ifdef HAVE_ECC_CDH
  3413. mp_int k_lcl;
  3414. /* if cofactor flag has been set */
  3415. if (private_key->flags & WC_ECC_FLAG_COFACTOR) {
  3416. mp_digit cofactor = (mp_digit)private_key->dp->cofactor;
  3417. /* only perform cofactor calc if not equal to 1 */
  3418. if (cofactor != 1) {
  3419. k = &k_lcl;
  3420. if (mp_init(k) != MP_OKAY)
  3421. return MEMORY_E;
  3422. /* multiply cofactor times private key "k" */
  3423. err = mp_mul_d(&private_key->k, cofactor, k);
  3424. if (err != MP_OKAY) {
  3425. mp_clear(k);
  3426. return err;
  3427. }
  3428. }
  3429. }
  3430. #endif
  3431. #ifdef WOLFSSL_HAVE_SP_ECC
  3432. #ifndef WOLFSSL_SP_NO_256
  3433. if (private_key->idx != ECC_CUSTOM_IDX &&
  3434. ecc_sets[private_key->idx].id == ECC_SECP256R1) {
  3435. err = sp_ecc_secret_gen_256(k, point, out, outlen, private_key->heap);
  3436. }
  3437. else
  3438. #endif
  3439. #ifdef WOLFSSL_SP_384
  3440. if (private_key->idx != ECC_CUSTOM_IDX &&
  3441. ecc_sets[private_key->idx].id == ECC_SECP384R1) {
  3442. err = sp_ecc_secret_gen_384(k, point, out, outlen, private_key->heap);
  3443. }
  3444. else
  3445. #endif
  3446. #endif
  3447. #ifdef WOLFSSL_SP_MATH
  3448. {
  3449. err = WC_KEY_SIZE_E;
  3450. (void)curve;
  3451. }
  3452. #else
  3453. {
  3454. mp_digit mp = 0;
  3455. /* make new point */
  3456. result = wc_ecc_new_point_h(private_key->heap);
  3457. if (result == NULL) {
  3458. #ifdef HAVE_ECC_CDH
  3459. if (k == &k_lcl)
  3460. mp_clear(k);
  3461. #endif
  3462. return MEMORY_E;
  3463. }
  3464. #ifdef ECC_TIMING_RESISTANT
  3465. if (private_key->rng == NULL) {
  3466. err = MISSING_RNG_E;
  3467. }
  3468. #endif
  3469. if (err == MP_OKAY) {
  3470. /* Map in a separate call as this should be constant time */
  3471. #ifdef ECC_TIMING_RESISTANT
  3472. err = wc_ecc_mulmod_ex2(k, point, result, curve->Af, curve->prime,
  3473. curve->order, private_key->rng, 0,
  3474. private_key->heap);
  3475. #else
  3476. err = wc_ecc_mulmod_ex2(k, point, result, curve->Af, curve->prime,
  3477. curve->order, NULL, 0, private_key->heap);
  3478. #endif
  3479. }
  3480. if (err == MP_OKAY) {
  3481. err = mp_montgomery_setup(curve->prime, &mp);
  3482. }
  3483. if (err == MP_OKAY) {
  3484. /* Use constant time map if compiled in */
  3485. err = ecc_map_ex(result, curve->prime, mp, 1);
  3486. }
  3487. if (err == MP_OKAY) {
  3488. x = mp_unsigned_bin_size(curve->prime);
  3489. if (*outlen < x || (int)x < mp_unsigned_bin_size(result->x)) {
  3490. err = BUFFER_E;
  3491. }
  3492. }
  3493. if (err == MP_OKAY) {
  3494. XMEMSET(out, 0, x);
  3495. err = mp_to_unsigned_bin(result->x,out +
  3496. (x - mp_unsigned_bin_size(result->x)));
  3497. }
  3498. *outlen = x;
  3499. wc_ecc_del_point_h(result, private_key->heap);
  3500. }
  3501. #endif
  3502. #ifdef HAVE_ECC_CDH
  3503. if (k == &k_lcl)
  3504. mp_clear(k);
  3505. #endif
  3506. return err;
  3507. }
  3508. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  3509. static int wc_ecc_shared_secret_gen_async(ecc_key* private_key,
  3510. ecc_point* point, byte* out, word32 *outlen,
  3511. ecc_curve_spec* curve)
  3512. {
  3513. int err;
  3514. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  3515. #ifdef HAVE_CAVIUM_V
  3516. /* verify the curve is supported by hardware */
  3517. if (NitroxEccIsCurveSupported(private_key))
  3518. #endif
  3519. {
  3520. word32 keySz = private_key->dp->size;
  3521. /* sync public key x/y */
  3522. err = wc_mp_to_bigint_sz(&private_key->k, &private_key->k.raw, keySz);
  3523. if (err == MP_OKAY)
  3524. err = wc_mp_to_bigint_sz(point->x, &point->x->raw, keySz);
  3525. if (err == MP_OKAY)
  3526. err = wc_mp_to_bigint_sz(point->y, &point->y->raw, keySz);
  3527. #ifdef HAVE_CAVIUM_V
  3528. /* allocate buffer for output */
  3529. if (err == MP_OKAY)
  3530. err = wc_ecc_alloc_mpint(private_key, &private_key->e);
  3531. if (err == MP_OKAY)
  3532. err = wc_bigint_alloc(&private_key->e->raw,
  3533. NitroxEccGetSize(private_key)*2);
  3534. if (err == MP_OKAY)
  3535. err = NitroxEcdh(private_key,
  3536. &private_key->k.raw, &point->x->raw, &point->y->raw,
  3537. private_key->e->raw.buf, &private_key->e->raw.len,
  3538. &curve->prime->raw);
  3539. #else
  3540. if (err == MP_OKAY)
  3541. err = wc_ecc_curve_load(private_key->dp, &curve, ECC_CURVE_FIELD_BF);
  3542. if (err == MP_OKAY)
  3543. err = IntelQaEcdh(&private_key->asyncDev,
  3544. &private_key->k.raw, &point->x->raw, &point->y->raw,
  3545. out, outlen,
  3546. &curve->Af->raw, &curve->Bf->raw, &curve->prime->raw,
  3547. private_key->dp->cofactor);
  3548. #endif
  3549. return err;
  3550. }
  3551. #elif defined(WOLFSSL_ASYNC_CRYPT_TEST)
  3552. if (wc_AsyncTestInit(&private_key->asyncDev, ASYNC_TEST_ECC_SHARED_SEC)) {
  3553. WC_ASYNC_TEST* testDev = &private_key->asyncDev.test;
  3554. testDev->eccSharedSec.private_key = private_key;
  3555. testDev->eccSharedSec.public_point = point;
  3556. testDev->eccSharedSec.out = out;
  3557. testDev->eccSharedSec.outLen = outlen;
  3558. return WC_PENDING_E;
  3559. }
  3560. #endif
  3561. /* use sync in other cases */
  3562. err = wc_ecc_shared_secret_gen_sync(private_key, point, out, outlen, curve);
  3563. return err;
  3564. }
  3565. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  3566. int wc_ecc_shared_secret_gen(ecc_key* private_key, ecc_point* point,
  3567. byte* out, word32 *outlen)
  3568. {
  3569. int err;
  3570. DECLARE_CURVE_SPECS(curve, 3);
  3571. if (private_key == NULL || point == NULL || out == NULL ||
  3572. outlen == NULL) {
  3573. return BAD_FUNC_ARG;
  3574. }
  3575. /* load curve info */
  3576. ALLOC_CURVE_SPECS(3);
  3577. err = wc_ecc_curve_load(private_key->dp, &curve,
  3578. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF | ECC_CURVE_FIELD_ORDER));
  3579. if (err != MP_OKAY) {
  3580. FREE_CURVE_SPECS();
  3581. return err;
  3582. }
  3583. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  3584. if (private_key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  3585. err = wc_ecc_shared_secret_gen_async(private_key, point,
  3586. out, outlen, curve);
  3587. }
  3588. else
  3589. #endif
  3590. {
  3591. err = wc_ecc_shared_secret_gen_sync(private_key, point,
  3592. out, outlen, curve);
  3593. }
  3594. wc_ecc_curve_free(curve);
  3595. FREE_CURVE_SPECS();
  3596. return err;
  3597. }
  3598. /**
  3599. Create an ECC shared secret between private key and public point
  3600. private_key The private ECC key (heap hint based on private key)
  3601. point The point to use (public key)
  3602. out [out] Destination of the shared secret
  3603. Conforms to EC-DH from ANSI X9.63
  3604. outlen [in/out] The max size and resulting size of the shared secret
  3605. return MP_OKAY if successful
  3606. */
  3607. int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
  3608. byte* out, word32 *outlen)
  3609. {
  3610. int err;
  3611. if (private_key == NULL || point == NULL || out == NULL ||
  3612. outlen == NULL) {
  3613. return BAD_FUNC_ARG;
  3614. }
  3615. /* type valid? */
  3616. if (private_key->type != ECC_PRIVATEKEY &&
  3617. private_key->type != ECC_PRIVATEKEY_ONLY) {
  3618. return ECC_BAD_ARG_E;
  3619. }
  3620. /* Verify domain params supplied */
  3621. if (wc_ecc_is_valid_idx(private_key->idx) == 0)
  3622. return ECC_BAD_ARG_E;
  3623. switch(private_key->state) {
  3624. case ECC_STATE_NONE:
  3625. case ECC_STATE_SHARED_SEC_GEN:
  3626. private_key->state = ECC_STATE_SHARED_SEC_GEN;
  3627. err = wc_ecc_shared_secret_gen(private_key, point, out, outlen);
  3628. if (err < 0) {
  3629. break;
  3630. }
  3631. FALL_THROUGH;
  3632. case ECC_STATE_SHARED_SEC_RES:
  3633. private_key->state = ECC_STATE_SHARED_SEC_RES;
  3634. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  3635. if (private_key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  3636. #ifdef HAVE_CAVIUM_V
  3637. /* verify the curve is supported by hardware */
  3638. if (NitroxEccIsCurveSupported(private_key)) {
  3639. /* copy output */
  3640. *outlen = private_key->dp->size;
  3641. XMEMCPY(out, private_key->e->raw.buf, *outlen);
  3642. }
  3643. #endif /* HAVE_CAVIUM_V */
  3644. }
  3645. #endif /* WOLFSSL_ASYNC_CRYPT */
  3646. err = 0;
  3647. break;
  3648. default:
  3649. err = BAD_STATE_E;
  3650. } /* switch */
  3651. /* if async pending then return and skip done cleanup below */
  3652. if (err == WC_PENDING_E) {
  3653. private_key->state++;
  3654. return err;
  3655. }
  3656. /* cleanup */
  3657. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  3658. wc_ecc_free_async(private_key);
  3659. #endif
  3660. private_key->state = ECC_STATE_NONE;
  3661. return err;
  3662. }
  3663. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL */
  3664. #endif /* HAVE_ECC_DHE */
  3665. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  3666. !defined(WOLFSSL_CRYPTOCELL)
  3667. /* return 1 if point is at infinity, 0 if not, < 0 on error */
  3668. int wc_ecc_point_is_at_infinity(ecc_point* p)
  3669. {
  3670. if (p == NULL)
  3671. return BAD_FUNC_ARG;
  3672. if (get_digit_count(p->x) == 0 && get_digit_count(p->y) == 0)
  3673. return 1;
  3674. return 0;
  3675. }
  3676. /* generate random and ensure its greater than 0 and less than order */
  3677. int wc_ecc_gen_k(WC_RNG* rng, int size, mp_int* k, mp_int* order)
  3678. {
  3679. #ifndef WC_NO_RNG
  3680. int err;
  3681. byte buf[ECC_MAXSIZE_GEN];
  3682. /*generate 8 extra bytes to mitigate bias from the modulo operation below*/
  3683. /*see section A.1.2 in 'Suite B Implementor's Guide to FIPS 186-3 (ECDSA)'*/
  3684. size += 8;
  3685. /* make up random string */
  3686. err = wc_RNG_GenerateBlock(rng, buf, size);
  3687. /* load random buffer data into k */
  3688. if (err == 0)
  3689. err = mp_read_unsigned_bin(k, (byte*)buf, size);
  3690. /* the key should be smaller than the order of base point */
  3691. if (err == MP_OKAY) {
  3692. if (mp_cmp(k, order) != MP_LT) {
  3693. err = mp_mod(k, order, k);
  3694. }
  3695. }
  3696. /* quick sanity check to make sure we're not dealing with a 0 key */
  3697. if (err == MP_OKAY) {
  3698. if (mp_iszero(k) == MP_YES)
  3699. err = MP_ZERO_E;
  3700. }
  3701. ForceZero(buf, ECC_MAXSIZE);
  3702. return err;
  3703. #else
  3704. (void)rng;
  3705. (void)size;
  3706. (void)k;
  3707. (void)order;
  3708. return NOT_COMPILED_IN;
  3709. #endif /* !WC_NO_RNG */
  3710. }
  3711. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL */
  3712. static WC_INLINE void wc_ecc_reset(ecc_key* key)
  3713. {
  3714. /* make sure required key variables are reset */
  3715. key->state = ECC_STATE_NONE;
  3716. }
  3717. /* create the public ECC key from a private key
  3718. *
  3719. * key an initialized private key to generate public part from
  3720. * curveIn [in]curve for key, can be NULL
  3721. * pubOut [out]ecc_point holding the public key, if NULL then public key part
  3722. * is cached in key instead.
  3723. *
  3724. * Note this function is local to the file because of the argument type
  3725. * ecc_curve_spec. Having this argument allows for not having to load the
  3726. * curve type multiple times when generating a key with wc_ecc_make_key().
  3727. *
  3728. * returns MP_OKAY on success
  3729. */
  3730. static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn,
  3731. ecc_point* pubOut, WC_RNG* rng)
  3732. {
  3733. int err = MP_OKAY;
  3734. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A)
  3735. #ifndef WOLFSSL_SP_MATH
  3736. ecc_point* base = NULL;
  3737. #endif
  3738. ecc_point* pub;
  3739. DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT);
  3740. #endif /* !WOLFSSL_ATECC508A */
  3741. (void)rng;
  3742. if (key == NULL) {
  3743. return BAD_FUNC_ARG;
  3744. }
  3745. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A)
  3746. /* if ecc_point passed in then use it as output for public key point */
  3747. if (pubOut != NULL) {
  3748. pub = pubOut;
  3749. }
  3750. else {
  3751. /* caching public key making it a ECC_PRIVATEKEY instead of
  3752. ECC_PRIVATEKEY_ONLY */
  3753. pub = &key->pubkey;
  3754. key->type = ECC_PRIVATEKEY_ONLY;
  3755. }
  3756. /* avoid loading the curve unless it is not passed in */
  3757. if (curveIn != NULL) {
  3758. curve = curveIn;
  3759. }
  3760. else {
  3761. /* load curve info */
  3762. if (err == MP_OKAY) {
  3763. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  3764. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  3765. }
  3766. }
  3767. if (err == MP_OKAY) {
  3768. #ifndef ALT_ECC_SIZE
  3769. err = mp_init_multi(pub->x, pub->y, pub->z, NULL, NULL, NULL);
  3770. #else
  3771. pub->x = (mp_int*)&pub->xyz[0];
  3772. pub->y = (mp_int*)&pub->xyz[1];
  3773. pub->z = (mp_int*)&pub->xyz[2];
  3774. alt_fp_init(pub->x);
  3775. alt_fp_init(pub->y);
  3776. alt_fp_init(pub->z);
  3777. #endif
  3778. }
  3779. if (err != MP_OKAY) {
  3780. }
  3781. else
  3782. #ifdef WOLFSSL_HAVE_SP_ECC
  3783. #ifndef WOLFSSL_SP_NO_256
  3784. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  3785. err = sp_ecc_mulmod_base_256(&key->k, pub, 1, key->heap);
  3786. }
  3787. else
  3788. #endif
  3789. #ifdef WOLFSSL_SP_384
  3790. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  3791. err = sp_ecc_mulmod_base_384(&key->k, pub, 1, key->heap);
  3792. }
  3793. else
  3794. #endif
  3795. #endif
  3796. #ifdef WOLFSSL_SP_MATH
  3797. err = WC_KEY_SIZE_E;
  3798. #else
  3799. {
  3800. mp_digit mp = 0;
  3801. base = wc_ecc_new_point_h(key->heap);
  3802. if (base == NULL)
  3803. err = MEMORY_E;
  3804. /* read in the x/y for this key */
  3805. if (err == MP_OKAY)
  3806. err = mp_copy(curve->Gx, base->x);
  3807. if (err == MP_OKAY)
  3808. err = mp_copy(curve->Gy, base->y);
  3809. if (err == MP_OKAY)
  3810. err = mp_montgomery_setup(curve->prime, &mp);
  3811. if (err == MP_OKAY)
  3812. err = mp_set(base->z, 1);
  3813. /* make the public key */
  3814. if (err == MP_OKAY) {
  3815. /* Map in a separate call as this should be constant time */
  3816. err = wc_ecc_mulmod_ex2(&key->k, base, pub, curve->Af, curve->prime,
  3817. curve->order, rng, 0, key->heap);
  3818. if (err == MP_MEM) {
  3819. err = MEMORY_E;
  3820. }
  3821. }
  3822. if (err == MP_OKAY) {
  3823. /* Use constant time map if compiled in */
  3824. err = ecc_map_ex(pub, curve->prime, mp, 1);
  3825. }
  3826. wc_ecc_del_point_h(base, key->heap);
  3827. }
  3828. #endif
  3829. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  3830. /* validate the public key, order * pubkey = point at infinity */
  3831. if (err == MP_OKAY)
  3832. err = ecc_check_pubkey_order(key, pub, curve->Af, curve->prime,
  3833. curve->order);
  3834. #endif /* WOLFSSL_VALIDATE_KEYGEN */
  3835. if (err != MP_OKAY) {
  3836. /* clean up if failed */
  3837. #ifndef ALT_ECC_SIZE
  3838. mp_clear(pub->x);
  3839. mp_clear(pub->y);
  3840. mp_clear(pub->z);
  3841. #endif
  3842. }
  3843. /* free up local curve */
  3844. if (curveIn == NULL) {
  3845. wc_ecc_curve_free(curve);
  3846. FREE_CURVE_SPECS();
  3847. }
  3848. #else
  3849. (void)curveIn;
  3850. err = NOT_COMPILED_IN;
  3851. #endif /* WOLFSSL_ATECC508A */
  3852. /* change key state if public part is cached */
  3853. if (key->type == ECC_PRIVATEKEY_ONLY && pubOut == NULL) {
  3854. key->type = ECC_PRIVATEKEY;
  3855. }
  3856. return err;
  3857. }
  3858. /* create the public ECC key from a private key
  3859. *
  3860. * key an initialized private key to generate public part from
  3861. * pubOut [out]ecc_point holding the public key, if NULL then public key part
  3862. * is cached in key instead.
  3863. *
  3864. *
  3865. * returns MP_OKAY on success
  3866. */
  3867. int wc_ecc_make_pub(ecc_key* key, ecc_point* pubOut)
  3868. {
  3869. WOLFSSL_ENTER("wc_ecc_make_pub");
  3870. return ecc_make_pub_ex(key, NULL, pubOut, NULL);
  3871. }
  3872. /* create the public ECC key from a private key - mask timing use random z
  3873. *
  3874. * key an initialized private key to generate public part from
  3875. * pubOut [out]ecc_point holding the public key, if NULL then public key part
  3876. * is cached in key instead.
  3877. *
  3878. *
  3879. * returns MP_OKAY on success
  3880. */
  3881. int wc_ecc_make_pub_ex(ecc_key* key, ecc_point* pubOut, WC_RNG* rng)
  3882. {
  3883. WOLFSSL_ENTER("wc_ecc_make_pub");
  3884. return ecc_make_pub_ex(key, NULL, pubOut, rng);
  3885. }
  3886. WOLFSSL_ABI
  3887. int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id)
  3888. {
  3889. int err;
  3890. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  3891. !defined(WOLFSSL_CRYPTOCELL)
  3892. #ifndef WOLFSSL_SP_MATH
  3893. DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT);
  3894. #endif
  3895. #endif /* !WOLFSSL_ATECC508A */
  3896. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  3897. !defined(WOLFSSL_ATECC608A)
  3898. const CRYS_ECPKI_Domain_t* pDomain;
  3899. CRYS_ECPKI_KG_TempData_t tempBuff;
  3900. CRYS_ECPKI_KG_FipsContext_t fipsCtx;
  3901. byte ucompressed_key[ECC_MAX_CRYPTO_HW_SIZE*2 + 1];
  3902. word32 raw_size = 0;
  3903. #endif
  3904. if (key == NULL || rng == NULL) {
  3905. return BAD_FUNC_ARG;
  3906. }
  3907. /* make sure required variables are reset */
  3908. wc_ecc_reset(key);
  3909. err = wc_ecc_set_curve(key, keysize, curve_id);
  3910. if (err != 0) {
  3911. return err;
  3912. }
  3913. #ifdef WOLF_CRYPTO_CB
  3914. if (key->devId != INVALID_DEVID) {
  3915. err = wc_CryptoCb_MakeEccKey(rng, keysize, key, curve_id);
  3916. if (err != CRYPTOCB_UNAVAILABLE)
  3917. return err;
  3918. /* fall-through when unavailable */
  3919. }
  3920. #endif
  3921. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  3922. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  3923. #ifdef HAVE_CAVIUM
  3924. /* TODO: Not implemented */
  3925. #elif defined(HAVE_INTEL_QA)
  3926. /* TODO: Not implemented */
  3927. #else
  3928. if (wc_AsyncTestInit(&key->asyncDev, ASYNC_TEST_ECC_MAKE)) {
  3929. WC_ASYNC_TEST* testDev = &key->asyncDev.test;
  3930. testDev->eccMake.rng = rng;
  3931. testDev->eccMake.key = key;
  3932. testDev->eccMake.size = keysize;
  3933. testDev->eccMake.curve_id = curve_id;
  3934. return WC_PENDING_E;
  3935. }
  3936. #endif
  3937. }
  3938. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  3939. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  3940. if (key->dp->id == ECC_SECP256R1) {
  3941. key->type = ECC_PRIVATEKEY;
  3942. key->slot = atmel_ecc_alloc(ATMEL_SLOT_ECDHE);
  3943. err = atmel_ecc_create_key(key->slot, key->pubkey_raw);
  3944. /* populate key->pubkey */
  3945. if (err == 0
  3946. #ifdef ALT_ECC_SIZE
  3947. && key->pubkey.x
  3948. #endif
  3949. ) {
  3950. err = mp_read_unsigned_bin(key->pubkey.x, key->pubkey_raw,
  3951. ECC_MAX_CRYPTO_HW_SIZE);
  3952. }
  3953. if (err == 0
  3954. #ifdef ALT_ECC_SIZE
  3955. && key->pubkey.y
  3956. #endif
  3957. ) {
  3958. err = mp_read_unsigned_bin(key->pubkey.y,
  3959. key->pubkey_raw + ECC_MAX_CRYPTO_HW_SIZE,
  3960. ECC_MAX_CRYPTO_HW_SIZE);
  3961. }
  3962. }
  3963. else {
  3964. err = NOT_COMPILED_IN;
  3965. }
  3966. #elif defined(WOLFSSL_CRYPTOCELL)
  3967. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(curve_id));
  3968. raw_size = (word32)(key->dp->size)*2 + 1;
  3969. /* generate first key pair */
  3970. err = CRYS_ECPKI_GenKeyPair(&wc_rndState,
  3971. wc_rndGenVectFunc,
  3972. pDomain,
  3973. &key->ctx.privKey,
  3974. &key->ctx.pubKey,
  3975. &tempBuff,
  3976. &fipsCtx);
  3977. if (err != SA_SILIB_RET_OK){
  3978. WOLFSSL_MSG("CRYS_ECPKI_GenKeyPair for key pair failed");
  3979. return err;
  3980. }
  3981. key->type = ECC_PRIVATEKEY;
  3982. err = CRYS_ECPKI_ExportPublKey(&key->ctx.pubKey,
  3983. CRYS_EC_PointUncompressed,
  3984. &ucompressed_key[0],
  3985. &raw_size);
  3986. if (err == SA_SILIB_RET_OK && key->pubkey.x && key->pubkey.y) {
  3987. err = mp_read_unsigned_bin(key->pubkey.x,
  3988. &ucompressed_key[1], key->dp->size);
  3989. if (err == MP_OKAY) {
  3990. err = mp_read_unsigned_bin(key->pubkey.y,
  3991. &ucompressed_key[1+key->dp->size],key->dp->size);
  3992. }
  3993. }
  3994. raw_size = key->dp->size;
  3995. if (err == MP_OKAY) {
  3996. err = CRYS_ECPKI_ExportPrivKey(&key->ctx.privKey,
  3997. ucompressed_key,
  3998. &raw_size);
  3999. }
  4000. if (err == SA_SILIB_RET_OK) {
  4001. err = mp_read_unsigned_bin(&key->k, ucompressed_key, raw_size);
  4002. }
  4003. #else
  4004. #ifdef WOLFSSL_HAVE_SP_ECC
  4005. #ifndef WOLFSSL_SP_NO_256
  4006. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  4007. err = sp_ecc_make_key_256(rng, &key->k, &key->pubkey, key->heap);
  4008. if (err == MP_OKAY) {
  4009. key->type = ECC_PRIVATEKEY;
  4010. }
  4011. }
  4012. else
  4013. #endif
  4014. #ifdef WOLFSSL_SP_384
  4015. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  4016. err = sp_ecc_make_key_384(rng, &key->k, &key->pubkey, key->heap);
  4017. if (err == MP_OKAY) {
  4018. key->type = ECC_PRIVATEKEY;
  4019. }
  4020. }
  4021. else
  4022. #endif
  4023. #endif /* WOLFSSL_HAVE_SP_ECC */
  4024. { /* software key gen */
  4025. #ifdef WOLFSSL_SP_MATH
  4026. err = WC_KEY_SIZE_E;
  4027. #else
  4028. /* setup the key variables */
  4029. err = mp_init(&key->k);
  4030. /* load curve info */
  4031. if (err == MP_OKAY) {
  4032. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  4033. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  4034. }
  4035. /* generate k */
  4036. if (err == MP_OKAY)
  4037. err = wc_ecc_gen_k(rng, key->dp->size, &key->k, curve->order);
  4038. /* generate public key from k */
  4039. if (err == MP_OKAY)
  4040. err = ecc_make_pub_ex(key, curve, NULL, rng);
  4041. if (err == MP_OKAY)
  4042. key->type = ECC_PRIVATEKEY;
  4043. /* cleanup these on failure case only */
  4044. if (err != MP_OKAY) {
  4045. /* clean up */
  4046. mp_forcezero(&key->k);
  4047. }
  4048. /* cleanup allocations */
  4049. wc_ecc_curve_free(curve);
  4050. FREE_CURVE_SPECS();
  4051. #endif /* WOLFSSL_SP_MATH */
  4052. }
  4053. #ifdef HAVE_WOLF_BIGINT
  4054. if (err == MP_OKAY)
  4055. err = wc_mp_to_bigint(&key->k, &key->k.raw);
  4056. if (err == MP_OKAY)
  4057. err = wc_mp_to_bigint(key->pubkey.x, &key->pubkey.x->raw);
  4058. if (err == MP_OKAY)
  4059. err = wc_mp_to_bigint(key->pubkey.y, &key->pubkey.y->raw);
  4060. if (err == MP_OKAY)
  4061. err = wc_mp_to_bigint(key->pubkey.z, &key->pubkey.z->raw);
  4062. #endif
  4063. #endif /* WOLFSSL_ATECC508A */
  4064. return err;
  4065. }
  4066. #ifdef ECC_DUMP_OID
  4067. /* Optional dump of encoded OID for adding new curves */
  4068. static int mOidDumpDone;
  4069. static void wc_ecc_dump_oids(void)
  4070. {
  4071. int x;
  4072. if (mOidDumpDone) {
  4073. return;
  4074. }
  4075. /* find matching OID sum (based on encoded value) */
  4076. for (x = 0; ecc_sets[x].size != 0; x++) {
  4077. int i;
  4078. byte* oid;
  4079. word32 oidSz, sum = 0;
  4080. printf("ECC %s (%d):\n", ecc_sets[x].name, x);
  4081. #ifdef HAVE_OID_ENCODING
  4082. byte oidEnc[ECC_MAX_OID_LEN];
  4083. oid = oidEnc;
  4084. oidSz = ECC_MAX_OID_LEN;
  4085. printf("OID: ");
  4086. for (i = 0; i < (int)ecc_sets[x].oidSz; i++) {
  4087. printf("%d.", ecc_sets[x].oid[i]);
  4088. }
  4089. printf("\n");
  4090. EncodeObjectId(ecc_sets[x].oid, ecc_sets[x].oidSz, oidEnc, &oidSz);
  4091. #else
  4092. oid = (byte*)ecc_sets[x].oid;
  4093. oidSz = ecc_sets[x].oidSz;
  4094. #endif
  4095. printf("OID Encoded: ");
  4096. for (i = 0; i < (int)oidSz; i++) {
  4097. printf("0x%02X,", oid[i]);
  4098. }
  4099. printf("\n");
  4100. for (i = 0; i < (int)oidSz; i++) {
  4101. sum += oid[i];
  4102. }
  4103. printf("Sum: %d\n", sum);
  4104. /* validate sum */
  4105. if (ecc_sets[x].oidSum != sum) {
  4106. printf(" Sum %d Not Valid!\n", ecc_sets[x].oidSum);
  4107. }
  4108. }
  4109. mOidDumpDone = 1;
  4110. }
  4111. #endif /* ECC_DUMP_OID */
  4112. WOLFSSL_ABI
  4113. ecc_key* wc_ecc_key_new(void* heap)
  4114. {
  4115. ecc_key* key;
  4116. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  4117. if (key) {
  4118. if (wc_ecc_init_ex(key, heap, INVALID_DEVID) != 0) {
  4119. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  4120. key = NULL;
  4121. }
  4122. }
  4123. return key;
  4124. }
  4125. WOLFSSL_ABI
  4126. void wc_ecc_key_free(ecc_key* key)
  4127. {
  4128. if (key) {
  4129. void* heap = key->heap;
  4130. wc_ecc_free(key);
  4131. ForceZero(key, sizeof(ecc_key));
  4132. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  4133. (void)heap;
  4134. }
  4135. }
  4136. /**
  4137. Make a new ECC key
  4138. rng An active RNG state
  4139. keysize The keysize for the new key (in octets from 20 to 65 bytes)
  4140. key [out] Destination of the newly created key
  4141. return MP_OKAY if successful,
  4142. upon error all allocated memory will be freed
  4143. */
  4144. int wc_ecc_make_key(WC_RNG* rng, int keysize, ecc_key* key)
  4145. {
  4146. return wc_ecc_make_key_ex(rng, keysize, key, ECC_CURVE_DEF);
  4147. }
  4148. /* Setup dynamic pointers if using normal math for proper freeing */
  4149. WOLFSSL_ABI
  4150. int wc_ecc_init_ex(ecc_key* key, void* heap, int devId)
  4151. {
  4152. int ret = 0;
  4153. if (key == NULL) {
  4154. return BAD_FUNC_ARG;
  4155. }
  4156. #ifdef ECC_DUMP_OID
  4157. wc_ecc_dump_oids();
  4158. #endif
  4159. XMEMSET(key, 0, sizeof(ecc_key));
  4160. key->state = ECC_STATE_NONE;
  4161. #if defined(PLUTON_CRYPTO_ECC) || defined(WOLF_CRYPTO_CB)
  4162. key->devId = devId;
  4163. #else
  4164. (void)devId;
  4165. #endif
  4166. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  4167. key->slot = ATECC_INVALID_SLOT;
  4168. #else
  4169. #ifdef ALT_ECC_SIZE
  4170. key->pubkey.x = (mp_int*)&key->pubkey.xyz[0];
  4171. key->pubkey.y = (mp_int*)&key->pubkey.xyz[1];
  4172. key->pubkey.z = (mp_int*)&key->pubkey.xyz[2];
  4173. alt_fp_init(key->pubkey.x);
  4174. alt_fp_init(key->pubkey.y);
  4175. alt_fp_init(key->pubkey.z);
  4176. ret = mp_init(&key->k);
  4177. if (ret != MP_OKAY) {
  4178. return MEMORY_E;
  4179. }
  4180. #else
  4181. ret = mp_init_multi(&key->k, key->pubkey.x, key->pubkey.y, key->pubkey.z,
  4182. NULL, NULL);
  4183. if (ret != MP_OKAY) {
  4184. return MEMORY_E;
  4185. }
  4186. #endif /* ALT_ECC_SIZE */
  4187. #endif /* WOLFSSL_ATECC508A */
  4188. #ifdef WOLFSSL_HEAP_TEST
  4189. key->heap = (void*)WOLFSSL_HEAP_TEST;
  4190. #else
  4191. key->heap = heap;
  4192. #endif
  4193. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4194. /* handle as async */
  4195. ret = wolfAsync_DevCtxInit(&key->asyncDev, WOLFSSL_ASYNC_MARKER_ECC,
  4196. key->heap, devId);
  4197. #endif
  4198. #if defined(WOLFSSL_DSP)
  4199. key->handle = -1;
  4200. #endif
  4201. return ret;
  4202. }
  4203. int wc_ecc_init(ecc_key* key)
  4204. {
  4205. return wc_ecc_init_ex(key, NULL, INVALID_DEVID);
  4206. }
  4207. #ifdef HAVE_PKCS11
  4208. int wc_ecc_init_id(ecc_key* key, unsigned char* id, int len, void* heap,
  4209. int devId)
  4210. {
  4211. int ret = 0;
  4212. if (key == NULL)
  4213. ret = BAD_FUNC_ARG;
  4214. if (ret == 0 && (len < 0 || len > ECC_MAX_ID_LEN))
  4215. ret = BUFFER_E;
  4216. if (ret == 0)
  4217. ret = wc_ecc_init_ex(key, heap, devId);
  4218. if (ret == 0 && id != NULL && len != 0) {
  4219. XMEMCPY(key->id, id, len);
  4220. key->idLen = len;
  4221. }
  4222. return ret;
  4223. }
  4224. #endif
  4225. int wc_ecc_set_flags(ecc_key* key, word32 flags)
  4226. {
  4227. if (key == NULL) {
  4228. return BAD_FUNC_ARG;
  4229. }
  4230. key->flags |= flags;
  4231. return 0;
  4232. }
  4233. static int wc_ecc_get_curve_order_bit_count(const ecc_set_type* dp)
  4234. {
  4235. int err;
  4236. word32 orderBits;
  4237. DECLARE_CURVE_SPECS(curve, 1);
  4238. ALLOC_CURVE_SPECS(1);
  4239. err = wc_ecc_curve_load(dp, &curve, ECC_CURVE_FIELD_ORDER);
  4240. if (err != 0) {
  4241. FREE_CURVE_SPECS();
  4242. return err;
  4243. }
  4244. orderBits = mp_count_bits(curve->order);
  4245. wc_ecc_curve_free(curve);
  4246. FREE_CURVE_SPECS();
  4247. return (int)orderBits;
  4248. }
  4249. #ifdef HAVE_ECC_SIGN
  4250. #ifndef NO_ASN
  4251. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  4252. defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL)
  4253. static int wc_ecc_sign_hash_hw(const byte* in, word32 inlen,
  4254. mp_int* r, mp_int* s, byte* out, word32 *outlen, WC_RNG* rng,
  4255. ecc_key* key)
  4256. {
  4257. int err;
  4258. #ifdef PLUTON_CRYPTO_ECC
  4259. if (key->devId != INVALID_DEVID) /* use hardware */
  4260. #endif
  4261. {
  4262. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  4263. !defined(WOLFSSL_ATECC608A)
  4264. CRYS_ECDSA_SignUserContext_t sigCtxTemp;
  4265. word32 raw_sig_size = *outlen;
  4266. word32 msgLenInBytes = inlen;
  4267. CRYS_ECPKI_HASH_OpMode_t hash_mode;
  4268. #endif
  4269. word32 keysize = (word32)key->dp->size;
  4270. #ifdef PLUTON_CRYPTO_ECC
  4271. word32 orderBits = wc_ecc_get_curve_order_bit_count(key->dp);
  4272. #endif
  4273. /* Check args */
  4274. if (keysize > ECC_MAX_CRYPTO_HW_SIZE || *outlen < keysize*2) {
  4275. return ECC_BAD_ARG_E;
  4276. }
  4277. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  4278. /* Sign: Result is 32-bytes of R then 32-bytes of S */
  4279. err = atmel_ecc_sign(key->slot, in, out);
  4280. if (err != 0) {
  4281. return err;
  4282. }
  4283. #elif defined(PLUTON_CRYPTO_ECC)
  4284. {
  4285. /* if the input is larger than curve order, we must truncate */
  4286. if ((inlen * WOLFSSL_BIT_SIZE) > orderBits) {
  4287. inlen = (orderBits + WOLFSSL_BIT_SIZE - 1) / WOLFSSL_BIT_SIZE;
  4288. }
  4289. /* perform ECC sign */
  4290. word32 raw_sig_size = *outlen;
  4291. err = Crypto_EccSign(in, inlen, out, &raw_sig_size);
  4292. if (err != CRYPTO_RES_SUCCESS || raw_sig_size != keysize*2){
  4293. return BAD_COND_E;
  4294. }
  4295. }
  4296. #elif defined(WOLFSSL_CRYPTOCELL)
  4297. hash_mode = cc310_hashModeECC(msgLenInBytes);
  4298. if (hash_mode == CRYS_ECPKI_HASH_OpModeLast) {
  4299. hash_mode = cc310_hashModeECC(keysize);
  4300. hash_mode = CRYS_ECPKI_HASH_SHA256_mode;
  4301. }
  4302. /* truncate if hash is longer than key size */
  4303. if (msgLenInBytes > keysize) {
  4304. msgLenInBytes = keysize;
  4305. }
  4306. /* create signature from an input buffer using a private key*/
  4307. err = CRYS_ECDSA_Sign(&wc_rndState,
  4308. wc_rndGenVectFunc,
  4309. &sigCtxTemp,
  4310. &key->ctx.privKey,
  4311. hash_mode,
  4312. (byte*)in,
  4313. msgLenInBytes,
  4314. out,
  4315. &raw_sig_size);
  4316. if (err != SA_SILIB_RET_OK){
  4317. WOLFSSL_MSG("CRYS_ECDSA_Sign failed");
  4318. return err;
  4319. }
  4320. #endif
  4321. /* Load R and S */
  4322. err = mp_read_unsigned_bin(r, &out[0], keysize);
  4323. if (err != MP_OKAY) {
  4324. return err;
  4325. }
  4326. err = mp_read_unsigned_bin(s, &out[keysize], keysize);
  4327. if (err != MP_OKAY) {
  4328. return err;
  4329. }
  4330. /* Check for zeros */
  4331. if (mp_iszero(r) || mp_iszero(s)) {
  4332. return MP_ZERO_E;
  4333. }
  4334. }
  4335. #ifdef PLUTON_CRYPTO_ECC
  4336. else {
  4337. err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  4338. }
  4339. #endif
  4340. (void)rng;
  4341. return err;
  4342. }
  4343. #endif /* WOLFSSL_ATECC508A || PLUTON_CRYPTO_ECC || WOLFSSL_CRYPTOCELL */
  4344. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4345. static int wc_ecc_sign_hash_async(const byte* in, word32 inlen, byte* out,
  4346. word32 *outlen, WC_RNG* rng, ecc_key* key)
  4347. {
  4348. int err;
  4349. mp_int *r = NULL, *s = NULL;
  4350. if (in == NULL || out == NULL || outlen == NULL || key == NULL ||
  4351. rng == NULL) {
  4352. return ECC_BAD_ARG_E;
  4353. }
  4354. err = wc_ecc_alloc_async(key);
  4355. if (err != 0) {
  4356. return err;
  4357. }
  4358. r = key->r;
  4359. s = key->s;
  4360. switch(key->state) {
  4361. case ECC_STATE_NONE:
  4362. case ECC_STATE_SIGN_DO:
  4363. key->state = ECC_STATE_SIGN_DO;
  4364. if ((err = mp_init_multi(r, s, NULL, NULL, NULL, NULL)) != MP_OKAY){
  4365. break;
  4366. }
  4367. err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  4368. if (err < 0) {
  4369. break;
  4370. }
  4371. FALL_THROUGH;
  4372. case ECC_STATE_SIGN_ENCODE:
  4373. key->state = ECC_STATE_SIGN_ENCODE;
  4374. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4375. #ifdef HAVE_CAVIUM_V
  4376. /* Nitrox requires r and s in sep buffer, so split it */
  4377. NitroxEccRsSplit(key, &r->raw, &s->raw);
  4378. #endif
  4379. #ifndef WOLFSSL_ASYNC_CRYPT_TEST
  4380. /* only do this if not simulator, since it overwrites result */
  4381. wc_bigint_to_mp(&r->raw, r);
  4382. wc_bigint_to_mp(&s->raw, s);
  4383. #endif
  4384. }
  4385. /* encoded with DSA header */
  4386. err = StoreECC_DSA_Sig(out, outlen, r, s);
  4387. /* done with R/S */
  4388. mp_clear(r);
  4389. mp_clear(s);
  4390. break;
  4391. default:
  4392. err = BAD_STATE_E;
  4393. break;
  4394. }
  4395. /* if async pending then return and skip done cleanup below */
  4396. if (err == WC_PENDING_E) {
  4397. key->state++;
  4398. return err;
  4399. }
  4400. /* cleanup */
  4401. wc_ecc_free_async(key);
  4402. key->state = ECC_STATE_NONE;
  4403. return err;
  4404. }
  4405. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  4406. /**
  4407. Sign a message digest
  4408. in The message digest to sign
  4409. inlen The length of the digest
  4410. out [out] The destination for the signature
  4411. outlen [in/out] The max size and resulting size of the signature
  4412. key A private ECC key
  4413. return MP_OKAY if successful
  4414. */
  4415. WOLFSSL_ABI
  4416. int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen,
  4417. WC_RNG* rng, ecc_key* key)
  4418. {
  4419. int err;
  4420. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(WC_ASYNC_ENABLE_ECC)
  4421. #ifdef WOLFSSL_SMALL_STACK
  4422. mp_int *r = NULL, *s = NULL;
  4423. #else
  4424. mp_int r[1], s[1];
  4425. #endif
  4426. #endif
  4427. if (in == NULL || out == NULL || outlen == NULL || key == NULL ||
  4428. rng == NULL) {
  4429. return ECC_BAD_ARG_E;
  4430. }
  4431. #ifdef WOLF_CRYPTO_CB
  4432. if (key->devId != INVALID_DEVID) {
  4433. err = wc_CryptoCb_EccSign(in, inlen, out, outlen, rng, key);
  4434. if (err != CRYPTOCB_UNAVAILABLE)
  4435. return err;
  4436. /* fall-through when unavailable */
  4437. }
  4438. #endif
  4439. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4440. /* handle async cases */
  4441. err = wc_ecc_sign_hash_async(in, inlen, out, outlen, rng, key);
  4442. #else
  4443. #ifdef WOLFSSL_SMALL_STACK
  4444. r = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  4445. if (r == NULL)
  4446. return MEMORY_E;
  4447. s = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  4448. if (s == NULL) {
  4449. XFREE(r, key->heap, DYNAMIC_TYPE_ECC);
  4450. return MEMORY_E;
  4451. }
  4452. #endif
  4453. XMEMSET(r, 0, sizeof(mp_int));
  4454. XMEMSET(s, 0, sizeof(mp_int));
  4455. if ((err = mp_init_multi(r, s, NULL, NULL, NULL, NULL)) != MP_OKAY){
  4456. #ifdef WOLFSSL_SMALL_STACK
  4457. XFREE(s, key->heap, DYNAMIC_TYPE_ECC);
  4458. XFREE(r, key->heap, DYNAMIC_TYPE_ECC);
  4459. #endif
  4460. return err;
  4461. }
  4462. /* hardware crypto */
  4463. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  4464. defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL)
  4465. err = wc_ecc_sign_hash_hw(in, inlen, r, s, out, outlen, rng, key);
  4466. #else
  4467. err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  4468. #endif
  4469. if (err < 0) {
  4470. #ifdef WOLFSSL_SMALL_STACK
  4471. XFREE(s, key->heap, DYNAMIC_TYPE_ECC);
  4472. XFREE(r, key->heap, DYNAMIC_TYPE_ECC);
  4473. #endif
  4474. return err;
  4475. }
  4476. /* encoded with DSA header */
  4477. err = StoreECC_DSA_Sig(out, outlen, r, s);
  4478. /* cleanup */
  4479. mp_clear(r);
  4480. mp_clear(s);
  4481. #ifdef WOLFSSL_SMALL_STACK
  4482. XFREE(s, key->heap, DYNAMIC_TYPE_ECC);
  4483. XFREE(r, key->heap, DYNAMIC_TYPE_ECC);
  4484. #endif
  4485. #endif /* WOLFSSL_ASYNC_CRYPT */
  4486. return err;
  4487. }
  4488. #endif /* !NO_ASN */
  4489. #if defined(WOLFSSL_STM32_PKA)
  4490. int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
  4491. ecc_key* key, mp_int *r, mp_int *s)
  4492. {
  4493. return stm32_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  4494. }
  4495. #elif !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  4496. !defined(WOLFSSL_CRYPTOCELL)
  4497. /**
  4498. Sign a message digest
  4499. in The message digest to sign
  4500. inlen The length of the digest
  4501. key A private ECC key
  4502. r [out] The destination for r component of the signature
  4503. s [out] The destination for s component of the signature
  4504. return MP_OKAY if successful
  4505. */
  4506. int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
  4507. ecc_key* key, mp_int *r, mp_int *s)
  4508. {
  4509. int err = 0;
  4510. #ifndef WOLFSSL_SP_MATH
  4511. mp_int* e;
  4512. #if (!defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)) && \
  4513. !defined(WOLFSSL_SMALL_STACK)
  4514. mp_int e_lcl;
  4515. #endif
  4516. #if defined(WOLFSSL_ECDSA_SET_K) || \
  4517. (defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  4518. (defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)))
  4519. DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT);
  4520. #else
  4521. DECLARE_CURVE_SPECS(curve, 1);
  4522. #endif
  4523. #endif /* !WOLFSSL_SP_MATH */
  4524. if (in == NULL || r == NULL || s == NULL || key == NULL || rng == NULL) {
  4525. return ECC_BAD_ARG_E;
  4526. }
  4527. /* is this a private key? */
  4528. if (key->type != ECC_PRIVATEKEY && key->type != ECC_PRIVATEKEY_ONLY) {
  4529. return ECC_BAD_ARG_E;
  4530. }
  4531. /* is the IDX valid ? */
  4532. if (wc_ecc_is_valid_idx(key->idx) != 1) {
  4533. return ECC_BAD_ARG_E;
  4534. }
  4535. #ifdef WOLFSSL_SP_MATH
  4536. if (key->idx == ECC_CUSTOM_IDX ||
  4537. (ecc_sets[key->idx].id != ECC_SECP256R1 &&
  4538. ecc_sets[key->idx].id != ECC_SECP384R1)) {
  4539. return WC_KEY_SIZE_E;
  4540. }
  4541. #endif
  4542. #if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_HAVE_SP_ECC)
  4543. if (key->idx != ECC_CUSTOM_IDX
  4544. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4545. && key->asyncDev.marker != WOLFSSL_ASYNC_MARKER_ECC
  4546. #endif
  4547. ) {
  4548. #ifdef WOLFSSL_ECDSA_SET_K
  4549. mp_int* sign_k = key->sign_k;
  4550. #else
  4551. mp_int* sign_k = NULL;
  4552. #endif
  4553. #if defined(WC_ECC_NONBLOCK) && defined(WC_ECC_NONBLOCK_ONLY)
  4554. /* perform blocking call to non-blocking function */
  4555. ecc_nb_ctx_t nb_ctx;
  4556. XMEMSET(&nb_ctx, 0, sizeof(nb_ctx));
  4557. #endif
  4558. #ifndef WOLFSSL_SP_NO_256
  4559. if (ecc_sets[key->idx].id == ECC_SECP256R1) {
  4560. #ifdef WC_ECC_NONBLOCK
  4561. if (key->nb_ctx) {
  4562. return sp_ecc_sign_256_nb(&key->nb_ctx->sp_ctx, in, inlen, rng,
  4563. &key->k, r, s, sign_k, key->heap);
  4564. }
  4565. #ifdef WC_ECC_NONBLOCK_ONLY
  4566. do { /* perform blocking call to non-blocking function */
  4567. err = sp_ecc_sign_256_nb(&nb_ctx.sp_ctx, in, inlen, rng,
  4568. &key->k, r, s, sign_k, key->heap);
  4569. } while (err == FP_WOULDBLOCK);
  4570. return err;
  4571. #endif
  4572. #endif /* WC_ECC_NONBLOCK */
  4573. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  4574. return sp_ecc_sign_256(in, inlen, rng, &key->k, r, s, sign_k,
  4575. key->heap);
  4576. #endif
  4577. }
  4578. #endif
  4579. #ifdef WOLFSSL_SP_384
  4580. if (ecc_sets[key->idx].id == ECC_SECP384R1) {
  4581. #ifdef WC_ECC_NONBLOCK
  4582. if (key->nb_ctx) {
  4583. return sp_ecc_sign_384_nb(&key->nb_ctx->sp_ctx, in, inlen, rng,
  4584. &key->k, r, s, sign_k, key->heap);
  4585. }
  4586. #ifdef WC_ECC_NONBLOCK_ONLY
  4587. do { /* perform blocking call to non-blocking function */
  4588. err = sp_ecc_sign_384_nb(&nb_ctx.sp_ctx, in, inlen, rng,
  4589. &key->k, r, s, sign_k, key->heap);
  4590. } while (err == FP_WOULDBLOCK);
  4591. return err;
  4592. #endif
  4593. #endif /* WC_ECC_NONBLOCK */
  4594. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  4595. return sp_ecc_sign_384(in, inlen, rng, &key->k, r, s, sign_k,
  4596. key->heap);
  4597. #endif
  4598. }
  4599. #endif
  4600. }
  4601. #endif
  4602. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  4603. defined(WOLFSSL_ASYNC_CRYPT_TEST)
  4604. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4605. if (wc_AsyncTestInit(&key->asyncDev, ASYNC_TEST_ECC_SIGN)) {
  4606. WC_ASYNC_TEST* testDev = &key->asyncDev.test;
  4607. testDev->eccSign.in = in;
  4608. testDev->eccSign.inSz = inlen;
  4609. testDev->eccSign.rng = rng;
  4610. testDev->eccSign.key = key;
  4611. testDev->eccSign.r = r;
  4612. testDev->eccSign.s = s;
  4613. return WC_PENDING_E;
  4614. }
  4615. }
  4616. #endif
  4617. #ifndef WOLFSSL_SP_MATH
  4618. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V)
  4619. err = wc_ecc_alloc_mpint(key, &key->e);
  4620. if (err != 0) {
  4621. return err;
  4622. }
  4623. e = key->e;
  4624. #elif !defined(WOLFSSL_SMALL_STACK)
  4625. e = &e_lcl;
  4626. #else
  4627. e = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  4628. if (e == NULL) {
  4629. return MEMORY_E;
  4630. }
  4631. #endif
  4632. /* get the hash and load it as a bignum into 'e' */
  4633. /* init the bignums */
  4634. if ((err = mp_init(e)) != MP_OKAY) {
  4635. #ifdef WOLFSSL_SMALL_STACK
  4636. XFREE(e, key->heap, DYNAMIC_TYPE_ECC);
  4637. #endif
  4638. return err;
  4639. }
  4640. /* load curve info */
  4641. #if defined(WOLFSSL_ECDSA_SET_K)
  4642. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  4643. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  4644. #else
  4645. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  4646. (defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA))
  4647. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4648. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  4649. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  4650. }
  4651. else
  4652. #endif
  4653. {
  4654. ALLOC_CURVE_SPECS(1);
  4655. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  4656. }
  4657. #endif
  4658. /* load digest into e */
  4659. if (err == MP_OKAY) {
  4660. /* we may need to truncate if hash is longer than key size */
  4661. word32 orderBits = mp_count_bits(curve->order);
  4662. /* truncate down to byte size, may be all that's needed */
  4663. if ((WOLFSSL_BIT_SIZE * inlen) > orderBits)
  4664. inlen = (orderBits + WOLFSSL_BIT_SIZE - 1) / WOLFSSL_BIT_SIZE;
  4665. err = mp_read_unsigned_bin(e, (byte*)in, inlen);
  4666. /* may still need bit truncation too */
  4667. if (err == MP_OKAY && (WOLFSSL_BIT_SIZE * inlen) > orderBits)
  4668. mp_rshb(e, WOLFSSL_BIT_SIZE - (orderBits & 0x7));
  4669. }
  4670. /* make up a key and export the public copy */
  4671. if (err == MP_OKAY) {
  4672. int loop_check = 0;
  4673. #ifdef WOLFSSL_SMALL_STACK
  4674. ecc_key* pubkey;
  4675. #else
  4676. ecc_key pubkey[1];
  4677. #endif
  4678. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4679. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4680. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  4681. #ifdef HAVE_CAVIUM_V
  4682. if (NitroxEccIsCurveSupported(key))
  4683. #endif
  4684. {
  4685. word32 keySz = key->dp->size;
  4686. mp_int* k;
  4687. #ifdef HAVE_CAVIUM_V
  4688. err = wc_ecc_alloc_mpint(key, &key->signK);
  4689. if (err != 0)
  4690. return err;
  4691. k = key->signK;
  4692. #else
  4693. mp_int k_lcl;
  4694. k = &k_lcl;
  4695. #endif
  4696. err = mp_init(k);
  4697. /* make sure r and s are allocated */
  4698. #ifdef HAVE_CAVIUM_V
  4699. /* Nitrox V needs single buffer for R and S */
  4700. if (err == MP_OKAY)
  4701. err = wc_bigint_alloc(&key->r->raw, NitroxEccGetSize(key)*2);
  4702. /* Nitrox V only needs Prime and Order */
  4703. if (err == MP_OKAY)
  4704. err = wc_ecc_curve_load(key->dp, &curve,
  4705. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_ORDER));
  4706. #else
  4707. if (err == MP_OKAY)
  4708. err = wc_bigint_alloc(&key->r->raw, key->dp->size);
  4709. if (err == MP_OKAY)
  4710. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  4711. #endif
  4712. if (err == MP_OKAY)
  4713. err = wc_bigint_alloc(&key->s->raw, key->dp->size);
  4714. /* load e and k */
  4715. if (err == MP_OKAY)
  4716. err = wc_mp_to_bigint_sz(e, &e->raw, keySz);
  4717. if (err == MP_OKAY)
  4718. err = wc_mp_to_bigint_sz(&key->k, &key->k.raw, keySz);
  4719. if (err == MP_OKAY)
  4720. err = wc_ecc_gen_k(rng, key->dp->size, k, curve->order);
  4721. if (err == MP_OKAY)
  4722. err = wc_mp_to_bigint_sz(k, &k->raw, keySz);
  4723. #ifdef HAVE_CAVIUM_V
  4724. if (err == MP_OKAY)
  4725. err = NitroxEcdsaSign(key, &e->raw, &key->k.raw, &k->raw,
  4726. &r->raw, &s->raw, &curve->prime->raw, &curve->order->raw);
  4727. #else
  4728. if (err == MP_OKAY)
  4729. err = IntelQaEcdsaSign(&key->asyncDev, &e->raw, &key->k.raw,
  4730. &k->raw, &r->raw, &s->raw, &curve->Af->raw, &curve->Bf->raw,
  4731. &curve->prime->raw, &curve->order->raw, &curve->Gx->raw,
  4732. &curve->Gy->raw);
  4733. #endif
  4734. #ifndef HAVE_CAVIUM_V
  4735. mp_clear(e);
  4736. mp_clear(k);
  4737. #endif
  4738. wc_ecc_curve_free(curve);
  4739. FREE_CURVE_SPECS();
  4740. return err;
  4741. }
  4742. #endif /* HAVE_CAVIUM_V || HAVE_INTEL_QA */
  4743. }
  4744. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  4745. #ifdef WOLFSSL_SMALL_STACK
  4746. pubkey = (ecc_key*)XMALLOC(sizeof(ecc_key), key->heap, DYNAMIC_TYPE_ECC);
  4747. if (pubkey == NULL)
  4748. err = MEMORY_E;
  4749. #endif
  4750. /* don't use async for key, since we don't support async return here */
  4751. if (err == MP_OKAY && (err = wc_ecc_init_ex(pubkey, key->heap,
  4752. INVALID_DEVID)) == MP_OKAY) {
  4753. #ifdef WOLFSSL_SMALL_STACK
  4754. mp_int* b = NULL;
  4755. #else
  4756. mp_int b[1];
  4757. #endif
  4758. #ifdef WOLFSSL_SMALL_STACK
  4759. if (err == MP_OKAY) {
  4760. b = (mp_int*)XMALLOC(sizeof(mp_int), key->heap,
  4761. DYNAMIC_TYPE_ECC);
  4762. if (b == NULL)
  4763. err = MEMORY_E;
  4764. }
  4765. #endif
  4766. if (err == MP_OKAY) {
  4767. err = mp_init(b);
  4768. }
  4769. #ifdef WOLFSSL_CUSTOM_CURVES
  4770. /* if custom curve, apply params to pubkey */
  4771. if (err == MP_OKAY && key->idx == ECC_CUSTOM_IDX) {
  4772. err = wc_ecc_set_custom_curve(pubkey, key->dp);
  4773. }
  4774. #endif
  4775. if (err == MP_OKAY) {
  4776. /* Generate blinding value - non-zero value. */
  4777. do {
  4778. if (++loop_check > 64) {
  4779. err = RNG_FAILURE_E;
  4780. break;
  4781. }
  4782. err = wc_ecc_gen_k(rng, key->dp->size, b, curve->order);
  4783. }
  4784. while (err == MP_ZERO_E);
  4785. loop_check = 0;
  4786. }
  4787. for (; err == MP_OKAY;) {
  4788. if (++loop_check > 64) {
  4789. err = RNG_FAILURE_E;
  4790. break;
  4791. }
  4792. #ifdef WOLFSSL_ECDSA_SET_K
  4793. if (key->sign_k != NULL) {
  4794. if (loop_check > 1) {
  4795. err = RNG_FAILURE_E;
  4796. break;
  4797. }
  4798. err = mp_copy(key->sign_k, &pubkey->k);
  4799. if (err != MP_OKAY) break;
  4800. mp_forcezero(key->sign_k);
  4801. mp_free(key->sign_k);
  4802. XFREE(key->sign_k, key->heap, DYNAMIC_TYPE_ECC);
  4803. key->sign_k = NULL;
  4804. err = ecc_make_pub_ex(pubkey, curve, NULL, rng);
  4805. }
  4806. else
  4807. #endif
  4808. {
  4809. err = wc_ecc_make_key_ex(rng, key->dp->size, pubkey,
  4810. key->dp->id);
  4811. }
  4812. if (err != MP_OKAY) break;
  4813. /* find r = x1 mod n */
  4814. err = mp_mod(pubkey->pubkey.x, curve->order, r);
  4815. if (err != MP_OKAY) break;
  4816. if (mp_iszero(r) == MP_YES) {
  4817. #ifndef ALT_ECC_SIZE
  4818. mp_clear(pubkey->pubkey.x);
  4819. mp_clear(pubkey->pubkey.y);
  4820. mp_clear(pubkey->pubkey.z);
  4821. #endif
  4822. mp_forcezero(&pubkey->k);
  4823. }
  4824. else {
  4825. /* find s = (e + xr)/k
  4826. = b.(e/k.b + x.r/k.b) */
  4827. /* k = k.b */
  4828. err = mp_mulmod(&pubkey->k, b, curve->order, &pubkey->k);
  4829. if (err != MP_OKAY) break;
  4830. /* k = 1/k.b */
  4831. err = mp_invmod(&pubkey->k, curve->order, &pubkey->k);
  4832. if (err != MP_OKAY) break;
  4833. /* s = x.r */
  4834. err = mp_mulmod(&key->k, r, curve->order, s);
  4835. if (err != MP_OKAY) break;
  4836. /* s = x.r/k.b */
  4837. err = mp_mulmod(&pubkey->k, s, curve->order, s);
  4838. if (err != MP_OKAY) break;
  4839. /* e = e/k.b */
  4840. err = mp_mulmod(&pubkey->k, e, curve->order, e);
  4841. if (err != MP_OKAY) break;
  4842. /* s = e/k.b + x.r/k.b
  4843. = (e + x.r)/k.b */
  4844. err = mp_add(e, s, s);
  4845. if (err != MP_OKAY) break;
  4846. /* s = b.(e + x.r)/k.b
  4847. = (e + x.r)/k */
  4848. err = mp_mulmod(s, b, curve->order, s);
  4849. if (err != MP_OKAY) break;
  4850. /* s = (e + xr)/k */
  4851. err = mp_mod(s, curve->order, s);
  4852. if (err != MP_OKAY) break;
  4853. if (mp_iszero(s) == MP_NO)
  4854. break;
  4855. }
  4856. }
  4857. mp_clear(b);
  4858. #ifdef WOLFSSL_SMALL_STACK
  4859. XFREE(b, key->heap, DYNAMIC_TYPE_ECC);
  4860. #endif
  4861. wc_ecc_free(pubkey);
  4862. #ifdef WOLFSSL_SMALL_STACK
  4863. XFREE(pubkey, key->heap, DYNAMIC_TYPE_ECC);
  4864. #endif
  4865. }
  4866. }
  4867. mp_clear(e);
  4868. wc_ecc_curve_free(curve);
  4869. #ifdef WOLFSSL_SMALL_STACK
  4870. XFREE(e, key->heap, DYNAMIC_TYPE_ECC);
  4871. #endif
  4872. FREE_CURVE_SPECS();
  4873. #endif /* WOLFSSL_SP_MATH */
  4874. return err;
  4875. }
  4876. #ifdef WOLFSSL_ECDSA_SET_K
  4877. int wc_ecc_sign_set_k(const byte* k, word32 klen, ecc_key* key)
  4878. {
  4879. int ret = 0;
  4880. if (k == NULL || klen == 0 || key == NULL) {
  4881. ret = BAD_FUNC_ARG;
  4882. }
  4883. if (ret == 0) {
  4884. if (key->sign_k == NULL) {
  4885. key->sign_k = (mp_int*)XMALLOC(sizeof(mp_int), key->heap,
  4886. DYNAMIC_TYPE_ECC);
  4887. if (key->sign_k == NULL) {
  4888. ret = MEMORY_E;
  4889. }
  4890. }
  4891. }
  4892. if (ret == 0) {
  4893. ret = mp_init(key->sign_k);
  4894. }
  4895. if (ret == 0) {
  4896. ret = mp_read_unsigned_bin(key->sign_k, k, klen);
  4897. }
  4898. return ret;
  4899. }
  4900. #endif /* WOLFSSL_ECDSA_SET_K */
  4901. #endif /* WOLFSSL_ATECC508A && WOLFSSL_CRYPTOCELL*/
  4902. #endif /* !HAVE_ECC_SIGN */
  4903. #ifdef WOLFSSL_CUSTOM_CURVES
  4904. void wc_ecc_free_curve(const ecc_set_type* curve, void* heap)
  4905. {
  4906. #ifndef WOLFSSL_ECC_CURVE_STATIC
  4907. if (curve->prime != NULL)
  4908. XFREE((void*)curve->prime, heap, DYNAMIC_TYPE_ECC_BUFFER);
  4909. if (curve->Af != NULL)
  4910. XFREE((void*)curve->Af, heap, DYNAMIC_TYPE_ECC_BUFFER);
  4911. if (curve->Bf != NULL)
  4912. XFREE((void*)curve->Bf, heap, DYNAMIC_TYPE_ECC_BUFFER);
  4913. if (curve->order != NULL)
  4914. XFREE((void*)curve->order, heap, DYNAMIC_TYPE_ECC_BUFFER);
  4915. if (curve->Gx != NULL)
  4916. XFREE((void*)curve->Gx, heap, DYNAMIC_TYPE_ECC_BUFFER);
  4917. if (curve->Gy != NULL)
  4918. XFREE((void*)curve->Gy, heap, DYNAMIC_TYPE_ECC_BUFFER);
  4919. #endif
  4920. XFREE((void*)curve, heap, DYNAMIC_TYPE_ECC_BUFFER);
  4921. (void)heap;
  4922. }
  4923. #endif /* WOLFSSL_CUSTOM_CURVES */
  4924. /**
  4925. Free an ECC key from memory
  4926. key The key you wish to free
  4927. */
  4928. WOLFSSL_ABI
  4929. int wc_ecc_free(ecc_key* key)
  4930. {
  4931. if (key == NULL) {
  4932. return 0;
  4933. }
  4934. #ifdef WOLFSSL_ECDSA_SET_K
  4935. if (key->sign_k != NULL) {
  4936. mp_forcezero(key->sign_k);
  4937. mp_free(key->sign_k);
  4938. XFREE(key->sign_k, key->heap, DYNAMIC_TYPE_ECC);
  4939. }
  4940. #endif
  4941. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4942. #ifdef WC_ASYNC_ENABLE_ECC
  4943. wolfAsync_DevCtxFree(&key->asyncDev, WOLFSSL_ASYNC_MARKER_ECC);
  4944. #endif
  4945. wc_ecc_free_async(key);
  4946. #endif
  4947. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  4948. atmel_ecc_free(key->slot);
  4949. key->slot = ATECC_INVALID_SLOT;
  4950. #endif /* WOLFSSL_ATECC508A */
  4951. mp_clear(key->pubkey.x);
  4952. mp_clear(key->pubkey.y);
  4953. mp_clear(key->pubkey.z);
  4954. mp_forcezero(&key->k);
  4955. #ifdef WOLFSSL_CUSTOM_CURVES
  4956. if (key->deallocSet && key->dp != NULL)
  4957. wc_ecc_free_curve(key->dp, key->heap);
  4958. #endif
  4959. return 0;
  4960. }
  4961. #if !defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_ATECC508A) && \
  4962. !defined(WOLFSSL_ATECC608A) && !defined(WOLFSSL_CRYPTOCELL)
  4963. #ifdef ECC_SHAMIR
  4964. /** Computes kA*A + kB*B = C using Shamir's Trick
  4965. A First point to multiply
  4966. kA What to multiple A by
  4967. B Second point to multiply
  4968. kB What to multiple B by
  4969. C [out] Destination point (can overlap with A or B)
  4970. a ECC curve parameter a
  4971. modulus Modulus for curve
  4972. return MP_OKAY on success
  4973. */
  4974. #ifdef FP_ECC
  4975. static int normal_ecc_mul2add(ecc_point* A, mp_int* kA,
  4976. ecc_point* B, mp_int* kB,
  4977. ecc_point* C, mp_int* a, mp_int* modulus,
  4978. void* heap)
  4979. #else
  4980. int ecc_mul2add(ecc_point* A, mp_int* kA,
  4981. ecc_point* B, mp_int* kB,
  4982. ecc_point* C, mp_int* a, mp_int* modulus,
  4983. void* heap)
  4984. #endif
  4985. {
  4986. #ifdef WOLFSSL_SMALL_STACK_CACHE
  4987. ecc_key key;
  4988. #endif
  4989. #ifdef WOLFSSL_SMALL_STACK
  4990. ecc_point** precomp = NULL;
  4991. #else
  4992. ecc_point* precomp[SHAMIR_PRECOMP_SZ];
  4993. #endif
  4994. unsigned bitbufA, bitbufB, lenA, lenB, len, nA, nB, nibble;
  4995. unsigned char* tA;
  4996. unsigned char* tB;
  4997. int err = MP_OKAY, first, x, y;
  4998. mp_digit mp = 0;
  4999. /* argchks */
  5000. if (A == NULL || kA == NULL || B == NULL || kB == NULL || C == NULL ||
  5001. modulus == NULL) {
  5002. return ECC_BAD_ARG_E;
  5003. }
  5004. /* allocate memory */
  5005. tA = (unsigned char*)XMALLOC(ECC_BUFSIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5006. if (tA == NULL) {
  5007. return GEN_MEM_ERR;
  5008. }
  5009. tB = (unsigned char*)XMALLOC(ECC_BUFSIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5010. if (tB == NULL) {
  5011. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5012. return GEN_MEM_ERR;
  5013. }
  5014. #ifdef WOLFSSL_SMALL_STACK
  5015. precomp = (ecc_point**)XMALLOC(sizeof(ecc_point*) * SHAMIR_PRECOMP_SZ, heap,
  5016. DYNAMIC_TYPE_ECC_BUFFER);
  5017. if (precomp == NULL) {
  5018. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5019. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5020. return GEN_MEM_ERR;
  5021. }
  5022. #endif
  5023. #ifdef WOLFSSL_SMALL_STACK_CACHE
  5024. key.t1 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  5025. key.t2 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  5026. #ifdef ALT_ECC_SIZE
  5027. key.x = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  5028. key.y = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  5029. key.z = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  5030. #endif
  5031. if (key.t1 == NULL || key.t2 == NULL
  5032. #ifdef ALT_ECC_SIZE
  5033. || key.x == NULL || key.y == NULL || key.z == NULL
  5034. #endif
  5035. ) {
  5036. #ifdef ALT_ECC_SIZE
  5037. XFREE(key.z, heap, DYNAMIC_TYPE_ECC);
  5038. XFREE(key.y, heap, DYNAMIC_TYPE_ECC);
  5039. XFREE(key.x, heap, DYNAMIC_TYPE_ECC);
  5040. #endif
  5041. XFREE(key.t2, heap, DYNAMIC_TYPE_ECC);
  5042. XFREE(key.t1, heap, DYNAMIC_TYPE_ECC);
  5043. XFREE(precomp, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5044. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5045. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5046. return MEMORY_E;
  5047. }
  5048. C->key = &key;
  5049. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  5050. /* init variables */
  5051. XMEMSET(tA, 0, ECC_BUFSIZE);
  5052. XMEMSET(tB, 0, ECC_BUFSIZE);
  5053. #ifndef WOLFSSL_SMALL_STACK
  5054. XMEMSET(precomp, 0, sizeof(precomp));
  5055. #else
  5056. XMEMSET(precomp, 0, sizeof(ecc_point*) * SHAMIR_PRECOMP_SZ);
  5057. #endif
  5058. /* get sizes */
  5059. lenA = mp_unsigned_bin_size(kA);
  5060. lenB = mp_unsigned_bin_size(kB);
  5061. len = MAX(lenA, lenB);
  5062. /* sanity check */
  5063. if ((lenA > ECC_BUFSIZE) || (lenB > ECC_BUFSIZE)) {
  5064. err = BAD_FUNC_ARG;
  5065. }
  5066. if (err == MP_OKAY) {
  5067. /* extract and justify kA */
  5068. err = mp_to_unsigned_bin(kA, (len - lenA) + tA);
  5069. /* extract and justify kB */
  5070. if (err == MP_OKAY)
  5071. err = mp_to_unsigned_bin(kB, (len - lenB) + tB);
  5072. /* allocate the table */
  5073. if (err == MP_OKAY) {
  5074. for (x = 0; x < SHAMIR_PRECOMP_SZ; x++) {
  5075. precomp[x] = wc_ecc_new_point_h(heap);
  5076. if (precomp[x] == NULL) {
  5077. err = GEN_MEM_ERR;
  5078. break;
  5079. }
  5080. #ifdef WOLFSSL_SMALL_STACK_CACHE
  5081. precomp[x]->key = &key;
  5082. #endif
  5083. }
  5084. }
  5085. }
  5086. if (err == MP_OKAY)
  5087. /* init montgomery reduction */
  5088. err = mp_montgomery_setup(modulus, &mp);
  5089. if (err == MP_OKAY) {
  5090. #ifdef WOLFSSL_SMALL_STACK
  5091. mp_int* mu;
  5092. #else
  5093. mp_int mu[1];
  5094. #endif
  5095. #ifdef WOLFSSL_SMALL_STACK
  5096. mu = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  5097. if (mu == NULL)
  5098. err = MEMORY_E;
  5099. #endif
  5100. if (err == MP_OKAY) {
  5101. err = mp_init(mu);
  5102. }
  5103. if (err == MP_OKAY) {
  5104. err = mp_montgomery_calc_normalization(mu, modulus);
  5105. if (err == MP_OKAY)
  5106. /* copy ones ... */
  5107. err = mp_mulmod(A->x, mu, modulus, precomp[1]->x);
  5108. if (err == MP_OKAY)
  5109. err = mp_mulmod(A->y, mu, modulus, precomp[1]->y);
  5110. if (err == MP_OKAY)
  5111. err = mp_mulmod(A->z, mu, modulus, precomp[1]->z);
  5112. if (err == MP_OKAY)
  5113. err = mp_mulmod(B->x, mu, modulus, precomp[1<<2]->x);
  5114. if (err == MP_OKAY)
  5115. err = mp_mulmod(B->y, mu, modulus, precomp[1<<2]->y);
  5116. if (err == MP_OKAY)
  5117. err = mp_mulmod(B->z, mu, modulus, precomp[1<<2]->z);
  5118. /* done with mu */
  5119. mp_clear(mu);
  5120. }
  5121. #ifdef WOLFSSL_SMALL_STACK
  5122. if (mu != NULL) {
  5123. XFREE(mu, heap, DYNAMIC_TYPE_ECC);
  5124. }
  5125. #endif
  5126. }
  5127. if (err == MP_OKAY)
  5128. /* precomp [i,0](A + B) table */
  5129. err = ecc_projective_dbl_point(precomp[1], precomp[2], a, modulus, mp);
  5130. if (err == MP_OKAY)
  5131. err = ecc_projective_add_point(precomp[1], precomp[2], precomp[3],
  5132. a, modulus, mp);
  5133. if (err == MP_OKAY)
  5134. /* precomp [0,i](A + B) table */
  5135. err = ecc_projective_dbl_point(precomp[1<<2], precomp[2<<2], a, modulus, mp);
  5136. if (err == MP_OKAY)
  5137. err = ecc_projective_add_point(precomp[1<<2], precomp[2<<2], precomp[3<<2],
  5138. a, modulus, mp);
  5139. if (err == MP_OKAY) {
  5140. /* precomp [i,j](A + B) table (i != 0, j != 0) */
  5141. for (x = 1; x < 4; x++) {
  5142. for (y = 1; y < 4; y++) {
  5143. if (err == MP_OKAY) {
  5144. err = ecc_projective_add_point(precomp[x], precomp[(y<<2)],
  5145. precomp[x+(y<<2)], a, modulus, mp);
  5146. }
  5147. }
  5148. }
  5149. }
  5150. if (err == MP_OKAY) {
  5151. nibble = 3;
  5152. first = 1;
  5153. bitbufA = tA[0];
  5154. bitbufB = tB[0];
  5155. /* for every byte of the multiplicands */
  5156. for (x = 0;; ) {
  5157. /* grab a nibble */
  5158. if (++nibble == 4) {
  5159. if (x == (int)len) break;
  5160. bitbufA = tA[x];
  5161. bitbufB = tB[x];
  5162. nibble = 0;
  5163. x++;
  5164. }
  5165. /* extract two bits from both, shift/update */
  5166. nA = (bitbufA >> 6) & 0x03;
  5167. nB = (bitbufB >> 6) & 0x03;
  5168. bitbufA = (bitbufA << 2) & 0xFF;
  5169. bitbufB = (bitbufB << 2) & 0xFF;
  5170. /* if both zero, if first, continue */
  5171. if ((nA == 0) && (nB == 0) && (first == 1)) {
  5172. continue;
  5173. }
  5174. /* double twice, only if this isn't the first */
  5175. if (first == 0) {
  5176. /* double twice */
  5177. if (err == MP_OKAY)
  5178. err = ecc_projective_dbl_point(C, C, a, modulus, mp);
  5179. if (err == MP_OKAY)
  5180. err = ecc_projective_dbl_point(C, C, a, modulus, mp);
  5181. else
  5182. break;
  5183. }
  5184. /* if not both zero */
  5185. if ((nA != 0) || (nB != 0)) {
  5186. if (first == 1) {
  5187. /* if first, copy from table */
  5188. first = 0;
  5189. if (err == MP_OKAY)
  5190. err = mp_copy(precomp[nA + (nB<<2)]->x, C->x);
  5191. if (err == MP_OKAY)
  5192. err = mp_copy(precomp[nA + (nB<<2)]->y, C->y);
  5193. if (err == MP_OKAY)
  5194. err = mp_copy(precomp[nA + (nB<<2)]->z, C->z);
  5195. else
  5196. break;
  5197. } else {
  5198. /* if not first, add from table */
  5199. if (err == MP_OKAY)
  5200. err = ecc_projective_add_point(C, precomp[nA + (nB<<2)], C,
  5201. a, modulus, mp);
  5202. if (err != MP_OKAY)
  5203. break;
  5204. if (mp_iszero(C->z)) {
  5205. /* When all zero then should have done an add */
  5206. if (mp_iszero(C->x) && mp_iszero(C->y)) {
  5207. err = ecc_projective_dbl_point(precomp[nA + (nB<<2)], C,
  5208. a, modulus, mp);
  5209. if (err != MP_OKAY)
  5210. break;
  5211. }
  5212. /* When only Z zero then result is infinity */
  5213. else {
  5214. err = mp_set(C->x, 0);
  5215. if (err != MP_OKAY)
  5216. break;
  5217. err = mp_set(C->y, 0);
  5218. if (err != MP_OKAY)
  5219. break;
  5220. err = mp_set(C->z, 1);
  5221. if (err != MP_OKAY)
  5222. break;
  5223. first = 1;
  5224. }
  5225. }
  5226. }
  5227. }
  5228. }
  5229. }
  5230. /* reduce to affine */
  5231. if (err == MP_OKAY)
  5232. err = ecc_map(C, modulus, mp);
  5233. /* clean up */
  5234. for (x = 0; x < SHAMIR_PRECOMP_SZ; x++) {
  5235. wc_ecc_del_point_h(precomp[x], heap);
  5236. }
  5237. ForceZero(tA, ECC_BUFSIZE);
  5238. ForceZero(tB, ECC_BUFSIZE);
  5239. #ifdef WOLFSSL_SMALL_STACK_CACHE
  5240. #ifdef ALT_ECC_SIZE
  5241. XFREE(key.z, heap, DYNAMIC_TYPE_ECC);
  5242. XFREE(key.y, heap, DYNAMIC_TYPE_ECC);
  5243. XFREE(key.x, heap, DYNAMIC_TYPE_ECC);
  5244. #endif
  5245. XFREE(key.t2, heap, DYNAMIC_TYPE_ECC);
  5246. XFREE(key.t1, heap, DYNAMIC_TYPE_ECC);
  5247. C->key = NULL;
  5248. #endif
  5249. #ifdef WOLFSSL_SMALL_STACK
  5250. XFREE(precomp, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5251. #endif
  5252. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5253. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  5254. return err;
  5255. }
  5256. #endif /* ECC_SHAMIR */
  5257. #endif /* !WOLFSSL_SP_MATH && !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCEL*/
  5258. #ifdef HAVE_ECC_VERIFY
  5259. #ifndef NO_ASN
  5260. /* verify
  5261. *
  5262. * w = s^-1 mod n
  5263. * u1 = xw
  5264. * u2 = rw
  5265. * X = u1*G + u2*Q
  5266. * v = X_x1 mod n
  5267. * accept if v == r
  5268. */
  5269. /**
  5270. Verify an ECC signature
  5271. sig The signature to verify
  5272. siglen The length of the signature (octets)
  5273. hash The hash (message digest) that was signed
  5274. hashlen The length of the hash (octets)
  5275. res Result of signature, 1==valid, 0==invalid
  5276. key The corresponding public ECC key
  5277. return MP_OKAY if successful (even if the signature is not valid)
  5278. */
  5279. int wc_ecc_verify_hash(const byte* sig, word32 siglen, const byte* hash,
  5280. word32 hashlen, int* res, ecc_key* key)
  5281. {
  5282. int err;
  5283. mp_int *r = NULL, *s = NULL;
  5284. #if (!defined(WOLFSSL_ASYNC_CRYPT) || !defined(WC_ASYNC_ENABLE_ECC)) && \
  5285. !defined(WOLFSSL_SMALL_STACK)
  5286. mp_int r_lcl, s_lcl;
  5287. #endif
  5288. if (sig == NULL || hash == NULL || res == NULL || key == NULL) {
  5289. return ECC_BAD_ARG_E;
  5290. }
  5291. #ifdef WOLF_CRYPTO_CB
  5292. if (key->devId != INVALID_DEVID) {
  5293. err = wc_CryptoCb_EccVerify(sig, siglen, hash, hashlen, res, key);
  5294. if (err != CRYPTOCB_UNAVAILABLE)
  5295. return err;
  5296. /* fall-through when unavailable */
  5297. }
  5298. #endif
  5299. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5300. err = wc_ecc_alloc_async(key);
  5301. if (err != 0)
  5302. return err;
  5303. r = key->r;
  5304. s = key->s;
  5305. #else
  5306. #ifndef WOLFSSL_SMALL_STACK
  5307. r = &r_lcl;
  5308. s = &s_lcl;
  5309. #else
  5310. r = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  5311. if (r == NULL)
  5312. return MEMORY_E;
  5313. s = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  5314. if (s == NULL) {
  5315. XFREE(r, key->heap, DYNAMIC_TYPE_ECC);
  5316. return MEMORY_E;
  5317. }
  5318. #endif
  5319. XMEMSET(r, 0, sizeof(mp_int));
  5320. XMEMSET(s, 0, sizeof(mp_int));
  5321. #endif /* WOLFSSL_ASYNC_CRYPT */
  5322. switch (key->state) {
  5323. case ECC_STATE_NONE:
  5324. case ECC_STATE_VERIFY_DECODE:
  5325. key->state = ECC_STATE_VERIFY_DECODE;
  5326. /* default to invalid signature */
  5327. *res = 0;
  5328. /* Note, DecodeECC_DSA_Sig() calls mp_init() on r and s.
  5329. * If either of those don't allocate correctly, none of
  5330. * the rest of this function will execute, and everything
  5331. * gets cleaned up at the end. */
  5332. /* decode DSA header */
  5333. err = DecodeECC_DSA_Sig(sig, siglen, r, s);
  5334. if (err < 0) {
  5335. break;
  5336. }
  5337. FALL_THROUGH;
  5338. case ECC_STATE_VERIFY_DO:
  5339. key->state = ECC_STATE_VERIFY_DO;
  5340. err = wc_ecc_verify_hash_ex(r, s, hash, hashlen, res, key);
  5341. #ifndef WOLFSSL_ASYNC_CRYPT
  5342. /* done with R/S */
  5343. mp_clear(r);
  5344. mp_clear(s);
  5345. #ifdef WOLFSSL_SMALL_STACK
  5346. XFREE(s, key->heap, DYNAMIC_TYPE_ECC);
  5347. XFREE(r, key->heap, DYNAMIC_TYPE_ECC);
  5348. r = NULL;
  5349. s = NULL;
  5350. #endif
  5351. #endif
  5352. if (err < 0) {
  5353. break;
  5354. }
  5355. FALL_THROUGH;
  5356. case ECC_STATE_VERIFY_RES:
  5357. key->state = ECC_STATE_VERIFY_RES;
  5358. err = 0;
  5359. break;
  5360. default:
  5361. err = BAD_STATE_E;
  5362. }
  5363. /* if async pending then return and skip done cleanup below */
  5364. if (err == WC_PENDING_E) {
  5365. key->state++;
  5366. return err;
  5367. }
  5368. /* cleanup */
  5369. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5370. wc_ecc_free_async(key);
  5371. #elif defined(WOLFSSL_SMALL_STACK)
  5372. XFREE(s, key->heap, DYNAMIC_TYPE_ECC);
  5373. XFREE(r, key->heap, DYNAMIC_TYPE_ECC);
  5374. r = NULL;
  5375. s = NULL;
  5376. #endif
  5377. key->state = ECC_STATE_NONE;
  5378. return err;
  5379. }
  5380. #endif /* !NO_ASN */
  5381. /**
  5382. Verify an ECC signature
  5383. r The signature R component to verify
  5384. s The signature S component to verify
  5385. hash The hash (message digest) that was signed
  5386. hashlen The length of the hash (octets)
  5387. res Result of signature, 1==valid, 0==invalid
  5388. key The corresponding public ECC key
  5389. return MP_OKAY if successful (even if the signature is not valid)
  5390. */
  5391. int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
  5392. word32 hashlen, int* res, ecc_key* key)
  5393. #if defined(WOLFSSL_STM32_PKA)
  5394. {
  5395. return stm32_ecc_verify_hash_ex(r, s, hash, hashlen, res, key);
  5396. }
  5397. #elif defined(WOLFSSL_PSOC6_CRYPTO)
  5398. {
  5399. return psoc6_ecc_verify_hash_ex(r, s, hash, hashlen, res, key);
  5400. }
  5401. #else
  5402. {
  5403. int err;
  5404. word32 keySz;
  5405. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  5406. byte sigRS[ATECC_KEY_SIZE*2];
  5407. #elif defined(WOLFSSL_CRYPTOCELL)
  5408. byte sigRS[ECC_MAX_CRYPTO_HW_SIZE*2];
  5409. CRYS_ECDSA_VerifyUserContext_t sigCtxTemp;
  5410. word32 msgLenInBytes = hashlen;
  5411. CRYS_ECPKI_HASH_OpMode_t hash_mode;
  5412. #elif !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC)
  5413. int did_init = 0;
  5414. ecc_point *mG = NULL, *mQ = NULL;
  5415. #ifdef WOLFSSL_SMALL_STACK
  5416. mp_int* v = NULL;
  5417. mp_int* w = NULL;
  5418. mp_int* u1 = NULL;
  5419. mp_int* u2 = NULL;
  5420. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  5421. mp_int* e_lcl = NULL;
  5422. #endif
  5423. #else /* WOLFSSL_SMALL_STACK */
  5424. mp_int v[1];
  5425. mp_int w[1];
  5426. mp_int u1[1];
  5427. mp_int u2[1];
  5428. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  5429. mp_int e_lcl[1];
  5430. #endif
  5431. #endif /* WOLFSSL_SMALL_STACK */
  5432. mp_int* e;
  5433. DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT);
  5434. #endif
  5435. if (r == NULL || s == NULL || hash == NULL || res == NULL || key == NULL)
  5436. return ECC_BAD_ARG_E;
  5437. /* default to invalid signature */
  5438. *res = 0;
  5439. /* is the IDX valid ? */
  5440. if (wc_ecc_is_valid_idx(key->idx) != 1) {
  5441. return ECC_BAD_ARG_E;
  5442. }
  5443. keySz = key->dp->size;
  5444. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  5445. defined(WOLFSSL_ASYNC_CRYPT_TEST)
  5446. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  5447. if (wc_AsyncTestInit(&key->asyncDev, ASYNC_TEST_ECC_VERIFY)) {
  5448. WC_ASYNC_TEST* testDev = &key->asyncDev.test;
  5449. testDev->eccVerify.r = r;
  5450. testDev->eccVerify.s = s;
  5451. testDev->eccVerify.hash = hash;
  5452. testDev->eccVerify.hashlen = hashlen;
  5453. testDev->eccVerify.stat = res;
  5454. testDev->eccVerify.key = key;
  5455. return WC_PENDING_E;
  5456. }
  5457. }
  5458. #endif
  5459. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  5460. /* Extract R and S */
  5461. err = mp_to_unsigned_bin(r, &sigRS[0]);
  5462. if (err != MP_OKAY) {
  5463. return err;
  5464. }
  5465. err = mp_to_unsigned_bin(s, &sigRS[keySz]);
  5466. if (err != MP_OKAY) {
  5467. return err;
  5468. }
  5469. err = atmel_ecc_verify(hash, sigRS, key->pubkey_raw, res);
  5470. if (err != 0) {
  5471. return err;
  5472. }
  5473. (void)hashlen;
  5474. #elif defined(WOLFSSL_CRYPTOCELL)
  5475. /* Extract R and S */
  5476. err = mp_to_unsigned_bin(r, &sigRS[0]);
  5477. if (err != MP_OKAY) {
  5478. return err;
  5479. }
  5480. err = mp_to_unsigned_bin(s, &sigRS[keySz]);
  5481. if (err != MP_OKAY) {
  5482. return err;
  5483. }
  5484. hash_mode = cc310_hashModeECC(msgLenInBytes);
  5485. if (hash_mode == CRYS_ECPKI_HASH_OpModeLast) {
  5486. /* hash_mode = */ cc310_hashModeECC(keySz);
  5487. hash_mode = CRYS_ECPKI_HASH_SHA256_mode;
  5488. }
  5489. /* truncate if hash is longer than key size */
  5490. if (msgLenInBytes > keySz) {
  5491. msgLenInBytes = keySz;
  5492. }
  5493. /* verify the signature using the public key */
  5494. err = CRYS_ECDSA_Verify(&sigCtxTemp,
  5495. &key->ctx.pubKey,
  5496. hash_mode,
  5497. &sigRS[0],
  5498. keySz*2,
  5499. (byte*)hash,
  5500. msgLenInBytes);
  5501. if (err != SA_SILIB_RET_OK) {
  5502. WOLFSSL_MSG("CRYS_ECDSA_Verify failed");
  5503. return err;
  5504. }
  5505. /* valid signature if we get to this point */
  5506. *res = 1;
  5507. #else
  5508. /* checking if private key with no public part */
  5509. if (key->type == ECC_PRIVATEKEY_ONLY) {
  5510. WOLFSSL_MSG("Verify called with private key, generating public part");
  5511. err = ecc_make_pub_ex(key, NULL, NULL, NULL);
  5512. if (err != MP_OKAY) {
  5513. WOLFSSL_MSG("Unable to extract public key");
  5514. return err;
  5515. }
  5516. }
  5517. #if defined(WOLFSSL_DSP) && !defined(FREESCALE_LTC_ECC)
  5518. if (key->handle != -1) {
  5519. return sp_dsp_ecc_verify_256(key->handle, hash, hashlen, key->pubkey.x,
  5520. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  5521. }
  5522. if (wolfSSL_GetHandleCbSet() == 1) {
  5523. return sp_dsp_ecc_verify_256(0, hash, hashlen, key->pubkey.x,
  5524. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  5525. }
  5526. #endif
  5527. #if defined(WOLFSSL_SP_MATH) && !defined(FREESCALE_LTC_ECC)
  5528. if (key->idx == ECC_CUSTOM_IDX ||
  5529. (ecc_sets[key->idx].id != ECC_SECP256R1 &&
  5530. ecc_sets[key->idx].id != ECC_SECP384R1)) {
  5531. return WC_KEY_SIZE_E;
  5532. }
  5533. #endif
  5534. #if (defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_HAVE_SP_ECC)) && \
  5535. !defined(FREESCALE_LTC_ECC)
  5536. if (key->idx != ECC_CUSTOM_IDX
  5537. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5538. && key->asyncDev.marker != WOLFSSL_ASYNC_MARKER_ECC
  5539. #endif
  5540. ) {
  5541. #if defined(WC_ECC_NONBLOCK) && defined(WC_ECC_NONBLOCK_ONLY)
  5542. /* perform blocking call to non-blocking function */
  5543. ecc_nb_ctx_t nb_ctx;
  5544. XMEMSET(&nb_ctx, 0, sizeof(nb_ctx));
  5545. #endif
  5546. #ifndef WOLFSSL_SP_NO_256
  5547. if (ecc_sets[key->idx].id == ECC_SECP256R1) {
  5548. #ifdef WC_ECC_NONBLOCK
  5549. if (key->nb_ctx) {
  5550. return sp_ecc_verify_256_nb(&key->nb_ctx->sp_ctx, hash, hashlen,
  5551. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  5552. key->heap);
  5553. }
  5554. #ifdef WC_ECC_NONBLOCK_ONLY
  5555. do { /* perform blocking call to non-blocking function */
  5556. err = sp_ecc_verify_256_nb(&nb_ctx.sp_ctx, hash, hashlen,
  5557. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  5558. key->heap);
  5559. } while (err == FP_WOULDBLOCK);
  5560. return err;
  5561. #endif
  5562. #endif /* WC_ECC_NONBLOCK */
  5563. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  5564. return sp_ecc_verify_256(hash, hashlen, key->pubkey.x,
  5565. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  5566. #endif
  5567. }
  5568. #endif
  5569. #ifdef WOLFSSL_SP_384
  5570. if (ecc_sets[key->idx].id == ECC_SECP384R1) {
  5571. #ifdef WC_ECC_NONBLOCK
  5572. if (key->nb_ctx) {
  5573. return sp_ecc_verify_384_nb(&key->nb_ctx->sp_ctx, hash, hashlen,
  5574. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  5575. key->heap);
  5576. }
  5577. #ifdef WC_ECC_NONBLOCK_ONLY
  5578. do { /* perform blocking call to non-blocking function */
  5579. err = sp_ecc_verify_384_nb(&nb_ctx.sp_ctx, hash, hashlen,
  5580. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  5581. key->heap);
  5582. } while (err == FP_WOULDBLOCK);
  5583. return err;
  5584. #endif
  5585. #endif /* WC_ECC_NONBLOCK */
  5586. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  5587. return sp_ecc_verify_384(hash, hashlen, key->pubkey.x,
  5588. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  5589. #endif
  5590. }
  5591. #endif
  5592. }
  5593. #endif
  5594. #if !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC)
  5595. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  5596. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V)
  5597. err = wc_ecc_alloc_mpint(key, &key->e);
  5598. if (err != 0) {
  5599. FREE_CURVE_SPECS();
  5600. return err;
  5601. }
  5602. e = key->e;
  5603. #else
  5604. #ifdef WOLFSSL_SMALL_STACK
  5605. e_lcl = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  5606. if (e_lcl == NULL) {
  5607. FREE_CURVE_SPECS();
  5608. return MEMORY_E;
  5609. }
  5610. #endif
  5611. e = e_lcl;
  5612. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_CAVIUM_V */
  5613. err = mp_init(e);
  5614. if (err != MP_OKAY)
  5615. return MEMORY_E;
  5616. /* read in the specs for this curve */
  5617. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  5618. /* check for zero */
  5619. if (err == MP_OKAY) {
  5620. if (mp_iszero(r) == MP_YES || mp_iszero(s) == MP_YES ||
  5621. mp_cmp(r, curve->order) != MP_LT ||
  5622. mp_cmp(s, curve->order) != MP_LT) {
  5623. err = MP_ZERO_E;
  5624. }
  5625. }
  5626. /* read hash */
  5627. if (err == MP_OKAY) {
  5628. /* we may need to truncate if hash is longer than key size */
  5629. unsigned int orderBits = mp_count_bits(curve->order);
  5630. /* truncate down to byte size, may be all that's needed */
  5631. if ( (WOLFSSL_BIT_SIZE * hashlen) > orderBits)
  5632. hashlen = (orderBits + WOLFSSL_BIT_SIZE - 1) / WOLFSSL_BIT_SIZE;
  5633. err = mp_read_unsigned_bin(e, hash, hashlen);
  5634. /* may still need bit truncation too */
  5635. if (err == MP_OKAY && (WOLFSSL_BIT_SIZE * hashlen) > orderBits)
  5636. mp_rshb(e, WOLFSSL_BIT_SIZE - (orderBits & 0x7));
  5637. }
  5638. /* check for async hardware acceleration */
  5639. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5640. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  5641. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  5642. #ifdef HAVE_CAVIUM_V
  5643. if (NitroxEccIsCurveSupported(key))
  5644. #endif
  5645. {
  5646. err = wc_mp_to_bigint_sz(e, &e->raw, keySz);
  5647. if (err == MP_OKAY)
  5648. err = wc_mp_to_bigint_sz(key->pubkey.x, &key->pubkey.x->raw, keySz);
  5649. if (err == MP_OKAY)
  5650. err = wc_mp_to_bigint_sz(key->pubkey.y, &key->pubkey.y->raw, keySz);
  5651. if (err == MP_OKAY)
  5652. #ifdef HAVE_CAVIUM_V
  5653. err = NitroxEcdsaVerify(key, &e->raw, &key->pubkey.x->raw,
  5654. &key->pubkey.y->raw, &r->raw, &s->raw,
  5655. &curve->prime->raw, &curve->order->raw, res);
  5656. #else
  5657. err = IntelQaEcdsaVerify(&key->asyncDev, &e->raw, &key->pubkey.x->raw,
  5658. &key->pubkey.y->raw, &r->raw, &s->raw, &curve->Af->raw,
  5659. &curve->Bf->raw, &curve->prime->raw, &curve->order->raw,
  5660. &curve->Gx->raw, &curve->Gy->raw, res);
  5661. #endif
  5662. #ifndef HAVE_CAVIUM_V
  5663. mp_clear(e);
  5664. #endif
  5665. wc_ecc_curve_free(curve);
  5666. FREE_CURVE_SPECS();
  5667. return err;
  5668. }
  5669. #endif /* HAVE_CAVIUM_V || HAVE_INTEL_QA */
  5670. }
  5671. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  5672. #ifdef WOLFSSL_SMALL_STACK
  5673. if (err == MP_OKAY) {
  5674. v = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  5675. if (v == NULL)
  5676. err = MEMORY_E;
  5677. }
  5678. if (err == MP_OKAY) {
  5679. w = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  5680. if (w == NULL)
  5681. err = MEMORY_E;
  5682. }
  5683. if (err == MP_OKAY) {
  5684. u1 = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  5685. if (u1 == NULL)
  5686. err = MEMORY_E;
  5687. }
  5688. if (err == MP_OKAY) {
  5689. u2 = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  5690. if (u2 == NULL)
  5691. err = MEMORY_E;
  5692. }
  5693. #endif
  5694. /* allocate ints */
  5695. if (err == MP_OKAY) {
  5696. if ((err = mp_init_multi(v, w, u1, u2, NULL, NULL)) != MP_OKAY) {
  5697. err = MEMORY_E;
  5698. }
  5699. did_init = 1;
  5700. }
  5701. /* allocate points */
  5702. if (err == MP_OKAY) {
  5703. mG = wc_ecc_new_point_h(key->heap);
  5704. mQ = wc_ecc_new_point_h(key->heap);
  5705. if (mQ == NULL || mG == NULL)
  5706. err = MEMORY_E;
  5707. }
  5708. /* w = s^-1 mod n */
  5709. if (err == MP_OKAY)
  5710. err = mp_invmod(s, curve->order, w);
  5711. /* u1 = ew */
  5712. if (err == MP_OKAY)
  5713. err = mp_mulmod(e, w, curve->order, u1);
  5714. /* u2 = rw */
  5715. if (err == MP_OKAY)
  5716. err = mp_mulmod(r, w, curve->order, u2);
  5717. /* find mG and mQ */
  5718. if (err == MP_OKAY)
  5719. err = mp_copy(curve->Gx, mG->x);
  5720. if (err == MP_OKAY)
  5721. err = mp_copy(curve->Gy, mG->y);
  5722. if (err == MP_OKAY)
  5723. err = mp_set(mG->z, 1);
  5724. if (err == MP_OKAY)
  5725. err = mp_copy(key->pubkey.x, mQ->x);
  5726. if (err == MP_OKAY)
  5727. err = mp_copy(key->pubkey.y, mQ->y);
  5728. if (err == MP_OKAY)
  5729. err = mp_copy(key->pubkey.z, mQ->z);
  5730. #if defined(FREESCALE_LTC_ECC)
  5731. /* use PKHA to compute u1*mG + u2*mQ */
  5732. if (err == MP_OKAY)
  5733. err = wc_ecc_mulmod_ex(u1, mG, mG, curve->Af, curve->prime, 0, key->heap);
  5734. if (err == MP_OKAY)
  5735. err = wc_ecc_mulmod_ex(u2, mQ, mQ, curve->Af, curve->prime, 0, key->heap);
  5736. if (err == MP_OKAY)
  5737. err = wc_ecc_point_add(mG, mQ, mG, curve->prime);
  5738. #else
  5739. #ifndef ECC_SHAMIR
  5740. if (err == MP_OKAY)
  5741. {
  5742. mp_digit mp = 0;
  5743. if (!mp_iszero(u1)) {
  5744. /* compute u1*mG + u2*mQ = mG */
  5745. err = wc_ecc_mulmod_ex(u1, mG, mG, curve->Af, curve->prime, 0,
  5746. key->heap);
  5747. if (err == MP_OKAY) {
  5748. err = wc_ecc_mulmod_ex(u2, mQ, mQ, curve->Af, curve->prime, 0,
  5749. key->heap);
  5750. }
  5751. /* find the montgomery mp */
  5752. if (err == MP_OKAY)
  5753. err = mp_montgomery_setup(curve->prime, &mp);
  5754. /* add them */
  5755. if (err == MP_OKAY)
  5756. err = ecc_projective_add_point(mQ, mG, mG, curve->Af,
  5757. curve->prime, mp);
  5758. if (err == MP_OKAY && mp_iszero(mG->z)) {
  5759. /* When all zero then should have done an add */
  5760. if (mp_iszero(mG->x) && mp_iszero(mG->y)) {
  5761. err = ecc_projective_dbl_point(mQ, mG, curve->Af,
  5762. curve->prime, mp);
  5763. }
  5764. /* When only Z zero then result is infinity */
  5765. else {
  5766. err = mp_set(mG->x, 0);
  5767. if (err == MP_OKAY)
  5768. err = mp_set(mG->y, 0);
  5769. if (err == MP_OKAY)
  5770. err = mp_set(mG->z, 1);
  5771. }
  5772. }
  5773. }
  5774. else {
  5775. /* compute 0*mG + u2*mQ = mG */
  5776. err = wc_ecc_mulmod_ex(u2, mQ, mG, curve->Af, curve->prime, 0,
  5777. key->heap);
  5778. /* find the montgomery mp */
  5779. if (err == MP_OKAY)
  5780. err = mp_montgomery_setup(curve->prime, &mp);
  5781. }
  5782. /* reduce */
  5783. if (err == MP_OKAY)
  5784. err = ecc_map(mG, curve->prime, mp);
  5785. }
  5786. #else
  5787. /* use Shamir's trick to compute u1*mG + u2*mQ using half the doubles */
  5788. if (err == MP_OKAY) {
  5789. err = ecc_mul2add(mG, u1, mQ, u2, mG, curve->Af, curve->prime,
  5790. key->heap);
  5791. }
  5792. #endif /* ECC_SHAMIR */
  5793. #endif /* FREESCALE_LTC_ECC */
  5794. /* v = X_x1 mod n */
  5795. if (err == MP_OKAY)
  5796. err = mp_mod(mG->x, curve->order, v);
  5797. /* does v == r */
  5798. if (err == MP_OKAY) {
  5799. if (mp_cmp(v, r) == MP_EQ)
  5800. *res = 1;
  5801. }
  5802. /* cleanup */
  5803. wc_ecc_del_point_h(mG, key->heap);
  5804. wc_ecc_del_point_h(mQ, key->heap);
  5805. mp_clear(e);
  5806. if (did_init) {
  5807. mp_clear(v);
  5808. mp_clear(w);
  5809. mp_clear(u1);
  5810. mp_clear(u2);
  5811. }
  5812. #ifdef WOLFSSL_SMALL_STACK
  5813. XFREE(u2, key->heap, DYNAMIC_TYPE_ECC);
  5814. XFREE(u1, key->heap, DYNAMIC_TYPE_ECC);
  5815. XFREE(w, key->heap, DYNAMIC_TYPE_ECC);
  5816. XFREE(v, key->heap, DYNAMIC_TYPE_ECC);
  5817. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  5818. XFREE(e_lcl, key->heap, DYNAMIC_TYPE_ECC);
  5819. #endif
  5820. #endif
  5821. wc_ecc_curve_free(curve);
  5822. FREE_CURVE_SPECS();
  5823. #endif /* !WOLFSSL_SP_MATH || FREESCALE_LTC_ECC */
  5824. #endif /* WOLFSSL_ATECC508A */
  5825. (void)keySz;
  5826. (void)hashlen;
  5827. return err;
  5828. }
  5829. #endif /* WOLFSSL_STM32_PKA */
  5830. #endif /* HAVE_ECC_VERIFY */
  5831. #ifdef HAVE_ECC_KEY_IMPORT
  5832. /* import point from der
  5833. * if shortKeySize != 0 then keysize is always (inLen-1)>>1 */
  5834. int wc_ecc_import_point_der_ex(byte* in, word32 inLen, const int curve_idx,
  5835. ecc_point* point, int shortKeySize)
  5836. {
  5837. int err = 0;
  5838. #ifdef HAVE_COMP_KEY
  5839. int compressed = 0;
  5840. #endif
  5841. int keysize;
  5842. byte pointType;
  5843. #ifndef HAVE_COMP_KEY
  5844. (void)shortKeySize;
  5845. #endif
  5846. if (in == NULL || point == NULL || (curve_idx < 0) ||
  5847. (wc_ecc_is_valid_idx(curve_idx) == 0))
  5848. return ECC_BAD_ARG_E;
  5849. /* must be odd */
  5850. if ((inLen & 1) == 0) {
  5851. return ECC_BAD_ARG_E;
  5852. }
  5853. /* init point */
  5854. #ifdef ALT_ECC_SIZE
  5855. point->x = (mp_int*)&point->xyz[0];
  5856. point->y = (mp_int*)&point->xyz[1];
  5857. point->z = (mp_int*)&point->xyz[2];
  5858. alt_fp_init(point->x);
  5859. alt_fp_init(point->y);
  5860. alt_fp_init(point->z);
  5861. #else
  5862. err = mp_init_multi(point->x, point->y, point->z, NULL, NULL, NULL);
  5863. #endif
  5864. if (err != MP_OKAY)
  5865. return MEMORY_E;
  5866. /* check for point type (4, 2, or 3) */
  5867. pointType = in[0];
  5868. if (pointType != ECC_POINT_UNCOMP && pointType != ECC_POINT_COMP_EVEN &&
  5869. pointType != ECC_POINT_COMP_ODD) {
  5870. err = ASN_PARSE_E;
  5871. }
  5872. if (pointType == ECC_POINT_COMP_EVEN || pointType == ECC_POINT_COMP_ODD) {
  5873. #ifdef HAVE_COMP_KEY
  5874. compressed = 1;
  5875. #else
  5876. err = NOT_COMPILED_IN;
  5877. #endif
  5878. }
  5879. /* adjust to skip first byte */
  5880. inLen -= 1;
  5881. in += 1;
  5882. /* calculate key size based on inLen / 2 if uncompressed or shortKeySize
  5883. * is true */
  5884. #ifdef HAVE_COMP_KEY
  5885. keysize = compressed && !shortKeySize ? inLen : inLen>>1;
  5886. #else
  5887. keysize = inLen>>1;
  5888. #endif
  5889. /* read data */
  5890. if (err == MP_OKAY)
  5891. err = mp_read_unsigned_bin(point->x, (byte*)in, keysize);
  5892. #ifdef HAVE_COMP_KEY
  5893. if (err == MP_OKAY && compressed == 1) { /* build y */
  5894. #ifndef WOLFSSL_SP_MATH
  5895. int did_init = 0;
  5896. mp_int t1, t2;
  5897. DECLARE_CURVE_SPECS(curve, 3);
  5898. ALLOC_CURVE_SPECS(3);
  5899. if (mp_init_multi(&t1, &t2, NULL, NULL, NULL, NULL) != MP_OKAY)
  5900. err = MEMORY_E;
  5901. else
  5902. did_init = 1;
  5903. /* load curve info */
  5904. if (err == MP_OKAY)
  5905. err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve,
  5906. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  5907. ECC_CURVE_FIELD_BF));
  5908. /* compute x^3 */
  5909. if (err == MP_OKAY)
  5910. err = mp_sqr(point->x, &t1);
  5911. if (err == MP_OKAY)
  5912. err = mp_mulmod(&t1, point->x, curve->prime, &t1);
  5913. /* compute x^3 + a*x */
  5914. if (err == MP_OKAY)
  5915. err = mp_mulmod(curve->Af, point->x, curve->prime, &t2);
  5916. if (err == MP_OKAY)
  5917. err = mp_add(&t1, &t2, &t1);
  5918. /* compute x^3 + a*x + b */
  5919. if (err == MP_OKAY)
  5920. err = mp_add(&t1, curve->Bf, &t1);
  5921. /* compute sqrt(x^3 + a*x + b) */
  5922. if (err == MP_OKAY)
  5923. err = mp_sqrtmod_prime(&t1, curve->prime, &t2);
  5924. /* adjust y */
  5925. if (err == MP_OKAY) {
  5926. if ((mp_isodd(&t2) == MP_YES && pointType == ECC_POINT_COMP_ODD) ||
  5927. (mp_isodd(&t2) == MP_NO && pointType == ECC_POINT_COMP_EVEN)) {
  5928. err = mp_mod(&t2, curve->prime, point->y);
  5929. }
  5930. else {
  5931. err = mp_submod(curve->prime, &t2, curve->prime, point->y);
  5932. }
  5933. }
  5934. if (did_init) {
  5935. mp_clear(&t2);
  5936. mp_clear(&t1);
  5937. }
  5938. wc_ecc_curve_free(curve);
  5939. FREE_CURVE_SPECS();
  5940. #else
  5941. #ifndef WOLFSSL_SP_NO_256
  5942. if (curve_idx != ECC_CUSTOM_IDX &&
  5943. ecc_sets[curve_idx].id == ECC_SECP256R1) {
  5944. sp_ecc_uncompress_256(point->x, pointType, point->y);
  5945. }
  5946. else
  5947. #endif
  5948. #ifdef WOLFSSL_SP_384
  5949. if (curve_idx != ECC_CUSTOM_IDX &&
  5950. ecc_sets[curve_idx].id == ECC_SECP384R1) {
  5951. sp_ecc_uncompress_384(point->x, pointType, point->y);
  5952. }
  5953. else
  5954. #endif
  5955. {
  5956. err = WC_KEY_SIZE_E;
  5957. }
  5958. #endif
  5959. }
  5960. #endif
  5961. if (err == MP_OKAY) {
  5962. #ifdef HAVE_COMP_KEY
  5963. if (compressed == 0)
  5964. #endif
  5965. err = mp_read_unsigned_bin(point->y, (byte*)in + keysize, keysize);
  5966. }
  5967. if (err == MP_OKAY)
  5968. err = mp_set(point->z, 1);
  5969. if (err != MP_OKAY) {
  5970. mp_clear(point->x);
  5971. mp_clear(point->y);
  5972. mp_clear(point->z);
  5973. }
  5974. return err;
  5975. }
  5976. /* function for backwards compatiblity with previous implementations */
  5977. int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx,
  5978. ecc_point* point)
  5979. {
  5980. return wc_ecc_import_point_der_ex(in, inLen, curve_idx, point, 1);
  5981. }
  5982. #endif /* HAVE_ECC_KEY_IMPORT */
  5983. #ifdef HAVE_ECC_KEY_EXPORT
  5984. /* export point to der */
  5985. int wc_ecc_export_point_der_ex(const int curve_idx, ecc_point* point, byte* out,
  5986. word32* outLen, int compressed)
  5987. {
  5988. if (compressed == 0)
  5989. return wc_ecc_export_point_der(curve_idx, point, out, outLen);
  5990. #ifdef HAVE_COMP_KEY
  5991. else
  5992. return wc_ecc_export_point_der_compressed(curve_idx, point, out, outLen);
  5993. #else
  5994. return NOT_COMPILED_IN;
  5995. #endif
  5996. }
  5997. int wc_ecc_export_point_der(const int curve_idx, ecc_point* point, byte* out,
  5998. word32* outLen)
  5999. {
  6000. int ret = MP_OKAY;
  6001. word32 numlen;
  6002. #ifdef WOLFSSL_SMALL_STACK
  6003. byte* buf;
  6004. #else
  6005. byte buf[ECC_BUFSIZE];
  6006. #endif
  6007. if ((curve_idx < 0) || (wc_ecc_is_valid_idx(curve_idx) == 0))
  6008. return ECC_BAD_ARG_E;
  6009. numlen = ecc_sets[curve_idx].size;
  6010. /* return length needed only */
  6011. if (point != NULL && out == NULL && outLen != NULL) {
  6012. *outLen = 1 + 2*numlen;
  6013. return LENGTH_ONLY_E;
  6014. }
  6015. if (point == NULL || out == NULL || outLen == NULL)
  6016. return ECC_BAD_ARG_E;
  6017. if (*outLen < (1 + 2*numlen)) {
  6018. *outLen = 1 + 2*numlen;
  6019. return BUFFER_E;
  6020. }
  6021. /* store byte point type */
  6022. out[0] = ECC_POINT_UNCOMP;
  6023. #ifdef WOLFSSL_SMALL_STACK
  6024. buf = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  6025. if (buf == NULL)
  6026. return MEMORY_E;
  6027. #endif
  6028. /* pad and store x */
  6029. XMEMSET(buf, 0, ECC_BUFSIZE);
  6030. ret = mp_to_unsigned_bin(point->x, buf +
  6031. (numlen - mp_unsigned_bin_size(point->x)));
  6032. if (ret != MP_OKAY)
  6033. goto done;
  6034. XMEMCPY(out+1, buf, numlen);
  6035. /* pad and store y */
  6036. XMEMSET(buf, 0, ECC_BUFSIZE);
  6037. ret = mp_to_unsigned_bin(point->y, buf +
  6038. (numlen - mp_unsigned_bin_size(point->y)));
  6039. if (ret != MP_OKAY)
  6040. goto done;
  6041. XMEMCPY(out+1+numlen, buf, numlen);
  6042. *outLen = 1 + 2*numlen;
  6043. done:
  6044. #ifdef WOLFSSL_SMALL_STACK
  6045. XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  6046. #endif
  6047. return ret;
  6048. }
  6049. /* export point to der */
  6050. #ifdef HAVE_COMP_KEY
  6051. int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point,
  6052. byte* out, word32* outLen)
  6053. {
  6054. int ret = MP_OKAY;
  6055. word32 numlen;
  6056. word32 output_len;
  6057. #ifdef WOLFSSL_SMALL_STACK
  6058. byte* buf;
  6059. #else
  6060. byte buf[ECC_BUFSIZE];
  6061. #endif
  6062. if ((curve_idx < 0) || (wc_ecc_is_valid_idx(curve_idx) == 0))
  6063. return ECC_BAD_ARG_E;
  6064. numlen = ecc_sets[curve_idx].size;
  6065. output_len = 1 + numlen; /* y point type + x */
  6066. /* return length needed only */
  6067. if (point != NULL && out == NULL && outLen != NULL) {
  6068. *outLen = output_len;
  6069. return LENGTH_ONLY_E;
  6070. }
  6071. if (point == NULL || out == NULL || outLen == NULL)
  6072. return ECC_BAD_ARG_E;
  6073. if (*outLen < output_len) {
  6074. *outLen = output_len;
  6075. return BUFFER_E;
  6076. }
  6077. /* store byte point type */
  6078. out[0] = mp_isodd(point->y) == MP_YES ? ECC_POINT_COMP_ODD :
  6079. ECC_POINT_COMP_EVEN;
  6080. #ifdef WOLFSSL_SMALL_STACK
  6081. buf = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  6082. if (buf == NULL)
  6083. return MEMORY_E;
  6084. #endif
  6085. /* pad and store x */
  6086. XMEMSET(buf, 0, ECC_BUFSIZE);
  6087. ret = mp_to_unsigned_bin(point->x, buf +
  6088. (numlen - mp_unsigned_bin_size(point->x)));
  6089. if (ret != MP_OKAY)
  6090. goto done;
  6091. XMEMCPY(out+1, buf, numlen);
  6092. *outLen = output_len;
  6093. done:
  6094. #ifdef WOLFSSL_SMALL_STACK
  6095. XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  6096. #endif
  6097. return ret;
  6098. }
  6099. #endif /* HAVE_COMP_KEY */
  6100. /* export public ECC key in ANSI X9.63 format */
  6101. int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen)
  6102. {
  6103. int ret = MP_OKAY;
  6104. word32 numlen;
  6105. #ifdef WOLFSSL_SMALL_STACK
  6106. byte* buf;
  6107. #else
  6108. byte buf[ECC_BUFSIZE];
  6109. #endif
  6110. word32 pubxlen, pubylen;
  6111. /* return length needed only */
  6112. if (key != NULL && out == NULL && outLen != NULL) {
  6113. /* if key hasn't been setup assume max bytes for size estimation */
  6114. numlen = key->dp ? key->dp->size : MAX_ECC_BYTES;
  6115. *outLen = 1 + 2*numlen;
  6116. return LENGTH_ONLY_E;
  6117. }
  6118. if (key == NULL || out == NULL || outLen == NULL)
  6119. return ECC_BAD_ARG_E;
  6120. if (key->type == ECC_PRIVATEKEY_ONLY)
  6121. return ECC_PRIVATEONLY_E;
  6122. if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) {
  6123. return ECC_BAD_ARG_E;
  6124. }
  6125. numlen = key->dp->size;
  6126. /* verify room in out buffer */
  6127. if (*outLen < (1 + 2*numlen)) {
  6128. *outLen = 1 + 2*numlen;
  6129. return BUFFER_E;
  6130. }
  6131. /* verify public key length is less than key size */
  6132. pubxlen = mp_unsigned_bin_size(key->pubkey.x);
  6133. pubylen = mp_unsigned_bin_size(key->pubkey.y);
  6134. if ((pubxlen > numlen) || (pubylen > numlen)) {
  6135. WOLFSSL_MSG("Public key x/y invalid!");
  6136. return BUFFER_E;
  6137. }
  6138. /* store byte point type */
  6139. out[0] = ECC_POINT_UNCOMP;
  6140. #ifdef WOLFSSL_SMALL_STACK
  6141. buf = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  6142. if (buf == NULL)
  6143. return MEMORY_E;
  6144. #endif
  6145. /* pad and store x */
  6146. XMEMSET(buf, 0, ECC_BUFSIZE);
  6147. ret = mp_to_unsigned_bin(key->pubkey.x, buf + (numlen - pubxlen));
  6148. if (ret != MP_OKAY)
  6149. goto done;
  6150. XMEMCPY(out+1, buf, numlen);
  6151. /* pad and store y */
  6152. XMEMSET(buf, 0, ECC_BUFSIZE);
  6153. ret = mp_to_unsigned_bin(key->pubkey.y, buf + (numlen - pubylen));
  6154. if (ret != MP_OKAY)
  6155. goto done;
  6156. XMEMCPY(out+1+numlen, buf, numlen);
  6157. *outLen = 1 + 2*numlen;
  6158. done:
  6159. #ifdef WOLFSSL_SMALL_STACK
  6160. XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  6161. #endif
  6162. return ret;
  6163. }
  6164. /* export public ECC key in ANSI X9.63 format, extended with
  6165. * compression option */
  6166. int wc_ecc_export_x963_ex(ecc_key* key, byte* out, word32* outLen,
  6167. int compressed)
  6168. {
  6169. if (compressed == 0)
  6170. return wc_ecc_export_x963(key, out, outLen);
  6171. #ifdef HAVE_COMP_KEY
  6172. else
  6173. return wc_ecc_export_x963_compressed(key, out, outLen);
  6174. #else
  6175. return NOT_COMPILED_IN;
  6176. #endif
  6177. }
  6178. #endif /* HAVE_ECC_KEY_EXPORT */
  6179. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  6180. !defined(WOLFSSL_CRYPTOCELL)
  6181. /* is ecc point on curve described by dp ? */
  6182. int wc_ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
  6183. {
  6184. #ifndef WOLFSSL_SP_MATH
  6185. int err;
  6186. #ifdef WOLFSSL_SMALL_STACK
  6187. mp_int* t1;
  6188. mp_int* t2;
  6189. #else
  6190. mp_int t1[1], t2[1];
  6191. #endif
  6192. #ifdef WOLFSSL_SMALL_STACK
  6193. t1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  6194. if (t1 == NULL)
  6195. return MEMORY_E;
  6196. t2 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  6197. if (t2 == NULL) {
  6198. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  6199. return MEMORY_E;
  6200. }
  6201. #endif
  6202. if ((err = mp_init_multi(t1, t2, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  6203. #ifdef WOLFSSL_SMALL_STACK
  6204. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  6205. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  6206. #endif
  6207. return err;
  6208. }
  6209. /* compute y^2 */
  6210. if (err == MP_OKAY)
  6211. err = mp_sqr(ecp->y, t1);
  6212. /* compute x^3 */
  6213. if (err == MP_OKAY)
  6214. err = mp_sqr(ecp->x, t2);
  6215. if (err == MP_OKAY)
  6216. err = mp_mod(t2, prime, t2);
  6217. if (err == MP_OKAY)
  6218. err = mp_mul(ecp->x, t2, t2);
  6219. /* compute y^2 - x^3 */
  6220. if (err == MP_OKAY)
  6221. err = mp_sub(t1, t2, t1);
  6222. /* Determine if curve "a" should be used in calc */
  6223. #ifdef WOLFSSL_CUSTOM_CURVES
  6224. if (err == MP_OKAY) {
  6225. /* Use a and prime to determine if a == 3 */
  6226. err = mp_set(t2, 0);
  6227. if (err == MP_OKAY)
  6228. err = mp_submod(prime, a, prime, t2);
  6229. }
  6230. if (err == MP_OKAY && mp_cmp_d(t2, 3) != MP_EQ) {
  6231. /* compute y^2 - x^3 + a*x */
  6232. if (err == MP_OKAY)
  6233. err = mp_mulmod(t2, ecp->x, prime, t2);
  6234. if (err == MP_OKAY)
  6235. err = mp_addmod(t1, t2, prime, t1);
  6236. }
  6237. else
  6238. #endif /* WOLFSSL_CUSTOM_CURVES */
  6239. {
  6240. /* assumes "a" == 3 */
  6241. (void)a;
  6242. /* compute y^2 - x^3 + 3x */
  6243. if (err == MP_OKAY)
  6244. err = mp_add(t1, ecp->x, t1);
  6245. if (err == MP_OKAY)
  6246. err = mp_add(t1, ecp->x, t1);
  6247. if (err == MP_OKAY)
  6248. err = mp_add(t1, ecp->x, t1);
  6249. if (err == MP_OKAY)
  6250. err = mp_mod(t1, prime, t1);
  6251. }
  6252. /* adjust range (0, prime) */
  6253. while (err == MP_OKAY && mp_isneg(t1)) {
  6254. err = mp_add(t1, prime, t1);
  6255. }
  6256. while (err == MP_OKAY && mp_cmp(t1, prime) != MP_LT) {
  6257. err = mp_sub(t1, prime, t1);
  6258. }
  6259. /* compare to b */
  6260. if (err == MP_OKAY) {
  6261. if (mp_cmp(t1, b) != MP_EQ) {
  6262. err = IS_POINT_E;
  6263. } else {
  6264. err = MP_OKAY;
  6265. }
  6266. }
  6267. mp_clear(t1);
  6268. mp_clear(t2);
  6269. #ifdef WOLFSSL_SMALL_STACK
  6270. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  6271. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  6272. #endif
  6273. return err;
  6274. #else
  6275. (void)a;
  6276. (void)b;
  6277. #ifndef WOLFSSL_SP_NO_256
  6278. if (mp_count_bits(prime) == 256) {
  6279. return sp_ecc_is_point_256(ecp->x, ecp->y);
  6280. }
  6281. #endif
  6282. #ifdef WOLFSSL_SP_384
  6283. if (mp_count_bits(prime) == 384) {
  6284. return sp_ecc_is_point_384(ecp->x, ecp->y);
  6285. }
  6286. #endif
  6287. return WC_KEY_SIZE_E;
  6288. #endif
  6289. }
  6290. #ifndef WOLFSSL_SP_MATH
  6291. /* validate privkey * generator == pubkey, 0 on success */
  6292. static int ecc_check_privkey_gen(ecc_key* key, mp_int* a, mp_int* prime)
  6293. {
  6294. int err = MP_OKAY;
  6295. ecc_point* base = NULL;
  6296. ecc_point* res = NULL;
  6297. DECLARE_CURVE_SPECS(curve, 3);
  6298. if (key == NULL)
  6299. return BAD_FUNC_ARG;
  6300. ALLOC_CURVE_SPECS(3);
  6301. res = wc_ecc_new_point_h(key->heap);
  6302. if (res == NULL)
  6303. err = MEMORY_E;
  6304. #ifdef WOLFSSL_HAVE_SP_ECC
  6305. #ifndef WOLFSSL_SP_NO_256
  6306. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  6307. if (err == MP_OKAY) {
  6308. err = sp_ecc_mulmod_base_256(&key->k, res, 1, key->heap);
  6309. }
  6310. }
  6311. else
  6312. #endif
  6313. #ifdef WOLFSSL_SP_384
  6314. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  6315. if (err == MP_OKAY) {
  6316. err = sp_ecc_mulmod_base_384(&key->k, res, 1, key->heap);
  6317. }
  6318. }
  6319. else
  6320. #endif
  6321. #endif
  6322. {
  6323. base = wc_ecc_new_point_h(key->heap);
  6324. if (base == NULL)
  6325. err = MEMORY_E;
  6326. if (err == MP_OKAY) {
  6327. /* load curve info */
  6328. err = wc_ecc_curve_load(key->dp, &curve, (ECC_CURVE_FIELD_GX |
  6329. ECC_CURVE_FIELD_GY | ECC_CURVE_FIELD_ORDER));
  6330. }
  6331. /* set up base generator */
  6332. if (err == MP_OKAY)
  6333. err = mp_copy(curve->Gx, base->x);
  6334. if (err == MP_OKAY)
  6335. err = mp_copy(curve->Gy, base->y);
  6336. if (err == MP_OKAY)
  6337. err = mp_set(base->z, 1);
  6338. #ifdef ECC_TIMING_RESISTANT
  6339. if (err == MP_OKAY)
  6340. err = wc_ecc_mulmod_ex2(&key->k, base, res, a, prime, curve->order,
  6341. key->rng, 1, key->heap);
  6342. #else
  6343. if (err == MP_OKAY)
  6344. err = wc_ecc_mulmod_ex2(&key->k, base, res, a, prime, curve->order,
  6345. NULL, 1, key->heap);
  6346. #endif
  6347. }
  6348. if (err == MP_OKAY) {
  6349. /* compare result to public key */
  6350. if (mp_cmp(res->x, key->pubkey.x) != MP_EQ ||
  6351. mp_cmp(res->y, key->pubkey.y) != MP_EQ ||
  6352. mp_cmp(res->z, key->pubkey.z) != MP_EQ) {
  6353. /* didn't match */
  6354. err = ECC_PRIV_KEY_E;
  6355. }
  6356. }
  6357. wc_ecc_curve_free(curve);
  6358. wc_ecc_del_point_h(res, key->heap);
  6359. wc_ecc_del_point_h(base, key->heap);
  6360. FREE_CURVE_SPECS();
  6361. return err;
  6362. }
  6363. #endif
  6364. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  6365. /* check privkey generator helper, creates prime needed */
  6366. static int ecc_check_privkey_gen_helper(ecc_key* key)
  6367. {
  6368. int err;
  6369. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A)
  6370. DECLARE_CURVE_SPECS(curve, 2);
  6371. #endif
  6372. if (key == NULL)
  6373. return BAD_FUNC_ARG;
  6374. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  6375. /* Hardware based private key, so this operation is not supported */
  6376. err = MP_OKAY; /* just report success */
  6377. #else
  6378. ALLOC_CURVE_SPECS(2);
  6379. /* load curve info */
  6380. err = wc_ecc_curve_load(key->dp, &curve,
  6381. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF));
  6382. if (err == MP_OKAY)
  6383. err = ecc_check_privkey_gen(key, curve->Af, curve->prime);
  6384. wc_ecc_curve_free(curve);
  6385. FREE_CURVE_SPECS();
  6386. #endif /* WOLFSSL_ATECC508A */
  6387. return err;
  6388. }
  6389. #endif /* WOLFSSL_VALIDATE_ECC_IMPORT */
  6390. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || !defined(WOLFSSL_SP_MATH)
  6391. /* validate order * pubkey = point at infinity, 0 on success */
  6392. static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
  6393. mp_int* prime, mp_int* order)
  6394. {
  6395. ecc_point* inf = NULL;
  6396. int err;
  6397. if (key == NULL)
  6398. return BAD_FUNC_ARG;
  6399. inf = wc_ecc_new_point_h(key->heap);
  6400. if (inf == NULL)
  6401. err = MEMORY_E;
  6402. else {
  6403. #ifdef WOLFSSL_HAVE_SP_ECC
  6404. #ifndef WOLFSSL_SP_NO_256
  6405. if (key->idx != ECC_CUSTOM_IDX &&
  6406. ecc_sets[key->idx].id == ECC_SECP256R1) {
  6407. err = sp_ecc_mulmod_256(order, pubkey, inf, 1, key->heap);
  6408. }
  6409. else
  6410. #endif
  6411. #ifdef WOLFSSL_SP_384
  6412. if (key->idx != ECC_CUSTOM_IDX &&
  6413. ecc_sets[key->idx].id == ECC_SECP384R1) {
  6414. err = sp_ecc_mulmod_384(order, pubkey, inf, 1, key->heap);
  6415. }
  6416. else
  6417. #endif
  6418. #endif
  6419. #ifndef WOLFSSL_SP_MATH
  6420. err = wc_ecc_mulmod_ex(order, pubkey, inf, a, prime, 1, key->heap);
  6421. if (err == MP_OKAY && !wc_ecc_point_is_at_infinity(inf))
  6422. err = ECC_INF_E;
  6423. #else
  6424. (void)a;
  6425. (void)prime;
  6426. err = WC_KEY_SIZE_E;
  6427. #endif
  6428. }
  6429. wc_ecc_del_point_h(inf, key->heap);
  6430. return err;
  6431. }
  6432. #endif
  6433. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL*/
  6434. #ifdef OPENSSL_EXTRA
  6435. int wc_ecc_get_generator(ecc_point* ecp, int curve_idx)
  6436. {
  6437. int err = MP_OKAY;
  6438. DECLARE_CURVE_SPECS(curve, 2);
  6439. if (!ecp || curve_idx < 0 || curve_idx > (int)(ECC_SET_COUNT-1))
  6440. return BAD_FUNC_ARG;
  6441. ALLOC_CURVE_SPECS(2);
  6442. err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve,
  6443. (ECC_CURVE_FIELD_GX | ECC_CURVE_FIELD_GY));
  6444. if (err == MP_OKAY)
  6445. err = mp_copy(curve->Gx, ecp->x);
  6446. if (err == MP_OKAY)
  6447. err = mp_copy(curve->Gy, ecp->y);
  6448. if (err == MP_OKAY)
  6449. err = mp_set(ecp->z, 1);
  6450. wc_ecc_curve_free(curve);
  6451. FREE_CURVE_SPECS();
  6452. return err;
  6453. }
  6454. #endif /* OPENSSLALL */
  6455. /* perform sanity checks on ecc key validity, 0 on success */
  6456. int wc_ecc_check_key(ecc_key* key)
  6457. {
  6458. int err;
  6459. #ifndef WOLFSSL_SP_MATH
  6460. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  6461. !defined(WOLFSSL_CRYPTOCELL)
  6462. mp_int* b = NULL;
  6463. #ifdef USE_ECC_B_PARAM
  6464. DECLARE_CURVE_SPECS(curve, 4);
  6465. #else
  6466. #ifndef WOLFSSL_SMALL_STACK
  6467. mp_int b_lcl;
  6468. #endif
  6469. DECLARE_CURVE_SPECS(curve, 3);
  6470. #endif /* USE_ECC_B_PARAM */
  6471. #endif /* WOLFSSL_ATECC508A */
  6472. if (key == NULL)
  6473. return BAD_FUNC_ARG;
  6474. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  6475. defined(WOLFSSL_CRYPTOCELL)
  6476. err = 0; /* consider key check success on ATECC508/608A */
  6477. #else
  6478. #ifdef USE_ECC_B_PARAM
  6479. ALLOC_CURVE_SPECS(4);
  6480. #else
  6481. ALLOC_CURVE_SPECS(3);
  6482. #ifndef WOLFSSL_SMALL_STACK
  6483. b = &b_lcl;
  6484. #else
  6485. b = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  6486. if (b == NULL) {
  6487. FREE_CURVE_SPECS();
  6488. return MEMORY_E;
  6489. }
  6490. #endif
  6491. XMEMSET(b, 0, sizeof(mp_int));
  6492. #endif
  6493. /* SP 800-56Ar3, section 5.6.2.3.3, process step 1 */
  6494. /* pubkey point cannot be at infinity */
  6495. if (wc_ecc_point_is_at_infinity(&key->pubkey)) {
  6496. #ifdef WOLFSSL_SMALL_STACK
  6497. XFREE(b, key->heap, DYNAMIC_TYPE_ECC);
  6498. #endif
  6499. FREE_CURVE_SPECS();
  6500. return ECC_INF_E;
  6501. }
  6502. /* load curve info */
  6503. err = wc_ecc_curve_load(key->dp, &curve, (ECC_CURVE_FIELD_PRIME |
  6504. ECC_CURVE_FIELD_AF | ECC_CURVE_FIELD_ORDER
  6505. #ifdef USE_ECC_B_PARAM
  6506. | ECC_CURVE_FIELD_BF
  6507. #endif
  6508. ));
  6509. #ifndef USE_ECC_B_PARAM
  6510. /* load curve b parameter */
  6511. if (err == MP_OKAY)
  6512. err = mp_init(b);
  6513. if (err == MP_OKAY)
  6514. err = mp_read_radix(b, key->dp->Bf, MP_RADIX_HEX);
  6515. #else
  6516. if (err == MP_OKAY)
  6517. b = curve->Bf;
  6518. #endif
  6519. /* SP 800-56Ar3, section 5.6.2.3.3, process step 2 */
  6520. /* Qx must be in the range [0, p-1] */
  6521. if (err == MP_OKAY) {
  6522. if (mp_cmp(key->pubkey.x, curve->prime) != MP_LT)
  6523. err = ECC_OUT_OF_RANGE_E;
  6524. }
  6525. /* Qy must be in the range [0, p-1] */
  6526. if (err == MP_OKAY) {
  6527. if (mp_cmp(key->pubkey.y, curve->prime) != MP_LT)
  6528. err = ECC_OUT_OF_RANGE_E;
  6529. }
  6530. /* SP 800-56Ar3, section 5.6.2.3.3, process steps 3 */
  6531. /* make sure point is actually on curve */
  6532. if (err == MP_OKAY)
  6533. err = wc_ecc_is_point(&key->pubkey, curve->Af, b, curve->prime);
  6534. /* SP 800-56Ar3, section 5.6.2.3.3, process steps 4 */
  6535. /* pubkey * order must be at infinity */
  6536. if (err == MP_OKAY)
  6537. err = ecc_check_pubkey_order(key, &key->pubkey, curve->Af, curve->prime,
  6538. curve->order);
  6539. /* SP 800-56Ar3, section 5.6.2.1.4, method (b) for ECC */
  6540. /* private * base generator must equal pubkey */
  6541. if (err == MP_OKAY && key->type == ECC_PRIVATEKEY)
  6542. err = ecc_check_privkey_gen(key, curve->Af, curve->prime);
  6543. wc_ecc_curve_free(curve);
  6544. #ifndef USE_ECC_B_PARAM
  6545. mp_clear(b);
  6546. #ifdef WOLFSSL_SMALL_STACK
  6547. XFREE(b, key->heap, DYNAMIC_TYPE_ECC);
  6548. #endif
  6549. #endif
  6550. FREE_CURVE_SPECS();
  6551. #endif /* WOLFSSL_ATECC508A */
  6552. #else
  6553. if (key == NULL)
  6554. return BAD_FUNC_ARG;
  6555. /* pubkey point cannot be at infinity */
  6556. #ifndef WOLFSSL_SP_NO_256
  6557. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  6558. err = sp_ecc_check_key_256(key->pubkey.x, key->pubkey.y, &key->k,
  6559. key->heap);
  6560. }
  6561. else
  6562. #endif
  6563. #ifdef WOLFSSL_SP_384
  6564. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  6565. err = sp_ecc_check_key_384(key->pubkey.x, key->pubkey.y, &key->k,
  6566. key->heap);
  6567. }
  6568. else
  6569. #endif
  6570. {
  6571. err = WC_KEY_SIZE_E;
  6572. }
  6573. #endif
  6574. return err;
  6575. }
  6576. #ifdef HAVE_ECC_KEY_IMPORT
  6577. /* import public ECC key in ANSI X9.63 format */
  6578. int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key,
  6579. int curve_id)
  6580. {
  6581. int err = MP_OKAY;
  6582. #ifdef HAVE_COMP_KEY
  6583. int compressed = 0;
  6584. #endif
  6585. int keysize = 0;
  6586. byte pointType;
  6587. if (in == NULL || key == NULL)
  6588. return BAD_FUNC_ARG;
  6589. /* must be odd */
  6590. if ((inLen & 1) == 0) {
  6591. return ECC_BAD_ARG_E;
  6592. }
  6593. /* make sure required variables are reset */
  6594. wc_ecc_reset(key);
  6595. /* init key */
  6596. #ifdef ALT_ECC_SIZE
  6597. key->pubkey.x = (mp_int*)&key->pubkey.xyz[0];
  6598. key->pubkey.y = (mp_int*)&key->pubkey.xyz[1];
  6599. key->pubkey.z = (mp_int*)&key->pubkey.xyz[2];
  6600. alt_fp_init(key->pubkey.x);
  6601. alt_fp_init(key->pubkey.y);
  6602. alt_fp_init(key->pubkey.z);
  6603. err = mp_init(&key->k);
  6604. #else
  6605. err = mp_init_multi(&key->k,
  6606. key->pubkey.x, key->pubkey.y, key->pubkey.z, NULL, NULL);
  6607. #endif
  6608. if (err != MP_OKAY)
  6609. return MEMORY_E;
  6610. /* check for point type (4, 2, or 3) */
  6611. pointType = in[0];
  6612. if (pointType != ECC_POINT_UNCOMP && pointType != ECC_POINT_COMP_EVEN &&
  6613. pointType != ECC_POINT_COMP_ODD) {
  6614. err = ASN_PARSE_E;
  6615. }
  6616. if (pointType == ECC_POINT_COMP_EVEN || pointType == ECC_POINT_COMP_ODD) {
  6617. #ifdef HAVE_COMP_KEY
  6618. compressed = 1;
  6619. #else
  6620. err = NOT_COMPILED_IN;
  6621. #endif
  6622. }
  6623. /* adjust to skip first byte */
  6624. inLen -= 1;
  6625. in += 1;
  6626. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  6627. /* For SECP256R1 only save raw public key for hardware */
  6628. if (curve_id == ECC_SECP256R1 && inLen <= sizeof(key->pubkey_raw)) {
  6629. #ifdef HAVE_COMP_KEY
  6630. if (!compressed)
  6631. #endif
  6632. XMEMCPY(key->pubkey_raw, (byte*)in, inLen);
  6633. }
  6634. #endif
  6635. if (err == MP_OKAY) {
  6636. #ifdef HAVE_COMP_KEY
  6637. /* adjust inLen if compressed */
  6638. if (compressed)
  6639. inLen = inLen*2 + 1; /* used uncompressed len */
  6640. #endif
  6641. /* determine key size */
  6642. keysize = (inLen>>1);
  6643. err = wc_ecc_set_curve(key, keysize, curve_id);
  6644. key->type = ECC_PUBLICKEY;
  6645. }
  6646. /* read data */
  6647. if (err == MP_OKAY)
  6648. err = mp_read_unsigned_bin(key->pubkey.x, (byte*)in, keysize);
  6649. #ifdef HAVE_COMP_KEY
  6650. if (err == MP_OKAY && compressed == 1) { /* build y */
  6651. #ifndef WOLFSSL_SP_MATH
  6652. mp_int t1, t2;
  6653. int did_init = 0;
  6654. DECLARE_CURVE_SPECS(curve, 3);
  6655. ALLOC_CURVE_SPECS(3);
  6656. if (mp_init_multi(&t1, &t2, NULL, NULL, NULL, NULL) != MP_OKAY)
  6657. err = MEMORY_E;
  6658. else
  6659. did_init = 1;
  6660. /* load curve info */
  6661. if (err == MP_OKAY)
  6662. err = wc_ecc_curve_load(key->dp, &curve,
  6663. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  6664. ECC_CURVE_FIELD_BF));
  6665. /* compute x^3 */
  6666. if (err == MP_OKAY)
  6667. err = mp_sqr(key->pubkey.x, &t1);
  6668. if (err == MP_OKAY)
  6669. err = mp_mulmod(&t1, key->pubkey.x, curve->prime, &t1);
  6670. /* compute x^3 + a*x */
  6671. if (err == MP_OKAY)
  6672. err = mp_mulmod(curve->Af, key->pubkey.x, curve->prime, &t2);
  6673. if (err == MP_OKAY)
  6674. err = mp_add(&t1, &t2, &t1);
  6675. /* compute x^3 + a*x + b */
  6676. if (err == MP_OKAY)
  6677. err = mp_add(&t1, curve->Bf, &t1);
  6678. /* compute sqrt(x^3 + a*x + b) */
  6679. if (err == MP_OKAY)
  6680. err = mp_sqrtmod_prime(&t1, curve->prime, &t2);
  6681. /* adjust y */
  6682. if (err == MP_OKAY) {
  6683. if ((mp_isodd(&t2) == MP_YES && pointType == ECC_POINT_COMP_ODD) ||
  6684. (mp_isodd(&t2) == MP_NO && pointType == ECC_POINT_COMP_EVEN)) {
  6685. err = mp_mod(&t2, curve->prime, &t2);
  6686. }
  6687. else {
  6688. err = mp_submod(curve->prime, &t2, curve->prime, &t2);
  6689. }
  6690. if (err == MP_OKAY)
  6691. err = mp_copy(&t2, key->pubkey.y);
  6692. }
  6693. if (did_init) {
  6694. mp_clear(&t2);
  6695. mp_clear(&t1);
  6696. }
  6697. wc_ecc_curve_free(curve);
  6698. FREE_CURVE_SPECS();
  6699. #else
  6700. #ifndef WOLFSSL_SP_NO_256
  6701. if (key->dp->id == ECC_SECP256R1) {
  6702. sp_ecc_uncompress_256(key->pubkey.x, pointType, key->pubkey.y);
  6703. }
  6704. else
  6705. #endif
  6706. #ifdef WOLFSSL_SP_384
  6707. if (key->dp->id == ECC_SECP384R1) {
  6708. sp_ecc_uncompress_384(key->pubkey.x, pointType, key->pubkey.y);
  6709. }
  6710. else
  6711. #endif
  6712. {
  6713. err = WC_KEY_SIZE_E;
  6714. }
  6715. #endif
  6716. }
  6717. #endif /* HAVE_COMP_KEY */
  6718. if (err == MP_OKAY) {
  6719. #ifdef HAVE_COMP_KEY
  6720. if (compressed == 0)
  6721. #endif
  6722. {
  6723. err = mp_read_unsigned_bin(key->pubkey.y, (byte*)in + keysize,
  6724. keysize);
  6725. }
  6726. }
  6727. if (err == MP_OKAY)
  6728. err = mp_set(key->pubkey.z, 1);
  6729. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  6730. if (err == MP_OKAY)
  6731. err = wc_ecc_check_key(key);
  6732. #endif
  6733. if (err != MP_OKAY) {
  6734. mp_clear(key->pubkey.x);
  6735. mp_clear(key->pubkey.y);
  6736. mp_clear(key->pubkey.z);
  6737. mp_clear(&key->k);
  6738. }
  6739. return err;
  6740. }
  6741. WOLFSSL_ABI
  6742. int wc_ecc_import_x963(const byte* in, word32 inLen, ecc_key* key)
  6743. {
  6744. return wc_ecc_import_x963_ex(in, inLen, key, ECC_CURVE_DEF);
  6745. }
  6746. #endif /* HAVE_ECC_KEY_IMPORT */
  6747. #ifdef HAVE_ECC_KEY_EXPORT
  6748. /* export ecc key to component form, d is optional if only exporting public
  6749. * encType is WC_TYPE_UNSIGNED_BIN or WC_TYPE_HEX_STR
  6750. * return MP_OKAY on success */
  6751. int wc_ecc_export_ex(ecc_key* key, byte* qx, word32* qxLen,
  6752. byte* qy, word32* qyLen, byte* d, word32* dLen, int encType)
  6753. {
  6754. int err = 0;
  6755. word32 keySz;
  6756. if (key == NULL) {
  6757. return BAD_FUNC_ARG;
  6758. }
  6759. if (wc_ecc_is_valid_idx(key->idx) == 0) {
  6760. return ECC_BAD_ARG_E;
  6761. }
  6762. keySz = key->dp->size;
  6763. /* private key, d */
  6764. if (d != NULL) {
  6765. if (dLen == NULL ||
  6766. (key->type != ECC_PRIVATEKEY && key->type != ECC_PRIVATEKEY_ONLY))
  6767. return BAD_FUNC_ARG;
  6768. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  6769. /* Hardware cannot export private portion */
  6770. return NOT_COMPILED_IN;
  6771. #else
  6772. err = wc_export_int(&key->k, d, dLen, keySz, encType);
  6773. if (err != MP_OKAY)
  6774. return err;
  6775. #endif
  6776. }
  6777. /* public x component */
  6778. if (qx != NULL) {
  6779. if (qxLen == NULL || key->type == ECC_PRIVATEKEY_ONLY)
  6780. return BAD_FUNC_ARG;
  6781. err = wc_export_int(key->pubkey.x, qx, qxLen, keySz, encType);
  6782. if (err != MP_OKAY)
  6783. return err;
  6784. }
  6785. /* public y component */
  6786. if (qy != NULL) {
  6787. if (qyLen == NULL || key->type == ECC_PRIVATEKEY_ONLY)
  6788. return BAD_FUNC_ARG;
  6789. err = wc_export_int(key->pubkey.y, qy, qyLen, keySz, encType);
  6790. if (err != MP_OKAY)
  6791. return err;
  6792. }
  6793. return err;
  6794. }
  6795. /* export ecc private key only raw, outLen is in/out size as unsigned bin
  6796. return MP_OKAY on success */
  6797. int wc_ecc_export_private_only(ecc_key* key, byte* out, word32* outLen)
  6798. {
  6799. if (out == NULL || outLen == NULL) {
  6800. return BAD_FUNC_ARG;
  6801. }
  6802. return wc_ecc_export_ex(key, NULL, NULL, NULL, NULL, out, outLen,
  6803. WC_TYPE_UNSIGNED_BIN);
  6804. }
  6805. /* export public key to raw elements including public (Qx,Qy) as unsigned bin
  6806. * return MP_OKAY on success, negative on error */
  6807. int wc_ecc_export_public_raw(ecc_key* key, byte* qx, word32* qxLen,
  6808. byte* qy, word32* qyLen)
  6809. {
  6810. if (qx == NULL || qxLen == NULL || qy == NULL || qyLen == NULL) {
  6811. return BAD_FUNC_ARG;
  6812. }
  6813. return wc_ecc_export_ex(key, qx, qxLen, qy, qyLen, NULL, NULL,
  6814. WC_TYPE_UNSIGNED_BIN);
  6815. }
  6816. /* export ecc key to raw elements including public (Qx,Qy) and
  6817. * private (d) as unsigned bin
  6818. * return MP_OKAY on success, negative on error */
  6819. int wc_ecc_export_private_raw(ecc_key* key, byte* qx, word32* qxLen,
  6820. byte* qy, word32* qyLen, byte* d, word32* dLen)
  6821. {
  6822. return wc_ecc_export_ex(key, qx, qxLen, qy, qyLen, d, dLen,
  6823. WC_TYPE_UNSIGNED_BIN);
  6824. }
  6825. #endif /* HAVE_ECC_KEY_EXPORT */
  6826. #ifdef HAVE_ECC_KEY_IMPORT
  6827. /* import private key, public part optional if (pub) passed as NULL */
  6828. int wc_ecc_import_private_key_ex(const byte* priv, word32 privSz,
  6829. const byte* pub, word32 pubSz, ecc_key* key,
  6830. int curve_id)
  6831. {
  6832. int ret;
  6833. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  6834. !defined(WOLFSSL_ATECC608A)
  6835. const CRYS_ECPKI_Domain_t* pDomain;
  6836. CRYS_ECPKI_BUILD_TempData_t tempBuff;
  6837. #endif
  6838. if (key == NULL || priv == NULL)
  6839. return BAD_FUNC_ARG;
  6840. /* public optional, NULL if only importing private */
  6841. if (pub != NULL) {
  6842. #ifndef NO_ASN
  6843. word32 idx = 0;
  6844. ret = wc_ecc_import_x963_ex(pub, pubSz, key, curve_id);
  6845. if (ret < 0)
  6846. ret = wc_EccPublicKeyDecode(pub, &idx, key, pubSz);
  6847. key->type = ECC_PRIVATEKEY;
  6848. #else
  6849. ret = NOT_COMPILED_IN;
  6850. #endif
  6851. }
  6852. else {
  6853. /* make sure required variables are reset */
  6854. wc_ecc_reset(key);
  6855. /* set key size */
  6856. ret = wc_ecc_set_curve(key, privSz, curve_id);
  6857. key->type = ECC_PRIVATEKEY_ONLY;
  6858. }
  6859. if (ret != 0)
  6860. return ret;
  6861. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  6862. /* Hardware does not support loading private keys */
  6863. return NOT_COMPILED_IN;
  6864. #elif defined(WOLFSSL_CRYPTOCELL)
  6865. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(curve_id));
  6866. if (pub != NULL && pub[0] != '\0') {
  6867. /* create public key from external key buffer */
  6868. ret = CRYS_ECPKI_BuildPublKeyFullCheck(pDomain,
  6869. (byte*)pub,
  6870. pubSz,
  6871. &key->ctx.pubKey,
  6872. &tempBuff);
  6873. if (ret != SA_SILIB_RET_OK){
  6874. WOLFSSL_MSG("CRYS_ECPKI_BuildPublKeyFullCheck failed");
  6875. return ret;
  6876. }
  6877. }
  6878. /* import private key */
  6879. if (priv != NULL && priv[0] != '\0') {
  6880. /* Create private key from external key buffer*/
  6881. ret = CRYS_ECPKI_BuildPrivKey(pDomain,
  6882. priv,
  6883. privSz,
  6884. &key->ctx.privKey);
  6885. if (ret != SA_SILIB_RET_OK) {
  6886. WOLFSSL_MSG("CRYS_ECPKI_BuildPrivKey failed");
  6887. return ret;
  6888. }
  6889. ret = mp_read_unsigned_bin(&key->k, priv, privSz);
  6890. }
  6891. #else
  6892. ret = mp_read_unsigned_bin(&key->k, priv, privSz);
  6893. #ifdef HAVE_WOLF_BIGINT
  6894. if (ret == 0 &&
  6895. wc_bigint_from_unsigned_bin(&key->k.raw, priv, privSz) != 0) {
  6896. mp_clear(&key->k);
  6897. ret = ASN_GETINT_E;
  6898. }
  6899. #endif /* HAVE_WOLF_BIGINT */
  6900. #endif /* WOLFSSL_ATECC508A */
  6901. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  6902. if ((pub != NULL) && (ret == MP_OKAY))
  6903. /* public key needed to perform key validation */
  6904. ret = ecc_check_privkey_gen_helper(key);
  6905. #endif
  6906. return ret;
  6907. }
  6908. /* ecc private key import, public key in ANSI X9.63 format, private raw */
  6909. int wc_ecc_import_private_key(const byte* priv, word32 privSz, const byte* pub,
  6910. word32 pubSz, ecc_key* key)
  6911. {
  6912. return wc_ecc_import_private_key_ex(priv, privSz, pub, pubSz, key,
  6913. ECC_CURVE_DEF);
  6914. }
  6915. #endif /* HAVE_ECC_KEY_IMPORT */
  6916. #ifndef NO_ASN
  6917. /**
  6918. Convert ECC R,S to signature
  6919. r R component of signature
  6920. s S component of signature
  6921. out DER-encoded ECDSA signature
  6922. outlen [in/out] output buffer size, output signature size
  6923. return MP_OKAY on success
  6924. */
  6925. int wc_ecc_rs_to_sig(const char* r, const char* s, byte* out, word32* outlen)
  6926. {
  6927. int err;
  6928. #ifdef WOLFSSL_SMALL_STACK
  6929. mp_int* rtmp = NULL;
  6930. mp_int* stmp = NULL;
  6931. #else
  6932. mp_int rtmp[1];
  6933. mp_int stmp[1];
  6934. #endif
  6935. if (r == NULL || s == NULL || out == NULL || outlen == NULL)
  6936. return ECC_BAD_ARG_E;
  6937. #ifdef WOLFSSL_SMALL_STACK
  6938. rtmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  6939. if (rtmp == NULL)
  6940. return MEMORY_E;
  6941. stmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  6942. if (stmp == NULL) {
  6943. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  6944. return MEMORY_E;
  6945. }
  6946. #endif
  6947. err = mp_init_multi(rtmp, stmp, NULL, NULL, NULL, NULL);
  6948. if (err != MP_OKAY) {
  6949. #ifdef WOLFSSL_SMALL_STACK
  6950. XFREE(stmp, NULL, DYNAMIC_TYPE_ECC);
  6951. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  6952. #endif
  6953. return err;
  6954. }
  6955. err = mp_read_radix(rtmp, r, MP_RADIX_HEX);
  6956. if (err == MP_OKAY)
  6957. err = mp_read_radix(stmp, s, MP_RADIX_HEX);
  6958. /* convert mp_ints to ECDSA sig, initializes rtmp and stmp internally */
  6959. if (err == MP_OKAY)
  6960. err = StoreECC_DSA_Sig(out, outlen, rtmp, stmp);
  6961. if (err == MP_OKAY) {
  6962. if (mp_iszero(rtmp) == MP_YES || mp_iszero(stmp) == MP_YES)
  6963. err = MP_ZERO_E;
  6964. }
  6965. mp_clear(rtmp);
  6966. mp_clear(stmp);
  6967. #ifdef WOLFSSL_SMALL_STACK
  6968. XFREE(stmp, NULL, DYNAMIC_TYPE_ECC);
  6969. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  6970. #endif
  6971. return err;
  6972. }
  6973. /**
  6974. Convert ECC R,S raw unsigned bin to signature
  6975. r R component of signature
  6976. rSz R size
  6977. s S component of signature
  6978. sSz S size
  6979. out DER-encoded ECDSA signature
  6980. outlen [in/out] output buffer size, output signature size
  6981. return MP_OKAY on success
  6982. */
  6983. int wc_ecc_rs_raw_to_sig(const byte* r, word32 rSz, const byte* s, word32 sSz,
  6984. byte* out, word32* outlen)
  6985. {
  6986. int err;
  6987. #ifdef WOLFSSL_SMALL_STACK
  6988. mp_int* rtmp = NULL;
  6989. mp_int* stmp = NULL;
  6990. #else
  6991. mp_int rtmp[1];
  6992. mp_int stmp[1];
  6993. #endif
  6994. if (r == NULL || s == NULL || out == NULL || outlen == NULL)
  6995. return ECC_BAD_ARG_E;
  6996. #ifdef WOLFSSL_SMALL_STACK
  6997. rtmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  6998. if (rtmp == NULL)
  6999. return MEMORY_E;
  7000. stmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  7001. if (stmp == NULL) {
  7002. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  7003. return MEMORY_E;
  7004. }
  7005. #endif
  7006. err = mp_init_multi(rtmp, stmp, NULL, NULL, NULL, NULL);
  7007. if (err != MP_OKAY) {
  7008. #ifdef WOLFSSL_SMALL_STACK
  7009. XFREE(stmp, NULL, DYNAMIC_TYPE_ECC);
  7010. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  7011. #endif
  7012. return err;
  7013. }
  7014. err = mp_read_unsigned_bin(rtmp, r, rSz);
  7015. if (err == MP_OKAY)
  7016. err = mp_read_unsigned_bin(stmp, s, sSz);
  7017. /* convert mp_ints to ECDSA sig, initializes rtmp and stmp internally */
  7018. if (err == MP_OKAY)
  7019. err = StoreECC_DSA_Sig(out, outlen, rtmp, stmp);
  7020. if (err == MP_OKAY) {
  7021. if (mp_iszero(rtmp) == MP_YES || mp_iszero(stmp) == MP_YES)
  7022. err = MP_ZERO_E;
  7023. }
  7024. mp_clear(rtmp);
  7025. mp_clear(stmp);
  7026. #ifdef WOLFSSL_SMALL_STACK
  7027. XFREE(stmp, NULL, DYNAMIC_TYPE_ECC);
  7028. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  7029. #endif
  7030. return err;
  7031. }
  7032. /**
  7033. Convert ECC signature to R,S
  7034. sig DER-encoded ECDSA signature
  7035. sigLen length of signature in octets
  7036. r R component of signature
  7037. rLen [in/out] output "r" buffer size, output "r" size
  7038. s S component of signature
  7039. sLen [in/out] output "s" buffer size, output "s" size
  7040. return MP_OKAY on success, negative on error
  7041. */
  7042. int wc_ecc_sig_to_rs(const byte* sig, word32 sigLen, byte* r, word32* rLen,
  7043. byte* s, word32* sLen)
  7044. {
  7045. int err;
  7046. int tmp_valid = 0;
  7047. word32 x = 0;
  7048. #ifdef WOLFSSL_SMALL_STACK
  7049. mp_int* rtmp = NULL;
  7050. mp_int* stmp = NULL;
  7051. #else
  7052. mp_int rtmp[1];
  7053. mp_int stmp[1];
  7054. #endif
  7055. if (sig == NULL || r == NULL || rLen == NULL || s == NULL || sLen == NULL)
  7056. return ECC_BAD_ARG_E;
  7057. #ifdef WOLFSSL_SMALL_STACK
  7058. rtmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  7059. if (rtmp == NULL)
  7060. return MEMORY_E;
  7061. stmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  7062. if (stmp == NULL) {
  7063. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  7064. return MEMORY_E;
  7065. }
  7066. #endif
  7067. err = DecodeECC_DSA_Sig(sig, sigLen, rtmp, stmp);
  7068. /* rtmp and stmp are initialized */
  7069. if (err == MP_OKAY) {
  7070. tmp_valid = 1;
  7071. /* extract r */
  7072. x = mp_unsigned_bin_size(rtmp);
  7073. if (*rLen < x)
  7074. err = BUFFER_E;
  7075. }
  7076. if (err == MP_OKAY) {
  7077. *rLen = x;
  7078. err = mp_to_unsigned_bin(rtmp, r);
  7079. }
  7080. /* extract s */
  7081. if (err == MP_OKAY) {
  7082. x = mp_unsigned_bin_size(stmp);
  7083. if (*sLen < x)
  7084. err = BUFFER_E;
  7085. if (err == MP_OKAY) {
  7086. *sLen = x;
  7087. err = mp_to_unsigned_bin(stmp, s);
  7088. }
  7089. }
  7090. if (tmp_valid) {
  7091. mp_clear(rtmp);
  7092. mp_clear(stmp);
  7093. }
  7094. #ifdef WOLFSSL_SMALL_STACK
  7095. XFREE(stmp, NULL, DYNAMIC_TYPE_ECC);
  7096. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  7097. #endif
  7098. return err;
  7099. }
  7100. #endif /* !NO_ASN */
  7101. #ifdef HAVE_ECC_KEY_IMPORT
  7102. static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
  7103. const char* qy, const char* d, int curve_id, int encType)
  7104. {
  7105. int err = MP_OKAY;
  7106. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  7107. !defined(WOLFSSL_ATECC608A)
  7108. const CRYS_ECPKI_Domain_t* pDomain;
  7109. CRYS_ECPKI_BUILD_TempData_t tempBuff;
  7110. byte key_raw[ECC_MAX_CRYPTO_HW_SIZE*2 + 1];
  7111. word32 keySz = 0;
  7112. #endif
  7113. /* if d is NULL, only import as public key using Qx,Qy */
  7114. if (key == NULL || qx == NULL || qy == NULL) {
  7115. return BAD_FUNC_ARG;
  7116. }
  7117. /* make sure required variables are reset */
  7118. wc_ecc_reset(key);
  7119. /* set curve type and index */
  7120. err = wc_ecc_set_curve(key, 0, curve_id);
  7121. if (err != 0) {
  7122. return err;
  7123. }
  7124. /* init key */
  7125. #ifdef ALT_ECC_SIZE
  7126. key->pubkey.x = (mp_int*)&key->pubkey.xyz[0];
  7127. key->pubkey.y = (mp_int*)&key->pubkey.xyz[1];
  7128. key->pubkey.z = (mp_int*)&key->pubkey.xyz[2];
  7129. alt_fp_init(key->pubkey.x);
  7130. alt_fp_init(key->pubkey.y);
  7131. alt_fp_init(key->pubkey.z);
  7132. err = mp_init(&key->k);
  7133. #else
  7134. err = mp_init_multi(&key->k, key->pubkey.x, key->pubkey.y, key->pubkey.z,
  7135. NULL, NULL);
  7136. #endif
  7137. if (err != MP_OKAY)
  7138. return MEMORY_E;
  7139. /* read Qx */
  7140. if (err == MP_OKAY) {
  7141. if (encType == WC_TYPE_HEX_STR)
  7142. err = mp_read_radix(key->pubkey.x, qx, MP_RADIX_HEX);
  7143. else
  7144. err = mp_read_unsigned_bin(key->pubkey.x, (const byte*)qx,
  7145. key->dp->size);
  7146. if (mp_iszero(key->pubkey.x)) {
  7147. WOLFSSL_MSG("Invalid Qx");
  7148. err = BAD_FUNC_ARG;
  7149. }
  7150. }
  7151. /* read Qy */
  7152. if (err == MP_OKAY) {
  7153. if (encType == WC_TYPE_HEX_STR)
  7154. err = mp_read_radix(key->pubkey.y, qy, MP_RADIX_HEX);
  7155. else
  7156. err = mp_read_unsigned_bin(key->pubkey.y, (const byte*)qy,
  7157. key->dp->size);
  7158. if (mp_iszero(key->pubkey.y)) {
  7159. WOLFSSL_MSG("Invalid Qy");
  7160. err = BAD_FUNC_ARG;
  7161. }
  7162. }
  7163. if (err == MP_OKAY)
  7164. err = mp_set(key->pubkey.z, 1);
  7165. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  7166. /* For SECP256R1 only save raw public key for hardware */
  7167. if (err == MP_OKAY && curve_id == ECC_SECP256R1) {
  7168. word32 keySz = key->dp->size;
  7169. err = wc_export_int(key->pubkey.x, key->pubkey_raw,
  7170. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  7171. if (err == MP_OKAY)
  7172. err = wc_export_int(key->pubkey.y, &key->pubkey_raw[keySz],
  7173. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  7174. }
  7175. #elif defined(WOLFSSL_CRYPTOCELL)
  7176. if (err == MP_OKAY) {
  7177. key_raw[0] = ECC_POINT_UNCOMP;
  7178. keySz = (word32)key->dp->size;
  7179. err = wc_export_int(key->pubkey.x, &key_raw[1], &keySz, keySz,
  7180. WC_TYPE_UNSIGNED_BIN);
  7181. if (err == MP_OKAY) {
  7182. err = wc_export_int(key->pubkey.y, &key_raw[1+keySz],
  7183. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  7184. }
  7185. if (err == MP_OKAY) {
  7186. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(curve_id));
  7187. /* create public key from external key buffer */
  7188. err = CRYS_ECPKI_BuildPublKeyFullCheck(pDomain,
  7189. key_raw,
  7190. keySz*2 + 1,
  7191. &key->ctx.pubKey,
  7192. &tempBuff);
  7193. }
  7194. if (err != SA_SILIB_RET_OK){
  7195. WOLFSSL_MSG("CRYS_ECPKI_BuildPublKeyFullCheck failed");
  7196. return err;
  7197. }
  7198. }
  7199. #endif
  7200. /* import private key */
  7201. if (err == MP_OKAY) {
  7202. if (d != NULL) {
  7203. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  7204. /* Hardware doesn't support loading private key */
  7205. err = NOT_COMPILED_IN;
  7206. #elif defined(WOLFSSL_CRYPTOCELL)
  7207. key->type = ECC_PRIVATEKEY;
  7208. if (encType == WC_TYPE_HEX_STR)
  7209. err = mp_read_radix(&key->k, d, MP_RADIX_HEX);
  7210. else
  7211. err = mp_read_unsigned_bin(&key->k, (const byte*)d,
  7212. key->dp->size);
  7213. if (err == MP_OKAY) {
  7214. err = wc_export_int(&key->k, &key_raw[0], &keySz, keySz,
  7215. WC_TYPE_UNSIGNED_BIN);
  7216. }
  7217. if (err == MP_OKAY) {
  7218. /* Create private key from external key buffer*/
  7219. err = CRYS_ECPKI_BuildPrivKey(pDomain,
  7220. key_raw,
  7221. keySz,
  7222. &key->ctx.privKey);
  7223. if (err != SA_SILIB_RET_OK){
  7224. WOLFSSL_MSG("CRYS_ECPKI_BuildPrivKey failed");
  7225. return err;
  7226. }
  7227. }
  7228. #else
  7229. key->type = ECC_PRIVATEKEY;
  7230. if (encType == WC_TYPE_HEX_STR)
  7231. err = mp_read_radix(&key->k, d, MP_RADIX_HEX);
  7232. else
  7233. err = mp_read_unsigned_bin(&key->k, (const byte*)d,
  7234. key->dp->size);
  7235. #endif /* WOLFSSL_ATECC508A */
  7236. if (mp_iszero(&key->k)) {
  7237. WOLFSSL_MSG("Invalid private key");
  7238. return BAD_FUNC_ARG;
  7239. }
  7240. } else {
  7241. key->type = ECC_PUBLICKEY;
  7242. }
  7243. }
  7244. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  7245. if (err == MP_OKAY)
  7246. err = wc_ecc_check_key(key);
  7247. #endif
  7248. if (err != MP_OKAY) {
  7249. mp_clear(key->pubkey.x);
  7250. mp_clear(key->pubkey.y);
  7251. mp_clear(key->pubkey.z);
  7252. mp_clear(&key->k);
  7253. }
  7254. return err;
  7255. }
  7256. /**
  7257. Import raw ECC key
  7258. key The destination ecc_key structure
  7259. qx x component of the public key, as ASCII hex string
  7260. qy y component of the public key, as ASCII hex string
  7261. d private key, as ASCII hex string, optional if importing public
  7262. key only
  7263. dp Custom ecc_set_type
  7264. return MP_OKAY on success
  7265. */
  7266. int wc_ecc_import_raw_ex(ecc_key* key, const char* qx, const char* qy,
  7267. const char* d, int curve_id)
  7268. {
  7269. return wc_ecc_import_raw_private(key, qx, qy, d, curve_id,
  7270. WC_TYPE_HEX_STR);
  7271. }
  7272. /* Import x, y and optional private (d) as unsigned binary */
  7273. int wc_ecc_import_unsigned(ecc_key* key, byte* qx, byte* qy,
  7274. byte* d, int curve_id)
  7275. {
  7276. return wc_ecc_import_raw_private(key, (const char*)qx, (const char*)qy,
  7277. (const char*)d, curve_id, WC_TYPE_UNSIGNED_BIN);
  7278. }
  7279. /**
  7280. Import raw ECC key
  7281. key The destination ecc_key structure
  7282. qx x component of the public key, as ASCII hex string
  7283. qy y component of the public key, as ASCII hex string
  7284. d private key, as ASCII hex string, optional if importing public
  7285. key only
  7286. curveName ECC curve name, from ecc_sets[]
  7287. return MP_OKAY on success
  7288. */
  7289. int wc_ecc_import_raw(ecc_key* key, const char* qx, const char* qy,
  7290. const char* d, const char* curveName)
  7291. {
  7292. int err, x;
  7293. /* if d is NULL, only import as public key using Qx,Qy */
  7294. if (key == NULL || qx == NULL || qy == NULL || curveName == NULL) {
  7295. return BAD_FUNC_ARG;
  7296. }
  7297. /* set curve type and index */
  7298. for (x = 0; ecc_sets[x].size != 0; x++) {
  7299. if (XSTRNCMP(ecc_sets[x].name, curveName,
  7300. XSTRLEN(curveName)) == 0) {
  7301. break;
  7302. }
  7303. }
  7304. if (ecc_sets[x].size == 0) {
  7305. WOLFSSL_MSG("ecc_set curve name not found");
  7306. err = ASN_PARSE_E;
  7307. } else {
  7308. return wc_ecc_import_raw_private(key, qx, qy, d, ecc_sets[x].id,
  7309. WC_TYPE_HEX_STR);
  7310. }
  7311. return err;
  7312. }
  7313. #endif /* HAVE_ECC_KEY_IMPORT */
  7314. /* key size in octets */
  7315. int wc_ecc_size(ecc_key* key)
  7316. {
  7317. if (key == NULL)
  7318. return 0;
  7319. return key->dp->size;
  7320. }
  7321. /* maximum signature size based on key size */
  7322. int wc_ecc_sig_size_calc(int sz)
  7323. {
  7324. int maxSigSz = 0;
  7325. /* calculate based on key bits */
  7326. /* maximum possible signature header size is 7 bytes plus 2 bytes padding */
  7327. maxSigSz = (sz * 2) + SIG_HEADER_SZ + ECC_MAX_PAD_SZ;
  7328. /* if total length is less than 128 + SEQ(1)+LEN(1) then subtract 1 */
  7329. if (maxSigSz < (128 + 2)) {
  7330. maxSigSz -= 1;
  7331. }
  7332. return maxSigSz;
  7333. }
  7334. /* maximum signature size based on actual key curve */
  7335. int wc_ecc_sig_size(ecc_key* key)
  7336. {
  7337. int maxSigSz;
  7338. int orderBits, keySz;
  7339. if (key == NULL || key->dp == NULL)
  7340. return 0;
  7341. /* the signature r and s will always be less than order */
  7342. /* if the order MSB (top bit of byte) is set then ASN encoding needs
  7343. extra byte for r and s, so add 2 */
  7344. keySz = key->dp->size;
  7345. orderBits = wc_ecc_get_curve_order_bit_count(key->dp);
  7346. if (orderBits > keySz * 8) {
  7347. keySz = (orderBits + 7) / 8;
  7348. }
  7349. /* maximum possible signature header size is 7 bytes */
  7350. maxSigSz = (keySz * 2) + SIG_HEADER_SZ;
  7351. if ((orderBits % 8) == 0) {
  7352. /* MSB can be set, so add 2 */
  7353. maxSigSz += ECC_MAX_PAD_SZ;
  7354. }
  7355. /* if total length is less than 128 + SEQ(1)+LEN(1) then subtract 1 */
  7356. if (maxSigSz < (128 + 2)) {
  7357. maxSigSz -= 1;
  7358. }
  7359. return maxSigSz;
  7360. }
  7361. #ifdef FP_ECC
  7362. /* fixed point ECC cache */
  7363. /* number of entries in the cache */
  7364. #ifndef FP_ENTRIES
  7365. #define FP_ENTRIES 15
  7366. #endif
  7367. /* number of bits in LUT */
  7368. #ifndef FP_LUT
  7369. #define FP_LUT 8U
  7370. #endif
  7371. #ifdef ECC_SHAMIR
  7372. /* Sharmir requires a bigger LUT, TAO */
  7373. #if (FP_LUT > 12) || (FP_LUT < 4)
  7374. #error FP_LUT must be between 4 and 12 inclusively
  7375. #endif
  7376. #else
  7377. #if (FP_LUT > 12) || (FP_LUT < 2)
  7378. #error FP_LUT must be between 2 and 12 inclusively
  7379. #endif
  7380. #endif
  7381. #ifndef WOLFSSL_SP_MATH
  7382. /** Our FP cache */
  7383. typedef struct {
  7384. ecc_point* g; /* cached COPY of base point */
  7385. ecc_point* LUT[1U<<FP_LUT]; /* fixed point lookup */
  7386. int LUT_set; /* flag to determine if the LUT has been computed */
  7387. mp_int mu; /* copy of the montgomery constant */
  7388. int lru_count; /* amount of times this entry has been used */
  7389. int lock; /* flag to indicate cache eviction */
  7390. /* permitted (0) or not (1) */
  7391. } fp_cache_t;
  7392. /* if HAVE_THREAD_LS this cache is per thread, no locking needed */
  7393. static THREAD_LS_T fp_cache_t fp_cache[FP_ENTRIES];
  7394. #ifndef HAVE_THREAD_LS
  7395. static volatile int initMutex = 0; /* prevent multiple mutex inits */
  7396. static wolfSSL_Mutex ecc_fp_lock;
  7397. #endif /* HAVE_THREAD_LS */
  7398. /* simple table to help direct the generation of the LUT */
  7399. static const struct {
  7400. int ham, terma, termb;
  7401. } lut_orders[] = {
  7402. { 0, 0, 0 }, { 1, 0, 0 }, { 1, 0, 0 }, { 2, 1, 2 }, { 1, 0, 0 }, { 2, 1, 4 }, { 2, 2, 4 }, { 3, 3, 4 },
  7403. { 1, 0, 0 }, { 2, 1, 8 }, { 2, 2, 8 }, { 3, 3, 8 }, { 2, 4, 8 }, { 3, 5, 8 }, { 3, 6, 8 }, { 4, 7, 8 },
  7404. { 1, 0, 0 }, { 2, 1, 16 }, { 2, 2, 16 }, { 3, 3, 16 }, { 2, 4, 16 }, { 3, 5, 16 }, { 3, 6, 16 }, { 4, 7, 16 },
  7405. { 2, 8, 16 }, { 3, 9, 16 }, { 3, 10, 16 }, { 4, 11, 16 }, { 3, 12, 16 }, { 4, 13, 16 }, { 4, 14, 16 }, { 5, 15, 16 },
  7406. { 1, 0, 0 }, { 2, 1, 32 }, { 2, 2, 32 }, { 3, 3, 32 }, { 2, 4, 32 }, { 3, 5, 32 }, { 3, 6, 32 }, { 4, 7, 32 },
  7407. { 2, 8, 32 }, { 3, 9, 32 }, { 3, 10, 32 }, { 4, 11, 32 }, { 3, 12, 32 }, { 4, 13, 32 }, { 4, 14, 32 }, { 5, 15, 32 },
  7408. { 2, 16, 32 }, { 3, 17, 32 }, { 3, 18, 32 }, { 4, 19, 32 }, { 3, 20, 32 }, { 4, 21, 32 }, { 4, 22, 32 }, { 5, 23, 32 },
  7409. { 3, 24, 32 }, { 4, 25, 32 }, { 4, 26, 32 }, { 5, 27, 32 }, { 4, 28, 32 }, { 5, 29, 32 }, { 5, 30, 32 }, { 6, 31, 32 },
  7410. #if FP_LUT > 6
  7411. { 1, 0, 0 }, { 2, 1, 64 }, { 2, 2, 64 }, { 3, 3, 64 }, { 2, 4, 64 }, { 3, 5, 64 }, { 3, 6, 64 }, { 4, 7, 64 },
  7412. { 2, 8, 64 }, { 3, 9, 64 }, { 3, 10, 64 }, { 4, 11, 64 }, { 3, 12, 64 }, { 4, 13, 64 }, { 4, 14, 64 }, { 5, 15, 64 },
  7413. { 2, 16, 64 }, { 3, 17, 64 }, { 3, 18, 64 }, { 4, 19, 64 }, { 3, 20, 64 }, { 4, 21, 64 }, { 4, 22, 64 }, { 5, 23, 64 },
  7414. { 3, 24, 64 }, { 4, 25, 64 }, { 4, 26, 64 }, { 5, 27, 64 }, { 4, 28, 64 }, { 5, 29, 64 }, { 5, 30, 64 }, { 6, 31, 64 },
  7415. { 2, 32, 64 }, { 3, 33, 64 }, { 3, 34, 64 }, { 4, 35, 64 }, { 3, 36, 64 }, { 4, 37, 64 }, { 4, 38, 64 }, { 5, 39, 64 },
  7416. { 3, 40, 64 }, { 4, 41, 64 }, { 4, 42, 64 }, { 5, 43, 64 }, { 4, 44, 64 }, { 5, 45, 64 }, { 5, 46, 64 }, { 6, 47, 64 },
  7417. { 3, 48, 64 }, { 4, 49, 64 }, { 4, 50, 64 }, { 5, 51, 64 }, { 4, 52, 64 }, { 5, 53, 64 }, { 5, 54, 64 }, { 6, 55, 64 },
  7418. { 4, 56, 64 }, { 5, 57, 64 }, { 5, 58, 64 }, { 6, 59, 64 }, { 5, 60, 64 }, { 6, 61, 64 }, { 6, 62, 64 }, { 7, 63, 64 },
  7419. #if FP_LUT > 7
  7420. { 1, 0, 0 }, { 2, 1, 128 }, { 2, 2, 128 }, { 3, 3, 128 }, { 2, 4, 128 }, { 3, 5, 128 }, { 3, 6, 128 }, { 4, 7, 128 },
  7421. { 2, 8, 128 }, { 3, 9, 128 }, { 3, 10, 128 }, { 4, 11, 128 }, { 3, 12, 128 }, { 4, 13, 128 }, { 4, 14, 128 }, { 5, 15, 128 },
  7422. { 2, 16, 128 }, { 3, 17, 128 }, { 3, 18, 128 }, { 4, 19, 128 }, { 3, 20, 128 }, { 4, 21, 128 }, { 4, 22, 128 }, { 5, 23, 128 },
  7423. { 3, 24, 128 }, { 4, 25, 128 }, { 4, 26, 128 }, { 5, 27, 128 }, { 4, 28, 128 }, { 5, 29, 128 }, { 5, 30, 128 }, { 6, 31, 128 },
  7424. { 2, 32, 128 }, { 3, 33, 128 }, { 3, 34, 128 }, { 4, 35, 128 }, { 3, 36, 128 }, { 4, 37, 128 }, { 4, 38, 128 }, { 5, 39, 128 },
  7425. { 3, 40, 128 }, { 4, 41, 128 }, { 4, 42, 128 }, { 5, 43, 128 }, { 4, 44, 128 }, { 5, 45, 128 }, { 5, 46, 128 }, { 6, 47, 128 },
  7426. { 3, 48, 128 }, { 4, 49, 128 }, { 4, 50, 128 }, { 5, 51, 128 }, { 4, 52, 128 }, { 5, 53, 128 }, { 5, 54, 128 }, { 6, 55, 128 },
  7427. { 4, 56, 128 }, { 5, 57, 128 }, { 5, 58, 128 }, { 6, 59, 128 }, { 5, 60, 128 }, { 6, 61, 128 }, { 6, 62, 128 }, { 7, 63, 128 },
  7428. { 2, 64, 128 }, { 3, 65, 128 }, { 3, 66, 128 }, { 4, 67, 128 }, { 3, 68, 128 }, { 4, 69, 128 }, { 4, 70, 128 }, { 5, 71, 128 },
  7429. { 3, 72, 128 }, { 4, 73, 128 }, { 4, 74, 128 }, { 5, 75, 128 }, { 4, 76, 128 }, { 5, 77, 128 }, { 5, 78, 128 }, { 6, 79, 128 },
  7430. { 3, 80, 128 }, { 4, 81, 128 }, { 4, 82, 128 }, { 5, 83, 128 }, { 4, 84, 128 }, { 5, 85, 128 }, { 5, 86, 128 }, { 6, 87, 128 },
  7431. { 4, 88, 128 }, { 5, 89, 128 }, { 5, 90, 128 }, { 6, 91, 128 }, { 5, 92, 128 }, { 6, 93, 128 }, { 6, 94, 128 }, { 7, 95, 128 },
  7432. { 3, 96, 128 }, { 4, 97, 128 }, { 4, 98, 128 }, { 5, 99, 128 }, { 4, 100, 128 }, { 5, 101, 128 }, { 5, 102, 128 }, { 6, 103, 128 },
  7433. { 4, 104, 128 }, { 5, 105, 128 }, { 5, 106, 128 }, { 6, 107, 128 }, { 5, 108, 128 }, { 6, 109, 128 }, { 6, 110, 128 }, { 7, 111, 128 },
  7434. { 4, 112, 128 }, { 5, 113, 128 }, { 5, 114, 128 }, { 6, 115, 128 }, { 5, 116, 128 }, { 6, 117, 128 }, { 6, 118, 128 }, { 7, 119, 128 },
  7435. { 5, 120, 128 }, { 6, 121, 128 }, { 6, 122, 128 }, { 7, 123, 128 }, { 6, 124, 128 }, { 7, 125, 128 }, { 7, 126, 128 }, { 8, 127, 128 },
  7436. #if FP_LUT > 8
  7437. { 1, 0, 0 }, { 2, 1, 256 }, { 2, 2, 256 }, { 3, 3, 256 }, { 2, 4, 256 }, { 3, 5, 256 }, { 3, 6, 256 }, { 4, 7, 256 },
  7438. { 2, 8, 256 }, { 3, 9, 256 }, { 3, 10, 256 }, { 4, 11, 256 }, { 3, 12, 256 }, { 4, 13, 256 }, { 4, 14, 256 }, { 5, 15, 256 },
  7439. { 2, 16, 256 }, { 3, 17, 256 }, { 3, 18, 256 }, { 4, 19, 256 }, { 3, 20, 256 }, { 4, 21, 256 }, { 4, 22, 256 }, { 5, 23, 256 },
  7440. { 3, 24, 256 }, { 4, 25, 256 }, { 4, 26, 256 }, { 5, 27, 256 }, { 4, 28, 256 }, { 5, 29, 256 }, { 5, 30, 256 }, { 6, 31, 256 },
  7441. { 2, 32, 256 }, { 3, 33, 256 }, { 3, 34, 256 }, { 4, 35, 256 }, { 3, 36, 256 }, { 4, 37, 256 }, { 4, 38, 256 }, { 5, 39, 256 },
  7442. { 3, 40, 256 }, { 4, 41, 256 }, { 4, 42, 256 }, { 5, 43, 256 }, { 4, 44, 256 }, { 5, 45, 256 }, { 5, 46, 256 }, { 6, 47, 256 },
  7443. { 3, 48, 256 }, { 4, 49, 256 }, { 4, 50, 256 }, { 5, 51, 256 }, { 4, 52, 256 }, { 5, 53, 256 }, { 5, 54, 256 }, { 6, 55, 256 },
  7444. { 4, 56, 256 }, { 5, 57, 256 }, { 5, 58, 256 }, { 6, 59, 256 }, { 5, 60, 256 }, { 6, 61, 256 }, { 6, 62, 256 }, { 7, 63, 256 },
  7445. { 2, 64, 256 }, { 3, 65, 256 }, { 3, 66, 256 }, { 4, 67, 256 }, { 3, 68, 256 }, { 4, 69, 256 }, { 4, 70, 256 }, { 5, 71, 256 },
  7446. { 3, 72, 256 }, { 4, 73, 256 }, { 4, 74, 256 }, { 5, 75, 256 }, { 4, 76, 256 }, { 5, 77, 256 }, { 5, 78, 256 }, { 6, 79, 256 },
  7447. { 3, 80, 256 }, { 4, 81, 256 }, { 4, 82, 256 }, { 5, 83, 256 }, { 4, 84, 256 }, { 5, 85, 256 }, { 5, 86, 256 }, { 6, 87, 256 },
  7448. { 4, 88, 256 }, { 5, 89, 256 }, { 5, 90, 256 }, { 6, 91, 256 }, { 5, 92, 256 }, { 6, 93, 256 }, { 6, 94, 256 }, { 7, 95, 256 },
  7449. { 3, 96, 256 }, { 4, 97, 256 }, { 4, 98, 256 }, { 5, 99, 256 }, { 4, 100, 256 }, { 5, 101, 256 }, { 5, 102, 256 }, { 6, 103, 256 },
  7450. { 4, 104, 256 }, { 5, 105, 256 }, { 5, 106, 256 }, { 6, 107, 256 }, { 5, 108, 256 }, { 6, 109, 256 }, { 6, 110, 256 }, { 7, 111, 256 },
  7451. { 4, 112, 256 }, { 5, 113, 256 }, { 5, 114, 256 }, { 6, 115, 256 }, { 5, 116, 256 }, { 6, 117, 256 }, { 6, 118, 256 }, { 7, 119, 256 },
  7452. { 5, 120, 256 }, { 6, 121, 256 }, { 6, 122, 256 }, { 7, 123, 256 }, { 6, 124, 256 }, { 7, 125, 256 }, { 7, 126, 256 }, { 8, 127, 256 },
  7453. { 2, 128, 256 }, { 3, 129, 256 }, { 3, 130, 256 }, { 4, 131, 256 }, { 3, 132, 256 }, { 4, 133, 256 }, { 4, 134, 256 }, { 5, 135, 256 },
  7454. { 3, 136, 256 }, { 4, 137, 256 }, { 4, 138, 256 }, { 5, 139, 256 }, { 4, 140, 256 }, { 5, 141, 256 }, { 5, 142, 256 }, { 6, 143, 256 },
  7455. { 3, 144, 256 }, { 4, 145, 256 }, { 4, 146, 256 }, { 5, 147, 256 }, { 4, 148, 256 }, { 5, 149, 256 }, { 5, 150, 256 }, { 6, 151, 256 },
  7456. { 4, 152, 256 }, { 5, 153, 256 }, { 5, 154, 256 }, { 6, 155, 256 }, { 5, 156, 256 }, { 6, 157, 256 }, { 6, 158, 256 }, { 7, 159, 256 },
  7457. { 3, 160, 256 }, { 4, 161, 256 }, { 4, 162, 256 }, { 5, 163, 256 }, { 4, 164, 256 }, { 5, 165, 256 }, { 5, 166, 256 }, { 6, 167, 256 },
  7458. { 4, 168, 256 }, { 5, 169, 256 }, { 5, 170, 256 }, { 6, 171, 256 }, { 5, 172, 256 }, { 6, 173, 256 }, { 6, 174, 256 }, { 7, 175, 256 },
  7459. { 4, 176, 256 }, { 5, 177, 256 }, { 5, 178, 256 }, { 6, 179, 256 }, { 5, 180, 256 }, { 6, 181, 256 }, { 6, 182, 256 }, { 7, 183, 256 },
  7460. { 5, 184, 256 }, { 6, 185, 256 }, { 6, 186, 256 }, { 7, 187, 256 }, { 6, 188, 256 }, { 7, 189, 256 }, { 7, 190, 256 }, { 8, 191, 256 },
  7461. { 3, 192, 256 }, { 4, 193, 256 }, { 4, 194, 256 }, { 5, 195, 256 }, { 4, 196, 256 }, { 5, 197, 256 }, { 5, 198, 256 }, { 6, 199, 256 },
  7462. { 4, 200, 256 }, { 5, 201, 256 }, { 5, 202, 256 }, { 6, 203, 256 }, { 5, 204, 256 }, { 6, 205, 256 }, { 6, 206, 256 }, { 7, 207, 256 },
  7463. { 4, 208, 256 }, { 5, 209, 256 }, { 5, 210, 256 }, { 6, 211, 256 }, { 5, 212, 256 }, { 6, 213, 256 }, { 6, 214, 256 }, { 7, 215, 256 },
  7464. { 5, 216, 256 }, { 6, 217, 256 }, { 6, 218, 256 }, { 7, 219, 256 }, { 6, 220, 256 }, { 7, 221, 256 }, { 7, 222, 256 }, { 8, 223, 256 },
  7465. { 4, 224, 256 }, { 5, 225, 256 }, { 5, 226, 256 }, { 6, 227, 256 }, { 5, 228, 256 }, { 6, 229, 256 }, { 6, 230, 256 }, { 7, 231, 256 },
  7466. { 5, 232, 256 }, { 6, 233, 256 }, { 6, 234, 256 }, { 7, 235, 256 }, { 6, 236, 256 }, { 7, 237, 256 }, { 7, 238, 256 }, { 8, 239, 256 },
  7467. { 5, 240, 256 }, { 6, 241, 256 }, { 6, 242, 256 }, { 7, 243, 256 }, { 6, 244, 256 }, { 7, 245, 256 }, { 7, 246, 256 }, { 8, 247, 256 },
  7468. { 6, 248, 256 }, { 7, 249, 256 }, { 7, 250, 256 }, { 8, 251, 256 }, { 7, 252, 256 }, { 8, 253, 256 }, { 8, 254, 256 }, { 9, 255, 256 },
  7469. #if FP_LUT > 9
  7470. { 1, 0, 0 }, { 2, 1, 512 }, { 2, 2, 512 }, { 3, 3, 512 }, { 2, 4, 512 }, { 3, 5, 512 }, { 3, 6, 512 }, { 4, 7, 512 },
  7471. { 2, 8, 512 }, { 3, 9, 512 }, { 3, 10, 512 }, { 4, 11, 512 }, { 3, 12, 512 }, { 4, 13, 512 }, { 4, 14, 512 }, { 5, 15, 512 },
  7472. { 2, 16, 512 }, { 3, 17, 512 }, { 3, 18, 512 }, { 4, 19, 512 }, { 3, 20, 512 }, { 4, 21, 512 }, { 4, 22, 512 }, { 5, 23, 512 },
  7473. { 3, 24, 512 }, { 4, 25, 512 }, { 4, 26, 512 }, { 5, 27, 512 }, { 4, 28, 512 }, { 5, 29, 512 }, { 5, 30, 512 }, { 6, 31, 512 },
  7474. { 2, 32, 512 }, { 3, 33, 512 }, { 3, 34, 512 }, { 4, 35, 512 }, { 3, 36, 512 }, { 4, 37, 512 }, { 4, 38, 512 }, { 5, 39, 512 },
  7475. { 3, 40, 512 }, { 4, 41, 512 }, { 4, 42, 512 }, { 5, 43, 512 }, { 4, 44, 512 }, { 5, 45, 512 }, { 5, 46, 512 }, { 6, 47, 512 },
  7476. { 3, 48, 512 }, { 4, 49, 512 }, { 4, 50, 512 }, { 5, 51, 512 }, { 4, 52, 512 }, { 5, 53, 512 }, { 5, 54, 512 }, { 6, 55, 512 },
  7477. { 4, 56, 512 }, { 5, 57, 512 }, { 5, 58, 512 }, { 6, 59, 512 }, { 5, 60, 512 }, { 6, 61, 512 }, { 6, 62, 512 }, { 7, 63, 512 },
  7478. { 2, 64, 512 }, { 3, 65, 512 }, { 3, 66, 512 }, { 4, 67, 512 }, { 3, 68, 512 }, { 4, 69, 512 }, { 4, 70, 512 }, { 5, 71, 512 },
  7479. { 3, 72, 512 }, { 4, 73, 512 }, { 4, 74, 512 }, { 5, 75, 512 }, { 4, 76, 512 }, { 5, 77, 512 }, { 5, 78, 512 }, { 6, 79, 512 },
  7480. { 3, 80, 512 }, { 4, 81, 512 }, { 4, 82, 512 }, { 5, 83, 512 }, { 4, 84, 512 }, { 5, 85, 512 }, { 5, 86, 512 }, { 6, 87, 512 },
  7481. { 4, 88, 512 }, { 5, 89, 512 }, { 5, 90, 512 }, { 6, 91, 512 }, { 5, 92, 512 }, { 6, 93, 512 }, { 6, 94, 512 }, { 7, 95, 512 },
  7482. { 3, 96, 512 }, { 4, 97, 512 }, { 4, 98, 512 }, { 5, 99, 512 }, { 4, 100, 512 }, { 5, 101, 512 }, { 5, 102, 512 }, { 6, 103, 512 },
  7483. { 4, 104, 512 }, { 5, 105, 512 }, { 5, 106, 512 }, { 6, 107, 512 }, { 5, 108, 512 }, { 6, 109, 512 }, { 6, 110, 512 }, { 7, 111, 512 },
  7484. { 4, 112, 512 }, { 5, 113, 512 }, { 5, 114, 512 }, { 6, 115, 512 }, { 5, 116, 512 }, { 6, 117, 512 }, { 6, 118, 512 }, { 7, 119, 512 },
  7485. { 5, 120, 512 }, { 6, 121, 512 }, { 6, 122, 512 }, { 7, 123, 512 }, { 6, 124, 512 }, { 7, 125, 512 }, { 7, 126, 512 }, { 8, 127, 512 },
  7486. { 2, 128, 512 }, { 3, 129, 512 }, { 3, 130, 512 }, { 4, 131, 512 }, { 3, 132, 512 }, { 4, 133, 512 }, { 4, 134, 512 }, { 5, 135, 512 },
  7487. { 3, 136, 512 }, { 4, 137, 512 }, { 4, 138, 512 }, { 5, 139, 512 }, { 4, 140, 512 }, { 5, 141, 512 }, { 5, 142, 512 }, { 6, 143, 512 },
  7488. { 3, 144, 512 }, { 4, 145, 512 }, { 4, 146, 512 }, { 5, 147, 512 }, { 4, 148, 512 }, { 5, 149, 512 }, { 5, 150, 512 }, { 6, 151, 512 },
  7489. { 4, 152, 512 }, { 5, 153, 512 }, { 5, 154, 512 }, { 6, 155, 512 }, { 5, 156, 512 }, { 6, 157, 512 }, { 6, 158, 512 }, { 7, 159, 512 },
  7490. { 3, 160, 512 }, { 4, 161, 512 }, { 4, 162, 512 }, { 5, 163, 512 }, { 4, 164, 512 }, { 5, 165, 512 }, { 5, 166, 512 }, { 6, 167, 512 },
  7491. { 4, 168, 512 }, { 5, 169, 512 }, { 5, 170, 512 }, { 6, 171, 512 }, { 5, 172, 512 }, { 6, 173, 512 }, { 6, 174, 512 }, { 7, 175, 512 },
  7492. { 4, 176, 512 }, { 5, 177, 512 }, { 5, 178, 512 }, { 6, 179, 512 }, { 5, 180, 512 }, { 6, 181, 512 }, { 6, 182, 512 }, { 7, 183, 512 },
  7493. { 5, 184, 512 }, { 6, 185, 512 }, { 6, 186, 512 }, { 7, 187, 512 }, { 6, 188, 512 }, { 7, 189, 512 }, { 7, 190, 512 }, { 8, 191, 512 },
  7494. { 3, 192, 512 }, { 4, 193, 512 }, { 4, 194, 512 }, { 5, 195, 512 }, { 4, 196, 512 }, { 5, 197, 512 }, { 5, 198, 512 }, { 6, 199, 512 },
  7495. { 4, 200, 512 }, { 5, 201, 512 }, { 5, 202, 512 }, { 6, 203, 512 }, { 5, 204, 512 }, { 6, 205, 512 }, { 6, 206, 512 }, { 7, 207, 512 },
  7496. { 4, 208, 512 }, { 5, 209, 512 }, { 5, 210, 512 }, { 6, 211, 512 }, { 5, 212, 512 }, { 6, 213, 512 }, { 6, 214, 512 }, { 7, 215, 512 },
  7497. { 5, 216, 512 }, { 6, 217, 512 }, { 6, 218, 512 }, { 7, 219, 512 }, { 6, 220, 512 }, { 7, 221, 512 }, { 7, 222, 512 }, { 8, 223, 512 },
  7498. { 4, 224, 512 }, { 5, 225, 512 }, { 5, 226, 512 }, { 6, 227, 512 }, { 5, 228, 512 }, { 6, 229, 512 }, { 6, 230, 512 }, { 7, 231, 512 },
  7499. { 5, 232, 512 }, { 6, 233, 512 }, { 6, 234, 512 }, { 7, 235, 512 }, { 6, 236, 512 }, { 7, 237, 512 }, { 7, 238, 512 }, { 8, 239, 512 },
  7500. { 5, 240, 512 }, { 6, 241, 512 }, { 6, 242, 512 }, { 7, 243, 512 }, { 6, 244, 512 }, { 7, 245, 512 }, { 7, 246, 512 }, { 8, 247, 512 },
  7501. { 6, 248, 512 }, { 7, 249, 512 }, { 7, 250, 512 }, { 8, 251, 512 }, { 7, 252, 512 }, { 8, 253, 512 }, { 8, 254, 512 }, { 9, 255, 512 },
  7502. { 2, 256, 512 }, { 3, 257, 512 }, { 3, 258, 512 }, { 4, 259, 512 }, { 3, 260, 512 }, { 4, 261, 512 }, { 4, 262, 512 }, { 5, 263, 512 },
  7503. { 3, 264, 512 }, { 4, 265, 512 }, { 4, 266, 512 }, { 5, 267, 512 }, { 4, 268, 512 }, { 5, 269, 512 }, { 5, 270, 512 }, { 6, 271, 512 },
  7504. { 3, 272, 512 }, { 4, 273, 512 }, { 4, 274, 512 }, { 5, 275, 512 }, { 4, 276, 512 }, { 5, 277, 512 }, { 5, 278, 512 }, { 6, 279, 512 },
  7505. { 4, 280, 512 }, { 5, 281, 512 }, { 5, 282, 512 }, { 6, 283, 512 }, { 5, 284, 512 }, { 6, 285, 512 }, { 6, 286, 512 }, { 7, 287, 512 },
  7506. { 3, 288, 512 }, { 4, 289, 512 }, { 4, 290, 512 }, { 5, 291, 512 }, { 4, 292, 512 }, { 5, 293, 512 }, { 5, 294, 512 }, { 6, 295, 512 },
  7507. { 4, 296, 512 }, { 5, 297, 512 }, { 5, 298, 512 }, { 6, 299, 512 }, { 5, 300, 512 }, { 6, 301, 512 }, { 6, 302, 512 }, { 7, 303, 512 },
  7508. { 4, 304, 512 }, { 5, 305, 512 }, { 5, 306, 512 }, { 6, 307, 512 }, { 5, 308, 512 }, { 6, 309, 512 }, { 6, 310, 512 }, { 7, 311, 512 },
  7509. { 5, 312, 512 }, { 6, 313, 512 }, { 6, 314, 512 }, { 7, 315, 512 }, { 6, 316, 512 }, { 7, 317, 512 }, { 7, 318, 512 }, { 8, 319, 512 },
  7510. { 3, 320, 512 }, { 4, 321, 512 }, { 4, 322, 512 }, { 5, 323, 512 }, { 4, 324, 512 }, { 5, 325, 512 }, { 5, 326, 512 }, { 6, 327, 512 },
  7511. { 4, 328, 512 }, { 5, 329, 512 }, { 5, 330, 512 }, { 6, 331, 512 }, { 5, 332, 512 }, { 6, 333, 512 }, { 6, 334, 512 }, { 7, 335, 512 },
  7512. { 4, 336, 512 }, { 5, 337, 512 }, { 5, 338, 512 }, { 6, 339, 512 }, { 5, 340, 512 }, { 6, 341, 512 }, { 6, 342, 512 }, { 7, 343, 512 },
  7513. { 5, 344, 512 }, { 6, 345, 512 }, { 6, 346, 512 }, { 7, 347, 512 }, { 6, 348, 512 }, { 7, 349, 512 }, { 7, 350, 512 }, { 8, 351, 512 },
  7514. { 4, 352, 512 }, { 5, 353, 512 }, { 5, 354, 512 }, { 6, 355, 512 }, { 5, 356, 512 }, { 6, 357, 512 }, { 6, 358, 512 }, { 7, 359, 512 },
  7515. { 5, 360, 512 }, { 6, 361, 512 }, { 6, 362, 512 }, { 7, 363, 512 }, { 6, 364, 512 }, { 7, 365, 512 }, { 7, 366, 512 }, { 8, 367, 512 },
  7516. { 5, 368, 512 }, { 6, 369, 512 }, { 6, 370, 512 }, { 7, 371, 512 }, { 6, 372, 512 }, { 7, 373, 512 }, { 7, 374, 512 }, { 8, 375, 512 },
  7517. { 6, 376, 512 }, { 7, 377, 512 }, { 7, 378, 512 }, { 8, 379, 512 }, { 7, 380, 512 }, { 8, 381, 512 }, { 8, 382, 512 }, { 9, 383, 512 },
  7518. { 3, 384, 512 }, { 4, 385, 512 }, { 4, 386, 512 }, { 5, 387, 512 }, { 4, 388, 512 }, { 5, 389, 512 }, { 5, 390, 512 }, { 6, 391, 512 },
  7519. { 4, 392, 512 }, { 5, 393, 512 }, { 5, 394, 512 }, { 6, 395, 512 }, { 5, 396, 512 }, { 6, 397, 512 }, { 6, 398, 512 }, { 7, 399, 512 },
  7520. { 4, 400, 512 }, { 5, 401, 512 }, { 5, 402, 512 }, { 6, 403, 512 }, { 5, 404, 512 }, { 6, 405, 512 }, { 6, 406, 512 }, { 7, 407, 512 },
  7521. { 5, 408, 512 }, { 6, 409, 512 }, { 6, 410, 512 }, { 7, 411, 512 }, { 6, 412, 512 }, { 7, 413, 512 }, { 7, 414, 512 }, { 8, 415, 512 },
  7522. { 4, 416, 512 }, { 5, 417, 512 }, { 5, 418, 512 }, { 6, 419, 512 }, { 5, 420, 512 }, { 6, 421, 512 }, { 6, 422, 512 }, { 7, 423, 512 },
  7523. { 5, 424, 512 }, { 6, 425, 512 }, { 6, 426, 512 }, { 7, 427, 512 }, { 6, 428, 512 }, { 7, 429, 512 }, { 7, 430, 512 }, { 8, 431, 512 },
  7524. { 5, 432, 512 }, { 6, 433, 512 }, { 6, 434, 512 }, { 7, 435, 512 }, { 6, 436, 512 }, { 7, 437, 512 }, { 7, 438, 512 }, { 8, 439, 512 },
  7525. { 6, 440, 512 }, { 7, 441, 512 }, { 7, 442, 512 }, { 8, 443, 512 }, { 7, 444, 512 }, { 8, 445, 512 }, { 8, 446, 512 }, { 9, 447, 512 },
  7526. { 4, 448, 512 }, { 5, 449, 512 }, { 5, 450, 512 }, { 6, 451, 512 }, { 5, 452, 512 }, { 6, 453, 512 }, { 6, 454, 512 }, { 7, 455, 512 },
  7527. { 5, 456, 512 }, { 6, 457, 512 }, { 6, 458, 512 }, { 7, 459, 512 }, { 6, 460, 512 }, { 7, 461, 512 }, { 7, 462, 512 }, { 8, 463, 512 },
  7528. { 5, 464, 512 }, { 6, 465, 512 }, { 6, 466, 512 }, { 7, 467, 512 }, { 6, 468, 512 }, { 7, 469, 512 }, { 7, 470, 512 }, { 8, 471, 512 },
  7529. { 6, 472, 512 }, { 7, 473, 512 }, { 7, 474, 512 }, { 8, 475, 512 }, { 7, 476, 512 }, { 8, 477, 512 }, { 8, 478, 512 }, { 9, 479, 512 },
  7530. { 5, 480, 512 }, { 6, 481, 512 }, { 6, 482, 512 }, { 7, 483, 512 }, { 6, 484, 512 }, { 7, 485, 512 }, { 7, 486, 512 }, { 8, 487, 512 },
  7531. { 6, 488, 512 }, { 7, 489, 512 }, { 7, 490, 512 }, { 8, 491, 512 }, { 7, 492, 512 }, { 8, 493, 512 }, { 8, 494, 512 }, { 9, 495, 512 },
  7532. { 6, 496, 512 }, { 7, 497, 512 }, { 7, 498, 512 }, { 8, 499, 512 }, { 7, 500, 512 }, { 8, 501, 512 }, { 8, 502, 512 }, { 9, 503, 512 },
  7533. { 7, 504, 512 }, { 8, 505, 512 }, { 8, 506, 512 }, { 9, 507, 512 }, { 8, 508, 512 }, { 9, 509, 512 }, { 9, 510, 512 }, { 10, 511, 512 },
  7534. #if FP_LUT > 10
  7535. { 1, 0, 0 }, { 2, 1, 1024 }, { 2, 2, 1024 }, { 3, 3, 1024 }, { 2, 4, 1024 }, { 3, 5, 1024 }, { 3, 6, 1024 }, { 4, 7, 1024 },
  7536. { 2, 8, 1024 }, { 3, 9, 1024 }, { 3, 10, 1024 }, { 4, 11, 1024 }, { 3, 12, 1024 }, { 4, 13, 1024 }, { 4, 14, 1024 }, { 5, 15, 1024 },
  7537. { 2, 16, 1024 }, { 3, 17, 1024 }, { 3, 18, 1024 }, { 4, 19, 1024 }, { 3, 20, 1024 }, { 4, 21, 1024 }, { 4, 22, 1024 }, { 5, 23, 1024 },
  7538. { 3, 24, 1024 }, { 4, 25, 1024 }, { 4, 26, 1024 }, { 5, 27, 1024 }, { 4, 28, 1024 }, { 5, 29, 1024 }, { 5, 30, 1024 }, { 6, 31, 1024 },
  7539. { 2, 32, 1024 }, { 3, 33, 1024 }, { 3, 34, 1024 }, { 4, 35, 1024 }, { 3, 36, 1024 }, { 4, 37, 1024 }, { 4, 38, 1024 }, { 5, 39, 1024 },
  7540. { 3, 40, 1024 }, { 4, 41, 1024 }, { 4, 42, 1024 }, { 5, 43, 1024 }, { 4, 44, 1024 }, { 5, 45, 1024 }, { 5, 46, 1024 }, { 6, 47, 1024 },
  7541. { 3, 48, 1024 }, { 4, 49, 1024 }, { 4, 50, 1024 }, { 5, 51, 1024 }, { 4, 52, 1024 }, { 5, 53, 1024 }, { 5, 54, 1024 }, { 6, 55, 1024 },
  7542. { 4, 56, 1024 }, { 5, 57, 1024 }, { 5, 58, 1024 }, { 6, 59, 1024 }, { 5, 60, 1024 }, { 6, 61, 1024 }, { 6, 62, 1024 }, { 7, 63, 1024 },
  7543. { 2, 64, 1024 }, { 3, 65, 1024 }, { 3, 66, 1024 }, { 4, 67, 1024 }, { 3, 68, 1024 }, { 4, 69, 1024 }, { 4, 70, 1024 }, { 5, 71, 1024 },
  7544. { 3, 72, 1024 }, { 4, 73, 1024 }, { 4, 74, 1024 }, { 5, 75, 1024 }, { 4, 76, 1024 }, { 5, 77, 1024 }, { 5, 78, 1024 }, { 6, 79, 1024 },
  7545. { 3, 80, 1024 }, { 4, 81, 1024 }, { 4, 82, 1024 }, { 5, 83, 1024 }, { 4, 84, 1024 }, { 5, 85, 1024 }, { 5, 86, 1024 }, { 6, 87, 1024 },
  7546. { 4, 88, 1024 }, { 5, 89, 1024 }, { 5, 90, 1024 }, { 6, 91, 1024 }, { 5, 92, 1024 }, { 6, 93, 1024 }, { 6, 94, 1024 }, { 7, 95, 1024 },
  7547. { 3, 96, 1024 }, { 4, 97, 1024 }, { 4, 98, 1024 }, { 5, 99, 1024 }, { 4, 100, 1024 }, { 5, 101, 1024 }, { 5, 102, 1024 }, { 6, 103, 1024 },
  7548. { 4, 104, 1024 }, { 5, 105, 1024 }, { 5, 106, 1024 }, { 6, 107, 1024 }, { 5, 108, 1024 }, { 6, 109, 1024 }, { 6, 110, 1024 }, { 7, 111, 1024 },
  7549. { 4, 112, 1024 }, { 5, 113, 1024 }, { 5, 114, 1024 }, { 6, 115, 1024 }, { 5, 116, 1024 }, { 6, 117, 1024 }, { 6, 118, 1024 }, { 7, 119, 1024 },
  7550. { 5, 120, 1024 }, { 6, 121, 1024 }, { 6, 122, 1024 }, { 7, 123, 1024 }, { 6, 124, 1024 }, { 7, 125, 1024 }, { 7, 126, 1024 }, { 8, 127, 1024 },
  7551. { 2, 128, 1024 }, { 3, 129, 1024 }, { 3, 130, 1024 }, { 4, 131, 1024 }, { 3, 132, 1024 }, { 4, 133, 1024 }, { 4, 134, 1024 }, { 5, 135, 1024 },
  7552. { 3, 136, 1024 }, { 4, 137, 1024 }, { 4, 138, 1024 }, { 5, 139, 1024 }, { 4, 140, 1024 }, { 5, 141, 1024 }, { 5, 142, 1024 }, { 6, 143, 1024 },
  7553. { 3, 144, 1024 }, { 4, 145, 1024 }, { 4, 146, 1024 }, { 5, 147, 1024 }, { 4, 148, 1024 }, { 5, 149, 1024 }, { 5, 150, 1024 }, { 6, 151, 1024 },
  7554. { 4, 152, 1024 }, { 5, 153, 1024 }, { 5, 154, 1024 }, { 6, 155, 1024 }, { 5, 156, 1024 }, { 6, 157, 1024 }, { 6, 158, 1024 }, { 7, 159, 1024 },
  7555. { 3, 160, 1024 }, { 4, 161, 1024 }, { 4, 162, 1024 }, { 5, 163, 1024 }, { 4, 164, 1024 }, { 5, 165, 1024 }, { 5, 166, 1024 }, { 6, 167, 1024 },
  7556. { 4, 168, 1024 }, { 5, 169, 1024 }, { 5, 170, 1024 }, { 6, 171, 1024 }, { 5, 172, 1024 }, { 6, 173, 1024 }, { 6, 174, 1024 }, { 7, 175, 1024 },
  7557. { 4, 176, 1024 }, { 5, 177, 1024 }, { 5, 178, 1024 }, { 6, 179, 1024 }, { 5, 180, 1024 }, { 6, 181, 1024 }, { 6, 182, 1024 }, { 7, 183, 1024 },
  7558. { 5, 184, 1024 }, { 6, 185, 1024 }, { 6, 186, 1024 }, { 7, 187, 1024 }, { 6, 188, 1024 }, { 7, 189, 1024 }, { 7, 190, 1024 }, { 8, 191, 1024 },
  7559. { 3, 192, 1024 }, { 4, 193, 1024 }, { 4, 194, 1024 }, { 5, 195, 1024 }, { 4, 196, 1024 }, { 5, 197, 1024 }, { 5, 198, 1024 }, { 6, 199, 1024 },
  7560. { 4, 200, 1024 }, { 5, 201, 1024 }, { 5, 202, 1024 }, { 6, 203, 1024 }, { 5, 204, 1024 }, { 6, 205, 1024 }, { 6, 206, 1024 }, { 7, 207, 1024 },
  7561. { 4, 208, 1024 }, { 5, 209, 1024 }, { 5, 210, 1024 }, { 6, 211, 1024 }, { 5, 212, 1024 }, { 6, 213, 1024 }, { 6, 214, 1024 }, { 7, 215, 1024 },
  7562. { 5, 216, 1024 }, { 6, 217, 1024 }, { 6, 218, 1024 }, { 7, 219, 1024 }, { 6, 220, 1024 }, { 7, 221, 1024 }, { 7, 222, 1024 }, { 8, 223, 1024 },
  7563. { 4, 224, 1024 }, { 5, 225, 1024 }, { 5, 226, 1024 }, { 6, 227, 1024 }, { 5, 228, 1024 }, { 6, 229, 1024 }, { 6, 230, 1024 }, { 7, 231, 1024 },
  7564. { 5, 232, 1024 }, { 6, 233, 1024 }, { 6, 234, 1024 }, { 7, 235, 1024 }, { 6, 236, 1024 }, { 7, 237, 1024 }, { 7, 238, 1024 }, { 8, 239, 1024 },
  7565. { 5, 240, 1024 }, { 6, 241, 1024 }, { 6, 242, 1024 }, { 7, 243, 1024 }, { 6, 244, 1024 }, { 7, 245, 1024 }, { 7, 246, 1024 }, { 8, 247, 1024 },
  7566. { 6, 248, 1024 }, { 7, 249, 1024 }, { 7, 250, 1024 }, { 8, 251, 1024 }, { 7, 252, 1024 }, { 8, 253, 1024 }, { 8, 254, 1024 }, { 9, 255, 1024 },
  7567. { 2, 256, 1024 }, { 3, 257, 1024 }, { 3, 258, 1024 }, { 4, 259, 1024 }, { 3, 260, 1024 }, { 4, 261, 1024 }, { 4, 262, 1024 }, { 5, 263, 1024 },
  7568. { 3, 264, 1024 }, { 4, 265, 1024 }, { 4, 266, 1024 }, { 5, 267, 1024 }, { 4, 268, 1024 }, { 5, 269, 1024 }, { 5, 270, 1024 }, { 6, 271, 1024 },
  7569. { 3, 272, 1024 }, { 4, 273, 1024 }, { 4, 274, 1024 }, { 5, 275, 1024 }, { 4, 276, 1024 }, { 5, 277, 1024 }, { 5, 278, 1024 }, { 6, 279, 1024 },
  7570. { 4, 280, 1024 }, { 5, 281, 1024 }, { 5, 282, 1024 }, { 6, 283, 1024 }, { 5, 284, 1024 }, { 6, 285, 1024 }, { 6, 286, 1024 }, { 7, 287, 1024 },
  7571. { 3, 288, 1024 }, { 4, 289, 1024 }, { 4, 290, 1024 }, { 5, 291, 1024 }, { 4, 292, 1024 }, { 5, 293, 1024 }, { 5, 294, 1024 }, { 6, 295, 1024 },
  7572. { 4, 296, 1024 }, { 5, 297, 1024 }, { 5, 298, 1024 }, { 6, 299, 1024 }, { 5, 300, 1024 }, { 6, 301, 1024 }, { 6, 302, 1024 }, { 7, 303, 1024 },
  7573. { 4, 304, 1024 }, { 5, 305, 1024 }, { 5, 306, 1024 }, { 6, 307, 1024 }, { 5, 308, 1024 }, { 6, 309, 1024 }, { 6, 310, 1024 }, { 7, 311, 1024 },
  7574. { 5, 312, 1024 }, { 6, 313, 1024 }, { 6, 314, 1024 }, { 7, 315, 1024 }, { 6, 316, 1024 }, { 7, 317, 1024 }, { 7, 318, 1024 }, { 8, 319, 1024 },
  7575. { 3, 320, 1024 }, { 4, 321, 1024 }, { 4, 322, 1024 }, { 5, 323, 1024 }, { 4, 324, 1024 }, { 5, 325, 1024 }, { 5, 326, 1024 }, { 6, 327, 1024 },
  7576. { 4, 328, 1024 }, { 5, 329, 1024 }, { 5, 330, 1024 }, { 6, 331, 1024 }, { 5, 332, 1024 }, { 6, 333, 1024 }, { 6, 334, 1024 }, { 7, 335, 1024 },
  7577. { 4, 336, 1024 }, { 5, 337, 1024 }, { 5, 338, 1024 }, { 6, 339, 1024 }, { 5, 340, 1024 }, { 6, 341, 1024 }, { 6, 342, 1024 }, { 7, 343, 1024 },
  7578. { 5, 344, 1024 }, { 6, 345, 1024 }, { 6, 346, 1024 }, { 7, 347, 1024 }, { 6, 348, 1024 }, { 7, 349, 1024 }, { 7, 350, 1024 }, { 8, 351, 1024 },
  7579. { 4, 352, 1024 }, { 5, 353, 1024 }, { 5, 354, 1024 }, { 6, 355, 1024 }, { 5, 356, 1024 }, { 6, 357, 1024 }, { 6, 358, 1024 }, { 7, 359, 1024 },
  7580. { 5, 360, 1024 }, { 6, 361, 1024 }, { 6, 362, 1024 }, { 7, 363, 1024 }, { 6, 364, 1024 }, { 7, 365, 1024 }, { 7, 366, 1024 }, { 8, 367, 1024 },
  7581. { 5, 368, 1024 }, { 6, 369, 1024 }, { 6, 370, 1024 }, { 7, 371, 1024 }, { 6, 372, 1024 }, { 7, 373, 1024 }, { 7, 374, 1024 }, { 8, 375, 1024 },
  7582. { 6, 376, 1024 }, { 7, 377, 1024 }, { 7, 378, 1024 }, { 8, 379, 1024 }, { 7, 380, 1024 }, { 8, 381, 1024 }, { 8, 382, 1024 }, { 9, 383, 1024 },
  7583. { 3, 384, 1024 }, { 4, 385, 1024 }, { 4, 386, 1024 }, { 5, 387, 1024 }, { 4, 388, 1024 }, { 5, 389, 1024 }, { 5, 390, 1024 }, { 6, 391, 1024 },
  7584. { 4, 392, 1024 }, { 5, 393, 1024 }, { 5, 394, 1024 }, { 6, 395, 1024 }, { 5, 396, 1024 }, { 6, 397, 1024 }, { 6, 398, 1024 }, { 7, 399, 1024 },
  7585. { 4, 400, 1024 }, { 5, 401, 1024 }, { 5, 402, 1024 }, { 6, 403, 1024 }, { 5, 404, 1024 }, { 6, 405, 1024 }, { 6, 406, 1024 }, { 7, 407, 1024 },
  7586. { 5, 408, 1024 }, { 6, 409, 1024 }, { 6, 410, 1024 }, { 7, 411, 1024 }, { 6, 412, 1024 }, { 7, 413, 1024 }, { 7, 414, 1024 }, { 8, 415, 1024 },
  7587. { 4, 416, 1024 }, { 5, 417, 1024 }, { 5, 418, 1024 }, { 6, 419, 1024 }, { 5, 420, 1024 }, { 6, 421, 1024 }, { 6, 422, 1024 }, { 7, 423, 1024 },
  7588. { 5, 424, 1024 }, { 6, 425, 1024 }, { 6, 426, 1024 }, { 7, 427, 1024 }, { 6, 428, 1024 }, { 7, 429, 1024 }, { 7, 430, 1024 }, { 8, 431, 1024 },
  7589. { 5, 432, 1024 }, { 6, 433, 1024 }, { 6, 434, 1024 }, { 7, 435, 1024 }, { 6, 436, 1024 }, { 7, 437, 1024 }, { 7, 438, 1024 }, { 8, 439, 1024 },
  7590. { 6, 440, 1024 }, { 7, 441, 1024 }, { 7, 442, 1024 }, { 8, 443, 1024 }, { 7, 444, 1024 }, { 8, 445, 1024 }, { 8, 446, 1024 }, { 9, 447, 1024 },
  7591. { 4, 448, 1024 }, { 5, 449, 1024 }, { 5, 450, 1024 }, { 6, 451, 1024 }, { 5, 452, 1024 }, { 6, 453, 1024 }, { 6, 454, 1024 }, { 7, 455, 1024 },
  7592. { 5, 456, 1024 }, { 6, 457, 1024 }, { 6, 458, 1024 }, { 7, 459, 1024 }, { 6, 460, 1024 }, { 7, 461, 1024 }, { 7, 462, 1024 }, { 8, 463, 1024 },
  7593. { 5, 464, 1024 }, { 6, 465, 1024 }, { 6, 466, 1024 }, { 7, 467, 1024 }, { 6, 468, 1024 }, { 7, 469, 1024 }, { 7, 470, 1024 }, { 8, 471, 1024 },
  7594. { 6, 472, 1024 }, { 7, 473, 1024 }, { 7, 474, 1024 }, { 8, 475, 1024 }, { 7, 476, 1024 }, { 8, 477, 1024 }, { 8, 478, 1024 }, { 9, 479, 1024 },
  7595. { 5, 480, 1024 }, { 6, 481, 1024 }, { 6, 482, 1024 }, { 7, 483, 1024 }, { 6, 484, 1024 }, { 7, 485, 1024 }, { 7, 486, 1024 }, { 8, 487, 1024 },
  7596. { 6, 488, 1024 }, { 7, 489, 1024 }, { 7, 490, 1024 }, { 8, 491, 1024 }, { 7, 492, 1024 }, { 8, 493, 1024 }, { 8, 494, 1024 }, { 9, 495, 1024 },
  7597. { 6, 496, 1024 }, { 7, 497, 1024 }, { 7, 498, 1024 }, { 8, 499, 1024 }, { 7, 500, 1024 }, { 8, 501, 1024 }, { 8, 502, 1024 }, { 9, 503, 1024 },
  7598. { 7, 504, 1024 }, { 8, 505, 1024 }, { 8, 506, 1024 }, { 9, 507, 1024 }, { 8, 508, 1024 }, { 9, 509, 1024 }, { 9, 510, 1024 }, { 10, 511, 1024 },
  7599. { 2, 512, 1024 }, { 3, 513, 1024 }, { 3, 514, 1024 }, { 4, 515, 1024 }, { 3, 516, 1024 }, { 4, 517, 1024 }, { 4, 518, 1024 }, { 5, 519, 1024 },
  7600. { 3, 520, 1024 }, { 4, 521, 1024 }, { 4, 522, 1024 }, { 5, 523, 1024 }, { 4, 524, 1024 }, { 5, 525, 1024 }, { 5, 526, 1024 }, { 6, 527, 1024 },
  7601. { 3, 528, 1024 }, { 4, 529, 1024 }, { 4, 530, 1024 }, { 5, 531, 1024 }, { 4, 532, 1024 }, { 5, 533, 1024 }, { 5, 534, 1024 }, { 6, 535, 1024 },
  7602. { 4, 536, 1024 }, { 5, 537, 1024 }, { 5, 538, 1024 }, { 6, 539, 1024 }, { 5, 540, 1024 }, { 6, 541, 1024 }, { 6, 542, 1024 }, { 7, 543, 1024 },
  7603. { 3, 544, 1024 }, { 4, 545, 1024 }, { 4, 546, 1024 }, { 5, 547, 1024 }, { 4, 548, 1024 }, { 5, 549, 1024 }, { 5, 550, 1024 }, { 6, 551, 1024 },
  7604. { 4, 552, 1024 }, { 5, 553, 1024 }, { 5, 554, 1024 }, { 6, 555, 1024 }, { 5, 556, 1024 }, { 6, 557, 1024 }, { 6, 558, 1024 }, { 7, 559, 1024 },
  7605. { 4, 560, 1024 }, { 5, 561, 1024 }, { 5, 562, 1024 }, { 6, 563, 1024 }, { 5, 564, 1024 }, { 6, 565, 1024 }, { 6, 566, 1024 }, { 7, 567, 1024 },
  7606. { 5, 568, 1024 }, { 6, 569, 1024 }, { 6, 570, 1024 }, { 7, 571, 1024 }, { 6, 572, 1024 }, { 7, 573, 1024 }, { 7, 574, 1024 }, { 8, 575, 1024 },
  7607. { 3, 576, 1024 }, { 4, 577, 1024 }, { 4, 578, 1024 }, { 5, 579, 1024 }, { 4, 580, 1024 }, { 5, 581, 1024 }, { 5, 582, 1024 }, { 6, 583, 1024 },
  7608. { 4, 584, 1024 }, { 5, 585, 1024 }, { 5, 586, 1024 }, { 6, 587, 1024 }, { 5, 588, 1024 }, { 6, 589, 1024 }, { 6, 590, 1024 }, { 7, 591, 1024 },
  7609. { 4, 592, 1024 }, { 5, 593, 1024 }, { 5, 594, 1024 }, { 6, 595, 1024 }, { 5, 596, 1024 }, { 6, 597, 1024 }, { 6, 598, 1024 }, { 7, 599, 1024 },
  7610. { 5, 600, 1024 }, { 6, 601, 1024 }, { 6, 602, 1024 }, { 7, 603, 1024 }, { 6, 604, 1024 }, { 7, 605, 1024 }, { 7, 606, 1024 }, { 8, 607, 1024 },
  7611. { 4, 608, 1024 }, { 5, 609, 1024 }, { 5, 610, 1024 }, { 6, 611, 1024 }, { 5, 612, 1024 }, { 6, 613, 1024 }, { 6, 614, 1024 }, { 7, 615, 1024 },
  7612. { 5, 616, 1024 }, { 6, 617, 1024 }, { 6, 618, 1024 }, { 7, 619, 1024 }, { 6, 620, 1024 }, { 7, 621, 1024 }, { 7, 622, 1024 }, { 8, 623, 1024 },
  7613. { 5, 624, 1024 }, { 6, 625, 1024 }, { 6, 626, 1024 }, { 7, 627, 1024 }, { 6, 628, 1024 }, { 7, 629, 1024 }, { 7, 630, 1024 }, { 8, 631, 1024 },
  7614. { 6, 632, 1024 }, { 7, 633, 1024 }, { 7, 634, 1024 }, { 8, 635, 1024 }, { 7, 636, 1024 }, { 8, 637, 1024 }, { 8, 638, 1024 }, { 9, 639, 1024 },
  7615. { 3, 640, 1024 }, { 4, 641, 1024 }, { 4, 642, 1024 }, { 5, 643, 1024 }, { 4, 644, 1024 }, { 5, 645, 1024 }, { 5, 646, 1024 }, { 6, 647, 1024 },
  7616. { 4, 648, 1024 }, { 5, 649, 1024 }, { 5, 650, 1024 }, { 6, 651, 1024 }, { 5, 652, 1024 }, { 6, 653, 1024 }, { 6, 654, 1024 }, { 7, 655, 1024 },
  7617. { 4, 656, 1024 }, { 5, 657, 1024 }, { 5, 658, 1024 }, { 6, 659, 1024 }, { 5, 660, 1024 }, { 6, 661, 1024 }, { 6, 662, 1024 }, { 7, 663, 1024 },
  7618. { 5, 664, 1024 }, { 6, 665, 1024 }, { 6, 666, 1024 }, { 7, 667, 1024 }, { 6, 668, 1024 }, { 7, 669, 1024 }, { 7, 670, 1024 }, { 8, 671, 1024 },
  7619. { 4, 672, 1024 }, { 5, 673, 1024 }, { 5, 674, 1024 }, { 6, 675, 1024 }, { 5, 676, 1024 }, { 6, 677, 1024 }, { 6, 678, 1024 }, { 7, 679, 1024 },
  7620. { 5, 680, 1024 }, { 6, 681, 1024 }, { 6, 682, 1024 }, { 7, 683, 1024 }, { 6, 684, 1024 }, { 7, 685, 1024 }, { 7, 686, 1024 }, { 8, 687, 1024 },
  7621. { 5, 688, 1024 }, { 6, 689, 1024 }, { 6, 690, 1024 }, { 7, 691, 1024 }, { 6, 692, 1024 }, { 7, 693, 1024 }, { 7, 694, 1024 }, { 8, 695, 1024 },
  7622. { 6, 696, 1024 }, { 7, 697, 1024 }, { 7, 698, 1024 }, { 8, 699, 1024 }, { 7, 700, 1024 }, { 8, 701, 1024 }, { 8, 702, 1024 }, { 9, 703, 1024 },
  7623. { 4, 704, 1024 }, { 5, 705, 1024 }, { 5, 706, 1024 }, { 6, 707, 1024 }, { 5, 708, 1024 }, { 6, 709, 1024 }, { 6, 710, 1024 }, { 7, 711, 1024 },
  7624. { 5, 712, 1024 }, { 6, 713, 1024 }, { 6, 714, 1024 }, { 7, 715, 1024 }, { 6, 716, 1024 }, { 7, 717, 1024 }, { 7, 718, 1024 }, { 8, 719, 1024 },
  7625. { 5, 720, 1024 }, { 6, 721, 1024 }, { 6, 722, 1024 }, { 7, 723, 1024 }, { 6, 724, 1024 }, { 7, 725, 1024 }, { 7, 726, 1024 }, { 8, 727, 1024 },
  7626. { 6, 728, 1024 }, { 7, 729, 1024 }, { 7, 730, 1024 }, { 8, 731, 1024 }, { 7, 732, 1024 }, { 8, 733, 1024 }, { 8, 734, 1024 }, { 9, 735, 1024 },
  7627. { 5, 736, 1024 }, { 6, 737, 1024 }, { 6, 738, 1024 }, { 7, 739, 1024 }, { 6, 740, 1024 }, { 7, 741, 1024 }, { 7, 742, 1024 }, { 8, 743, 1024 },
  7628. { 6, 744, 1024 }, { 7, 745, 1024 }, { 7, 746, 1024 }, { 8, 747, 1024 }, { 7, 748, 1024 }, { 8, 749, 1024 }, { 8, 750, 1024 }, { 9, 751, 1024 },
  7629. { 6, 752, 1024 }, { 7, 753, 1024 }, { 7, 754, 1024 }, { 8, 755, 1024 }, { 7, 756, 1024 }, { 8, 757, 1024 }, { 8, 758, 1024 }, { 9, 759, 1024 },
  7630. { 7, 760, 1024 }, { 8, 761, 1024 }, { 8, 762, 1024 }, { 9, 763, 1024 }, { 8, 764, 1024 }, { 9, 765, 1024 }, { 9, 766, 1024 }, { 10, 767, 1024 },
  7631. { 3, 768, 1024 }, { 4, 769, 1024 }, { 4, 770, 1024 }, { 5, 771, 1024 }, { 4, 772, 1024 }, { 5, 773, 1024 }, { 5, 774, 1024 }, { 6, 775, 1024 },
  7632. { 4, 776, 1024 }, { 5, 777, 1024 }, { 5, 778, 1024 }, { 6, 779, 1024 }, { 5, 780, 1024 }, { 6, 781, 1024 }, { 6, 782, 1024 }, { 7, 783, 1024 },
  7633. { 4, 784, 1024 }, { 5, 785, 1024 }, { 5, 786, 1024 }, { 6, 787, 1024 }, { 5, 788, 1024 }, { 6, 789, 1024 }, { 6, 790, 1024 }, { 7, 791, 1024 },
  7634. { 5, 792, 1024 }, { 6, 793, 1024 }, { 6, 794, 1024 }, { 7, 795, 1024 }, { 6, 796, 1024 }, { 7, 797, 1024 }, { 7, 798, 1024 }, { 8, 799, 1024 },
  7635. { 4, 800, 1024 }, { 5, 801, 1024 }, { 5, 802, 1024 }, { 6, 803, 1024 }, { 5, 804, 1024 }, { 6, 805, 1024 }, { 6, 806, 1024 }, { 7, 807, 1024 },
  7636. { 5, 808, 1024 }, { 6, 809, 1024 }, { 6, 810, 1024 }, { 7, 811, 1024 }, { 6, 812, 1024 }, { 7, 813, 1024 }, { 7, 814, 1024 }, { 8, 815, 1024 },
  7637. { 5, 816, 1024 }, { 6, 817, 1024 }, { 6, 818, 1024 }, { 7, 819, 1024 }, { 6, 820, 1024 }, { 7, 821, 1024 }, { 7, 822, 1024 }, { 8, 823, 1024 },
  7638. { 6, 824, 1024 }, { 7, 825, 1024 }, { 7, 826, 1024 }, { 8, 827, 1024 }, { 7, 828, 1024 }, { 8, 829, 1024 }, { 8, 830, 1024 }, { 9, 831, 1024 },
  7639. { 4, 832, 1024 }, { 5, 833, 1024 }, { 5, 834, 1024 }, { 6, 835, 1024 }, { 5, 836, 1024 }, { 6, 837, 1024 }, { 6, 838, 1024 }, { 7, 839, 1024 },
  7640. { 5, 840, 1024 }, { 6, 841, 1024 }, { 6, 842, 1024 }, { 7, 843, 1024 }, { 6, 844, 1024 }, { 7, 845, 1024 }, { 7, 846, 1024 }, { 8, 847, 1024 },
  7641. { 5, 848, 1024 }, { 6, 849, 1024 }, { 6, 850, 1024 }, { 7, 851, 1024 }, { 6, 852, 1024 }, { 7, 853, 1024 }, { 7, 854, 1024 }, { 8, 855, 1024 },
  7642. { 6, 856, 1024 }, { 7, 857, 1024 }, { 7, 858, 1024 }, { 8, 859, 1024 }, { 7, 860, 1024 }, { 8, 861, 1024 }, { 8, 862, 1024 }, { 9, 863, 1024 },
  7643. { 5, 864, 1024 }, { 6, 865, 1024 }, { 6, 866, 1024 }, { 7, 867, 1024 }, { 6, 868, 1024 }, { 7, 869, 1024 }, { 7, 870, 1024 }, { 8, 871, 1024 },
  7644. { 6, 872, 1024 }, { 7, 873, 1024 }, { 7, 874, 1024 }, { 8, 875, 1024 }, { 7, 876, 1024 }, { 8, 877, 1024 }, { 8, 878, 1024 }, { 9, 879, 1024 },
  7645. { 6, 880, 1024 }, { 7, 881, 1024 }, { 7, 882, 1024 }, { 8, 883, 1024 }, { 7, 884, 1024 }, { 8, 885, 1024 }, { 8, 886, 1024 }, { 9, 887, 1024 },
  7646. { 7, 888, 1024 }, { 8, 889, 1024 }, { 8, 890, 1024 }, { 9, 891, 1024 }, { 8, 892, 1024 }, { 9, 893, 1024 }, { 9, 894, 1024 }, { 10, 895, 1024 },
  7647. { 4, 896, 1024 }, { 5, 897, 1024 }, { 5, 898, 1024 }, { 6, 899, 1024 }, { 5, 900, 1024 }, { 6, 901, 1024 }, { 6, 902, 1024 }, { 7, 903, 1024 },
  7648. { 5, 904, 1024 }, { 6, 905, 1024 }, { 6, 906, 1024 }, { 7, 907, 1024 }, { 6, 908, 1024 }, { 7, 909, 1024 }, { 7, 910, 1024 }, { 8, 911, 1024 },
  7649. { 5, 912, 1024 }, { 6, 913, 1024 }, { 6, 914, 1024 }, { 7, 915, 1024 }, { 6, 916, 1024 }, { 7, 917, 1024 }, { 7, 918, 1024 }, { 8, 919, 1024 },
  7650. { 6, 920, 1024 }, { 7, 921, 1024 }, { 7, 922, 1024 }, { 8, 923, 1024 }, { 7, 924, 1024 }, { 8, 925, 1024 }, { 8, 926, 1024 }, { 9, 927, 1024 },
  7651. { 5, 928, 1024 }, { 6, 929, 1024 }, { 6, 930, 1024 }, { 7, 931, 1024 }, { 6, 932, 1024 }, { 7, 933, 1024 }, { 7, 934, 1024 }, { 8, 935, 1024 },
  7652. { 6, 936, 1024 }, { 7, 937, 1024 }, { 7, 938, 1024 }, { 8, 939, 1024 }, { 7, 940, 1024 }, { 8, 941, 1024 }, { 8, 942, 1024 }, { 9, 943, 1024 },
  7653. { 6, 944, 1024 }, { 7, 945, 1024 }, { 7, 946, 1024 }, { 8, 947, 1024 }, { 7, 948, 1024 }, { 8, 949, 1024 }, { 8, 950, 1024 }, { 9, 951, 1024 },
  7654. { 7, 952, 1024 }, { 8, 953, 1024 }, { 8, 954, 1024 }, { 9, 955, 1024 }, { 8, 956, 1024 }, { 9, 957, 1024 }, { 9, 958, 1024 }, { 10, 959, 1024 },
  7655. { 5, 960, 1024 }, { 6, 961, 1024 }, { 6, 962, 1024 }, { 7, 963, 1024 }, { 6, 964, 1024 }, { 7, 965, 1024 }, { 7, 966, 1024 }, { 8, 967, 1024 },
  7656. { 6, 968, 1024 }, { 7, 969, 1024 }, { 7, 970, 1024 }, { 8, 971, 1024 }, { 7, 972, 1024 }, { 8, 973, 1024 }, { 8, 974, 1024 }, { 9, 975, 1024 },
  7657. { 6, 976, 1024 }, { 7, 977, 1024 }, { 7, 978, 1024 }, { 8, 979, 1024 }, { 7, 980, 1024 }, { 8, 981, 1024 }, { 8, 982, 1024 }, { 9, 983, 1024 },
  7658. { 7, 984, 1024 }, { 8, 985, 1024 }, { 8, 986, 1024 }, { 9, 987, 1024 }, { 8, 988, 1024 }, { 9, 989, 1024 }, { 9, 990, 1024 }, { 10, 991, 1024 },
  7659. { 6, 992, 1024 }, { 7, 993, 1024 }, { 7, 994, 1024 }, { 8, 995, 1024 }, { 7, 996, 1024 }, { 8, 997, 1024 }, { 8, 998, 1024 }, { 9, 999, 1024 },
  7660. { 7, 1000, 1024 }, { 8, 1001, 1024 }, { 8, 1002, 1024 }, { 9, 1003, 1024 }, { 8, 1004, 1024 }, { 9, 1005, 1024 }, { 9, 1006, 1024 }, { 10, 1007, 1024 },
  7661. { 7, 1008, 1024 }, { 8, 1009, 1024 }, { 8, 1010, 1024 }, { 9, 1011, 1024 }, { 8, 1012, 1024 }, { 9, 1013, 1024 }, { 9, 1014, 1024 }, { 10, 1015, 1024 },
  7662. { 8, 1016, 1024 }, { 9, 1017, 1024 }, { 9, 1018, 1024 }, { 10, 1019, 1024 }, { 9, 1020, 1024 }, { 10, 1021, 1024 }, { 10, 1022, 1024 }, { 11, 1023, 1024 },
  7663. #if FP_LUT > 11
  7664. { 1, 0, 0 }, { 2, 1, 2048 }, { 2, 2, 2048 }, { 3, 3, 2048 }, { 2, 4, 2048 }, { 3, 5, 2048 }, { 3, 6, 2048 }, { 4, 7, 2048 },
  7665. { 2, 8, 2048 }, { 3, 9, 2048 }, { 3, 10, 2048 }, { 4, 11, 2048 }, { 3, 12, 2048 }, { 4, 13, 2048 }, { 4, 14, 2048 }, { 5, 15, 2048 },
  7666. { 2, 16, 2048 }, { 3, 17, 2048 }, { 3, 18, 2048 }, { 4, 19, 2048 }, { 3, 20, 2048 }, { 4, 21, 2048 }, { 4, 22, 2048 }, { 5, 23, 2048 },
  7667. { 3, 24, 2048 }, { 4, 25, 2048 }, { 4, 26, 2048 }, { 5, 27, 2048 }, { 4, 28, 2048 }, { 5, 29, 2048 }, { 5, 30, 2048 }, { 6, 31, 2048 },
  7668. { 2, 32, 2048 }, { 3, 33, 2048 }, { 3, 34, 2048 }, { 4, 35, 2048 }, { 3, 36, 2048 }, { 4, 37, 2048 }, { 4, 38, 2048 }, { 5, 39, 2048 },
  7669. { 3, 40, 2048 }, { 4, 41, 2048 }, { 4, 42, 2048 }, { 5, 43, 2048 }, { 4, 44, 2048 }, { 5, 45, 2048 }, { 5, 46, 2048 }, { 6, 47, 2048 },
  7670. { 3, 48, 2048 }, { 4, 49, 2048 }, { 4, 50, 2048 }, { 5, 51, 2048 }, { 4, 52, 2048 }, { 5, 53, 2048 }, { 5, 54, 2048 }, { 6, 55, 2048 },
  7671. { 4, 56, 2048 }, { 5, 57, 2048 }, { 5, 58, 2048 }, { 6, 59, 2048 }, { 5, 60, 2048 }, { 6, 61, 2048 }, { 6, 62, 2048 }, { 7, 63, 2048 },
  7672. { 2, 64, 2048 }, { 3, 65, 2048 }, { 3, 66, 2048 }, { 4, 67, 2048 }, { 3, 68, 2048 }, { 4, 69, 2048 }, { 4, 70, 2048 }, { 5, 71, 2048 },
  7673. { 3, 72, 2048 }, { 4, 73, 2048 }, { 4, 74, 2048 }, { 5, 75, 2048 }, { 4, 76, 2048 }, { 5, 77, 2048 }, { 5, 78, 2048 }, { 6, 79, 2048 },
  7674. { 3, 80, 2048 }, { 4, 81, 2048 }, { 4, 82, 2048 }, { 5, 83, 2048 }, { 4, 84, 2048 }, { 5, 85, 2048 }, { 5, 86, 2048 }, { 6, 87, 2048 },
  7675. { 4, 88, 2048 }, { 5, 89, 2048 }, { 5, 90, 2048 }, { 6, 91, 2048 }, { 5, 92, 2048 }, { 6, 93, 2048 }, { 6, 94, 2048 }, { 7, 95, 2048 },
  7676. { 3, 96, 2048 }, { 4, 97, 2048 }, { 4, 98, 2048 }, { 5, 99, 2048 }, { 4, 100, 2048 }, { 5, 101, 2048 }, { 5, 102, 2048 }, { 6, 103, 2048 },
  7677. { 4, 104, 2048 }, { 5, 105, 2048 }, { 5, 106, 2048 }, { 6, 107, 2048 }, { 5, 108, 2048 }, { 6, 109, 2048 }, { 6, 110, 2048 }, { 7, 111, 2048 },
  7678. { 4, 112, 2048 }, { 5, 113, 2048 }, { 5, 114, 2048 }, { 6, 115, 2048 }, { 5, 116, 2048 }, { 6, 117, 2048 }, { 6, 118, 2048 }, { 7, 119, 2048 },
  7679. { 5, 120, 2048 }, { 6, 121, 2048 }, { 6, 122, 2048 }, { 7, 123, 2048 }, { 6, 124, 2048 }, { 7, 125, 2048 }, { 7, 126, 2048 }, { 8, 127, 2048 },
  7680. { 2, 128, 2048 }, { 3, 129, 2048 }, { 3, 130, 2048 }, { 4, 131, 2048 }, { 3, 132, 2048 }, { 4, 133, 2048 }, { 4, 134, 2048 }, { 5, 135, 2048 },
  7681. { 3, 136, 2048 }, { 4, 137, 2048 }, { 4, 138, 2048 }, { 5, 139, 2048 }, { 4, 140, 2048 }, { 5, 141, 2048 }, { 5, 142, 2048 }, { 6, 143, 2048 },
  7682. { 3, 144, 2048 }, { 4, 145, 2048 }, { 4, 146, 2048 }, { 5, 147, 2048 }, { 4, 148, 2048 }, { 5, 149, 2048 }, { 5, 150, 2048 }, { 6, 151, 2048 },
  7683. { 4, 152, 2048 }, { 5, 153, 2048 }, { 5, 154, 2048 }, { 6, 155, 2048 }, { 5, 156, 2048 }, { 6, 157, 2048 }, { 6, 158, 2048 }, { 7, 159, 2048 },
  7684. { 3, 160, 2048 }, { 4, 161, 2048 }, { 4, 162, 2048 }, { 5, 163, 2048 }, { 4, 164, 2048 }, { 5, 165, 2048 }, { 5, 166, 2048 }, { 6, 167, 2048 },
  7685. { 4, 168, 2048 }, { 5, 169, 2048 }, { 5, 170, 2048 }, { 6, 171, 2048 }, { 5, 172, 2048 }, { 6, 173, 2048 }, { 6, 174, 2048 }, { 7, 175, 2048 },
  7686. { 4, 176, 2048 }, { 5, 177, 2048 }, { 5, 178, 2048 }, { 6, 179, 2048 }, { 5, 180, 2048 }, { 6, 181, 2048 }, { 6, 182, 2048 }, { 7, 183, 2048 },
  7687. { 5, 184, 2048 }, { 6, 185, 2048 }, { 6, 186, 2048 }, { 7, 187, 2048 }, { 6, 188, 2048 }, { 7, 189, 2048 }, { 7, 190, 2048 }, { 8, 191, 2048 },
  7688. { 3, 192, 2048 }, { 4, 193, 2048 }, { 4, 194, 2048 }, { 5, 195, 2048 }, { 4, 196, 2048 }, { 5, 197, 2048 }, { 5, 198, 2048 }, { 6, 199, 2048 },
  7689. { 4, 200, 2048 }, { 5, 201, 2048 }, { 5, 202, 2048 }, { 6, 203, 2048 }, { 5, 204, 2048 }, { 6, 205, 2048 }, { 6, 206, 2048 }, { 7, 207, 2048 },
  7690. { 4, 208, 2048 }, { 5, 209, 2048 }, { 5, 210, 2048 }, { 6, 211, 2048 }, { 5, 212, 2048 }, { 6, 213, 2048 }, { 6, 214, 2048 }, { 7, 215, 2048 },
  7691. { 5, 216, 2048 }, { 6, 217, 2048 }, { 6, 218, 2048 }, { 7, 219, 2048 }, { 6, 220, 2048 }, { 7, 221, 2048 }, { 7, 222, 2048 }, { 8, 223, 2048 },
  7692. { 4, 224, 2048 }, { 5, 225, 2048 }, { 5, 226, 2048 }, { 6, 227, 2048 }, { 5, 228, 2048 }, { 6, 229, 2048 }, { 6, 230, 2048 }, { 7, 231, 2048 },
  7693. { 5, 232, 2048 }, { 6, 233, 2048 }, { 6, 234, 2048 }, { 7, 235, 2048 }, { 6, 236, 2048 }, { 7, 237, 2048 }, { 7, 238, 2048 }, { 8, 239, 2048 },
  7694. { 5, 240, 2048 }, { 6, 241, 2048 }, { 6, 242, 2048 }, { 7, 243, 2048 }, { 6, 244, 2048 }, { 7, 245, 2048 }, { 7, 246, 2048 }, { 8, 247, 2048 },
  7695. { 6, 248, 2048 }, { 7, 249, 2048 }, { 7, 250, 2048 }, { 8, 251, 2048 }, { 7, 252, 2048 }, { 8, 253, 2048 }, { 8, 254, 2048 }, { 9, 255, 2048 },
  7696. { 2, 256, 2048 }, { 3, 257, 2048 }, { 3, 258, 2048 }, { 4, 259, 2048 }, { 3, 260, 2048 }, { 4, 261, 2048 }, { 4, 262, 2048 }, { 5, 263, 2048 },
  7697. { 3, 264, 2048 }, { 4, 265, 2048 }, { 4, 266, 2048 }, { 5, 267, 2048 }, { 4, 268, 2048 }, { 5, 269, 2048 }, { 5, 270, 2048 }, { 6, 271, 2048 },
  7698. { 3, 272, 2048 }, { 4, 273, 2048 }, { 4, 274, 2048 }, { 5, 275, 2048 }, { 4, 276, 2048 }, { 5, 277, 2048 }, { 5, 278, 2048 }, { 6, 279, 2048 },
  7699. { 4, 280, 2048 }, { 5, 281, 2048 }, { 5, 282, 2048 }, { 6, 283, 2048 }, { 5, 284, 2048 }, { 6, 285, 2048 }, { 6, 286, 2048 }, { 7, 287, 2048 },
  7700. { 3, 288, 2048 }, { 4, 289, 2048 }, { 4, 290, 2048 }, { 5, 291, 2048 }, { 4, 292, 2048 }, { 5, 293, 2048 }, { 5, 294, 2048 }, { 6, 295, 2048 },
  7701. { 4, 296, 2048 }, { 5, 297, 2048 }, { 5, 298, 2048 }, { 6, 299, 2048 }, { 5, 300, 2048 }, { 6, 301, 2048 }, { 6, 302, 2048 }, { 7, 303, 2048 },
  7702. { 4, 304, 2048 }, { 5, 305, 2048 }, { 5, 306, 2048 }, { 6, 307, 2048 }, { 5, 308, 2048 }, { 6, 309, 2048 }, { 6, 310, 2048 }, { 7, 311, 2048 },
  7703. { 5, 312, 2048 }, { 6, 313, 2048 }, { 6, 314, 2048 }, { 7, 315, 2048 }, { 6, 316, 2048 }, { 7, 317, 2048 }, { 7, 318, 2048 }, { 8, 319, 2048 },
  7704. { 3, 320, 2048 }, { 4, 321, 2048 }, { 4, 322, 2048 }, { 5, 323, 2048 }, { 4, 324, 2048 }, { 5, 325, 2048 }, { 5, 326, 2048 }, { 6, 327, 2048 },
  7705. { 4, 328, 2048 }, { 5, 329, 2048 }, { 5, 330, 2048 }, { 6, 331, 2048 }, { 5, 332, 2048 }, { 6, 333, 2048 }, { 6, 334, 2048 }, { 7, 335, 2048 },
  7706. { 4, 336, 2048 }, { 5, 337, 2048 }, { 5, 338, 2048 }, { 6, 339, 2048 }, { 5, 340, 2048 }, { 6, 341, 2048 }, { 6, 342, 2048 }, { 7, 343, 2048 },
  7707. { 5, 344, 2048 }, { 6, 345, 2048 }, { 6, 346, 2048 }, { 7, 347, 2048 }, { 6, 348, 2048 }, { 7, 349, 2048 }, { 7, 350, 2048 }, { 8, 351, 2048 },
  7708. { 4, 352, 2048 }, { 5, 353, 2048 }, { 5, 354, 2048 }, { 6, 355, 2048 }, { 5, 356, 2048 }, { 6, 357, 2048 }, { 6, 358, 2048 }, { 7, 359, 2048 },
  7709. { 5, 360, 2048 }, { 6, 361, 2048 }, { 6, 362, 2048 }, { 7, 363, 2048 }, { 6, 364, 2048 }, { 7, 365, 2048 }, { 7, 366, 2048 }, { 8, 367, 2048 },
  7710. { 5, 368, 2048 }, { 6, 369, 2048 }, { 6, 370, 2048 }, { 7, 371, 2048 }, { 6, 372, 2048 }, { 7, 373, 2048 }, { 7, 374, 2048 }, { 8, 375, 2048 },
  7711. { 6, 376, 2048 }, { 7, 377, 2048 }, { 7, 378, 2048 }, { 8, 379, 2048 }, { 7, 380, 2048 }, { 8, 381, 2048 }, { 8, 382, 2048 }, { 9, 383, 2048 },
  7712. { 3, 384, 2048 }, { 4, 385, 2048 }, { 4, 386, 2048 }, { 5, 387, 2048 }, { 4, 388, 2048 }, { 5, 389, 2048 }, { 5, 390, 2048 }, { 6, 391, 2048 },
  7713. { 4, 392, 2048 }, { 5, 393, 2048 }, { 5, 394, 2048 }, { 6, 395, 2048 }, { 5, 396, 2048 }, { 6, 397, 2048 }, { 6, 398, 2048 }, { 7, 399, 2048 },
  7714. { 4, 400, 2048 }, { 5, 401, 2048 }, { 5, 402, 2048 }, { 6, 403, 2048 }, { 5, 404, 2048 }, { 6, 405, 2048 }, { 6, 406, 2048 }, { 7, 407, 2048 },
  7715. { 5, 408, 2048 }, { 6, 409, 2048 }, { 6, 410, 2048 }, { 7, 411, 2048 }, { 6, 412, 2048 }, { 7, 413, 2048 }, { 7, 414, 2048 }, { 8, 415, 2048 },
  7716. { 4, 416, 2048 }, { 5, 417, 2048 }, { 5, 418, 2048 }, { 6, 419, 2048 }, { 5, 420, 2048 }, { 6, 421, 2048 }, { 6, 422, 2048 }, { 7, 423, 2048 },
  7717. { 5, 424, 2048 }, { 6, 425, 2048 }, { 6, 426, 2048 }, { 7, 427, 2048 }, { 6, 428, 2048 }, { 7, 429, 2048 }, { 7, 430, 2048 }, { 8, 431, 2048 },
  7718. { 5, 432, 2048 }, { 6, 433, 2048 }, { 6, 434, 2048 }, { 7, 435, 2048 }, { 6, 436, 2048 }, { 7, 437, 2048 }, { 7, 438, 2048 }, { 8, 439, 2048 },
  7719. { 6, 440, 2048 }, { 7, 441, 2048 }, { 7, 442, 2048 }, { 8, 443, 2048 }, { 7, 444, 2048 }, { 8, 445, 2048 }, { 8, 446, 2048 }, { 9, 447, 2048 },
  7720. { 4, 448, 2048 }, { 5, 449, 2048 }, { 5, 450, 2048 }, { 6, 451, 2048 }, { 5, 452, 2048 }, { 6, 453, 2048 }, { 6, 454, 2048 }, { 7, 455, 2048 },
  7721. { 5, 456, 2048 }, { 6, 457, 2048 }, { 6, 458, 2048 }, { 7, 459, 2048 }, { 6, 460, 2048 }, { 7, 461, 2048 }, { 7, 462, 2048 }, { 8, 463, 2048 },
  7722. { 5, 464, 2048 }, { 6, 465, 2048 }, { 6, 466, 2048 }, { 7, 467, 2048 }, { 6, 468, 2048 }, { 7, 469, 2048 }, { 7, 470, 2048 }, { 8, 471, 2048 },
  7723. { 6, 472, 2048 }, { 7, 473, 2048 }, { 7, 474, 2048 }, { 8, 475, 2048 }, { 7, 476, 2048 }, { 8, 477, 2048 }, { 8, 478, 2048 }, { 9, 479, 2048 },
  7724. { 5, 480, 2048 }, { 6, 481, 2048 }, { 6, 482, 2048 }, { 7, 483, 2048 }, { 6, 484, 2048 }, { 7, 485, 2048 }, { 7, 486, 2048 }, { 8, 487, 2048 },
  7725. { 6, 488, 2048 }, { 7, 489, 2048 }, { 7, 490, 2048 }, { 8, 491, 2048 }, { 7, 492, 2048 }, { 8, 493, 2048 }, { 8, 494, 2048 }, { 9, 495, 2048 },
  7726. { 6, 496, 2048 }, { 7, 497, 2048 }, { 7, 498, 2048 }, { 8, 499, 2048 }, { 7, 500, 2048 }, { 8, 501, 2048 }, { 8, 502, 2048 }, { 9, 503, 2048 },
  7727. { 7, 504, 2048 }, { 8, 505, 2048 }, { 8, 506, 2048 }, { 9, 507, 2048 }, { 8, 508, 2048 }, { 9, 509, 2048 }, { 9, 510, 2048 }, { 10, 511, 2048 },
  7728. { 2, 512, 2048 }, { 3, 513, 2048 }, { 3, 514, 2048 }, { 4, 515, 2048 }, { 3, 516, 2048 }, { 4, 517, 2048 }, { 4, 518, 2048 }, { 5, 519, 2048 },
  7729. { 3, 520, 2048 }, { 4, 521, 2048 }, { 4, 522, 2048 }, { 5, 523, 2048 }, { 4, 524, 2048 }, { 5, 525, 2048 }, { 5, 526, 2048 }, { 6, 527, 2048 },
  7730. { 3, 528, 2048 }, { 4, 529, 2048 }, { 4, 530, 2048 }, { 5, 531, 2048 }, { 4, 532, 2048 }, { 5, 533, 2048 }, { 5, 534, 2048 }, { 6, 535, 2048 },
  7731. { 4, 536, 2048 }, { 5, 537, 2048 }, { 5, 538, 2048 }, { 6, 539, 2048 }, { 5, 540, 2048 }, { 6, 541, 2048 }, { 6, 542, 2048 }, { 7, 543, 2048 },
  7732. { 3, 544, 2048 }, { 4, 545, 2048 }, { 4, 546, 2048 }, { 5, 547, 2048 }, { 4, 548, 2048 }, { 5, 549, 2048 }, { 5, 550, 2048 }, { 6, 551, 2048 },
  7733. { 4, 552, 2048 }, { 5, 553, 2048 }, { 5, 554, 2048 }, { 6, 555, 2048 }, { 5, 556, 2048 }, { 6, 557, 2048 }, { 6, 558, 2048 }, { 7, 559, 2048 },
  7734. { 4, 560, 2048 }, { 5, 561, 2048 }, { 5, 562, 2048 }, { 6, 563, 2048 }, { 5, 564, 2048 }, { 6, 565, 2048 }, { 6, 566, 2048 }, { 7, 567, 2048 },
  7735. { 5, 568, 2048 }, { 6, 569, 2048 }, { 6, 570, 2048 }, { 7, 571, 2048 }, { 6, 572, 2048 }, { 7, 573, 2048 }, { 7, 574, 2048 }, { 8, 575, 2048 },
  7736. { 3, 576, 2048 }, { 4, 577, 2048 }, { 4, 578, 2048 }, { 5, 579, 2048 }, { 4, 580, 2048 }, { 5, 581, 2048 }, { 5, 582, 2048 }, { 6, 583, 2048 },
  7737. { 4, 584, 2048 }, { 5, 585, 2048 }, { 5, 586, 2048 }, { 6, 587, 2048 }, { 5, 588, 2048 }, { 6, 589, 2048 }, { 6, 590, 2048 }, { 7, 591, 2048 },
  7738. { 4, 592, 2048 }, { 5, 593, 2048 }, { 5, 594, 2048 }, { 6, 595, 2048 }, { 5, 596, 2048 }, { 6, 597, 2048 }, { 6, 598, 2048 }, { 7, 599, 2048 },
  7739. { 5, 600, 2048 }, { 6, 601, 2048 }, { 6, 602, 2048 }, { 7, 603, 2048 }, { 6, 604, 2048 }, { 7, 605, 2048 }, { 7, 606, 2048 }, { 8, 607, 2048 },
  7740. { 4, 608, 2048 }, { 5, 609, 2048 }, { 5, 610, 2048 }, { 6, 611, 2048 }, { 5, 612, 2048 }, { 6, 613, 2048 }, { 6, 614, 2048 }, { 7, 615, 2048 },
  7741. { 5, 616, 2048 }, { 6, 617, 2048 }, { 6, 618, 2048 }, { 7, 619, 2048 }, { 6, 620, 2048 }, { 7, 621, 2048 }, { 7, 622, 2048 }, { 8, 623, 2048 },
  7742. { 5, 624, 2048 }, { 6, 625, 2048 }, { 6, 626, 2048 }, { 7, 627, 2048 }, { 6, 628, 2048 }, { 7, 629, 2048 }, { 7, 630, 2048 }, { 8, 631, 2048 },
  7743. { 6, 632, 2048 }, { 7, 633, 2048 }, { 7, 634, 2048 }, { 8, 635, 2048 }, { 7, 636, 2048 }, { 8, 637, 2048 }, { 8, 638, 2048 }, { 9, 639, 2048 },
  7744. { 3, 640, 2048 }, { 4, 641, 2048 }, { 4, 642, 2048 }, { 5, 643, 2048 }, { 4, 644, 2048 }, { 5, 645, 2048 }, { 5, 646, 2048 }, { 6, 647, 2048 },
  7745. { 4, 648, 2048 }, { 5, 649, 2048 }, { 5, 650, 2048 }, { 6, 651, 2048 }, { 5, 652, 2048 }, { 6, 653, 2048 }, { 6, 654, 2048 }, { 7, 655, 2048 },
  7746. { 4, 656, 2048 }, { 5, 657, 2048 }, { 5, 658, 2048 }, { 6, 659, 2048 }, { 5, 660, 2048 }, { 6, 661, 2048 }, { 6, 662, 2048 }, { 7, 663, 2048 },
  7747. { 5, 664, 2048 }, { 6, 665, 2048 }, { 6, 666, 2048 }, { 7, 667, 2048 }, { 6, 668, 2048 }, { 7, 669, 2048 }, { 7, 670, 2048 }, { 8, 671, 2048 },
  7748. { 4, 672, 2048 }, { 5, 673, 2048 }, { 5, 674, 2048 }, { 6, 675, 2048 }, { 5, 676, 2048 }, { 6, 677, 2048 }, { 6, 678, 2048 }, { 7, 679, 2048 },
  7749. { 5, 680, 2048 }, { 6, 681, 2048 }, { 6, 682, 2048 }, { 7, 683, 2048 }, { 6, 684, 2048 }, { 7, 685, 2048 }, { 7, 686, 2048 }, { 8, 687, 2048 },
  7750. { 5, 688, 2048 }, { 6, 689, 2048 }, { 6, 690, 2048 }, { 7, 691, 2048 }, { 6, 692, 2048 }, { 7, 693, 2048 }, { 7, 694, 2048 }, { 8, 695, 2048 },
  7751. { 6, 696, 2048 }, { 7, 697, 2048 }, { 7, 698, 2048 }, { 8, 699, 2048 }, { 7, 700, 2048 }, { 8, 701, 2048 }, { 8, 702, 2048 }, { 9, 703, 2048 },
  7752. { 4, 704, 2048 }, { 5, 705, 2048 }, { 5, 706, 2048 }, { 6, 707, 2048 }, { 5, 708, 2048 }, { 6, 709, 2048 }, { 6, 710, 2048 }, { 7, 711, 2048 },
  7753. { 5, 712, 2048 }, { 6, 713, 2048 }, { 6, 714, 2048 }, { 7, 715, 2048 }, { 6, 716, 2048 }, { 7, 717, 2048 }, { 7, 718, 2048 }, { 8, 719, 2048 },
  7754. { 5, 720, 2048 }, { 6, 721, 2048 }, { 6, 722, 2048 }, { 7, 723, 2048 }, { 6, 724, 2048 }, { 7, 725, 2048 }, { 7, 726, 2048 }, { 8, 727, 2048 },
  7755. { 6, 728, 2048 }, { 7, 729, 2048 }, { 7, 730, 2048 }, { 8, 731, 2048 }, { 7, 732, 2048 }, { 8, 733, 2048 }, { 8, 734, 2048 }, { 9, 735, 2048 },
  7756. { 5, 736, 2048 }, { 6, 737, 2048 }, { 6, 738, 2048 }, { 7, 739, 2048 }, { 6, 740, 2048 }, { 7, 741, 2048 }, { 7, 742, 2048 }, { 8, 743, 2048 },
  7757. { 6, 744, 2048 }, { 7, 745, 2048 }, { 7, 746, 2048 }, { 8, 747, 2048 }, { 7, 748, 2048 }, { 8, 749, 2048 }, { 8, 750, 2048 }, { 9, 751, 2048 },
  7758. { 6, 752, 2048 }, { 7, 753, 2048 }, { 7, 754, 2048 }, { 8, 755, 2048 }, { 7, 756, 2048 }, { 8, 757, 2048 }, { 8, 758, 2048 }, { 9, 759, 2048 },
  7759. { 7, 760, 2048 }, { 8, 761, 2048 }, { 8, 762, 2048 }, { 9, 763, 2048 }, { 8, 764, 2048 }, { 9, 765, 2048 }, { 9, 766, 2048 }, { 10, 767, 2048 },
  7760. { 3, 768, 2048 }, { 4, 769, 2048 }, { 4, 770, 2048 }, { 5, 771, 2048 }, { 4, 772, 2048 }, { 5, 773, 2048 }, { 5, 774, 2048 }, { 6, 775, 2048 },
  7761. { 4, 776, 2048 }, { 5, 777, 2048 }, { 5, 778, 2048 }, { 6, 779, 2048 }, { 5, 780, 2048 }, { 6, 781, 2048 }, { 6, 782, 2048 }, { 7, 783, 2048 },
  7762. { 4, 784, 2048 }, { 5, 785, 2048 }, { 5, 786, 2048 }, { 6, 787, 2048 }, { 5, 788, 2048 }, { 6, 789, 2048 }, { 6, 790, 2048 }, { 7, 791, 2048 },
  7763. { 5, 792, 2048 }, { 6, 793, 2048 }, { 6, 794, 2048 }, { 7, 795, 2048 }, { 6, 796, 2048 }, { 7, 797, 2048 }, { 7, 798, 2048 }, { 8, 799, 2048 },
  7764. { 4, 800, 2048 }, { 5, 801, 2048 }, { 5, 802, 2048 }, { 6, 803, 2048 }, { 5, 804, 2048 }, { 6, 805, 2048 }, { 6, 806, 2048 }, { 7, 807, 2048 },
  7765. { 5, 808, 2048 }, { 6, 809, 2048 }, { 6, 810, 2048 }, { 7, 811, 2048 }, { 6, 812, 2048 }, { 7, 813, 2048 }, { 7, 814, 2048 }, { 8, 815, 2048 },
  7766. { 5, 816, 2048 }, { 6, 817, 2048 }, { 6, 818, 2048 }, { 7, 819, 2048 }, { 6, 820, 2048 }, { 7, 821, 2048 }, { 7, 822, 2048 }, { 8, 823, 2048 },
  7767. { 6, 824, 2048 }, { 7, 825, 2048 }, { 7, 826, 2048 }, { 8, 827, 2048 }, { 7, 828, 2048 }, { 8, 829, 2048 }, { 8, 830, 2048 }, { 9, 831, 2048 },
  7768. { 4, 832, 2048 }, { 5, 833, 2048 }, { 5, 834, 2048 }, { 6, 835, 2048 }, { 5, 836, 2048 }, { 6, 837, 2048 }, { 6, 838, 2048 }, { 7, 839, 2048 },
  7769. { 5, 840, 2048 }, { 6, 841, 2048 }, { 6, 842, 2048 }, { 7, 843, 2048 }, { 6, 844, 2048 }, { 7, 845, 2048 }, { 7, 846, 2048 }, { 8, 847, 2048 },
  7770. { 5, 848, 2048 }, { 6, 849, 2048 }, { 6, 850, 2048 }, { 7, 851, 2048 }, { 6, 852, 2048 }, { 7, 853, 2048 }, { 7, 854, 2048 }, { 8, 855, 2048 },
  7771. { 6, 856, 2048 }, { 7, 857, 2048 }, { 7, 858, 2048 }, { 8, 859, 2048 }, { 7, 860, 2048 }, { 8, 861, 2048 }, { 8, 862, 2048 }, { 9, 863, 2048 },
  7772. { 5, 864, 2048 }, { 6, 865, 2048 }, { 6, 866, 2048 }, { 7, 867, 2048 }, { 6, 868, 2048 }, { 7, 869, 2048 }, { 7, 870, 2048 }, { 8, 871, 2048 },
  7773. { 6, 872, 2048 }, { 7, 873, 2048 }, { 7, 874, 2048 }, { 8, 875, 2048 }, { 7, 876, 2048 }, { 8, 877, 2048 }, { 8, 878, 2048 }, { 9, 879, 2048 },
  7774. { 6, 880, 2048 }, { 7, 881, 2048 }, { 7, 882, 2048 }, { 8, 883, 2048 }, { 7, 884, 2048 }, { 8, 885, 2048 }, { 8, 886, 2048 }, { 9, 887, 2048 },
  7775. { 7, 888, 2048 }, { 8, 889, 2048 }, { 8, 890, 2048 }, { 9, 891, 2048 }, { 8, 892, 2048 }, { 9, 893, 2048 }, { 9, 894, 2048 }, { 10, 895, 2048 },
  7776. { 4, 896, 2048 }, { 5, 897, 2048 }, { 5, 898, 2048 }, { 6, 899, 2048 }, { 5, 900, 2048 }, { 6, 901, 2048 }, { 6, 902, 2048 }, { 7, 903, 2048 },
  7777. { 5, 904, 2048 }, { 6, 905, 2048 }, { 6, 906, 2048 }, { 7, 907, 2048 }, { 6, 908, 2048 }, { 7, 909, 2048 }, { 7, 910, 2048 }, { 8, 911, 2048 },
  7778. { 5, 912, 2048 }, { 6, 913, 2048 }, { 6, 914, 2048 }, { 7, 915, 2048 }, { 6, 916, 2048 }, { 7, 917, 2048 }, { 7, 918, 2048 }, { 8, 919, 2048 },
  7779. { 6, 920, 2048 }, { 7, 921, 2048 }, { 7, 922, 2048 }, { 8, 923, 2048 }, { 7, 924, 2048 }, { 8, 925, 2048 }, { 8, 926, 2048 }, { 9, 927, 2048 },
  7780. { 5, 928, 2048 }, { 6, 929, 2048 }, { 6, 930, 2048 }, { 7, 931, 2048 }, { 6, 932, 2048 }, { 7, 933, 2048 }, { 7, 934, 2048 }, { 8, 935, 2048 },
  7781. { 6, 936, 2048 }, { 7, 937, 2048 }, { 7, 938, 2048 }, { 8, 939, 2048 }, { 7, 940, 2048 }, { 8, 941, 2048 }, { 8, 942, 2048 }, { 9, 943, 2048 },
  7782. { 6, 944, 2048 }, { 7, 945, 2048 }, { 7, 946, 2048 }, { 8, 947, 2048 }, { 7, 948, 2048 }, { 8, 949, 2048 }, { 8, 950, 2048 }, { 9, 951, 2048 },
  7783. { 7, 952, 2048 }, { 8, 953, 2048 }, { 8, 954, 2048 }, { 9, 955, 2048 }, { 8, 956, 2048 }, { 9, 957, 2048 }, { 9, 958, 2048 }, { 10, 959, 2048 },
  7784. { 5, 960, 2048 }, { 6, 961, 2048 }, { 6, 962, 2048 }, { 7, 963, 2048 }, { 6, 964, 2048 }, { 7, 965, 2048 }, { 7, 966, 2048 }, { 8, 967, 2048 },
  7785. { 6, 968, 2048 }, { 7, 969, 2048 }, { 7, 970, 2048 }, { 8, 971, 2048 }, { 7, 972, 2048 }, { 8, 973, 2048 }, { 8, 974, 2048 }, { 9, 975, 2048 },
  7786. { 6, 976, 2048 }, { 7, 977, 2048 }, { 7, 978, 2048 }, { 8, 979, 2048 }, { 7, 980, 2048 }, { 8, 981, 2048 }, { 8, 982, 2048 }, { 9, 983, 2048 },
  7787. { 7, 984, 2048 }, { 8, 985, 2048 }, { 8, 986, 2048 }, { 9, 987, 2048 }, { 8, 988, 2048 }, { 9, 989, 2048 }, { 9, 990, 2048 }, { 10, 991, 2048 },
  7788. { 6, 992, 2048 }, { 7, 993, 2048 }, { 7, 994, 2048 }, { 8, 995, 2048 }, { 7, 996, 2048 }, { 8, 997, 2048 }, { 8, 998, 2048 }, { 9, 999, 2048 },
  7789. { 7, 1000, 2048 }, { 8, 1001, 2048 }, { 8, 1002, 2048 }, { 9, 1003, 2048 }, { 8, 1004, 2048 }, { 9, 1005, 2048 }, { 9, 1006, 2048 }, { 10, 1007, 2048 },
  7790. { 7, 1008, 2048 }, { 8, 1009, 2048 }, { 8, 1010, 2048 }, { 9, 1011, 2048 }, { 8, 1012, 2048 }, { 9, 1013, 2048 }, { 9, 1014, 2048 }, { 10, 1015, 2048 },
  7791. { 8, 1016, 2048 }, { 9, 1017, 2048 }, { 9, 1018, 2048 }, { 10, 1019, 2048 }, { 9, 1020, 2048 }, { 10, 1021, 2048 }, { 10, 1022, 2048 }, { 11, 1023, 2048 },
  7792. { 2, 1024, 2048 }, { 3, 1025, 2048 }, { 3, 1026, 2048 }, { 4, 1027, 2048 }, { 3, 1028, 2048 }, { 4, 1029, 2048 }, { 4, 1030, 2048 }, { 5, 1031, 2048 },
  7793. { 3, 1032, 2048 }, { 4, 1033, 2048 }, { 4, 1034, 2048 }, { 5, 1035, 2048 }, { 4, 1036, 2048 }, { 5, 1037, 2048 }, { 5, 1038, 2048 }, { 6, 1039, 2048 },
  7794. { 3, 1040, 2048 }, { 4, 1041, 2048 }, { 4, 1042, 2048 }, { 5, 1043, 2048 }, { 4, 1044, 2048 }, { 5, 1045, 2048 }, { 5, 1046, 2048 }, { 6, 1047, 2048 },
  7795. { 4, 1048, 2048 }, { 5, 1049, 2048 }, { 5, 1050, 2048 }, { 6, 1051, 2048 }, { 5, 1052, 2048 }, { 6, 1053, 2048 }, { 6, 1054, 2048 }, { 7, 1055, 2048 },
  7796. { 3, 1056, 2048 }, { 4, 1057, 2048 }, { 4, 1058, 2048 }, { 5, 1059, 2048 }, { 4, 1060, 2048 }, { 5, 1061, 2048 }, { 5, 1062, 2048 }, { 6, 1063, 2048 },
  7797. { 4, 1064, 2048 }, { 5, 1065, 2048 }, { 5, 1066, 2048 }, { 6, 1067, 2048 }, { 5, 1068, 2048 }, { 6, 1069, 2048 }, { 6, 1070, 2048 }, { 7, 1071, 2048 },
  7798. { 4, 1072, 2048 }, { 5, 1073, 2048 }, { 5, 1074, 2048 }, { 6, 1075, 2048 }, { 5, 1076, 2048 }, { 6, 1077, 2048 }, { 6, 1078, 2048 }, { 7, 1079, 2048 },
  7799. { 5, 1080, 2048 }, { 6, 1081, 2048 }, { 6, 1082, 2048 }, { 7, 1083, 2048 }, { 6, 1084, 2048 }, { 7, 1085, 2048 }, { 7, 1086, 2048 }, { 8, 1087, 2048 },
  7800. { 3, 1088, 2048 }, { 4, 1089, 2048 }, { 4, 1090, 2048 }, { 5, 1091, 2048 }, { 4, 1092, 2048 }, { 5, 1093, 2048 }, { 5, 1094, 2048 }, { 6, 1095, 2048 },
  7801. { 4, 1096, 2048 }, { 5, 1097, 2048 }, { 5, 1098, 2048 }, { 6, 1099, 2048 }, { 5, 1100, 2048 }, { 6, 1101, 2048 }, { 6, 1102, 2048 }, { 7, 1103, 2048 },
  7802. { 4, 1104, 2048 }, { 5, 1105, 2048 }, { 5, 1106, 2048 }, { 6, 1107, 2048 }, { 5, 1108, 2048 }, { 6, 1109, 2048 }, { 6, 1110, 2048 }, { 7, 1111, 2048 },
  7803. { 5, 1112, 2048 }, { 6, 1113, 2048 }, { 6, 1114, 2048 }, { 7, 1115, 2048 }, { 6, 1116, 2048 }, { 7, 1117, 2048 }, { 7, 1118, 2048 }, { 8, 1119, 2048 },
  7804. { 4, 1120, 2048 }, { 5, 1121, 2048 }, { 5, 1122, 2048 }, { 6, 1123, 2048 }, { 5, 1124, 2048 }, { 6, 1125, 2048 }, { 6, 1126, 2048 }, { 7, 1127, 2048 },
  7805. { 5, 1128, 2048 }, { 6, 1129, 2048 }, { 6, 1130, 2048 }, { 7, 1131, 2048 }, { 6, 1132, 2048 }, { 7, 1133, 2048 }, { 7, 1134, 2048 }, { 8, 1135, 2048 },
  7806. { 5, 1136, 2048 }, { 6, 1137, 2048 }, { 6, 1138, 2048 }, { 7, 1139, 2048 }, { 6, 1140, 2048 }, { 7, 1141, 2048 }, { 7, 1142, 2048 }, { 8, 1143, 2048 },
  7807. { 6, 1144, 2048 }, { 7, 1145, 2048 }, { 7, 1146, 2048 }, { 8, 1147, 2048 }, { 7, 1148, 2048 }, { 8, 1149, 2048 }, { 8, 1150, 2048 }, { 9, 1151, 2048 },
  7808. { 3, 1152, 2048 }, { 4, 1153, 2048 }, { 4, 1154, 2048 }, { 5, 1155, 2048 }, { 4, 1156, 2048 }, { 5, 1157, 2048 }, { 5, 1158, 2048 }, { 6, 1159, 2048 },
  7809. { 4, 1160, 2048 }, { 5, 1161, 2048 }, { 5, 1162, 2048 }, { 6, 1163, 2048 }, { 5, 1164, 2048 }, { 6, 1165, 2048 }, { 6, 1166, 2048 }, { 7, 1167, 2048 },
  7810. { 4, 1168, 2048 }, { 5, 1169, 2048 }, { 5, 1170, 2048 }, { 6, 1171, 2048 }, { 5, 1172, 2048 }, { 6, 1173, 2048 }, { 6, 1174, 2048 }, { 7, 1175, 2048 },
  7811. { 5, 1176, 2048 }, { 6, 1177, 2048 }, { 6, 1178, 2048 }, { 7, 1179, 2048 }, { 6, 1180, 2048 }, { 7, 1181, 2048 }, { 7, 1182, 2048 }, { 8, 1183, 2048 },
  7812. { 4, 1184, 2048 }, { 5, 1185, 2048 }, { 5, 1186, 2048 }, { 6, 1187, 2048 }, { 5, 1188, 2048 }, { 6, 1189, 2048 }, { 6, 1190, 2048 }, { 7, 1191, 2048 },
  7813. { 5, 1192, 2048 }, { 6, 1193, 2048 }, { 6, 1194, 2048 }, { 7, 1195, 2048 }, { 6, 1196, 2048 }, { 7, 1197, 2048 }, { 7, 1198, 2048 }, { 8, 1199, 2048 },
  7814. { 5, 1200, 2048 }, { 6, 1201, 2048 }, { 6, 1202, 2048 }, { 7, 1203, 2048 }, { 6, 1204, 2048 }, { 7, 1205, 2048 }, { 7, 1206, 2048 }, { 8, 1207, 2048 },
  7815. { 6, 1208, 2048 }, { 7, 1209, 2048 }, { 7, 1210, 2048 }, { 8, 1211, 2048 }, { 7, 1212, 2048 }, { 8, 1213, 2048 }, { 8, 1214, 2048 }, { 9, 1215, 2048 },
  7816. { 4, 1216, 2048 }, { 5, 1217, 2048 }, { 5, 1218, 2048 }, { 6, 1219, 2048 }, { 5, 1220, 2048 }, { 6, 1221, 2048 }, { 6, 1222, 2048 }, { 7, 1223, 2048 },
  7817. { 5, 1224, 2048 }, { 6, 1225, 2048 }, { 6, 1226, 2048 }, { 7, 1227, 2048 }, { 6, 1228, 2048 }, { 7, 1229, 2048 }, { 7, 1230, 2048 }, { 8, 1231, 2048 },
  7818. { 5, 1232, 2048 }, { 6, 1233, 2048 }, { 6, 1234, 2048 }, { 7, 1235, 2048 }, { 6, 1236, 2048 }, { 7, 1237, 2048 }, { 7, 1238, 2048 }, { 8, 1239, 2048 },
  7819. { 6, 1240, 2048 }, { 7, 1241, 2048 }, { 7, 1242, 2048 }, { 8, 1243, 2048 }, { 7, 1244, 2048 }, { 8, 1245, 2048 }, { 8, 1246, 2048 }, { 9, 1247, 2048 },
  7820. { 5, 1248, 2048 }, { 6, 1249, 2048 }, { 6, 1250, 2048 }, { 7, 1251, 2048 }, { 6, 1252, 2048 }, { 7, 1253, 2048 }, { 7, 1254, 2048 }, { 8, 1255, 2048 },
  7821. { 6, 1256, 2048 }, { 7, 1257, 2048 }, { 7, 1258, 2048 }, { 8, 1259, 2048 }, { 7, 1260, 2048 }, { 8, 1261, 2048 }, { 8, 1262, 2048 }, { 9, 1263, 2048 },
  7822. { 6, 1264, 2048 }, { 7, 1265, 2048 }, { 7, 1266, 2048 }, { 8, 1267, 2048 }, { 7, 1268, 2048 }, { 8, 1269, 2048 }, { 8, 1270, 2048 }, { 9, 1271, 2048 },
  7823. { 7, 1272, 2048 }, { 8, 1273, 2048 }, { 8, 1274, 2048 }, { 9, 1275, 2048 }, { 8, 1276, 2048 }, { 9, 1277, 2048 }, { 9, 1278, 2048 }, { 10, 1279, 2048 },
  7824. { 3, 1280, 2048 }, { 4, 1281, 2048 }, { 4, 1282, 2048 }, { 5, 1283, 2048 }, { 4, 1284, 2048 }, { 5, 1285, 2048 }, { 5, 1286, 2048 }, { 6, 1287, 2048 },
  7825. { 4, 1288, 2048 }, { 5, 1289, 2048 }, { 5, 1290, 2048 }, { 6, 1291, 2048 }, { 5, 1292, 2048 }, { 6, 1293, 2048 }, { 6, 1294, 2048 }, { 7, 1295, 2048 },
  7826. { 4, 1296, 2048 }, { 5, 1297, 2048 }, { 5, 1298, 2048 }, { 6, 1299, 2048 }, { 5, 1300, 2048 }, { 6, 1301, 2048 }, { 6, 1302, 2048 }, { 7, 1303, 2048 },
  7827. { 5, 1304, 2048 }, { 6, 1305, 2048 }, { 6, 1306, 2048 }, { 7, 1307, 2048 }, { 6, 1308, 2048 }, { 7, 1309, 2048 }, { 7, 1310, 2048 }, { 8, 1311, 2048 },
  7828. { 4, 1312, 2048 }, { 5, 1313, 2048 }, { 5, 1314, 2048 }, { 6, 1315, 2048 }, { 5, 1316, 2048 }, { 6, 1317, 2048 }, { 6, 1318, 2048 }, { 7, 1319, 2048 },
  7829. { 5, 1320, 2048 }, { 6, 1321, 2048 }, { 6, 1322, 2048 }, { 7, 1323, 2048 }, { 6, 1324, 2048 }, { 7, 1325, 2048 }, { 7, 1326, 2048 }, { 8, 1327, 2048 },
  7830. { 5, 1328, 2048 }, { 6, 1329, 2048 }, { 6, 1330, 2048 }, { 7, 1331, 2048 }, { 6, 1332, 2048 }, { 7, 1333, 2048 }, { 7, 1334, 2048 }, { 8, 1335, 2048 },
  7831. { 6, 1336, 2048 }, { 7, 1337, 2048 }, { 7, 1338, 2048 }, { 8, 1339, 2048 }, { 7, 1340, 2048 }, { 8, 1341, 2048 }, { 8, 1342, 2048 }, { 9, 1343, 2048 },
  7832. { 4, 1344, 2048 }, { 5, 1345, 2048 }, { 5, 1346, 2048 }, { 6, 1347, 2048 }, { 5, 1348, 2048 }, { 6, 1349, 2048 }, { 6, 1350, 2048 }, { 7, 1351, 2048 },
  7833. { 5, 1352, 2048 }, { 6, 1353, 2048 }, { 6, 1354, 2048 }, { 7, 1355, 2048 }, { 6, 1356, 2048 }, { 7, 1357, 2048 }, { 7, 1358, 2048 }, { 8, 1359, 2048 },
  7834. { 5, 1360, 2048 }, { 6, 1361, 2048 }, { 6, 1362, 2048 }, { 7, 1363, 2048 }, { 6, 1364, 2048 }, { 7, 1365, 2048 }, { 7, 1366, 2048 }, { 8, 1367, 2048 },
  7835. { 6, 1368, 2048 }, { 7, 1369, 2048 }, { 7, 1370, 2048 }, { 8, 1371, 2048 }, { 7, 1372, 2048 }, { 8, 1373, 2048 }, { 8, 1374, 2048 }, { 9, 1375, 2048 },
  7836. { 5, 1376, 2048 }, { 6, 1377, 2048 }, { 6, 1378, 2048 }, { 7, 1379, 2048 }, { 6, 1380, 2048 }, { 7, 1381, 2048 }, { 7, 1382, 2048 }, { 8, 1383, 2048 },
  7837. { 6, 1384, 2048 }, { 7, 1385, 2048 }, { 7, 1386, 2048 }, { 8, 1387, 2048 }, { 7, 1388, 2048 }, { 8, 1389, 2048 }, { 8, 1390, 2048 }, { 9, 1391, 2048 },
  7838. { 6, 1392, 2048 }, { 7, 1393, 2048 }, { 7, 1394, 2048 }, { 8, 1395, 2048 }, { 7, 1396, 2048 }, { 8, 1397, 2048 }, { 8, 1398, 2048 }, { 9, 1399, 2048 },
  7839. { 7, 1400, 2048 }, { 8, 1401, 2048 }, { 8, 1402, 2048 }, { 9, 1403, 2048 }, { 8, 1404, 2048 }, { 9, 1405, 2048 }, { 9, 1406, 2048 }, { 10, 1407, 2048 },
  7840. { 4, 1408, 2048 }, { 5, 1409, 2048 }, { 5, 1410, 2048 }, { 6, 1411, 2048 }, { 5, 1412, 2048 }, { 6, 1413, 2048 }, { 6, 1414, 2048 }, { 7, 1415, 2048 },
  7841. { 5, 1416, 2048 }, { 6, 1417, 2048 }, { 6, 1418, 2048 }, { 7, 1419, 2048 }, { 6, 1420, 2048 }, { 7, 1421, 2048 }, { 7, 1422, 2048 }, { 8, 1423, 2048 },
  7842. { 5, 1424, 2048 }, { 6, 1425, 2048 }, { 6, 1426, 2048 }, { 7, 1427, 2048 }, { 6, 1428, 2048 }, { 7, 1429, 2048 }, { 7, 1430, 2048 }, { 8, 1431, 2048 },
  7843. { 6, 1432, 2048 }, { 7, 1433, 2048 }, { 7, 1434, 2048 }, { 8, 1435, 2048 }, { 7, 1436, 2048 }, { 8, 1437, 2048 }, { 8, 1438, 2048 }, { 9, 1439, 2048 },
  7844. { 5, 1440, 2048 }, { 6, 1441, 2048 }, { 6, 1442, 2048 }, { 7, 1443, 2048 }, { 6, 1444, 2048 }, { 7, 1445, 2048 }, { 7, 1446, 2048 }, { 8, 1447, 2048 },
  7845. { 6, 1448, 2048 }, { 7, 1449, 2048 }, { 7, 1450, 2048 }, { 8, 1451, 2048 }, { 7, 1452, 2048 }, { 8, 1453, 2048 }, { 8, 1454, 2048 }, { 9, 1455, 2048 },
  7846. { 6, 1456, 2048 }, { 7, 1457, 2048 }, { 7, 1458, 2048 }, { 8, 1459, 2048 }, { 7, 1460, 2048 }, { 8, 1461, 2048 }, { 8, 1462, 2048 }, { 9, 1463, 2048 },
  7847. { 7, 1464, 2048 }, { 8, 1465, 2048 }, { 8, 1466, 2048 }, { 9, 1467, 2048 }, { 8, 1468, 2048 }, { 9, 1469, 2048 }, { 9, 1470, 2048 }, { 10, 1471, 2048 },
  7848. { 5, 1472, 2048 }, { 6, 1473, 2048 }, { 6, 1474, 2048 }, { 7, 1475, 2048 }, { 6, 1476, 2048 }, { 7, 1477, 2048 }, { 7, 1478, 2048 }, { 8, 1479, 2048 },
  7849. { 6, 1480, 2048 }, { 7, 1481, 2048 }, { 7, 1482, 2048 }, { 8, 1483, 2048 }, { 7, 1484, 2048 }, { 8, 1485, 2048 }, { 8, 1486, 2048 }, { 9, 1487, 2048 },
  7850. { 6, 1488, 2048 }, { 7, 1489, 2048 }, { 7, 1490, 2048 }, { 8, 1491, 2048 }, { 7, 1492, 2048 }, { 8, 1493, 2048 }, { 8, 1494, 2048 }, { 9, 1495, 2048 },
  7851. { 7, 1496, 2048 }, { 8, 1497, 2048 }, { 8, 1498, 2048 }, { 9, 1499, 2048 }, { 8, 1500, 2048 }, { 9, 1501, 2048 }, { 9, 1502, 2048 }, { 10, 1503, 2048 },
  7852. { 6, 1504, 2048 }, { 7, 1505, 2048 }, { 7, 1506, 2048 }, { 8, 1507, 2048 }, { 7, 1508, 2048 }, { 8, 1509, 2048 }, { 8, 1510, 2048 }, { 9, 1511, 2048 },
  7853. { 7, 1512, 2048 }, { 8, 1513, 2048 }, { 8, 1514, 2048 }, { 9, 1515, 2048 }, { 8, 1516, 2048 }, { 9, 1517, 2048 }, { 9, 1518, 2048 }, { 10, 1519, 2048 },
  7854. { 7, 1520, 2048 }, { 8, 1521, 2048 }, { 8, 1522, 2048 }, { 9, 1523, 2048 }, { 8, 1524, 2048 }, { 9, 1525, 2048 }, { 9, 1526, 2048 }, { 10, 1527, 2048 },
  7855. { 8, 1528, 2048 }, { 9, 1529, 2048 }, { 9, 1530, 2048 }, { 10, 1531, 2048 }, { 9, 1532, 2048 }, { 10, 1533, 2048 }, { 10, 1534, 2048 }, { 11, 1535, 2048 },
  7856. { 3, 1536, 2048 }, { 4, 1537, 2048 }, { 4, 1538, 2048 }, { 5, 1539, 2048 }, { 4, 1540, 2048 }, { 5, 1541, 2048 }, { 5, 1542, 2048 }, { 6, 1543, 2048 },
  7857. { 4, 1544, 2048 }, { 5, 1545, 2048 }, { 5, 1546, 2048 }, { 6, 1547, 2048 }, { 5, 1548, 2048 }, { 6, 1549, 2048 }, { 6, 1550, 2048 }, { 7, 1551, 2048 },
  7858. { 4, 1552, 2048 }, { 5, 1553, 2048 }, { 5, 1554, 2048 }, { 6, 1555, 2048 }, { 5, 1556, 2048 }, { 6, 1557, 2048 }, { 6, 1558, 2048 }, { 7, 1559, 2048 },
  7859. { 5, 1560, 2048 }, { 6, 1561, 2048 }, { 6, 1562, 2048 }, { 7, 1563, 2048 }, { 6, 1564, 2048 }, { 7, 1565, 2048 }, { 7, 1566, 2048 }, { 8, 1567, 2048 },
  7860. { 4, 1568, 2048 }, { 5, 1569, 2048 }, { 5, 1570, 2048 }, { 6, 1571, 2048 }, { 5, 1572, 2048 }, { 6, 1573, 2048 }, { 6, 1574, 2048 }, { 7, 1575, 2048 },
  7861. { 5, 1576, 2048 }, { 6, 1577, 2048 }, { 6, 1578, 2048 }, { 7, 1579, 2048 }, { 6, 1580, 2048 }, { 7, 1581, 2048 }, { 7, 1582, 2048 }, { 8, 1583, 2048 },
  7862. { 5, 1584, 2048 }, { 6, 1585, 2048 }, { 6, 1586, 2048 }, { 7, 1587, 2048 }, { 6, 1588, 2048 }, { 7, 1589, 2048 }, { 7, 1590, 2048 }, { 8, 1591, 2048 },
  7863. { 6, 1592, 2048 }, { 7, 1593, 2048 }, { 7, 1594, 2048 }, { 8, 1595, 2048 }, { 7, 1596, 2048 }, { 8, 1597, 2048 }, { 8, 1598, 2048 }, { 9, 1599, 2048 },
  7864. { 4, 1600, 2048 }, { 5, 1601, 2048 }, { 5, 1602, 2048 }, { 6, 1603, 2048 }, { 5, 1604, 2048 }, { 6, 1605, 2048 }, { 6, 1606, 2048 }, { 7, 1607, 2048 },
  7865. { 5, 1608, 2048 }, { 6, 1609, 2048 }, { 6, 1610, 2048 }, { 7, 1611, 2048 }, { 6, 1612, 2048 }, { 7, 1613, 2048 }, { 7, 1614, 2048 }, { 8, 1615, 2048 },
  7866. { 5, 1616, 2048 }, { 6, 1617, 2048 }, { 6, 1618, 2048 }, { 7, 1619, 2048 }, { 6, 1620, 2048 }, { 7, 1621, 2048 }, { 7, 1622, 2048 }, { 8, 1623, 2048 },
  7867. { 6, 1624, 2048 }, { 7, 1625, 2048 }, { 7, 1626, 2048 }, { 8, 1627, 2048 }, { 7, 1628, 2048 }, { 8, 1629, 2048 }, { 8, 1630, 2048 }, { 9, 1631, 2048 },
  7868. { 5, 1632, 2048 }, { 6, 1633, 2048 }, { 6, 1634, 2048 }, { 7, 1635, 2048 }, { 6, 1636, 2048 }, { 7, 1637, 2048 }, { 7, 1638, 2048 }, { 8, 1639, 2048 },
  7869. { 6, 1640, 2048 }, { 7, 1641, 2048 }, { 7, 1642, 2048 }, { 8, 1643, 2048 }, { 7, 1644, 2048 }, { 8, 1645, 2048 }, { 8, 1646, 2048 }, { 9, 1647, 2048 },
  7870. { 6, 1648, 2048 }, { 7, 1649, 2048 }, { 7, 1650, 2048 }, { 8, 1651, 2048 }, { 7, 1652, 2048 }, { 8, 1653, 2048 }, { 8, 1654, 2048 }, { 9, 1655, 2048 },
  7871. { 7, 1656, 2048 }, { 8, 1657, 2048 }, { 8, 1658, 2048 }, { 9, 1659, 2048 }, { 8, 1660, 2048 }, { 9, 1661, 2048 }, { 9, 1662, 2048 }, { 10, 1663, 2048 },
  7872. { 4, 1664, 2048 }, { 5, 1665, 2048 }, { 5, 1666, 2048 }, { 6, 1667, 2048 }, { 5, 1668, 2048 }, { 6, 1669, 2048 }, { 6, 1670, 2048 }, { 7, 1671, 2048 },
  7873. { 5, 1672, 2048 }, { 6, 1673, 2048 }, { 6, 1674, 2048 }, { 7, 1675, 2048 }, { 6, 1676, 2048 }, { 7, 1677, 2048 }, { 7, 1678, 2048 }, { 8, 1679, 2048 },
  7874. { 5, 1680, 2048 }, { 6, 1681, 2048 }, { 6, 1682, 2048 }, { 7, 1683, 2048 }, { 6, 1684, 2048 }, { 7, 1685, 2048 }, { 7, 1686, 2048 }, { 8, 1687, 2048 },
  7875. { 6, 1688, 2048 }, { 7, 1689, 2048 }, { 7, 1690, 2048 }, { 8, 1691, 2048 }, { 7, 1692, 2048 }, { 8, 1693, 2048 }, { 8, 1694, 2048 }, { 9, 1695, 2048 },
  7876. { 5, 1696, 2048 }, { 6, 1697, 2048 }, { 6, 1698, 2048 }, { 7, 1699, 2048 }, { 6, 1700, 2048 }, { 7, 1701, 2048 }, { 7, 1702, 2048 }, { 8, 1703, 2048 },
  7877. { 6, 1704, 2048 }, { 7, 1705, 2048 }, { 7, 1706, 2048 }, { 8, 1707, 2048 }, { 7, 1708, 2048 }, { 8, 1709, 2048 }, { 8, 1710, 2048 }, { 9, 1711, 2048 },
  7878. { 6, 1712, 2048 }, { 7, 1713, 2048 }, { 7, 1714, 2048 }, { 8, 1715, 2048 }, { 7, 1716, 2048 }, { 8, 1717, 2048 }, { 8, 1718, 2048 }, { 9, 1719, 2048 },
  7879. { 7, 1720, 2048 }, { 8, 1721, 2048 }, { 8, 1722, 2048 }, { 9, 1723, 2048 }, { 8, 1724, 2048 }, { 9, 1725, 2048 }, { 9, 1726, 2048 }, { 10, 1727, 2048 },
  7880. { 5, 1728, 2048 }, { 6, 1729, 2048 }, { 6, 1730, 2048 }, { 7, 1731, 2048 }, { 6, 1732, 2048 }, { 7, 1733, 2048 }, { 7, 1734, 2048 }, { 8, 1735, 2048 },
  7881. { 6, 1736, 2048 }, { 7, 1737, 2048 }, { 7, 1738, 2048 }, { 8, 1739, 2048 }, { 7, 1740, 2048 }, { 8, 1741, 2048 }, { 8, 1742, 2048 }, { 9, 1743, 2048 },
  7882. { 6, 1744, 2048 }, { 7, 1745, 2048 }, { 7, 1746, 2048 }, { 8, 1747, 2048 }, { 7, 1748, 2048 }, { 8, 1749, 2048 }, { 8, 1750, 2048 }, { 9, 1751, 2048 },
  7883. { 7, 1752, 2048 }, { 8, 1753, 2048 }, { 8, 1754, 2048 }, { 9, 1755, 2048 }, { 8, 1756, 2048 }, { 9, 1757, 2048 }, { 9, 1758, 2048 }, { 10, 1759, 2048 },
  7884. { 6, 1760, 2048 }, { 7, 1761, 2048 }, { 7, 1762, 2048 }, { 8, 1763, 2048 }, { 7, 1764, 2048 }, { 8, 1765, 2048 }, { 8, 1766, 2048 }, { 9, 1767, 2048 },
  7885. { 7, 1768, 2048 }, { 8, 1769, 2048 }, { 8, 1770, 2048 }, { 9, 1771, 2048 }, { 8, 1772, 2048 }, { 9, 1773, 2048 }, { 9, 1774, 2048 }, { 10, 1775, 2048 },
  7886. { 7, 1776, 2048 }, { 8, 1777, 2048 }, { 8, 1778, 2048 }, { 9, 1779, 2048 }, { 8, 1780, 2048 }, { 9, 1781, 2048 }, { 9, 1782, 2048 }, { 10, 1783, 2048 },
  7887. { 8, 1784, 2048 }, { 9, 1785, 2048 }, { 9, 1786, 2048 }, { 10, 1787, 2048 }, { 9, 1788, 2048 }, { 10, 1789, 2048 }, { 10, 1790, 2048 }, { 11, 1791, 2048 },
  7888. { 4, 1792, 2048 }, { 5, 1793, 2048 }, { 5, 1794, 2048 }, { 6, 1795, 2048 }, { 5, 1796, 2048 }, { 6, 1797, 2048 }, { 6, 1798, 2048 }, { 7, 1799, 2048 },
  7889. { 5, 1800, 2048 }, { 6, 1801, 2048 }, { 6, 1802, 2048 }, { 7, 1803, 2048 }, { 6, 1804, 2048 }, { 7, 1805, 2048 }, { 7, 1806, 2048 }, { 8, 1807, 2048 },
  7890. { 5, 1808, 2048 }, { 6, 1809, 2048 }, { 6, 1810, 2048 }, { 7, 1811, 2048 }, { 6, 1812, 2048 }, { 7, 1813, 2048 }, { 7, 1814, 2048 }, { 8, 1815, 2048 },
  7891. { 6, 1816, 2048 }, { 7, 1817, 2048 }, { 7, 1818, 2048 }, { 8, 1819, 2048 }, { 7, 1820, 2048 }, { 8, 1821, 2048 }, { 8, 1822, 2048 }, { 9, 1823, 2048 },
  7892. { 5, 1824, 2048 }, { 6, 1825, 2048 }, { 6, 1826, 2048 }, { 7, 1827, 2048 }, { 6, 1828, 2048 }, { 7, 1829, 2048 }, { 7, 1830, 2048 }, { 8, 1831, 2048 },
  7893. { 6, 1832, 2048 }, { 7, 1833, 2048 }, { 7, 1834, 2048 }, { 8, 1835, 2048 }, { 7, 1836, 2048 }, { 8, 1837, 2048 }, { 8, 1838, 2048 }, { 9, 1839, 2048 },
  7894. { 6, 1840, 2048 }, { 7, 1841, 2048 }, { 7, 1842, 2048 }, { 8, 1843, 2048 }, { 7, 1844, 2048 }, { 8, 1845, 2048 }, { 8, 1846, 2048 }, { 9, 1847, 2048 },
  7895. { 7, 1848, 2048 }, { 8, 1849, 2048 }, { 8, 1850, 2048 }, { 9, 1851, 2048 }, { 8, 1852, 2048 }, { 9, 1853, 2048 }, { 9, 1854, 2048 }, { 10, 1855, 2048 },
  7896. { 5, 1856, 2048 }, { 6, 1857, 2048 }, { 6, 1858, 2048 }, { 7, 1859, 2048 }, { 6, 1860, 2048 }, { 7, 1861, 2048 }, { 7, 1862, 2048 }, { 8, 1863, 2048 },
  7897. { 6, 1864, 2048 }, { 7, 1865, 2048 }, { 7, 1866, 2048 }, { 8, 1867, 2048 }, { 7, 1868, 2048 }, { 8, 1869, 2048 }, { 8, 1870, 2048 }, { 9, 1871, 2048 },
  7898. { 6, 1872, 2048 }, { 7, 1873, 2048 }, { 7, 1874, 2048 }, { 8, 1875, 2048 }, { 7, 1876, 2048 }, { 8, 1877, 2048 }, { 8, 1878, 2048 }, { 9, 1879, 2048 },
  7899. { 7, 1880, 2048 }, { 8, 1881, 2048 }, { 8, 1882, 2048 }, { 9, 1883, 2048 }, { 8, 1884, 2048 }, { 9, 1885, 2048 }, { 9, 1886, 2048 }, { 10, 1887, 2048 },
  7900. { 6, 1888, 2048 }, { 7, 1889, 2048 }, { 7, 1890, 2048 }, { 8, 1891, 2048 }, { 7, 1892, 2048 }, { 8, 1893, 2048 }, { 8, 1894, 2048 }, { 9, 1895, 2048 },
  7901. { 7, 1896, 2048 }, { 8, 1897, 2048 }, { 8, 1898, 2048 }, { 9, 1899, 2048 }, { 8, 1900, 2048 }, { 9, 1901, 2048 }, { 9, 1902, 2048 }, { 10, 1903, 2048 },
  7902. { 7, 1904, 2048 }, { 8, 1905, 2048 }, { 8, 1906, 2048 }, { 9, 1907, 2048 }, { 8, 1908, 2048 }, { 9, 1909, 2048 }, { 9, 1910, 2048 }, { 10, 1911, 2048 },
  7903. { 8, 1912, 2048 }, { 9, 1913, 2048 }, { 9, 1914, 2048 }, { 10, 1915, 2048 }, { 9, 1916, 2048 }, { 10, 1917, 2048 }, { 10, 1918, 2048 }, { 11, 1919, 2048 },
  7904. { 5, 1920, 2048 }, { 6, 1921, 2048 }, { 6, 1922, 2048 }, { 7, 1923, 2048 }, { 6, 1924, 2048 }, { 7, 1925, 2048 }, { 7, 1926, 2048 }, { 8, 1927, 2048 },
  7905. { 6, 1928, 2048 }, { 7, 1929, 2048 }, { 7, 1930, 2048 }, { 8, 1931, 2048 }, { 7, 1932, 2048 }, { 8, 1933, 2048 }, { 8, 1934, 2048 }, { 9, 1935, 2048 },
  7906. { 6, 1936, 2048 }, { 7, 1937, 2048 }, { 7, 1938, 2048 }, { 8, 1939, 2048 }, { 7, 1940, 2048 }, { 8, 1941, 2048 }, { 8, 1942, 2048 }, { 9, 1943, 2048 },
  7907. { 7, 1944, 2048 }, { 8, 1945, 2048 }, { 8, 1946, 2048 }, { 9, 1947, 2048 }, { 8, 1948, 2048 }, { 9, 1949, 2048 }, { 9, 1950, 2048 }, { 10, 1951, 2048 },
  7908. { 6, 1952, 2048 }, { 7, 1953, 2048 }, { 7, 1954, 2048 }, { 8, 1955, 2048 }, { 7, 1956, 2048 }, { 8, 1957, 2048 }, { 8, 1958, 2048 }, { 9, 1959, 2048 },
  7909. { 7, 1960, 2048 }, { 8, 1961, 2048 }, { 8, 1962, 2048 }, { 9, 1963, 2048 }, { 8, 1964, 2048 }, { 9, 1965, 2048 }, { 9, 1966, 2048 }, { 10, 1967, 2048 },
  7910. { 7, 1968, 2048 }, { 8, 1969, 2048 }, { 8, 1970, 2048 }, { 9, 1971, 2048 }, { 8, 1972, 2048 }, { 9, 1973, 2048 }, { 9, 1974, 2048 }, { 10, 1975, 2048 },
  7911. { 8, 1976, 2048 }, { 9, 1977, 2048 }, { 9, 1978, 2048 }, { 10, 1979, 2048 }, { 9, 1980, 2048 }, { 10, 1981, 2048 }, { 10, 1982, 2048 }, { 11, 1983, 2048 },
  7912. { 6, 1984, 2048 }, { 7, 1985, 2048 }, { 7, 1986, 2048 }, { 8, 1987, 2048 }, { 7, 1988, 2048 }, { 8, 1989, 2048 }, { 8, 1990, 2048 }, { 9, 1991, 2048 },
  7913. { 7, 1992, 2048 }, { 8, 1993, 2048 }, { 8, 1994, 2048 }, { 9, 1995, 2048 }, { 8, 1996, 2048 }, { 9, 1997, 2048 }, { 9, 1998, 2048 }, { 10, 1999, 2048 },
  7914. { 7, 2000, 2048 }, { 8, 2001, 2048 }, { 8, 2002, 2048 }, { 9, 2003, 2048 }, { 8, 2004, 2048 }, { 9, 2005, 2048 }, { 9, 2006, 2048 }, { 10, 2007, 2048 },
  7915. { 8, 2008, 2048 }, { 9, 2009, 2048 }, { 9, 2010, 2048 }, { 10, 2011, 2048 }, { 9, 2012, 2048 }, { 10, 2013, 2048 }, { 10, 2014, 2048 }, { 11, 2015, 2048 },
  7916. { 7, 2016, 2048 }, { 8, 2017, 2048 }, { 8, 2018, 2048 }, { 9, 2019, 2048 }, { 8, 2020, 2048 }, { 9, 2021, 2048 }, { 9, 2022, 2048 }, { 10, 2023, 2048 },
  7917. { 8, 2024, 2048 }, { 9, 2025, 2048 }, { 9, 2026, 2048 }, { 10, 2027, 2048 }, { 9, 2028, 2048 }, { 10, 2029, 2048 }, { 10, 2030, 2048 }, { 11, 2031, 2048 },
  7918. { 8, 2032, 2048 }, { 9, 2033, 2048 }, { 9, 2034, 2048 }, { 10, 2035, 2048 }, { 9, 2036, 2048 }, { 10, 2037, 2048 }, { 10, 2038, 2048 }, { 11, 2039, 2048 },
  7919. { 9, 2040, 2048 }, { 10, 2041, 2048 }, { 10, 2042, 2048 }, { 11, 2043, 2048 }, { 10, 2044, 2048 }, { 11, 2045, 2048 }, { 11, 2046, 2048 }, { 12, 2047, 2048 },
  7920. #endif
  7921. #endif
  7922. #endif
  7923. #endif
  7924. #endif
  7925. #endif
  7926. };
  7927. /* find a hole and free as required, return -1 if no hole found */
  7928. static int find_hole(void)
  7929. {
  7930. unsigned x;
  7931. int y, z;
  7932. for (z = -1, y = INT_MAX, x = 0; x < FP_ENTRIES; x++) {
  7933. if (fp_cache[x].lru_count < y && fp_cache[x].lock == 0) {
  7934. z = x;
  7935. y = fp_cache[x].lru_count;
  7936. }
  7937. }
  7938. /* decrease all */
  7939. for (x = 0; x < FP_ENTRIES; x++) {
  7940. if (fp_cache[x].lru_count > 3) {
  7941. --(fp_cache[x].lru_count);
  7942. }
  7943. }
  7944. /* free entry z */
  7945. if (z >= 0 && fp_cache[z].g) {
  7946. mp_clear(&fp_cache[z].mu);
  7947. wc_ecc_del_point(fp_cache[z].g);
  7948. fp_cache[z].g = NULL;
  7949. for (x = 0; x < (1U<<FP_LUT); x++) {
  7950. wc_ecc_del_point(fp_cache[z].LUT[x]);
  7951. fp_cache[z].LUT[x] = NULL;
  7952. }
  7953. fp_cache[z].LUT_set = 0;
  7954. fp_cache[z].lru_count = 0;
  7955. }
  7956. return z;
  7957. }
  7958. /* determine if a base is already in the cache and if so, where */
  7959. static int find_base(ecc_point* g)
  7960. {
  7961. int x;
  7962. for (x = 0; x < FP_ENTRIES; x++) {
  7963. if (fp_cache[x].g != NULL &&
  7964. mp_cmp(fp_cache[x].g->x, g->x) == MP_EQ &&
  7965. mp_cmp(fp_cache[x].g->y, g->y) == MP_EQ &&
  7966. mp_cmp(fp_cache[x].g->z, g->z) == MP_EQ) {
  7967. break;
  7968. }
  7969. }
  7970. if (x == FP_ENTRIES) {
  7971. x = -1;
  7972. }
  7973. return x;
  7974. }
  7975. /* add a new base to the cache */
  7976. static int add_entry(int idx, ecc_point *g)
  7977. {
  7978. unsigned x, y;
  7979. /* allocate base and LUT */
  7980. fp_cache[idx].g = wc_ecc_new_point();
  7981. if (fp_cache[idx].g == NULL) {
  7982. return GEN_MEM_ERR;
  7983. }
  7984. /* copy x and y */
  7985. if ((mp_copy(g->x, fp_cache[idx].g->x) != MP_OKAY) ||
  7986. (mp_copy(g->y, fp_cache[idx].g->y) != MP_OKAY) ||
  7987. (mp_copy(g->z, fp_cache[idx].g->z) != MP_OKAY)) {
  7988. wc_ecc_del_point(fp_cache[idx].g);
  7989. fp_cache[idx].g = NULL;
  7990. return GEN_MEM_ERR;
  7991. }
  7992. for (x = 0; x < (1U<<FP_LUT); x++) {
  7993. fp_cache[idx].LUT[x] = wc_ecc_new_point();
  7994. if (fp_cache[idx].LUT[x] == NULL) {
  7995. for (y = 0; y < x; y++) {
  7996. wc_ecc_del_point(fp_cache[idx].LUT[y]);
  7997. fp_cache[idx].LUT[y] = NULL;
  7998. }
  7999. wc_ecc_del_point(fp_cache[idx].g);
  8000. fp_cache[idx].g = NULL;
  8001. fp_cache[idx].lru_count = 0;
  8002. return GEN_MEM_ERR;
  8003. }
  8004. }
  8005. fp_cache[idx].LUT_set = 0;
  8006. fp_cache[idx].lru_count = 0;
  8007. return MP_OKAY;
  8008. }
  8009. #endif
  8010. #ifndef WOLFSSL_SP_MATH
  8011. /* build the LUT by spacing the bits of the input by #modulus/FP_LUT bits apart
  8012. *
  8013. * The algorithm builds patterns in increasing bit order by first making all
  8014. * single bit input patterns, then all two bit input patterns and so on
  8015. */
  8016. static int build_lut(int idx, mp_int* a, mp_int* modulus, mp_digit mp,
  8017. mp_int* mu)
  8018. {
  8019. int err;
  8020. unsigned x, y, bitlen, lut_gap;
  8021. mp_int tmp;
  8022. if (mp_init(&tmp) != MP_OKAY)
  8023. return GEN_MEM_ERR;
  8024. /* sanity check to make sure lut_order table is of correct size,
  8025. should compile out to a NOP if true */
  8026. if ((sizeof(lut_orders) / sizeof(lut_orders[0])) < (1U<<FP_LUT)) {
  8027. err = BAD_FUNC_ARG;
  8028. }
  8029. else {
  8030. /* get bitlen and round up to next multiple of FP_LUT */
  8031. bitlen = mp_unsigned_bin_size(modulus) << 3;
  8032. x = bitlen % FP_LUT;
  8033. if (x) {
  8034. bitlen += FP_LUT - x;
  8035. }
  8036. lut_gap = bitlen / FP_LUT;
  8037. /* init the mu */
  8038. err = mp_init_copy(&fp_cache[idx].mu, mu);
  8039. }
  8040. /* copy base */
  8041. if (err == MP_OKAY) {
  8042. if ((mp_mulmod(fp_cache[idx].g->x, mu, modulus,
  8043. fp_cache[idx].LUT[1]->x) != MP_OKAY) ||
  8044. (mp_mulmod(fp_cache[idx].g->y, mu, modulus,
  8045. fp_cache[idx].LUT[1]->y) != MP_OKAY) ||
  8046. (mp_mulmod(fp_cache[idx].g->z, mu, modulus,
  8047. fp_cache[idx].LUT[1]->z) != MP_OKAY)) {
  8048. err = MP_MULMOD_E;
  8049. }
  8050. }
  8051. /* make all single bit entries */
  8052. for (x = 1; x < FP_LUT; x++) {
  8053. if (err != MP_OKAY)
  8054. break;
  8055. if ((mp_copy(fp_cache[idx].LUT[1<<(x-1)]->x,
  8056. fp_cache[idx].LUT[1<<x]->x) != MP_OKAY) ||
  8057. (mp_copy(fp_cache[idx].LUT[1<<(x-1)]->y,
  8058. fp_cache[idx].LUT[1<<x]->y) != MP_OKAY) ||
  8059. (mp_copy(fp_cache[idx].LUT[1<<(x-1)]->z,
  8060. fp_cache[idx].LUT[1<<x]->z) != MP_OKAY)){
  8061. err = MP_INIT_E;
  8062. break;
  8063. } else {
  8064. /* now double it bitlen/FP_LUT times */
  8065. for (y = 0; y < lut_gap; y++) {
  8066. if ((err = ecc_projective_dbl_point(fp_cache[idx].LUT[1<<x],
  8067. fp_cache[idx].LUT[1<<x], a, modulus, mp)) != MP_OKAY) {
  8068. break;
  8069. }
  8070. }
  8071. }
  8072. }
  8073. /* now make all entries in increase order of hamming weight */
  8074. for (x = 2; x <= FP_LUT; x++) {
  8075. if (err != MP_OKAY)
  8076. break;
  8077. for (y = 0; y < (1UL<<FP_LUT); y++) {
  8078. if (lut_orders[y].ham != (int)x) continue;
  8079. /* perform the add */
  8080. if ((err = ecc_projective_add_point(
  8081. fp_cache[idx].LUT[lut_orders[y].terma],
  8082. fp_cache[idx].LUT[lut_orders[y].termb],
  8083. fp_cache[idx].LUT[y], a, modulus, mp)) != MP_OKAY) {
  8084. break;
  8085. }
  8086. }
  8087. }
  8088. /* now map all entries back to affine space to make point addition faster */
  8089. for (x = 1; x < (1UL<<FP_LUT); x++) {
  8090. if (err != MP_OKAY)
  8091. break;
  8092. /* convert z to normal from montgomery */
  8093. err = mp_montgomery_reduce(fp_cache[idx].LUT[x]->z, modulus, mp);
  8094. /* invert it */
  8095. if (err == MP_OKAY)
  8096. err = mp_invmod(fp_cache[idx].LUT[x]->z, modulus,
  8097. fp_cache[idx].LUT[x]->z);
  8098. if (err == MP_OKAY)
  8099. /* now square it */
  8100. err = mp_sqrmod(fp_cache[idx].LUT[x]->z, modulus, &tmp);
  8101. if (err == MP_OKAY)
  8102. /* fix x */
  8103. err = mp_mulmod(fp_cache[idx].LUT[x]->x, &tmp, modulus,
  8104. fp_cache[idx].LUT[x]->x);
  8105. if (err == MP_OKAY)
  8106. /* get 1/z^3 */
  8107. err = mp_mulmod(&tmp, fp_cache[idx].LUT[x]->z, modulus, &tmp);
  8108. if (err == MP_OKAY)
  8109. /* fix y */
  8110. err = mp_mulmod(fp_cache[idx].LUT[x]->y, &tmp, modulus,
  8111. fp_cache[idx].LUT[x]->y);
  8112. if (err == MP_OKAY)
  8113. /* free z */
  8114. mp_clear(fp_cache[idx].LUT[x]->z);
  8115. }
  8116. mp_clear(&tmp);
  8117. if (err == MP_OKAY) {
  8118. fp_cache[idx].LUT_set = 1;
  8119. return MP_OKAY;
  8120. }
  8121. /* err cleanup */
  8122. for (y = 0; y < (1U<<FP_LUT); y++) {
  8123. wc_ecc_del_point(fp_cache[idx].LUT[y]);
  8124. fp_cache[idx].LUT[y] = NULL;
  8125. }
  8126. wc_ecc_del_point(fp_cache[idx].g);
  8127. fp_cache[idx].g = NULL;
  8128. fp_cache[idx].LUT_set = 0;
  8129. fp_cache[idx].lru_count = 0;
  8130. mp_clear(&fp_cache[idx].mu);
  8131. return err;
  8132. }
  8133. /* perform a fixed point ECC mulmod */
  8134. static int accel_fp_mul(int idx, mp_int* k, ecc_point *R, mp_int* a,
  8135. mp_int* modulus, mp_digit mp, int map)
  8136. {
  8137. #define KB_SIZE 128
  8138. #ifdef WOLFSSL_SMALL_STACK
  8139. unsigned char* kb = NULL;
  8140. #else
  8141. unsigned char kb[KB_SIZE];
  8142. #endif
  8143. int x, err;
  8144. unsigned y, z = 0, bitlen, bitpos, lut_gap, first;
  8145. mp_int tk, order;
  8146. if (mp_init_multi(&tk, &order, NULL, NULL, NULL, NULL) != MP_OKAY)
  8147. return MP_INIT_E;
  8148. /* if it's smaller than modulus we fine */
  8149. if (mp_unsigned_bin_size(k) > mp_unsigned_bin_size(modulus)) {
  8150. /* find order */
  8151. y = mp_unsigned_bin_size(modulus);
  8152. for (x = 0; ecc_sets[x].size; x++) {
  8153. if (y <= (unsigned)ecc_sets[x].size) break;
  8154. }
  8155. /* back off if we are on the 521 bit curve */
  8156. if (y == 66) --x;
  8157. if ((err = mp_read_radix(&order, ecc_sets[x].order,
  8158. MP_RADIX_HEX)) != MP_OKAY) {
  8159. goto done;
  8160. }
  8161. /* k must be less than modulus */
  8162. if (mp_cmp(k, &order) != MP_LT) {
  8163. if ((err = mp_mod(k, &order, &tk)) != MP_OKAY) {
  8164. goto done;
  8165. }
  8166. } else {
  8167. if ((err = mp_copy(k, &tk)) != MP_OKAY) {
  8168. goto done;
  8169. }
  8170. }
  8171. } else {
  8172. if ((err = mp_copy(k, &tk)) != MP_OKAY) {
  8173. goto done;
  8174. }
  8175. }
  8176. /* get bitlen and round up to next multiple of FP_LUT */
  8177. bitlen = mp_unsigned_bin_size(modulus) << 3;
  8178. x = bitlen % FP_LUT;
  8179. if (x) {
  8180. bitlen += FP_LUT - x;
  8181. }
  8182. lut_gap = bitlen / FP_LUT;
  8183. /* get the k value */
  8184. if (mp_unsigned_bin_size(&tk) > (int)(KB_SIZE - 2)) {
  8185. err = BUFFER_E; goto done;
  8186. }
  8187. /* store k */
  8188. #ifdef WOLFSSL_SMALL_STACK
  8189. kb = (unsigned char*)XMALLOC(KB_SIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8190. if (kb == NULL) {
  8191. err = MEMORY_E; goto done;
  8192. }
  8193. #endif
  8194. XMEMSET(kb, 0, KB_SIZE);
  8195. if ((err = mp_to_unsigned_bin(&tk, kb)) == MP_OKAY) {
  8196. /* let's reverse kb so it's little endian */
  8197. x = 0;
  8198. y = mp_unsigned_bin_size(&tk);
  8199. if (y > 0) {
  8200. y -= 1;
  8201. }
  8202. while ((unsigned)x < y) {
  8203. z = kb[x]; kb[x] = kb[y]; kb[y] = (byte)z;
  8204. ++x; --y;
  8205. }
  8206. /* at this point we can start, yipee */
  8207. first = 1;
  8208. for (x = lut_gap-1; x >= 0; x--) {
  8209. /* extract FP_LUT bits from kb spread out by lut_gap bits and offset
  8210. by x bits from the start */
  8211. bitpos = x;
  8212. for (y = z = 0; y < FP_LUT; y++) {
  8213. z |= ((kb[bitpos>>3] >> (bitpos&7)) & 1) << y;
  8214. bitpos += lut_gap; /* it's y*lut_gap + x, but here we can avoid
  8215. the mult in each loop */
  8216. }
  8217. /* double if not first */
  8218. if (!first) {
  8219. if ((err = ecc_projective_dbl_point(R, R, a, modulus,
  8220. mp)) != MP_OKAY) {
  8221. break;
  8222. }
  8223. }
  8224. /* add if not first, otherwise copy */
  8225. if (!first && z) {
  8226. if ((err = ecc_projective_add_point(R, fp_cache[idx].LUT[z], R, a,
  8227. modulus, mp)) != MP_OKAY) {
  8228. break;
  8229. }
  8230. if (mp_iszero(R->z)) {
  8231. /* When all zero then should have done an add */
  8232. if (mp_iszero(R->x) && mp_iszero(R->y)) {
  8233. if ((err = ecc_projective_dbl_point(fp_cache[idx].LUT[z],
  8234. R, a, modulus, mp)) != MP_OKAY) {
  8235. break;
  8236. }
  8237. }
  8238. /* When only Z zero then result is infinity */
  8239. else {
  8240. err = mp_set(R->x, 0);
  8241. if (err != MP_OKAY) {
  8242. break;
  8243. }
  8244. err = mp_set(R->y, 0);
  8245. if (err != MP_OKAY) {
  8246. break;
  8247. }
  8248. err = mp_copy(&fp_cache[idx].mu, R->z);
  8249. if (err != MP_OKAY) {
  8250. break;
  8251. }
  8252. first = 1;
  8253. }
  8254. }
  8255. } else if (z) {
  8256. if ((mp_copy(fp_cache[idx].LUT[z]->x, R->x) != MP_OKAY) ||
  8257. (mp_copy(fp_cache[idx].LUT[z]->y, R->y) != MP_OKAY) ||
  8258. (mp_copy(&fp_cache[idx].mu, R->z) != MP_OKAY)) {
  8259. err = GEN_MEM_ERR;
  8260. break;
  8261. }
  8262. first = 0;
  8263. }
  8264. }
  8265. }
  8266. if (err == MP_OKAY) {
  8267. (void) z; /* Acknowledge the unused assignment */
  8268. ForceZero(kb, KB_SIZE);
  8269. /* map R back from projective space */
  8270. if (map) {
  8271. err = ecc_map(R, modulus, mp);
  8272. } else {
  8273. err = MP_OKAY;
  8274. }
  8275. }
  8276. done:
  8277. /* cleanup */
  8278. mp_clear(&order);
  8279. mp_clear(&tk);
  8280. #ifdef WOLFSSL_SMALL_STACK
  8281. XFREE(kb, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8282. #endif
  8283. #undef KB_SIZE
  8284. return err;
  8285. }
  8286. #endif
  8287. #ifdef ECC_SHAMIR
  8288. #ifndef WOLFSSL_SP_MATH
  8289. /* perform a fixed point ECC mulmod */
  8290. static int accel_fp_mul2add(int idx1, int idx2,
  8291. mp_int* kA, mp_int* kB,
  8292. ecc_point *R, mp_int* a,
  8293. mp_int* modulus, mp_digit mp)
  8294. {
  8295. #define KB_SIZE 128
  8296. #ifdef WOLFSSL_SMALL_STACK
  8297. unsigned char* kb[2] = {NULL, NULL};
  8298. #else
  8299. unsigned char kb[2][KB_SIZE];
  8300. #endif
  8301. int x, err;
  8302. unsigned y, z, bitlen, bitpos, lut_gap, first, zA, zB;
  8303. mp_int tka, tkb, order;
  8304. if (mp_init_multi(&tka, &tkb, &order, NULL, NULL, NULL) != MP_OKAY)
  8305. return MP_INIT_E;
  8306. /* if it's smaller than modulus we fine */
  8307. if (mp_unsigned_bin_size(kA) > mp_unsigned_bin_size(modulus)) {
  8308. /* find order */
  8309. y = mp_unsigned_bin_size(modulus);
  8310. for (x = 0; ecc_sets[x].size; x++) {
  8311. if (y <= (unsigned)ecc_sets[x].size) break;
  8312. }
  8313. /* back off if we are on the 521 bit curve */
  8314. if (y == 66) --x;
  8315. if ((err = mp_read_radix(&order, ecc_sets[x].order,
  8316. MP_RADIX_HEX)) != MP_OKAY) {
  8317. goto done;
  8318. }
  8319. /* kA must be less than modulus */
  8320. if (mp_cmp(kA, &order) != MP_LT) {
  8321. if ((err = mp_mod(kA, &order, &tka)) != MP_OKAY) {
  8322. goto done;
  8323. }
  8324. } else {
  8325. if ((err = mp_copy(kA, &tka)) != MP_OKAY) {
  8326. goto done;
  8327. }
  8328. }
  8329. } else {
  8330. if ((err = mp_copy(kA, &tka)) != MP_OKAY) {
  8331. goto done;
  8332. }
  8333. }
  8334. /* if it's smaller than modulus we fine */
  8335. if (mp_unsigned_bin_size(kB) > mp_unsigned_bin_size(modulus)) {
  8336. /* find order */
  8337. y = mp_unsigned_bin_size(modulus);
  8338. for (x = 0; ecc_sets[x].size; x++) {
  8339. if (y <= (unsigned)ecc_sets[x].size) break;
  8340. }
  8341. /* back off if we are on the 521 bit curve */
  8342. if (y == 66) --x;
  8343. if ((err = mp_read_radix(&order, ecc_sets[x].order,
  8344. MP_RADIX_HEX)) != MP_OKAY) {
  8345. goto done;
  8346. }
  8347. /* kB must be less than modulus */
  8348. if (mp_cmp(kB, &order) != MP_LT) {
  8349. if ((err = mp_mod(kB, &order, &tkb)) != MP_OKAY) {
  8350. goto done;
  8351. }
  8352. } else {
  8353. if ((err = mp_copy(kB, &tkb)) != MP_OKAY) {
  8354. goto done;
  8355. }
  8356. }
  8357. } else {
  8358. if ((err = mp_copy(kB, &tkb)) != MP_OKAY) {
  8359. goto done;
  8360. }
  8361. }
  8362. /* get bitlen and round up to next multiple of FP_LUT */
  8363. bitlen = mp_unsigned_bin_size(modulus) << 3;
  8364. x = bitlen % FP_LUT;
  8365. if (x) {
  8366. bitlen += FP_LUT - x;
  8367. }
  8368. lut_gap = bitlen / FP_LUT;
  8369. /* get the k value */
  8370. if ((mp_unsigned_bin_size(&tka) > (int)(KB_SIZE - 2)) ||
  8371. (mp_unsigned_bin_size(&tkb) > (int)(KB_SIZE - 2)) ) {
  8372. err = BUFFER_E; goto done;
  8373. }
  8374. /* store k */
  8375. #ifdef WOLFSSL_SMALL_STACK
  8376. kb[0] = (unsigned char*)XMALLOC(KB_SIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8377. if (kb[0] == NULL) {
  8378. err = MEMORY_E; goto done;
  8379. }
  8380. #endif
  8381. XMEMSET(kb[0], 0, KB_SIZE);
  8382. if ((err = mp_to_unsigned_bin(&tka, kb[0])) != MP_OKAY) {
  8383. goto done;
  8384. }
  8385. /* let's reverse kb so it's little endian */
  8386. x = 0;
  8387. y = mp_unsigned_bin_size(&tka);
  8388. if (y > 0) {
  8389. y -= 1;
  8390. }
  8391. mp_clear(&tka);
  8392. while ((unsigned)x < y) {
  8393. z = kb[0][x]; kb[0][x] = kb[0][y]; kb[0][y] = (byte)z;
  8394. ++x; --y;
  8395. }
  8396. /* store b */
  8397. #ifdef WOLFSSL_SMALL_STACK
  8398. kb[1] = (unsigned char*)XMALLOC(KB_SIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8399. if (kb[1] == NULL) {
  8400. err = MEMORY_E; goto done;
  8401. }
  8402. #endif
  8403. XMEMSET(kb[1], 0, KB_SIZE);
  8404. if ((err = mp_to_unsigned_bin(&tkb, kb[1])) == MP_OKAY) {
  8405. x = 0;
  8406. y = mp_unsigned_bin_size(&tkb);
  8407. if (y > 0) {
  8408. y -= 1;
  8409. }
  8410. while ((unsigned)x < y) {
  8411. z = kb[1][x]; kb[1][x] = kb[1][y]; kb[1][y] = (byte)z;
  8412. ++x; --y;
  8413. }
  8414. /* at this point we can start, yipee */
  8415. first = 1;
  8416. for (x = lut_gap-1; x >= 0; x--) {
  8417. /* extract FP_LUT bits from kb spread out by lut_gap bits and
  8418. offset by x bits from the start */
  8419. bitpos = x;
  8420. for (y = zA = zB = 0; y < FP_LUT; y++) {
  8421. zA |= ((kb[0][bitpos>>3] >> (bitpos&7)) & 1) << y;
  8422. zB |= ((kb[1][bitpos>>3] >> (bitpos&7)) & 1) << y;
  8423. bitpos += lut_gap; /* it's y*lut_gap + x, but here we can avoid
  8424. the mult in each loop */
  8425. }
  8426. /* double if not first */
  8427. if (!first) {
  8428. if ((err = ecc_projective_dbl_point(R, R, a, modulus,
  8429. mp)) != MP_OKAY) {
  8430. break;
  8431. }
  8432. /* add if not first, otherwise copy */
  8433. if (zA) {
  8434. if ((err = ecc_projective_add_point(R, fp_cache[idx1].LUT[zA],
  8435. R, a, modulus, mp)) != MP_OKAY) {
  8436. break;
  8437. }
  8438. if (mp_iszero(R->z)) {
  8439. /* When all zero then should have done an add */
  8440. if (mp_iszero(R->x) && mp_iszero(R->y)) {
  8441. if ((err = ecc_projective_dbl_point(
  8442. fp_cache[idx1].LUT[zA], R,
  8443. a, modulus, mp)) != MP_OKAY) {
  8444. break;
  8445. }
  8446. }
  8447. /* When only Z zero then result is infinity */
  8448. else {
  8449. err = mp_set(R->x, 0);
  8450. if (err != MP_OKAY) {
  8451. break;
  8452. }
  8453. err = mp_set(R->y, 0);
  8454. if (err != MP_OKAY) {
  8455. break;
  8456. }
  8457. err = mp_copy(&fp_cache[idx1].mu, R->z);
  8458. if (err != MP_OKAY) {
  8459. break;
  8460. }
  8461. first = 1;
  8462. }
  8463. }
  8464. }
  8465. if (zB) {
  8466. if ((err = ecc_projective_add_point(R, fp_cache[idx2].LUT[zB],
  8467. R, a, modulus, mp)) != MP_OKAY) {
  8468. break;
  8469. }
  8470. if (mp_iszero(R->z)) {
  8471. /* When all zero then should have done an add */
  8472. if (mp_iszero(R->x) && mp_iszero(R->y)) {
  8473. if ((err = ecc_projective_dbl_point(
  8474. fp_cache[idx2].LUT[zB], R,
  8475. a, modulus, mp)) != MP_OKAY) {
  8476. break;
  8477. }
  8478. }
  8479. /* When only Z zero then result is infinity */
  8480. else {
  8481. err = mp_set(R->x, 0);
  8482. if (err != MP_OKAY) {
  8483. break;
  8484. }
  8485. err = mp_set(R->y, 0);
  8486. if (err != MP_OKAY) {
  8487. break;
  8488. }
  8489. err = mp_copy(&fp_cache[idx2].mu, R->z);
  8490. if (err != MP_OKAY) {
  8491. break;
  8492. }
  8493. first = 1;
  8494. }
  8495. }
  8496. }
  8497. } else {
  8498. if (zA) {
  8499. if ((mp_copy(fp_cache[idx1].LUT[zA]->x, R->x) != MP_OKAY) ||
  8500. (mp_copy(fp_cache[idx1].LUT[zA]->y, R->y) != MP_OKAY) ||
  8501. (mp_copy(&fp_cache[idx1].mu, R->z) != MP_OKAY)) {
  8502. err = GEN_MEM_ERR;
  8503. break;
  8504. }
  8505. first = 0;
  8506. }
  8507. if (zB && first == 0) {
  8508. if (zB) {
  8509. if ((err = ecc_projective_add_point(R,
  8510. fp_cache[idx2].LUT[zB], R, a, modulus, mp)) != MP_OKAY){
  8511. break;
  8512. }
  8513. if (mp_iszero(R->z)) {
  8514. /* When all zero then should have done an add */
  8515. if (mp_iszero(R->x) && mp_iszero(R->y)) {
  8516. if ((err = ecc_projective_dbl_point(
  8517. fp_cache[idx2].LUT[zB], R,
  8518. a, modulus, mp)) != MP_OKAY) {
  8519. break;
  8520. }
  8521. }
  8522. /* When only Z zero then result is infinity */
  8523. else {
  8524. err = mp_set(R->x, 0);
  8525. if (err != MP_OKAY) {
  8526. break;
  8527. }
  8528. err = mp_set(R->y, 0);
  8529. if (err != MP_OKAY) {
  8530. break;
  8531. }
  8532. err = mp_copy(&fp_cache[idx2].mu, R->z);
  8533. if (err != MP_OKAY) {
  8534. break;
  8535. }
  8536. first = 1;
  8537. }
  8538. }
  8539. }
  8540. } else if (zB && first == 1) {
  8541. if ((mp_copy(fp_cache[idx2].LUT[zB]->x, R->x) != MP_OKAY) ||
  8542. (mp_copy(fp_cache[idx2].LUT[zB]->y, R->y) != MP_OKAY) ||
  8543. (mp_copy(&fp_cache[idx2].mu, R->z) != MP_OKAY)) {
  8544. err = GEN_MEM_ERR;
  8545. break;
  8546. }
  8547. first = 0;
  8548. }
  8549. }
  8550. }
  8551. }
  8552. done:
  8553. /* cleanup */
  8554. mp_clear(&tkb);
  8555. mp_clear(&tka);
  8556. mp_clear(&order);
  8557. #ifdef WOLFSSL_SMALL_STACK
  8558. if (kb[0])
  8559. #endif
  8560. ForceZero(kb[0], KB_SIZE);
  8561. #ifdef WOLFSSL_SMALL_STACK
  8562. if (kb[1])
  8563. #endif
  8564. ForceZero(kb[1], KB_SIZE);
  8565. #ifdef WOLFSSL_SMALL_STACK
  8566. XFREE(kb[0], NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8567. XFREE(kb[1], NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8568. #endif
  8569. #undef KB_SIZE
  8570. if (err != MP_OKAY)
  8571. return err;
  8572. return ecc_map(R, modulus, mp);
  8573. }
  8574. /** ECC Fixed Point mulmod global with heap hint used
  8575. Computes kA*A + kB*B = C using Shamir's Trick
  8576. A First point to multiply
  8577. kA What to multiple A by
  8578. B Second point to multiply
  8579. kB What to multiple B by
  8580. C [out] Destination point (can overlap with A or B)
  8581. a ECC curve parameter a
  8582. modulus Modulus for curve
  8583. return MP_OKAY on success
  8584. */
  8585. int ecc_mul2add(ecc_point* A, mp_int* kA,
  8586. ecc_point* B, mp_int* kB,
  8587. ecc_point* C, mp_int* a, mp_int* modulus, void* heap)
  8588. {
  8589. int idx1 = -1, idx2 = -1, err, mpInit = 0;
  8590. mp_digit mp;
  8591. mp_int mu;
  8592. err = mp_init(&mu);
  8593. if (err != MP_OKAY)
  8594. return err;
  8595. #ifndef HAVE_THREAD_LS
  8596. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  8597. wc_InitMutex(&ecc_fp_lock);
  8598. initMutex = 1;
  8599. }
  8600. if (wc_LockMutex(&ecc_fp_lock) != 0)
  8601. return BAD_MUTEX_E;
  8602. #endif /* HAVE_THREAD_LS */
  8603. /* find point */
  8604. idx1 = find_base(A);
  8605. /* no entry? */
  8606. if (idx1 == -1) {
  8607. /* find hole and add it */
  8608. if ((idx1 = find_hole()) >= 0) {
  8609. err = add_entry(idx1, A);
  8610. }
  8611. }
  8612. if (err == MP_OKAY && idx1 != -1) {
  8613. /* increment LRU */
  8614. ++(fp_cache[idx1].lru_count);
  8615. }
  8616. if (err == MP_OKAY) {
  8617. /* find point */
  8618. idx2 = find_base(B);
  8619. /* no entry? */
  8620. if (idx2 == -1) {
  8621. /* find hole and add it */
  8622. if ((idx2 = find_hole()) >= 0)
  8623. err = add_entry(idx2, B);
  8624. }
  8625. }
  8626. if (err == MP_OKAY && idx2 != -1) {
  8627. /* increment LRU */
  8628. ++(fp_cache[idx2].lru_count);
  8629. }
  8630. if (err == MP_OKAY) {
  8631. /* if it's >= 2 AND the LUT is not set build the LUT */
  8632. if (idx1 >= 0 && fp_cache[idx1].lru_count >= 2 && !fp_cache[idx1].LUT_set) {
  8633. /* compute mp */
  8634. err = mp_montgomery_setup(modulus, &mp);
  8635. if (err == MP_OKAY) {
  8636. mpInit = 1;
  8637. err = mp_montgomery_calc_normalization(&mu, modulus);
  8638. }
  8639. if (err == MP_OKAY)
  8640. /* build the LUT */
  8641. err = build_lut(idx1, a, modulus, mp, &mu);
  8642. }
  8643. }
  8644. if (err == MP_OKAY) {
  8645. /* if it's >= 2 AND the LUT is not set build the LUT */
  8646. if (idx2 >= 0 && fp_cache[idx2].lru_count >= 2 && !fp_cache[idx2].LUT_set) {
  8647. if (mpInit == 0) {
  8648. /* compute mp */
  8649. err = mp_montgomery_setup(modulus, &mp);
  8650. if (err == MP_OKAY) {
  8651. mpInit = 1;
  8652. err = mp_montgomery_calc_normalization(&mu, modulus);
  8653. }
  8654. }
  8655. if (err == MP_OKAY)
  8656. /* build the LUT */
  8657. err = build_lut(idx2, a, modulus, mp, &mu);
  8658. }
  8659. }
  8660. if (err == MP_OKAY) {
  8661. if (idx1 >=0 && idx2 >= 0 && fp_cache[idx1].LUT_set &&
  8662. fp_cache[idx2].LUT_set) {
  8663. if (mpInit == 0) {
  8664. /* compute mp */
  8665. err = mp_montgomery_setup(modulus, &mp);
  8666. }
  8667. if (err == MP_OKAY)
  8668. err = accel_fp_mul2add(idx1, idx2, kA, kB, C, a, modulus, mp);
  8669. } else {
  8670. err = normal_ecc_mul2add(A, kA, B, kB, C, a, modulus, heap);
  8671. }
  8672. }
  8673. #ifndef HAVE_THREAD_LS
  8674. wc_UnLockMutex(&ecc_fp_lock);
  8675. #endif /* HAVE_THREAD_LS */
  8676. mp_clear(&mu);
  8677. return err;
  8678. }
  8679. #endif
  8680. #endif /* ECC_SHAMIR */
  8681. /** ECC Fixed Point mulmod global
  8682. k The multiplicand
  8683. G Base point to multiply
  8684. R [out] Destination of product
  8685. a ECC curve parameter a
  8686. modulus The modulus for the curve
  8687. map [boolean] If non-zero maps the point back to affine coordinates,
  8688. otherwise it's left in jacobian-montgomery form
  8689. return MP_OKAY if successful
  8690. */
  8691. int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  8692. mp_int* modulus, int map, void* heap)
  8693. {
  8694. #ifndef WOLFSSL_SP_MATH
  8695. int idx, err = MP_OKAY;
  8696. mp_digit mp;
  8697. mp_int mu;
  8698. int mpSetup = 0;
  8699. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL) {
  8700. return ECC_BAD_ARG_E;
  8701. }
  8702. if (mp_init(&mu) != MP_OKAY)
  8703. return MP_INIT_E;
  8704. #ifndef HAVE_THREAD_LS
  8705. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  8706. wc_InitMutex(&ecc_fp_lock);
  8707. initMutex = 1;
  8708. }
  8709. if (wc_LockMutex(&ecc_fp_lock) != 0)
  8710. return BAD_MUTEX_E;
  8711. #endif /* HAVE_THREAD_LS */
  8712. /* find point */
  8713. idx = find_base(G);
  8714. /* no entry? */
  8715. if (idx == -1) {
  8716. /* find hole and add it */
  8717. idx = find_hole();
  8718. if (idx >= 0)
  8719. err = add_entry(idx, G);
  8720. }
  8721. if (err == MP_OKAY && idx >= 0) {
  8722. /* increment LRU */
  8723. ++(fp_cache[idx].lru_count);
  8724. }
  8725. if (err == MP_OKAY) {
  8726. /* if it's 2 build the LUT, if it's higher just use the LUT */
  8727. if (idx >= 0 && fp_cache[idx].lru_count >= 2 && !fp_cache[idx].LUT_set) {
  8728. /* compute mp */
  8729. err = mp_montgomery_setup(modulus, &mp);
  8730. if (err == MP_OKAY) {
  8731. /* compute mu */
  8732. mpSetup = 1;
  8733. err = mp_montgomery_calc_normalization(&mu, modulus);
  8734. }
  8735. if (err == MP_OKAY)
  8736. /* build the LUT */
  8737. err = build_lut(idx, a, modulus, mp, &mu);
  8738. }
  8739. }
  8740. if (err == MP_OKAY) {
  8741. if (idx >= 0 && fp_cache[idx].LUT_set) {
  8742. if (mpSetup == 0) {
  8743. /* compute mp */
  8744. err = mp_montgomery_setup(modulus, &mp);
  8745. }
  8746. if (err == MP_OKAY)
  8747. err = accel_fp_mul(idx, k, R, a, modulus, mp, map);
  8748. } else {
  8749. err = normal_ecc_mulmod(k, G, R, a, modulus, NULL, map, heap);
  8750. }
  8751. }
  8752. #ifndef HAVE_THREAD_LS
  8753. wc_UnLockMutex(&ecc_fp_lock);
  8754. #endif /* HAVE_THREAD_LS */
  8755. mp_clear(&mu);
  8756. return err;
  8757. #else
  8758. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL) {
  8759. return ECC_BAD_ARG_E;
  8760. }
  8761. #ifndef WOLFSSL_SP_NO_256
  8762. if (mp_count_bits(modulus) == 256) {
  8763. return sp_ecc_mulmod_256(k, G, R, map, heap);
  8764. }
  8765. #endif
  8766. #ifdef WOLFSSL_SP_384
  8767. if (mp_count_bits(modulus) == 384) {
  8768. return sp_ecc_mulmod_384(k, G, R, map, heap);
  8769. }
  8770. #endif
  8771. return WC_KEY_SIZE_E;
  8772. #endif
  8773. }
  8774. #ifndef WOLFSSL_SP_MATH
  8775. static int normal_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R,
  8776. mp_int* a, mp_int* modulus, mp_int* order,
  8777. WC_RNG* rng, int map, void* heap)
  8778. {
  8779. int err;
  8780. mp_int t;
  8781. mp_int o;
  8782. mp_digit mask;
  8783. int i;
  8784. if ((err = mp_init(&t)) != MP_OKAY)
  8785. return err;
  8786. if ((err = mp_init(&o)) != MP_OKAY) {
  8787. mp_free(&t);
  8788. return err;
  8789. }
  8790. /* Make k at 1 bit longer than order. */
  8791. if (err == MP_OKAY) {
  8792. err = mp_add(k, order, &t);
  8793. }
  8794. if (err == MP_OKAY) {
  8795. err = mp_copy(order, &o);
  8796. }
  8797. if (err == MP_OKAY) {
  8798. /* Only add if order + k has same number of bits as order */
  8799. mask = (mp_digit)0 - (mp_count_bits(&t) == mp_count_bits(order));
  8800. for (i = 0; i < o.used; i++) {
  8801. o.dp[i] &= mask;
  8802. }
  8803. err = mp_add(&t, &o, &t);
  8804. }
  8805. if (err == MP_OKAY) {
  8806. err = normal_ecc_mulmod(&t, G, R, a, modulus, rng, map, heap);
  8807. }
  8808. mp_forcezero(&t);
  8809. mp_free(&o);
  8810. mp_free(&t);
  8811. return err;
  8812. }
  8813. #endif /* !WOLFSSL_SP_MATH */
  8814. /** ECC Fixed Point mulmod global
  8815. k The multiplicand
  8816. G Base point to multiply
  8817. R [out] Destination of product
  8818. a ECC curve parameter a
  8819. modulus The modulus for the curve
  8820. map [boolean] If non-zero maps the point back to affine coordinates,
  8821. otherwise it's left in jacobian-montgomery form
  8822. return MP_OKAY if successful
  8823. */
  8824. int wc_ecc_mulmod_ex2(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  8825. mp_int* modulus, mp_int* order, WC_RNG* rng, int map, void* heap)
  8826. {
  8827. #ifndef WOLFSSL_SP_MATH
  8828. int idx, err = MP_OKAY;
  8829. mp_digit mp;
  8830. mp_int mu;
  8831. int mpSetup = 0;
  8832. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL ||
  8833. order == NULL) {
  8834. return ECC_BAD_ARG_E;
  8835. }
  8836. if (mp_init(&mu) != MP_OKAY)
  8837. return MP_INIT_E;
  8838. #ifndef HAVE_THREAD_LS
  8839. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  8840. wc_InitMutex(&ecc_fp_lock);
  8841. initMutex = 1;
  8842. }
  8843. if (wc_LockMutex(&ecc_fp_lock) != 0)
  8844. return BAD_MUTEX_E;
  8845. #endif /* HAVE_THREAD_LS */
  8846. /* find point */
  8847. idx = find_base(G);
  8848. /* no entry? */
  8849. if (idx == -1) {
  8850. /* find hole and add it */
  8851. idx = find_hole();
  8852. if (idx >= 0)
  8853. err = add_entry(idx, G);
  8854. }
  8855. if (err == MP_OKAY && idx >= 0) {
  8856. /* increment LRU */
  8857. ++(fp_cache[idx].lru_count);
  8858. }
  8859. if (err == MP_OKAY) {
  8860. /* if it's 2 build the LUT, if it's higher just use the LUT */
  8861. if (idx >= 0 && fp_cache[idx].lru_count >= 2 && !fp_cache[idx].LUT_set) {
  8862. /* compute mp */
  8863. err = mp_montgomery_setup(modulus, &mp);
  8864. if (err == MP_OKAY) {
  8865. /* compute mu */
  8866. mpSetup = 1;
  8867. err = mp_montgomery_calc_normalization(&mu, modulus);
  8868. }
  8869. if (err == MP_OKAY)
  8870. /* build the LUT */
  8871. err = build_lut(idx, a, modulus, mp, &mu);
  8872. }
  8873. }
  8874. if (err == MP_OKAY) {
  8875. if (idx >= 0 && fp_cache[idx].LUT_set) {
  8876. if (mpSetup == 0) {
  8877. /* compute mp */
  8878. err = mp_montgomery_setup(modulus, &mp);
  8879. }
  8880. if (err == MP_OKAY)
  8881. err = accel_fp_mul(idx, k, R, a, modulus, mp, map);
  8882. } else {
  8883. err = normal_ecc_mulmod_ex(k, G, R, a, modulus, order, rng, map,
  8884. heap);
  8885. }
  8886. }
  8887. #ifndef HAVE_THREAD_LS
  8888. wc_UnLockMutex(&ecc_fp_lock);
  8889. #endif /* HAVE_THREAD_LS */
  8890. mp_clear(&mu);
  8891. return err;
  8892. #else
  8893. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL ||
  8894. order == NULL) {
  8895. return ECC_BAD_ARG_E;
  8896. }
  8897. #ifndef WOLFSSL_SP_NO_256
  8898. if (mp_count_bits(modulus) == 256) {
  8899. return sp_ecc_mulmod_256(k, G, R, map, heap);
  8900. }
  8901. #endif
  8902. #ifdef WOLFSSL_SP_384
  8903. if (mp_count_bits(modulus) == 384) {
  8904. return sp_ecc_mulmod_384(k, G, R, map, heap);
  8905. }
  8906. #endif
  8907. return WC_KEY_SIZE_E;
  8908. #endif
  8909. }
  8910. #ifndef WOLFSSL_SP_MATH
  8911. /* helper function for freeing the cache ...
  8912. must be called with the cache mutex locked */
  8913. static void wc_ecc_fp_free_cache(void)
  8914. {
  8915. unsigned x, y;
  8916. for (x = 0; x < FP_ENTRIES; x++) {
  8917. if (fp_cache[x].g != NULL) {
  8918. for (y = 0; y < (1U<<FP_LUT); y++) {
  8919. wc_ecc_del_point(fp_cache[x].LUT[y]);
  8920. fp_cache[x].LUT[y] = NULL;
  8921. }
  8922. wc_ecc_del_point(fp_cache[x].g);
  8923. fp_cache[x].g = NULL;
  8924. mp_clear(&fp_cache[x].mu);
  8925. fp_cache[x].LUT_set = 0;
  8926. fp_cache[x].lru_count = 0;
  8927. fp_cache[x].lock = 0;
  8928. }
  8929. }
  8930. }
  8931. #endif
  8932. /** Init the Fixed Point cache */
  8933. void wc_ecc_fp_init(void)
  8934. {
  8935. #ifndef WOLFSSL_SP_MATH
  8936. #ifndef HAVE_THREAD_LS
  8937. if (initMutex == 0) {
  8938. wc_InitMutex(&ecc_fp_lock);
  8939. initMutex = 1;
  8940. }
  8941. #endif
  8942. #endif
  8943. }
  8944. /** Free the Fixed Point cache */
  8945. void wc_ecc_fp_free(void)
  8946. {
  8947. #ifndef WOLFSSL_SP_MATH
  8948. #ifndef HAVE_THREAD_LS
  8949. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  8950. wc_InitMutex(&ecc_fp_lock);
  8951. initMutex = 1;
  8952. }
  8953. if (wc_LockMutex(&ecc_fp_lock) == 0) {
  8954. #endif /* HAVE_THREAD_LS */
  8955. wc_ecc_fp_free_cache();
  8956. #ifndef HAVE_THREAD_LS
  8957. wc_UnLockMutex(&ecc_fp_lock);
  8958. wc_FreeMutex(&ecc_fp_lock);
  8959. initMutex = 0;
  8960. }
  8961. #endif /* HAVE_THREAD_LS */
  8962. #endif
  8963. }
  8964. #endif /* FP_ECC */
  8965. #ifdef ECC_TIMING_RESISTANT
  8966. int wc_ecc_set_rng(ecc_key* key, WC_RNG* rng)
  8967. {
  8968. int err = 0;
  8969. if (key == NULL) {
  8970. err = BAD_FUNC_ARG;
  8971. }
  8972. else {
  8973. key->rng = rng;
  8974. }
  8975. return err;
  8976. }
  8977. #endif
  8978. #ifdef HAVE_ECC_ENCRYPT
  8979. enum ecCliState {
  8980. ecCLI_INIT = 1,
  8981. ecCLI_SALT_GET = 2,
  8982. ecCLI_SALT_SET = 3,
  8983. ecCLI_SENT_REQ = 4,
  8984. ecCLI_RECV_RESP = 5,
  8985. ecCLI_BAD_STATE = 99
  8986. };
  8987. enum ecSrvState {
  8988. ecSRV_INIT = 1,
  8989. ecSRV_SALT_GET = 2,
  8990. ecSRV_SALT_SET = 3,
  8991. ecSRV_RECV_REQ = 4,
  8992. ecSRV_SENT_RESP = 5,
  8993. ecSRV_BAD_STATE = 99
  8994. };
  8995. struct ecEncCtx {
  8996. const byte* kdfSalt; /* optional salt for kdf */
  8997. const byte* kdfInfo; /* optional info for kdf */
  8998. const byte* macSalt; /* optional salt for mac */
  8999. word32 kdfSaltSz; /* size of kdfSalt */
  9000. word32 kdfInfoSz; /* size of kdfInfo */
  9001. word32 macSaltSz; /* size of macSalt */
  9002. void* heap; /* heap hint for memory used */
  9003. byte clientSalt[EXCHANGE_SALT_SZ]; /* for msg exchange */
  9004. byte serverSalt[EXCHANGE_SALT_SZ]; /* for msg exchange */
  9005. byte encAlgo; /* which encryption type */
  9006. byte kdfAlgo; /* which key derivation function type */
  9007. byte macAlgo; /* which mac function type */
  9008. byte protocol; /* are we REQ_RESP client or server ? */
  9009. byte cliSt; /* protocol state, for sanity checks */
  9010. byte srvSt; /* protocol state, for sanity checks */
  9011. };
  9012. const byte* wc_ecc_ctx_get_own_salt(ecEncCtx* ctx)
  9013. {
  9014. if (ctx == NULL || ctx->protocol == 0)
  9015. return NULL;
  9016. if (ctx->protocol == REQ_RESP_CLIENT) {
  9017. if (ctx->cliSt == ecCLI_INIT) {
  9018. ctx->cliSt = ecCLI_SALT_GET;
  9019. return ctx->clientSalt;
  9020. }
  9021. else {
  9022. ctx->cliSt = ecCLI_BAD_STATE;
  9023. return NULL;
  9024. }
  9025. }
  9026. else if (ctx->protocol == REQ_RESP_SERVER) {
  9027. if (ctx->srvSt == ecSRV_INIT) {
  9028. ctx->srvSt = ecSRV_SALT_GET;
  9029. return ctx->serverSalt;
  9030. }
  9031. else {
  9032. ctx->srvSt = ecSRV_BAD_STATE;
  9033. return NULL;
  9034. }
  9035. }
  9036. return NULL;
  9037. }
  9038. /* optional set info, can be called before or after set_peer_salt */
  9039. int wc_ecc_ctx_set_info(ecEncCtx* ctx, const byte* info, int sz)
  9040. {
  9041. if (ctx == NULL || info == 0 || sz < 0)
  9042. return BAD_FUNC_ARG;
  9043. ctx->kdfInfo = info;
  9044. ctx->kdfInfoSz = sz;
  9045. return 0;
  9046. }
  9047. static const char* exchange_info = "Secure Message Exchange";
  9048. int wc_ecc_ctx_set_peer_salt(ecEncCtx* ctx, const byte* salt)
  9049. {
  9050. byte tmp[EXCHANGE_SALT_SZ/2];
  9051. int halfSz = EXCHANGE_SALT_SZ/2;
  9052. if (ctx == NULL || ctx->protocol == 0 || salt == NULL)
  9053. return BAD_FUNC_ARG;
  9054. if (ctx->protocol == REQ_RESP_CLIENT) {
  9055. XMEMCPY(ctx->serverSalt, salt, EXCHANGE_SALT_SZ);
  9056. if (ctx->cliSt == ecCLI_SALT_GET)
  9057. ctx->cliSt = ecCLI_SALT_SET;
  9058. else {
  9059. ctx->cliSt = ecCLI_BAD_STATE;
  9060. return BAD_STATE_E;
  9061. }
  9062. }
  9063. else {
  9064. XMEMCPY(ctx->clientSalt, salt, EXCHANGE_SALT_SZ);
  9065. if (ctx->srvSt == ecSRV_SALT_GET)
  9066. ctx->srvSt = ecSRV_SALT_SET;
  9067. else {
  9068. ctx->srvSt = ecSRV_BAD_STATE;
  9069. return BAD_STATE_E;
  9070. }
  9071. }
  9072. /* mix half and half */
  9073. /* tmp stores 2nd half of client before overwrite */
  9074. XMEMCPY(tmp, ctx->clientSalt + halfSz, halfSz);
  9075. XMEMCPY(ctx->clientSalt + halfSz, ctx->serverSalt, halfSz);
  9076. XMEMCPY(ctx->serverSalt, tmp, halfSz);
  9077. ctx->kdfSalt = ctx->clientSalt;
  9078. ctx->kdfSaltSz = EXCHANGE_SALT_SZ;
  9079. ctx->macSalt = ctx->serverSalt;
  9080. ctx->macSaltSz = EXCHANGE_SALT_SZ;
  9081. if (ctx->kdfInfo == NULL) {
  9082. /* default info */
  9083. ctx->kdfInfo = (const byte*)exchange_info;
  9084. ctx->kdfInfoSz = EXCHANGE_INFO_SZ;
  9085. }
  9086. return 0;
  9087. }
  9088. static int ecc_ctx_set_salt(ecEncCtx* ctx, int flags, WC_RNG* rng)
  9089. {
  9090. byte* saltBuffer = NULL;
  9091. if (ctx == NULL || rng == NULL || flags == 0)
  9092. return BAD_FUNC_ARG;
  9093. saltBuffer = (flags == REQ_RESP_CLIENT) ? ctx->clientSalt : ctx->serverSalt;
  9094. return wc_RNG_GenerateBlock(rng, saltBuffer, EXCHANGE_SALT_SZ);
  9095. }
  9096. static void ecc_ctx_init(ecEncCtx* ctx, int flags)
  9097. {
  9098. if (ctx) {
  9099. XMEMSET(ctx, 0, sizeof(ecEncCtx));
  9100. ctx->encAlgo = ecAES_128_CBC;
  9101. ctx->kdfAlgo = ecHKDF_SHA256;
  9102. ctx->macAlgo = ecHMAC_SHA256;
  9103. ctx->protocol = (byte)flags;
  9104. if (flags == REQ_RESP_CLIENT)
  9105. ctx->cliSt = ecCLI_INIT;
  9106. if (flags == REQ_RESP_SERVER)
  9107. ctx->srvSt = ecSRV_INIT;
  9108. }
  9109. }
  9110. /* allow ecc context reset so user doesn't have to init/free for reuse */
  9111. int wc_ecc_ctx_reset(ecEncCtx* ctx, WC_RNG* rng)
  9112. {
  9113. if (ctx == NULL || rng == NULL)
  9114. return BAD_FUNC_ARG;
  9115. ecc_ctx_init(ctx, ctx->protocol);
  9116. return ecc_ctx_set_salt(ctx, ctx->protocol, rng);
  9117. }
  9118. ecEncCtx* wc_ecc_ctx_new_ex(int flags, WC_RNG* rng, void* heap)
  9119. {
  9120. int ret = 0;
  9121. ecEncCtx* ctx = (ecEncCtx*)XMALLOC(sizeof(ecEncCtx), heap,
  9122. DYNAMIC_TYPE_ECC);
  9123. if (ctx) {
  9124. ctx->protocol = (byte)flags;
  9125. ctx->heap = heap;
  9126. }
  9127. ret = wc_ecc_ctx_reset(ctx, rng);
  9128. if (ret != 0) {
  9129. wc_ecc_ctx_free(ctx);
  9130. ctx = NULL;
  9131. }
  9132. return ctx;
  9133. }
  9134. /* alloc/init and set defaults, return new Context */
  9135. ecEncCtx* wc_ecc_ctx_new(int flags, WC_RNG* rng)
  9136. {
  9137. return wc_ecc_ctx_new_ex(flags, rng, NULL);
  9138. }
  9139. /* free any resources, clear any keys */
  9140. void wc_ecc_ctx_free(ecEncCtx* ctx)
  9141. {
  9142. if (ctx) {
  9143. ForceZero(ctx, sizeof(ecEncCtx));
  9144. XFREE(ctx, ctx->heap, DYNAMIC_TYPE_ECC);
  9145. }
  9146. }
  9147. static int ecc_get_key_sizes(ecEncCtx* ctx, int* encKeySz, int* ivSz,
  9148. int* keysLen, word32* digestSz, word32* blockSz)
  9149. {
  9150. if (ctx) {
  9151. switch (ctx->encAlgo) {
  9152. case ecAES_128_CBC:
  9153. *encKeySz = KEY_SIZE_128;
  9154. *ivSz = IV_SIZE_128;
  9155. *blockSz = AES_BLOCK_SIZE;
  9156. break;
  9157. default:
  9158. return BAD_FUNC_ARG;
  9159. }
  9160. switch (ctx->macAlgo) {
  9161. case ecHMAC_SHA256:
  9162. *digestSz = WC_SHA256_DIGEST_SIZE;
  9163. break;
  9164. default:
  9165. return BAD_FUNC_ARG;
  9166. }
  9167. } else
  9168. return BAD_FUNC_ARG;
  9169. *keysLen = *encKeySz + *ivSz + *digestSz;
  9170. return 0;
  9171. }
  9172. /* ecc encrypt with shared secret run through kdf
  9173. ctx holds non default algos and inputs
  9174. msgSz should be the right size for encAlgo, i.e., already padded
  9175. return 0 on success */
  9176. int wc_ecc_encrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  9177. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx)
  9178. {
  9179. int ret = 0;
  9180. word32 blockSz;
  9181. word32 digestSz;
  9182. ecEncCtx localCtx;
  9183. #ifdef WOLFSSL_SMALL_STACK
  9184. byte* sharedSecret;
  9185. byte* keys;
  9186. #else
  9187. byte sharedSecret[ECC_MAXSIZE]; /* 521 max size */
  9188. byte keys[ECC_BUFSIZE]; /* max size */
  9189. #endif
  9190. word32 sharedSz = ECC_MAXSIZE;
  9191. int keysLen;
  9192. int encKeySz;
  9193. int ivSz;
  9194. int offset = 0; /* keys offset if doing msg exchange */
  9195. byte* encKey;
  9196. byte* encIv;
  9197. byte* macKey;
  9198. if (privKey == NULL || pubKey == NULL || msg == NULL || out == NULL ||
  9199. outSz == NULL)
  9200. return BAD_FUNC_ARG;
  9201. if (ctx == NULL) { /* use defaults */
  9202. ecc_ctx_init(&localCtx, 0);
  9203. ctx = &localCtx;
  9204. }
  9205. ret = ecc_get_key_sizes(ctx, &encKeySz, &ivSz, &keysLen, &digestSz,
  9206. &blockSz);
  9207. if (ret != 0)
  9208. return ret;
  9209. if (ctx->protocol == REQ_RESP_SERVER) {
  9210. offset = keysLen;
  9211. keysLen *= 2;
  9212. if (ctx->srvSt != ecSRV_RECV_REQ)
  9213. return BAD_STATE_E;
  9214. ctx->srvSt = ecSRV_BAD_STATE; /* we're done no more ops allowed */
  9215. }
  9216. else if (ctx->protocol == REQ_RESP_CLIENT) {
  9217. if (ctx->cliSt != ecCLI_SALT_SET)
  9218. return BAD_STATE_E;
  9219. ctx->cliSt = ecCLI_SENT_REQ; /* only do this once */
  9220. }
  9221. if (keysLen > ECC_BUFSIZE) /* keys size */
  9222. return BUFFER_E;
  9223. if ( (msgSz%blockSz) != 0)
  9224. return BAD_PADDING_E;
  9225. if (*outSz < (msgSz + digestSz))
  9226. return BUFFER_E;
  9227. #ifdef WOLFSSL_SMALL_STACK
  9228. sharedSecret = (byte*)XMALLOC(ECC_MAXSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  9229. if (sharedSecret == NULL)
  9230. return MEMORY_E;
  9231. keys = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  9232. if (keys == NULL) {
  9233. XFREE(sharedSecret, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  9234. return MEMORY_E;
  9235. }
  9236. #endif
  9237. do {
  9238. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  9239. ret = wc_AsyncWait(ret, &privKey->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  9240. if (ret != 0)
  9241. break;
  9242. #endif
  9243. ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret, &sharedSz);
  9244. } while (ret == WC_PENDING_E);
  9245. if (ret == 0) {
  9246. switch (ctx->kdfAlgo) {
  9247. case ecHKDF_SHA256 :
  9248. ret = wc_HKDF(WC_SHA256, sharedSecret, sharedSz, ctx->kdfSalt,
  9249. ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
  9250. keys, keysLen);
  9251. break;
  9252. default:
  9253. ret = BAD_FUNC_ARG;
  9254. break;
  9255. }
  9256. }
  9257. if (ret == 0) {
  9258. encKey = keys + offset;
  9259. encIv = encKey + encKeySz;
  9260. macKey = encKey + encKeySz + ivSz;
  9261. switch (ctx->encAlgo) {
  9262. case ecAES_128_CBC:
  9263. {
  9264. Aes aes;
  9265. ret = wc_AesInit(&aes, NULL, INVALID_DEVID);
  9266. if (ret == 0) {
  9267. ret = wc_AesSetKey(&aes, encKey, KEY_SIZE_128, encIv,
  9268. AES_ENCRYPTION);
  9269. if (ret == 0) {
  9270. ret = wc_AesCbcEncrypt(&aes, out, msg, msgSz);
  9271. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_AES)
  9272. ret = wc_AsyncWait(ret, &aes.asyncDev,
  9273. WC_ASYNC_FLAG_NONE);
  9274. #endif
  9275. }
  9276. wc_AesFree(&aes);
  9277. }
  9278. if (ret != 0)
  9279. break;
  9280. }
  9281. break;
  9282. default:
  9283. ret = BAD_FUNC_ARG;
  9284. break;
  9285. }
  9286. }
  9287. if (ret == 0) {
  9288. switch (ctx->macAlgo) {
  9289. case ecHMAC_SHA256:
  9290. {
  9291. Hmac hmac;
  9292. ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID);
  9293. if (ret == 0) {
  9294. ret = wc_HmacSetKey(&hmac, WC_SHA256, macKey, WC_SHA256_DIGEST_SIZE);
  9295. if (ret == 0)
  9296. ret = wc_HmacUpdate(&hmac, out, msgSz);
  9297. if (ret == 0)
  9298. ret = wc_HmacUpdate(&hmac, ctx->macSalt, ctx->macSaltSz);
  9299. if (ret == 0)
  9300. ret = wc_HmacFinal(&hmac, out+msgSz);
  9301. wc_HmacFree(&hmac);
  9302. }
  9303. }
  9304. break;
  9305. default:
  9306. ret = BAD_FUNC_ARG;
  9307. break;
  9308. }
  9309. }
  9310. if (ret == 0)
  9311. *outSz = msgSz + digestSz;
  9312. #ifdef WOLFSSL_SMALL_STACK
  9313. XFREE(sharedSecret, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  9314. XFREE(keys, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  9315. #endif
  9316. return ret;
  9317. }
  9318. /* ecc decrypt with shared secret run through kdf
  9319. ctx holds non default algos and inputs
  9320. return 0 on success */
  9321. int wc_ecc_decrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  9322. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx)
  9323. {
  9324. int ret = 0;
  9325. word32 blockSz;
  9326. word32 digestSz;
  9327. ecEncCtx localCtx;
  9328. #ifdef WOLFSSL_SMALL_STACK
  9329. byte* sharedSecret;
  9330. byte* keys;
  9331. #else
  9332. byte sharedSecret[ECC_MAXSIZE]; /* 521 max size */
  9333. byte keys[ECC_BUFSIZE]; /* max size */
  9334. #endif
  9335. word32 sharedSz = ECC_MAXSIZE;
  9336. int keysLen;
  9337. int encKeySz;
  9338. int ivSz;
  9339. int offset = 0; /* in case using msg exchange */
  9340. byte* encKey;
  9341. byte* encIv;
  9342. byte* macKey;
  9343. if (privKey == NULL || pubKey == NULL || msg == NULL || out == NULL ||
  9344. outSz == NULL)
  9345. return BAD_FUNC_ARG;
  9346. if (ctx == NULL) { /* use defaults */
  9347. ecc_ctx_init(&localCtx, 0);
  9348. ctx = &localCtx;
  9349. }
  9350. ret = ecc_get_key_sizes(ctx, &encKeySz, &ivSz, &keysLen, &digestSz,
  9351. &blockSz);
  9352. if (ret != 0)
  9353. return ret;
  9354. if (ctx->protocol == REQ_RESP_CLIENT) {
  9355. offset = keysLen;
  9356. keysLen *= 2;
  9357. if (ctx->cliSt != ecCLI_SENT_REQ)
  9358. return BAD_STATE_E;
  9359. ctx->cliSt = ecSRV_BAD_STATE; /* we're done no more ops allowed */
  9360. }
  9361. else if (ctx->protocol == REQ_RESP_SERVER) {
  9362. if (ctx->srvSt != ecSRV_SALT_SET)
  9363. return BAD_STATE_E;
  9364. ctx->srvSt = ecSRV_RECV_REQ; /* only do this once */
  9365. }
  9366. if (keysLen > ECC_BUFSIZE) /* keys size */
  9367. return BUFFER_E;
  9368. if ( ((msgSz-digestSz) % blockSz) != 0)
  9369. return BAD_PADDING_E;
  9370. if (*outSz < (msgSz - digestSz))
  9371. return BUFFER_E;
  9372. #ifdef WOLFSSL_SMALL_STACK
  9373. sharedSecret = (byte*)XMALLOC(ECC_MAXSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  9374. if (sharedSecret == NULL)
  9375. return MEMORY_E;
  9376. keys = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  9377. if (keys == NULL) {
  9378. XFREE(sharedSecret, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  9379. return MEMORY_E;
  9380. }
  9381. #endif
  9382. do {
  9383. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  9384. ret = wc_AsyncWait(ret, &privKey->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  9385. if (ret != 0)
  9386. break;
  9387. #endif
  9388. ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret, &sharedSz);
  9389. } while (ret == WC_PENDING_E);
  9390. if (ret == 0) {
  9391. switch (ctx->kdfAlgo) {
  9392. case ecHKDF_SHA256 :
  9393. ret = wc_HKDF(WC_SHA256, sharedSecret, sharedSz, ctx->kdfSalt,
  9394. ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
  9395. keys, keysLen);
  9396. break;
  9397. default:
  9398. ret = BAD_FUNC_ARG;
  9399. break;
  9400. }
  9401. }
  9402. if (ret == 0) {
  9403. encKey = keys + offset;
  9404. encIv = encKey + encKeySz;
  9405. macKey = encKey + encKeySz + ivSz;
  9406. switch (ctx->macAlgo) {
  9407. case ecHMAC_SHA256:
  9408. {
  9409. byte verify[WC_SHA256_DIGEST_SIZE];
  9410. Hmac hmac;
  9411. ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID);
  9412. if (ret == 0) {
  9413. ret = wc_HmacSetKey(&hmac, WC_SHA256, macKey, WC_SHA256_DIGEST_SIZE);
  9414. if (ret == 0)
  9415. ret = wc_HmacUpdate(&hmac, msg, msgSz-digestSz);
  9416. if (ret == 0)
  9417. ret = wc_HmacUpdate(&hmac, ctx->macSalt, ctx->macSaltSz);
  9418. if (ret == 0)
  9419. ret = wc_HmacFinal(&hmac, verify);
  9420. if (ret == 0) {
  9421. if (XMEMCMP(verify, msg + msgSz - digestSz, digestSz) != 0)
  9422. ret = -1;
  9423. }
  9424. wc_HmacFree(&hmac);
  9425. }
  9426. break;
  9427. }
  9428. default:
  9429. ret = BAD_FUNC_ARG;
  9430. break;
  9431. }
  9432. }
  9433. if (ret == 0) {
  9434. switch (ctx->encAlgo) {
  9435. #ifdef HAVE_AES_CBC
  9436. case ecAES_128_CBC:
  9437. {
  9438. Aes aes;
  9439. ret = wc_AesSetKey(&aes, encKey, KEY_SIZE_128, encIv,
  9440. AES_DECRYPTION);
  9441. if (ret != 0)
  9442. break;
  9443. ret = wc_AesCbcDecrypt(&aes, out, msg, msgSz-digestSz);
  9444. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_AES)
  9445. ret = wc_AsyncWait(ret, &aes.asyncDev, WC_ASYNC_FLAG_NONE);
  9446. #endif
  9447. }
  9448. break;
  9449. #endif
  9450. default:
  9451. ret = BAD_FUNC_ARG;
  9452. break;
  9453. }
  9454. }
  9455. if (ret == 0)
  9456. *outSz = msgSz - digestSz;
  9457. #ifdef WOLFSSL_SMALL_STACK
  9458. XFREE(sharedSecret, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  9459. XFREE(keys, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  9460. #endif
  9461. return ret;
  9462. }
  9463. #endif /* HAVE_ECC_ENCRYPT */
  9464. #ifdef HAVE_COMP_KEY
  9465. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  9466. !defined(WOLFSSL_CRYPTOCELL)
  9467. #ifndef WOLFSSL_SP_MATH
  9468. int do_mp_jacobi(mp_int* a, mp_int* n, int* c);
  9469. int do_mp_jacobi(mp_int* a, mp_int* n, int* c)
  9470. {
  9471. int k, s, res;
  9472. int r = 0; /* initialize to help static analysis out */
  9473. mp_digit residue;
  9474. /* if a < 0 return MP_VAL */
  9475. if (mp_isneg(a) == MP_YES) {
  9476. return MP_VAL;
  9477. }
  9478. /* if n <= 0 return MP_VAL */
  9479. if (mp_cmp_d(n, 0) != MP_GT) {
  9480. return MP_VAL;
  9481. }
  9482. /* step 1. handle case of a == 0 */
  9483. if (mp_iszero (a) == MP_YES) {
  9484. /* special case of a == 0 and n == 1 */
  9485. if (mp_cmp_d (n, 1) == MP_EQ) {
  9486. *c = 1;
  9487. } else {
  9488. *c = 0;
  9489. }
  9490. return MP_OKAY;
  9491. }
  9492. /* step 2. if a == 1, return 1 */
  9493. if (mp_cmp_d (a, 1) == MP_EQ) {
  9494. *c = 1;
  9495. return MP_OKAY;
  9496. }
  9497. /* default */
  9498. s = 0;
  9499. /* divide out larger power of two */
  9500. k = mp_cnt_lsb(a);
  9501. res = mp_div_2d(a, k, a, NULL);
  9502. if (res == MP_OKAY) {
  9503. /* step 4. if e is even set s=1 */
  9504. if ((k & 1) == 0) {
  9505. s = 1;
  9506. } else {
  9507. /* else set s=1 if p = 1/7 (mod 8) or s=-1 if p = 3/5 (mod 8) */
  9508. residue = n->dp[0] & 7;
  9509. if (residue == 1 || residue == 7) {
  9510. s = 1;
  9511. } else if (residue == 3 || residue == 5) {
  9512. s = -1;
  9513. }
  9514. }
  9515. /* step 5. if p == 3 (mod 4) *and* a == 3 (mod 4) then s = -s */
  9516. if ( ((n->dp[0] & 3) == 3) && ((a->dp[0] & 3) == 3)) {
  9517. s = -s;
  9518. }
  9519. }
  9520. if (res == MP_OKAY) {
  9521. /* if a == 1 we're done */
  9522. if (mp_cmp_d(a, 1) == MP_EQ) {
  9523. *c = s;
  9524. } else {
  9525. /* n1 = n mod a */
  9526. res = mp_mod (n, a, n);
  9527. if (res == MP_OKAY)
  9528. res = do_mp_jacobi(n, a, &r);
  9529. if (res == MP_OKAY)
  9530. *c = s * r;
  9531. }
  9532. }
  9533. return res;
  9534. }
  9535. /* computes the jacobi c = (a | n) (or Legendre if n is prime)
  9536. * HAC pp. 73 Algorithm 2.149
  9537. * HAC is wrong here, as the special case of (0 | 1) is not
  9538. * handled correctly.
  9539. */
  9540. int mp_jacobi(mp_int* a, mp_int* n, int* c)
  9541. {
  9542. mp_int a1, n1;
  9543. int res;
  9544. /* step 3. write a = a1 * 2**k */
  9545. if ((res = mp_init_multi(&a1, &n1, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  9546. return res;
  9547. }
  9548. if ((res = mp_copy(a, &a1)) != MP_OKAY) {
  9549. goto done;
  9550. }
  9551. if ((res = mp_copy(n, &n1)) != MP_OKAY) {
  9552. goto done;
  9553. }
  9554. res = do_mp_jacobi(&a1, &n1, c);
  9555. done:
  9556. /* cleanup */
  9557. mp_clear(&n1);
  9558. mp_clear(&a1);
  9559. return res;
  9560. }
  9561. /* Solves the modular equation x^2 = n (mod p)
  9562. * where prime number is greater than 2 (odd prime).
  9563. * The result is returned in the third argument x
  9564. * the function returns MP_OKAY on success, MP_VAL or another error on failure
  9565. */
  9566. int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret)
  9567. {
  9568. #ifdef SQRTMOD_USE_MOD_EXP
  9569. int res;
  9570. mp_int e;
  9571. res = mp_init(&e);
  9572. if (res == MP_OKAY)
  9573. res = mp_add_d(prime, 1, &e);
  9574. if (res == MP_OKAY)
  9575. res = mp_div_2d(&e, 2, &e, NULL);
  9576. if (res == MP_OKAY)
  9577. res = mp_exptmod(n, &e, prime, ret);
  9578. mp_clear(&e);
  9579. return res;
  9580. #else
  9581. int res, legendre, done = 0;
  9582. mp_int t1, C, Q, S, Z, M, T, R, two;
  9583. mp_digit i;
  9584. /* first handle the simple cases n = 0 or n = 1 */
  9585. if (mp_cmp_d(n, 0) == MP_EQ) {
  9586. mp_zero(ret);
  9587. return MP_OKAY;
  9588. }
  9589. if (mp_cmp_d(n, 1) == MP_EQ) {
  9590. return mp_set(ret, 1);
  9591. }
  9592. /* prime must be odd */
  9593. if (mp_cmp_d(prime, 2) == MP_EQ) {
  9594. return MP_VAL;
  9595. }
  9596. /* is quadratic non-residue mod prime */
  9597. if ((res = mp_jacobi(n, prime, &legendre)) != MP_OKAY) {
  9598. return res;
  9599. }
  9600. if (legendre == -1) {
  9601. return MP_VAL;
  9602. }
  9603. if ((res = mp_init_multi(&t1, &C, &Q, &S, &Z, &M)) != MP_OKAY)
  9604. return res;
  9605. if ((res = mp_init_multi(&T, &R, &two, NULL, NULL, NULL))
  9606. != MP_OKAY) {
  9607. mp_clear(&t1); mp_clear(&C); mp_clear(&Q); mp_clear(&S); mp_clear(&Z);
  9608. mp_clear(&M);
  9609. return res;
  9610. }
  9611. /* SPECIAL CASE: if prime mod 4 == 3
  9612. * compute directly: res = n^(prime+1)/4 mod prime
  9613. * Handbook of Applied Cryptography algorithm 3.36
  9614. */
  9615. res = mp_mod_d(prime, 4, &i);
  9616. if (res == MP_OKAY && i == 3) {
  9617. res = mp_add_d(prime, 1, &t1);
  9618. if (res == MP_OKAY)
  9619. res = mp_div_2(&t1, &t1);
  9620. if (res == MP_OKAY)
  9621. res = mp_div_2(&t1, &t1);
  9622. if (res == MP_OKAY)
  9623. res = mp_exptmod(n, &t1, prime, ret);
  9624. done = 1;
  9625. }
  9626. /* NOW: TonelliShanks algorithm */
  9627. if (res == MP_OKAY && done == 0) {
  9628. /* factor out powers of 2 from prime-1, defining Q and S
  9629. * as: prime-1 = Q*2^S */
  9630. /* Q = prime - 1 */
  9631. res = mp_copy(prime, &Q);
  9632. if (res == MP_OKAY)
  9633. res = mp_sub_d(&Q, 1, &Q);
  9634. /* S = 0 */
  9635. if (res == MP_OKAY)
  9636. mp_zero(&S);
  9637. while (res == MP_OKAY && mp_iseven(&Q) == MP_YES) {
  9638. /* Q = Q / 2 */
  9639. res = mp_div_2(&Q, &Q);
  9640. /* S = S + 1 */
  9641. if (res == MP_OKAY)
  9642. res = mp_add_d(&S, 1, &S);
  9643. }
  9644. /* find a Z such that the Legendre symbol (Z|prime) == -1 */
  9645. /* Z = 2 */
  9646. if (res == MP_OKAY)
  9647. res = mp_set_int(&Z, 2);
  9648. while (res == MP_OKAY) {
  9649. res = mp_jacobi(&Z, prime, &legendre);
  9650. if (res == MP_OKAY && legendre == -1)
  9651. break;
  9652. /* Z = Z + 1 */
  9653. if (res == MP_OKAY)
  9654. res = mp_add_d(&Z, 1, &Z);
  9655. }
  9656. /* C = Z ^ Q mod prime */
  9657. if (res == MP_OKAY)
  9658. res = mp_exptmod(&Z, &Q, prime, &C);
  9659. /* t1 = (Q + 1) / 2 */
  9660. if (res == MP_OKAY)
  9661. res = mp_add_d(&Q, 1, &t1);
  9662. if (res == MP_OKAY)
  9663. res = mp_div_2(&t1, &t1);
  9664. /* R = n ^ ((Q + 1) / 2) mod prime */
  9665. if (res == MP_OKAY)
  9666. res = mp_exptmod(n, &t1, prime, &R);
  9667. /* T = n ^ Q mod prime */
  9668. if (res == MP_OKAY)
  9669. res = mp_exptmod(n, &Q, prime, &T);
  9670. /* M = S */
  9671. if (res == MP_OKAY)
  9672. res = mp_copy(&S, &M);
  9673. if (res == MP_OKAY)
  9674. res = mp_set_int(&two, 2);
  9675. while (res == MP_OKAY && done == 0) {
  9676. res = mp_copy(&T, &t1);
  9677. /* reduce to 1 and count */
  9678. i = 0;
  9679. while (res == MP_OKAY) {
  9680. if (mp_cmp_d(&t1, 1) == MP_EQ)
  9681. break;
  9682. res = mp_exptmod(&t1, &two, prime, &t1);
  9683. if (res == MP_OKAY)
  9684. i++;
  9685. }
  9686. if (res == MP_OKAY && i == 0) {
  9687. res = mp_copy(&R, ret);
  9688. done = 1;
  9689. }
  9690. if (done == 0) {
  9691. /* t1 = 2 ^ (M - i - 1) */
  9692. if (res == MP_OKAY)
  9693. res = mp_sub_d(&M, i, &t1);
  9694. if (res == MP_OKAY)
  9695. res = mp_sub_d(&t1, 1, &t1);
  9696. if (res == MP_OKAY)
  9697. res = mp_exptmod(&two, &t1, prime, &t1);
  9698. /* t1 = C ^ (2 ^ (M - i - 1)) mod prime */
  9699. if (res == MP_OKAY)
  9700. res = mp_exptmod(&C, &t1, prime, &t1);
  9701. /* C = (t1 * t1) mod prime */
  9702. if (res == MP_OKAY)
  9703. res = mp_sqrmod(&t1, prime, &C);
  9704. /* R = (R * t1) mod prime */
  9705. if (res == MP_OKAY)
  9706. res = mp_mulmod(&R, &t1, prime, &R);
  9707. /* T = (T * C) mod prime */
  9708. if (res == MP_OKAY)
  9709. res = mp_mulmod(&T, &C, prime, &T);
  9710. /* M = i */
  9711. if (res == MP_OKAY)
  9712. res = mp_set(&M, i);
  9713. }
  9714. }
  9715. }
  9716. /* done */
  9717. mp_clear(&t1);
  9718. mp_clear(&C);
  9719. mp_clear(&Q);
  9720. mp_clear(&S);
  9721. mp_clear(&Z);
  9722. mp_clear(&M);
  9723. mp_clear(&T);
  9724. mp_clear(&R);
  9725. mp_clear(&two);
  9726. return res;
  9727. #endif
  9728. }
  9729. #endif
  9730. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL */
  9731. /* export public ECC key in ANSI X9.63 format compressed */
  9732. static int wc_ecc_export_x963_compressed(ecc_key* key, byte* out, word32* outLen)
  9733. {
  9734. word32 numlen;
  9735. int ret = MP_OKAY;
  9736. if (key == NULL || out == NULL || outLen == NULL)
  9737. return BAD_FUNC_ARG;
  9738. if (wc_ecc_is_valid_idx(key->idx) == 0) {
  9739. return ECC_BAD_ARG_E;
  9740. }
  9741. numlen = key->dp->size;
  9742. if (*outLen < (1 + numlen)) {
  9743. *outLen = 1 + numlen;
  9744. return BUFFER_E;
  9745. }
  9746. /* store first byte */
  9747. out[0] = mp_isodd(key->pubkey.y) == MP_YES ? ECC_POINT_COMP_ODD : ECC_POINT_COMP_EVEN;
  9748. /* pad and store x */
  9749. XMEMSET(out+1, 0, numlen);
  9750. ret = mp_to_unsigned_bin(key->pubkey.x,
  9751. out+1 + (numlen - mp_unsigned_bin_size(key->pubkey.x)));
  9752. *outLen = 1 + numlen;
  9753. return ret;
  9754. }
  9755. #endif /* HAVE_COMP_KEY */
  9756. int wc_ecc_get_oid(word32 oidSum, const byte** oid, word32* oidSz)
  9757. {
  9758. int x;
  9759. if (oidSum == 0) {
  9760. return BAD_FUNC_ARG;
  9761. }
  9762. /* find matching OID sum (based on encoded value) */
  9763. for (x = 0; ecc_sets[x].size != 0; x++) {
  9764. if (ecc_sets[x].oidSum == oidSum) {
  9765. int ret;
  9766. #ifdef HAVE_OID_ENCODING
  9767. ret = 0;
  9768. /* check cache */
  9769. oid_cache_t* o = &ecc_oid_cache[x];
  9770. if (o->oidSz == 0) {
  9771. o->oidSz = sizeof(o->oid);
  9772. ret = EncodeObjectId(ecc_sets[x].oid, ecc_sets[x].oidSz,
  9773. o->oid, &o->oidSz);
  9774. }
  9775. if (oidSz) {
  9776. *oidSz = o->oidSz;
  9777. }
  9778. if (oid) {
  9779. *oid = o->oid;
  9780. }
  9781. /* on success return curve id */
  9782. if (ret == 0) {
  9783. ret = ecc_sets[x].id;
  9784. }
  9785. #else
  9786. if (oidSz) {
  9787. *oidSz = ecc_sets[x].oidSz;
  9788. }
  9789. if (oid) {
  9790. *oid = ecc_sets[x].oid;
  9791. }
  9792. ret = ecc_sets[x].id;
  9793. #endif
  9794. return ret;
  9795. }
  9796. }
  9797. return NOT_COMPILED_IN;
  9798. }
  9799. #ifdef WOLFSSL_CUSTOM_CURVES
  9800. int wc_ecc_set_custom_curve(ecc_key* key, const ecc_set_type* dp)
  9801. {
  9802. if (key == NULL || dp == NULL) {
  9803. return BAD_FUNC_ARG;
  9804. }
  9805. key->idx = ECC_CUSTOM_IDX;
  9806. key->dp = dp;
  9807. return 0;
  9808. }
  9809. #endif /* WOLFSSL_CUSTOM_CURVES */
  9810. #ifdef HAVE_X963_KDF
  9811. static WC_INLINE void IncrementX963KdfCounter(byte* inOutCtr)
  9812. {
  9813. int i;
  9814. /* in network byte order so start at end and work back */
  9815. for (i = 3; i >= 0; i--) {
  9816. if (++inOutCtr[i]) /* we're done unless we overflow */
  9817. return;
  9818. }
  9819. }
  9820. /* ASN X9.63 Key Derivation Function (SEC1) */
  9821. int wc_X963_KDF(enum wc_HashType type, const byte* secret, word32 secretSz,
  9822. const byte* sinfo, word32 sinfoSz, byte* out, word32 outSz)
  9823. {
  9824. int ret, i;
  9825. int digestSz, copySz;
  9826. int remaining = outSz;
  9827. byte* outIdx;
  9828. byte counter[4];
  9829. byte tmp[WC_MAX_DIGEST_SIZE];
  9830. #ifdef WOLFSSL_SMALL_STACK
  9831. wc_HashAlg* hash;
  9832. #else
  9833. wc_HashAlg hash[1];
  9834. #endif
  9835. if (secret == NULL || secretSz == 0 || out == NULL)
  9836. return BAD_FUNC_ARG;
  9837. /* X9.63 allowed algos only */
  9838. if (type != WC_HASH_TYPE_SHA && type != WC_HASH_TYPE_SHA224 &&
  9839. type != WC_HASH_TYPE_SHA256 && type != WC_HASH_TYPE_SHA384 &&
  9840. type != WC_HASH_TYPE_SHA512)
  9841. return BAD_FUNC_ARG;
  9842. digestSz = wc_HashGetDigestSize(type);
  9843. if (digestSz < 0)
  9844. return digestSz;
  9845. #ifdef WOLFSSL_SMALL_STACK
  9846. hash = (wc_HashAlg*)XMALLOC(sizeof(wc_HashAlg), NULL,
  9847. DYNAMIC_TYPE_HASHES);
  9848. if (hash == NULL)
  9849. return MEMORY_E;
  9850. #endif
  9851. ret = wc_HashInit(hash, type);
  9852. if (ret != 0) {
  9853. #ifdef WOLFSSL_SMALL_STACK
  9854. XFREE(hash, NULL, DYNAMIC_TYPE_HASHES);
  9855. #endif
  9856. return ret;
  9857. }
  9858. outIdx = out;
  9859. XMEMSET(counter, 0, sizeof(counter));
  9860. for (i = 1; remaining > 0; i++) {
  9861. IncrementX963KdfCounter(counter);
  9862. ret = wc_HashUpdate(hash, type, secret, secretSz);
  9863. if (ret != 0) {
  9864. break;
  9865. }
  9866. ret = wc_HashUpdate(hash, type, counter, sizeof(counter));
  9867. if (ret != 0) {
  9868. break;
  9869. }
  9870. if (sinfo) {
  9871. ret = wc_HashUpdate(hash, type, sinfo, sinfoSz);
  9872. if (ret != 0) {
  9873. break;
  9874. }
  9875. }
  9876. ret = wc_HashFinal(hash, type, tmp);
  9877. if (ret != 0) {
  9878. break;
  9879. }
  9880. copySz = min(remaining, digestSz);
  9881. XMEMCPY(outIdx, tmp, copySz);
  9882. remaining -= copySz;
  9883. outIdx += copySz;
  9884. }
  9885. wc_HashFree(hash, type);
  9886. #ifdef WOLFSSL_SMALL_STACK
  9887. XFREE(hash, NULL, DYNAMIC_TYPE_HASHES);
  9888. #endif
  9889. return ret;
  9890. }
  9891. #endif /* HAVE_X963_KDF */
  9892. #ifdef WC_ECC_NONBLOCK
  9893. /* Enable ECC support for non-blocking operations */
  9894. int wc_ecc_set_nonblock(ecc_key *key, ecc_nb_ctx_t* ctx)
  9895. {
  9896. if (key) {
  9897. if (ctx) {
  9898. XMEMSET(ctx, 0, sizeof(ecc_nb_ctx_t));
  9899. }
  9900. key->nb_ctx = ctx;
  9901. }
  9902. return 0;
  9903. }
  9904. #endif /* WC_ECC_NONBLOCK */
  9905. #endif /* HAVE_ECC */