ecc.c 509 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912
  1. /* ecc.c
  2. *
  3. * Copyright (C) 2006-2023 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. /* in case user set HAVE_ECC there */
  25. #include <wolfssl/wolfcrypt/settings.h>
  26. #ifdef WOLFSSL_ECC_NO_SMALL_STACK
  27. #undef WOLFSSL_SMALL_STACK
  28. #undef WOLFSSL_SMALL_STACK_CACHE
  29. #endif
  30. /*
  31. Possible ECC enable options:
  32. * HAVE_ECC: Overall control of ECC default: on
  33. * HAVE_ECC_ENCRYPT: ECC encrypt/decrypt w/AES and HKDF default: off
  34. * HAVE_ECC_SIGN: ECC sign default: on
  35. * HAVE_ECC_VERIFY: ECC verify default: on
  36. * HAVE_ECC_DHE: ECC build shared secret default: on
  37. * HAVE_ECC_CDH: ECC cofactor DH shared secret default: off
  38. * HAVE_ECC_KEY_IMPORT: ECC Key import default: on
  39. * HAVE_ECC_KEY_EXPORT: ECC Key export default: on
  40. * ECC_SHAMIR: Enables Shamir calc method default: on
  41. * HAVE_COMP_KEY: Enables compressed key default: off
  42. * WOLFSSL_VALIDATE_ECC_IMPORT: Validate ECC key on import default: off
  43. * WOLFSSL_VALIDATE_ECC_KEYGEN: Validate ECC key gen default: off
  44. * WOLFSSL_CUSTOM_CURVES: Allow non-standard curves. default: off
  45. * Includes the curve "a" variable in calculation
  46. * ECC_DUMP_OID: Enables dump of OID encoding and sum default: off
  47. * ECC_CACHE_CURVE: Enables cache of curve info to improve performance
  48. * default: off
  49. * FP_ECC: ECC Fixed Point Cache default: off
  50. * FP cache is not supported for SECP160R1, SECP160R2,
  51. * SECP160K1 and SECP224K1. These do not work with scalars
  52. * that are the length of the order when the order is
  53. * longer than the prime. Use wc_ecc_fp_free to free cache.
  54. * USE_ECC_B_PARAM: Enable ECC curve B param default: off
  55. * (on for HAVE_COMP_KEY)
  56. * WOLFSSL_ECC_CURVE_STATIC: default off (on for windows)
  57. * For the ECC curve parameters `ecc_set_type` use fixed
  58. * array for hex string
  59. * WC_ECC_NONBLOCK: Enable non-blocking support for sign/verify.
  60. * Requires SP with WOLFSSL_SP_NONBLOCK
  61. * WC_ECC_NONBLOCK_ONLY Enable the non-blocking function only, no fall-back to
  62. * normal blocking API's
  63. * WOLFSSL_ECDSA_SET_K: Enables the setting of the 'k' value to use during ECDSA
  64. * signing. If the value is invalid, a new random 'k' is
  65. * generated in the loop. (For testing)
  66. * default: off
  67. * WOLFSSL_ECDSA_SET_K_ONE_LOOP:
  68. * Enables the setting of the 'k' value to use during ECDSA
  69. * signing. If the value is invalid then an error is
  70. * returned rather than generating a new 'k'. (For testing)
  71. * default: off
  72. * WOLFSSL_ECDSA_DETERMINISTIC_K: Enables RFC6979 implementation of
  73. * deterministic ECC signatures. The following function
  74. * can be used to set the deterministic signing flag in the
  75. * ecc key structure.
  76. * int wc_ecc_set_deterministic(ecc_key* key, byte flag)
  77. * default: off
  78. *
  79. * WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT: RFC6979 lists a variant that uses the
  80. * hash directly instead of doing bits2octets(H(m)), when
  81. * the variant macro is used the bits2octets operation on
  82. * the hash is removed.
  83. * default: off
  84. *
  85. * WC_PROTECT_ENCRYPTED_MEM:
  86. * Enables implementations that protect data that is in
  87. * encrypted memory.
  88. * default: off
  89. */
  90. /*
  91. ECC Curve Types:
  92. * NO_ECC_SECP Disables SECP curves default: off (not defined)
  93. * HAVE_ECC_SECPR2 Enables SECP R2 curves default: off
  94. * HAVE_ECC_SECPR3 Enables SECP R3 curves default: off
  95. * HAVE_ECC_BRAINPOOL Enables Brainpool curves default: off
  96. * HAVE_ECC_KOBLITZ Enables Koblitz curves default: off
  97. */
  98. /*
  99. ECC Curve Sizes:
  100. * ECC_USER_CURVES: Allows custom combination of key sizes below
  101. * HAVE_ALL_CURVES: Enable all key sizes (on unless ECC_USER_CURVES is defined)
  102. * ECC_MIN_KEY_SZ: Minimum supported ECC key size
  103. * HAVE_ECC112: 112 bit key
  104. * HAVE_ECC128: 128 bit key
  105. * HAVE_ECC160: 160 bit key
  106. * HAVE_ECC192: 192 bit key
  107. * HAVE_ECC224: 224 bit key
  108. * HAVE_ECC239: 239 bit key
  109. * NO_ECC256: Disables 256 bit key (on by default)
  110. * HAVE_ECC320: 320 bit key
  111. * HAVE_ECC384: 384 bit key
  112. * HAVE_ECC512: 512 bit key
  113. * HAVE_ECC521: 521 bit key
  114. */
  115. #ifdef HAVE_ECC
  116. /* Make sure custom curves is enabled for Brainpool or Koblitz curve types */
  117. #if (defined(HAVE_ECC_BRAINPOOL) || defined(HAVE_ECC_KOBLITZ)) &&\
  118. !defined(WOLFSSL_CUSTOM_CURVES)
  119. #error Brainpool and Koblitz curves requires WOLFSSL_CUSTOM_CURVES
  120. #endif
  121. #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)
  122. /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */
  123. #define FIPS_NO_WRAPPERS
  124. #ifdef USE_WINDOWS_API
  125. #pragma code_seg(".fipsA$f")
  126. #pragma const_seg(".fipsB$f")
  127. #endif
  128. #endif
  129. /* public ASN interface */
  130. #include <wolfssl/wolfcrypt/asn_public.h>
  131. #include <wolfssl/wolfcrypt/ecc.h>
  132. #include <wolfssl/wolfcrypt/asn.h>
  133. #include <wolfssl/wolfcrypt/error-crypt.h>
  134. #include <wolfssl/wolfcrypt/logging.h>
  135. #include <wolfssl/wolfcrypt/types.h>
  136. #ifdef WOLFSSL_HAVE_SP_ECC
  137. #include <wolfssl/wolfcrypt/sp.h>
  138. #endif
  139. #ifdef HAVE_ECC_ENCRYPT
  140. #include <wolfssl/wolfcrypt/kdf.h>
  141. #include <wolfssl/wolfcrypt/aes.h>
  142. #endif
  143. #ifdef HAVE_X963_KDF
  144. #include <wolfssl/wolfcrypt/hash.h>
  145. #endif
  146. #ifdef WOLF_CRYPTO_CB
  147. #include <wolfssl/wolfcrypt/cryptocb.h>
  148. #endif
  149. #ifdef NO_INLINE
  150. #include <wolfssl/wolfcrypt/misc.h>
  151. #else
  152. #define WOLFSSL_MISC_INCLUDED
  153. #include <wolfcrypt/src/misc.c>
  154. #endif
  155. #if defined(FREESCALE_LTC_ECC)
  156. #include <wolfssl/wolfcrypt/port/nxp/ksdk_port.h>
  157. #endif
  158. #if defined(WOLFSSL_STM32_PKA)
  159. #include <wolfssl/wolfcrypt/port/st/stm32.h>
  160. #endif
  161. #if defined(WOLFSSL_PSOC6_CRYPTO)
  162. #include <wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h>
  163. #endif
  164. #if defined(WOLFSSL_CAAM)
  165. #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
  166. #endif
  167. #if defined(WOLFSSL_KCAPI_ECC)
  168. #include <wolfssl/wolfcrypt/port/kcapi/kcapi_ecc.h>
  169. #endif
  170. #ifdef WOLFSSL_SE050
  171. #include <wolfssl/wolfcrypt/port/nxp/se050_port.h>
  172. #endif
  173. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  174. #include <xsecure_ellipticclient.h>
  175. #endif
  176. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  177. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  178. #include <wolfssl/wolfcrypt/hmac.h>
  179. #endif
  180. #if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
  181. #define GEN_MEM_ERR MP_MEM
  182. #elif defined(USE_FAST_MATH)
  183. #define GEN_MEM_ERR FP_MEM
  184. #else
  185. #define GEN_MEM_ERR MP_MEM
  186. #endif
  187. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  188. !defined(WOLFSSL_SILABS_SE_ACCEL) && !defined(WOLFSSL_KCAPI_ECC) && \
  189. !defined(WOLFSSL_CRYPTOCELL) && !defined(NO_ECC_MAKE_PUB) && \
  190. !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  191. #undef HAVE_ECC_MAKE_PUB
  192. #define HAVE_ECC_MAKE_PUB
  193. #endif
  194. #if defined(WOLFSSL_SP_MATH_ALL) && SP_INT_BITS < MAX_ECC_BITS_NEEDED
  195. #define MAX_ECC_BITS_USE SP_INT_BITS
  196. #else
  197. #define MAX_ECC_BITS_USE MAX_ECC_BITS_NEEDED
  198. #endif
  199. #if !defined(WOLFSSL_CUSTOM_CURVES) && (ECC_MIN_KEY_SZ > 160) && \
  200. (!defined(HAVE_ECC_KOBLITZ) || (ECC_MIN_KEY_SZ > 224))
  201. #define ECC_KEY_MAX_BITS(key) \
  202. ((((key) == NULL) || ((key)->dp == NULL)) ? MAX_ECC_BITS_USE : \
  203. ((unsigned)((key)->dp->size * 8)))
  204. #else
  205. /* Add one bit for cases when order is a bit greater than prime. */
  206. #define ECC_KEY_MAX_BITS(key) \
  207. ((((key) == NULL) || ((key)->dp == NULL)) ? MAX_ECC_BITS_USE : \
  208. ((unsigned)((key)->dp->size * 8 + 1)))
  209. #endif
  210. /* forward declarations */
  211. static int wc_ecc_new_point_ex(ecc_point** point, void* heap);
  212. static void wc_ecc_del_point_ex(ecc_point* p, void* heap);
  213. #if defined(HAVE_ECC_SIGN) && (defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  214. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT))
  215. static int deterministic_sign_helper(const byte* in, word32 inlen, ecc_key* key);
  216. #endif
  217. /* internal ECC states */
  218. enum {
  219. ECC_STATE_NONE = 0,
  220. ECC_STATE_SHARED_SEC_GEN,
  221. ECC_STATE_SHARED_SEC_RES,
  222. ECC_STATE_SIGN_DO,
  223. ECC_STATE_SIGN_ENCODE,
  224. ECC_STATE_VERIFY_DECODE,
  225. ECC_STATE_VERIFY_DO,
  226. ECC_STATE_VERIFY_RES
  227. };
  228. /* map
  229. ptmul -> mulmod
  230. */
  231. /* 256-bit curve on by default whether user curves or not */
  232. #if (defined(HAVE_ECC112) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 112
  233. #define ECC112
  234. #endif
  235. #if (defined(HAVE_ECC128) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 128
  236. #define ECC128
  237. #endif
  238. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  239. #define ECC160
  240. #endif
  241. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  242. #define ECC192
  243. #endif
  244. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  245. #define ECC224
  246. #endif
  247. #if (defined(HAVE_ECC239) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 239
  248. #define ECC239
  249. #endif
  250. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  251. #define ECC256
  252. #endif
  253. #if (defined(HAVE_ECC320) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 320
  254. #define ECC320
  255. #endif
  256. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  257. #define ECC384
  258. #endif
  259. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  260. #define ECC512
  261. #endif
  262. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  263. #define ECC521
  264. #endif
  265. /* The encoded OID's for ECC curves */
  266. #ifdef ECC112
  267. #ifndef NO_ECC_SECP
  268. #ifdef HAVE_OID_ENCODING
  269. #define CODED_SECP112R1 {1,3,132,0,6}
  270. #define CODED_SECP112R1_SZ 5
  271. #else
  272. #define CODED_SECP112R1 {0x2B,0x81,0x04,0x00,0x06}
  273. #define CODED_SECP112R1_SZ 5
  274. #endif
  275. #ifndef WOLFSSL_ECC_CURVE_STATIC
  276. static const ecc_oid_t ecc_oid_secp112r1[] = CODED_SECP112R1;
  277. #else
  278. #define ecc_oid_secp112r1 CODED_SECP112R1
  279. #endif
  280. #define ecc_oid_secp112r1_sz CODED_SECP112R1_SZ
  281. #endif /* !NO_ECC_SECP */
  282. #ifdef HAVE_ECC_SECPR2
  283. #ifdef HAVE_OID_ENCODING
  284. #define CODED_SECP112R2 {1,3,132,0,7}
  285. #define CODED_SECP112R2_SZ 5
  286. #else
  287. #define CODED_SECP112R2 {0x2B,0x81,0x04,0x00,0x07}
  288. #define CODED_SECP112R2_SZ 5
  289. #endif
  290. #ifndef WOLFSSL_ECC_CURVE_STATIC
  291. static const ecc_oid_t ecc_oid_secp112r2[] = CODED_SECP112R2;
  292. #else
  293. #define ecc_oid_secp112r2 CODED_SECP112R2
  294. #endif
  295. #define ecc_oid_secp112r2_sz CODED_SECP112R2_SZ
  296. #endif /* HAVE_ECC_SECPR2 */
  297. #endif /* ECC112 */
  298. #ifdef ECC128
  299. #ifndef NO_ECC_SECP
  300. #ifdef HAVE_OID_ENCODING
  301. #define CODED_SECP128R1 {1,3,132,0,28}
  302. #define CODED_SECP128R1_SZ 5
  303. #else
  304. #define CODED_SECP128R1 {0x2B,0x81,0x04,0x00,0x1C}
  305. #define CODED_SECP128R1_SZ 5
  306. #endif
  307. #ifndef WOLFSSL_ECC_CURVE_STATIC
  308. static const ecc_oid_t ecc_oid_secp128r1[] = CODED_SECP128R1;
  309. #else
  310. #define ecc_oid_secp128r1 CODED_SECP128R1
  311. #endif
  312. #define ecc_oid_secp128r1_sz CODED_SECP128R1_SZ
  313. #endif /* !NO_ECC_SECP */
  314. #ifdef HAVE_ECC_SECPR2
  315. #ifdef HAVE_OID_ENCODING
  316. #define CODED_SECP128R2 {1,3,132,0,29}
  317. #define CODED_SECP128R2_SZ 5
  318. #else
  319. #define CODED_SECP128R2 {0x2B,0x81,0x04,0x00,0x1D}
  320. #define CODED_SECP128R2_SZ 5
  321. #endif
  322. #ifndef WOLFSSL_ECC_CURVE_STATIC
  323. static const ecc_oid_t ecc_oid_secp128r2[] = CODED_SECP128R2;
  324. #else
  325. #define ecc_oid_secp128r2 CODED_SECP128R2
  326. #endif
  327. #define ecc_oid_secp128r2_sz CODED_SECP128R2_SZ
  328. #endif /* HAVE_ECC_SECPR2 */
  329. #endif /* ECC128 */
  330. #ifdef ECC160
  331. #ifndef FP_ECC
  332. #ifndef NO_ECC_SECP
  333. #ifdef HAVE_OID_ENCODING
  334. #define CODED_SECP160R1 {1,3,132,0,8}
  335. #define CODED_SECP160R1_SZ 5
  336. #else
  337. #define CODED_SECP160R1 {0x2B,0x81,0x04,0x00,0x08}
  338. #define CODED_SECP160R1_SZ 5
  339. #endif
  340. #ifndef WOLFSSL_ECC_CURVE_STATIC
  341. static const ecc_oid_t ecc_oid_secp160r1[] = CODED_SECP160R1;
  342. #else
  343. #define ecc_oid_secp160r1 CODED_SECP160R1
  344. #endif
  345. #define ecc_oid_secp160r1_sz CODED_SECP160R1_SZ
  346. #endif /* !NO_ECC_SECP */
  347. #ifdef HAVE_ECC_SECPR2
  348. #ifdef HAVE_OID_ENCODING
  349. #define CODED_SECP160R2 {1,3,132,0,30}
  350. #define CODED_SECP160R2_SZ 5
  351. #else
  352. #define CODED_SECP160R2 {0x2B,0x81,0x04,0x00,0x1E}
  353. #define CODED_SECP160R2_SZ 5
  354. #endif
  355. #ifndef WOLFSSL_ECC_CURVE_STATIC
  356. static const ecc_oid_t ecc_oid_secp160r2[] = CODED_SECP160R2;
  357. #else
  358. #define ecc_oid_secp160r2 CODED_SECP160R2
  359. #endif
  360. #define ecc_oid_secp160r2_sz CODED_SECP160R2_SZ
  361. #endif /* HAVE_ECC_SECPR2 */
  362. #ifdef HAVE_ECC_KOBLITZ
  363. #ifdef HAVE_OID_ENCODING
  364. #define CODED_SECP160K1 {1,3,132,0,9}
  365. #define CODED_SECP160K1_SZ 5
  366. #else
  367. #define CODED_SECP160K1 {0x2B,0x81,0x04,0x00,0x09}
  368. #define CODED_SECP160K1_SZ 5
  369. #endif
  370. #ifndef WOLFSSL_ECC_CURVE_STATIC
  371. static const ecc_oid_t ecc_oid_secp160k1[] = CODED_SECP160K1;
  372. #else
  373. #define ecc_oid_secp160k1 CODED_SECP160K1
  374. #endif
  375. #define ecc_oid_secp160k1_sz CODED_SECP160K1_SZ
  376. #endif /* HAVE_ECC_KOBLITZ */
  377. #endif /* !FP_ECC */
  378. #ifdef HAVE_ECC_BRAINPOOL
  379. #ifdef HAVE_OID_ENCODING
  380. #define CODED_BRAINPOOLP160R1 {1,3,36,3,3,2,8,1,1,1}
  381. #define CODED_BRAINPOOLP160R1_SZ 10
  382. #else
  383. #define CODED_BRAINPOOLP160R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x01}
  384. #define CODED_BRAINPOOLP160R1_SZ 9
  385. #endif
  386. #ifndef WOLFSSL_ECC_CURVE_STATIC
  387. static const ecc_oid_t ecc_oid_brainpoolp160r1[] = CODED_BRAINPOOLP160R1;
  388. #else
  389. #define ecc_oid_brainpoolp160r1 CODED_BRAINPOOLP160R1
  390. #endif
  391. #define ecc_oid_brainpoolp160r1_sz CODED_BRAINPOOLP160R1_SZ
  392. #endif /* HAVE_ECC_BRAINPOOL */
  393. #endif /* ECC160 */
  394. #ifdef ECC192
  395. #ifndef NO_ECC_SECP
  396. #ifdef HAVE_OID_ENCODING
  397. #define CODED_SECP192R1 {1,2,840,10045,3,1,1}
  398. #define CODED_SECP192R1_SZ 7
  399. #else
  400. #define CODED_SECP192R1 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x01}
  401. #define CODED_SECP192R1_SZ 8
  402. #endif
  403. #ifndef WOLFSSL_ECC_CURVE_STATIC
  404. static const ecc_oid_t ecc_oid_secp192r1[] = CODED_SECP192R1;
  405. #else
  406. #define ecc_oid_secp192r1 CODED_SECP192R1
  407. #endif
  408. #define ecc_oid_secp192r1_sz CODED_SECP192R1_SZ
  409. #endif /* !NO_ECC_SECP */
  410. #ifdef HAVE_ECC_SECPR2
  411. #ifdef HAVE_OID_ENCODING
  412. #define CODED_PRIME192V2 {1,2,840,10045,3,1,2}
  413. #define CODED_PRIME192V2_SZ 7
  414. #else
  415. #define CODED_PRIME192V2 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x02}
  416. #define CODED_PRIME192V2_SZ 8
  417. #endif
  418. #ifndef WOLFSSL_ECC_CURVE_STATIC
  419. static const ecc_oid_t ecc_oid_prime192v2[] = CODED_PRIME192V2;
  420. #else
  421. #define ecc_oid_prime192v2 CODED_PRIME192V2
  422. #endif
  423. #define ecc_oid_prime192v2_sz CODED_PRIME192V2_SZ
  424. #endif /* HAVE_ECC_SECPR2 */
  425. #ifdef HAVE_ECC_SECPR3
  426. #ifdef HAVE_OID_ENCODING
  427. #define CODED_PRIME192V3 {1,2,840,10045,3,1,3}
  428. #define CODED_PRIME192V3_SZ 7
  429. #else
  430. #define CODED_PRIME192V3 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x03}
  431. #define CODED_PRIME192V3_SZ 8
  432. #endif
  433. #ifndef WOLFSSL_ECC_CURVE_STATIC
  434. static const ecc_oid_t ecc_oid_prime192v3[] = CODED_PRIME192V3;
  435. #else
  436. #define ecc_oid_prime192v3 CODED_PRIME192V3
  437. #endif
  438. #define ecc_oid_prime192v3_sz CODED_PRIME192V3_SZ
  439. #endif /* HAVE_ECC_SECPR3 */
  440. #ifdef HAVE_ECC_KOBLITZ
  441. #ifdef HAVE_OID_ENCODING
  442. #define CODED_SECP192K1 {1,3,132,0,31}
  443. #define CODED_SECP192K1_SZ 5
  444. #else
  445. #define CODED_SECP192K1 {0x2B,0x81,0x04,0x00,0x1F}
  446. #define CODED_SECP192K1_SZ 5
  447. #endif
  448. #ifndef WOLFSSL_ECC_CURVE_STATIC
  449. static const ecc_oid_t ecc_oid_secp192k1[] = CODED_SECP192K1;
  450. #else
  451. #define ecc_oid_secp192k1 CODED_SECP192K1
  452. #endif
  453. #define ecc_oid_secp192k1_sz CODED_SECP192K1_SZ
  454. #endif /* HAVE_ECC_KOBLITZ */
  455. #ifdef HAVE_ECC_BRAINPOOL
  456. #ifdef HAVE_OID_ENCODING
  457. #define CODED_BRAINPOOLP192R1 {1,3,36,3,3,2,8,1,1,3}
  458. #define CODED_BRAINPOOLP192R1_SZ 10
  459. #else
  460. #define CODED_BRAINPOOLP192R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x03}
  461. #define CODED_BRAINPOOLP192R1_SZ 9
  462. #endif
  463. #ifndef WOLFSSL_ECC_CURVE_STATIC
  464. static const ecc_oid_t ecc_oid_brainpoolp192r1[] = CODED_BRAINPOOLP192R1;
  465. #else
  466. #define ecc_oid_brainpoolp192r1 CODED_BRAINPOOLP192R1
  467. #endif
  468. #define ecc_oid_brainpoolp192r1_sz CODED_BRAINPOOLP192R1_SZ
  469. #endif /* HAVE_ECC_BRAINPOOL */
  470. #endif /* ECC192 */
  471. #ifdef ECC224
  472. #ifndef NO_ECC_SECP
  473. #ifdef HAVE_OID_ENCODING
  474. #define CODED_SECP224R1 {1,3,132,0,33}
  475. #define CODED_SECP224R1_SZ 5
  476. #else
  477. #define CODED_SECP224R1 {0x2B,0x81,0x04,0x00,0x21}
  478. #define CODED_SECP224R1_SZ 5
  479. #endif
  480. #ifndef WOLFSSL_ECC_CURVE_STATIC
  481. static const ecc_oid_t ecc_oid_secp224r1[] = CODED_SECP224R1;
  482. #else
  483. #define ecc_oid_secp224r1 CODED_SECP224R1
  484. #endif
  485. #define ecc_oid_secp224r1_sz CODED_SECP224R1_SZ
  486. #endif /* !NO_ECC_SECP */
  487. #if defined(HAVE_ECC_KOBLITZ) && !defined(FP_ECC)
  488. #ifdef HAVE_OID_ENCODING
  489. #define CODED_SECP224K1 {1,3,132,0,32}
  490. #define CODED_SECP224K1_SZ 5
  491. #else
  492. #define CODED_SECP224K1 {0x2B,0x81,0x04,0x00,0x20}
  493. #define CODED_SECP224K1_SZ 5
  494. #endif
  495. #ifndef WOLFSSL_ECC_CURVE_STATIC
  496. static const ecc_oid_t ecc_oid_secp224k1[] = CODED_SECP224K1;
  497. #else
  498. #define ecc_oid_secp224k1 CODED_SECP224K1
  499. #endif
  500. #define ecc_oid_secp224k1_sz CODED_SECP224K1_SZ
  501. #endif /* HAVE_ECC_KOBLITZ && !FP_ECC */
  502. #ifdef HAVE_ECC_BRAINPOOL
  503. #ifdef HAVE_OID_ENCODING
  504. #define CODED_BRAINPOOLP224R1 {1,3,36,3,3,2,8,1,1,5}
  505. #define CODED_BRAINPOOLP224R1_SZ 10
  506. #else
  507. #define CODED_BRAINPOOLP224R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x05}
  508. #define CODED_BRAINPOOLP224R1_SZ 9
  509. #endif
  510. #ifndef WOLFSSL_ECC_CURVE_STATIC
  511. static const ecc_oid_t ecc_oid_brainpoolp224r1[] = CODED_BRAINPOOLP224R1;
  512. #else
  513. #define ecc_oid_brainpoolp224r1 CODED_BRAINPOOLP224R1
  514. #endif
  515. #define ecc_oid_brainpoolp224r1_sz CODED_BRAINPOOLP224R1_SZ
  516. #endif /* HAVE_ECC_BRAINPOOL */
  517. #endif /* ECC224 */
  518. #ifdef ECC239
  519. #ifndef NO_ECC_SECP
  520. #ifdef HAVE_OID_ENCODING
  521. #define CODED_PRIME239V1 {1,2,840,10045,3,1,4}
  522. #define CODED_PRIME239V1_SZ 7
  523. #else
  524. #define CODED_PRIME239V1 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x04}
  525. #define CODED_PRIME239V1_SZ 8
  526. #endif
  527. #ifndef WOLFSSL_ECC_CURVE_STATIC
  528. static const ecc_oid_t ecc_oid_prime239v1[] = CODED_PRIME239V1;
  529. #else
  530. #define ecc_oid_prime239v1 CODED_PRIME239V1
  531. #endif
  532. #define ecc_oid_prime239v1_sz CODED_PRIME239V1_SZ
  533. #endif /* !NO_ECC_SECP */
  534. #ifdef HAVE_ECC_SECPR2
  535. #ifdef HAVE_OID_ENCODING
  536. #define CODED_PRIME239V2 {1,2,840,10045,3,1,5}
  537. #define CODED_PRIME239V2_SZ 7
  538. #else
  539. #define CODED_PRIME239V2 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x05}
  540. #define CODED_PRIME239V2_SZ 8
  541. #endif
  542. #ifndef WOLFSSL_ECC_CURVE_STATIC
  543. static const ecc_oid_t ecc_oid_prime239v2[] = CODED_PRIME239V2;
  544. #else
  545. #define ecc_oid_prime239v2 CODED_PRIME239V2
  546. #endif
  547. #define ecc_oid_prime239v2_sz CODED_PRIME239V2_SZ
  548. #endif /* HAVE_ECC_SECPR2 */
  549. #ifdef HAVE_ECC_SECPR3
  550. #ifdef HAVE_OID_ENCODING
  551. #define CODED_PRIME239V3 {1,2,840,10045,3,1,6}
  552. #define CODED_PRIME239V3_SZ 7
  553. #else
  554. #define CODED_PRIME239V3 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x06}
  555. #define CODED_PRIME239V3_SZ 8
  556. #endif
  557. #ifndef WOLFSSL_ECC_CURVE_STATIC
  558. static const ecc_oid_t ecc_oid_prime239v3[] = CODED_PRIME239V3;
  559. #else
  560. #define ecc_oid_prime239v3 CODED_PRIME239V3
  561. #endif
  562. #define ecc_oid_prime239v3_sz CODED_PRIME239V3_SZ
  563. #endif /* HAVE_ECC_SECPR3 */
  564. #endif /* ECC239 */
  565. #ifdef ECC256
  566. #ifndef NO_ECC_SECP
  567. #ifdef HAVE_OID_ENCODING
  568. #define CODED_SECP256R1 {1,2,840,10045,3,1,7}
  569. #define CODED_SECP256R1_SZ 7
  570. #else
  571. #define CODED_SECP256R1 {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x07}
  572. #define CODED_SECP256R1_SZ 8
  573. #endif
  574. #ifndef WOLFSSL_ECC_CURVE_STATIC
  575. static const ecc_oid_t ecc_oid_secp256r1[] = CODED_SECP256R1;
  576. #else
  577. #define ecc_oid_secp256r1 CODED_SECP256R1
  578. #endif
  579. #define ecc_oid_secp256r1_sz CODED_SECP256R1_SZ
  580. #endif /* !NO_ECC_SECP */
  581. #ifdef HAVE_ECC_KOBLITZ
  582. #ifdef HAVE_OID_ENCODING
  583. #define CODED_SECP256K1 {1,3,132,0,10}
  584. #define CODED_SECP256K1_SZ 5
  585. #else
  586. #define CODED_SECP256K1 {0x2B,0x81,0x04,0x00,0x0A}
  587. #define CODED_SECP256K1_SZ 5
  588. #endif
  589. #ifndef WOLFSSL_ECC_CURVE_STATIC
  590. static const ecc_oid_t ecc_oid_secp256k1[] = CODED_SECP256K1;
  591. #else
  592. #define ecc_oid_secp256k1 CODED_SECP256K1
  593. #endif
  594. #define ecc_oid_secp256k1_sz CODED_SECP256K1_SZ
  595. #endif /* HAVE_ECC_KOBLITZ */
  596. #ifdef HAVE_ECC_BRAINPOOL
  597. #ifdef HAVE_OID_ENCODING
  598. #define CODED_BRAINPOOLP256R1 {1,3,36,3,3,2,8,1,1,7}
  599. #define CODED_BRAINPOOLP256R1_SZ 10
  600. #else
  601. #define CODED_BRAINPOOLP256R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x07}
  602. #define CODED_BRAINPOOLP256R1_SZ 9
  603. #endif
  604. #ifndef WOLFSSL_ECC_CURVE_STATIC
  605. static const ecc_oid_t ecc_oid_brainpoolp256r1[] = CODED_BRAINPOOLP256R1;
  606. #else
  607. #define ecc_oid_brainpoolp256r1 CODED_BRAINPOOLP256R1
  608. #endif
  609. #define ecc_oid_brainpoolp256r1_sz CODED_BRAINPOOLP256R1_SZ
  610. #endif /* HAVE_ECC_BRAINPOOL */
  611. #endif /* ECC256 */
  612. #ifdef ECC320
  613. #ifdef HAVE_ECC_BRAINPOOL
  614. #ifdef HAVE_OID_ENCODING
  615. #define CODED_BRAINPOOLP320R1 {1,3,36,3,3,2,8,1,1,9}
  616. #define CODED_BRAINPOOLP320R1_SZ 10
  617. #else
  618. #define CODED_BRAINPOOLP320R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x09}
  619. #define CODED_BRAINPOOLP320R1_SZ 9
  620. #endif
  621. #ifndef WOLFSSL_ECC_CURVE_STATIC
  622. static const ecc_oid_t ecc_oid_brainpoolp320r1[] = CODED_BRAINPOOLP320R1;
  623. #else
  624. #define ecc_oid_brainpoolp320r1 CODED_BRAINPOOLP320R1
  625. #endif
  626. #define ecc_oid_brainpoolp320r1_sz CODED_BRAINPOOLP320R1_SZ
  627. #endif /* HAVE_ECC_BRAINPOOL */
  628. #endif /* ECC320 */
  629. #ifdef ECC384
  630. #ifndef NO_ECC_SECP
  631. #ifdef HAVE_OID_ENCODING
  632. #define CODED_SECP384R1 {1,3,132,0,34}
  633. #define CODED_SECP384R1_SZ 5
  634. #else
  635. #define CODED_SECP384R1 {0x2B,0x81,0x04,0x00,0x22}
  636. #define CODED_SECP384R1_SZ 5
  637. #endif
  638. #ifndef WOLFSSL_ECC_CURVE_STATIC
  639. static const ecc_oid_t ecc_oid_secp384r1[] = CODED_SECP384R1;
  640. #define CODED_SECP384R1_OID ecc_oid_secp384r1
  641. #else
  642. #define ecc_oid_secp384r1 CODED_SECP384R1
  643. #endif
  644. #define ecc_oid_secp384r1_sz CODED_SECP384R1_SZ
  645. #endif /* !NO_ECC_SECP */
  646. #ifdef HAVE_ECC_BRAINPOOL
  647. #ifdef HAVE_OID_ENCODING
  648. #define CODED_BRAINPOOLP384R1 {1,3,36,3,3,2,8,1,1,11}
  649. #define CODED_BRAINPOOLP384R1_SZ 10
  650. #else
  651. #define CODED_BRAINPOOLP384R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0B}
  652. #define CODED_BRAINPOOLP384R1_SZ 9
  653. #endif
  654. #ifndef WOLFSSL_ECC_CURVE_STATIC
  655. static const ecc_oid_t ecc_oid_brainpoolp384r1[] = CODED_BRAINPOOLP384R1;
  656. #else
  657. #define ecc_oid_brainpoolp384r1 CODED_BRAINPOOLP384R1
  658. #endif
  659. #define ecc_oid_brainpoolp384r1_sz CODED_BRAINPOOLP384R1_SZ
  660. #endif /* HAVE_ECC_BRAINPOOL */
  661. #endif /* ECC384 */
  662. #ifdef ECC512
  663. #ifdef HAVE_ECC_BRAINPOOL
  664. #ifdef HAVE_OID_ENCODING
  665. #define CODED_BRAINPOOLP512R1 {1,3,36,3,3,2,8,1,1,13}
  666. #define CODED_BRAINPOOLP512R1_SZ 10
  667. #else
  668. #define CODED_BRAINPOOLP512R1 {0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x0D}
  669. #define CODED_BRAINPOOLP512R1_SZ 9
  670. #endif
  671. #ifndef WOLFSSL_ECC_CURVE_STATIC
  672. static const ecc_oid_t ecc_oid_brainpoolp512r1[] = CODED_BRAINPOOLP512R1;
  673. #else
  674. #define ecc_oid_brainpoolp512r1 CODED_BRAINPOOLP512R1
  675. #endif
  676. #define ecc_oid_brainpoolp512r1_sz CODED_BRAINPOOLP512R1_SZ
  677. #endif /* HAVE_ECC_BRAINPOOL */
  678. #endif /* ECC512 */
  679. #ifdef ECC521
  680. #ifndef NO_ECC_SECP
  681. #ifdef HAVE_OID_ENCODING
  682. #define CODED_SECP521R1 {1,3,132,0,35}
  683. #define CODED_SECP521R1_SZ 5
  684. #else
  685. #define CODED_SECP521R1 {0x2B,0x81,0x04,0x00,0x23}
  686. #define CODED_SECP521R1_SZ 5
  687. #endif
  688. #ifndef WOLFSSL_ECC_CURVE_STATIC
  689. static const ecc_oid_t ecc_oid_secp521r1[] = CODED_SECP521R1;
  690. #else
  691. #define ecc_oid_secp521r1 CODED_SECP521R1
  692. #endif
  693. #define ecc_oid_secp521r1_sz CODED_SECP521R1_SZ
  694. #endif /* !NO_ECC_SECP */
  695. #endif /* ECC521 */
  696. /* This holds the key settings.
  697. ***MUST*** be organized by size from smallest to largest. */
  698. const ecc_set_type ecc_sets[] = {
  699. #ifdef ECC112
  700. #ifndef NO_ECC_SECP
  701. {
  702. 14, /* size/bytes */
  703. ECC_SECP112R1, /* ID */
  704. "SECP112R1", /* curve name */
  705. "DB7C2ABF62E35E668076BEAD208B", /* prime */
  706. "DB7C2ABF62E35E668076BEAD2088", /* A */
  707. "659EF8BA043916EEDE8911702B22", /* B */
  708. "DB7C2ABF62E35E7628DFAC6561C5", /* order */
  709. "9487239995A5EE76B55F9C2F098", /* Gx */
  710. "A89CE5AF8724C0A23E0E0FF77500", /* Gy */
  711. ecc_oid_secp112r1, /* oid/oidSz */
  712. ecc_oid_secp112r1_sz,
  713. ECC_SECP112R1_OID, /* oid sum */
  714. 1, /* cofactor */
  715. },
  716. #endif /* !NO_ECC_SECP */
  717. #ifdef HAVE_ECC_SECPR2
  718. {
  719. 14, /* size/bytes */
  720. ECC_SECP112R2, /* ID */
  721. "SECP112R2", /* curve name */
  722. "DB7C2ABF62E35E668076BEAD208B", /* prime */
  723. "6127C24C05F38A0AAAF65C0EF02C", /* A */
  724. "51DEF1815DB5ED74FCC34C85D709", /* B */
  725. "36DF0AAFD8B8D7597CA10520D04B", /* order */
  726. "4BA30AB5E892B4E1649DD0928643", /* Gx */
  727. "ADCD46F5882E3747DEF36E956E97", /* Gy */
  728. ecc_oid_secp112r2, /* oid/oidSz */
  729. ecc_oid_secp112r2_sz,
  730. ECC_SECP112R2_OID, /* oid sum */
  731. 4, /* cofactor */
  732. },
  733. #endif /* HAVE_ECC_SECPR2 */
  734. #endif /* ECC112 */
  735. #ifdef ECC128
  736. #ifndef NO_ECC_SECP
  737. {
  738. 16, /* size/bytes */
  739. ECC_SECP128R1, /* ID */
  740. "SECP128R1", /* curve name */
  741. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  742. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", /* A */
  743. "E87579C11079F43DD824993C2CEE5ED3", /* B */
  744. "FFFFFFFE0000000075A30D1B9038A115", /* order */
  745. "161FF7528B899B2D0C28607CA52C5B86", /* Gx */
  746. "CF5AC8395BAFEB13C02DA292DDED7A83", /* Gy */
  747. ecc_oid_secp128r1, /* oid/oidSz */
  748. ecc_oid_secp128r1_sz,
  749. ECC_SECP128R1_OID, /* oid sum */
  750. 1, /* cofactor */
  751. },
  752. #endif /* !NO_ECC_SECP */
  753. #ifdef HAVE_ECC_SECPR2
  754. {
  755. 16, /* size/bytes */
  756. ECC_SECP128R2, /* ID */
  757. "SECP128R2", /* curve name */
  758. "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  759. "D6031998D1B3BBFEBF59CC9BBFF9AEE1", /* A */
  760. "5EEEFCA380D02919DC2C6558BB6D8A5D", /* B */
  761. "3FFFFFFF7FFFFFFFBE0024720613B5A3", /* order */
  762. "7B6AA5D85E572983E6FB32A7CDEBC140", /* Gx */
  763. "27B6916A894D3AEE7106FE805FC34B44", /* Gy */
  764. ecc_oid_secp128r2, /* oid/oidSz */
  765. ecc_oid_secp128r2_sz,
  766. ECC_SECP128R2_OID, /* oid sum */
  767. 4, /* cofactor */
  768. },
  769. #endif /* HAVE_ECC_SECPR2 */
  770. #endif /* ECC128 */
  771. #ifdef ECC160
  772. #ifndef FP_ECC
  773. #ifndef NO_ECC_SECP
  774. {
  775. 20, /* size/bytes */
  776. ECC_SECP160R1, /* ID */
  777. "SECP160R1", /* curve name */
  778. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", /* prime */
  779. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", /* A */
  780. "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", /* B */
  781. "100000000000000000001F4C8F927AED3CA752257",/* order */
  782. "4A96B5688EF573284664698968C38BB913CBFC82", /* Gx */
  783. "23A628553168947D59DCC912042351377AC5FB32", /* Gy */
  784. ecc_oid_secp160r1, /* oid/oidSz */
  785. ecc_oid_secp160r1_sz,
  786. ECC_SECP160R1_OID, /* oid sum */
  787. 1, /* cofactor */
  788. },
  789. #endif /* !NO_ECC_SECP */
  790. #ifdef HAVE_ECC_SECPR2
  791. {
  792. 20, /* size/bytes */
  793. ECC_SECP160R2, /* ID */
  794. "SECP160R2", /* curve name */
  795. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", /* prime */
  796. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70", /* A */
  797. "B4E134D3FB59EB8BAB57274904664D5AF50388BA", /* B */
  798. "100000000000000000000351EE786A818F3A1A16B",/* order */
  799. "52DCB034293A117E1F4FF11B30F7199D3144CE6D", /* Gx */
  800. "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E", /* Gy */
  801. ecc_oid_secp160r2, /* oid/oidSz */
  802. ecc_oid_secp160r2_sz,
  803. ECC_SECP160R2_OID, /* oid sum */
  804. 1, /* cofactor */
  805. },
  806. #endif /* HAVE_ECC_SECPR2 */
  807. #ifdef HAVE_ECC_KOBLITZ
  808. {
  809. 20, /* size/bytes */
  810. ECC_SECP160K1, /* ID */
  811. "SECP160K1", /* curve name */
  812. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", /* prime */
  813. "0000000000000000000000000000000000000000", /* A */
  814. "0000000000000000000000000000000000000007", /* B */
  815. "100000000000000000001B8FA16DFAB9ACA16B6B3",/* order */
  816. "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", /* Gx */
  817. "938CF935318FDCED6BC28286531733C3F03C4FEE", /* Gy */
  818. ecc_oid_secp160k1, /* oid/oidSz */
  819. ecc_oid_secp160k1_sz,
  820. ECC_SECP160K1_OID, /* oid sum */
  821. 1, /* cofactor */
  822. },
  823. #endif /* HAVE_ECC_KOBLITZ */
  824. #endif /* !FP_ECC */
  825. #ifdef HAVE_ECC_BRAINPOOL
  826. {
  827. 20, /* size/bytes */
  828. ECC_BRAINPOOLP160R1, /* ID */
  829. "BRAINPOOLP160R1", /* curve name */
  830. "E95E4A5F737059DC60DFC7AD95B3D8139515620F", /* prime */
  831. "340E7BE2A280EB74E2BE61BADA745D97E8F7C300", /* A */
  832. "1E589A8595423412134FAA2DBDEC95C8D8675E58", /* B */
  833. "E95E4A5F737059DC60DF5991D45029409E60FC09", /* order */
  834. "BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3", /* Gx */
  835. "1667CB477A1A8EC338F94741669C976316DA6321", /* Gy */
  836. ecc_oid_brainpoolp160r1, /* oid/oidSz */
  837. ecc_oid_brainpoolp160r1_sz,
  838. ECC_BRAINPOOLP160R1_OID, /* oid sum */
  839. 1, /* cofactor */
  840. },
  841. #endif /* HAVE_ECC_BRAINPOOL */
  842. #endif /* ECC160 */
  843. #ifdef ECC192
  844. #ifndef NO_ECC_SECP
  845. {
  846. 24, /* size/bytes */
  847. ECC_SECP192R1, /* ID */
  848. "SECP192R1", /* curve name */
  849. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", /* prime */
  850. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", /* A */
  851. "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", /* B */
  852. "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", /* order */
  853. "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", /* Gx */
  854. "7192B95FFC8DA78631011ED6B24CDD573F977A11E794811", /* Gy */
  855. ecc_oid_secp192r1, /* oid/oidSz */
  856. ecc_oid_secp192r1_sz,
  857. ECC_SECP192R1_OID, /* oid sum */
  858. 1, /* cofactor */
  859. },
  860. #endif /* !NO_ECC_SECP */
  861. #ifdef HAVE_ECC_SECPR2
  862. {
  863. 24, /* size/bytes */
  864. ECC_PRIME192V2, /* ID */
  865. "PRIME192V2", /* curve name */
  866. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", /* prime */
  867. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", /* A */
  868. "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953", /* B */
  869. "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31", /* order */
  870. "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A", /* Gx */
  871. "6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15", /* Gy */
  872. ecc_oid_prime192v2, /* oid/oidSz */
  873. ecc_oid_prime192v2_sz,
  874. ECC_PRIME192V2_OID, /* oid sum */
  875. 1, /* cofactor */
  876. },
  877. #endif /* HAVE_ECC_SECPR2 */
  878. #ifdef HAVE_ECC_SECPR3
  879. {
  880. 24, /* size/bytes */
  881. ECC_PRIME192V3, /* ID */
  882. "PRIME192V3", /* curve name */
  883. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", /* prime */
  884. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", /* A */
  885. "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916", /* B */
  886. "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13", /* order */
  887. "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896", /* Gx */
  888. "38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0", /* Gy */
  889. ecc_oid_prime192v3, /* oid/oidSz */
  890. ecc_oid_prime192v3_sz,
  891. ECC_PRIME192V3_OID, /* oid sum */
  892. 1, /* cofactor */
  893. },
  894. #endif /* HAVE_ECC_SECPR3 */
  895. #ifdef HAVE_ECC_KOBLITZ
  896. {
  897. 24, /* size/bytes */
  898. ECC_SECP192K1, /* ID */
  899. "SECP192K1", /* curve name */
  900. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", /* prime */
  901. "000000000000000000000000000000000000000000000000", /* A */
  902. "000000000000000000000000000000000000000000000003", /* B */
  903. "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", /* order */
  904. "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", /* Gx */
  905. "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", /* Gy */
  906. ecc_oid_secp192k1, /* oid/oidSz */
  907. ecc_oid_secp192k1_sz,
  908. ECC_SECP192K1_OID, /* oid sum */
  909. 1, /* cofactor */
  910. },
  911. #endif /* HAVE_ECC_KOBLITZ */
  912. #ifdef HAVE_ECC_BRAINPOOL
  913. {
  914. 24, /* size/bytes */
  915. ECC_BRAINPOOLP192R1, /* ID */
  916. "BRAINPOOLP192R1", /* curve name */
  917. "C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297", /* prime */
  918. "6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF", /* A */
  919. "469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9", /* B */
  920. "C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1", /* order */
  921. "C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6", /* Gx */
  922. "14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F", /* Gy */
  923. ecc_oid_brainpoolp192r1, /* oid/oidSz */
  924. ecc_oid_brainpoolp192r1_sz,
  925. ECC_BRAINPOOLP192R1_OID, /* oid sum */
  926. 1, /* cofactor */
  927. },
  928. #endif /* HAVE_ECC_BRAINPOOL */
  929. #endif /* ECC192 */
  930. #ifdef ECC224
  931. #ifndef NO_ECC_SECP
  932. {
  933. 28, /* size/bytes */
  934. ECC_SECP224R1, /* ID */
  935. "SECP224R1", /* curve name */
  936. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", /* prime */
  937. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", /* A */
  938. "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", /* B */
  939. "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", /* order */
  940. "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", /* Gx */
  941. "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", /* Gy */
  942. ecc_oid_secp224r1, /* oid/oidSz */
  943. ecc_oid_secp224r1_sz,
  944. ECC_SECP224R1_OID, /* oid sum */
  945. 1, /* cofactor */
  946. },
  947. #endif /* !NO_ECC_SECP */
  948. #if defined(HAVE_ECC_KOBLITZ) && !defined(FP_ECC)
  949. {
  950. 28, /* size/bytes */
  951. ECC_SECP224K1, /* ID */
  952. "SECP224K1", /* curve name */
  953. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D", /* prime */
  954. "00000000000000000000000000000000000000000000000000000000", /* A */
  955. "00000000000000000000000000000000000000000000000000000005", /* B */
  956. "10000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",/* order */
  957. "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C", /* Gx */
  958. "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5", /* Gy */
  959. ecc_oid_secp224k1, /* oid/oidSz */
  960. ecc_oid_secp224k1_sz,
  961. ECC_SECP224K1_OID, /* oid sum */
  962. 1, /* cofactor */
  963. },
  964. #endif /* HAVE_ECC_KOBLITZ && !FP_ECC */
  965. #ifdef HAVE_ECC_BRAINPOOL
  966. {
  967. 28, /* size/bytes */
  968. ECC_BRAINPOOLP224R1, /* ID */
  969. "BRAINPOOLP224R1", /* curve name */
  970. "D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF", /* prime */
  971. "68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43", /* A */
  972. "2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B", /* B */
  973. "D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F", /* order */
  974. "0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D", /* Gx */
  975. "58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD", /* Gy */
  976. ecc_oid_brainpoolp224r1, /* oid/oidSz */
  977. ecc_oid_brainpoolp224r1_sz,
  978. ECC_BRAINPOOLP224R1_OID, /* oid sum */
  979. 1, /* cofactor */
  980. },
  981. #endif /* HAVE_ECC_BRAINPOOL */
  982. #endif /* ECC224 */
  983. #ifdef ECC239
  984. #ifndef NO_ECC_SECP
  985. {
  986. 30, /* size/bytes */
  987. ECC_PRIME239V1, /* ID */
  988. "PRIME239V1", /* curve name */
  989. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", /* prime */
  990. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", /* A */
  991. "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A", /* B */
  992. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B", /* order */
  993. "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF", /* Gx */
  994. "7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE", /* Gy */
  995. ecc_oid_prime239v1, /* oid/oidSz */
  996. ecc_oid_prime239v1_sz,
  997. ECC_PRIME239V1_OID, /* oid sum */
  998. 1, /* cofactor */
  999. },
  1000. #endif /* !NO_ECC_SECP */
  1001. #ifdef HAVE_ECC_SECPR2
  1002. {
  1003. 30, /* size/bytes */
  1004. ECC_PRIME239V2, /* ID */
  1005. "PRIME239V2", /* curve name */
  1006. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", /* prime */
  1007. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", /* A */
  1008. "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C", /* B */
  1009. "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063", /* order */
  1010. "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7", /* Gx */
  1011. "5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA", /* Gy */
  1012. ecc_oid_prime239v2, /* oid/oidSz */
  1013. ecc_oid_prime239v2_sz,
  1014. ECC_PRIME239V2_OID, /* oid sum */
  1015. 1, /* cofactor */
  1016. },
  1017. #endif /* HAVE_ECC_SECPR2 */
  1018. #ifdef HAVE_ECC_SECPR3
  1019. {
  1020. 30, /* size/bytes */
  1021. ECC_PRIME239V3, /* ID */
  1022. "PRIME239V3", /* curve name */
  1023. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", /* prime */
  1024. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", /* A */
  1025. "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E", /* B */
  1026. "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551", /* order */
  1027. "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A", /* Gx */
  1028. "1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3", /* Gy */
  1029. ecc_oid_prime239v3, /* oid/oidSz */
  1030. ecc_oid_prime239v3_sz,
  1031. ECC_PRIME239V3_OID, /* oid sum */
  1032. 1, /* cofactor */
  1033. },
  1034. #endif /* HAVE_ECC_SECPR3 */
  1035. #endif /* ECC239 */
  1036. #ifdef ECC256
  1037. #ifndef NO_ECC_SECP
  1038. {
  1039. 32, /* size/bytes */
  1040. ECC_SECP256R1, /* ID */
  1041. "SECP256R1", /* curve name */
  1042. "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  1043. "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", /* A */
  1044. "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", /* B */
  1045. "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", /* order */
  1046. "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", /* Gx */
  1047. "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", /* Gy */
  1048. ecc_oid_secp256r1, /* oid/oidSz */
  1049. ecc_oid_secp256r1_sz,
  1050. ECC_SECP256R1_OID, /* oid sum */
  1051. 1, /* cofactor */
  1052. },
  1053. #endif /* !NO_ECC_SECP */
  1054. #ifdef HAVE_ECC_KOBLITZ
  1055. {
  1056. 32, /* size/bytes */
  1057. ECC_SECP256K1, /* ID */
  1058. "SECP256K1", /* curve name */
  1059. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", /* prime */
  1060. "0000000000000000000000000000000000000000000000000000000000000000", /* A */
  1061. "0000000000000000000000000000000000000000000000000000000000000007", /* B */
  1062. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", /* order */
  1063. "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", /* Gx */
  1064. "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", /* Gy */
  1065. ecc_oid_secp256k1, /* oid/oidSz */
  1066. ecc_oid_secp256k1_sz,
  1067. ECC_SECP256K1_OID, /* oid sum */
  1068. 1, /* cofactor */
  1069. },
  1070. #endif /* HAVE_ECC_KOBLITZ */
  1071. #ifdef HAVE_ECC_BRAINPOOL
  1072. {
  1073. 32, /* size/bytes */
  1074. ECC_BRAINPOOLP256R1, /* ID */
  1075. "BRAINPOOLP256R1", /* curve name */
  1076. "A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", /* prime */
  1077. "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", /* A */
  1078. "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", /* B */
  1079. "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7", /* order */
  1080. "8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262", /* Gx */
  1081. "547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", /* Gy */
  1082. ecc_oid_brainpoolp256r1, /* oid/oidSz */
  1083. ecc_oid_brainpoolp256r1_sz,
  1084. ECC_BRAINPOOLP256R1_OID, /* oid sum */
  1085. 1, /* cofactor */
  1086. },
  1087. #endif /* HAVE_ECC_BRAINPOOL */
  1088. #endif /* ECC256 */
  1089. #ifdef ECC320
  1090. #ifdef HAVE_ECC_BRAINPOOL
  1091. {
  1092. 40, /* size/bytes */
  1093. ECC_BRAINPOOLP320R1, /* ID */
  1094. "BRAINPOOLP320R1", /* curve name */
  1095. "D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27", /* prime */
  1096. "3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4", /* A */
  1097. "520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6", /* B */
  1098. "D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311", /* order */
  1099. "43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E20611", /* Gx */
  1100. "14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1", /* Gy */
  1101. ecc_oid_brainpoolp320r1, ecc_oid_brainpoolp320r1_sz, /* oid/oidSz */
  1102. ECC_BRAINPOOLP320R1_OID, /* oid sum */
  1103. 1, /* cofactor */
  1104. },
  1105. #endif /* HAVE_ECC_BRAINPOOL */
  1106. #endif /* ECC320 */
  1107. #ifdef ECC384
  1108. #ifndef NO_ECC_SECP
  1109. {
  1110. 48, /* size/bytes */
  1111. ECC_SECP384R1, /* ID */
  1112. "SECP384R1", /* curve name */
  1113. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", /* prime */
  1114. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", /* A */
  1115. "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", /* B */
  1116. "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", /* order */
  1117. "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", /* Gx */
  1118. "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F", /* Gy */
  1119. ecc_oid_secp384r1, ecc_oid_secp384r1_sz, /* oid/oidSz */
  1120. ECC_SECP384R1_OID, /* oid sum */
  1121. 1, /* cofactor */
  1122. },
  1123. #endif /* !NO_ECC_SECP */
  1124. #ifdef HAVE_ECC_BRAINPOOL
  1125. {
  1126. 48, /* size/bytes */
  1127. ECC_BRAINPOOLP384R1, /* ID */
  1128. "BRAINPOOLP384R1", /* curve name */
  1129. "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53", /* prime */
  1130. "7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826", /* A */
  1131. "04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11", /* B */
  1132. "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565", /* order */
  1133. "1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E", /* Gx */
  1134. "8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315", /* Gy */
  1135. ecc_oid_brainpoolp384r1, ecc_oid_brainpoolp384r1_sz, /* oid/oidSz */
  1136. ECC_BRAINPOOLP384R1_OID, /* oid sum */
  1137. 1, /* cofactor */
  1138. },
  1139. #endif /* HAVE_ECC_BRAINPOOL */
  1140. #endif /* ECC384 */
  1141. #ifdef ECC512
  1142. #ifdef HAVE_ECC_BRAINPOOL
  1143. {
  1144. 64, /* size/bytes */
  1145. ECC_BRAINPOOLP512R1, /* ID */
  1146. "BRAINPOOLP512R1", /* curve name */
  1147. "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3", /* prime */
  1148. "7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA", /* A */
  1149. "3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723", /* B */
  1150. "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069", /* order */
  1151. "81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822", /* Gx */
  1152. "7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892", /* Gy */
  1153. ecc_oid_brainpoolp512r1, ecc_oid_brainpoolp512r1_sz, /* oid/oidSz */
  1154. ECC_BRAINPOOLP512R1_OID, /* oid sum */
  1155. 1, /* cofactor */
  1156. },
  1157. #endif /* HAVE_ECC_BRAINPOOL */
  1158. #endif /* ECC512 */
  1159. #ifdef ECC521
  1160. #ifndef NO_ECC_SECP
  1161. {
  1162. 66, /* size/bytes */
  1163. ECC_SECP521R1, /* ID */
  1164. "SECP521R1", /* curve name */
  1165. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", /* prime */
  1166. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", /* A */
  1167. "51953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", /* B */
  1168. "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", /* order */
  1169. "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", /* Gx */
  1170. "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650", /* Gy */
  1171. ecc_oid_secp521r1, ecc_oid_secp521r1_sz, /* oid/oidSz */
  1172. ECC_SECP521R1_OID, /* oid sum */
  1173. 1, /* cofactor */
  1174. },
  1175. #endif /* !NO_ECC_SECP */
  1176. #endif /* ECC521 */
  1177. #ifdef WOLFCRYPT_HAVE_SAKKE
  1178. {
  1179. 128,
  1180. ECC_SAKKE_1,
  1181. "SAKKE1",
  1182. "997ABB1F0A563FDA65C61198DAD0657A416C0CE19CB48261BE9AE358B3E01A2EF40AAB27E2FC0F1B228730D531A59CB0E791B39FF7C88A19356D27F4A666A6D0E26C6487326B4CD4512AC5CD65681CE1B6AFF4A831852A82A7CF3C521C3C09AA9F94D6AF56971F1FFCE3E82389857DB080C5DF10AC7ACE87666D807AFEA85FEB",
  1183. "997ABB1F0A563FDA65C61198DAD0657A416C0CE19CB48261BE9AE358B3E01A2EF40AAB27E2FC0F1B228730D531A59CB0E791B39FF7C88A19356D27F4A666A6D0E26C6487326B4CD4512AC5CD65681CE1B6AFF4A831852A82A7CF3C521C3C09AA9F94D6AF56971F1FFCE3E82389857DB080C5DF10AC7ACE87666D807AFEA85FE8",
  1184. "0",
  1185. "265EAEC7C2958FF69971846636B4195E905B0338672D20986FA6B8D62CF8068BBD02AAC9F8BF03C6C8A1CC354C69672C39E46CE7FDF222864D5B49FD2999A9B4389B1921CC9AD335144AB173595A07386DABFD2A0C614AA0A9F3CF14870F026AA7E535ABD5A5C7C7FF38FA08E2615F6C203177C42B1EB3A1D99B601EBFAA17FB",
  1186. "53FC09EE332C29AD0A7990053ED9B52A2B1A2FD60AEC69C698B2F204B6FF7CBFB5EDB6C0F6CE2308AB10DB9030B09E1043D5F22CDB9DFA55718BD9E7406CE8909760AF765DD5BCCB337C86548B72F2E1A702C3397A60DE74A7C1514DBA66910DD5CFB4CC80728D87EE9163A5B63F73EC80EC46C4967E0979880DC8ABEAE63895",
  1187. "0A8249063F6009F1F9F1F0533634A135D3E82016029906963D778D821E141178F5EA69F4654EC2B9E7F7F5E5F0DE55F66B598CCF9A140B2E416CFF0CA9E032B970DAE117AD547C6CCAD696B5B7652FE0AC6F1E80164AA989492D979FC5A4D5F213515AD7E9CB99A980BDAD5AD5BB4636ADB9B5706A67DCDE75573FD71BEF16D7",
  1188. #ifndef WOLFSSL_ECC_CURVE_STATIC
  1189. NULL, 0,
  1190. #else
  1191. {0}, 0,
  1192. #endif
  1193. 0,
  1194. 4,
  1195. },
  1196. #endif
  1197. #if defined(WOLFSSL_CUSTOM_CURVES) && defined(ECC_CACHE_CURVE)
  1198. /* place holder for custom curve index for cache */
  1199. {
  1200. 1, /* non-zero */
  1201. ECC_CURVE_CUSTOM,
  1202. #ifndef WOLFSSL_ECC_CURVE_STATIC
  1203. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  1204. #else
  1205. {0},{0},{0},{0},{0},{0},{0},{0},
  1206. #endif
  1207. 0, 0, 0
  1208. },
  1209. #endif
  1210. {
  1211. 0,
  1212. ECC_CURVE_INVALID,
  1213. #ifndef WOLFSSL_ECC_CURVE_STATIC
  1214. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  1215. #else
  1216. {0},{0},{0},{0},{0},{0},{0},{0},
  1217. #endif
  1218. 0, 0, 0
  1219. }
  1220. };
  1221. #define ECC_SET_COUNT (sizeof(ecc_sets)/sizeof(ecc_set_type))
  1222. const size_t ecc_sets_count = ECC_SET_COUNT - 1;
  1223. #ifdef HAVE_OID_ENCODING
  1224. /* encoded OID cache */
  1225. typedef struct {
  1226. word32 oidSz;
  1227. byte oid[ECC_MAX_OID_LEN];
  1228. } oid_cache_t;
  1229. static oid_cache_t ecc_oid_cache[ECC_SET_COUNT];
  1230. #endif
  1231. #if defined(HAVE_COMP_KEY) && defined(HAVE_ECC_KEY_EXPORT)
  1232. static int wc_ecc_export_x963_compressed(ecc_key* key, byte* out, word32* outLen);
  1233. #endif
  1234. #if !defined(WOLFSSL_SP_MATH) && \
  1235. !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  1236. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \
  1237. !defined(WOLFSSL_SE050) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) && \
  1238. !defined(WOLFSSL_STM32_PKA)
  1239. static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
  1240. mp_int* prime, mp_int* order);
  1241. #endif
  1242. static int _ecc_validate_public_key(ecc_key* key, int partial, int priv);
  1243. #if (FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_ECC_KEYGEN)) && \
  1244. !defined(WOLFSSL_KCAPI_ECC)
  1245. static int _ecc_pairwise_consistency_test(ecc_key* key, WC_RNG* rng);
  1246. #endif
  1247. int mp_jacobi(mp_int* a, mp_int* n, int* c);
  1248. int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret);
  1249. /* Curve Specs */
  1250. typedef struct ecc_curve_spec {
  1251. const ecc_set_type* dp;
  1252. mp_int* prime;
  1253. mp_int* Af;
  1254. #ifdef USE_ECC_B_PARAM
  1255. mp_int* Bf;
  1256. #endif
  1257. mp_int* order;
  1258. mp_int* Gx;
  1259. mp_int* Gy;
  1260. #ifdef ECC_CACHE_CURVE
  1261. mp_int prime_lcl;
  1262. mp_int Af_lcl;
  1263. #ifdef USE_ECC_B_PARAM
  1264. mp_int Bf_lcl;
  1265. #endif
  1266. mp_int order_lcl;
  1267. mp_int Gx_lcl;
  1268. mp_int Gy_lcl;
  1269. #else
  1270. #ifdef WOLFSSL_SP_MATH_ALL
  1271. unsigned char* spec_ints;
  1272. #else
  1273. mp_int* spec_ints;
  1274. #endif
  1275. word32 spec_count;
  1276. word32 spec_use;
  1277. #endif
  1278. byte load_mask;
  1279. } ecc_curve_spec;
  1280. enum ecc_curve_load_mask {
  1281. ECC_CURVE_FIELD_NONE = 0x00,
  1282. ECC_CURVE_FIELD_PRIME = 0x01,
  1283. ECC_CURVE_FIELD_AF = 0x02,
  1284. #ifdef USE_ECC_B_PARAM
  1285. ECC_CURVE_FIELD_BF = 0x04,
  1286. #endif
  1287. ECC_CURVE_FIELD_ORDER = 0x08,
  1288. ECC_CURVE_FIELD_GX = 0x10,
  1289. ECC_CURVE_FIELD_GY = 0x20,
  1290. #ifdef USE_ECC_B_PARAM
  1291. ECC_CURVE_FIELD_ALL = 0x3F,
  1292. ECC_CURVE_FIELD_COUNT = 6,
  1293. #else
  1294. ECC_CURVE_FIELD_ALL = 0x3B,
  1295. ECC_CURVE_FIELD_COUNT = 5,
  1296. #endif
  1297. WOLF_ENUM_DUMMY_LAST_ELEMENT(ecc_curve_load_mask)
  1298. };
  1299. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  1300. static const u32 xil_curve_type[ECC_CURVE_MAX] = {
  1301. [ECC_SECP384R1] = WOLFSSL_XSECURE_ECC_NIST_P384,
  1302. [ECC_SECP521R1] = WOLFSSL_XSECURE_ECC_NIST_P521,
  1303. };
  1304. static void buf_reverse(byte *outbuf, const byte *inbuf, word32 len)
  1305. {
  1306. word32 up, down;
  1307. up = 0;
  1308. down = len - 1;
  1309. while (up < len)
  1310. outbuf[up++] = inbuf[down--];
  1311. }
  1312. static int xil_mpi_import(mp_int *mpi,
  1313. const byte *inbuf,
  1314. word32 len,
  1315. void* heap)
  1316. {
  1317. int err;
  1318. #ifdef WOLFSSL_SMALL_STACK
  1319. byte* buf = NULL;
  1320. #else
  1321. byte buf[MAX_ECC_BYTES];
  1322. if (len > MAX_ECC_BYTES)
  1323. return BUFFER_E;
  1324. #endif
  1325. #ifdef WOLFSSL_SMALL_STACK
  1326. buf = (byte*)XMALLOC(len, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  1327. if (buf == NULL)
  1328. return MEMORY_E;
  1329. #endif
  1330. buf_reverse(buf, inbuf, len);
  1331. err = mp_read_unsigned_bin(mpi, buf, len);
  1332. ForceZero(buf, len);
  1333. #ifdef WOLFSSL_SMALL_STACK
  1334. XFREE(buf, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  1335. #endif
  1336. return err;
  1337. }
  1338. #endif
  1339. #ifdef ECC_CACHE_CURVE
  1340. /* cache (mp_int) of the curve parameters */
  1341. static ecc_curve_spec* ecc_curve_spec_cache[ECC_SET_COUNT];
  1342. #ifndef SINGLE_THREADED
  1343. static wolfSSL_Mutex ecc_curve_cache_mutex;
  1344. #endif
  1345. #define DECLARE_CURVE_SPECS(intcount) ecc_curve_spec* curve = NULL
  1346. #define ALLOC_CURVE_SPECS(intcount, err)
  1347. #define FREE_CURVE_SPECS()
  1348. #elif defined(WOLFSSL_SMALL_STACK)
  1349. #ifdef WOLFSSL_SP_MATH_ALL
  1350. #define DECLARE_CURVE_SPECS(intcount) \
  1351. unsigned char* spec_ints = NULL; \
  1352. ecc_curve_spec curve_lcl; \
  1353. ecc_curve_spec* curve = &curve_lcl; \
  1354. XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \
  1355. curve->spec_count = intcount
  1356. #define ALLOC_CURVE_SPECS(intcount, err) \
  1357. spec_ints = (unsigned char*)XMALLOC(MP_INT_SIZEOF(MP_BITS_CNT( \
  1358. MAX_ECC_BITS_USE)) * (intcount), NULL, \
  1359. DYNAMIC_TYPE_ECC); \
  1360. if (spec_ints == NULL) \
  1361. (err) = MEMORY_E; \
  1362. else \
  1363. curve->spec_ints = spec_ints
  1364. #else
  1365. #define DECLARE_CURVE_SPECS(intcount) \
  1366. mp_int* spec_ints = NULL; \
  1367. ecc_curve_spec curve_lcl; \
  1368. ecc_curve_spec* curve = &curve_lcl; \
  1369. XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \
  1370. curve->spec_count = intcount
  1371. #define ALLOC_CURVE_SPECS(intcount, err) \
  1372. spec_ints = (mp_int*)XMALLOC(sizeof(mp_int) * (intcount), NULL, \
  1373. DYNAMIC_TYPE_ECC); \
  1374. if (spec_ints == NULL) \
  1375. (err) = MEMORY_E; \
  1376. else \
  1377. curve->spec_ints = spec_ints
  1378. #endif
  1379. #define FREE_CURVE_SPECS() \
  1380. XFREE(spec_ints, NULL, DYNAMIC_TYPE_ECC)
  1381. #else
  1382. #ifdef WOLFSSL_SP_MATH_ALL
  1383. #define DECLARE_CURVE_SPECS(intcount) \
  1384. unsigned char spec_ints[MP_INT_SIZEOF(MP_BITS_CNT( \
  1385. MAX_ECC_BITS_USE)) * (intcount)]; \
  1386. ecc_curve_spec curve_lcl; \
  1387. ecc_curve_spec* curve = &curve_lcl; \
  1388. XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \
  1389. curve->spec_ints = spec_ints; \
  1390. curve->spec_count = (intcount)
  1391. #else
  1392. #define DECLARE_CURVE_SPECS(intcount) \
  1393. mp_int spec_ints[(intcount)]; \
  1394. ecc_curve_spec curve_lcl; \
  1395. ecc_curve_spec* curve = &curve_lcl; \
  1396. XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \
  1397. curve->spec_ints = spec_ints; \
  1398. curve->spec_count = (intcount)
  1399. #endif
  1400. #define ALLOC_CURVE_SPECS(intcount, err)
  1401. #define FREE_CURVE_SPECS()
  1402. #endif /* ECC_CACHE_CURVE */
  1403. static void wc_ecc_curve_cache_free_spec_item(ecc_curve_spec* curve, mp_int* item,
  1404. byte mask)
  1405. {
  1406. if (item) {
  1407. #ifdef HAVE_WOLF_BIGINT
  1408. wc_bigint_free(&item->raw);
  1409. #endif
  1410. mp_clear(item);
  1411. }
  1412. curve->load_mask &= ~mask;
  1413. }
  1414. static void wc_ecc_curve_cache_free_spec(ecc_curve_spec* curve)
  1415. {
  1416. if (curve == NULL) {
  1417. return;
  1418. }
  1419. if (curve->load_mask & ECC_CURVE_FIELD_PRIME)
  1420. wc_ecc_curve_cache_free_spec_item(curve, curve->prime, ECC_CURVE_FIELD_PRIME);
  1421. if (curve->load_mask & ECC_CURVE_FIELD_AF)
  1422. wc_ecc_curve_cache_free_spec_item(curve, curve->Af, ECC_CURVE_FIELD_AF);
  1423. #ifdef USE_ECC_B_PARAM
  1424. if (curve->load_mask & ECC_CURVE_FIELD_BF)
  1425. wc_ecc_curve_cache_free_spec_item(curve, curve->Bf, ECC_CURVE_FIELD_BF);
  1426. #endif
  1427. if (curve->load_mask & ECC_CURVE_FIELD_ORDER)
  1428. wc_ecc_curve_cache_free_spec_item(curve, curve->order, ECC_CURVE_FIELD_ORDER);
  1429. if (curve->load_mask & ECC_CURVE_FIELD_GX)
  1430. wc_ecc_curve_cache_free_spec_item(curve, curve->Gx, ECC_CURVE_FIELD_GX);
  1431. if (curve->load_mask & ECC_CURVE_FIELD_GY)
  1432. wc_ecc_curve_cache_free_spec_item(curve, curve->Gy, ECC_CURVE_FIELD_GY);
  1433. curve->load_mask = 0;
  1434. }
  1435. static void wc_ecc_curve_free(ecc_curve_spec* curve)
  1436. {
  1437. if (curve) {
  1438. #ifdef ECC_CACHE_CURVE
  1439. #ifdef WOLFSSL_CUSTOM_CURVES
  1440. /* only free custom curves (rest are globally cached) */
  1441. if (curve->dp && curve->dp->id == ECC_CURVE_CUSTOM) {
  1442. wc_ecc_curve_cache_free_spec(curve);
  1443. XFREE(curve, NULL, DYNAMIC_TYPE_ECC);
  1444. }
  1445. #endif
  1446. #else
  1447. wc_ecc_curve_cache_free_spec(curve);
  1448. #endif
  1449. }
  1450. }
  1451. static int wc_ecc_curve_cache_load_item(ecc_curve_spec* curve, const char* src,
  1452. mp_int** dst, byte mask)
  1453. {
  1454. int err;
  1455. #ifndef ECC_CACHE_CURVE
  1456. /* get mp_int from temp */
  1457. if (curve->spec_use >= curve->spec_count) {
  1458. WOLFSSL_MSG("Invalid DECLARE_CURVE_SPECS count");
  1459. return ECC_BAD_ARG_E;
  1460. }
  1461. #ifdef WOLFSSL_SP_MATH_ALL
  1462. *dst = (mp_int*)(curve->spec_ints + MP_INT_SIZEOF(MP_BITS_CNT(
  1463. MAX_ECC_BITS_USE)) * curve->spec_use++);
  1464. #else
  1465. *dst = &curve->spec_ints[curve->spec_use++];
  1466. #endif
  1467. #endif
  1468. #ifdef WOLFSSL_SP_MATH_ALL
  1469. err = mp_init_size(*dst, MP_BITS_CNT(MAX_ECC_BITS_USE));
  1470. #else
  1471. err = mp_init(*dst);
  1472. #endif
  1473. if (err == MP_OKAY) {
  1474. curve->load_mask |= mask;
  1475. err = mp_read_radix(*dst, src, MP_RADIX_HEX);
  1476. #ifdef HAVE_WOLF_BIGINT
  1477. if (err == MP_OKAY)
  1478. err = wc_mp_to_bigint(*dst, &(*dst)->raw);
  1479. #endif
  1480. }
  1481. return err;
  1482. }
  1483. static int wc_ecc_curve_load(const ecc_set_type* dp, ecc_curve_spec** pCurve,
  1484. byte load_mask)
  1485. {
  1486. int ret = 0;
  1487. ecc_curve_spec* curve;
  1488. byte load_items = 0; /* mask of items to load */
  1489. #ifdef ECC_CACHE_CURVE
  1490. int x;
  1491. #endif
  1492. if (dp == NULL || pCurve == NULL)
  1493. return BAD_FUNC_ARG;
  1494. #ifdef ECC_CACHE_CURVE
  1495. x = wc_ecc_get_curve_idx(dp->id);
  1496. if (x == ECC_CURVE_INVALID)
  1497. return ECC_BAD_ARG_E;
  1498. #if !defined(SINGLE_THREADED)
  1499. ret = wc_LockMutex(&ecc_curve_cache_mutex);
  1500. if (ret != 0) {
  1501. return ret;
  1502. }
  1503. #endif
  1504. /* make sure cache has been allocated */
  1505. if (ecc_curve_spec_cache[x] == NULL
  1506. #ifdef WOLFSSL_CUSTOM_CURVES
  1507. || dp->id == ECC_CURVE_CUSTOM
  1508. #endif
  1509. ) {
  1510. curve = (ecc_curve_spec*)XMALLOC(sizeof(ecc_curve_spec), NULL, DYNAMIC_TYPE_ECC);
  1511. if (curve == NULL) {
  1512. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1513. wc_UnLockMutex(&ecc_curve_cache_mutex);
  1514. #endif
  1515. return MEMORY_E;
  1516. }
  1517. XMEMSET(curve, 0, sizeof(ecc_curve_spec));
  1518. /* set curve pointer to cache */
  1519. #ifdef WOLFSSL_CUSTOM_CURVES
  1520. if (dp->id != ECC_CURVE_CUSTOM)
  1521. #endif
  1522. {
  1523. ecc_curve_spec_cache[x] = curve;
  1524. }
  1525. }
  1526. else {
  1527. curve = ecc_curve_spec_cache[x];
  1528. }
  1529. /* return new or cached curve */
  1530. *pCurve = curve;
  1531. #else
  1532. curve = *pCurve;
  1533. #endif /* ECC_CACHE_CURVE */
  1534. /* make sure the curve is initialized */
  1535. if (curve->dp != dp) {
  1536. curve->load_mask = 0;
  1537. #ifdef ECC_CACHE_CURVE
  1538. curve->prime = &curve->prime_lcl;
  1539. curve->Af = &curve->Af_lcl;
  1540. #ifdef USE_ECC_B_PARAM
  1541. curve->Bf = &curve->Bf_lcl;
  1542. #endif
  1543. curve->order = &curve->order_lcl;
  1544. curve->Gx = &curve->Gx_lcl;
  1545. curve->Gy = &curve->Gy_lcl;
  1546. #endif
  1547. }
  1548. curve->dp = dp; /* set dp info */
  1549. /* determine items to load */
  1550. load_items = (byte)(((byte)~(word32)curve->load_mask) & load_mask);
  1551. curve->load_mask |= load_items;
  1552. /* load items */
  1553. if (load_items & ECC_CURVE_FIELD_PRIME)
  1554. ret += wc_ecc_curve_cache_load_item(curve, dp->prime, &curve->prime,
  1555. ECC_CURVE_FIELD_PRIME);
  1556. if (load_items & ECC_CURVE_FIELD_AF)
  1557. ret += wc_ecc_curve_cache_load_item(curve, dp->Af, &curve->Af,
  1558. ECC_CURVE_FIELD_AF);
  1559. #ifdef USE_ECC_B_PARAM
  1560. if (load_items & ECC_CURVE_FIELD_BF)
  1561. ret += wc_ecc_curve_cache_load_item(curve, dp->Bf, &curve->Bf,
  1562. ECC_CURVE_FIELD_BF);
  1563. #endif
  1564. if (load_items & ECC_CURVE_FIELD_ORDER)
  1565. ret += wc_ecc_curve_cache_load_item(curve, dp->order, &curve->order,
  1566. ECC_CURVE_FIELD_ORDER);
  1567. if (load_items & ECC_CURVE_FIELD_GX)
  1568. ret += wc_ecc_curve_cache_load_item(curve, dp->Gx, &curve->Gx,
  1569. ECC_CURVE_FIELD_GX);
  1570. if (load_items & ECC_CURVE_FIELD_GY)
  1571. ret += wc_ecc_curve_cache_load_item(curve, dp->Gy, &curve->Gy,
  1572. ECC_CURVE_FIELD_GY);
  1573. /* check for error */
  1574. if (ret != 0) {
  1575. wc_ecc_curve_free(curve);
  1576. ret = MP_READ_E;
  1577. }
  1578. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1579. wc_UnLockMutex(&ecc_curve_cache_mutex);
  1580. #endif
  1581. return ret;
  1582. }
  1583. #ifdef ECC_CACHE_CURVE
  1584. int wc_ecc_curve_cache_init(void)
  1585. {
  1586. int ret = 0;
  1587. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1588. ret = wc_InitMutex(&ecc_curve_cache_mutex);
  1589. #endif
  1590. return ret;
  1591. }
  1592. void wc_ecc_curve_cache_free(void)
  1593. {
  1594. int x;
  1595. /* free all ECC curve caches */
  1596. for (x = 0; x < (int)ECC_SET_COUNT; x++) {
  1597. if (ecc_curve_spec_cache[x]) {
  1598. wc_ecc_curve_cache_free_spec(ecc_curve_spec_cache[x]);
  1599. XFREE(ecc_curve_spec_cache[x], NULL, DYNAMIC_TYPE_ECC);
  1600. ecc_curve_spec_cache[x] = NULL;
  1601. }
  1602. }
  1603. #if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED)
  1604. wc_FreeMutex(&ecc_curve_cache_mutex);
  1605. #endif
  1606. }
  1607. #endif /* ECC_CACHE_CURVE */
  1608. /* Retrieve the curve name for the ECC curve id.
  1609. *
  1610. * curve_id The id of the curve.
  1611. * returns the name stored from the curve if available, otherwise NULL.
  1612. */
  1613. const char* wc_ecc_get_name(int curve_id)
  1614. {
  1615. int curve_idx = wc_ecc_get_curve_idx(curve_id);
  1616. if (curve_idx == ECC_CURVE_INVALID)
  1617. return NULL;
  1618. return ecc_sets[curve_idx].name;
  1619. }
  1620. int wc_ecc_set_curve(ecc_key* key, int keysize, int curve_id)
  1621. {
  1622. if (key == NULL || (keysize <= 0 && curve_id < 0)) {
  1623. return BAD_FUNC_ARG;
  1624. }
  1625. if (keysize > ECC_MAXSIZE) {
  1626. return ECC_BAD_ARG_E;
  1627. }
  1628. /* handle custom case */
  1629. if (key->idx != ECC_CUSTOM_IDX) {
  1630. int x;
  1631. /* default values */
  1632. key->idx = 0;
  1633. key->dp = NULL;
  1634. /* find ecc_set based on curve_id or key size */
  1635. for (x = 0; ecc_sets[x].size != 0; x++) {
  1636. if (curve_id > ECC_CURVE_DEF) {
  1637. if (curve_id == ecc_sets[x].id)
  1638. break;
  1639. }
  1640. else if (keysize <= ecc_sets[x].size) {
  1641. break;
  1642. }
  1643. }
  1644. if (ecc_sets[x].size == 0) {
  1645. WOLFSSL_MSG("ECC Curve not found");
  1646. return ECC_CURVE_OID_E;
  1647. }
  1648. key->idx = x;
  1649. key->dp = &ecc_sets[x];
  1650. }
  1651. return 0;
  1652. }
  1653. #ifdef ALT_ECC_SIZE
  1654. static void alt_fp_init(mp_int* a)
  1655. {
  1656. a->size = FP_SIZE_ECC;
  1657. mp_zero(a);
  1658. }
  1659. #endif /* ALT_ECC_SIZE */
  1660. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  1661. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  1662. #if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_PUBLIC_ECC_ADD_DBL)
  1663. static int _ecc_projective_dbl_point(ecc_point *P, ecc_point *R, mp_int* a,
  1664. mp_int* modulus, mp_digit mp);
  1665. /**
  1666. Add two ECC points
  1667. P The point to add
  1668. Q The point to add
  1669. R [out] The destination of the double
  1670. a ECC curve parameter a
  1671. modulus The modulus of the field the ECC curve is in
  1672. mp The "b" value from montgomery_setup()
  1673. return MP_OKAY on success
  1674. */
  1675. static int _ecc_projective_add_point(ecc_point* P, ecc_point* Q, ecc_point* R,
  1676. mp_int* a, mp_int* modulus, mp_digit mp)
  1677. {
  1678. #if !defined(WOLFSSL_SP_MATH)
  1679. DECL_MP_INT_SIZE_DYN(t1, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  1680. DECL_MP_INT_SIZE_DYN(t2, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  1681. #ifdef ALT_ECC_SIZE
  1682. DECL_MP_INT_SIZE_DYN(rx, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  1683. DECL_MP_INT_SIZE_DYN(ry, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  1684. DECL_MP_INT_SIZE_DYN(rz, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  1685. #endif
  1686. mp_int *x, *y, *z;
  1687. int err;
  1688. /* if Q == R then swap P and Q, so we don't require a local x,y,z */
  1689. if (Q == R) {
  1690. ecc_point* tPt = P;
  1691. P = Q;
  1692. Q = tPt;
  1693. }
  1694. #ifdef WOLFSSL_SMALL_STACK
  1695. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1696. if (R->key != NULL) {
  1697. t1 = R->key->t1;
  1698. t2 = R->key->t2;
  1699. #ifdef ALT_ECC_SIZE
  1700. rx = R->key->x;
  1701. ry = R->key->y;
  1702. rz = R->key->z;
  1703. #endif
  1704. }
  1705. else
  1706. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  1707. #endif /* WOLFSSL_SMALL_STACK */
  1708. {
  1709. NEW_MP_INT_SIZE(t1, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  1710. NEW_MP_INT_SIZE(t2, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  1711. #ifdef MP_INT_SIZE_CHECK_NULL
  1712. if (t1 == NULL || t2 == NULL) {
  1713. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  1714. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  1715. return MEMORY_E;
  1716. }
  1717. #endif
  1718. #ifdef ALT_ECC_SIZE
  1719. NEW_MP_INT_SIZE(rx, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  1720. NEW_MP_INT_SIZE(ry, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  1721. NEW_MP_INT_SIZE(rz, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  1722. #ifdef MP_INT_SIZE_CHECK_NULL
  1723. if (rx == NULL || ry == NULL || rz == NULL) {
  1724. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  1725. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  1726. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  1727. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  1728. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  1729. return MEMORY_E;
  1730. }
  1731. #endif
  1732. #endif
  1733. }
  1734. err = INIT_MP_INT_SIZE(t1, mp_bitsused(modulus));
  1735. if (err == MP_OKAY) {
  1736. err = INIT_MP_INT_SIZE(t2, mp_bitsused(modulus));
  1737. }
  1738. if (err != MP_OKAY) {
  1739. #ifdef WOLFSSL_SMALL_STACK
  1740. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1741. if (R->key == NULL)
  1742. #endif
  1743. #endif
  1744. {
  1745. #ifdef ALT_ECC_SIZE
  1746. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  1747. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  1748. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  1749. #endif
  1750. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  1751. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  1752. }
  1753. return err;
  1754. }
  1755. /* should we dbl instead? */
  1756. if (err == MP_OKAY) {
  1757. #ifdef ECC_TIMING_RESISTANT
  1758. err = mp_submod_ct(modulus, Q->y, modulus, t1);
  1759. #else
  1760. err = mp_sub(modulus, Q->y, t1);
  1761. #endif
  1762. }
  1763. if (err == MP_OKAY) {
  1764. if ( (mp_cmp(P->x, Q->x) == MP_EQ) &&
  1765. (get_digit_count(Q->z) && mp_cmp(P->z, Q->z) == MP_EQ) &&
  1766. (mp_cmp(P->y, Q->y) == MP_EQ || mp_cmp(P->y, t1) == MP_EQ)) {
  1767. mp_clear(t1);
  1768. mp_clear(t2);
  1769. #ifdef WOLFSSL_SMALL_STACK
  1770. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1771. if (R->key == NULL)
  1772. #endif
  1773. #endif
  1774. {
  1775. #ifdef ALT_ECC_SIZE
  1776. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  1777. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  1778. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  1779. #endif
  1780. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  1781. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  1782. }
  1783. return _ecc_projective_dbl_point(P, R, a, modulus, mp);
  1784. }
  1785. }
  1786. if (err != MP_OKAY) {
  1787. goto done;
  1788. }
  1789. /* If use ALT_ECC_SIZE we need to use local stack variable since
  1790. ecc_point x,y,z is reduced size */
  1791. #ifdef ALT_ECC_SIZE
  1792. /* Use local stack variable */
  1793. x = rx;
  1794. y = ry;
  1795. z = rz;
  1796. err = INIT_MP_INT_SIZE(x, mp_bitsused(modulus));
  1797. if (err == MP_OKAY) {
  1798. err = INIT_MP_INT_SIZE(y, mp_bitsused(modulus));
  1799. }
  1800. if (err == MP_OKAY) {
  1801. err = INIT_MP_INT_SIZE(z, mp_bitsused(modulus));
  1802. }
  1803. if (err != MP_OKAY) {
  1804. goto done;
  1805. }
  1806. #else
  1807. /* Use destination directly */
  1808. x = R->x;
  1809. y = R->y;
  1810. z = R->z;
  1811. #endif
  1812. if (err == MP_OKAY)
  1813. err = mp_copy(P->x, x);
  1814. if (err == MP_OKAY)
  1815. err = mp_copy(P->y, y);
  1816. if (err == MP_OKAY)
  1817. err = mp_copy(P->z, z);
  1818. /* if Z is one then these are no-operations */
  1819. if (err == MP_OKAY) {
  1820. if (!mp_iszero(Q->z)) {
  1821. /* T1 = Z' * Z' */
  1822. err = mp_sqr(Q->z, t1);
  1823. if (err == MP_OKAY)
  1824. err = mp_montgomery_reduce(t1, modulus, mp);
  1825. /* X = X * T1 */
  1826. if (err == MP_OKAY)
  1827. err = mp_mul(t1, x, x);
  1828. if (err == MP_OKAY)
  1829. err = mp_montgomery_reduce(x, modulus, mp);
  1830. /* T1 = Z' * T1 */
  1831. if (err == MP_OKAY)
  1832. err = mp_mul(Q->z, t1, t1);
  1833. if (err == MP_OKAY)
  1834. err = mp_montgomery_reduce(t1, modulus, mp);
  1835. /* Y = Y * T1 */
  1836. if (err == MP_OKAY)
  1837. err = mp_mul(t1, y, y);
  1838. if (err == MP_OKAY)
  1839. err = mp_montgomery_reduce(y, modulus, mp);
  1840. }
  1841. }
  1842. /* T1 = Z*Z */
  1843. if (err == MP_OKAY)
  1844. err = mp_sqr(z, t1);
  1845. if (err == MP_OKAY)
  1846. err = mp_montgomery_reduce(t1, modulus, mp);
  1847. /* T2 = X' * T1 */
  1848. if (err == MP_OKAY)
  1849. err = mp_mul(Q->x, t1, t2);
  1850. if (err == MP_OKAY)
  1851. err = mp_montgomery_reduce(t2, modulus, mp);
  1852. /* T1 = Z * T1 */
  1853. if (err == MP_OKAY)
  1854. err = mp_mul(z, t1, t1);
  1855. if (err == MP_OKAY)
  1856. err = mp_montgomery_reduce(t1, modulus, mp);
  1857. /* T1 = Y' * T1 */
  1858. if (err == MP_OKAY)
  1859. err = mp_mul(Q->y, t1, t1);
  1860. if (err == MP_OKAY)
  1861. err = mp_montgomery_reduce(t1, modulus, mp);
  1862. /* Y = Y - T1 */
  1863. if (err == MP_OKAY)
  1864. err = mp_submod_ct(y, t1, modulus, y);
  1865. /* T1 = 2T1 */
  1866. if (err == MP_OKAY)
  1867. err = mp_addmod_ct(t1, t1, modulus, t1);
  1868. /* T1 = Y + T1 */
  1869. if (err == MP_OKAY)
  1870. err = mp_addmod_ct(t1, y, modulus, t1);
  1871. /* X = X - T2 */
  1872. if (err == MP_OKAY)
  1873. err = mp_submod_ct(x, t2, modulus, x);
  1874. /* T2 = 2T2 */
  1875. if (err == MP_OKAY)
  1876. err = mp_addmod_ct(t2, t2, modulus, t2);
  1877. /* T2 = X + T2 */
  1878. if (err == MP_OKAY)
  1879. err = mp_addmod_ct(t2, x, modulus, t2);
  1880. if (err == MP_OKAY) {
  1881. if (!mp_iszero(Q->z)) {
  1882. /* Z = Z * Z' */
  1883. err = mp_mul(z, Q->z, z);
  1884. if (err == MP_OKAY)
  1885. err = mp_montgomery_reduce(z, modulus, mp);
  1886. }
  1887. }
  1888. /* Z = Z * X */
  1889. if (err == MP_OKAY)
  1890. err = mp_mul(z, x, z);
  1891. if (err == MP_OKAY)
  1892. err = mp_montgomery_reduce(z, modulus, mp);
  1893. /* T1 = T1 * X */
  1894. if (err == MP_OKAY)
  1895. err = mp_mul(t1, x, t1);
  1896. if (err == MP_OKAY)
  1897. err = mp_montgomery_reduce(t1, modulus, mp);
  1898. /* X = X * X */
  1899. if (err == MP_OKAY)
  1900. err = mp_sqr(x, x);
  1901. if (err == MP_OKAY)
  1902. err = mp_montgomery_reduce(x, modulus, mp);
  1903. /* T2 = T2 * x */
  1904. if (err == MP_OKAY)
  1905. err = mp_mul(t2, x, t2);
  1906. if (err == MP_OKAY)
  1907. err = mp_montgomery_reduce(t2, modulus, mp);
  1908. /* T1 = T1 * X */
  1909. if (err == MP_OKAY)
  1910. err = mp_mul(t1, x, t1);
  1911. if (err == MP_OKAY)
  1912. err = mp_montgomery_reduce(t1, modulus, mp);
  1913. /* X = Y*Y */
  1914. if (err == MP_OKAY)
  1915. err = mp_sqr(y, x);
  1916. if (err == MP_OKAY)
  1917. err = mp_montgomery_reduce(x, modulus, mp);
  1918. /* X = X - T2 */
  1919. if (err == MP_OKAY)
  1920. err = mp_submod_ct(x, t2, modulus, x);
  1921. /* T2 = T2 - X */
  1922. if (err == MP_OKAY)
  1923. err = mp_submod_ct(t2, x, modulus, t2);
  1924. /* T2 = T2 - X */
  1925. if (err == MP_OKAY)
  1926. err = mp_submod_ct(t2, x, modulus, t2);
  1927. /* T2 = T2 * Y */
  1928. if (err == MP_OKAY)
  1929. err = mp_mul(t2, y, t2);
  1930. if (err == MP_OKAY)
  1931. err = mp_montgomery_reduce(t2, modulus, mp);
  1932. /* Y = T2 - T1 */
  1933. if (err == MP_OKAY)
  1934. err = mp_submod_ct(t2, t1, modulus, y);
  1935. /* Y = Y/2 */
  1936. if (err == MP_OKAY)
  1937. err = mp_div_2_mod_ct(y, modulus, y);
  1938. #ifdef ALT_ECC_SIZE
  1939. if (err == MP_OKAY)
  1940. err = mp_copy(x, R->x);
  1941. if (err == MP_OKAY)
  1942. err = mp_copy(y, R->y);
  1943. if (err == MP_OKAY)
  1944. err = mp_copy(z, R->z);
  1945. #endif
  1946. done:
  1947. /* clean up */
  1948. mp_clear(t1);
  1949. mp_clear(t2);
  1950. #ifdef WOLFSSL_SMALL_STACK
  1951. #ifdef WOLFSSL_SMALL_STACK_CACHE
  1952. if (R->key == NULL)
  1953. #endif
  1954. #endif
  1955. {
  1956. #ifdef ALT_ECC_SIZE
  1957. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  1958. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  1959. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  1960. #endif
  1961. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  1962. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  1963. }
  1964. return err;
  1965. #else
  1966. int modBits = mp_count_bits(modulus);
  1967. (void)a;
  1968. (void)mp;
  1969. #ifndef WOLFSSL_SP_NO_256
  1970. if (modBits == 256) {
  1971. return sp_ecc_proj_add_point_256(P->x, P->y, P->z, Q->x, Q->y, Q->z,
  1972. R->x, R->y, R->z);
  1973. }
  1974. #endif
  1975. #ifdef WOLFSSL_SP_384
  1976. if (modBits == 384) {
  1977. return sp_ecc_proj_add_point_384(P->x, P->y, P->z, Q->x, Q->y, Q->z,
  1978. R->x, R->y, R->z);
  1979. }
  1980. #endif
  1981. #ifdef WOLFSSL_SP_521
  1982. if (modBits == 521) {
  1983. return sp_ecc_proj_add_point_521(P->x, P->y, P->z, Q->x, Q->y, Q->z,
  1984. R->x, R->y, R->z);
  1985. }
  1986. #endif
  1987. return ECC_BAD_ARG_E;
  1988. #endif
  1989. }
  1990. int ecc_projective_add_point(ecc_point* P, ecc_point* Q, ecc_point* R,
  1991. mp_int* a, mp_int* modulus, mp_digit mp)
  1992. {
  1993. if (P == NULL || Q == NULL || R == NULL || modulus == NULL) {
  1994. return ECC_BAD_ARG_E;
  1995. }
  1996. if (mp_cmp(P->x, modulus) != MP_LT ||
  1997. mp_cmp(P->y, modulus) != MP_LT ||
  1998. mp_cmp(P->z, modulus) != MP_LT ||
  1999. mp_cmp(Q->x, modulus) != MP_LT ||
  2000. mp_cmp(Q->y, modulus) != MP_LT ||
  2001. mp_cmp(Q->z, modulus) != MP_LT) {
  2002. return ECC_OUT_OF_RANGE_E;
  2003. }
  2004. return _ecc_projective_add_point(P, Q, R, a, modulus, mp);
  2005. }
  2006. /* ### Point doubling in Jacobian coordinate system ###
  2007. *
  2008. * let us have a curve: y^2 = x^3 + a*x + b
  2009. * in Jacobian coordinates it becomes: y^2 = x^3 + a*x*z^4 + b*z^6
  2010. *
  2011. * The doubling of P = (Xp, Yp, Zp) is given by R = (Xr, Yr, Zr) where:
  2012. * Xr = M^2 - 2*S
  2013. * Yr = M * (S - Xr) - 8*T
  2014. * Zr = 2 * Yp * Zp
  2015. *
  2016. * M = 3 * Xp^2 + a*Zp^4
  2017. * T = Yp^4
  2018. * S = 4 * Xp * Yp^2
  2019. *
  2020. * SPECIAL CASE: when a == 3 we can compute M as
  2021. * M = 3 * (Xp^2 - Zp^4) = 3 * (Xp + Zp^2) * (Xp - Zp^2)
  2022. */
  2023. /**
  2024. Double an ECC point
  2025. P The point to double
  2026. R [out] The destination of the double
  2027. a ECC curve parameter a
  2028. modulus The modulus of the field the ECC curve is in
  2029. mp The "b" value from montgomery_setup()
  2030. return MP_OKAY on success
  2031. */
  2032. static int _ecc_projective_dbl_point(ecc_point *P, ecc_point *R, mp_int* a,
  2033. mp_int* modulus, mp_digit mp)
  2034. {
  2035. #if !defined(WOLFSSL_SP_MATH)
  2036. DECL_MP_INT_SIZE_DYN(t1, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2037. DECL_MP_INT_SIZE_DYN(t2, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2038. #ifdef ALT_ECC_SIZE
  2039. DECL_MP_INT_SIZE_DYN(rx, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2040. DECL_MP_INT_SIZE_DYN(ry, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2041. DECL_MP_INT_SIZE_DYN(rz, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2042. #endif
  2043. mp_int *x, *y, *z;
  2044. int err;
  2045. #ifdef WOLFSSL_SMALL_STACK
  2046. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2047. if (R->key != NULL) {
  2048. t1 = R->key->t1;
  2049. t2 = R->key->t2;
  2050. #ifdef ALT_ECC_SIZE
  2051. rx = R->key->x;
  2052. ry = R->key->y;
  2053. rz = R->key->z;
  2054. #endif
  2055. }
  2056. else
  2057. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  2058. #endif
  2059. {
  2060. NEW_MP_INT_SIZE(t1, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2061. NEW_MP_INT_SIZE(t2, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2062. #ifdef MP_INT_SIZE_CHECK_NULL
  2063. if (t1 == NULL || t2 == NULL) {
  2064. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2065. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2066. return MEMORY_E;
  2067. }
  2068. #endif
  2069. #ifdef ALT_ECC_SIZE
  2070. NEW_MP_INT_SIZE(rx, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2071. NEW_MP_INT_SIZE(ry, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2072. NEW_MP_INT_SIZE(rz, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2073. #ifdef MP_INT_SIZE_CHECK_NULL
  2074. if (rx == NULL || ry == NULL || rz == NULL) {
  2075. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2076. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2077. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2078. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2079. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2080. return MEMORY_E;
  2081. }
  2082. #endif
  2083. #endif
  2084. }
  2085. err = INIT_MP_INT_SIZE(t1, mp_bitsused(modulus));
  2086. if (err == MP_OKAY) {
  2087. err = INIT_MP_INT_SIZE(t2, mp_bitsused(modulus));
  2088. }
  2089. if (err != MP_OKAY) {
  2090. #ifdef WOLFSSL_SMALL_STACK
  2091. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2092. if (R->key == NULL)
  2093. #endif
  2094. #endif
  2095. {
  2096. #ifdef ALT_ECC_SIZE
  2097. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2098. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2099. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2100. #endif
  2101. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2102. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2103. }
  2104. return err;
  2105. }
  2106. /* If use ALT_ECC_SIZE we need to use local stack variable since
  2107. ecc_point x,y,z is reduced size */
  2108. #ifdef ALT_ECC_SIZE
  2109. /* Use local stack variable */
  2110. x = rx;
  2111. y = ry;
  2112. z = rz;
  2113. err = INIT_MP_INT_SIZE(x, mp_bitsused(modulus));
  2114. if (err == MP_OKAY) {
  2115. err = INIT_MP_INT_SIZE(y, mp_bitsused(modulus));
  2116. }
  2117. if (err == MP_OKAY) {
  2118. err = INIT_MP_INT_SIZE(z, mp_bitsused(modulus));
  2119. }
  2120. if (err != MP_OKAY) {
  2121. #ifdef WOLFSSL_SMALL_STACK
  2122. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2123. if (R->key == NULL)
  2124. #endif
  2125. #endif
  2126. {
  2127. #ifdef ALT_ECC_SIZE
  2128. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2129. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2130. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2131. #endif
  2132. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2133. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2134. }
  2135. return err;
  2136. }
  2137. #else
  2138. /* Use destination directly */
  2139. x = R->x;
  2140. y = R->y;
  2141. z = R->z;
  2142. #endif
  2143. if (err == MP_OKAY)
  2144. err = mp_copy(P->x, x);
  2145. if (err == MP_OKAY)
  2146. err = mp_copy(P->y, y);
  2147. if (err == MP_OKAY)
  2148. err = mp_copy(P->z, z);
  2149. /* T1 = Z * Z */
  2150. if (err == MP_OKAY)
  2151. err = mp_sqr(z, t1);
  2152. if (err == MP_OKAY)
  2153. err = mp_montgomery_reduce(t1, modulus, mp);
  2154. /* Z = Y * Z */
  2155. if (err == MP_OKAY)
  2156. err = mp_mul(z, y, z);
  2157. if (err == MP_OKAY)
  2158. err = mp_montgomery_reduce(z, modulus, mp);
  2159. /* Z = 2Z */
  2160. if (err == MP_OKAY)
  2161. err = mp_addmod_ct(z, z, modulus, z);
  2162. /* Determine if curve "a" should be used in calc */
  2163. #ifdef WOLFSSL_CUSTOM_CURVES
  2164. if (err == MP_OKAY) {
  2165. /* Use a and prime to determine if a == 3 */
  2166. err = mp_submod(modulus, a, modulus, t2);
  2167. }
  2168. if (err == MP_OKAY && mp_iszero((MP_INT_SIZE*)t2)) {
  2169. /* T2 = X * X */
  2170. if (err == MP_OKAY)
  2171. err = mp_sqr(x, t2);
  2172. if (err == MP_OKAY)
  2173. err = mp_montgomery_reduce(t2, modulus, mp);
  2174. /* T1 = T2 + T1 */
  2175. if (err == MP_OKAY)
  2176. err = mp_addmod_ct(t2, t2, modulus, t1);
  2177. /* T1 = T2 + T1 */
  2178. if (err == MP_OKAY)
  2179. err = mp_addmod_ct(t1, t2, modulus, t1);
  2180. }
  2181. else if (err == MP_OKAY && mp_cmp_d(t2, 3) != MP_EQ) {
  2182. /* use "a" in calc */
  2183. /* T2 = T1 * T1 */
  2184. if (err == MP_OKAY)
  2185. err = mp_sqr(t1, t2);
  2186. if (err == MP_OKAY)
  2187. err = mp_montgomery_reduce(t2, modulus, mp);
  2188. /* T1 = T2 * a */
  2189. if (err == MP_OKAY)
  2190. err = mp_mulmod(t2, a, modulus, t1);
  2191. /* T2 = X * X */
  2192. if (err == MP_OKAY)
  2193. err = mp_sqr(x, t2);
  2194. if (err == MP_OKAY)
  2195. err = mp_montgomery_reduce(t2, modulus, mp);
  2196. /* T1 = T2 + T1 */
  2197. if (err == MP_OKAY)
  2198. err = mp_addmod_ct(t1, t2, modulus, t1);
  2199. /* T1 = T2 + T1 */
  2200. if (err == MP_OKAY)
  2201. err = mp_addmod_ct(t1, t2, modulus, t1);
  2202. /* T1 = T2 + T1 */
  2203. if (err == MP_OKAY)
  2204. err = mp_addmod_ct(t1, t2, modulus, t1);
  2205. }
  2206. else
  2207. #endif /* WOLFSSL_CUSTOM_CURVES */
  2208. {
  2209. /* assumes "a" == 3 */
  2210. (void)a;
  2211. /* T2 = X - T1 */
  2212. if (err == MP_OKAY)
  2213. err = mp_submod_ct(x, t1, modulus, t2);
  2214. /* T1 = X + T1 */
  2215. if (err == MP_OKAY)
  2216. err = mp_addmod_ct(t1, x, modulus, t1);
  2217. /* T2 = T1 * T2 */
  2218. if (err == MP_OKAY)
  2219. err = mp_mul(t1, t2, t2);
  2220. if (err == MP_OKAY)
  2221. err = mp_montgomery_reduce(t2, modulus, mp);
  2222. /* T1 = 2T2 */
  2223. if (err == MP_OKAY)
  2224. err = mp_addmod_ct(t2, t2, modulus, t1);
  2225. /* T1 = T1 + T2 */
  2226. if (err == MP_OKAY)
  2227. err = mp_addmod_ct(t1, t2, modulus, t1);
  2228. }
  2229. /* Y = 2Y */
  2230. if (err == MP_OKAY)
  2231. err = mp_addmod_ct(y, y, modulus, y);
  2232. /* Y = Y * Y */
  2233. if (err == MP_OKAY)
  2234. err = mp_sqr(y, y);
  2235. if (err == MP_OKAY)
  2236. err = mp_montgomery_reduce(y, modulus, mp);
  2237. /* T2 = Y * Y */
  2238. if (err == MP_OKAY)
  2239. err = mp_sqr(y, t2);
  2240. if (err == MP_OKAY)
  2241. err = mp_montgomery_reduce(t2, modulus, mp);
  2242. /* T2 = T2/2 */
  2243. if (err == MP_OKAY)
  2244. err = mp_div_2_mod_ct(t2, modulus, t2);
  2245. /* Y = Y * X */
  2246. if (err == MP_OKAY)
  2247. err = mp_mul(y, x, y);
  2248. if (err == MP_OKAY)
  2249. err = mp_montgomery_reduce(y, modulus, mp);
  2250. /* X = T1 * T1 */
  2251. if (err == MP_OKAY)
  2252. err = mp_sqr(t1, x);
  2253. if (err == MP_OKAY)
  2254. err = mp_montgomery_reduce(x, modulus, mp);
  2255. /* X = X - Y */
  2256. if (err == MP_OKAY)
  2257. err = mp_submod_ct(x, y, modulus, x);
  2258. /* X = X - Y */
  2259. if (err == MP_OKAY)
  2260. err = mp_submod_ct(x, y, modulus, x);
  2261. /* Y = Y - X */
  2262. if (err == MP_OKAY)
  2263. err = mp_submod_ct(y, x, modulus, y);
  2264. /* Y = Y * T1 */
  2265. if (err == MP_OKAY)
  2266. err = mp_mul(y, t1, y);
  2267. if (err == MP_OKAY)
  2268. err = mp_montgomery_reduce(y, modulus, mp);
  2269. /* Y = Y - T2 */
  2270. if (err == MP_OKAY)
  2271. err = mp_submod_ct(y, t2, modulus, y);
  2272. #ifdef ALT_ECC_SIZE
  2273. if (err == MP_OKAY)
  2274. err = mp_copy(x, R->x);
  2275. if (err == MP_OKAY)
  2276. err = mp_copy(y, R->y);
  2277. if (err == MP_OKAY)
  2278. err = mp_copy(z, R->z);
  2279. #endif
  2280. /* clean up */
  2281. mp_clear(t1);
  2282. mp_clear(t2);
  2283. #ifdef WOLFSSL_SMALL_STACK
  2284. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2285. if (R->key == NULL)
  2286. #endif
  2287. #endif
  2288. {
  2289. #ifdef ALT_ECC_SIZE
  2290. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2291. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2292. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2293. #endif
  2294. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2295. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2296. }
  2297. return err;
  2298. #else
  2299. int modBits = mp_count_bits(modulus);
  2300. (void)a;
  2301. (void)mp;
  2302. #ifndef WOLFSSL_SP_NO_256
  2303. if (modBits == 256) {
  2304. return sp_ecc_proj_dbl_point_256(P->x, P->y, P->z, R->x, R->y, R->z);
  2305. }
  2306. #endif
  2307. #ifdef WOLFSSL_SP_384
  2308. if (modBits == 384) {
  2309. return sp_ecc_proj_dbl_point_384(P->x, P->y, P->z, R->x, R->y, R->z);
  2310. }
  2311. #endif
  2312. #ifdef WOLFSSL_SP_521
  2313. if (modBits == 521) {
  2314. return sp_ecc_proj_dbl_point_521(P->x, P->y, P->z, R->x, R->y, R->z);
  2315. }
  2316. #endif
  2317. return ECC_BAD_ARG_E;
  2318. #endif
  2319. }
  2320. int ecc_projective_dbl_point(ecc_point *P, ecc_point *R, mp_int* a,
  2321. mp_int* modulus, mp_digit mp)
  2322. {
  2323. if (P == NULL || R == NULL || modulus == NULL)
  2324. return ECC_BAD_ARG_E;
  2325. if (mp_cmp(P->x, modulus) != MP_LT ||
  2326. mp_cmp(P->y, modulus) != MP_LT ||
  2327. mp_cmp(P->z, modulus) != MP_LT) {
  2328. return ECC_OUT_OF_RANGE_E;
  2329. }
  2330. return _ecc_projective_dbl_point(P, R, a, modulus, mp);
  2331. }
  2332. #if !defined(FREESCALE_LTC_ECC) && !defined(WOLFSSL_STM32_PKA) && \
  2333. !defined(WOLFSSL_CRYPTOCELL)
  2334. /**
  2335. Map a projective Jacobian point back to affine space
  2336. P [in/out] The point to map
  2337. modulus The modulus of the field the ECC curve is in
  2338. mp The "b" value from montgomery_setup()
  2339. ct Operation should be constant time.
  2340. return MP_OKAY on success
  2341. */
  2342. int ecc_map_ex(ecc_point* P, mp_int* modulus, mp_digit mp, int ct)
  2343. {
  2344. #if !defined(WOLFSSL_SP_MATH)
  2345. DECL_MP_INT_SIZE_DYN(t1, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2346. DECL_MP_INT_SIZE_DYN(t2, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2347. #ifdef ALT_ECC_SIZE
  2348. DECL_MP_INT_SIZE_DYN(rx, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2349. DECL_MP_INT_SIZE_DYN(ry, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2350. DECL_MP_INT_SIZE_DYN(rz, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2351. #endif
  2352. mp_int *x, *y, *z;
  2353. int err;
  2354. (void)ct;
  2355. if (P == NULL || modulus == NULL)
  2356. return ECC_BAD_ARG_E;
  2357. /* special case for point at infinity */
  2358. if (mp_cmp_d(P->z, 0) == MP_EQ) {
  2359. err = mp_set(P->x, 0);
  2360. if (err == MP_OKAY)
  2361. err = mp_set(P->y, 0);
  2362. if (err == MP_OKAY)
  2363. err = mp_set(P->z, 1);
  2364. return err;
  2365. }
  2366. #ifdef WOLFSSL_SMALL_STACK
  2367. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2368. if (P->key != NULL) {
  2369. t1 = P->key->t1;
  2370. t2 = P->key->t2;
  2371. #ifdef ALT_ECC_SIZE
  2372. rx = P->key->x;
  2373. ry = P->key->y;
  2374. rz = P->key->z;
  2375. #endif
  2376. }
  2377. else
  2378. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  2379. #endif
  2380. {
  2381. NEW_MP_INT_SIZE(t1, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2382. NEW_MP_INT_SIZE(t2, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2383. #ifdef MP_INT_SIZE_CHECK_NULL
  2384. if (t1 == NULL || t2 == NULL) {
  2385. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2386. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2387. return MEMORY_E;
  2388. }
  2389. #endif
  2390. #ifdef ALT_ECC_SIZE
  2391. NEW_MP_INT_SIZE(rx, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2392. NEW_MP_INT_SIZE(ry, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2393. NEW_MP_INT_SIZE(rz, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2394. #ifdef MP_INT_SIZE_CHECK_NULL
  2395. if (rx == NULL || ry == NULL || rz == NULL) {
  2396. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2397. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2398. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2399. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2400. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2401. return MEMORY_E;
  2402. }
  2403. #endif
  2404. #endif
  2405. }
  2406. err = INIT_MP_INT_SIZE(t1, mp_bitsused(modulus));
  2407. if (err == MP_OKAY) {
  2408. err = INIT_MP_INT_SIZE(t2, mp_bitsused(modulus));
  2409. }
  2410. if (err != MP_OKAY) {
  2411. #ifdef WOLFSSL_SMALL_STACK
  2412. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2413. if (P->key == NULL)
  2414. #endif
  2415. #endif
  2416. {
  2417. #ifdef ALT_ECC_SIZE
  2418. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2419. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2420. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2421. #endif
  2422. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2423. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2424. }
  2425. return MEMORY_E;
  2426. }
  2427. #ifdef ALT_ECC_SIZE
  2428. /* Use local stack variable */
  2429. x = rx;
  2430. y = ry;
  2431. z = rz;
  2432. err = INIT_MP_INT_SIZE(x, mp_bitsused(modulus));
  2433. if (err == MP_OKAY) {
  2434. err = INIT_MP_INT_SIZE(y, mp_bitsused(modulus));
  2435. }
  2436. if (err == MP_OKAY) {
  2437. err = INIT_MP_INT_SIZE(z, mp_bitsused(modulus));
  2438. }
  2439. if (err != MP_OKAY) {
  2440. goto done;
  2441. }
  2442. if (err == MP_OKAY)
  2443. err = mp_copy(P->x, x);
  2444. if (err == MP_OKAY)
  2445. err = mp_copy(P->y, y);
  2446. if (err == MP_OKAY)
  2447. err = mp_copy(P->z, z);
  2448. if (err != MP_OKAY) {
  2449. goto done;
  2450. }
  2451. #else
  2452. /* Use destination directly */
  2453. x = P->x;
  2454. y = P->y;
  2455. z = P->z;
  2456. #endif
  2457. /* get 1/z */
  2458. if (err == MP_OKAY) {
  2459. #if defined(ECC_TIMING_RESISTANT) && (defined(USE_FAST_MATH) || \
  2460. defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL))
  2461. if (ct) {
  2462. err = mp_invmod_mont_ct(z, modulus, t1, mp);
  2463. if (err == MP_OKAY)
  2464. err = mp_montgomery_reduce(t1, modulus, mp);
  2465. }
  2466. else
  2467. #endif
  2468. {
  2469. /* first map z back to normal */
  2470. err = mp_montgomery_reduce(z, modulus, mp);
  2471. if (err == MP_OKAY)
  2472. err = mp_invmod(z, modulus, t1);
  2473. }
  2474. }
  2475. /* get 1/z^2 and 1/z^3 */
  2476. if (err == MP_OKAY)
  2477. err = mp_sqr(t1, t2);
  2478. if (err == MP_OKAY)
  2479. err = mp_mod(t2, modulus, t2);
  2480. if (err == MP_OKAY)
  2481. err = mp_mul(t1, t2, t1);
  2482. if (err == MP_OKAY)
  2483. err = mp_mod(t1, modulus, t1);
  2484. /* multiply against x/y */
  2485. if (err == MP_OKAY)
  2486. err = mp_mul(x, t2, x);
  2487. if (err == MP_OKAY)
  2488. err = mp_montgomery_reduce(x, modulus, mp);
  2489. if (err == MP_OKAY)
  2490. err = mp_mul(y, t1, y);
  2491. if (err == MP_OKAY)
  2492. err = mp_montgomery_reduce(y, modulus, mp);
  2493. if (err == MP_OKAY)
  2494. err = mp_set(z, 1);
  2495. #ifdef ALT_ECC_SIZE
  2496. /* return result */
  2497. if (err == MP_OKAY)
  2498. err = mp_copy(x, P->x);
  2499. if (err == MP_OKAY)
  2500. err = mp_copy(y, P->y);
  2501. if (err == MP_OKAY)
  2502. err = mp_copy(z, P->z);
  2503. done:
  2504. #endif
  2505. /* clean up */
  2506. mp_clear(t1);
  2507. mp_clear(t2);
  2508. #ifdef WOLFSSL_SMALL_STACK
  2509. #ifdef WOLFSSL_SMALL_STACK_CACHE
  2510. if (P->key == NULL)
  2511. #endif
  2512. #endif
  2513. {
  2514. #ifdef ALT_ECC_SIZE
  2515. FREE_MP_INT_SIZE(rz, NULL, DYNAMIC_TYPE_ECC);
  2516. FREE_MP_INT_SIZE(ry, NULL, DYNAMIC_TYPE_ECC);
  2517. FREE_MP_INT_SIZE(rx, NULL, DYNAMIC_TYPE_ECC);
  2518. #endif
  2519. FREE_MP_INT_SIZE(t2, NULL, DYNAMIC_TYPE_ECC);
  2520. FREE_MP_INT_SIZE(t1, NULL, DYNAMIC_TYPE_ECC);
  2521. }
  2522. return err;
  2523. #else
  2524. if (P == NULL || modulus == NULL)
  2525. return ECC_BAD_ARG_E;
  2526. (void)mp;
  2527. (void)ct;
  2528. #ifndef WOLFSSL_SP_NO_256
  2529. if (mp_count_bits(modulus) == 256) {
  2530. return sp_ecc_map_256(P->x, P->y, P->z);
  2531. }
  2532. #endif
  2533. #ifdef WOLFSSL_SP_384
  2534. if (mp_count_bits(modulus) == 384) {
  2535. return sp_ecc_map_384(P->x, P->y, P->z);
  2536. }
  2537. #endif
  2538. #ifdef WOLFSSL_SP_521
  2539. if (mp_count_bits(modulus) == 521) {
  2540. return sp_ecc_map_521(P->x, P->y, P->z);
  2541. }
  2542. #endif
  2543. return ECC_BAD_ARG_E;
  2544. #endif
  2545. }
  2546. #endif /* !FREESCALE_LTC_ECC && !WOLFSSL_STM32_PKA */
  2547. int ecc_map(ecc_point* P, mp_int* modulus, mp_digit mp)
  2548. {
  2549. return ecc_map_ex(P, modulus, mp, 0);
  2550. }
  2551. #endif /* !WOLFSSL_SP_MATH || WOLFSSL_PUBLIC_ECC_ADD_DBL */
  2552. #if !defined(FREESCALE_LTC_ECC) && !defined(WOLFSSL_STM32_PKA) && \
  2553. !defined(WOLFSSL_CRYPTOCELL)
  2554. #if !defined(WOLFSSL_SP_MATH)
  2555. #ifndef ECC_TIMING_RESISTANT
  2556. /* size of sliding window, don't change this! */
  2557. #define WINSIZE 4
  2558. #define M_POINTS 8
  2559. static int ecc_mulmod(const mp_int* k, ecc_point* tG, ecc_point* R,
  2560. ecc_point** M, mp_int* a, mp_int* modulus, mp_digit mp, WC_RNG* rng)
  2561. {
  2562. int err = MP_OKAY;
  2563. int i;
  2564. int first = 1, bitbuf = 0, bitcpy = 0, j;
  2565. int bitcnt = 0, mode = 0, digidx = 0;
  2566. mp_digit buf;
  2567. int infinity;
  2568. (void)rng;
  2569. /* calc the M tab, which holds kG for k==8..15 */
  2570. /* M[0] == 8G */
  2571. if (err == MP_OKAY)
  2572. err = ecc_projective_dbl_point_safe(tG, M[0], a, modulus, mp);
  2573. if (err == MP_OKAY)
  2574. err = ecc_projective_dbl_point_safe(M[0], M[0], a, modulus, mp);
  2575. if (err == MP_OKAY)
  2576. err = ecc_projective_dbl_point_safe(M[0], M[0], a, modulus, mp);
  2577. /* now find (8+k)G for k=1..7 */
  2578. if (err == MP_OKAY)
  2579. for (j = 9; j < 16; j++) {
  2580. err = ecc_projective_add_point_safe(M[j-9], tG, M[j-M_POINTS], a,
  2581. modulus, mp, &infinity);
  2582. if (err != MP_OKAY) break;
  2583. }
  2584. /* setup sliding window */
  2585. if (err == MP_OKAY) {
  2586. mode = 0;
  2587. bitcnt = 1;
  2588. buf = 0;
  2589. digidx = get_digit_count(k) - 1;
  2590. bitcpy = bitbuf = 0;
  2591. first = 1;
  2592. /* perform ops */
  2593. for (;;) {
  2594. /* grab next digit as required */
  2595. if (--bitcnt == 0) {
  2596. if (digidx == -1) {
  2597. break;
  2598. }
  2599. buf = get_digit(k, digidx);
  2600. bitcnt = (int) DIGIT_BIT;
  2601. --digidx;
  2602. }
  2603. /* grab the next msb from the ltiplicand */
  2604. i = (int)(buf >> (DIGIT_BIT - 1)) & 1;
  2605. buf <<= 1;
  2606. /* skip leading zero bits */
  2607. if (mode == 0 && i == 0)
  2608. continue;
  2609. /* if the bit is zero and mode == 1 then we double */
  2610. if (mode == 1 && i == 0) {
  2611. err = ecc_projective_dbl_point_safe(R, R, a, modulus, mp);
  2612. if (err != MP_OKAY) break;
  2613. continue;
  2614. }
  2615. /* else we add it to the window */
  2616. bitbuf |= (i << (WINSIZE - ++bitcpy));
  2617. mode = 2;
  2618. if (bitcpy == WINSIZE) {
  2619. /* if this is the first window we do a simple copy */
  2620. if (first == 1) {
  2621. /* R = kG [k = first window] */
  2622. err = mp_copy(M[bitbuf-M_POINTS]->x, R->x);
  2623. if (err != MP_OKAY) break;
  2624. err = mp_copy(M[bitbuf-M_POINTS]->y, R->y);
  2625. if (err != MP_OKAY) break;
  2626. err = mp_copy(M[bitbuf-M_POINTS]->z, R->z);
  2627. first = 0;
  2628. } else {
  2629. /* normal window */
  2630. /* ok window is filled so double as required and add */
  2631. /* double first */
  2632. for (j = 0; j < WINSIZE; j++) {
  2633. err = ecc_projective_dbl_point_safe(R, R, a, modulus,
  2634. mp);
  2635. if (err != MP_OKAY) break;
  2636. }
  2637. if (err != MP_OKAY) break; /* out of first for(;;) */
  2638. /* now add, bitbuf will be 8..15 [8..2^WINSIZE] guaranteed */
  2639. err = ecc_projective_add_point_safe(R, M[bitbuf-M_POINTS], R,
  2640. a, modulus, mp, &infinity);
  2641. }
  2642. if (err != MP_OKAY) break;
  2643. /* empty window and reset */
  2644. bitcpy = bitbuf = 0;
  2645. mode = 1;
  2646. }
  2647. }
  2648. }
  2649. /* if bits remain then double/add */
  2650. if (err == MP_OKAY) {
  2651. if (mode == 2 && bitcpy > 0) {
  2652. /* double then add */
  2653. for (j = 0; j < bitcpy; j++) {
  2654. /* only double if we have had at least one add first */
  2655. if (first == 0) {
  2656. err = ecc_projective_dbl_point_safe(R, R, a, modulus, mp);
  2657. if (err != MP_OKAY) break;
  2658. }
  2659. bitbuf <<= 1;
  2660. if ((bitbuf & (1 << WINSIZE)) != 0) {
  2661. if (first == 1) {
  2662. /* first add, so copy */
  2663. err = mp_copy(tG->x, R->x);
  2664. if (err != MP_OKAY) break;
  2665. err = mp_copy(tG->y, R->y);
  2666. if (err != MP_OKAY) break;
  2667. err = mp_copy(tG->z, R->z);
  2668. if (err != MP_OKAY) break;
  2669. first = 0;
  2670. } else {
  2671. /* then add */
  2672. err = ecc_projective_add_point_safe(R, tG, R, a, modulus,
  2673. mp, &infinity);
  2674. if (err != MP_OKAY) break;
  2675. }
  2676. }
  2677. }
  2678. }
  2679. }
  2680. #undef WINSIZE
  2681. return err;
  2682. }
  2683. #else
  2684. static int wc_ecc_gen_z(WC_RNG* rng, int size, ecc_point* p, mp_int* modulus,
  2685. mp_digit mp, mp_int* tx, mp_int* ty)
  2686. {
  2687. int err = MP_OKAY;
  2688. DECL_MP_INT_SIZE_DYN(mu, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  2689. NEW_MP_INT_SIZE(mu, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  2690. #ifdef MP_INT_SIZE_CHECK_NULL
  2691. if (mu == NULL)
  2692. err = MEMORY_E;
  2693. #endif
  2694. if (err == MP_OKAY)
  2695. err = INIT_MP_INT_SIZE(mu, mp_bitsused(modulus));
  2696. if (err == MP_OKAY)
  2697. err = mp_montgomery_calc_normalization(mu, modulus);
  2698. /* Generate random value to multiply into p->z. */
  2699. if (err == MP_OKAY)
  2700. err = wc_ecc_gen_k(rng, size, ty, modulus);
  2701. /* Convert to montogmery form. */
  2702. if (err == MP_OKAY)
  2703. err = mp_mulmod(ty, mu, modulus, ty);
  2704. /* Multiply random value into p->z. */
  2705. if (err == MP_OKAY)
  2706. err = mp_mul(p->z, ty, p->z);
  2707. if (err == MP_OKAY)
  2708. err = mp_montgomery_reduce(p->z, modulus, mp);
  2709. /* Square random value for X (X' = X / Z^2). */
  2710. if (err == MP_OKAY)
  2711. err = mp_sqr(ty, tx);
  2712. if (err == MP_OKAY)
  2713. err = mp_montgomery_reduce(tx, modulus, mp);
  2714. /* Multiply square of random by random value for Y. */
  2715. if (err == MP_OKAY)
  2716. err = mp_mul(ty, tx, ty);
  2717. if (err == MP_OKAY)
  2718. err = mp_montgomery_reduce(ty, modulus, mp);
  2719. /* Multiply square into X. */
  2720. if (err == MP_OKAY)
  2721. err = mp_mul(p->x, tx, p->x);
  2722. if (err == MP_OKAY)
  2723. err = mp_montgomery_reduce(p->x, modulus, mp);
  2724. /* Multiply cube into Y (Y' = Y / Z^3). */
  2725. if (err == MP_OKAY)
  2726. err = mp_mul(p->y, ty, p->y);
  2727. if (err == MP_OKAY)
  2728. err = mp_montgomery_reduce(p->y, modulus, mp);
  2729. mp_clear(mu);
  2730. FREE_MP_INT_SIZE(mu, NULL, DYNAMIC_TYPE_ECC);
  2731. return err;
  2732. }
  2733. #ifndef WC_PROTECT_ENCRYPTED_MEM
  2734. #define M_POINTS 3
  2735. /* Joye double-add ladder.
  2736. * "Highly Regular Right-to-Left Algorithms for Scalar Multiplication"
  2737. * by Marc Joye (2007)
  2738. *
  2739. * Algorithm 1':
  2740. * Input: P element of curve, k = (k[t-1],..., k[0]) base 2
  2741. * Output: Q = kP
  2742. * 1: R[0] = P; R[1] = P
  2743. * 2: for j = 1 to t-1 do
  2744. * 3: b = 1 - k[j]; R[b] = 2*R[b] + R[k[j]]
  2745. * 4: end for
  2746. * 5: b = k[0]; R[b] = R[b] - P
  2747. * 6: return R[0]
  2748. *
  2749. * Assumes: k < order.
  2750. */
  2751. static int ecc_mulmod(const mp_int* k, ecc_point* P, ecc_point* Q,
  2752. ecc_point** R, mp_int* a, mp_int* modulus, mp_digit mp, WC_RNG* rng)
  2753. {
  2754. int err = MP_OKAY;
  2755. int bytes = (mp_count_bits(modulus) + 7) / 8;
  2756. int i;
  2757. int j = 1;
  2758. int cnt = DIGIT_BIT;
  2759. int t = 0;
  2760. mp_digit b;
  2761. mp_digit v = 0;
  2762. mp_int* kt = R[2]->x;
  2763. #ifndef WC_NO_CACHE_RESISTANT
  2764. /* First bit always 1 (fix at end) and swap equals first bit */
  2765. int swap = 1;
  2766. #endif
  2767. int infinity;
  2768. /* Step 1: R[0] = P; R[1] = P */
  2769. /* R[0] = P */
  2770. if (err == MP_OKAY)
  2771. err = mp_copy(P->x, R[0]->x);
  2772. if (err == MP_OKAY)
  2773. err = mp_copy(P->y, R[0]->y);
  2774. if (err == MP_OKAY)
  2775. err = mp_copy(P->z, R[0]->z);
  2776. /* R[1] = P */
  2777. if (err == MP_OKAY)
  2778. err = mp_copy(P->x, R[1]->x);
  2779. if (err == MP_OKAY)
  2780. err = mp_copy(P->y, R[1]->y);
  2781. if (err == MP_OKAY)
  2782. err = mp_copy(P->z, R[1]->z);
  2783. /* Randomize z ordinates to obfuscate timing. */
  2784. if ((err == MP_OKAY) && (rng != NULL))
  2785. err = wc_ecc_gen_z(rng, bytes, R[0], modulus, mp, R[2]->x, R[2]->y);
  2786. if ((err == MP_OKAY) && (rng != NULL))
  2787. err = wc_ecc_gen_z(rng, bytes, R[1], modulus, mp, R[2]->x, R[2]->y);
  2788. if (err == MP_OKAY) {
  2789. /* Order could be one greater than the size of the modulus. */
  2790. t = mp_count_bits(modulus) + 1;
  2791. v = k->dp[0] >> 1;
  2792. if (cnt > t) {
  2793. cnt = t;
  2794. }
  2795. err = mp_copy(k, kt);
  2796. }
  2797. if (err == MP_OKAY) {
  2798. err = mp_grow(kt, (int)modulus->used + 1);
  2799. }
  2800. /* Step 2: for j = 1 to t-1 do */
  2801. for (i = 1; (err == MP_OKAY) && (i < t); i++) {
  2802. if (--cnt == 0) {
  2803. v = kt->dp[j++];
  2804. cnt = DIGIT_BIT;
  2805. }
  2806. /* Step 3: b = 1 - k[j]; R[b] = 2*R[b] + R[k[j]] */
  2807. b = v & 1;
  2808. v >>= 1;
  2809. #ifdef WC_NO_CACHE_RESISTANT
  2810. err = ecc_projective_dbl_point_safe(R[b^1], R[b^1], a, modulus, mp);
  2811. if (err == MP_OKAY) {
  2812. err = ecc_projective_add_point_safe(R[b^1], R[b], R[b^1], a,
  2813. modulus, mp, &infinity);
  2814. }
  2815. #else
  2816. /* Swap R[0] and R[1] if other index is needed. */
  2817. swap ^= (int)b;
  2818. if (err == MP_OKAY)
  2819. err = mp_cond_swap_ct(R[0]->x, R[1]->x, (int)modulus->used, swap);
  2820. if (err == MP_OKAY)
  2821. err = mp_cond_swap_ct(R[0]->y, R[1]->y, (int)modulus->used, swap);
  2822. if (err == MP_OKAY)
  2823. err = mp_cond_swap_ct(R[0]->z, R[1]->z, (int)modulus->used, swap);
  2824. swap = (int)b;
  2825. if (err == MP_OKAY)
  2826. err = ecc_projective_dbl_point_safe(R[0], R[0], a, modulus, mp);
  2827. if (err == MP_OKAY) {
  2828. err = ecc_projective_add_point_safe(R[0], R[1], R[0], a, modulus,
  2829. mp, &infinity);
  2830. }
  2831. #endif /* WC_NO_CACHE_RESISTANT */
  2832. }
  2833. /* Step 4: end for */
  2834. #ifndef WC_NO_CACHE_RESISTANT
  2835. /* Swap back if last bit is 0. */
  2836. swap ^= 1;
  2837. if (err == MP_OKAY)
  2838. err = mp_cond_swap_ct(R[0]->x, R[1]->x, (int)modulus->used, swap);
  2839. if (err == MP_OKAY)
  2840. err = mp_cond_swap_ct(R[0]->y, R[1]->y, (int)modulus->used, swap);
  2841. if (err == MP_OKAY)
  2842. err = mp_cond_swap_ct(R[0]->z, R[1]->z, (int)modulus->used, swap);
  2843. #endif
  2844. /* Step 5: b = k[0]; R[b] = R[b] - P */
  2845. /* R[2] = -P */
  2846. if (err == MP_OKAY)
  2847. err = mp_copy(P->x, R[2]->x);
  2848. if (err == MP_OKAY)
  2849. err = mp_sub(modulus, P->y, R[2]->y);
  2850. if (err == MP_OKAY)
  2851. err = mp_copy(P->z, R[2]->z);
  2852. /* Subtract point by adding negative. */
  2853. if (err == MP_OKAY) {
  2854. b = k->dp[0] & 1;
  2855. #ifdef WC_NO_CACHE_RESISTANT
  2856. err = ecc_projective_add_point_safe(R[b], R[2], R[b], a, modulus, mp,
  2857. &infinity);
  2858. #else
  2859. /* Swap R[0] and R[1], if necessary, to operate on the one we want. */
  2860. err = mp_cond_swap_ct(R[0]->x, R[1]->x, (int)modulus->used, (int)b);
  2861. if (err == MP_OKAY)
  2862. err = mp_cond_swap_ct(R[0]->y, R[1]->y, (int)modulus->used, (int)b);
  2863. if (err == MP_OKAY)
  2864. err = mp_cond_swap_ct(R[0]->z, R[1]->z, (int)modulus->used, (int)b);
  2865. if (err == MP_OKAY)
  2866. err = ecc_projective_add_point_safe(R[0], R[2], R[0], a, modulus,
  2867. mp, &infinity);
  2868. /* Swap back if necessary. */
  2869. if (err == MP_OKAY)
  2870. err = mp_cond_swap_ct(R[0]->x, R[1]->x, (int)modulus->used, (int)b);
  2871. if (err == MP_OKAY)
  2872. err = mp_cond_swap_ct(R[0]->y, R[1]->y, (int)modulus->used, (int)b);
  2873. if (err == MP_OKAY)
  2874. err = mp_cond_swap_ct(R[0]->z, R[1]->z, (int)modulus->used, (int)b);
  2875. #endif
  2876. }
  2877. /* Step 6: return R[0] */
  2878. if (err == MP_OKAY)
  2879. err = mp_copy(R[0]->x, Q->x);
  2880. if (err == MP_OKAY)
  2881. err = mp_copy(R[0]->y, Q->y);
  2882. if (err == MP_OKAY)
  2883. err = mp_copy(R[0]->z, Q->z);
  2884. return err;
  2885. }
  2886. #else
  2887. /* Number of points to allocate for use during scalar multiplication. */
  2888. #define M_POINTS 5
  2889. /* Last of the points is used as a temporary during calculations. */
  2890. #define TMP_IDX M_POINTS - 1
  2891. static void mp_cond_swap_into_ct(mp_int* ra, mp_int* rb, mp_int* a, mp_int* b,
  2892. int digits, int m)
  2893. {
  2894. int i;
  2895. #if !defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_SP_INT_NEGATIVE)
  2896. /* Only using positive numbers in ECC operations. */
  2897. ra->sign = 0;
  2898. rb->sign = 0;
  2899. #endif
  2900. /* Don't store 0 when mask is 0, it will be in a register. */
  2901. ra->used = (int)(((a->used ^ b->used) & ((mp_digit)0 - (m & 1))) ^ a->used);
  2902. rb->used = (int)(((a->used ^ b->used) & ((mp_digit)0 - (m & 1))) ^ b->used);
  2903. for (i = 0; i < digits; i++) {
  2904. ra->dp[i] = ((a->dp[i] ^ b->dp[i]) & ((mp_digit)0 - (m & 1))) ^
  2905. a->dp[i];
  2906. rb->dp[i] = ((a->dp[i] ^ b->dp[i]) & ((mp_digit)0 - (m & 1))) ^
  2907. b->dp[i];
  2908. }
  2909. }
  2910. static void ecc_cond_swap_into_ct(ecc_point* ra, ecc_point* rb, ecc_point* a,
  2911. ecc_point* b, int digits, int m)
  2912. {
  2913. /* Conditionally swap each ordinate. */
  2914. mp_cond_swap_into_ct(ra->x, rb->x, a->x, b->x, digits, m);
  2915. mp_cond_swap_into_ct(ra->y, rb->y, a->y, b->y, digits, m);
  2916. mp_cond_swap_into_ct(ra->z, rb->z, a->z, b->z, digits, m);
  2917. }
  2918. /* Joye double-add ladder.
  2919. * "Highly Regular Right-to-Left Algorithms for Scalar Multiplication"
  2920. * by Marc Joye (2007)
  2921. *
  2922. * Algorithm 1':
  2923. * Input: P element of curve, k = (k[t-1],..., k[0]) base 2
  2924. * Output: Q = kP
  2925. * 1: R[0] = P; R[1] = P
  2926. * 2: for j = 1 to t-1 do
  2927. * 3: b = 1 - k[j]; R[b] = 2*R[b] + R[k[j]]
  2928. * 4: end for
  2929. * 5: b = k[0]; R[b] = R[b] - P
  2930. * 6: return R[0]
  2931. *
  2932. * Assumes: k < order.
  2933. */
  2934. static int ecc_mulmod(const mp_int* k, ecc_point* P, ecc_point* Q,
  2935. ecc_point** R, mp_int* a, mp_int* modulus, mp_digit mp, WC_RNG* rng)
  2936. {
  2937. int err = MP_OKAY;
  2938. int bytes = (mp_count_bits(modulus) + 7) / 8;
  2939. int i;
  2940. int j = 1;
  2941. int cnt;
  2942. int t = 0;
  2943. mp_int* kt = R[TMP_IDX]->x;
  2944. /* First bit always 1 (fix at end) and swap equals first bit */
  2945. register int swap = 1;
  2946. /* Which pair of points has current value. R[0,1] or R[2,3] */
  2947. int set = 0;
  2948. int infinity;
  2949. /* Step 1: R[0] = P; R[1] = P */
  2950. /* R[0] = P */
  2951. if (err == MP_OKAY)
  2952. err = mp_copy(P->x, R[0]->x);
  2953. if (err == MP_OKAY)
  2954. err = mp_copy(P->y, R[0]->y);
  2955. if (err == MP_OKAY)
  2956. err = mp_copy(P->z, R[0]->z);
  2957. /* R[1] = P */
  2958. if (err == MP_OKAY)
  2959. err = mp_copy(P->x, R[1]->x);
  2960. if (err == MP_OKAY)
  2961. err = mp_copy(P->y, R[1]->y);
  2962. if (err == MP_OKAY)
  2963. err = mp_copy(P->z, R[1]->z);
  2964. /* Randomize z ordinates to obfuscate timing. */
  2965. if ((err == MP_OKAY) && (rng != NULL))
  2966. err = wc_ecc_gen_z(rng, bytes, R[0], modulus, mp, R[TMP_IDX]->x,
  2967. R[TMP_IDX]->y);
  2968. if ((err == MP_OKAY) && (rng != NULL))
  2969. err = wc_ecc_gen_z(rng, bytes, R[1], modulus, mp, R[TMP_IDX]->x,
  2970. R[TMP_IDX]->y);
  2971. if (err == MP_OKAY) {
  2972. /* Order could be one greater than the size of the modulus. */
  2973. t = mp_count_bits(modulus) + 1;
  2974. err = mp_copy(k, kt);
  2975. }
  2976. if (err == MP_OKAY) {
  2977. err = mp_grow(kt, modulus->used + 1);
  2978. }
  2979. /* Step 2: for j = 1 to t-1 do */
  2980. for (i = 1, j = 0, cnt = 0; (err == MP_OKAY) && (i < t); i++) {
  2981. if (++cnt == DIGIT_BIT) {
  2982. j++;
  2983. cnt = 0;
  2984. }
  2985. /* Step 3: b = 1 - k[j]; R[b] = 2*R[b] + R[k[j]] */
  2986. /* Swap R[0] and R[1] if other index is needed. */
  2987. /* Ensure 'swap' changes when shifted word is 0. */
  2988. swap += (kt->dp[j] >> cnt) + 2;
  2989. ecc_cond_swap_into_ct(R[(2 - set) + 0], R[(2 - set) + 1],
  2990. R[set + 0], R[set + 1], modulus->used, swap);
  2991. /* Change to operate on set copied into. */
  2992. set = 2 - set;
  2993. /* Ensure 'swap' changes to a previously unseen value. */
  2994. swap += (kt->dp[j] >> cnt) + swap;
  2995. /* R[0] = 2*R[0] */
  2996. err = ecc_projective_dbl_point_safe(R[set + 0], R[set + 0], a, modulus,
  2997. mp);
  2998. if (err == MP_OKAY) {
  2999. /* R[0] = R[1] + R[0] */
  3000. err = ecc_projective_add_point_safe(R[set + 0], R[set + 1],
  3001. R[set + 0], a, modulus, mp, &infinity);
  3002. }
  3003. /* R[1]->z * 2 - same point. */
  3004. mp_addmod_ct(R[set + 1]->z, R[set + 1]->z, modulus, R[set + 1]->z);
  3005. mp_addmod_ct(R[set + 1]->x, R[set + 1]->x, modulus, R[set + 1]->x);
  3006. mp_addmod_ct(R[set + 1]->x, R[set + 1]->x, modulus, R[set + 1]->x);
  3007. mp_addmod_ct(R[set + 1]->y, R[set + 1]->y, modulus, R[set + 1]->y);
  3008. mp_addmod_ct(R[set + 1]->y, R[set + 1]->y, modulus, R[set + 1]->y);
  3009. mp_addmod_ct(R[set + 1]->y, R[set + 1]->y, modulus, R[set + 1]->y);
  3010. }
  3011. /* Step 4: end for */
  3012. /* Swap back if last bit is 0. */
  3013. /* Ensure 'swap' changes. */
  3014. swap += 1;
  3015. if (err == MP_OKAY) {
  3016. ecc_cond_swap_into_ct(R[(2 - set) + 0], R[(2 - set) + 1],
  3017. R[set + 0], R[set + 1], modulus->used, swap);
  3018. set = 2 - set;
  3019. }
  3020. /* Step 5: b = k[0]; R[b] = R[b] - P */
  3021. /* R[TMP_IDX] = -P */
  3022. if (err == MP_OKAY)
  3023. err = mp_copy(P->x, R[TMP_IDX]->x);
  3024. if (err == MP_OKAY)
  3025. err = mp_sub(modulus, P->y, R[TMP_IDX]->y);
  3026. if (err == MP_OKAY)
  3027. err = mp_copy(P->z, R[TMP_IDX]->z);
  3028. /* Subtract point by adding negative. */
  3029. if (err == MP_OKAY) {
  3030. /* Swap R[0] and R[1], if necessary, to operate on the one we want.
  3031. * Last bit of k->dp[0] is being used to make decision to swap.
  3032. */
  3033. ecc_cond_swap_into_ct(R[(2 - set) + 0], R[(2 - set) + 1],
  3034. R[set + 0], R[set + 1], modulus->used,
  3035. (int)k->dp[0]);
  3036. set = 2 - set;
  3037. err = ecc_projective_add_point_safe(R[set + 0], R[TMP_IDX], R[set + 0],
  3038. a, modulus, mp, &infinity);
  3039. /* Swap back if necessary. */
  3040. if (err == MP_OKAY) {
  3041. ecc_cond_swap_into_ct(R[(2 - set) + 0], R[(2 - set) + 1],
  3042. R[set + 0], R[set + 1], modulus->used,
  3043. (int)k->dp[0]);
  3044. set = 2 - set;
  3045. }
  3046. }
  3047. /* Step 6: return R[0] */
  3048. if (err == MP_OKAY)
  3049. err = mp_copy(R[set + 0]->x, Q->x);
  3050. if (err == MP_OKAY)
  3051. err = mp_copy(R[set + 0]->y, Q->y);
  3052. if (err == MP_OKAY)
  3053. err = mp_copy(R[set + 0]->z, Q->z);
  3054. return err;
  3055. }
  3056. #endif
  3057. #endif
  3058. /* Convert the point to montgomery form.
  3059. *
  3060. * @param [in] p Point to convert.
  3061. * @param [out] r Point in montgomery form.
  3062. * @param [in] modulus Modulus of ordinates.
  3063. * @return 0 on success.
  3064. * @return -ve on failure.
  3065. */
  3066. static int ecc_point_to_mont(ecc_point* p, ecc_point* r, mp_int* modulus,
  3067. void* heap)
  3068. {
  3069. int err = MP_OKAY;
  3070. DECL_MP_INT_SIZE_DYN(mu, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  3071. (void)heap;
  3072. NEW_MP_INT_SIZE(mu, mp_bitsused(modulus), heap, DYNAMIC_TYPE_ECC);
  3073. #ifdef MP_INT_SIZE_CHECK_NULL
  3074. if (mu == NULL)
  3075. err = MEMORY_E;
  3076. #endif
  3077. if (err == MP_OKAY)
  3078. err = INIT_MP_INT_SIZE(mu, mp_bitsused(modulus));
  3079. if (err == MP_OKAY) {
  3080. err = mp_montgomery_calc_normalization(mu, modulus);
  3081. if (err == MP_OKAY) {
  3082. if (mp_cmp_d(mu, 1) == MP_EQ) {
  3083. err = mp_copy(p->x, r->x);
  3084. if (err == MP_OKAY)
  3085. err = mp_copy(p->y, r->y);
  3086. if (err == MP_OKAY)
  3087. err = mp_copy(p->z, r->z);
  3088. }
  3089. else {
  3090. err = mp_mulmod(p->x, mu, modulus, r->x);
  3091. if (err == MP_OKAY)
  3092. err = mp_mulmod(p->y, mu, modulus, r->y);
  3093. if (err == MP_OKAY)
  3094. err = mp_mulmod(p->z, mu, modulus, r->z);
  3095. }
  3096. }
  3097. mp_clear(mu);
  3098. }
  3099. FREE_MP_INT_SIZE(mu, heap, DYNAMIC_TYPE_ECC);
  3100. return err;
  3101. }
  3102. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3103. static int ecc_key_tmp_init(ecc_key* key, void* heap)
  3104. {
  3105. int err = MP_OKAY;
  3106. (void)heap;
  3107. if (key == NULL) {
  3108. return ECC_BAD_ARG_E;
  3109. }
  3110. XMEMSET(key, 0, sizeof(*key));
  3111. #if defined(WOLFSSL_SP_MATH_ALL) && defined(WOLFSSL_SMALL_STACK)
  3112. NEW_MP_INT_SIZE(key->t1, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC);
  3113. NEW_MP_INT_SIZE(key->t2, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC);
  3114. #ifdef ALT_ECC_SIZE
  3115. NEW_MP_INT_SIZE(key->x, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC);
  3116. NEW_MP_INT_SIZE(key->y, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC);
  3117. NEW_MP_INT_SIZE(key->z, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC);
  3118. #endif
  3119. if (key->t1 == NULL || key->t2 == NULL
  3120. #ifdef ALT_ECC_SIZE
  3121. || key->x == NULL || key->y == NULL || key->z == NULL
  3122. #endif
  3123. ) {
  3124. err = MEMORY_E;
  3125. }
  3126. if (err == 0) {
  3127. err = INIT_MP_INT_SIZE(key->t1, ECC_KEY_MAX_BITS(key));
  3128. }
  3129. if (err == 0) {
  3130. err = INIT_MP_INT_SIZE(key->t2, ECC_KEY_MAX_BITS(key));
  3131. }
  3132. #ifdef ALT_ECC_SIZE
  3133. if (err == 0) {
  3134. err = INIT_MP_INT_SIZE(key->x, ECC_KEY_MAX_BITS(key));
  3135. }
  3136. if (err == 0) {
  3137. err = INIT_MP_INT_SIZE(key->y, ECC_KEY_MAX_BITS(key));
  3138. }
  3139. if (err == 0) {
  3140. err = INIT_MP_INT_SIZE(key->z, ECC_KEY_MAX_BITS(key));
  3141. }
  3142. #endif
  3143. #else
  3144. key->t1 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  3145. key->t2 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  3146. #ifdef ALT_ECC_SIZE
  3147. key->x = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  3148. key->y = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  3149. key->z = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  3150. #endif
  3151. if (key->t1 == NULL || key->t2 == NULL
  3152. #ifdef ALT_ECC_SIZE
  3153. || key->x == NULL || key->y == NULL || key->z == NULL
  3154. #endif
  3155. ) {
  3156. err = MEMORY_E;
  3157. }
  3158. #endif
  3159. return err;
  3160. }
  3161. static void ecc_key_tmp_final(ecc_key* key, void* heap)
  3162. {
  3163. (void)heap;
  3164. #if defined(WOLFSSL_SP_MATH_ALL) && defined(WOLFSSL_SMALL_STACK)
  3165. #ifdef ALT_ECC_SIZE
  3166. FREE_MP_INT_SIZE(key->z, heap, DYNAMIC_TYPE_ECC);
  3167. FREE_MP_INT_SIZE(key->y, heap, DYNAMIC_TYPE_ECC);
  3168. FREE_MP_INT_SIZE(key->x, heap, DYNAMIC_TYPE_ECC);
  3169. #endif
  3170. FREE_MP_INT_SIZE(key->t2, heap, DYNAMIC_TYPE_ECC);
  3171. FREE_MP_INT_SIZE(key->t1, heap, DYNAMIC_TYPE_ECC);
  3172. #else
  3173. #ifdef ALT_ECC_SIZE
  3174. if (key->z != NULL)
  3175. XFREE(key->z, heap, DYNAMIC_TYPE_ECC);
  3176. if (key->y != NULL)
  3177. XFREE(key->y, heap, DYNAMIC_TYPE_ECC);
  3178. if (key->x != NULL)
  3179. XFREE(key->x, heap, DYNAMIC_TYPE_ECC);
  3180. #endif
  3181. if (key->t2 != NULL)
  3182. XFREE(key->t2, heap, DYNAMIC_TYPE_ECC);
  3183. if (key->t1 != NULL)
  3184. XFREE(key->t1, heap, DYNAMIC_TYPE_ECC);
  3185. #endif
  3186. }
  3187. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  3188. #endif /* !WOLFSSL_SP_MATH */
  3189. #if !defined(WOLFSSL_SP_MATH) || !defined(FP_ECC)
  3190. /**
  3191. Perform a point multiplication
  3192. k The scalar to multiply by
  3193. G The base point
  3194. R [out] Destination for kG
  3195. a ECC curve parameter a
  3196. modulus The modulus of the field the ECC curve is in
  3197. map Boolean whether to map back to affine or not
  3198. (1==map, 0 == leave in projective)
  3199. return MP_OKAY on success
  3200. */
  3201. #ifdef FP_ECC
  3202. static int normal_ecc_mulmod(const mp_int* k, ecc_point *G, ecc_point *R,
  3203. mp_int* a, mp_int* modulus, WC_RNG* rng, int map,
  3204. void* heap)
  3205. #else
  3206. int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  3207. mp_int* modulus, int map, void* heap)
  3208. #endif
  3209. #if !defined(WOLFSSL_SP_MATH)
  3210. {
  3211. ecc_point *tG, *M[M_POINTS];
  3212. #ifdef WOLFSSL_NO_MALLOC
  3213. ecc_point lcl_tG, lcl_M[M_POINTS];
  3214. #endif
  3215. int i, err;
  3216. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3217. ecc_key *key = (ecc_key *)XMALLOC(sizeof(*key), heap, DYNAMIC_TYPE_ECC);
  3218. #endif
  3219. mp_digit mp;
  3220. /* init variables */
  3221. tG = NULL;
  3222. XMEMSET(M, 0, sizeof(M));
  3223. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  3224. err = ECC_BAD_ARG_E;
  3225. goto exit;
  3226. }
  3227. /* k can't have more bits than modulus count plus 1 */
  3228. if (mp_count_bits(k) > mp_count_bits(modulus) + 1) {
  3229. err = ECC_OUT_OF_RANGE_E;
  3230. goto exit;
  3231. }
  3232. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3233. if (key == NULL) {
  3234. err = MP_MEM;
  3235. goto exit;
  3236. }
  3237. err = ecc_key_tmp_init(key, heap);
  3238. if (err != MP_OKAY)
  3239. goto exit;
  3240. R->key = key;
  3241. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  3242. /* alloc ram for window temps */
  3243. for (i = 0; i < M_POINTS; i++) {
  3244. #ifdef WOLFSSL_NO_MALLOC
  3245. M[i] = &lcl_M[i];
  3246. #endif
  3247. err = wc_ecc_new_point_ex(&M[i], heap);
  3248. if (err != MP_OKAY) {
  3249. goto exit;
  3250. }
  3251. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3252. M[i]->key = key;
  3253. #endif
  3254. }
  3255. /* make a copy of G in case R==G */
  3256. #ifdef WOLFSSL_NO_MALLOC
  3257. tG = &lcl_tG;
  3258. #endif
  3259. err = wc_ecc_new_point_ex(&tG, heap);
  3260. if (err != MP_OKAY) {
  3261. goto exit;
  3262. }
  3263. if ((err = ecc_point_to_mont(G, tG, modulus, heap)) != MP_OKAY) {
  3264. goto exit;
  3265. }
  3266. /* init montgomery reduction */
  3267. if ((err = mp_montgomery_setup(modulus, &mp)) != MP_OKAY) {
  3268. goto exit;
  3269. }
  3270. #ifdef FP_ECC
  3271. err = ecc_mulmod(k, tG, R, M, a, modulus, mp, rng);
  3272. #else
  3273. err = ecc_mulmod(k, tG, R, M, a, modulus, mp, NULL);
  3274. #endif
  3275. /* map R back from projective space */
  3276. if (err == MP_OKAY && map)
  3277. err = ecc_map(R, modulus, mp);
  3278. exit:
  3279. /* done */
  3280. wc_ecc_del_point_ex(tG, heap);
  3281. for (i = 0; i < M_POINTS; i++) {
  3282. wc_ecc_del_point_ex(M[i], heap);
  3283. }
  3284. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3285. if (key) {
  3286. if (R)
  3287. R->key = NULL;
  3288. if (err == MP_OKAY)
  3289. ecc_key_tmp_final(key, heap);
  3290. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  3291. }
  3292. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  3293. return err;
  3294. }
  3295. #else
  3296. {
  3297. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  3298. return ECC_BAD_ARG_E;
  3299. }
  3300. (void)a;
  3301. /* For supported curves the order is the same length in bits as the modulus.
  3302. * Can't have more than order bits for the scalar.
  3303. */
  3304. if (mp_count_bits(k) > mp_count_bits(modulus)) {
  3305. return ECC_OUT_OF_RANGE_E;
  3306. }
  3307. if (mp_count_bits(G->x) > mp_count_bits(modulus) ||
  3308. mp_count_bits(G->y) > mp_count_bits(modulus) ||
  3309. mp_count_bits(G->z) > mp_count_bits(modulus)) {
  3310. return IS_POINT_E;
  3311. }
  3312. #ifdef WOLFSSL_HAVE_SP_ECC
  3313. #ifndef WOLFSSL_SP_NO_256
  3314. if (mp_count_bits(modulus) == 256) {
  3315. return sp_ecc_mulmod_256(k, G, R, map, heap);
  3316. }
  3317. #endif
  3318. #ifdef WOLFSSL_SP_384
  3319. if (mp_count_bits(modulus) == 384) {
  3320. return sp_ecc_mulmod_384(k, G, R, map, heap);
  3321. }
  3322. #endif
  3323. #ifdef WOLFSSL_SP_521
  3324. if (mp_count_bits(modulus) == 521) {
  3325. return sp_ecc_mulmod_521(k, G, R, map, heap);
  3326. }
  3327. #endif
  3328. #else
  3329. (void)map;
  3330. (void)map;
  3331. (void)heap;
  3332. #endif
  3333. return ECC_BAD_ARG_E;
  3334. }
  3335. #endif
  3336. #endif /* !WOLFSSL_SP_MATH || !FP_ECC */
  3337. #ifndef FP_ECC
  3338. #if !defined(WOLFSSL_SP_MATH)
  3339. #ifdef ECC_TIMING_RESISTANT
  3340. static int ecc_check_order_minus_1(const mp_int* k, ecc_point* tG, ecc_point* R,
  3341. mp_int* modulus, mp_int* order)
  3342. {
  3343. int err;
  3344. DECL_MP_INT_SIZE_DYN(t, mp_bitsused(order), MAX_ECC_BITS_USE);
  3345. NEW_MP_INT_SIZE(t, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC);
  3346. #ifdef MP_INT_SIZE_CHECK_NULL
  3347. if (t == NULL) {
  3348. err = MEMORY_E;
  3349. }
  3350. else
  3351. #endif
  3352. {
  3353. err = INIT_MP_INT_SIZE(t, mp_bitsused(modulus));
  3354. }
  3355. if (err == MP_OKAY) {
  3356. /* Check for k == order - 1. Result will be 0 point which is not correct
  3357. * Calculates order / 2 and adds order / 2 + 1 and gets infinity.
  3358. * (with constant time implementation)
  3359. */
  3360. err = mp_sub_d(order, 1, t);
  3361. if (err == MP_OKAY) {
  3362. int kIsMinusOne = (mp_cmp((mp_int*)k, t) == MP_EQ);
  3363. err = mp_cond_copy(tG->x, kIsMinusOne, R->x);
  3364. if (err == MP_OKAY) {
  3365. err = mp_sub(modulus, tG->y, t);
  3366. }
  3367. if (err == MP_OKAY) {
  3368. err = mp_cond_copy(t, kIsMinusOne, R->y);
  3369. }
  3370. if (err == MP_OKAY) {
  3371. err = mp_cond_copy(tG->z, kIsMinusOne, R->z);
  3372. }
  3373. }
  3374. mp_free(t);
  3375. }
  3376. FREE_MP_INT_SIZE(t, NULL, DYNAMIC_TYPE_ECC);
  3377. return err;
  3378. }
  3379. #endif /* ECC_TIMING_RESISTANT */
  3380. #endif
  3381. /**
  3382. Perform a point multiplication
  3383. k The scalar to multiply by
  3384. G The base point
  3385. R [out] Destination for kG
  3386. a ECC curve parameter a
  3387. modulus The modulus of the field the ECC curve is in
  3388. map Boolean whether to map back to affine or not
  3389. (1==map, 0 == leave in projective)
  3390. return MP_OKAY on success
  3391. */
  3392. int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point* G, ecc_point* R, mp_int* a,
  3393. mp_int* modulus, mp_int* order, WC_RNG* rng, int map,
  3394. void* heap)
  3395. #if !defined(WOLFSSL_SP_MATH)
  3396. {
  3397. ecc_point *tG, *M[M_POINTS];
  3398. #ifdef WOLFSSL_NO_MALLOC
  3399. ecc_point lcl_tG, lcl_M[M_POINTS];
  3400. #endif
  3401. int i, err;
  3402. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3403. ecc_key key;
  3404. #endif
  3405. mp_digit mp;
  3406. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  3407. return ECC_BAD_ARG_E;
  3408. }
  3409. #ifdef HAVE_ECC_CDH
  3410. if (mp_count_bits(modulus) > mp_count_bits(order)) {
  3411. if (mp_count_bits(k) > mp_count_bits(modulus)) {
  3412. return ECC_OUT_OF_RANGE_E;
  3413. }
  3414. }
  3415. else
  3416. #endif
  3417. /* k can't have more bits than order */
  3418. if (mp_count_bits(k) > mp_count_bits(order)) {
  3419. return ECC_OUT_OF_RANGE_E;
  3420. }
  3421. /* init variables */
  3422. tG = NULL;
  3423. XMEMSET(M, 0, sizeof(M));
  3424. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3425. err = ecc_key_tmp_init(&key, heap);
  3426. if (err != MP_OKAY)
  3427. goto exit;
  3428. R->key = &key;
  3429. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  3430. /* alloc ram for window temps */
  3431. for (i = 0; i < M_POINTS; i++) {
  3432. #ifdef WOLFSSL_NO_MALLOC
  3433. M[i] = &lcl_M[i];
  3434. #endif
  3435. err = wc_ecc_new_point_ex(&M[i], heap);
  3436. if (err != MP_OKAY) {
  3437. goto exit;
  3438. }
  3439. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3440. M[i]->key = &key;
  3441. #endif
  3442. }
  3443. /* make a copy of G in case R==G */
  3444. #ifdef WOLFSSL_NO_MALLOC
  3445. tG = &lcl_tG;
  3446. #endif
  3447. err = wc_ecc_new_point_ex(&tG, heap);
  3448. if (err != MP_OKAY) {
  3449. goto exit;
  3450. }
  3451. if ((err = ecc_point_to_mont(G, tG, modulus, heap)) != MP_OKAY) {
  3452. goto exit;
  3453. }
  3454. /* init montgomery reduction */
  3455. if ((err = mp_montgomery_setup(modulus, &mp)) != MP_OKAY) {
  3456. goto exit;
  3457. }
  3458. err = ecc_mulmod(k, tG, R, M, a, modulus, mp, rng);
  3459. #ifdef ECC_TIMING_RESISTANT
  3460. if (err == MP_OKAY) {
  3461. err = ecc_check_order_minus_1(k, tG, R, modulus, order);
  3462. }
  3463. #else
  3464. (void)order;
  3465. #endif
  3466. /* map R back from projective space */
  3467. if (err == MP_OKAY && map)
  3468. err = ecc_map(R, modulus, mp);
  3469. exit:
  3470. /* done */
  3471. wc_ecc_del_point_ex(tG, heap);
  3472. for (i = 0; i < M_POINTS; i++) {
  3473. wc_ecc_del_point_ex(M[i], heap);
  3474. }
  3475. #ifdef WOLFSSL_SMALL_STACK_CACHE
  3476. R->key = NULL;
  3477. ecc_key_tmp_final(&key, heap);
  3478. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  3479. return err;
  3480. }
  3481. #else
  3482. {
  3483. if (k == NULL || G == NULL || R == NULL || modulus == NULL) {
  3484. return ECC_BAD_ARG_E;
  3485. }
  3486. if (mp_count_bits(G->x) > mp_count_bits(modulus) ||
  3487. mp_count_bits(G->y) > mp_count_bits(modulus) ||
  3488. mp_count_bits(G->z) > mp_count_bits(modulus)) {
  3489. return IS_POINT_E;
  3490. }
  3491. (void)a;
  3492. (void)order;
  3493. (void)rng;
  3494. #ifdef WOLFSSL_HAVE_SP_ECC
  3495. #ifndef WOLFSSL_SP_NO_256
  3496. if (mp_count_bits(modulus) == 256) {
  3497. return sp_ecc_mulmod_256(k, G, R, map, heap);
  3498. }
  3499. #endif
  3500. #ifdef WOLFSSL_SP_384
  3501. if (mp_count_bits(modulus) == 384) {
  3502. return sp_ecc_mulmod_384(k, G, R, map, heap);
  3503. }
  3504. #endif
  3505. #ifdef WOLFSSL_SP_521
  3506. if (mp_count_bits(modulus) == 521) {
  3507. return sp_ecc_mulmod_521(k, G, R, map, heap);
  3508. }
  3509. #endif
  3510. #else
  3511. (void)map;
  3512. (void)heap;
  3513. #endif
  3514. return ECC_BAD_ARG_E;
  3515. }
  3516. #endif /* !WOLFSSL_SP_MATH */
  3517. #endif /* !FP_ECC */
  3518. #endif /* !FREESCALE_LTC_ECC && !WOLFSSL_STM32_PKA */
  3519. /** ECC Fixed Point mulmod global
  3520. k The multiplicand
  3521. G Base point to multiply
  3522. R [out] Destination of product
  3523. a ECC curve parameter a
  3524. modulus The modulus for the curve
  3525. map [boolean] If non-zero maps the point back to affine coordinates,
  3526. otherwise it's left in jacobian-montgomery form
  3527. return MP_OKAY if successful
  3528. */
  3529. int wc_ecc_mulmod(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  3530. mp_int* modulus, int map)
  3531. {
  3532. return wc_ecc_mulmod_ex(k, G, R, a, modulus, map, NULL);
  3533. }
  3534. #endif /* !WOLFSSL_ATECC508A */
  3535. /**
  3536. * Allocate a new ECC point (if one not provided)
  3537. * use a heap hint when creating new ecc_point
  3538. * return an allocated point on success or NULL on failure
  3539. */
  3540. static int wc_ecc_new_point_ex(ecc_point** point, void* heap)
  3541. {
  3542. int err = MP_OKAY;
  3543. ecc_point* p;
  3544. if (point == NULL) {
  3545. return BAD_FUNC_ARG;
  3546. }
  3547. p = *point;
  3548. #ifndef WOLFSSL_NO_MALLOC
  3549. if (p == NULL) {
  3550. p = (ecc_point*)XMALLOC(sizeof(ecc_point), heap, DYNAMIC_TYPE_ECC);
  3551. }
  3552. #endif
  3553. if (p == NULL) {
  3554. return MEMORY_E;
  3555. }
  3556. XMEMSET(p, 0, sizeof(ecc_point));
  3557. #ifndef ALT_ECC_SIZE
  3558. err = mp_init_multi(p->x, p->y, p->z, NULL, NULL, NULL);
  3559. if (err != MP_OKAY) {
  3560. #ifndef WOLFSSL_NO_MALLOC
  3561. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  3562. #endif
  3563. return err;
  3564. }
  3565. #else
  3566. p->x = (mp_int*)&p->xyz[0];
  3567. p->y = (mp_int*)&p->xyz[1];
  3568. p->z = (mp_int*)&p->xyz[2];
  3569. alt_fp_init(p->x);
  3570. alt_fp_init(p->y);
  3571. alt_fp_init(p->z);
  3572. #endif
  3573. *point = p;
  3574. (void)heap;
  3575. return err;
  3576. }
  3577. ecc_point* wc_ecc_new_point_h(void* heap)
  3578. {
  3579. ecc_point* p = NULL;
  3580. (void)wc_ecc_new_point_ex(&p, heap);
  3581. return p;
  3582. }
  3583. ecc_point* wc_ecc_new_point(void)
  3584. {
  3585. ecc_point* p = NULL;
  3586. (void)wc_ecc_new_point_ex(&p, NULL);
  3587. return p;
  3588. }
  3589. /** Free an ECC point from memory
  3590. p The point to free
  3591. */
  3592. static void wc_ecc_del_point_ex(ecc_point* p, void* heap)
  3593. {
  3594. if (p != NULL) {
  3595. mp_clear(p->x);
  3596. mp_clear(p->y);
  3597. mp_clear(p->z);
  3598. #ifndef WOLFSSL_NO_MALLOC
  3599. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  3600. #endif
  3601. }
  3602. (void)heap;
  3603. }
  3604. void wc_ecc_del_point_h(ecc_point* p, void* heap)
  3605. {
  3606. wc_ecc_del_point_ex(p, heap);
  3607. }
  3608. void wc_ecc_del_point(ecc_point* p)
  3609. {
  3610. wc_ecc_del_point_ex(p, NULL);
  3611. }
  3612. void wc_ecc_forcezero_point(ecc_point* p)
  3613. {
  3614. if (p != NULL) {
  3615. mp_forcezero(p->x);
  3616. mp_forcezero(p->y);
  3617. mp_forcezero(p->z);
  3618. }
  3619. }
  3620. /** Copy the value of a point to an other one
  3621. p The point to copy
  3622. r The created point
  3623. */
  3624. int wc_ecc_copy_point(const ecc_point* p, ecc_point *r)
  3625. {
  3626. int ret;
  3627. /* prevents null arguments */
  3628. if (p == NULL || r == NULL)
  3629. return ECC_BAD_ARG_E;
  3630. ret = mp_copy(p->x, r->x);
  3631. if (ret != MP_OKAY)
  3632. return ret;
  3633. ret = mp_copy(p->y, r->y);
  3634. if (ret != MP_OKAY)
  3635. return ret;
  3636. ret = mp_copy(p->z, r->z);
  3637. if (ret != MP_OKAY)
  3638. return ret;
  3639. return MP_OKAY;
  3640. }
  3641. /** Compare the value of a point with an other one
  3642. a The point to compare
  3643. b The other point to compare
  3644. return MP_EQ if equal, MP_LT/MP_GT if not, < 0 in case of error
  3645. */
  3646. int wc_ecc_cmp_point(ecc_point* a, ecc_point *b)
  3647. {
  3648. int ret;
  3649. /* prevents null arguments */
  3650. if (a == NULL || b == NULL)
  3651. return BAD_FUNC_ARG;
  3652. ret = mp_cmp(a->x, b->x);
  3653. if (ret != MP_EQ)
  3654. return ret;
  3655. ret = mp_cmp(a->y, b->y);
  3656. if (ret != MP_EQ)
  3657. return ret;
  3658. ret = mp_cmp(a->z, b->z);
  3659. if (ret != MP_EQ)
  3660. return ret;
  3661. return MP_EQ;
  3662. }
  3663. /** Returns whether an ECC idx is valid or not
  3664. n The idx number to check
  3665. return 1 if valid, 0 if not
  3666. */
  3667. int wc_ecc_is_valid_idx(int n)
  3668. {
  3669. int x;
  3670. if (n >= (int)ECC_SET_COUNT)
  3671. return 0;
  3672. for (x = 0; ecc_sets[x].size != 0; x++)
  3673. ;
  3674. /* -1 is a valid index --- indicating that the domain params
  3675. were supplied by the user */
  3676. if ((n >= ECC_CUSTOM_IDX) && (n < x)) {
  3677. return 1;
  3678. }
  3679. return 0;
  3680. }
  3681. int wc_ecc_get_curve_idx(int curve_id)
  3682. {
  3683. int curve_idx;
  3684. for (curve_idx = 0; ecc_sets[curve_idx].size != 0; curve_idx++) {
  3685. if (curve_id == ecc_sets[curve_idx].id)
  3686. break;
  3687. }
  3688. if (ecc_sets[curve_idx].size == 0) {
  3689. return ECC_CURVE_INVALID;
  3690. }
  3691. return curve_idx;
  3692. }
  3693. int wc_ecc_get_curve_id(int curve_idx)
  3694. {
  3695. if (wc_ecc_is_valid_idx(curve_idx)) {
  3696. return ecc_sets[curve_idx].id;
  3697. }
  3698. return ECC_CURVE_INVALID;
  3699. }
  3700. /* Returns the curve size that corresponds to a given ecc_curve_id identifier
  3701. *
  3702. * id curve id, from ecc_curve_id enum in ecc.h
  3703. * return curve size, from ecc_sets[] on success, negative on error
  3704. */
  3705. int wc_ecc_get_curve_size_from_id(int curve_id)
  3706. {
  3707. int curve_idx = wc_ecc_get_curve_idx(curve_id);
  3708. if (curve_idx == ECC_CURVE_INVALID)
  3709. return ECC_BAD_ARG_E;
  3710. return ecc_sets[curve_idx].size;
  3711. }
  3712. /* Returns the curve index that corresponds to a given curve name in
  3713. * ecc_sets[] of ecc.c
  3714. *
  3715. * name curve name, from ecc_sets[].name in ecc.c
  3716. * return curve index in ecc_sets[] on success, negative on error
  3717. */
  3718. int wc_ecc_get_curve_idx_from_name(const char* curveName)
  3719. {
  3720. int curve_idx;
  3721. if (curveName == NULL)
  3722. return BAD_FUNC_ARG;
  3723. for (curve_idx = 0; ecc_sets[curve_idx].size != 0; curve_idx++) {
  3724. if (
  3725. #ifndef WOLFSSL_ECC_CURVE_STATIC
  3726. ecc_sets[curve_idx].name &&
  3727. #endif
  3728. XSTRCASECMP(ecc_sets[curve_idx].name, curveName) == 0) {
  3729. break;
  3730. }
  3731. }
  3732. if (ecc_sets[curve_idx].size == 0) {
  3733. WOLFSSL_MSG("ecc_set curve name not found");
  3734. return ECC_CURVE_INVALID;
  3735. }
  3736. return curve_idx;
  3737. }
  3738. /* Returns the curve size that corresponds to a given curve name,
  3739. * as listed in ecc_sets[] of ecc.c.
  3740. *
  3741. * name curve name, from ecc_sets[].name in ecc.c
  3742. * return curve size, from ecc_sets[] on success, negative on error
  3743. */
  3744. int wc_ecc_get_curve_size_from_name(const char* curveName)
  3745. {
  3746. int curve_idx;
  3747. if (curveName == NULL)
  3748. return BAD_FUNC_ARG;
  3749. curve_idx = wc_ecc_get_curve_idx_from_name(curveName);
  3750. if (curve_idx < 0)
  3751. return curve_idx;
  3752. return ecc_sets[curve_idx].size;
  3753. }
  3754. /* Returns the curve id that corresponds to a given curve name,
  3755. * as listed in ecc_sets[] of ecc.c.
  3756. *
  3757. * name curve name, from ecc_sets[].name in ecc.c
  3758. * return curve id, from ecc_sets[] on success, negative on error
  3759. */
  3760. int wc_ecc_get_curve_id_from_name(const char* curveName)
  3761. {
  3762. int curve_idx;
  3763. if (curveName == NULL)
  3764. return BAD_FUNC_ARG;
  3765. curve_idx = wc_ecc_get_curve_idx_from_name(curveName);
  3766. if (curve_idx < 0)
  3767. return curve_idx;
  3768. return ecc_sets[curve_idx].id;
  3769. }
  3770. /* Compares a curve parameter (hex, from ecc_sets[]) to given input
  3771. * parameter for equality.
  3772. * encType is WC_TYPE_UNSIGNED_BIN or WC_TYPE_HEX_STR
  3773. * Returns MP_EQ on success, negative on error */
  3774. static int wc_ecc_cmp_param(const char* curveParam,
  3775. const byte* param, word32 paramSz, int encType)
  3776. {
  3777. int err = MP_OKAY;
  3778. #ifdef WOLFSSL_SMALL_STACK
  3779. mp_int* a = NULL;
  3780. mp_int* b = NULL;
  3781. #else
  3782. mp_int a[1], b[1];
  3783. #endif
  3784. if (param == NULL || curveParam == NULL)
  3785. return BAD_FUNC_ARG;
  3786. if (encType == WC_TYPE_HEX_STR)
  3787. return XSTRNCMP(curveParam, (char*) param, paramSz);
  3788. #ifdef WOLFSSL_SMALL_STACK
  3789. a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  3790. if (a == NULL)
  3791. return MEMORY_E;
  3792. b = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  3793. if (b == NULL) {
  3794. XFREE(a, NULL, DYNAMIC_TYPE_ECC);
  3795. return MEMORY_E;
  3796. }
  3797. #endif
  3798. if ((err = mp_init_multi(a, b, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  3799. #ifdef WOLFSSL_SMALL_STACK
  3800. XFREE(a, NULL, DYNAMIC_TYPE_ECC);
  3801. XFREE(b, NULL, DYNAMIC_TYPE_ECC);
  3802. #endif
  3803. return err;
  3804. }
  3805. if (err == MP_OKAY) {
  3806. err = mp_read_unsigned_bin(a, param, paramSz);
  3807. }
  3808. if (err == MP_OKAY)
  3809. err = mp_read_radix(b, curveParam, MP_RADIX_HEX);
  3810. if (err == MP_OKAY) {
  3811. if (mp_cmp(a, b) != MP_EQ) {
  3812. err = -1;
  3813. } else {
  3814. err = MP_EQ;
  3815. }
  3816. }
  3817. mp_clear(a);
  3818. mp_clear(b);
  3819. #ifdef WOLFSSL_SMALL_STACK
  3820. XFREE(b, NULL, DYNAMIC_TYPE_ECC);
  3821. XFREE(a, NULL, DYNAMIC_TYPE_ECC);
  3822. #endif
  3823. return err;
  3824. }
  3825. /* Returns the curve id in ecc_sets[] that corresponds to a given set of
  3826. * curve parameters.
  3827. *
  3828. * fieldSize the field size in bits
  3829. * prime prime of the finite field
  3830. * primeSz size of prime in octets
  3831. * Af first coefficient a of the curve
  3832. * AfSz size of Af in octets
  3833. * Bf second coefficient b of the curve
  3834. * BfSz size of Bf in octets
  3835. * order curve order
  3836. * orderSz size of curve in octets
  3837. * Gx affine x coordinate of base point
  3838. * GxSz size of Gx in octets
  3839. * Gy affine y coordinate of base point
  3840. * GySz size of Gy in octets
  3841. * cofactor curve cofactor
  3842. *
  3843. * return curve id, from ecc_sets[] on success, negative on error
  3844. */
  3845. int wc_ecc_get_curve_id_from_params(int fieldSize,
  3846. const byte* prime, word32 primeSz, const byte* Af, word32 AfSz,
  3847. const byte* Bf, word32 BfSz, const byte* order, word32 orderSz,
  3848. const byte* Gx, word32 GxSz, const byte* Gy, word32 GySz, int cofactor)
  3849. {
  3850. int idx;
  3851. int curveSz;
  3852. if (prime == NULL || Af == NULL || Bf == NULL || order == NULL ||
  3853. Gx == NULL || Gy == NULL)
  3854. return BAD_FUNC_ARG;
  3855. curveSz = (fieldSize + 1) / 8; /* round up */
  3856. for (idx = 0; ecc_sets[idx].size != 0; idx++) {
  3857. if (curveSz == ecc_sets[idx].size) {
  3858. if ((wc_ecc_cmp_param(ecc_sets[idx].prime, prime,
  3859. primeSz, WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3860. (wc_ecc_cmp_param(ecc_sets[idx].Af, Af, AfSz,
  3861. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3862. (wc_ecc_cmp_param(ecc_sets[idx].Bf, Bf, BfSz,
  3863. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3864. (wc_ecc_cmp_param(ecc_sets[idx].order, order,
  3865. orderSz, WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3866. (wc_ecc_cmp_param(ecc_sets[idx].Gx, Gx, GxSz,
  3867. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3868. (wc_ecc_cmp_param(ecc_sets[idx].Gy, Gy, GySz,
  3869. WC_TYPE_UNSIGNED_BIN) == MP_EQ) &&
  3870. (cofactor == ecc_sets[idx].cofactor)) {
  3871. break;
  3872. }
  3873. }
  3874. }
  3875. if (ecc_sets[idx].size == 0)
  3876. return ECC_CURVE_INVALID;
  3877. return ecc_sets[idx].id;
  3878. }
  3879. /* Returns the curve id in ecc_sets[] that corresponds
  3880. * to a given domain parameters pointer.
  3881. *
  3882. * dp domain parameters pointer
  3883. *
  3884. * return curve id, from ecc_sets[] on success, negative on error
  3885. */
  3886. int wc_ecc_get_curve_id_from_dp_params(const ecc_set_type* dp)
  3887. {
  3888. int idx;
  3889. if (dp == NULL
  3890. #ifndef WOLFSSL_ECC_CURVE_STATIC
  3891. || dp->prime == NULL || dp->Af == NULL ||
  3892. dp->Bf == NULL || dp->order == NULL || dp->Gx == NULL || dp->Gy == NULL
  3893. #endif
  3894. ) {
  3895. return BAD_FUNC_ARG;
  3896. }
  3897. for (idx = 0; ecc_sets[idx].size != 0; idx++) {
  3898. if (dp->size == ecc_sets[idx].size) {
  3899. if ((wc_ecc_cmp_param(ecc_sets[idx].prime, (const byte*)dp->prime,
  3900. (word32)XSTRLEN(dp->prime), WC_TYPE_HEX_STR) == MP_EQ) &&
  3901. (wc_ecc_cmp_param(ecc_sets[idx].Af, (const byte*)dp->Af,
  3902. (word32)XSTRLEN(dp->Af),WC_TYPE_HEX_STR) == MP_EQ) &&
  3903. (wc_ecc_cmp_param(ecc_sets[idx].Bf, (const byte*)dp->Bf,
  3904. (word32)XSTRLEN(dp->Bf),WC_TYPE_HEX_STR) == MP_EQ) &&
  3905. (wc_ecc_cmp_param(ecc_sets[idx].order, (const byte*)dp->order,
  3906. (word32)XSTRLEN(dp->order),WC_TYPE_HEX_STR) == MP_EQ) &&
  3907. (wc_ecc_cmp_param(ecc_sets[idx].Gx, (const byte*)dp->Gx,
  3908. (word32)XSTRLEN(dp->Gx),WC_TYPE_HEX_STR) == MP_EQ) &&
  3909. (wc_ecc_cmp_param(ecc_sets[idx].Gy, (const byte*)dp->Gy,
  3910. (word32)XSTRLEN(dp->Gy),WC_TYPE_HEX_STR) == MP_EQ) &&
  3911. (dp->cofactor == ecc_sets[idx].cofactor)) {
  3912. break;
  3913. }
  3914. }
  3915. }
  3916. if (ecc_sets[idx].size == 0)
  3917. return ECC_CURVE_INVALID;
  3918. return ecc_sets[idx].id;
  3919. }
  3920. /* Returns the curve id that corresponds to a given OID,
  3921. * as listed in ecc_sets[] of ecc.c.
  3922. *
  3923. * oid OID, from ecc_sets[].name in ecc.c
  3924. * len OID len, from ecc_sets[].name in ecc.c
  3925. * return curve id, from ecc_sets[] on success, negative on error
  3926. */
  3927. int wc_ecc_get_curve_id_from_oid(const byte* oid, word32 len)
  3928. {
  3929. int curve_idx;
  3930. #if defined(HAVE_OID_DECODING) || defined(HAVE_OID_ENCODING)
  3931. int ret;
  3932. #ifdef HAVE_OID_DECODING
  3933. word16 decOid[MAX_OID_SZ/sizeof(word16)];
  3934. #else
  3935. byte decOid[MAX_OID_SZ];
  3936. #endif
  3937. word32 decOidSz;
  3938. #endif
  3939. if (oid == NULL)
  3940. return BAD_FUNC_ARG;
  3941. #ifdef HAVE_OID_DECODING
  3942. decOidSz = (word32)sizeof(decOid);
  3943. ret = DecodeObjectId(oid, len, decOid, &decOidSz);
  3944. if (ret != 0) {
  3945. return ret;
  3946. }
  3947. #endif
  3948. #if !defined(HAVE_OID_ENCODING) && !defined(HAVE_OID_DECODING)
  3949. if (len == 0) {
  3950. /* SAKKE has zero oidSz and will otherwise match with len==0. */
  3951. WOLFSSL_MSG("zero oidSz");
  3952. return ECC_CURVE_INVALID;
  3953. }
  3954. #endif
  3955. for (curve_idx = 0; ecc_sets[curve_idx].size != 0; curve_idx++) {
  3956. #if defined(HAVE_OID_ENCODING) && !defined(HAVE_OID_DECODING)
  3957. decOidSz = (word32)sizeof(decOid);
  3958. ret = EncodeObjectId(ecc_sets[curve_idx].oid, ecc_sets[curve_idx].oidSz,
  3959. decOid, &decOidSz);
  3960. if (ret != 0) {
  3961. continue;
  3962. }
  3963. #endif
  3964. if (
  3965. #ifndef WOLFSSL_ECC_CURVE_STATIC
  3966. ecc_sets[curve_idx].oid &&
  3967. #endif
  3968. #if defined(HAVE_OID_ENCODING) && !defined(HAVE_OID_DECODING)
  3969. decOidSz == len &&
  3970. XMEMCMP(decOid, oid, len) == 0
  3971. #elif defined(HAVE_OID_ENCODING) && defined(HAVE_OID_DECODING)
  3972. /* We double because decOidSz is a count of word16 elements. */
  3973. ecc_sets[curve_idx].oidSz == decOidSz &&
  3974. XMEMCMP(ecc_sets[curve_idx].oid, decOid, decOidSz * 2) == 0
  3975. #else
  3976. ecc_sets[curve_idx].oidSz == len &&
  3977. XMEMCMP(ecc_sets[curve_idx].oid, oid, len) == 0
  3978. #endif
  3979. ) {
  3980. break;
  3981. }
  3982. }
  3983. if (ecc_sets[curve_idx].size == 0) {
  3984. WOLFSSL_MSG("ecc_set curve name not found");
  3985. return ECC_CURVE_INVALID;
  3986. }
  3987. return ecc_sets[curve_idx].id;
  3988. }
  3989. /* Get curve parameters using curve index */
  3990. const ecc_set_type* wc_ecc_get_curve_params(int curve_idx)
  3991. {
  3992. const ecc_set_type* ecc_set = NULL;
  3993. if (curve_idx >= 0 && curve_idx < (int)ECC_SET_COUNT) {
  3994. ecc_set = &ecc_sets[curve_idx];
  3995. }
  3996. return ecc_set;
  3997. }
  3998. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  3999. static WC_INLINE int wc_ecc_alloc_mpint(ecc_key* key, mp_int** mp)
  4000. {
  4001. if (key == NULL || mp == NULL)
  4002. return BAD_FUNC_ARG;
  4003. if (*mp == NULL) {
  4004. *mp = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_BIGINT);
  4005. if (*mp == NULL) {
  4006. return MEMORY_E;
  4007. }
  4008. XMEMSET(*mp, 0, sizeof(mp_int));
  4009. }
  4010. return 0;
  4011. }
  4012. static WC_INLINE void wc_ecc_free_mpint(ecc_key* key, mp_int** mp)
  4013. {
  4014. if (key && mp && *mp) {
  4015. mp_clear(*mp);
  4016. XFREE(*mp, key->heap, DYNAMIC_TYPE_BIGINT);
  4017. *mp = NULL;
  4018. }
  4019. }
  4020. static int wc_ecc_alloc_async(ecc_key* key)
  4021. {
  4022. int err = wc_ecc_alloc_mpint(key, &key->r);
  4023. if (err == 0)
  4024. err = wc_ecc_alloc_mpint(key, &key->s);
  4025. return err;
  4026. }
  4027. static void wc_ecc_free_async(ecc_key* key)
  4028. {
  4029. wc_ecc_free_mpint(key, &key->r);
  4030. wc_ecc_free_mpint(key, &key->s);
  4031. #ifdef HAVE_CAVIUM_V
  4032. wc_ecc_free_mpint(key, &key->e);
  4033. wc_ecc_free_mpint(key, &key->signK);
  4034. #endif /* HAVE_CAVIUM_V */
  4035. }
  4036. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  4037. #ifdef HAVE_ECC_DHE
  4038. /**
  4039. Create an ECC shared secret between two keys
  4040. private_key The private ECC key (heap hint based off of private key)
  4041. public_key The public key
  4042. out [out] Destination of the shared secret
  4043. Conforms to EC-DH from ANSI X9.63
  4044. outlen [in/out] The max size and resulting size of the shared secret
  4045. return MP_OKAY if successful
  4046. */
  4047. WOLFSSL_ABI
  4048. int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out,
  4049. word32* outlen)
  4050. {
  4051. int err = 0;
  4052. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  4053. !defined(WOLFSSL_ATECC608A)
  4054. CRYS_ECDH_TempData_t tempBuff;
  4055. #endif
  4056. (void)err;
  4057. if (private_key == NULL || public_key == NULL || out == NULL ||
  4058. outlen == NULL) {
  4059. return BAD_FUNC_ARG;
  4060. }
  4061. #ifdef WOLF_CRYPTO_CB
  4062. #ifndef WOLF_CRYPTO_CB_FIND
  4063. if (private_key->devId != INVALID_DEVID)
  4064. #endif
  4065. {
  4066. err = wc_CryptoCb_Ecdh(private_key, public_key, out, outlen);
  4067. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  4068. if (err != CRYPTOCB_UNAVAILABLE)
  4069. return err;
  4070. /* fall-through when unavailable */
  4071. #endif
  4072. #ifdef WOLF_CRYPTO_CB_ONLY_ECC
  4073. if (err == CRYPTOCB_UNAVAILABLE) {
  4074. err = NO_VALID_DEVID;
  4075. }
  4076. #endif
  4077. }
  4078. #endif
  4079. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  4080. /* type valid? */
  4081. if (private_key->type != ECC_PRIVATEKEY &&
  4082. private_key->type != ECC_PRIVATEKEY_ONLY) {
  4083. return ECC_BAD_ARG_E;
  4084. }
  4085. /* Verify domain params supplied */
  4086. if (wc_ecc_is_valid_idx(private_key->idx) == 0 || private_key->dp == NULL ||
  4087. wc_ecc_is_valid_idx(public_key->idx) == 0 || public_key->dp == NULL) {
  4088. return ECC_BAD_ARG_E;
  4089. }
  4090. /* Verify curve id matches */
  4091. if (private_key->dp->id != public_key->dp->id) {
  4092. return ECC_BAD_ARG_E;
  4093. }
  4094. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  4095. /* For SECP256R1 use hardware */
  4096. if (private_key->dp->id == ECC_SECP256R1) {
  4097. err = atmel_ecc_create_pms(private_key->slot, public_key->pubkey_raw, out);
  4098. *outlen = private_key->dp->size;
  4099. }
  4100. else {
  4101. err = NOT_COMPILED_IN;
  4102. }
  4103. #elif defined(WOLFSSL_CRYPTOCELL)
  4104. /* generate a secret*/
  4105. err = CRYS_ECDH_SVDP_DH(&public_key->ctx.pubKey,
  4106. &private_key->ctx.privKey,
  4107. out,
  4108. (uint32_t*)outlen,
  4109. &tempBuff);
  4110. if (err != SA_SILIB_RET_OK){
  4111. WOLFSSL_MSG("CRYS_ECDH_SVDP_DH for secret failed");
  4112. return err;
  4113. }
  4114. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  4115. err = silabs_ecc_shared_secret(private_key, public_key, out, outlen);
  4116. #elif defined(WOLFSSL_KCAPI_ECC)
  4117. err = KcapiEcc_SharedSecret(private_key, public_key, out, outlen);
  4118. #elif defined(WOLFSSL_SE050)
  4119. err = se050_ecc_shared_secret(private_key, public_key, out, outlen);
  4120. #else
  4121. err = wc_ecc_shared_secret_ex(private_key, &public_key->pubkey, out, outlen);
  4122. #endif /* WOLFSSL_ATECC508A */
  4123. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  4124. return err;
  4125. }
  4126. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  4127. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_KCAPI_ECC) && \
  4128. !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  4129. int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point,
  4130. byte* out, word32* outlen)
  4131. {
  4132. int err = MP_OKAY;
  4133. mp_int* k = private_key->k;
  4134. #ifdef HAVE_ECC_CDH
  4135. #ifdef WOLFSSL_SMALL_STACK
  4136. mp_int *k_lcl = NULL;
  4137. #else
  4138. mp_int k_lcl[1];
  4139. #endif
  4140. #endif
  4141. #if defined(WOLFSSL_HAVE_SP_ECC) && defined(WC_ECC_NONBLOCK) && \
  4142. defined(WC_ECC_NONBLOCK_ONLY)
  4143. ecc_nb_ctx_t nb_ctx;
  4144. XMEMSET(&nb_ctx, 0, sizeof(nb_ctx));
  4145. #endif /* WOLFSSL_HAVE_SP_ECC && WC_ECC_NONBLOCK && WC_ECC_NONBLOCK_ONLY */
  4146. #ifdef HAVE_ECC_CDH
  4147. /* if cofactor flag has been set */
  4148. if (private_key->flags & WC_ECC_FLAG_COFACTOR) {
  4149. mp_digit cofactor = (mp_digit)private_key->dp->cofactor;
  4150. /* only perform cofactor calc if not equal to 1 */
  4151. if (cofactor != 1) {
  4152. #ifdef WOLFSSL_SMALL_STACK
  4153. if ((k_lcl = (mp_int *)XMALLOC(sizeof(*k_lcl), private_key->heap, DYNAMIC_TYPE_ECC_BUFFER)) == NULL)
  4154. return MEMORY_E;
  4155. #endif
  4156. k = k_lcl;
  4157. if (mp_init(k) != MP_OKAY) {
  4158. err = MEMORY_E;
  4159. goto errout;
  4160. }
  4161. /* multiply cofactor times private key "k" */
  4162. err = mp_mul_d(private_key->k, cofactor, k);
  4163. if (err != MP_OKAY)
  4164. goto errout;
  4165. }
  4166. }
  4167. #endif
  4168. #ifdef WOLFSSL_HAVE_SP_ECC
  4169. #ifndef WOLFSSL_SP_NO_256
  4170. if (private_key->idx != ECC_CUSTOM_IDX &&
  4171. ecc_sets[private_key->idx].id == ECC_SECP256R1) {
  4172. #ifndef WC_ECC_NONBLOCK
  4173. err = sp_ecc_secret_gen_256(k, point, out, outlen, private_key->heap);
  4174. #else
  4175. if (private_key->nb_ctx) {
  4176. err = sp_ecc_secret_gen_256_nb(&private_key->nb_ctx->sp_ctx, k,
  4177. point, out, outlen,
  4178. private_key->heap);
  4179. }
  4180. else {
  4181. #ifdef WC_ECC_NONBLOCK_ONLY
  4182. do { /* perform blocking call to non-blocking function */
  4183. err = sp_ecc_secret_gen_256_nb(&nb_ctx.sp_ctx, k, point, out,
  4184. outlen, private_key->heap);
  4185. } while (err == FP_WOULDBLOCK);
  4186. #else
  4187. err = sp_ecc_secret_gen_256(k, point, out, outlen,
  4188. private_key->heap);
  4189. #endif /* WC_ECC_NONBLOCK_ONLY */
  4190. }
  4191. #endif /* !WC_ECC_NONBLOCK */
  4192. }
  4193. else
  4194. #endif /* ! WOLFSSL_SP_NO_256 */
  4195. #ifdef WOLFSSL_SP_384
  4196. if (private_key->idx != ECC_CUSTOM_IDX &&
  4197. ecc_sets[private_key->idx].id == ECC_SECP384R1) {
  4198. #ifndef WC_ECC_NONBLOCK
  4199. err = sp_ecc_secret_gen_384(k, point, out, outlen, private_key->heap);
  4200. #else
  4201. if (private_key->nb_ctx) {
  4202. err = sp_ecc_secret_gen_384_nb(&private_key->nb_ctx->sp_ctx, k,
  4203. point, out, outlen,
  4204. private_key->heap);
  4205. }
  4206. else {
  4207. #ifdef WC_ECC_NONBLOCK_ONLY
  4208. do { /* perform blocking call to non-blocking function */
  4209. err = sp_ecc_secret_gen_384_nb(&nb_ctx.sp_ctx, k, point, out,
  4210. outlen, private_key->heap);
  4211. } while (err == FP_WOULDBLOCK);
  4212. #else
  4213. err = sp_ecc_secret_gen_384(k, point, out, outlen,
  4214. private_key->heap);
  4215. #endif /* WC_ECC_NONBLOCK_ONLY */
  4216. }
  4217. #endif /* !WC_ECC_NONBLOCK */
  4218. }
  4219. else
  4220. #endif /* WOLFSSL_SP_384 */
  4221. #ifdef WOLFSSL_SP_521
  4222. if (private_key->idx != ECC_CUSTOM_IDX &&
  4223. ecc_sets[private_key->idx].id == ECC_SECP521R1) {
  4224. #ifndef WC_ECC_NONBLOCK
  4225. err = sp_ecc_secret_gen_521(k, point, out, outlen, private_key->heap);
  4226. #else
  4227. if (private_key->nb_ctx) {
  4228. err = sp_ecc_secret_gen_521_nb(&private_key->nb_ctx->sp_ctx, k,
  4229. point, out, outlen,
  4230. private_key->heap);
  4231. }
  4232. else {
  4233. #ifdef WC_ECC_NONBLOCK_ONLY
  4234. do { /* perform blocking call to non-blocking function */
  4235. err = sp_ecc_secret_gen_521_nb(&nb_ctx.sp_ctx, k, point, out,
  4236. outlen, private_key->heap);
  4237. } while (err == FP_WOULDBLOCK);
  4238. #else
  4239. err = sp_ecc_secret_gen_521(k, point, out, outlen,
  4240. private_key->heap);
  4241. #endif /* WC_ECC_NONBLOCK_ONLY */
  4242. }
  4243. #endif /* !WC_ECC_NONBLOCK */
  4244. }
  4245. else
  4246. #endif /* WOLFSSL_SP_521 */
  4247. #else
  4248. (void)point;
  4249. (void)out;
  4250. (void)outlen;
  4251. (void)k;
  4252. #endif
  4253. #if defined(WOLFSSL_SP_MATH)
  4254. {
  4255. err = WC_KEY_SIZE_E;
  4256. goto errout;
  4257. }
  4258. #else
  4259. {
  4260. ecc_point* result = NULL;
  4261. #ifdef WOLFSSL_NO_MALLOC
  4262. ecc_point lcl_result;
  4263. #endif
  4264. int x = 0;
  4265. mp_digit mp = 0;
  4266. DECLARE_CURVE_SPECS(3);
  4267. /* load curve info */
  4268. ALLOC_CURVE_SPECS(3, err);
  4269. if (err == MP_OKAY) {
  4270. err = wc_ecc_curve_load(private_key->dp, &curve,
  4271. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  4272. ECC_CURVE_FIELD_ORDER));
  4273. }
  4274. if (err != MP_OKAY) {
  4275. FREE_CURVE_SPECS();
  4276. goto errout;
  4277. }
  4278. /* make new point */
  4279. #ifdef WOLFSSL_NO_MALLOC
  4280. result = &lcl_result;
  4281. #endif
  4282. err = wc_ecc_new_point_ex(&result, private_key->heap);
  4283. if (err != MP_OKAY) {
  4284. wc_ecc_curve_free(curve);
  4285. FREE_CURVE_SPECS();
  4286. goto errout;
  4287. }
  4288. #ifdef ECC_TIMING_RESISTANT
  4289. if (private_key->rng == NULL) {
  4290. err = MISSING_RNG_E;
  4291. }
  4292. #endif
  4293. if (err == MP_OKAY) {
  4294. /* Map in a separate call as this should be constant time */
  4295. #ifdef ECC_TIMING_RESISTANT
  4296. err = wc_ecc_mulmod_ex2(k, point, result, curve->Af, curve->prime,
  4297. curve->order, private_key->rng, 0,
  4298. private_key->heap);
  4299. #else
  4300. err = wc_ecc_mulmod_ex2(k, point, result, curve->Af, curve->prime,
  4301. curve->order, NULL, 0, private_key->heap);
  4302. #endif
  4303. }
  4304. if (err == MP_OKAY) {
  4305. #ifdef WOLFSSL_CHECK_MEM_ZERO
  4306. mp_memzero_add("wc_ecc_shared_secret_gen_sync result->x",
  4307. result->x);
  4308. mp_memzero_add("wc_ecc_shared_secret_gen_sync result->y",
  4309. result->y);
  4310. #endif
  4311. err = mp_montgomery_setup(curve->prime, &mp);
  4312. }
  4313. if (err == MP_OKAY) {
  4314. /* Use constant time map if compiled in */
  4315. err = ecc_map_ex(result, curve->prime, mp, 1);
  4316. }
  4317. if (err == MP_OKAY) {
  4318. x = mp_unsigned_bin_size(curve->prime);
  4319. if (*outlen < (word32)x || x < mp_unsigned_bin_size(result->x)) {
  4320. err = BUFFER_E;
  4321. }
  4322. }
  4323. if (err == MP_OKAY) {
  4324. XMEMSET(out, 0, (size_t)x);
  4325. err = mp_to_unsigned_bin(result->x, out +
  4326. (x - mp_unsigned_bin_size(result->x)));
  4327. }
  4328. *outlen = (word32)x;
  4329. mp_forcezero(result->x);
  4330. mp_forcezero(result->y);
  4331. wc_ecc_del_point_ex(result, private_key->heap);
  4332. wc_ecc_curve_free(curve);
  4333. FREE_CURVE_SPECS();
  4334. }
  4335. #endif
  4336. errout:
  4337. #ifdef HAVE_ECC_CDH
  4338. if (k == k_lcl)
  4339. mp_clear(k);
  4340. #ifdef WOLFSSL_SMALL_STACK
  4341. if (k_lcl != NULL)
  4342. XFREE(k_lcl, private_key->heap, DYNAMIC_TYPE_ECC_BUFFER);
  4343. #endif
  4344. #endif
  4345. return err;
  4346. }
  4347. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4348. static int wc_ecc_shared_secret_gen_async(ecc_key* private_key,
  4349. ecc_point* point, byte* out, word32 *outlen)
  4350. {
  4351. int err = 0;
  4352. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  4353. DECLARE_CURVE_SPECS(3);
  4354. /* load curve info */
  4355. ALLOC_CURVE_SPECS(3, err);
  4356. if (err == MP_OKAY) {
  4357. err = wc_ecc_curve_load(private_key->dp, &curve,
  4358. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  4359. ECC_CURVE_FIELD_ORDER));
  4360. }
  4361. if (err != MP_OKAY) {
  4362. FREE_CURVE_SPECS();
  4363. return err;
  4364. }
  4365. if (private_key->dp
  4366. #ifdef WOLFSSL_CUSTOM_CURVES
  4367. && private_key->dp->id != ECC_CURVE_CUSTOM
  4368. #endif
  4369. #ifdef HAVE_CAVIUM_V
  4370. /* verify the curve is supported by hardware */
  4371. && NitroxEccIsCurveSupported(private_key)
  4372. #endif
  4373. ) {
  4374. word32 keySz = private_key->dp->size;
  4375. /* sync public key x/y */
  4376. err = wc_mp_to_bigint_sz(private_key->k, &private_key->k->raw, keySz);
  4377. if (err == MP_OKAY)
  4378. err = wc_mp_to_bigint_sz(point->x, &point->x->raw, keySz);
  4379. if (err == MP_OKAY)
  4380. err = wc_mp_to_bigint_sz(point->y, &point->y->raw, keySz);
  4381. #ifdef HAVE_CAVIUM_V
  4382. /* allocate buffer for output */
  4383. if (err == MP_OKAY)
  4384. err = wc_ecc_alloc_mpint(private_key, &private_key->e);
  4385. if (err == MP_OKAY)
  4386. err = wc_bigint_alloc(&private_key->e->raw,
  4387. NitroxEccGetSize(private_key)*2);
  4388. if (err == MP_OKAY)
  4389. err = NitroxEcdh(private_key,
  4390. &private_key->k->raw, &point->x->raw, &point->y->raw,
  4391. private_key->e->raw.buf, &private_key->e->raw.len,
  4392. &curve->prime->raw);
  4393. #else
  4394. if (err == MP_OKAY)
  4395. err = wc_ecc_curve_load(private_key->dp, &curve, ECC_CURVE_FIELD_BF);
  4396. if (err == MP_OKAY)
  4397. err = IntelQaEcdh(&private_key->asyncDev,
  4398. &private_key->k->raw, &point->x->raw, &point->y->raw,
  4399. out, outlen,
  4400. &curve->Af->raw, &curve->Bf->raw, &curve->prime->raw,
  4401. private_key->dp->cofactor);
  4402. #endif
  4403. }
  4404. else
  4405. #elif defined(WOLFSSL_ASYNC_CRYPT_SW)
  4406. if (wc_AsyncSwInit(&private_key->asyncDev, ASYNC_SW_ECC_SHARED_SEC)) {
  4407. WC_ASYNC_SW* sw = &private_key->asyncDev.sw;
  4408. sw->eccSharedSec.private_key = private_key;
  4409. sw->eccSharedSec.public_point = point;
  4410. sw->eccSharedSec.out = out;
  4411. sw->eccSharedSec.outLen = outlen;
  4412. err = WC_PENDING_E;
  4413. }
  4414. else
  4415. #endif
  4416. {
  4417. /* use sync in other cases */
  4418. err = wc_ecc_shared_secret_gen_sync(private_key, point, out, outlen);
  4419. }
  4420. if (err == WC_PENDING_E) {
  4421. private_key->state++;
  4422. }
  4423. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  4424. wc_ecc_curve_free(curve);
  4425. FREE_CURVE_SPECS();
  4426. #endif
  4427. return err;
  4428. }
  4429. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  4430. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  4431. /**
  4432. Create an ECC shared secret between private key and public point
  4433. private_key The private ECC key (heap hint based on private key)
  4434. point The point to use (public key)
  4435. out [out] Destination of the shared secret
  4436. Conforms to EC-DH from ANSI X9.63
  4437. outlen [in/out] The max size and resulting size of the shared secret
  4438. return MP_OKAY if successful
  4439. */
  4440. int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
  4441. byte* out, word32 *outlen)
  4442. {
  4443. int err;
  4444. if (private_key == NULL || point == NULL || out == NULL ||
  4445. outlen == NULL) {
  4446. return BAD_FUNC_ARG;
  4447. }
  4448. /* type valid? */
  4449. if (private_key->type != ECC_PRIVATEKEY &&
  4450. private_key->type != ECC_PRIVATEKEY_ONLY) {
  4451. WOLFSSL_MSG("ECC_BAD_ARG_E");
  4452. return ECC_BAD_ARG_E;
  4453. }
  4454. /* Verify domain params supplied */
  4455. if (wc_ecc_is_valid_idx(private_key->idx) == 0 || private_key->dp == NULL) {
  4456. WOLFSSL_MSG("wc_ecc_is_valid_idx failed");
  4457. return ECC_BAD_ARG_E;
  4458. }
  4459. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  4460. switch (private_key->state) {
  4461. case ECC_STATE_NONE:
  4462. case ECC_STATE_SHARED_SEC_GEN:
  4463. private_key->state = ECC_STATE_SHARED_SEC_GEN;
  4464. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4465. if (private_key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4466. err = wc_ecc_shared_secret_gen_async(private_key, point,
  4467. out, outlen);
  4468. if (err == 0) {
  4469. /* exit early */
  4470. RESTORE_VECTOR_REGISTERS();
  4471. return err;
  4472. }
  4473. }
  4474. else
  4475. #endif
  4476. {
  4477. err = wc_ecc_shared_secret_gen_sync(private_key, point,
  4478. out, outlen);
  4479. }
  4480. if (err < 0) {
  4481. break;
  4482. }
  4483. FALL_THROUGH;
  4484. case ECC_STATE_SHARED_SEC_RES:
  4485. private_key->state = ECC_STATE_SHARED_SEC_RES;
  4486. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4487. if (private_key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4488. #ifdef HAVE_CAVIUM_V
  4489. /* verify the curve is supported by hardware */
  4490. if (NitroxEccIsCurveSupported(private_key)) {
  4491. /* copy output */
  4492. *outlen = private_key->dp->size;
  4493. XMEMCPY(out, private_key->e->raw.buf, *outlen);
  4494. }
  4495. #endif /* HAVE_CAVIUM_V */
  4496. }
  4497. #endif /* WOLFSSL_ASYNC_CRYPT */
  4498. err = 0;
  4499. break;
  4500. default:
  4501. err = BAD_STATE_E;
  4502. } /* switch */
  4503. RESTORE_VECTOR_REGISTERS();
  4504. /* if async pending then return and skip done cleanup below */
  4505. if (err == WC_PENDING_E) {
  4506. return err;
  4507. }
  4508. /* cleanup */
  4509. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4510. wc_ecc_free_async(private_key);
  4511. #endif
  4512. private_key->state = ECC_STATE_NONE;
  4513. return err;
  4514. }
  4515. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  4516. #elif defined(WOLFSSL_KCAPI_ECC)
  4517. int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
  4518. byte* out, word32 *outlen)
  4519. {
  4520. int err;
  4521. ecc_key public_key;
  4522. err = wc_ecc_init_ex(&public_key, private_key->heap, INVALID_DEVID);
  4523. if (err == MP_OKAY) {
  4524. err = wc_ecc_set_curve(&public_key, private_key->dp->size,
  4525. private_key->dp->id);
  4526. if (err == MP_OKAY) {
  4527. err = mp_copy(point->x, public_key.pubkey.x);
  4528. }
  4529. if (err == MP_OKAY) {
  4530. err = mp_copy(point->y, public_key.pubkey.y);
  4531. }
  4532. if (err == MP_OKAY) {
  4533. err = wc_ecc_shared_secret(private_key, &public_key, out, outlen);
  4534. }
  4535. wc_ecc_free(&public_key);
  4536. }
  4537. return err;
  4538. }
  4539. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL && !WOLFSSL_KCAPI_ECC */
  4540. #endif /* HAVE_ECC_DHE */
  4541. #ifdef USE_ECC_B_PARAM
  4542. /* Checks if a point p lies on the curve with index curve_idx */
  4543. int wc_ecc_point_is_on_curve(ecc_point *p, int curve_idx)
  4544. {
  4545. int err = MP_OKAY;
  4546. DECLARE_CURVE_SPECS(3);
  4547. if (p == NULL)
  4548. return BAD_FUNC_ARG;
  4549. /* is the IDX valid ? */
  4550. if (wc_ecc_is_valid_idx(curve_idx) == 0) {
  4551. return ECC_BAD_ARG_E;
  4552. }
  4553. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  4554. ALLOC_CURVE_SPECS(3, err);
  4555. if (err == MP_OKAY) {
  4556. err = wc_ecc_curve_load(wc_ecc_get_curve_params(curve_idx), &curve,
  4557. ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  4558. ECC_CURVE_FIELD_BF);
  4559. }
  4560. if (err == MP_OKAY) {
  4561. err = wc_ecc_is_point(p, curve->Af, curve->Bf, curve->prime);
  4562. }
  4563. wc_ecc_curve_free(curve);
  4564. FREE_CURVE_SPECS();
  4565. RESTORE_VECTOR_REGISTERS();
  4566. return err;
  4567. }
  4568. #endif /* USE_ECC_B_PARAM */
  4569. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  4570. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  4571. /* return 1 if point is at infinity, 0 if not, < 0 on error */
  4572. int wc_ecc_point_is_at_infinity(ecc_point* p)
  4573. {
  4574. if (p == NULL)
  4575. return BAD_FUNC_ARG;
  4576. if (mp_iszero(p->x) && mp_iszero(p->y))
  4577. return 1;
  4578. return 0;
  4579. }
  4580. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL */
  4581. /* generate random and ensure its greater than 0 and less than order */
  4582. int wc_ecc_gen_k(WC_RNG* rng, int size, mp_int* k, mp_int* order)
  4583. {
  4584. #ifndef WC_NO_RNG
  4585. int err;
  4586. byte buf[ECC_MAXSIZE_GEN];
  4587. if (rng == NULL || size < 0 || size + 8 > ECC_MAXSIZE_GEN || k == NULL ||
  4588. order == NULL) {
  4589. return BAD_FUNC_ARG;
  4590. }
  4591. /* generate 8 extra bytes to mitigate bias from the modulo operation below */
  4592. /* see section A.1.2 in 'Suite B Implementor's Guide to FIPS 186-3 (ECDSA)' */
  4593. size += 8;
  4594. /* make up random string */
  4595. err = wc_RNG_GenerateBlock(rng, buf, (word32)size);
  4596. #ifdef WOLFSSL_CHECK_MEM_ZERO
  4597. wc_MemZero_Add("wc_ecc_gen_k buf", buf, size);
  4598. #endif
  4599. /* load random buffer data into k */
  4600. if (err == 0)
  4601. err = mp_read_unsigned_bin(k, buf, (word32)size);
  4602. /* the key should be smaller than the order of base point */
  4603. if (err == MP_OKAY) {
  4604. if (mp_cmp(k, order) != MP_LT) {
  4605. err = mp_mod(k, order, k);
  4606. }
  4607. }
  4608. /* quick sanity check to make sure we're not dealing with a 0 key */
  4609. if (err == MP_OKAY) {
  4610. if (mp_iszero(k) == MP_YES)
  4611. err = MP_ZERO_E;
  4612. }
  4613. ForceZero(buf, ECC_MAXSIZE_GEN);
  4614. #ifdef WOLFSSL_CHECK_MEM_ZERO
  4615. wc_MemZero_Check(buf, ECC_MAXSIZE_GEN);
  4616. #endif
  4617. return err;
  4618. #else
  4619. (void)rng;
  4620. (void)size;
  4621. (void)k;
  4622. (void)order;
  4623. return NOT_COMPILED_IN;
  4624. #endif /* !WC_NO_RNG */
  4625. }
  4626. static WC_INLINE void wc_ecc_reset(ecc_key* key)
  4627. {
  4628. /* make sure required key variables are reset */
  4629. key->state = ECC_STATE_NONE;
  4630. }
  4631. /* create the public ECC key from a private key
  4632. *
  4633. * key an initialized private key to generate public part from
  4634. * curve [in]curve for key, cannot be NULL
  4635. * pubOut [out]ecc_point holding the public key, if NULL then public key part
  4636. * is cached in key instead.
  4637. *
  4638. * Note this function is local to the file because of the argument type
  4639. * ecc_curve_spec. Having this argument allows for not having to load the
  4640. * curve type multiple times when generating a key with wc_ecc_make_key().
  4641. * For async the results are placed directly into pubOut, so this function
  4642. * does not need to be called again
  4643. *
  4644. * returns MP_OKAY on success
  4645. */
  4646. static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curve,
  4647. ecc_point* pubOut, WC_RNG* rng)
  4648. {
  4649. int err = MP_OKAY;
  4650. #ifdef HAVE_ECC_MAKE_PUB
  4651. ecc_point* pub;
  4652. #endif /* HAVE_ECC_MAKE_PUB */
  4653. (void)rng;
  4654. if (key == NULL) {
  4655. return BAD_FUNC_ARG;
  4656. }
  4657. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  4658. #ifdef HAVE_ECC_MAKE_PUB
  4659. /* if ecc_point passed in then use it as output for public key point */
  4660. if (pubOut != NULL) {
  4661. pub = pubOut;
  4662. }
  4663. else {
  4664. /* caching public key making it a ECC_PRIVATEKEY instead of
  4665. ECC_PRIVATEKEY_ONLY */
  4666. pub = &key->pubkey;
  4667. key->type = ECC_PRIVATEKEY_ONLY;
  4668. }
  4669. if ((err == MP_OKAY) && (mp_iszero(key->k) || mp_isneg(key->k) ||
  4670. (mp_cmp(key->k, curve->order) != MP_LT)))
  4671. {
  4672. err = ECC_PRIV_KEY_E;
  4673. }
  4674. if (err == MP_OKAY) {
  4675. #ifndef ALT_ECC_SIZE
  4676. err = mp_init_multi(pub->x, pub->y, pub->z, NULL, NULL, NULL);
  4677. #else
  4678. pub->x = (mp_int*)&pub->xyz[0];
  4679. pub->y = (mp_int*)&pub->xyz[1];
  4680. pub->z = (mp_int*)&pub->xyz[2];
  4681. alt_fp_init(pub->x);
  4682. alt_fp_init(pub->y);
  4683. alt_fp_init(pub->z);
  4684. #endif
  4685. }
  4686. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC_KEYGEN) && \
  4687. defined(HAVE_INTEL_QA)
  4688. if (err == MP_OKAY && key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4689. word32 keySz = key->dp->size;
  4690. /* sync private key to raw */
  4691. err = wc_mp_to_bigint_sz(key->k, &key->k->raw, keySz);
  4692. if (err == MP_OKAY) {
  4693. err = IntelQaEccPointMul(&key->asyncDev,
  4694. &key->k->raw, pub->x, pub->y, pub->z,
  4695. &curve->Gx->raw, &curve->Gy->raw,
  4696. &curve->Af->raw, &curve->Bf->raw, &curve->prime->raw,
  4697. key->dp->cofactor);
  4698. }
  4699. }
  4700. else
  4701. #endif
  4702. { /* BEGIN: Software Crypto */
  4703. #ifdef WOLFSSL_HAVE_SP_ECC
  4704. /* Single-Precision Math (optimized for specific curves) */
  4705. if (err != MP_OKAY) {
  4706. }
  4707. else
  4708. #ifndef WOLFSSL_SP_NO_256
  4709. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  4710. err = sp_ecc_mulmod_base_256(key->k, pub, 1, key->heap);
  4711. }
  4712. else
  4713. #endif
  4714. #ifdef WOLFSSL_SP_384
  4715. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  4716. err = sp_ecc_mulmod_base_384(key->k, pub, 1, key->heap);
  4717. }
  4718. else
  4719. #endif
  4720. #ifdef WOLFSSL_SP_521
  4721. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) {
  4722. err = sp_ecc_mulmod_base_521(key->k, pub, 1, key->heap);
  4723. }
  4724. else
  4725. #endif
  4726. #endif /* WOLFSSL_HAVE_SP_ECC */
  4727. #if defined(WOLFSSL_SP_MATH)
  4728. err = WC_KEY_SIZE_E;
  4729. #else
  4730. if (err == MP_OKAY) {
  4731. /* Multi-Precision Math: compute public curve */
  4732. mp_digit mp = 0;
  4733. ecc_point* base = NULL;
  4734. #ifdef WOLFSSL_NO_MALLOC
  4735. ecc_point lcl_base;
  4736. base = &lcl_base;
  4737. #endif
  4738. err = wc_ecc_new_point_ex(&base, key->heap);
  4739. /* read in the x/y for this key */
  4740. if (err == MP_OKAY)
  4741. err = mp_copy(curve->Gx, base->x);
  4742. if (err == MP_OKAY)
  4743. err = mp_copy(curve->Gy, base->y);
  4744. if (err == MP_OKAY)
  4745. err = mp_montgomery_setup(curve->prime, &mp);
  4746. if (err == MP_OKAY)
  4747. err = mp_set(base->z, 1);
  4748. /* make the public key */
  4749. if (err == MP_OKAY) {
  4750. /* Map in a separate call as this should be constant time */
  4751. err = wc_ecc_mulmod_ex2(key->k, base, pub, curve->Af, curve->prime,
  4752. curve->order, rng, 0, key->heap);
  4753. if (err == MP_MEM) {
  4754. err = MEMORY_E;
  4755. }
  4756. }
  4757. if (err == MP_OKAY) {
  4758. /* Use constant time map if compiled in */
  4759. err = ecc_map_ex(pub, curve->prime, mp, 1);
  4760. }
  4761. wc_ecc_del_point_ex(base, key->heap);
  4762. }
  4763. #endif /* WOLFSSL_SP_MATH */
  4764. } /* END: Software Crypto */
  4765. if (err != MP_OKAY
  4766. #ifdef WOLFSSL_ASYNC_CRYPT
  4767. && err != WC_PENDING_E
  4768. #endif
  4769. ) {
  4770. /* clean up if failed */
  4771. #ifndef ALT_ECC_SIZE
  4772. mp_clear(pub->x);
  4773. mp_clear(pub->y);
  4774. mp_clear(pub->z);
  4775. #endif
  4776. }
  4777. #else
  4778. /* Using hardware crypto, that does not support ecc_make_pub_ex */
  4779. (void)curve;
  4780. err = NOT_COMPILED_IN;
  4781. #endif /* HAVE_ECC_MAKE_PUB */
  4782. /* change key state if public part is cached */
  4783. if (key->type == ECC_PRIVATEKEY_ONLY && pubOut == NULL) {
  4784. key->type = ECC_PRIVATEKEY;
  4785. }
  4786. RESTORE_VECTOR_REGISTERS();
  4787. return err;
  4788. }
  4789. /* create the public ECC key from a private key
  4790. *
  4791. * key an initialized private key to generate public part from
  4792. * pubOut [out]ecc_point holding the public key, if NULL then public key part
  4793. * is cached in key instead.
  4794. *
  4795. *
  4796. * returns MP_OKAY on success
  4797. */
  4798. int wc_ecc_make_pub(ecc_key* key, ecc_point* pubOut)
  4799. {
  4800. WOLFSSL_ENTER("wc_ecc_make_pub");
  4801. return wc_ecc_make_pub_ex(key, pubOut, NULL);
  4802. }
  4803. /* create the public ECC key from a private key - mask timing use random z
  4804. *
  4805. * key an initialized private key to generate public part from
  4806. * pubOut [out]ecc_point holding the public key, if NULL then public key part
  4807. * is cached in key instead.
  4808. *
  4809. *
  4810. * returns MP_OKAY on success
  4811. */
  4812. int wc_ecc_make_pub_ex(ecc_key* key, ecc_point* pubOut, WC_RNG* rng)
  4813. {
  4814. int err = MP_OKAY;
  4815. DECLARE_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  4816. WOLFSSL_ENTER("wc_ecc_make_pub_ex");
  4817. if (key == NULL) {
  4818. return BAD_FUNC_ARG;
  4819. }
  4820. /* load curve info */
  4821. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  4822. if (err == MP_OKAY) {
  4823. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  4824. }
  4825. if (err == MP_OKAY) {
  4826. err = ecc_make_pub_ex(key, curve, pubOut, rng);
  4827. }
  4828. wc_ecc_curve_free(curve);
  4829. FREE_CURVE_SPECS();
  4830. return err;
  4831. }
  4832. static int _ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key,
  4833. int curve_id, int flags)
  4834. {
  4835. int err = 0;
  4836. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  4837. !defined(WOLFSSL_ATECC608A)
  4838. const CRYS_ECPKI_Domain_t* pDomain;
  4839. CRYS_ECPKI_KG_TempData_t tempBuff;
  4840. CRYS_ECPKI_KG_FipsContext_t fipsCtx;
  4841. byte ucompressed_key[ECC_MAX_CRYPTO_HW_SIZE*2 + 1];
  4842. word32 raw_size = 0;
  4843. #endif
  4844. #if defined(WOLFSSL_HAVE_SP_ECC) && defined(WC_ECC_NONBLOCK) && \
  4845. defined(WC_ECC_NONBLOCK_ONLY)
  4846. ecc_nb_ctx_t nb_ctx;
  4847. XMEMSET(&nb_ctx, 0, sizeof(nb_ctx));
  4848. #endif /* WOLFSSL_HAVE_SP_ECC && WC_ECC_NONBLOCK && WC_ECC_NONBLOCK_ONLY */
  4849. if (key == NULL || rng == NULL) {
  4850. return BAD_FUNC_ARG;
  4851. }
  4852. /* make sure required variables are reset */
  4853. wc_ecc_reset(key);
  4854. err = wc_ecc_set_curve(key, keysize, curve_id);
  4855. if (err != 0) {
  4856. return err;
  4857. }
  4858. key->flags = (byte)flags;
  4859. #ifdef WOLF_CRYPTO_CB
  4860. #ifndef WOLF_CRYPTO_CB_FIND
  4861. if (key->devId != INVALID_DEVID)
  4862. #endif
  4863. {
  4864. err = wc_CryptoCb_MakeEccKey(rng, keysize, key, curve_id);
  4865. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  4866. if (err != CRYPTOCB_UNAVAILABLE)
  4867. return err;
  4868. /* fall-through when unavailable */
  4869. #endif
  4870. #ifdef WOLF_CRYPTO_CB_ONLY_ECC
  4871. if (err == CRYPTOCB_UNAVAILABLE) {
  4872. return NO_VALID_DEVID;
  4873. }
  4874. return err;
  4875. #endif
  4876. }
  4877. #endif
  4878. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  4879. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  4880. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  4881. #ifdef HAVE_CAVIUM
  4882. /* TODO: Not implemented */
  4883. #elif defined(HAVE_INTEL_QA)
  4884. /* Implemented in ecc_make_pub_ex for the pub calc */
  4885. #else
  4886. if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_MAKE)) {
  4887. WC_ASYNC_SW* sw = &key->asyncDev.sw;
  4888. sw->eccMake.rng = rng;
  4889. sw->eccMake.key = key;
  4890. sw->eccMake.size = keysize;
  4891. sw->eccMake.curve_id = curve_id;
  4892. return WC_PENDING_E;
  4893. }
  4894. #endif
  4895. }
  4896. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  4897. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  4898. if (key->dp->id == ECC_SECP256R1) {
  4899. key->type = ECC_PRIVATEKEY;
  4900. key->slot = atmel_ecc_alloc(ATMEL_SLOT_ECDHE);
  4901. err = atmel_ecc_create_key(key->slot, key->pubkey_raw);
  4902. /* populate key->pubkey */
  4903. if (err == 0
  4904. #ifdef ALT_ECC_SIZE
  4905. && key->pubkey.x
  4906. #endif
  4907. ) {
  4908. err = mp_read_unsigned_bin(key->pubkey.x, key->pubkey_raw,
  4909. ECC_MAX_CRYPTO_HW_SIZE);
  4910. }
  4911. if (err == 0
  4912. #ifdef ALT_ECC_SIZE
  4913. && key->pubkey.y
  4914. #endif
  4915. ) {
  4916. err = mp_read_unsigned_bin(key->pubkey.y,
  4917. key->pubkey_raw + ECC_MAX_CRYPTO_HW_SIZE,
  4918. ECC_MAX_CRYPTO_HW_SIZE);
  4919. }
  4920. }
  4921. else {
  4922. err = NOT_COMPILED_IN;
  4923. }
  4924. #elif defined(WOLFSSL_SE050)
  4925. err = se050_ecc_create_key(key, key->dp->id, key->dp->size);
  4926. key->type = ECC_PRIVATEKEY;
  4927. #elif defined(WOLFSSL_CRYPTOCELL)
  4928. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id));
  4929. raw_size = (word32)(key->dp->size)*2 + 1;
  4930. /* generate first key pair */
  4931. err = CRYS_ECPKI_GenKeyPair(&wc_rndState,
  4932. wc_rndGenVectFunc,
  4933. pDomain,
  4934. &key->ctx.privKey,
  4935. &key->ctx.pubKey,
  4936. &tempBuff,
  4937. &fipsCtx);
  4938. if (err != SA_SILIB_RET_OK){
  4939. WOLFSSL_MSG("CRYS_ECPKI_GenKeyPair for key pair failed");
  4940. return err;
  4941. }
  4942. key->type = ECC_PRIVATEKEY;
  4943. err = CRYS_ECPKI_ExportPublKey(&key->ctx.pubKey,
  4944. CRYS_EC_PointUncompressed,
  4945. &ucompressed_key[0],
  4946. (uint32_t*)&raw_size);
  4947. if (err == SA_SILIB_RET_OK && key->pubkey.x && key->pubkey.y) {
  4948. err = mp_read_unsigned_bin(key->pubkey.x,
  4949. &ucompressed_key[1], key->dp->size);
  4950. if (err == MP_OKAY) {
  4951. err = mp_read_unsigned_bin(key->pubkey.y,
  4952. &ucompressed_key[1+key->dp->size],key->dp->size);
  4953. }
  4954. }
  4955. raw_size = key->dp->size;
  4956. if (err == MP_OKAY) {
  4957. err = CRYS_ECPKI_ExportPrivKey(&key->ctx.privKey,
  4958. ucompressed_key,
  4959. (uint32_t*)&raw_size);
  4960. }
  4961. if (err == SA_SILIB_RET_OK) {
  4962. err = mp_read_unsigned_bin(key->k, ucompressed_key, raw_size);
  4963. }
  4964. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  4965. return silabs_ecc_make_key(key, keysize);
  4966. #elif defined(WOLFSSL_KCAPI_ECC)
  4967. err = KcapiEcc_MakeKey(key, keysize, curve_id);
  4968. (void)rng;
  4969. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  4970. if (xil_curve_type[key->dp->id] == 0)
  4971. return ECC_CURVE_OID_E;
  4972. err = wc_RNG_GenerateBlock(rng, key->privKey, key->dp->size);
  4973. if (err)
  4974. return err;
  4975. /* Make sure that private key is max. 521 bits */
  4976. if (key->dp->size == 66)
  4977. key->privKey[65] &= 0x1U;
  4978. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->privKey), key->dp->size);
  4979. WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(key->keyRaw),
  4980. 2 * key->dp->size);
  4981. err = XSecure_EllipticGenerateKey(&(key->xSec.cinst),
  4982. xil_curve_type[key->dp->id],
  4983. XIL_CAST_U64(key->privKey),
  4984. XIL_CAST_U64(key->keyRaw));
  4985. if (err != XST_SUCCESS) {
  4986. WOLFSSL_XIL_ERROR("Generate ECC key failed", err);
  4987. err = WC_HW_E;
  4988. }
  4989. WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(key->keyRaw),
  4990. 2 * key->dp->size);
  4991. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  4992. if (err == 0)
  4993. err = XSecure_EllipticValidateKey(&(key->xSec.cinst),
  4994. xil_curve_type[key->dp->id],
  4995. XIL_CAST_U64(key->keyRaw));
  4996. #endif
  4997. if (err == 0)
  4998. err = xil_mpi_import(key->pubkey.x, key->keyRaw, key->dp->size,
  4999. key->heap);
  5000. if (err == 0)
  5001. err = xil_mpi_import(key->pubkey.y, key->keyRaw + key->dp->size,
  5002. key->dp->size, key->heap);
  5003. if (err == 0)
  5004. err = xil_mpi_import(key->k, key->privKey, key->dp->size, key->heap);
  5005. if (err == 0)
  5006. err = mp_set(key->pubkey.z, 1);
  5007. if (err) {
  5008. key->privKey = NULL;
  5009. XMEMSET(key->keyRaw, 0, sizeof(key->keyRaw));
  5010. return err;
  5011. }
  5012. key->type = ECC_PRIVATEKEY;
  5013. #else
  5014. #ifdef WOLFSSL_HAVE_SP_ECC
  5015. #ifndef WOLFSSL_SP_NO_256
  5016. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  5017. #ifndef WC_ECC_NONBLOCK
  5018. err = sp_ecc_make_key_256(rng, key->k, &key->pubkey, key->heap);
  5019. #else
  5020. if (key->nb_ctx) {
  5021. err = sp_ecc_make_key_256_nb(&key->nb_ctx->sp_ctx, rng, key->k,
  5022. &key->pubkey, key->heap);
  5023. }
  5024. else {
  5025. #ifdef WC_ECC_NONBLOCK_ONLY
  5026. do { /* perform blocking call to non-blocking function */
  5027. err = sp_ecc_make_key_256_nb(&nb_ctx.sp_ctx, rng, key->k,
  5028. &key->pubkey, key->heap);
  5029. } while (err == FP_WOULDBLOCK);
  5030. #else
  5031. err = sp_ecc_make_key_256(rng, key->k, &key->pubkey, key->heap);
  5032. #endif /* WC_ECC_NONBLOCK_ONLY */
  5033. }
  5034. #endif /* !WC_ECC_NONBLOCK */
  5035. if (err == MP_OKAY) {
  5036. key->type = ECC_PRIVATEKEY;
  5037. }
  5038. }
  5039. else
  5040. #endif /* !WOLFSSL_SP_NO_256 */
  5041. #ifdef WOLFSSL_SP_384
  5042. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  5043. #ifndef WC_ECC_NONBLOCK
  5044. err = sp_ecc_make_key_384(rng, key->k, &key->pubkey, key->heap);
  5045. #else
  5046. if (key->nb_ctx) {
  5047. err = sp_ecc_make_key_384_nb(&key->nb_ctx->sp_ctx, rng, key->k,
  5048. &key->pubkey, key->heap);
  5049. }
  5050. else {
  5051. #ifdef WC_ECC_NONBLOCK_ONLY
  5052. do { /* perform blocking call to non-blocking function */
  5053. err = sp_ecc_make_key_384_nb(&nb_ctx.sp_ctx, rng, key->k,
  5054. &key->pubkey, key->heap);
  5055. } while (err == FP_WOULDBLOCK);
  5056. #else
  5057. err = sp_ecc_make_key_384(rng, key->k, &key->pubkey, key->heap);
  5058. #endif /* WC_ECC_NONBLOCK_ONLY */
  5059. }
  5060. #endif /* !WC_ECC_NONBLOCK */
  5061. if (err == MP_OKAY) {
  5062. key->type = ECC_PRIVATEKEY;
  5063. }
  5064. }
  5065. else
  5066. #endif /* WOLFSSL_SP_384 */
  5067. #ifdef WOLFSSL_SP_521
  5068. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) {
  5069. #ifndef WC_ECC_NONBLOCK
  5070. err = sp_ecc_make_key_521(rng, key->k, &key->pubkey, key->heap);
  5071. #else
  5072. if (key->nb_ctx) {
  5073. err = sp_ecc_make_key_521_nb(&key->nb_ctx->sp_ctx, rng, key->k,
  5074. &key->pubkey, key->heap);
  5075. }
  5076. else {
  5077. #ifdef WC_ECC_NONBLOCK_ONLY
  5078. do { /* perform blocking call to non-blocking function */
  5079. err = sp_ecc_make_key_521_nb(&nb_ctx.sp_ctx, rng, key->k,
  5080. &key->pubkey, key->heap);
  5081. } while (err == FP_WOULDBLOCK);
  5082. #else
  5083. err = sp_ecc_make_key_521(rng, key->k, &key->pubkey, key->heap);
  5084. #endif /* WC_ECC_NONBLOCK_ONLY */
  5085. }
  5086. #endif /* !WC_ECC_NONBLOCK */
  5087. if (err == MP_OKAY) {
  5088. key->type = ECC_PRIVATEKEY;
  5089. }
  5090. }
  5091. else
  5092. #endif /* WOLFSSL_SP_521 */
  5093. #endif /* WOLFSSL_HAVE_SP_ECC */
  5094. { /* software key gen */
  5095. #if defined(WOLFSSL_SP_MATH)
  5096. err = WC_KEY_SIZE_E;
  5097. #else
  5098. DECLARE_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  5099. /* setup the key variables */
  5100. #ifndef ALT_ECC_SIZE
  5101. err = mp_init(key->k);
  5102. #else
  5103. key->k = (mp_int*)key->ka;
  5104. alt_fp_init(key->k);
  5105. #endif
  5106. /* load curve info */
  5107. if (err == MP_OKAY) {
  5108. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  5109. }
  5110. if (err == MP_OKAY) {
  5111. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  5112. }
  5113. /* generate k */
  5114. if (err == MP_OKAY) {
  5115. err = wc_ecc_gen_k(rng, key->dp->size, key->k, curve->order);
  5116. }
  5117. /* generate public key from k */
  5118. if (err == MP_OKAY) {
  5119. err = ecc_make_pub_ex(key, curve, NULL, rng);
  5120. }
  5121. if (err == MP_OKAY
  5122. #ifdef WOLFSSL_ASYNC_CRYPT
  5123. || err == WC_PENDING_E
  5124. #endif
  5125. ) {
  5126. key->type = ECC_PRIVATEKEY;
  5127. }
  5128. else {
  5129. /* cleanup these on failure case only */
  5130. mp_forcezero(key->k);
  5131. }
  5132. /* cleanup allocations */
  5133. wc_ecc_curve_free(curve);
  5134. FREE_CURVE_SPECS();
  5135. #endif /* WOLFSSL_SP_MATH */
  5136. }
  5137. #ifdef HAVE_WOLF_BIGINT
  5138. if (err == MP_OKAY)
  5139. err = wc_mp_to_bigint(key->k, &key->k->raw);
  5140. if (err == MP_OKAY)
  5141. err = wc_mp_to_bigint(key->pubkey.x, &key->pubkey.x->raw);
  5142. if (err == MP_OKAY)
  5143. err = wc_mp_to_bigint(key->pubkey.y, &key->pubkey.y->raw);
  5144. if (err == MP_OKAY)
  5145. err = wc_mp_to_bigint(key->pubkey.z, &key->pubkey.z->raw);
  5146. #endif
  5147. #endif /* HAVE_ECC_MAKE_PUB */
  5148. return err;
  5149. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  5150. }
  5151. int wc_ecc_make_key_ex2(WC_RNG* rng, int keysize, ecc_key* key, int curve_id,
  5152. int flags)
  5153. {
  5154. int err;
  5155. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  5156. err = _ecc_make_key_ex(rng, keysize, key, curve_id, flags);
  5157. #if (FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_ECC_KEYGEN)) && \
  5158. !defined(WOLFSSL_KCAPI_ECC)
  5159. if (err == MP_OKAY) {
  5160. err = _ecc_validate_public_key(key, 0, 0);
  5161. }
  5162. if (err == MP_OKAY
  5163. #if defined(WOLF_CRYPTO_CB)
  5164. /* even if WOLF_CRYPTO_CB we generate the key if the devId is invalid */
  5165. && key->devId == INVALID_DEVID
  5166. #endif
  5167. ) {
  5168. err = _ecc_pairwise_consistency_test(key, rng);
  5169. }
  5170. #endif
  5171. RESTORE_VECTOR_REGISTERS();
  5172. return err;
  5173. }
  5174. WOLFSSL_ABI
  5175. int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id)
  5176. {
  5177. return wc_ecc_make_key_ex2(rng, keysize, key, curve_id, WC_ECC_FLAG_NONE);
  5178. }
  5179. #ifdef ECC_DUMP_OID
  5180. /* Optional dump of encoded OID for adding new curves */
  5181. static int mOidDumpDone;
  5182. static void wc_ecc_dump_oids(void)
  5183. {
  5184. int x;
  5185. if (mOidDumpDone) {
  5186. return;
  5187. }
  5188. /* find matching OID sum (based on encoded value) */
  5189. for (x = 0; ecc_sets[x].size != 0; x++) {
  5190. int i;
  5191. byte* oid;
  5192. word32 oidSz, sum = 0;
  5193. printf("ECC %s (%d):\n", ecc_sets[x].name, x);
  5194. #ifdef HAVE_OID_ENCODING
  5195. byte oidEnc[ECC_MAX_OID_LEN];
  5196. oid = oidEnc;
  5197. oidSz = ECC_MAX_OID_LEN;
  5198. printf("OID: ");
  5199. for (i = 0; i < (int)ecc_sets[x].oidSz; i++) {
  5200. printf("%d.", ecc_sets[x].oid[i]);
  5201. }
  5202. printf("\n");
  5203. EncodeObjectId(ecc_sets[x].oid, ecc_sets[x].oidSz, oidEnc, &oidSz);
  5204. #else
  5205. oid = (byte*)ecc_sets[x].oid;
  5206. oidSz = ecc_sets[x].oidSz;
  5207. #endif
  5208. printf("OID Encoded: ");
  5209. for (i = 0; i < (int)oidSz; i++) {
  5210. printf("0x%02X,", oid[i]);
  5211. }
  5212. printf("\n");
  5213. for (i = 0; i < (int)oidSz; i++) {
  5214. sum += oid[i];
  5215. }
  5216. printf("Sum: %u\n", sum);
  5217. /* validate sum */
  5218. if (ecc_sets[x].oidSum != sum) {
  5219. fprintf(stderr, " Sum %u Not Valid!\n", ecc_sets[x].oidSum);
  5220. }
  5221. }
  5222. mOidDumpDone = 1;
  5223. }
  5224. #endif /* ECC_DUMP_OID */
  5225. WOLFSSL_ABI
  5226. ecc_key* wc_ecc_key_new(void* heap)
  5227. {
  5228. int devId = INVALID_DEVID;
  5229. ecc_key* key;
  5230. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  5231. /* assume all keys are using CAAM for ECC unless explicitly set otherwise */
  5232. devId = WOLFSSL_CAAM_DEVID;
  5233. #endif
  5234. key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  5235. if (key) {
  5236. if (wc_ecc_init_ex(key, heap, devId) != 0) {
  5237. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  5238. key = NULL;
  5239. }
  5240. }
  5241. return key;
  5242. }
  5243. WOLFSSL_ABI
  5244. void wc_ecc_key_free(ecc_key* key)
  5245. {
  5246. if (key) {
  5247. void* heap = key->heap;
  5248. wc_ecc_free(key);
  5249. ForceZero(key, sizeof(ecc_key));
  5250. XFREE(key, heap, DYNAMIC_TYPE_ECC);
  5251. (void)heap;
  5252. }
  5253. }
  5254. /**
  5255. Make a new ECC key
  5256. rng An active RNG state
  5257. keysize The keysize for the new key (in octets from 20 to 65 bytes)
  5258. key [out] Destination of the newly created key
  5259. return MP_OKAY if successful,
  5260. upon error all allocated memory will be freed
  5261. */
  5262. WOLFSSL_ABI
  5263. int wc_ecc_make_key(WC_RNG* rng, int keysize, ecc_key* key)
  5264. {
  5265. return wc_ecc_make_key_ex(rng, keysize, key, ECC_CURVE_DEF);
  5266. }
  5267. /* Setup dynamic pointers if using normal math for proper freeing */
  5268. WOLFSSL_ABI
  5269. int wc_ecc_init_ex(ecc_key* key, void* heap, int devId)
  5270. {
  5271. int ret = 0;
  5272. #if defined(HAVE_PKCS11)
  5273. int isPkcs11 = 0;
  5274. #endif
  5275. if (key == NULL) {
  5276. return BAD_FUNC_ARG;
  5277. }
  5278. #if defined(HAVE_PKCS11)
  5279. if (key->isPkcs11) {
  5280. isPkcs11 = 1;
  5281. }
  5282. #endif
  5283. #ifdef ECC_DUMP_OID
  5284. wc_ecc_dump_oids();
  5285. #endif
  5286. XMEMSET(key, 0, sizeof(ecc_key));
  5287. key->state = ECC_STATE_NONE;
  5288. #if defined(PLUTON_CRYPTO_ECC) || defined(WOLF_CRYPTO_CB)
  5289. key->devId = devId;
  5290. #else
  5291. (void)devId;
  5292. #endif
  5293. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  5294. key->slot = ATECC_INVALID_SLOT;
  5295. #elif defined(WOLFSSL_KCAPI_ECC)
  5296. key->handle = NULL;
  5297. #else
  5298. #ifdef ALT_ECC_SIZE
  5299. key->pubkey.x = (mp_int*)&key->pubkey.xyz[0];
  5300. key->pubkey.y = (mp_int*)&key->pubkey.xyz[1];
  5301. key->pubkey.z = (mp_int*)&key->pubkey.xyz[2];
  5302. alt_fp_init(key->pubkey.x);
  5303. alt_fp_init(key->pubkey.y);
  5304. alt_fp_init(key->pubkey.z);
  5305. key->k = (mp_int*)key->ka;
  5306. alt_fp_init(key->k);
  5307. #else
  5308. ret = mp_init_multi(key->k, key->pubkey.x, key->pubkey.y, key->pubkey.z,
  5309. NULL, NULL);
  5310. if (ret != MP_OKAY) {
  5311. return MEMORY_E;
  5312. }
  5313. #endif /* ALT_ECC_SIZE */
  5314. #endif /* WOLFSSL_ATECC508A */
  5315. #if (defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) || \
  5316. defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  5317. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)) && \
  5318. defined(WOLFSSL_NO_MALLOC)
  5319. ret = mp_init(key->sign_k);
  5320. if (ret != MP_OKAY) {
  5321. return MEMORY_E;
  5322. }
  5323. #endif
  5324. #ifdef WOLFSSL_HEAP_TEST
  5325. key->heap = (void*)WOLFSSL_HEAP_TEST;
  5326. #else
  5327. key->heap = heap;
  5328. #endif
  5329. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5330. #if defined(HAVE_PKCS11)
  5331. if (!isPkcs11)
  5332. #endif
  5333. {
  5334. /* handle as async */
  5335. ret = wolfAsync_DevCtxInit(&key->asyncDev, WOLFSSL_ASYNC_MARKER_ECC,
  5336. key->heap, devId);
  5337. }
  5338. #elif defined(HAVE_PKCS11)
  5339. (void)isPkcs11;
  5340. #endif
  5341. #if defined(WOLFSSL_DSP)
  5342. key->handle = -1;
  5343. #endif
  5344. #ifdef WOLFSSL_SE050
  5345. key->keyId = 0;
  5346. key->keyIdSet = 0;
  5347. #endif
  5348. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5349. mp_memzero_add("ECC k", key->k);
  5350. #endif
  5351. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5352. key->privKey = key->keyRaw + (2 * ECC_MAX_CRYPTO_HW_SIZE);
  5353. if (wc_InitXsecure(&(key->xSec))) {
  5354. WOLFSSL_MSG("Can't initialize Xsecure");
  5355. return WC_HW_E;
  5356. }
  5357. #endif
  5358. return ret;
  5359. }
  5360. WOLFSSL_ABI
  5361. int wc_ecc_init(ecc_key* key)
  5362. {
  5363. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  5364. return wc_ecc_init_ex(key, NULL, WOLFSSL_CAAM_DEVID);
  5365. #else
  5366. return wc_ecc_init_ex(key, NULL, INVALID_DEVID);
  5367. #endif
  5368. }
  5369. #ifdef WOLF_PRIVATE_KEY_ID
  5370. int wc_ecc_init_id(ecc_key* key, unsigned char* id, int len, void* heap,
  5371. int devId)
  5372. {
  5373. int ret = 0;
  5374. #ifdef WOLFSSL_SE050
  5375. /* SE050 TLS users store a word32 at id, need to cast back */
  5376. word32* keyPtr = NULL;
  5377. #endif
  5378. if (key == NULL)
  5379. ret = BAD_FUNC_ARG;
  5380. if (ret == 0 && (len < 0 || len > ECC_MAX_ID_LEN))
  5381. ret = BUFFER_E;
  5382. #if defined(HAVE_PKCS11)
  5383. XMEMSET(key, 0, sizeof(ecc_key));
  5384. key->isPkcs11 = 1;
  5385. #endif
  5386. if (ret == 0)
  5387. ret = wc_ecc_init_ex(key, heap, devId);
  5388. if (ret == 0 && id != NULL && len != 0) {
  5389. XMEMCPY(key->id, id, (size_t)len);
  5390. key->idLen = len;
  5391. #ifdef WOLFSSL_SE050
  5392. /* Set SE050 ID from word32, populate ecc_key with public from SE050 */
  5393. if (len == (int)sizeof(word32)) {
  5394. keyPtr = (word32*)key->id;
  5395. ret = wc_ecc_use_key_id(key, *keyPtr, 0);
  5396. }
  5397. #endif
  5398. }
  5399. return ret;
  5400. }
  5401. int wc_ecc_init_label(ecc_key* key, const char* label, void* heap, int devId)
  5402. {
  5403. int ret = 0;
  5404. int labelLen = 0;
  5405. if (key == NULL || label == NULL)
  5406. ret = BAD_FUNC_ARG;
  5407. if (ret == 0) {
  5408. labelLen = (int)XSTRLEN(label);
  5409. if (labelLen == 0 || labelLen > ECC_MAX_LABEL_LEN)
  5410. ret = BUFFER_E;
  5411. }
  5412. #if defined(HAVE_PKCS11)
  5413. XMEMSET(key, 0, sizeof(ecc_key));
  5414. key->isPkcs11 = 1;
  5415. #endif
  5416. if (ret == 0)
  5417. ret = wc_ecc_init_ex(key, heap, devId);
  5418. if (ret == 0) {
  5419. XMEMCPY(key->label, label, (size_t)labelLen);
  5420. key->labelLen = labelLen;
  5421. }
  5422. return ret;
  5423. }
  5424. #endif /* WOLF_PRIVATE_KEY_ID */
  5425. int wc_ecc_set_flags(ecc_key* key, word32 flags)
  5426. {
  5427. if (key == NULL) {
  5428. return BAD_FUNC_ARG;
  5429. }
  5430. key->flags |= flags;
  5431. return 0;
  5432. }
  5433. static int wc_ecc_get_curve_order_bit_count(const ecc_set_type* dp)
  5434. {
  5435. int err = MP_OKAY;
  5436. int orderBits;
  5437. DECLARE_CURVE_SPECS(1);
  5438. ALLOC_CURVE_SPECS(1, err);
  5439. if (err == MP_OKAY) {
  5440. err = wc_ecc_curve_load(dp, &curve, ECC_CURVE_FIELD_ORDER);
  5441. }
  5442. if (err != 0) {
  5443. FREE_CURVE_SPECS();
  5444. return err;
  5445. }
  5446. orderBits = mp_count_bits(curve->order);
  5447. wc_ecc_curve_free(curve);
  5448. FREE_CURVE_SPECS();
  5449. return orderBits;
  5450. }
  5451. #ifdef HAVE_ECC_SIGN
  5452. #ifndef NO_ASN
  5453. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  5454. defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) || \
  5455. defined(WOLFSSL_SILABS_SE_ACCEL) || defined(WOLFSSL_KCAPI_ECC) || \
  5456. defined(WOLFSSL_SE050) || defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5457. static int wc_ecc_sign_hash_hw(const byte* in, word32 inlen,
  5458. mp_int* r, mp_int* s, byte* out, word32 *outlen, WC_RNG* rng,
  5459. ecc_key* key)
  5460. {
  5461. int err;
  5462. #ifdef PLUTON_CRYPTO_ECC
  5463. if (key->devId != INVALID_DEVID) /* use hardware */
  5464. #endif
  5465. {
  5466. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  5467. !defined(WOLFSSL_ATECC608A)
  5468. CRYS_ECDSA_SignUserContext_t sigCtxTemp;
  5469. word32 raw_sig_size = *outlen;
  5470. word32 msgLenInBytes = inlen;
  5471. CRYS_ECPKI_HASH_OpMode_t hash_mode;
  5472. #endif
  5473. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5474. #ifdef WOLFSSL_SMALL_STACK
  5475. byte* K = NULL;
  5476. byte* incopy = NULL;
  5477. #else
  5478. byte K[MAX_ECC_BYTES] = {0};
  5479. byte incopy[MAX_ECC_BYTES] = {0};
  5480. #endif
  5481. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  5482. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  5483. word32 Ksize;
  5484. #endif
  5485. #endif
  5486. word32 keysize = (word32)key->dp->size;
  5487. #ifdef PLUTON_CRYPTO_ECC
  5488. word32 orderBits = wc_ecc_get_curve_order_bit_count(key->dp);
  5489. #endif
  5490. #ifndef WOLFSSL_KCAPI_ECC
  5491. /* Check args */
  5492. if (keysize > ECC_MAX_CRYPTO_HW_SIZE || *outlen < keysize*2) {
  5493. return ECC_BAD_ARG_E;
  5494. }
  5495. #endif
  5496. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  5497. /* Sign: Result is 32-bytes of R then 32-bytes of S */
  5498. err = atmel_ecc_sign(key->slot, in, out);
  5499. if (err != 0) {
  5500. return err;
  5501. }
  5502. #elif defined(PLUTON_CRYPTO_ECC)
  5503. {
  5504. /* if the input is larger than curve order, we must truncate */
  5505. if ((inlen * WOLFSSL_BIT_SIZE) > orderBits) {
  5506. inlen = (orderBits + WOLFSSL_BIT_SIZE - 1) / WOLFSSL_BIT_SIZE;
  5507. }
  5508. /* perform ECC sign */
  5509. word32 raw_sig_size = *outlen;
  5510. err = Crypto_EccSign(in, inlen, out, &raw_sig_size);
  5511. if (err != CRYPTO_RES_SUCCESS || raw_sig_size != keysize*2){
  5512. return BAD_COND_E;
  5513. }
  5514. }
  5515. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  5516. err = silabs_ecc_sign_hash(in, inlen, out, outlen, key);
  5517. if (err != 0) {
  5518. return WC_HW_E;
  5519. }
  5520. #elif defined(WOLFSSL_CRYPTOCELL)
  5521. /* truncate if hash is longer than key size */
  5522. if (msgLenInBytes > keysize) {
  5523. msgLenInBytes = keysize;
  5524. }
  5525. hash_mode = cc310_hashModeECC(msgLenInBytes);
  5526. if (hash_mode == CRYS_ECPKI_HASH_OpModeLast) {
  5527. (void)cc310_hashModeECC(keysize);
  5528. /* Ignoring returned value */
  5529. hash_mode = CRYS_ECPKI_HASH_SHA256_mode;
  5530. }
  5531. /* create signature from an input buffer using a private key*/
  5532. err = CRYS_ECDSA_Sign(&wc_rndState,
  5533. wc_rndGenVectFunc,
  5534. &sigCtxTemp,
  5535. &key->ctx.privKey,
  5536. hash_mode,
  5537. (byte*)in,
  5538. msgLenInBytes,
  5539. out,
  5540. (uint32_t*)&raw_sig_size);
  5541. if (err != SA_SILIB_RET_OK){
  5542. WOLFSSL_MSG("CRYS_ECDSA_Sign failed");
  5543. return err;
  5544. }
  5545. #elif defined(WOLFSSL_KCAPI_ECC)
  5546. err = KcapiEcc_Sign(key, in, inlen, out, *outlen);
  5547. if (err != MP_OKAY) {
  5548. return err;
  5549. }
  5550. (void)rng;
  5551. #elif defined(WOLFSSL_SE050)
  5552. err = se050_ecc_sign_hash_ex(in, inlen, r, s, out, outlen, key);
  5553. if (err != MP_OKAY) {
  5554. return err;
  5555. }
  5556. (void)rng;
  5557. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5558. #ifdef WOLFSSL_SMALL_STACK
  5559. K = (byte*)XMALLOC(keysize, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5560. incopy = (byte*)XMALLOC(inlen, key->heap, DYNAMIC_TYPE_HASH_TMP);
  5561. if (K == NULL || incopy == NULL) {
  5562. XFREE(incopy, key->heap, DYNAMIC_TYPE_HASH_TMP);
  5563. XFREE(K, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5564. return MEMORY_E;
  5565. }
  5566. #else
  5567. if (inlen > sizeof(incopy))
  5568. return ECC_BAD_ARG_E;
  5569. #endif
  5570. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  5571. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  5572. err = deterministic_sign_helper(in, inlen, key);
  5573. if (err)
  5574. return err;
  5575. Ksize = mp_unsigned_bin_size(key->sign_k);
  5576. if (Ksize > keysize) {
  5577. err = BUFFER_E;
  5578. goto error_out;
  5579. }
  5580. err = mp_to_unsigned_bin(key->sign_k, K);
  5581. if (err)
  5582. goto error_out;
  5583. mp_reverse(K, Ksize);
  5584. #else
  5585. err = wc_RNG_GenerateBlock(rng, K, keysize);
  5586. if (err)
  5587. goto error_out;
  5588. /* Make sure that K is max. 521 bits */
  5589. if (keysize == 66)
  5590. K[65] &= 0x1;
  5591. #endif
  5592. buf_reverse(incopy, in, inlen < keysize ? inlen : keysize);
  5593. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(incopy), keysize);
  5594. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->privKey), keysize);
  5595. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(K), keysize);
  5596. WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(out), keysize * 2);
  5597. err = XSecure_EllipticGenerateSign(&(key->xSec.cinst),
  5598. xil_curve_type[key->dp->id],
  5599. XIL_CAST_U64(incopy), keysize,
  5600. XIL_CAST_U64(key->privKey),
  5601. XIL_CAST_U64(K),
  5602. XIL_CAST_U64(out));
  5603. if (err) {
  5604. WOLFSSL_XIL_ERROR("Generate ECC signature failed", err);
  5605. err = WC_HW_E;
  5606. }
  5607. WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(out), keysize * 2);
  5608. mp_reverse(&out[0], keysize);
  5609. mp_reverse(&out[keysize], keysize);
  5610. error_out:
  5611. ForceZero(K, MAX_ECC_BYTES);
  5612. #ifdef WOLFSSL_SMALL_STACK
  5613. XFREE(incopy, key->heap, DYNAMIC_TYPE_HASH_TMP);
  5614. XFREE(K, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5615. #endif
  5616. if (err) {
  5617. ForceZero(out, keysize * 2);
  5618. return err;
  5619. }
  5620. #endif /* HW-specific #if-#elif chain */
  5621. #ifndef WOLFSSL_SE050
  5622. /* Load R and S, SE050 does this in port layer */
  5623. err = mp_read_unsigned_bin(r, &out[0], keysize);
  5624. if (err != MP_OKAY) {
  5625. return err;
  5626. }
  5627. err = mp_read_unsigned_bin(s, &out[keysize], keysize);
  5628. if (err != MP_OKAY) {
  5629. return err;
  5630. }
  5631. #endif
  5632. /* Check for zeros */
  5633. if (mp_iszero(r) || mp_iszero(s)) {
  5634. return MP_ZERO_E;
  5635. }
  5636. }
  5637. #ifdef PLUTON_CRYPTO_ECC
  5638. else {
  5639. err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  5640. }
  5641. #endif
  5642. (void)rng;
  5643. return err;
  5644. }
  5645. #endif /* WOLFSSL_ATECC508A || PLUTON_CRYPTO_ECC || WOLFSSL_CRYPTOCELL */
  5646. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5647. static int wc_ecc_sign_hash_async(const byte* in, word32 inlen, byte* out,
  5648. word32 *outlen, WC_RNG* rng, ecc_key* key)
  5649. {
  5650. int err;
  5651. mp_int *r = NULL, *s = NULL;
  5652. if (in == NULL || out == NULL || outlen == NULL || key == NULL ||
  5653. rng == NULL) {
  5654. return ECC_BAD_ARG_E;
  5655. }
  5656. err = wc_ecc_alloc_async(key);
  5657. if (err != 0) {
  5658. return err;
  5659. }
  5660. r = key->r;
  5661. s = key->s;
  5662. switch (key->state) {
  5663. case ECC_STATE_NONE:
  5664. case ECC_STATE_SIGN_DO:
  5665. key->state = ECC_STATE_SIGN_DO;
  5666. if ((err = mp_init_multi(r, s, NULL, NULL, NULL, NULL)) != MP_OKAY){
  5667. break;
  5668. }
  5669. err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  5670. if (err < 0) {
  5671. break;
  5672. }
  5673. FALL_THROUGH;
  5674. case ECC_STATE_SIGN_ENCODE:
  5675. key->state = ECC_STATE_SIGN_ENCODE;
  5676. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  5677. #if !defined(WOLFSSL_ASYNC_CRYPT_SW) && defined(HAVE_ECC_CDH)
  5678. DECLARE_CURVE_SPECS(1);
  5679. ALLOC_CURVE_SPECS(1, err);
  5680. /* get curve order */
  5681. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  5682. #endif
  5683. #ifdef HAVE_CAVIUM_V
  5684. /* Nitrox requires r and s in sep buffer, so split it */
  5685. NitroxEccRsSplit(key, &r->raw, &s->raw);
  5686. #endif
  5687. #ifndef WOLFSSL_ASYNC_CRYPT_SW
  5688. /* only do this if not software, since it overwrites result */
  5689. wc_bigint_to_mp(&r->raw, r);
  5690. wc_bigint_to_mp(&s->raw, s);
  5691. /* if using a curve with cofactor != 1 then reduce by mod order */
  5692. #ifdef HAVE_ECC_CDH
  5693. /* if r is not less than order than reduce */
  5694. if (err == 0 && mp_count_bits(r) > mp_count_bits(curve->order)) {
  5695. err = mp_mod(r, curve->order, r);
  5696. }
  5697. wc_ecc_curve_free(curve);
  5698. FREE_CURVE_SPECS();
  5699. #endif
  5700. #endif /* !WOLFSSL_ASYNC_CRYPT_SW */
  5701. }
  5702. /* encoded with DSA header */
  5703. if (err == 0) {
  5704. err = StoreECC_DSA_Sig(out, outlen, r, s);
  5705. }
  5706. /* done with R/S */
  5707. mp_clear(r);
  5708. mp_clear(s);
  5709. break;
  5710. default:
  5711. err = BAD_STATE_E;
  5712. break;
  5713. }
  5714. /* if async pending then return and skip done cleanup below */
  5715. if (err == WC_PENDING_E) {
  5716. key->state++;
  5717. return err;
  5718. }
  5719. /* cleanup */
  5720. wc_ecc_free_async(key);
  5721. key->state = ECC_STATE_NONE;
  5722. return err;
  5723. }
  5724. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  5725. /**
  5726. Sign a message digest
  5727. in The message digest to sign
  5728. inlen The length of the digest
  5729. out [out] The destination for the signature
  5730. outlen [in/out] The max size and resulting size of the signature
  5731. key A private ECC key
  5732. return MP_OKAY if successful
  5733. */
  5734. WOLFSSL_ABI
  5735. int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen,
  5736. WC_RNG* rng, ecc_key* key)
  5737. {
  5738. int err;
  5739. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(WC_ASYNC_ENABLE_ECC)
  5740. DECL_MP_INT_SIZE_DYN(r, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  5741. DECL_MP_INT_SIZE_DYN(s, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  5742. #endif
  5743. if (in == NULL || out == NULL || outlen == NULL || key == NULL) {
  5744. return ECC_BAD_ARG_E;
  5745. }
  5746. #ifdef WOLF_CRYPTO_CB
  5747. #ifndef WOLF_CRYPTO_CB_FIND
  5748. if (key->devId != INVALID_DEVID)
  5749. #endif
  5750. {
  5751. err = wc_CryptoCb_EccSign(in, inlen, out, outlen, rng, key);
  5752. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  5753. if (err != CRYPTOCB_UNAVAILABLE)
  5754. return err;
  5755. /* fall-through when unavailable */
  5756. #endif
  5757. #ifdef WOLF_CRYPTO_CB_ONLY_ECC
  5758. if (err == CRYPTOCB_UNAVAILABLE) {
  5759. err = NO_VALID_DEVID;
  5760. }
  5761. #endif
  5762. }
  5763. #endif
  5764. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  5765. if (rng == NULL) {
  5766. WOLFSSL_MSG("ECC sign RNG missing");
  5767. return ECC_BAD_ARG_E;
  5768. }
  5769. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  5770. /* handle async cases */
  5771. err = wc_ecc_sign_hash_async(in, inlen, out, outlen, rng, key);
  5772. #else
  5773. NEW_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  5774. #ifdef MP_INT_SIZE_CHECK_NULL
  5775. if (r == NULL)
  5776. return MEMORY_E;
  5777. #endif
  5778. NEW_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  5779. #ifdef MP_INT_SIZE_CHECK_NULL
  5780. if (s == NULL) {
  5781. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  5782. return MEMORY_E;
  5783. }
  5784. #endif
  5785. err = INIT_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key));
  5786. if (err != 0) {
  5787. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  5788. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  5789. return err;
  5790. }
  5791. err = INIT_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key));
  5792. if (err != 0) {
  5793. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  5794. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  5795. return err;
  5796. }
  5797. /* hardware crypto */
  5798. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  5799. defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) || \
  5800. defined(WOLFSSL_SILABS_SE_ACCEL) || defined(WOLFSSL_KCAPI_ECC) || \
  5801. defined(WOLFSSL_SE050) || defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  5802. err = wc_ecc_sign_hash_hw(in, inlen, r, s, out, outlen, rng, key);
  5803. #else
  5804. err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  5805. #endif
  5806. if (err < 0) {
  5807. mp_clear(r);
  5808. mp_clear(s);
  5809. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  5810. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  5811. return err;
  5812. }
  5813. /* encoded with DSA header */
  5814. err = StoreECC_DSA_Sig(out, outlen, r, s);
  5815. /* cleanup */
  5816. mp_clear(r);
  5817. mp_clear(s);
  5818. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  5819. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  5820. #endif /* WOLFSSL_ASYNC_CRYPT */
  5821. #else
  5822. (void)rng;
  5823. (void)inlen;
  5824. (void)s;
  5825. (void)r;
  5826. (void)err;
  5827. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  5828. return err;
  5829. }
  5830. #endif /* !NO_ASN */
  5831. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  5832. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  5833. /* returns MP_OKAY on success */
  5834. static int deterministic_sign_helper(const byte* in, word32 inlen, ecc_key* key)
  5835. {
  5836. int err = MP_OKAY;
  5837. DECLARE_CURVE_SPECS(1);
  5838. ALLOC_CURVE_SPECS(1, err);
  5839. /* get curve order */
  5840. if (err == MP_OKAY) {
  5841. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  5842. }
  5843. if (err == MP_OKAY) {
  5844. #ifndef WOLFSSL_NO_MALLOC
  5845. /* if key->sign_k is NULL then create a buffer for the mp_int
  5846. * if not NULL then assume the user correctly set deterministic flag and
  5847. * that the key->sign_k holds a previously malloc'd mp_int buffer */
  5848. if (key->sign_k == NULL) {
  5849. key->sign_k = (mp_int*)XMALLOC(sizeof(mp_int), key->heap,
  5850. DYNAMIC_TYPE_ECC);
  5851. }
  5852. if (key->sign_k != NULL) {
  5853. /* currently limiting to SHA256 for auto create */
  5854. if (mp_init(key->sign_k) != MP_OKAY ||
  5855. wc_ecc_gen_deterministic_k(in, inlen,
  5856. WC_HASH_TYPE_SHA256, key->k, key->sign_k,
  5857. curve->order, key->heap) != 0) {
  5858. mp_free(key->sign_k);
  5859. XFREE(key->sign_k, key->heap, DYNAMIC_TYPE_ECC);
  5860. key->sign_k = NULL;
  5861. err = ECC_PRIV_KEY_E;
  5862. }
  5863. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5864. else {
  5865. mp_memzero_add("deterministic_sign_helper sign_k", key->sign_k);
  5866. }
  5867. #endif
  5868. }
  5869. else {
  5870. err = MEMORY_E;
  5871. }
  5872. #else
  5873. key->sign_k_set = 0;
  5874. /* currently limiting to SHA256 for auto create */
  5875. if (wc_ecc_gen_deterministic_k(in, inlen, WC_HASH_TYPE_SHA256, key->k,
  5876. key->sign_k, curve->order, key->heap) != 0) {
  5877. err = ECC_PRIV_KEY_E;
  5878. }
  5879. else {
  5880. key->sign_k_set = 1;
  5881. }
  5882. #endif
  5883. }
  5884. wc_ecc_curve_free(curve);
  5885. FREE_CURVE_SPECS();
  5886. return err;
  5887. }
  5888. #endif /* WOLFSSL_ECDSA_DETERMINISTIC_K ||
  5889. WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT */
  5890. #if defined(WOLFSSL_STM32_PKA)
  5891. int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
  5892. ecc_key* key, mp_int *r, mp_int *s)
  5893. {
  5894. return stm32_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
  5895. }
  5896. #elif !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  5897. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_KCAPI_ECC)
  5898. #ifndef WOLFSSL_SP_MATH
  5899. static int ecc_sign_hash_sw(ecc_key* key, ecc_key* pubkey, WC_RNG* rng,
  5900. ecc_curve_spec* curve, mp_int* e, mp_int* r,
  5901. mp_int* s)
  5902. {
  5903. int err = MP_OKAY;
  5904. int loop_check = 0;
  5905. DECL_MP_INT_SIZE_DYN(b, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  5906. NEW_MP_INT_SIZE(b, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  5907. #ifdef MP_INT_SIZE_CHECK_NULL
  5908. if (b == NULL)
  5909. err = MEMORY_E;
  5910. #endif
  5911. if (err == MP_OKAY) {
  5912. err = INIT_MP_INT_SIZE(b, ECC_KEY_MAX_BITS(key));
  5913. }
  5914. #ifdef WOLFSSL_CUSTOM_CURVES
  5915. /* if custom curve, apply params to pubkey */
  5916. if (err == MP_OKAY && key->idx == ECC_CUSTOM_IDX) {
  5917. err = wc_ecc_set_custom_curve(pubkey, key->dp);
  5918. }
  5919. #endif
  5920. if (err == MP_OKAY) {
  5921. /* Generate blinding value - non-zero value. */
  5922. do {
  5923. if (++loop_check > 64) {
  5924. err = RNG_FAILURE_E;
  5925. break;
  5926. }
  5927. err = wc_ecc_gen_k(rng, key->dp->size, b, curve->order);
  5928. }
  5929. while (err == MP_ZERO_E);
  5930. loop_check = 0;
  5931. }
  5932. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5933. if (err == MP_OKAY) {
  5934. mp_memzero_add("ecc_sign_hash_sw b", b);
  5935. }
  5936. #endif
  5937. for (; err == MP_OKAY;) {
  5938. if (++loop_check > 64) {
  5939. err = RNG_FAILURE_E;
  5940. break;
  5941. }
  5942. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) || \
  5943. defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  5944. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  5945. #ifndef WOLFSSL_NO_MALLOC
  5946. if (key->sign_k != NULL)
  5947. #else
  5948. if (key->sign_k_set)
  5949. #endif
  5950. {
  5951. if (loop_check > 1) {
  5952. err = RNG_FAILURE_E;
  5953. break;
  5954. }
  5955. /* use provided sign_k */
  5956. err = mp_copy(key->sign_k, pubkey->k);
  5957. if (err != MP_OKAY) break;
  5958. /* free sign_k, so only used once */
  5959. mp_forcezero(key->sign_k);
  5960. #ifndef WOLFSSL_NO_MALLOC
  5961. mp_free(key->sign_k);
  5962. XFREE(key->sign_k, key->heap, DYNAMIC_TYPE_ECC);
  5963. key->sign_k = NULL;
  5964. #else
  5965. key->sign_k_set = 0;
  5966. #endif
  5967. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  5968. loop_check = 64;
  5969. #endif
  5970. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  5971. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  5972. if (key->deterministic == 1) {
  5973. /* sign_k generated earlier in function for SP calls.
  5974. * Only go through the loop once and fail if error */
  5975. loop_check = 64;
  5976. }
  5977. #endif
  5978. /* compute public key based on provided "k" */
  5979. err = ecc_make_pub_ex(pubkey, curve, NULL, rng);
  5980. }
  5981. else
  5982. #endif
  5983. {
  5984. err = _ecc_make_key_ex(rng, key->dp->size, pubkey, key->dp->id,
  5985. WC_ECC_FLAG_NONE);
  5986. }
  5987. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5988. if (err == MP_OKAY) {
  5989. mp_memzero_add("ecc_sign_hash_sw k", pubkey->k);
  5990. }
  5991. #endif
  5992. #ifdef WOLFSSL_ASYNC_CRYPT
  5993. /* for async do blocking wait here */
  5994. err = wc_AsyncWait(err, &pubkey->asyncDev, WC_ASYNC_FLAG_NONE);
  5995. #endif
  5996. if (err != MP_OKAY) break;
  5997. /* find r = x1 mod n */
  5998. err = mp_mod(pubkey->pubkey.x, curve->order, r);
  5999. if (err != MP_OKAY) break;
  6000. if (mp_iszero(r) == MP_NO) {
  6001. mp_int* ep = pubkey->k;
  6002. mp_int* kp = pubkey->k;
  6003. mp_int* x = key->k;
  6004. /* find s = (e + xr)/k
  6005. = b.(e/k.b + x.r/k.b) */
  6006. /* k' = k.b */
  6007. err = mp_mulmod(pubkey->k, b, curve->order, kp);
  6008. if (err != MP_OKAY) break;
  6009. /* k' = 1/k.b
  6010. = 1/k' */
  6011. err = mp_invmod(kp, curve->order, kp);
  6012. if (err != MP_OKAY) break;
  6013. /* s = x.r */
  6014. err = mp_mulmod(x, r, curve->order, s);
  6015. if (err != MP_OKAY) break;
  6016. /* s = x.r/k.b
  6017. = k'.s */
  6018. err = mp_mulmod(kp, s, curve->order, s);
  6019. if (err != MP_OKAY) break;
  6020. /* e' = e/k.b
  6021. = e.k' */
  6022. err = mp_mulmod(kp, e, curve->order, ep);
  6023. if (err != MP_OKAY) break;
  6024. /* s = e/k.b + x.r/k.b = (e + x.r)/k.b
  6025. = e' + s */
  6026. err = mp_addmod_ct(ep, s, curve->order, s);
  6027. if (err != MP_OKAY) break;
  6028. /* s = b.(e + x.r)/k.b = (e + x.r)/k
  6029. = b.s */
  6030. err = mp_mulmod(s, b, curve->order, s);
  6031. if (err != MP_OKAY) break;
  6032. if (mp_iszero(s) == MP_NO) {
  6033. /* sign successful */
  6034. break;
  6035. }
  6036. }
  6037. #ifndef ALT_ECC_SIZE
  6038. mp_clear(pubkey->pubkey.x);
  6039. mp_clear(pubkey->pubkey.y);
  6040. mp_clear(pubkey->pubkey.z);
  6041. #endif
  6042. mp_forcezero(pubkey->k);
  6043. }
  6044. mp_forcezero(b);
  6045. FREE_MP_INT_SIZE(b, key->heap, DYNAMIC_TYPE_ECC);
  6046. #if !defined(WOLFSSL_SMALL_STACK) && defined(WOLFSSL_CHECK_MEM_ZERO)
  6047. mp_memzero_check(b);
  6048. #endif
  6049. return err;
  6050. }
  6051. #endif
  6052. #ifdef WOLFSSL_HAVE_SP_ECC
  6053. static int ecc_sign_hash_sp(const byte* in, word32 inlen, WC_RNG* rng,
  6054. ecc_key* key, mp_int *r, mp_int *s)
  6055. {
  6056. if (key->idx != ECC_CUSTOM_IDX) {
  6057. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) \
  6058. || defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6059. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6060. mp_int* sign_k = key->sign_k;
  6061. #else
  6062. mp_int* sign_k = NULL;
  6063. #endif
  6064. #if defined(WC_ECC_NONBLOCK) && defined(WC_ECC_NONBLOCK_ONLY)
  6065. /* perform blocking call to non-blocking function */
  6066. ecc_nb_ctx_t nb_ctx;
  6067. XMEMSET(&nb_ctx, 0, sizeof(nb_ctx));
  6068. #endif
  6069. #ifndef WOLFSSL_SP_NO_256
  6070. if (ecc_sets[key->idx].id == ECC_SECP256R1) {
  6071. #ifdef WC_ECC_NONBLOCK
  6072. #ifdef WC_ECC_NONBLOCK_ONLY
  6073. int err;
  6074. #endif
  6075. if (key->nb_ctx) {
  6076. return sp_ecc_sign_256_nb(&key->nb_ctx->sp_ctx, in, inlen, rng,
  6077. key->k, r, s, sign_k, key->heap);
  6078. }
  6079. #ifdef WC_ECC_NONBLOCK_ONLY
  6080. do { /* perform blocking call to non-blocking function */
  6081. err = sp_ecc_sign_256_nb(&nb_ctx.sp_ctx, in, inlen, rng,
  6082. key->k, r, s, sign_k, key->heap);
  6083. } while (err == FP_WOULDBLOCK);
  6084. return err;
  6085. #endif
  6086. #endif /* WC_ECC_NONBLOCK */
  6087. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  6088. {
  6089. int ret;
  6090. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  6091. ret = sp_ecc_sign_256(in, inlen, rng, key->k, r, s, sign_k,
  6092. key->heap);
  6093. RESTORE_VECTOR_REGISTERS();
  6094. return ret;
  6095. }
  6096. #endif
  6097. }
  6098. #endif
  6099. #ifdef WOLFSSL_SP_384
  6100. if (ecc_sets[key->idx].id == ECC_SECP384R1) {
  6101. #ifdef WC_ECC_NONBLOCK
  6102. #ifdef WC_ECC_NONBLOCK_ONLY
  6103. int err;
  6104. #endif
  6105. if (key->nb_ctx) {
  6106. return sp_ecc_sign_384_nb(&key->nb_ctx->sp_ctx, in, inlen, rng,
  6107. key->k, r, s, sign_k, key->heap);
  6108. }
  6109. #ifdef WC_ECC_NONBLOCK_ONLY
  6110. do { /* perform blocking call to non-blocking function */
  6111. err = sp_ecc_sign_384_nb(&nb_ctx.sp_ctx, in, inlen, rng,
  6112. key->k, r, s, sign_k, key->heap);
  6113. } while (err == FP_WOULDBLOCK);
  6114. return err;
  6115. #endif
  6116. #endif /* WC_ECC_NONBLOCK */
  6117. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  6118. {
  6119. int ret;
  6120. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  6121. ret = sp_ecc_sign_384(in, inlen, rng, key->k, r, s, sign_k,
  6122. key->heap);
  6123. RESTORE_VECTOR_REGISTERS();
  6124. return ret;
  6125. }
  6126. #endif
  6127. }
  6128. #endif
  6129. #ifdef WOLFSSL_SP_521
  6130. if (ecc_sets[key->idx].id == ECC_SECP521R1) {
  6131. #ifdef WC_ECC_NONBLOCK
  6132. #ifdef WC_ECC_NONBLOCK_ONLY
  6133. int err;
  6134. #endif
  6135. if (key->nb_ctx) {
  6136. return sp_ecc_sign_521_nb(&key->nb_ctx->sp_ctx, in, inlen, rng,
  6137. key->k, r, s, sign_k, key->heap);
  6138. }
  6139. #ifdef WC_ECC_NONBLOCK_ONLY
  6140. do { /* perform blocking call to non-blocking function */
  6141. err = sp_ecc_sign_521_nb(&nb_ctx.sp_ctx, in, inlen, rng,
  6142. key->k, r, s, sign_k, key->heap);
  6143. } while (err == FP_WOULDBLOCK);
  6144. return err;
  6145. #endif
  6146. #endif /* WC_ECC_NONBLOCK */
  6147. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  6148. {
  6149. int ret;
  6150. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  6151. ret = sp_ecc_sign_521(in, inlen, rng, key->k, r, s, sign_k,
  6152. key->heap);
  6153. RESTORE_VECTOR_REGISTERS();
  6154. return ret;
  6155. }
  6156. #endif
  6157. }
  6158. #endif
  6159. (void)sign_k;
  6160. }
  6161. /* SP doesn't support curve. */
  6162. return WC_KEY_SIZE_E;
  6163. }
  6164. #endif
  6165. /**
  6166. Sign a message digest
  6167. in The message digest to sign
  6168. inlen The length of the digest
  6169. key A private ECC key
  6170. r [out] The destination for r component of the signature
  6171. s [out] The destination for s component of the signature
  6172. return MP_OKAY if successful
  6173. */
  6174. int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
  6175. ecc_key* key, mp_int *r, mp_int *s)
  6176. {
  6177. int err = 0;
  6178. #if !defined(WOLFSSL_SP_MATH)
  6179. mp_int* e;
  6180. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  6181. DECL_MP_INT_SIZE_DYN(e_lcl, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  6182. #endif
  6183. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) || \
  6184. defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6185. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT) || \
  6186. (defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  6187. (defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)))
  6188. DECLARE_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  6189. #else
  6190. DECLARE_CURVE_SPECS(1);
  6191. #endif
  6192. #endif /* !WOLFSSL_SP_MATH */
  6193. if (in == NULL || r == NULL || s == NULL || key == NULL || rng == NULL) {
  6194. return ECC_BAD_ARG_E;
  6195. }
  6196. /* is this a private key? */
  6197. if (key->type != ECC_PRIVATEKEY && key->type != ECC_PRIVATEKEY_ONLY) {
  6198. return ECC_BAD_ARG_E;
  6199. }
  6200. /* is the IDX valid ? */
  6201. if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) {
  6202. return ECC_BAD_ARG_E;
  6203. }
  6204. #if defined(WOLFSSL_SP_MATH)
  6205. if (key->idx == ECC_CUSTOM_IDX || (1
  6206. #ifndef WOLFSSL_SP_NO_256
  6207. && ecc_sets[key->idx].id != ECC_SECP256R1
  6208. #endif
  6209. #ifdef WOLFSSL_SP_384
  6210. && ecc_sets[key->idx].id != ECC_SECP384R1
  6211. #endif
  6212. #ifdef WOLFSSL_SP_521
  6213. && ecc_sets[key->idx].id != ECC_SECP521R1
  6214. #endif
  6215. )) {
  6216. return WC_KEY_SIZE_E;
  6217. }
  6218. #endif
  6219. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6220. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6221. /* generate deterministic 'k' value to be used either with SP or normal */
  6222. if (key->deterministic == 1) {
  6223. if (deterministic_sign_helper(in, inlen, key)) {
  6224. WOLFSSL_MSG("Error generating deterministic k to sign");
  6225. return ECC_PRIV_KEY_E;
  6226. }
  6227. }
  6228. #endif
  6229. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  6230. defined(WOLFSSL_ASYNC_CRYPT_SW)
  6231. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  6232. if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_SIGN)) {
  6233. WC_ASYNC_SW* sw = &key->asyncDev.sw;
  6234. sw->eccSign.in = in;
  6235. sw->eccSign.inSz = inlen;
  6236. sw->eccSign.rng = rng;
  6237. sw->eccSign.key = key;
  6238. sw->eccSign.r = r;
  6239. sw->eccSign.s = s;
  6240. return WC_PENDING_E;
  6241. }
  6242. }
  6243. #endif
  6244. #if defined(WOLFSSL_HAVE_SP_ECC)
  6245. err = ecc_sign_hash_sp(in, inlen, rng, key, r, s);
  6246. if (err != WC_KEY_SIZE_E) {
  6247. return err;
  6248. }
  6249. #else
  6250. (void)inlen;
  6251. #endif
  6252. #if !defined(WOLFSSL_SP_MATH)
  6253. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V)
  6254. err = wc_ecc_alloc_mpint(key, &key->e);
  6255. if (err != 0) {
  6256. return err;
  6257. }
  6258. e = key->e;
  6259. #else
  6260. NEW_MP_INT_SIZE(e_lcl, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  6261. #ifdef MP_INT_SIZE_CHECK_NULL
  6262. if (e_lcl == NULL) {
  6263. return MEMORY_E;
  6264. }
  6265. #endif
  6266. e = e_lcl;
  6267. #endif
  6268. /* get the hash and load it as a bignum into 'e' */
  6269. /* init the bignums */
  6270. if ((err = INIT_MP_INT_SIZE(e, ECC_KEY_MAX_BITS(key))) != MP_OKAY) {
  6271. FREE_MP_INT_SIZE(e_lcl, key->heap, DYNAMIC_TYPE_ECC);
  6272. return err;
  6273. }
  6274. /* load curve info */
  6275. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) || \
  6276. defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6277. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6278. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  6279. if (err == MP_OKAY)
  6280. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  6281. #else
  6282. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  6283. (defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA))
  6284. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  6285. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  6286. if (err == MP_OKAY)
  6287. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  6288. }
  6289. else
  6290. #endif
  6291. {
  6292. ALLOC_CURVE_SPECS(1, err);
  6293. if (err == MP_OKAY)
  6294. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  6295. }
  6296. #endif
  6297. /* load digest into e */
  6298. if (err == MP_OKAY) {
  6299. /* we may need to truncate if hash is longer than key size */
  6300. word32 orderBits = (word32)mp_count_bits(curve->order);
  6301. /* truncate down to byte size, may be all that's needed */
  6302. if ((WOLFSSL_BIT_SIZE * inlen) > orderBits)
  6303. inlen = (orderBits + WOLFSSL_BIT_SIZE - 1) / WOLFSSL_BIT_SIZE;
  6304. err = mp_read_unsigned_bin(e, in, inlen);
  6305. /* may still need bit truncation too */
  6306. if (err == MP_OKAY && (WOLFSSL_BIT_SIZE * inlen) > orderBits)
  6307. mp_rshb(e, (int)(WOLFSSL_BIT_SIZE - (orderBits & 0x7)));
  6308. }
  6309. /* make up a key and export the public copy */
  6310. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  6311. if ((err == MP_OKAY) && (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC)) {
  6312. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  6313. #ifdef HAVE_CAVIUM_V
  6314. if (NitroxEccIsCurveSupported(key))
  6315. #endif
  6316. {
  6317. word32 keySz = key->dp->size;
  6318. mp_int* k;
  6319. #ifdef HAVE_CAVIUM_V
  6320. err = wc_ecc_alloc_mpint(key, &key->signK);
  6321. if (err != 0)
  6322. return err;
  6323. k = key->signK;
  6324. #else
  6325. mp_int k_lcl;
  6326. k = &k_lcl;
  6327. #endif
  6328. err = mp_init(k);
  6329. /* make sure r and s are allocated */
  6330. #ifdef HAVE_CAVIUM_V
  6331. /* Nitrox V needs single buffer for R and S */
  6332. if (err == MP_OKAY)
  6333. err = wc_bigint_alloc(&key->r->raw, NitroxEccGetSize(key)*2);
  6334. /* Nitrox V only needs Prime and Order */
  6335. if (err == MP_OKAY)
  6336. err = wc_ecc_curve_load(key->dp, &curve,
  6337. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_ORDER));
  6338. #else
  6339. if (err == MP_OKAY)
  6340. err = wc_bigint_alloc(&key->r->raw, key->dp->size);
  6341. if (err == MP_OKAY)
  6342. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  6343. #endif
  6344. if (err == MP_OKAY)
  6345. err = wc_bigint_alloc(&key->s->raw, key->dp->size);
  6346. /* load e and k */
  6347. if (err == MP_OKAY)
  6348. err = wc_mp_to_bigint_sz(e, &e->raw, keySz);
  6349. if (err == MP_OKAY)
  6350. err = wc_mp_to_bigint_sz(key->k, &key->k->raw, keySz);
  6351. if (err == MP_OKAY)
  6352. err = wc_ecc_gen_k(rng, key->dp->size, k, curve->order);
  6353. if (err == MP_OKAY)
  6354. err = wc_mp_to_bigint_sz(k, &k->raw, keySz);
  6355. #ifdef HAVE_CAVIUM_V
  6356. if (err == MP_OKAY)
  6357. err = NitroxEcdsaSign(key, &e->raw, &key->k->raw, &k->raw,
  6358. &r->raw, &s->raw, &curve->prime->raw, &curve->order->raw);
  6359. #else
  6360. if (err == MP_OKAY)
  6361. err = IntelQaEcdsaSign(&key->asyncDev, &e->raw, &key->k->raw,
  6362. &k->raw, &r->raw, &s->raw, &curve->Af->raw, &curve->Bf->raw,
  6363. &curve->prime->raw, &curve->order->raw, &curve->Gx->raw,
  6364. &curve->Gy->raw);
  6365. #endif
  6366. #ifndef HAVE_CAVIUM_V
  6367. mp_clear(e);
  6368. mp_clear(k);
  6369. #endif
  6370. wc_ecc_curve_free(curve);
  6371. FREE_CURVE_SPECS();
  6372. return err;
  6373. }
  6374. #endif /* HAVE_CAVIUM_V || HAVE_INTEL_QA */
  6375. }
  6376. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  6377. if (err == MP_OKAY) {
  6378. #ifdef WOLFSSL_SMALL_STACK
  6379. ecc_key* pubkey;
  6380. #else
  6381. ecc_key pubkey[1];
  6382. #endif
  6383. #ifdef WOLFSSL_SMALL_STACK
  6384. pubkey = (ecc_key*)XMALLOC(sizeof(ecc_key), key->heap, DYNAMIC_TYPE_ECC);
  6385. if (pubkey == NULL)
  6386. err = MEMORY_E;
  6387. #endif
  6388. /* don't use async for key, since we don't support async return here */
  6389. if (err == MP_OKAY) {
  6390. err = wc_ecc_init_ex(pubkey, key->heap, INVALID_DEVID);
  6391. if (err == MP_OKAY) {
  6392. err = ecc_sign_hash_sw(key, pubkey, rng, curve, e, r, s);
  6393. wc_ecc_free(pubkey);
  6394. #ifdef WOLFSSL_SMALL_STACK
  6395. XFREE(pubkey, key->heap, DYNAMIC_TYPE_ECC);
  6396. #endif
  6397. }
  6398. }
  6399. }
  6400. mp_clear(e);
  6401. wc_ecc_curve_free(curve);
  6402. FREE_MP_INT_SIZE(e_lcl, key->heap, DYNAMIC_TYPE_ECC);
  6403. FREE_CURVE_SPECS();
  6404. #endif /* !WOLFSSL_SP_MATH */
  6405. return err;
  6406. }
  6407. #if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
  6408. defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6409. /* helper function to do HMAC operations
  6410. * returns 0 on success and updates "out" buffer
  6411. */
  6412. static int _HMAC_K(byte* K, word32 KSz, byte* V, word32 VSz,
  6413. const byte* h1, word32 h1Sz, byte* x, word32 xSz, byte* oct,
  6414. byte* out, enum wc_HashType hashType, void* heap)
  6415. {
  6416. Hmac hmac;
  6417. int ret, init;
  6418. ret = init = wc_HmacInit(&hmac, heap, 0);
  6419. if (ret == 0)
  6420. ret = wc_HmacSetKey(&hmac, hashType, K, KSz);
  6421. if (ret == 0)
  6422. ret = wc_HmacUpdate(&hmac, V, VSz);
  6423. if (ret == 0 && oct != NULL)
  6424. ret = wc_HmacUpdate(&hmac, oct, 1);
  6425. if (ret == 0)
  6426. ret = wc_HmacUpdate(&hmac, x, xSz);
  6427. if (ret == 0)
  6428. ret = wc_HmacUpdate(&hmac, h1, h1Sz);
  6429. if (ret == 0)
  6430. ret = wc_HmacFinal(&hmac, out);
  6431. if (init == 0)
  6432. wc_HmacFree(&hmac);
  6433. return ret;
  6434. }
  6435. /* Generates a deterministic key based of the message using RFC6979
  6436. * @param [in] hash Hash value to sign
  6437. * @param [in] hashSz Size of 'hash' buffer passed in
  6438. * @param [in] hashType Type of hash to use with deterministic k gen, i.e.
  6439. * WC_HASH_TYPE_SHA256
  6440. * @param [in] priv Current ECC private key set
  6441. * @param [out] k An initialized mp_int to set the k value generated in
  6442. * @param [in] order ECC order parameter to use with generation
  6443. * @return 0 on success.
  6444. */
  6445. int wc_ecc_gen_deterministic_k(const byte* hash, word32 hashSz,
  6446. enum wc_HashType hashType, mp_int* priv, mp_int* k, mp_int* order,
  6447. void* heap)
  6448. {
  6449. int ret = 0, qbits = 0;
  6450. #ifndef WOLFSSL_SMALL_STACK
  6451. byte h1[MAX_ECC_BYTES];
  6452. byte V[WC_MAX_DIGEST_SIZE];
  6453. byte K[WC_MAX_DIGEST_SIZE];
  6454. byte x[MAX_ECC_BYTES];
  6455. mp_int z1[1];
  6456. #else
  6457. byte *h1 = NULL;
  6458. byte *V = NULL;
  6459. byte *K = NULL;
  6460. byte *x = NULL;
  6461. mp_int *z1 = NULL;
  6462. #endif
  6463. word32 xSz, VSz, KSz, h1len, qLen;
  6464. byte intOct;
  6465. if (hash == NULL || k == NULL || order == NULL) {
  6466. return BAD_FUNC_ARG;
  6467. }
  6468. if (hashSz > WC_MAX_DIGEST_SIZE) {
  6469. WOLFSSL_MSG("hash size was too large!");
  6470. return BAD_FUNC_ARG;
  6471. }
  6472. if (hashSz != WC_SHA256_DIGEST_SIZE) {
  6473. WOLFSSL_MSG("Currently only SHA256 digest is supported");
  6474. return BAD_FUNC_ARG;
  6475. }
  6476. if (mp_unsigned_bin_size(priv) > MAX_ECC_BYTES) {
  6477. WOLFSSL_MSG("private key larger than max expected!");
  6478. return BAD_FUNC_ARG;
  6479. }
  6480. #ifdef WOLFSSL_SMALL_STACK
  6481. h1 = (byte*)XMALLOC(MAX_ECC_BYTES, heap, DYNAMIC_TYPE_DIGEST);
  6482. if (h1 == NULL) {
  6483. ret = MEMORY_E;
  6484. }
  6485. if (ret == 0) {
  6486. V = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6487. if (V == NULL)
  6488. ret = MEMORY_E;
  6489. }
  6490. if (ret == 0) {
  6491. K = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6492. if (K == NULL)
  6493. ret = MEMORY_E;
  6494. }
  6495. if (ret == 0) {
  6496. x = (byte*)XMALLOC(MAX_ECC_BYTES, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6497. if (x == NULL)
  6498. ret = MEMORY_E;
  6499. }
  6500. if (ret == 0) {
  6501. z1 = (mp_int *)XMALLOC(sizeof(*z1), heap, DYNAMIC_TYPE_ECC_BUFFER);
  6502. if (z1 == NULL)
  6503. ret = MEMORY_E;
  6504. }
  6505. /* bail out if any error has been hit at this point */
  6506. if (ret != 0) {
  6507. if (x != NULL)
  6508. XFREE(x, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6509. if (K != NULL)
  6510. XFREE(K, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6511. if (V != NULL)
  6512. XFREE(V, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6513. if (h1 != NULL)
  6514. XFREE(h1, heap, DYNAMIC_TYPE_DIGEST);
  6515. return ret;
  6516. }
  6517. #endif
  6518. VSz = KSz = hashSz;
  6519. qLen = xSz = h1len = (word32)mp_unsigned_bin_size(order);
  6520. /* 3.2 b. Set V = 0x01 0x01 ... */
  6521. XMEMSET(V, 0x01, VSz);
  6522. /* 3.2 c. Set K = 0x00 0x00 ... */
  6523. XMEMSET(K, 0x00, KSz);
  6524. mp_init(z1); /* always init z1 and free z1 */
  6525. ret = mp_to_unsigned_bin_len(priv, x, (int)qLen);
  6526. if (ret == 0) {
  6527. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6528. wc_MemZero_Add("wc_ecc_gen_deterministic_k x", x, qLen);
  6529. #endif
  6530. qbits = mp_count_bits(order);
  6531. ret = mp_read_unsigned_bin(z1, hash, hashSz);
  6532. }
  6533. /* bits2octets on h1 */
  6534. if (ret == 0) {
  6535. XMEMSET(h1, 0, MAX_ECC_BYTES);
  6536. #if !defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
  6537. /* mod reduce by order using conditional subtract
  6538. * RFC6979 lists a variant that uses the hash directly instead of
  6539. * doing bits2octets(H(m)), when variant macro is used avoid this
  6540. * bits2octets operation */
  6541. if (mp_cmp(z1, order) == MP_GT) {
  6542. int z1Sz;
  6543. mp_sub(z1, order, z1);
  6544. z1Sz = mp_unsigned_bin_size(z1);
  6545. if (z1Sz < 0 || z1Sz > MAX_ECC_BYTES) {
  6546. ret = BUFFER_E;
  6547. }
  6548. else {
  6549. ret = mp_to_unsigned_bin_len(z1, h1, h1len);
  6550. }
  6551. }
  6552. else
  6553. #endif
  6554. {
  6555. /* use original hash and keep leading 0's */
  6556. mp_to_unsigned_bin_len(z1, h1, (int)h1len);
  6557. }
  6558. }
  6559. mp_free(z1);
  6560. /* 3.2 step d. K = HMAC_K(V || 0x00 || int2octests(x) || bits2octests(h1) */
  6561. if (ret == 0) {
  6562. intOct = 0x00;
  6563. ret = _HMAC_K(K, KSz, V, VSz, h1, h1len, x, xSz, &intOct, K,
  6564. hashType, heap);
  6565. }
  6566. /* 3.2 step e. V = HMAC_K(V) */
  6567. if (ret == 0) {
  6568. ret = _HMAC_K(K, KSz, V, VSz, NULL, 0, NULL, 0, NULL, V, hashType,
  6569. heap);
  6570. }
  6571. /* 3.2 step f. K = HMAC_K(V || 0x01 || int2octests(x) || bits2octests(h1) */
  6572. if (ret == 0) {
  6573. intOct = 0x01;
  6574. ret = _HMAC_K(K, KSz, V, VSz, h1, h1len, x, xSz, &intOct, K, hashType,
  6575. heap);
  6576. }
  6577. /* 3.2 step g. V = HMAC_K(V) */
  6578. if (ret == 0) {
  6579. ret = _HMAC_K(K, KSz, V, VSz, NULL, 0, NULL, 0, NULL, V, hashType,
  6580. heap);
  6581. }
  6582. /* 3.2 step h. loop through the next steps until a valid value is found */
  6583. if (ret == 0 ) {
  6584. int err;
  6585. intOct = 0x00;
  6586. do {
  6587. xSz = 0; /* used as tLen */
  6588. err = 0; /* start as good until generated k is tested */
  6589. /* 3.2 step h.2 when tlen < qlen do V = HMAC_K(V); T = T || V */
  6590. while (xSz < qLen) {
  6591. ret = _HMAC_K(K, KSz, V, VSz, NULL, 0, NULL, 0, NULL, V,
  6592. hashType, heap);
  6593. if (ret == 0) {
  6594. int sz;
  6595. sz = (int)MIN(qLen - xSz, (size_t)VSz);
  6596. XMEMCPY(x + xSz, V, (size_t)sz);
  6597. xSz += (word32)sz;
  6598. }
  6599. else {
  6600. break; /* error case */
  6601. }
  6602. }
  6603. if (ret == 0) {
  6604. mp_clear(k); /* 3.2 step h.1 clear T */
  6605. ret = mp_read_unsigned_bin(k, x, xSz);
  6606. }
  6607. if ((ret == 0) && ((int)(xSz * WOLFSSL_BIT_SIZE) != qbits)) {
  6608. /* handle odd case where shift of 'k' is needed with RFC 6979
  6609. * k = bits2int(T) in section 3.2 h.3 */
  6610. mp_rshb(k, ((int)xSz * WOLFSSL_BIT_SIZE) - qbits);
  6611. }
  6612. /* 3.2 step h.3 the key should be smaller than the order of base
  6613. * point */
  6614. if (ret == 0) {
  6615. if (mp_cmp(k, order) != MP_LT) {
  6616. err = MP_VAL;
  6617. } else if (mp_iszero(k) == MP_YES) {
  6618. /* no 0 key's */
  6619. err = MP_ZERO_E;
  6620. }
  6621. }
  6622. /* 3.2 step h.3 if there was a problem with 'k' generated then try
  6623. * again K = HMAC_K(V || 0x00) and V = HMAC_K(V) */
  6624. if (ret == 0 && err != 0) {
  6625. ret = _HMAC_K(K, KSz, V, VSz, NULL, 0, NULL, 0, &intOct, K,
  6626. hashType, heap);
  6627. if (ret == 0) {
  6628. ret = _HMAC_K(K, KSz, V, VSz, NULL, 0, NULL, 0, NULL, V,
  6629. hashType, heap);
  6630. }
  6631. }
  6632. } while (ret == 0 && err != 0);
  6633. }
  6634. ForceZero(x, MAX_ECC_BYTES);
  6635. #ifdef WOLFSSL_SMALL_STACK
  6636. if (z1 != NULL)
  6637. XFREE(z1, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6638. if (x != NULL)
  6639. XFREE(x, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6640. if (K != NULL)
  6641. XFREE(K, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6642. if (V != NULL)
  6643. XFREE(V, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6644. if (h1 != NULL)
  6645. XFREE(h1, heap, DYNAMIC_TYPE_DIGEST);
  6646. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  6647. wc_MemZero_Check(x, MAX_ECC_BYTES);
  6648. #endif
  6649. return ret;
  6650. }
  6651. /* Sets the deterministic flag for 'k' generation with sign.
  6652. * returns 0 on success
  6653. */
  6654. int wc_ecc_set_deterministic(ecc_key* key, byte flag)
  6655. {
  6656. if (key == NULL) {
  6657. return BAD_FUNC_ARG;
  6658. }
  6659. key->deterministic = flag ? 1 : 0;
  6660. return 0;
  6661. }
  6662. #endif /* end sign_ex and deterministic sign */
  6663. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP)
  6664. int wc_ecc_sign_set_k(const byte* k, word32 klen, ecc_key* key)
  6665. {
  6666. int ret = MP_OKAY;
  6667. DECLARE_CURVE_SPECS(1);
  6668. if (k == NULL || klen == 0 || key == NULL) {
  6669. return BAD_FUNC_ARG;
  6670. }
  6671. ALLOC_CURVE_SPECS(1, ret);
  6672. if (ret == MP_OKAY) {
  6673. ret = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  6674. }
  6675. if (ret != 0) {
  6676. FREE_CURVE_SPECS();
  6677. return ret;
  6678. }
  6679. #ifndef WOLFSSL_NO_MALLOC
  6680. if (key->sign_k == NULL) {
  6681. key->sign_k = (mp_int*)XMALLOC(sizeof(mp_int), key->heap,
  6682. DYNAMIC_TYPE_ECC);
  6683. if (key->sign_k) {
  6684. ret = mp_init(key->sign_k);
  6685. }
  6686. else {
  6687. ret = MEMORY_E;
  6688. }
  6689. }
  6690. #endif
  6691. if (ret == 0) {
  6692. ret = mp_read_unsigned_bin(key->sign_k, k, klen);
  6693. }
  6694. if (ret == 0 && mp_cmp(key->sign_k, curve->order) != MP_LT) {
  6695. ret = MP_VAL;
  6696. }
  6697. #ifdef WOLFSSL_NO_MALLOC
  6698. if (ret == 0) {
  6699. key->sign_k_set = 1;
  6700. }
  6701. #endif
  6702. wc_ecc_curve_free(curve);
  6703. FREE_CURVE_SPECS();
  6704. return ret;
  6705. }
  6706. #endif /* WOLFSSL_ECDSA_SET_K || WOLFSSL_ECDSA_SET_K_ONE_LOOP */
  6707. #endif /* WOLFSSL_ATECC508A && WOLFSSL_CRYPTOCELL */
  6708. #endif /* !HAVE_ECC_SIGN */
  6709. #ifdef WOLFSSL_CUSTOM_CURVES
  6710. void wc_ecc_free_curve(const ecc_set_type* curve, void* heap)
  6711. {
  6712. #ifndef WOLFSSL_ECC_CURVE_STATIC
  6713. if (curve->prime != NULL)
  6714. XFREE((void*)curve->prime, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6715. if (curve->Af != NULL)
  6716. XFREE((void*)curve->Af, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6717. if (curve->Bf != NULL)
  6718. XFREE((void*)curve->Bf, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6719. if (curve->order != NULL)
  6720. XFREE((void*)curve->order, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6721. if (curve->Gx != NULL)
  6722. XFREE((void*)curve->Gx, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6723. if (curve->Gy != NULL)
  6724. XFREE((void*)curve->Gy, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6725. #endif
  6726. XFREE((void*)curve, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6727. (void)heap;
  6728. }
  6729. #endif /* WOLFSSL_CUSTOM_CURVES */
  6730. /**
  6731. Free an ECC key from memory
  6732. key The key you wish to free
  6733. */
  6734. WOLFSSL_ABI
  6735. int wc_ecc_free(ecc_key* key)
  6736. {
  6737. if (key == NULL) {
  6738. return 0;
  6739. }
  6740. #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP)
  6741. #ifndef WOLFSSL_NO_MALLOC
  6742. if (key->sign_k != NULL)
  6743. #endif
  6744. {
  6745. mp_forcezero(key->sign_k);
  6746. mp_free(key->sign_k);
  6747. #ifndef WOLFSSL_NO_MALLOC
  6748. XFREE(key->sign_k, key->heap, DYNAMIC_TYPE_ECC);
  6749. #endif
  6750. }
  6751. #endif
  6752. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  6753. #ifdef WC_ASYNC_ENABLE_ECC
  6754. wolfAsync_DevCtxFree(&key->asyncDev, WOLFSSL_ASYNC_MARKER_ECC);
  6755. #endif
  6756. wc_ecc_free_async(key);
  6757. #endif
  6758. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  6759. /* free secure memory */
  6760. if ((key->blackKey != CAAM_BLACK_KEY_CCM &&
  6761. key->blackKey != CAAM_BLACK_KEY_ECB) && key->blackKey > 0) {
  6762. caamFreePart(key->partNum);
  6763. }
  6764. #endif
  6765. #ifdef WOLFSSL_SE050
  6766. se050_ecc_free_key(key);
  6767. #endif
  6768. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  6769. atmel_ecc_free(key->slot);
  6770. key->slot = ATECC_INVALID_SLOT;
  6771. #endif /* WOLFSSL_ATECC508A */
  6772. #ifdef WOLFSSL_KCAPI_ECC
  6773. KcapiEcc_Free(key);
  6774. #endif
  6775. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  6776. key->privKey = NULL;
  6777. ForceZero(key->keyRaw, sizeof(key->keyRaw));
  6778. ForceZero(&key->xSec, sizeof(key->xSec));
  6779. #endif
  6780. #ifdef WOLFSSL_MAXQ10XX_CRYPTO
  6781. wc_MAXQ10XX_EccFree(key);
  6782. #endif
  6783. mp_clear(key->pubkey.x);
  6784. mp_clear(key->pubkey.y);
  6785. mp_clear(key->pubkey.z);
  6786. mp_forcezero(key->k);
  6787. #ifdef WOLFSSL_CUSTOM_CURVES
  6788. if (key->deallocSet && key->dp != NULL)
  6789. wc_ecc_free_curve(key->dp, key->heap);
  6790. #endif
  6791. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6792. wc_MemZero_Check(key, sizeof(ecc_key));
  6793. #endif
  6794. return 0;
  6795. }
  6796. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  6797. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SP_MATH) && \
  6798. !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  6799. /* Handles add failure cases:
  6800. *
  6801. * Before add:
  6802. * Case 1: A is infinity
  6803. * -> Copy B into result.
  6804. * Case 2: B is infinity
  6805. * -> Copy A into result.
  6806. * Case 3: x and z are the same in A and B (same x value in affine)
  6807. * Case 3a: y values the same - same point
  6808. * -> Double instead of add.
  6809. * Case 3b: y values different - negative of the other when points on curve
  6810. * -> Need to set result to infinity.
  6811. *
  6812. * After add:
  6813. * Case 1: A and B are the same point (maybe different z)
  6814. * (Result was: x == y == z == 0)
  6815. * -> Need to double instead.
  6816. *
  6817. * Case 2: A + B = <infinity> = 0.
  6818. * (Result was: z == 0, x and/or y not 0)
  6819. * -> Need to set result to infinity.
  6820. */
  6821. int ecc_projective_add_point_safe(ecc_point* A, ecc_point* B, ecc_point* R,
  6822. mp_int* a, mp_int* modulus, mp_digit mp, int* infinity)
  6823. {
  6824. int err;
  6825. if (mp_iszero(A->x) && mp_iszero(A->y)) {
  6826. /* A is infinity. */
  6827. err = wc_ecc_copy_point(B, R);
  6828. }
  6829. else if (mp_iszero(B->x) && mp_iszero(B->y)) {
  6830. /* B is infinity. */
  6831. err = wc_ecc_copy_point(A, R);
  6832. }
  6833. else if ((mp_cmp(A->x, B->x) == MP_EQ) && (mp_cmp(A->z, B->z) == MP_EQ)) {
  6834. /* x ordinattes the same. */
  6835. if (mp_cmp(A->y, B->y) == MP_EQ) {
  6836. /* A = B */
  6837. err = _ecc_projective_dbl_point(B, R, a, modulus, mp);
  6838. }
  6839. else {
  6840. /* A = -B */
  6841. err = mp_set(R->x, 0);
  6842. if (err == MP_OKAY)
  6843. err = mp_set(R->y, 0);
  6844. if (err == MP_OKAY)
  6845. err = mp_set(R->z, 1);
  6846. if ((err == MP_OKAY) && (infinity != NULL))
  6847. *infinity = 1;
  6848. }
  6849. }
  6850. else {
  6851. err = _ecc_projective_add_point(A, B, R, a, modulus, mp);
  6852. if ((err == MP_OKAY) && mp_iszero(R->z)) {
  6853. /* When all zero then should have done a double */
  6854. if (mp_iszero(R->x) && mp_iszero(R->y)) {
  6855. if (mp_iszero(B->z)) {
  6856. err = wc_ecc_copy_point(B, R);
  6857. if (err == MP_OKAY) {
  6858. err = mp_montgomery_calc_normalization(R->z, modulus);
  6859. }
  6860. if (err == MP_OKAY) {
  6861. err = _ecc_projective_dbl_point(R, R, a, modulus, mp);
  6862. }
  6863. }
  6864. else {
  6865. err = _ecc_projective_dbl_point(B, R, a, modulus, mp);
  6866. }
  6867. }
  6868. /* When only Z zero then result is infinity */
  6869. else {
  6870. err = mp_set(R->x, 0);
  6871. if (err == MP_OKAY)
  6872. err = mp_set(R->y, 0);
  6873. if (err == MP_OKAY)
  6874. err = mp_set(R->z, 1);
  6875. if ((err == MP_OKAY) && (infinity != NULL))
  6876. *infinity = 1;
  6877. }
  6878. }
  6879. }
  6880. return err;
  6881. }
  6882. /* Handles when P is the infinity point.
  6883. *
  6884. * Double infinity -> infinity.
  6885. * Otherwise do normal double - which can't lead to infinity as odd order.
  6886. */
  6887. int ecc_projective_dbl_point_safe(ecc_point *P, ecc_point *R, mp_int* a,
  6888. mp_int* modulus, mp_digit mp)
  6889. {
  6890. int err;
  6891. if (mp_iszero(P->x) && mp_iszero(P->y)) {
  6892. /* P is infinity. */
  6893. err = wc_ecc_copy_point(P, R);
  6894. }
  6895. else {
  6896. err = _ecc_projective_dbl_point(P, R, a, modulus, mp);
  6897. }
  6898. return err;
  6899. }
  6900. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A
  6901. && !WOLFSSL_CRYPTOCELL && !WOLFSSL_SP_MATH */
  6902. #if !defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_ATECC508A) && \
  6903. !defined(WOLFSSL_ATECC608A) && !defined(WOLFSSL_CRYPTOCELL) && \
  6904. !defined(WOLFSSL_KCAPI_ECC) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  6905. #ifdef ECC_SHAMIR
  6906. static int ecc_mont_norm_points(ecc_point* A, ecc_point* Am, ecc_point* B,
  6907. ecc_point* Bm, mp_int* modulus, void* heap)
  6908. {
  6909. int err = MP_OKAY;
  6910. DECL_MP_INT_SIZE_DYN(mu, mp_bitsused(modulus), MAX_ECC_BITS_USE);
  6911. (void)heap;
  6912. NEW_MP_INT_SIZE(mu, mp_bitsused(modulus), heap, DYNAMIC_TYPE_ECC);
  6913. #ifdef MP_INT_SIZE_CHECK_NULL
  6914. if (mu == NULL)
  6915. err = MEMORY_E;
  6916. #endif
  6917. if (err == MP_OKAY) {
  6918. err = INIT_MP_INT_SIZE(mu, mp_bitsused(modulus));
  6919. }
  6920. if (err == MP_OKAY) {
  6921. err = mp_montgomery_calc_normalization(mu, modulus);
  6922. if (err == MP_OKAY) {
  6923. /* copy ones ... */
  6924. err = mp_mulmod(A->x, mu, modulus, Am->x);
  6925. }
  6926. if (err == MP_OKAY)
  6927. err = mp_mulmod(A->y, mu, modulus, Am->y);
  6928. if (err == MP_OKAY)
  6929. err = mp_mulmod(A->z, mu, modulus, Am->z);
  6930. if (err == MP_OKAY)
  6931. err = mp_mulmod(B->x, mu, modulus, Bm->x);
  6932. if (err == MP_OKAY)
  6933. err = mp_mulmod(B->y, mu, modulus, Bm->y);
  6934. if (err == MP_OKAY)
  6935. err = mp_mulmod(B->z, mu, modulus, Bm->z);
  6936. /* done with mu */
  6937. mp_clear(mu);
  6938. }
  6939. FREE_MP_INT_SIZE(mu, heap, DYNAMIC_TYPE_ECC);
  6940. return err;
  6941. }
  6942. /** Computes kA*A + kB*B = C using Shamir's Trick
  6943. A First point to multiply
  6944. kA What to multiple A by
  6945. B Second point to multiply
  6946. kB What to multiple B by
  6947. C [out] Destination point (can overlap with A or B)
  6948. a ECC curve parameter a
  6949. modulus Modulus for curve
  6950. return MP_OKAY on success
  6951. */
  6952. #ifdef FP_ECC
  6953. static int normal_ecc_mul2add(ecc_point* A, mp_int* kA,
  6954. ecc_point* B, mp_int* kB,
  6955. ecc_point* C, mp_int* a, mp_int* modulus,
  6956. void* heap)
  6957. #else
  6958. int ecc_mul2add(ecc_point* A, mp_int* kA,
  6959. ecc_point* B, mp_int* kB,
  6960. ecc_point* C, mp_int* a, mp_int* modulus,
  6961. void* heap)
  6962. #endif
  6963. {
  6964. #ifdef WOLFSSL_SMALL_STACK_CACHE
  6965. ecc_key *key = NULL;
  6966. #endif
  6967. #ifdef WOLFSSL_SMALL_STACK
  6968. ecc_point** precomp = NULL;
  6969. #else
  6970. ecc_point* precomp[SHAMIR_PRECOMP_SZ];
  6971. #ifdef WOLFSSL_NO_MALLOC
  6972. ecc_point lcl_precomp[SHAMIR_PRECOMP_SZ];
  6973. #endif
  6974. #endif
  6975. unsigned int bitbufA, bitbufB, lenA, lenB, len, nA, nB, nibble;
  6976. #ifdef WOLFSSL_NO_MALLOC
  6977. unsigned char tA[ECC_BUFSIZE];
  6978. unsigned char tB[ECC_BUFSIZE];
  6979. #else
  6980. unsigned char* tA = NULL;
  6981. unsigned char* tB = NULL;
  6982. #endif
  6983. int err = MP_OKAY, first, x, y;
  6984. mp_digit mp = 0;
  6985. /* argchks */
  6986. if (A == NULL || kA == NULL || B == NULL || kB == NULL || C == NULL ||
  6987. modulus == NULL) {
  6988. return ECC_BAD_ARG_E;
  6989. }
  6990. #ifndef WOLFSSL_NO_MALLOC
  6991. /* allocate memory */
  6992. tA = (unsigned char*)XMALLOC(ECC_BUFSIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6993. if (tA == NULL) {
  6994. return GEN_MEM_ERR;
  6995. }
  6996. tB = (unsigned char*)XMALLOC(ECC_BUFSIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6997. if (tB == NULL) {
  6998. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  6999. return GEN_MEM_ERR;
  7000. }
  7001. #endif
  7002. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7003. key = (ecc_key *)XMALLOC(sizeof(*key), heap, DYNAMIC_TYPE_ECC_BUFFER);
  7004. if (key == NULL) {
  7005. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7006. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7007. return GEN_MEM_ERR;
  7008. }
  7009. #endif
  7010. #ifdef WOLFSSL_SMALL_STACK
  7011. precomp = (ecc_point**)XMALLOC(sizeof(ecc_point*) * SHAMIR_PRECOMP_SZ, heap,
  7012. DYNAMIC_TYPE_ECC_BUFFER);
  7013. if (precomp == NULL) {
  7014. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7015. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7016. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7017. XFREE(key, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7018. #endif
  7019. return GEN_MEM_ERR;
  7020. }
  7021. #endif
  7022. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7023. key->t1 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  7024. key->t2 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  7025. #ifdef ALT_ECC_SIZE
  7026. key->x = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  7027. key->y = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  7028. key->z = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
  7029. #endif
  7030. if (key->t1 == NULL || key->t2 == NULL
  7031. #ifdef ALT_ECC_SIZE
  7032. || key->x == NULL || key->y == NULL || key->z == NULL
  7033. #endif
  7034. ) {
  7035. #ifdef ALT_ECC_SIZE
  7036. XFREE(key->z, heap, DYNAMIC_TYPE_ECC);
  7037. XFREE(key->y, heap, DYNAMIC_TYPE_ECC);
  7038. XFREE(key->x, heap, DYNAMIC_TYPE_ECC);
  7039. #endif
  7040. XFREE(key->t2, heap, DYNAMIC_TYPE_ECC);
  7041. XFREE(key->t1, heap, DYNAMIC_TYPE_ECC);
  7042. XFREE(precomp, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7043. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7044. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7045. XFREE(key, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7046. return MEMORY_E;
  7047. }
  7048. C->key = key;
  7049. #endif /* WOLFSSL_SMALL_STACK_CACHE */
  7050. /* init variables */
  7051. XMEMSET(tA, 0, ECC_BUFSIZE);
  7052. XMEMSET(tB, 0, ECC_BUFSIZE);
  7053. #ifndef WOLFSSL_SMALL_STACK
  7054. XMEMSET(precomp, 0, sizeof(precomp));
  7055. #else
  7056. XMEMSET(precomp, 0, sizeof(ecc_point*) * SHAMIR_PRECOMP_SZ);
  7057. #endif
  7058. #ifdef WOLFSSL_CHECK_MEM_ZERO
  7059. wc_MemZero_Add("ecc_mul2add tA", tA, ECC_BUFSIZE);
  7060. wc_MemZero_Add("ecc_mul2add tB", tB, ECC_BUFSIZE);
  7061. #endif
  7062. /* get sizes */
  7063. lenA = (unsigned int)mp_unsigned_bin_size(kA);
  7064. lenB = (unsigned int)mp_unsigned_bin_size(kB);
  7065. len = MAX(lenA, lenB);
  7066. /* sanity check */
  7067. if ((lenA > ECC_BUFSIZE) || (lenB > ECC_BUFSIZE)) {
  7068. err = BAD_FUNC_ARG;
  7069. }
  7070. if (err == MP_OKAY) {
  7071. /* extract and justify kA */
  7072. err = mp_to_unsigned_bin(kA, (len - lenA) + tA);
  7073. /* extract and justify kB */
  7074. if (err == MP_OKAY)
  7075. err = mp_to_unsigned_bin(kB, (len - lenB) + tB);
  7076. /* allocate the table */
  7077. if (err == MP_OKAY) {
  7078. for (x = 0; x < SHAMIR_PRECOMP_SZ; x++) {
  7079. #ifdef WOLFSSL_NO_MALLOC
  7080. precomp[x] = &lcl_precomp[x];
  7081. #endif
  7082. err = wc_ecc_new_point_ex(&precomp[x], heap);
  7083. if (err != MP_OKAY)
  7084. break;
  7085. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7086. precomp[x]->key = key;
  7087. #endif
  7088. }
  7089. }
  7090. }
  7091. if (err == MP_OKAY)
  7092. /* init montgomery reduction */
  7093. err = mp_montgomery_setup(modulus, &mp);
  7094. if (err == MP_OKAY) {
  7095. err = ecc_mont_norm_points(A, precomp[1], B, precomp[1<<2], modulus, heap);
  7096. }
  7097. if (err == MP_OKAY) {
  7098. /* precomp [i,0](A + B) table */
  7099. err = ecc_projective_dbl_point_safe(precomp[1], precomp[2], a, modulus, mp);
  7100. }
  7101. if (err == MP_OKAY) {
  7102. err = ecc_projective_add_point_safe(precomp[1], precomp[2], precomp[3],
  7103. a, modulus, mp, NULL);
  7104. }
  7105. if (err == MP_OKAY) {
  7106. /* precomp [0,i](A + B) table */
  7107. err = ecc_projective_dbl_point_safe(precomp[4], precomp[8], a, modulus, mp);
  7108. }
  7109. if (err == MP_OKAY) {
  7110. err = ecc_projective_add_point_safe(precomp[4], precomp[8], precomp[12], a,
  7111. modulus, mp, NULL);
  7112. }
  7113. if (err == MP_OKAY) {
  7114. /* precomp [i,j](A + B) table (i != 0, j != 0) */
  7115. for (x = 1; x < 4; x++) {
  7116. for (y = 1; y < 4; y++) {
  7117. if (err == MP_OKAY) {
  7118. err = ecc_projective_add_point_safe(precomp[x], precomp[(y<<2)],
  7119. precomp[x+(y<<2)], a, modulus,
  7120. mp, NULL);
  7121. }
  7122. }
  7123. }
  7124. }
  7125. if (err == MP_OKAY) {
  7126. nibble = 3;
  7127. first = 1;
  7128. bitbufA = tA[0];
  7129. bitbufB = tB[0];
  7130. /* for every byte of the multiplicands */
  7131. for (x = 0; x < (int)len || nibble != 3; ) {
  7132. /* grab a nibble */
  7133. if (++nibble == 4) {
  7134. if (x == (int)len) break;
  7135. bitbufA = tA[x];
  7136. bitbufB = tB[x];
  7137. nibble = 0;
  7138. x++;
  7139. }
  7140. /* extract two bits from both, shift/update */
  7141. nA = (bitbufA >> 6) & 0x03;
  7142. nB = (bitbufB >> 6) & 0x03;
  7143. bitbufA = (bitbufA << 2) & 0xFF;
  7144. bitbufB = (bitbufB << 2) & 0xFF;
  7145. /* if both zero, if first, continue */
  7146. if ((nA == 0) && (nB == 0) && (first == 1)) {
  7147. continue;
  7148. }
  7149. /* double twice, only if this isn't the first */
  7150. if (first == 0) {
  7151. /* double twice */
  7152. if (err == MP_OKAY)
  7153. err = ecc_projective_dbl_point_safe(C, C, a, modulus, mp);
  7154. if (err == MP_OKAY)
  7155. err = ecc_projective_dbl_point_safe(C, C, a, modulus, mp);
  7156. else
  7157. break;
  7158. }
  7159. /* if not both zero */
  7160. if ((nA != 0) || (nB != 0)) {
  7161. unsigned int i = nA + (nB<<2);
  7162. if (first == 1) {
  7163. /* if first, copy from table */
  7164. first = 0;
  7165. if (err == MP_OKAY)
  7166. err = mp_copy(precomp[i]->x, C->x);
  7167. if (err == MP_OKAY)
  7168. err = mp_copy(precomp[i]->y, C->y);
  7169. if (err == MP_OKAY)
  7170. err = mp_copy(precomp[i]->z, C->z);
  7171. else
  7172. break;
  7173. } else {
  7174. /* if not first, add from table */
  7175. if (err == MP_OKAY)
  7176. err = ecc_projective_add_point_safe(C, precomp[i],
  7177. C, a, modulus, mp,
  7178. &first);
  7179. if (err != MP_OKAY)
  7180. break;
  7181. }
  7182. }
  7183. }
  7184. }
  7185. /* reduce to affine */
  7186. if (err == MP_OKAY)
  7187. err = ecc_map(C, modulus, mp);
  7188. /* clean up */
  7189. for (x = 0; x < SHAMIR_PRECOMP_SZ; x++) {
  7190. wc_ecc_del_point_ex(precomp[x], heap);
  7191. }
  7192. ForceZero(tA, ECC_BUFSIZE);
  7193. ForceZero(tB, ECC_BUFSIZE);
  7194. #ifdef WOLFSSL_SMALL_STACK_CACHE
  7195. #ifdef ALT_ECC_SIZE
  7196. XFREE(key->z, heap, DYNAMIC_TYPE_ECC);
  7197. XFREE(key->y, heap, DYNAMIC_TYPE_ECC);
  7198. XFREE(key->x, heap, DYNAMIC_TYPE_ECC);
  7199. #endif
  7200. XFREE(key->t2, heap, DYNAMIC_TYPE_ECC);
  7201. XFREE(key->t1, heap, DYNAMIC_TYPE_ECC);
  7202. XFREE(key, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7203. C->key = NULL;
  7204. #endif
  7205. #ifdef WOLFSSL_SMALL_STACK
  7206. XFREE(precomp, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7207. #endif
  7208. #ifndef WOLFSSL_NO_MALLOC
  7209. XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7210. XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
  7211. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  7212. wc_MemZero_Check(tB, ECC_BUFSIZE);
  7213. wc_MemZero_Check(tA, ECC_BUFSIZE);
  7214. #endif
  7215. return err;
  7216. }
  7217. #endif /* ECC_SHAMIR */
  7218. #endif /* (!WOLFSSL_SP_MATH && !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A &&
  7219. * !WOLFSSL_CRYPTOCEL */
  7220. #ifdef HAVE_ECC_VERIFY
  7221. #ifndef NO_ASN
  7222. /* verify
  7223. *
  7224. * w = s^-1 mod n
  7225. * u1 = xw
  7226. * u2 = rw
  7227. * X = u1*G + u2*Q
  7228. * v = X_x1 mod n
  7229. * accept if v == r
  7230. */
  7231. /**
  7232. Verify an ECC signature
  7233. sig The signature to verify
  7234. siglen The length of the signature (octets)
  7235. hash The hash (message digest) that was signed
  7236. hashlen The length of the hash (octets)
  7237. res Result of signature, 1==valid, 0==invalid
  7238. key The corresponding public ECC key
  7239. return MP_OKAY if successful (even if the signature is not valid)
  7240. Caller should check the *res value to determine if the signature
  7241. is valid or invalid. Other negative values are returned on error.
  7242. */
  7243. WOLFSSL_ABI
  7244. int wc_ecc_verify_hash(const byte* sig, word32 siglen, const byte* hash,
  7245. word32 hashlen, int* res, ecc_key* key)
  7246. {
  7247. int err;
  7248. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  7249. mp_int *r = NULL, *s = NULL;
  7250. #else
  7251. DECL_MP_INT_SIZE_DYN(r, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  7252. DECL_MP_INT_SIZE_DYN(s, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  7253. #endif
  7254. #ifdef WOLFSSL_ASYNC_CRYPT
  7255. int isPrivateKeyOnly = 0;
  7256. #endif
  7257. if (sig == NULL || hash == NULL || res == NULL || key == NULL) {
  7258. return ECC_BAD_ARG_E;
  7259. }
  7260. #ifdef WOLF_CRYPTO_CB
  7261. #ifndef WOLF_CRYPTO_CB_FIND
  7262. if (key->devId != INVALID_DEVID)
  7263. #endif
  7264. {
  7265. err = wc_CryptoCb_EccVerify(sig, siglen, hash, hashlen, res, key);
  7266. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  7267. if (err != CRYPTOCB_UNAVAILABLE)
  7268. return err;
  7269. /* fall-through when unavailable */
  7270. #endif
  7271. #ifdef WOLF_CRYPTO_CB_ONLY_ECC
  7272. if (err == CRYPTOCB_UNAVAILABLE) {
  7273. err = NO_VALID_DEVID;
  7274. }
  7275. #endif
  7276. }
  7277. #endif
  7278. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  7279. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  7280. err = wc_ecc_alloc_async(key);
  7281. if (err != 0)
  7282. return err;
  7283. r = key->r;
  7284. s = key->s;
  7285. #else
  7286. NEW_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  7287. #ifdef MP_INT_SIZE_CHECK_NULL
  7288. if (r == NULL)
  7289. return MEMORY_E;
  7290. #endif
  7291. NEW_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  7292. #ifdef MP_INT_SIZE_CHECK_NULL
  7293. if (s == NULL) {
  7294. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  7295. return MEMORY_E;
  7296. }
  7297. #endif
  7298. err = INIT_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key));
  7299. if (err != 0) {
  7300. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  7301. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  7302. return err;
  7303. }
  7304. err = INIT_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key));
  7305. if (err != 0) {
  7306. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  7307. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  7308. return err;
  7309. }
  7310. #endif /* WOLFSSL_ASYNC_CRYPT */
  7311. switch (key->state) {
  7312. case ECC_STATE_NONE:
  7313. case ECC_STATE_VERIFY_DECODE:
  7314. key->state = ECC_STATE_VERIFY_DECODE;
  7315. /* default to invalid signature */
  7316. *res = 0;
  7317. /* Decode ASN.1 ECDSA signature. */
  7318. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  7319. /* Note, DecodeECC_DSA_Sig() calls mp_init() on r and s.
  7320. * If either of those don't allocate correctly, none of
  7321. * the rest of this function will execute, and everything
  7322. * gets cleaned up at the end. */
  7323. err = DecodeECC_DSA_Sig(sig, siglen, r, s);
  7324. #else
  7325. /* r and s are initialized. */
  7326. err = DecodeECC_DSA_Sig_Ex(sig, siglen, r, s, 0);
  7327. #endif
  7328. if (err < 0) {
  7329. break;
  7330. }
  7331. FALL_THROUGH;
  7332. case ECC_STATE_VERIFY_DO:
  7333. key->state = ECC_STATE_VERIFY_DO;
  7334. #ifdef WOLFSSL_ASYNC_CRYPT
  7335. if (key->type == ECC_PRIVATEKEY_ONLY) {
  7336. isPrivateKeyOnly = 1;
  7337. }
  7338. #endif
  7339. err = wc_ecc_verify_hash_ex(r, s, hash, hashlen, res, key);
  7340. #ifndef WOLFSSL_ASYNC_CRYPT
  7341. /* done with R/S */
  7342. mp_clear(r);
  7343. mp_clear(s);
  7344. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  7345. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  7346. #ifdef MP_INT_SIZE_CHECK_NULL
  7347. r = NULL;
  7348. s = NULL;
  7349. #endif
  7350. #endif
  7351. if (err < 0) {
  7352. break;
  7353. }
  7354. FALL_THROUGH;
  7355. case ECC_STATE_VERIFY_RES:
  7356. key->state = ECC_STATE_VERIFY_RES;
  7357. err = 0;
  7358. break;
  7359. default:
  7360. err = BAD_STATE_E;
  7361. }
  7362. #ifdef WOLFSSL_ASYNC_CRYPT
  7363. /* if async pending then return and skip done cleanup below */
  7364. if (err == WC_PENDING_E) {
  7365. if (!isPrivateKeyOnly) /* do not advance state if doing make pub key */
  7366. key->state++;
  7367. return err;
  7368. }
  7369. #endif
  7370. /* cleanup */
  7371. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  7372. wc_ecc_free_async(key);
  7373. #else
  7374. FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
  7375. FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
  7376. #endif
  7377. /* make sure required variables are reset */
  7378. wc_ecc_reset(key);
  7379. #else
  7380. (void)siglen;
  7381. (void)hashlen;
  7382. (void)s;
  7383. (void)r;
  7384. (void)err;
  7385. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  7386. return err;
  7387. }
  7388. #endif /* !NO_ASN */
  7389. #ifndef WOLF_CRYPTO_CB_ONLY_ECC
  7390. #if !defined(WOLFSSL_STM32_PKA) && !defined(WOLFSSL_PSOC6_CRYPTO) && \
  7391. !defined(WOLF_CRYPTO_CB_ONLY_ECC)
  7392. static int wc_ecc_check_r_s_range(ecc_key* key, mp_int* r, mp_int* s)
  7393. {
  7394. int err = MP_OKAY;
  7395. DECLARE_CURVE_SPECS(1);
  7396. ALLOC_CURVE_SPECS(1, err);
  7397. if (err == MP_OKAY) {
  7398. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
  7399. }
  7400. if (err != 0) {
  7401. FREE_CURVE_SPECS();
  7402. return err;
  7403. }
  7404. if (mp_iszero(r) || mp_iszero(s)) {
  7405. err = MP_ZERO_E;
  7406. }
  7407. if ((err == 0) && (mp_cmp(r, curve->order) != MP_LT)) {
  7408. err = MP_VAL;
  7409. }
  7410. if ((err == 0) && (mp_cmp(s, curve->order) != MP_LT)) {
  7411. err = MP_VAL;
  7412. }
  7413. wc_ecc_curve_free(curve);
  7414. FREE_CURVE_SPECS();
  7415. return err;
  7416. }
  7417. #endif /* !WOLFSSL_STM32_PKA && !WOLFSSL_PSOC6_CRYPTO */
  7418. static int ecc_verify_hash_sp(mp_int *r, mp_int *s, const byte* hash,
  7419. word32 hashlen, int* res, ecc_key* key)
  7420. {
  7421. (void)r;
  7422. (void)s;
  7423. (void)hash;
  7424. (void)hashlen;
  7425. (void)res;
  7426. (void)key;
  7427. #if defined(WOLFSSL_DSP) && !defined(FREESCALE_LTC_ECC)
  7428. if (key->handle != -1) {
  7429. return sp_dsp_ecc_verify_256(key->handle, hash, hashlen, key->pubkey.x,
  7430. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7431. }
  7432. if (wolfSSL_GetHandleCbSet() == 1) {
  7433. return sp_dsp_ecc_verify_256(0, hash, hashlen, key->pubkey.x,
  7434. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7435. }
  7436. #endif
  7437. #if defined(WOLFSSL_SP_MATH) && !defined(FREESCALE_LTC_ECC)
  7438. if (key->idx == ECC_CUSTOM_IDX || (1
  7439. #ifndef WOLFSSL_SP_NO_256
  7440. && ecc_sets[key->idx].id != ECC_SECP256R1
  7441. #endif
  7442. #ifdef WOLFSSL_SP_384
  7443. && ecc_sets[key->idx].id != ECC_SECP384R1
  7444. #endif
  7445. #ifdef WOLFSSL_SP_521
  7446. && ecc_sets[key->idx].id != ECC_SECP521R1
  7447. #endif
  7448. )) {
  7449. return WC_KEY_SIZE_E;
  7450. }
  7451. #endif
  7452. #if defined(WOLFSSL_HAVE_SP_ECC)
  7453. if (key->idx != ECC_CUSTOM_IDX) {
  7454. #if defined(WC_ECC_NONBLOCK) && defined(WC_ECC_NONBLOCK_ONLY)
  7455. /* perform blocking call to non-blocking function */
  7456. ecc_nb_ctx_t nb_ctx;
  7457. int err;
  7458. XMEMSET(&nb_ctx, 0, sizeof(nb_ctx));
  7459. err = NOT_COMPILED_IN; /* set default error */
  7460. #endif
  7461. #ifndef WOLFSSL_SP_NO_256
  7462. if (ecc_sets[key->idx].id == ECC_SECP256R1) {
  7463. #ifdef WC_ECC_NONBLOCK
  7464. if (key->nb_ctx) {
  7465. return sp_ecc_verify_256_nb(&key->nb_ctx->sp_ctx, hash, hashlen,
  7466. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7467. key->heap);
  7468. }
  7469. #ifdef WC_ECC_NONBLOCK_ONLY
  7470. do { /* perform blocking call to non-blocking function */
  7471. err = sp_ecc_verify_256_nb(&nb_ctx.sp_ctx, hash, hashlen,
  7472. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7473. key->heap);
  7474. } while (err == FP_WOULDBLOCK);
  7475. return err;
  7476. #endif
  7477. #endif /* WC_ECC_NONBLOCK */
  7478. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  7479. {
  7480. int ret;
  7481. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  7482. ret = sp_ecc_verify_256(hash, hashlen, key->pubkey.x,
  7483. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7484. RESTORE_VECTOR_REGISTERS();
  7485. return ret;
  7486. }
  7487. #endif
  7488. }
  7489. #endif
  7490. #ifdef WOLFSSL_SP_384
  7491. if (ecc_sets[key->idx].id == ECC_SECP384R1) {
  7492. #ifdef WC_ECC_NONBLOCK
  7493. if (key->nb_ctx) {
  7494. return sp_ecc_verify_384_nb(&key->nb_ctx->sp_ctx, hash, hashlen,
  7495. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7496. key->heap);
  7497. }
  7498. #ifdef WC_ECC_NONBLOCK_ONLY
  7499. do { /* perform blocking call to non-blocking function */
  7500. err = sp_ecc_verify_384_nb(&nb_ctx.sp_ctx, hash, hashlen,
  7501. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7502. key->heap);
  7503. } while (err == FP_WOULDBLOCK);
  7504. return err;
  7505. #endif
  7506. #endif /* WC_ECC_NONBLOCK */
  7507. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  7508. {
  7509. int ret;
  7510. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  7511. ret = sp_ecc_verify_384(hash, hashlen, key->pubkey.x,
  7512. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7513. RESTORE_VECTOR_REGISTERS();
  7514. return ret;
  7515. }
  7516. #endif
  7517. }
  7518. #endif
  7519. #ifdef WOLFSSL_SP_521
  7520. if (ecc_sets[key->idx].id == ECC_SECP521R1) {
  7521. #ifdef WC_ECC_NONBLOCK
  7522. if (key->nb_ctx) {
  7523. return sp_ecc_verify_521_nb(&key->nb_ctx->sp_ctx, hash, hashlen,
  7524. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7525. key->heap);
  7526. }
  7527. #ifdef WC_ECC_NONBLOCK_ONLY
  7528. do { /* perform blocking call to non-blocking function */
  7529. err = sp_ecc_verify_521_nb(&nb_ctx.sp_ctx, hash, hashlen,
  7530. key->pubkey.x, key->pubkey.y, key->pubkey.z, r, s, res,
  7531. key->heap);
  7532. } while (err == FP_WOULDBLOCK);
  7533. return err;
  7534. #endif
  7535. #endif /* WC_ECC_NONBLOCK */
  7536. #if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
  7537. {
  7538. int ret;
  7539. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  7540. ret = sp_ecc_verify_521(hash, hashlen, key->pubkey.x,
  7541. key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
  7542. RESTORE_VECTOR_REGISTERS();
  7543. return ret;
  7544. }
  7545. #endif
  7546. }
  7547. #endif
  7548. }
  7549. #endif
  7550. return NOT_COMPILED_IN;
  7551. }
  7552. #if !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC)
  7553. static int ecc_verify_hash(mp_int *r, mp_int *s, const byte* hash,
  7554. word32 hashlen, int* res, ecc_key* key, ecc_curve_spec* curve)
  7555. {
  7556. int err;
  7557. ecc_point* mG = NULL;
  7558. ecc_point* mQ = NULL;
  7559. #ifdef WOLFSSL_NO_MALLOC
  7560. ecc_point lcl_mG;
  7561. ecc_point lcl_mQ;
  7562. #endif
  7563. DECL_MP_INT_SIZE_DYN(w, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  7564. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  7565. DECL_MP_INT_SIZE_DYN(e_lcl, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE);
  7566. #endif
  7567. mp_int* e;
  7568. mp_int* v = NULL; /* Will be w. */
  7569. mp_int* u1 = NULL; /* Will be e. */
  7570. mp_int* u2 = NULL; /* Will be w. */
  7571. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V)
  7572. err = wc_ecc_alloc_mpint(key, &key->e);
  7573. if (err != 0) {
  7574. return err;
  7575. }
  7576. e = key->e;
  7577. err = mp_init(e);
  7578. #else
  7579. NEW_MP_INT_SIZE(e_lcl, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  7580. #ifdef MP_INT_SIZE_CHECK_NULL
  7581. if (e_lcl == NULL) {
  7582. return MEMORY_E;
  7583. }
  7584. #endif
  7585. e = e_lcl;
  7586. err = INIT_MP_INT_SIZE(e, ECC_KEY_MAX_BITS(key));
  7587. #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_CAVIUM_V */
  7588. if (err != MP_OKAY) {
  7589. #ifdef WOLFSSL_SMALL_STACK
  7590. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  7591. XFREE(e_lcl, key->heap, DYNAMIC_TYPE_ECC);
  7592. #endif
  7593. #endif
  7594. return MEMORY_E;
  7595. }
  7596. /* read hash */
  7597. if (err == MP_OKAY) {
  7598. /* we may need to truncate if hash is longer than key size */
  7599. unsigned int orderBits = (unsigned int)mp_count_bits(curve->order);
  7600. /* truncate down to byte size, may be all that's needed */
  7601. if ( (WOLFSSL_BIT_SIZE * hashlen) > orderBits)
  7602. hashlen = (orderBits + WOLFSSL_BIT_SIZE - 1) / WOLFSSL_BIT_SIZE;
  7603. err = mp_read_unsigned_bin(e, hash, hashlen);
  7604. /* may still need bit truncation too */
  7605. if (err == MP_OKAY && (WOLFSSL_BIT_SIZE * hashlen) > orderBits)
  7606. mp_rshb(e, (int)(WOLFSSL_BIT_SIZE - (orderBits & 0x7)));
  7607. }
  7608. /* check for async hardware acceleration */
  7609. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  7610. if (err == MP_OKAY && key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  7611. #if defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)
  7612. #ifdef HAVE_CAVIUM_V
  7613. if (NitroxEccIsCurveSupported(key))
  7614. #endif
  7615. {
  7616. word32 keySz = (word32)key->dp->size;
  7617. err = wc_mp_to_bigint_sz(e, &e->raw, keySz);
  7618. if (err == MP_OKAY)
  7619. err = wc_mp_to_bigint_sz(key->pubkey.x, &key->pubkey.x->raw, keySz);
  7620. if (err == MP_OKAY)
  7621. err = wc_mp_to_bigint_sz(key->pubkey.y, &key->pubkey.y->raw, keySz);
  7622. if (err == MP_OKAY)
  7623. #ifdef HAVE_CAVIUM_V
  7624. err = NitroxEcdsaVerify(key, &e->raw, &key->pubkey.x->raw,
  7625. &key->pubkey.y->raw, &r->raw, &s->raw,
  7626. &curve->prime->raw, &curve->order->raw, res);
  7627. #else
  7628. err = IntelQaEcdsaVerify(&key->asyncDev, &e->raw, &key->pubkey.x->raw,
  7629. &key->pubkey.y->raw, &r->raw, &s->raw, &curve->Af->raw,
  7630. &curve->Bf->raw, &curve->prime->raw, &curve->order->raw,
  7631. &curve->Gx->raw, &curve->Gy->raw, res);
  7632. #endif
  7633. #ifndef HAVE_CAVIUM_V
  7634. mp_clear(e);
  7635. #endif
  7636. return err;
  7637. }
  7638. #endif /* HAVE_CAVIUM_V || HAVE_INTEL_QA */
  7639. }
  7640. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */
  7641. NEW_MP_INT_SIZE(w, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC);
  7642. #ifdef MP_INT_SIZE_CHECK_NULL
  7643. if (w == NULL) {
  7644. err = MEMORY_E;
  7645. }
  7646. #endif
  7647. if (err == MP_OKAY) {
  7648. u1 = e;
  7649. u2 = w;
  7650. v = w;
  7651. }
  7652. if (err == MP_OKAY) {
  7653. err = INIT_MP_INT_SIZE(w, ECC_KEY_MAX_BITS(key));
  7654. }
  7655. /* allocate points */
  7656. if (err == MP_OKAY) {
  7657. #ifdef WOLFSSL_NO_MALLOC
  7658. mG = &lcl_mG;
  7659. #endif
  7660. err = wc_ecc_new_point_ex(&mG, key->heap);
  7661. }
  7662. if (err == MP_OKAY) {
  7663. #ifdef WOLFSSL_NO_MALLOC
  7664. mQ = &lcl_mQ;
  7665. #endif
  7666. err = wc_ecc_new_point_ex(&mQ, key->heap);
  7667. }
  7668. /* w = s^-1 mod n */
  7669. if (err == MP_OKAY)
  7670. err = mp_invmod(s, curve->order, w);
  7671. /* u1 = ew */
  7672. if (err == MP_OKAY)
  7673. err = mp_mulmod(e, w, curve->order, u1);
  7674. /* u2 = rw */
  7675. if (err == MP_OKAY)
  7676. err = mp_mulmod(r, w, curve->order, u2);
  7677. /* find mG and mQ */
  7678. if (err == MP_OKAY)
  7679. err = mp_copy(curve->Gx, mG->x);
  7680. if (err == MP_OKAY)
  7681. err = mp_copy(curve->Gy, mG->y);
  7682. if (err == MP_OKAY)
  7683. err = mp_set(mG->z, 1);
  7684. if (err == MP_OKAY)
  7685. err = mp_copy(key->pubkey.x, mQ->x);
  7686. if (err == MP_OKAY)
  7687. err = mp_copy(key->pubkey.y, mQ->y);
  7688. if (err == MP_OKAY)
  7689. err = mp_copy(key->pubkey.z, mQ->z);
  7690. #if defined(FREESCALE_LTC_ECC)
  7691. /* use PKHA to compute u1*mG + u2*mQ */
  7692. if (err == MP_OKAY)
  7693. err = wc_ecc_mulmod_ex(u1, mG, mG, curve->Af, curve->prime, 0, key->heap);
  7694. if (err == MP_OKAY)
  7695. err = wc_ecc_mulmod_ex(u2, mQ, mQ, curve->Af, curve->prime, 0, key->heap);
  7696. if (err == MP_OKAY)
  7697. err = wc_ecc_point_add(mG, mQ, mG, curve->prime);
  7698. #else
  7699. #ifndef ECC_SHAMIR
  7700. if (err == MP_OKAY)
  7701. {
  7702. mp_digit mp = 0;
  7703. if (!mp_iszero((MP_INT_SIZE*)u1)) {
  7704. /* compute u1*mG + u2*mQ = mG */
  7705. err = wc_ecc_mulmod_ex(u1, mG, mG, curve->Af, curve->prime, 0,
  7706. key->heap);
  7707. if (err == MP_OKAY) {
  7708. err = wc_ecc_mulmod_ex(u2, mQ, mQ, curve->Af, curve->prime, 0,
  7709. key->heap);
  7710. }
  7711. /* find the montgomery mp */
  7712. if (err == MP_OKAY)
  7713. err = mp_montgomery_setup(curve->prime, &mp);
  7714. /* add them */
  7715. if (err == MP_OKAY)
  7716. err = ecc_projective_add_point_safe(mQ, mG, mG, curve->Af,
  7717. curve->prime, mp, NULL);
  7718. }
  7719. else {
  7720. /* compute 0*mG + u2*mQ = mG */
  7721. err = wc_ecc_mulmod_ex(u2, mQ, mG, curve->Af, curve->prime, 0,
  7722. key->heap);
  7723. /* find the montgomery mp */
  7724. if (err == MP_OKAY)
  7725. err = mp_montgomery_setup(curve->prime, &mp);
  7726. }
  7727. /* reduce */
  7728. if (err == MP_OKAY)
  7729. err = ecc_map(mG, curve->prime, mp);
  7730. }
  7731. #else
  7732. /* use Shamir's trick to compute u1*mG + u2*mQ using half the doubles */
  7733. if (err == MP_OKAY) {
  7734. err = ecc_mul2add(mG, u1, mQ, u2, mG, curve->Af, curve->prime,
  7735. key->heap);
  7736. }
  7737. #endif /* ECC_SHAMIR */
  7738. #endif /* FREESCALE_LTC_ECC */
  7739. /* v = X_x1 mod n */
  7740. if (err == MP_OKAY)
  7741. err = mp_mod(mG->x, curve->order, v);
  7742. /* does v == r */
  7743. if (err == MP_OKAY) {
  7744. if (mp_cmp(v, r) == MP_EQ)
  7745. *res = 1;
  7746. }
  7747. /* cleanup */
  7748. wc_ecc_del_point_ex(mG, key->heap);
  7749. wc_ecc_del_point_ex(mQ, key->heap);
  7750. mp_clear(e);
  7751. mp_clear(w);
  7752. FREE_MP_INT_SIZE(w, key->heap, DYNAMIC_TYPE_ECC);
  7753. #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)
  7754. FREE_MP_INT_SIZE(e_lcl, key->heap, DYNAMIC_TYPE_ECC);
  7755. #endif
  7756. return err;
  7757. }
  7758. #endif /* !WOLFSSL_SP_MATH || FREESCALE_LTC_ECC */
  7759. /**
  7760. Verify an ECC signature
  7761. r The signature R component to verify
  7762. s The signature S component to verify
  7763. hash The hash (message digest) that was signed
  7764. hashlen The length of the hash (octets)
  7765. res Result of signature, 1==valid, 0==invalid
  7766. key The corresponding public ECC key
  7767. return MP_OKAY if successful (even if the signature is not valid)
  7768. Caller should check the *res value to determine if the signature
  7769. is valid or invalid. Other negative values are returned on error.
  7770. */
  7771. int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
  7772. word32 hashlen, int* res, ecc_key* key)
  7773. {
  7774. #if defined(WOLFSSL_STM32_PKA)
  7775. return stm32_ecc_verify_hash_ex(r, s, hash, hashlen, res, key);
  7776. #elif defined(WOLFSSL_PSOC6_CRYPTO)
  7777. return psoc6_ecc_verify_hash_ex(r, s, hash, hashlen, res, key);
  7778. #else
  7779. int err;
  7780. word32 keySz = 0;
  7781. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  7782. byte sigRS[ATECC_KEY_SIZE*2];
  7783. #elif defined(WOLFSSL_CRYPTOCELL)
  7784. byte sigRS[ECC_MAX_CRYPTO_HW_SIZE*2];
  7785. CRYS_ECDSA_VerifyUserContext_t sigCtxTemp;
  7786. word32 msgLenInBytes = hashlen;
  7787. CRYS_ECPKI_HASH_OpMode_t hash_mode;
  7788. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  7789. byte sigRS[ECC_MAX_CRYPTO_HW_SIZE * 2];
  7790. #elif defined(WOLFSSL_KCAPI_ECC)
  7791. byte sigRS[MAX_ECC_BYTES*2];
  7792. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  7793. byte sigRS[ECC_MAX_CRYPTO_HW_SIZE * 2];
  7794. byte hashcopy[ECC_MAX_CRYPTO_HW_SIZE] = {0};
  7795. #else
  7796. int curveLoaded = 0;
  7797. DECLARE_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
  7798. #endif
  7799. if (r == NULL || s == NULL || hash == NULL || res == NULL || key == NULL)
  7800. return ECC_BAD_ARG_E;
  7801. /* default to invalid signature */
  7802. *res = 0;
  7803. /* is the IDX valid ? */
  7804. if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) {
  7805. return ECC_BAD_ARG_E;
  7806. }
  7807. err = wc_ecc_check_r_s_range(key, r, s);
  7808. if (err != MP_OKAY) {
  7809. return err;
  7810. }
  7811. keySz = (word32)key->dp->size;
  7812. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
  7813. defined(WOLFSSL_ASYNC_CRYPT_SW)
  7814. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
  7815. if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_VERIFY)) {
  7816. WC_ASYNC_SW* sw = &key->asyncDev.sw;
  7817. sw->eccVerify.r = r;
  7818. sw->eccVerify.s = s;
  7819. sw->eccVerify.hash = hash;
  7820. sw->eccVerify.hashlen = hashlen;
  7821. sw->eccVerify.stat = res;
  7822. sw->eccVerify.key = key;
  7823. return WC_PENDING_E;
  7824. }
  7825. }
  7826. #endif
  7827. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  7828. defined(WOLFSSL_CRYPTOCELL) || defined(WOLFSSL_SILABS_SE_ACCEL) || \
  7829. defined(WOLFSSL_KCAPI_ECC) || defined(WOLFSSL_SE050) || \
  7830. defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  7831. #ifndef WOLFSSL_SE050
  7832. /* Extract R and S with front zero padding (if required),
  7833. * SE050 does this in port layer */
  7834. XMEMSET(sigRS, 0, sizeof(sigRS));
  7835. err = mp_to_unsigned_bin(r, sigRS +
  7836. (keySz - mp_unsigned_bin_size(r)));
  7837. if (err != MP_OKAY) {
  7838. return err;
  7839. }
  7840. err = mp_to_unsigned_bin(s, sigRS + keySz +
  7841. (keySz - mp_unsigned_bin_size(s)));
  7842. if (err != MP_OKAY) {
  7843. return err;
  7844. }
  7845. #endif /* WOLFSSL_SE050 */
  7846. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  7847. err = atmel_ecc_verify(hash, sigRS, key->pubkey_raw, res);
  7848. if (err != 0) {
  7849. return err;
  7850. }
  7851. (void)hashlen;
  7852. #elif defined(WOLFSSL_CRYPTOCELL)
  7853. /* truncate if hash is longer than key size */
  7854. if (msgLenInBytes > keySz) {
  7855. msgLenInBytes = keySz;
  7856. }
  7857. hash_mode = cc310_hashModeECC(msgLenInBytes);
  7858. if (hash_mode == CRYS_ECPKI_HASH_OpModeLast) {
  7859. /* hash_mode = */ cc310_hashModeECC(keySz);
  7860. hash_mode = CRYS_ECPKI_HASH_SHA256_mode;
  7861. }
  7862. /* verify the signature using the public key */
  7863. err = CRYS_ECDSA_Verify(&sigCtxTemp,
  7864. &key->ctx.pubKey,
  7865. hash_mode,
  7866. &sigRS[0],
  7867. keySz*2,
  7868. (byte*)hash,
  7869. msgLenInBytes);
  7870. if (err == CRYS_ECDSA_VERIFY_INCONSISTENT_VERIFY_ERROR) {
  7871. /* signature verification reported invalid signature. */
  7872. *res = 0; /* Redundant, added for code clarity */
  7873. err = MP_OKAY;
  7874. }
  7875. else if (err != SA_SILIB_RET_OK) {
  7876. WOLFSSL_MSG("CRYS_ECDSA_Verify failed");
  7877. return err;
  7878. }
  7879. else {
  7880. /* valid signature. */
  7881. *res = 1;
  7882. err = MP_OKAY;
  7883. }
  7884. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  7885. err = silabs_ecc_verify_hash(&sigRS[0], keySz * 2,
  7886. hash, hashlen,
  7887. res, key);
  7888. #elif defined(WOLFSSL_KCAPI_ECC)
  7889. err = KcapiEcc_Verify(key, hash, hashlen, sigRS, keySz * 2);
  7890. if (err == 0) {
  7891. *res = 1;
  7892. }
  7893. #elif defined(WOLFSSL_SE050)
  7894. err = se050_ecc_verify_hash_ex(hash, hashlen, r, s, key, res);
  7895. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  7896. if (hashlen > sizeof(hashcopy))
  7897. return ECC_BAD_ARG_E;
  7898. buf_reverse(hashcopy, hash, (hashlen < keySz) ? hashlen : keySz);
  7899. mp_reverse(sigRS, keySz);
  7900. mp_reverse(sigRS + keySz, keySz);
  7901. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(hashcopy), keySz);
  7902. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->keyRaw), keySz * 2);
  7903. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(sigRS), keySz * 2);
  7904. err = XSecure_EllipticVerifySign(&(key->xSec.cinst),
  7905. xil_curve_type[key->dp->id],
  7906. XIL_CAST_U64(hashcopy), keySz,
  7907. XIL_CAST_U64(key->keyRaw),
  7908. XIL_CAST_U64(sigRS));
  7909. if (err != XST_SUCCESS) {
  7910. WOLFSSL_XIL_ERROR("Verify ECC signature failed", err);
  7911. err = WC_HW_E;
  7912. } else {
  7913. *res = 1;
  7914. }
  7915. #endif
  7916. #else
  7917. /* checking if private key with no public part */
  7918. if (key->type == ECC_PRIVATEKEY_ONLY) {
  7919. WOLFSSL_MSG("Verify called with private key, generating public part");
  7920. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  7921. if (err != MP_OKAY) {
  7922. return err;
  7923. }
  7924. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  7925. if (err != MP_OKAY) {
  7926. FREE_CURVE_SPECS();
  7927. return err;
  7928. }
  7929. err = ecc_make_pub_ex(key, curve, NULL, NULL);
  7930. if (err != MP_OKAY) {
  7931. WOLFSSL_MSG("Unable to extract public key");
  7932. wc_ecc_curve_free(curve);
  7933. FREE_CURVE_SPECS();
  7934. return err;
  7935. }
  7936. curveLoaded = 1;
  7937. }
  7938. err = ecc_verify_hash_sp(r, s, hash, hashlen, res, key);
  7939. if (err != NOT_COMPILED_IN) {
  7940. if (curveLoaded) {
  7941. wc_ecc_curve_free(curve);
  7942. FREE_CURVE_SPECS();
  7943. }
  7944. return err;
  7945. }
  7946. #if !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC)
  7947. if (!curveLoaded) {
  7948. err = 0; /* potential for NOT_COMPILED_IN error from SP attempt */
  7949. ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err);
  7950. if (err != 0) {
  7951. return err;
  7952. }
  7953. /* read in the specs for this curve */
  7954. err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
  7955. if (err != 0) {
  7956. FREE_CURVE_SPECS();
  7957. return err;
  7958. }
  7959. }
  7960. err = ecc_verify_hash(r, s, hash, hashlen, res, key, curve);
  7961. #endif /* !WOLFSSL_SP_MATH || FREESCALE_LTC_ECC */
  7962. (void)curveLoaded;
  7963. wc_ecc_curve_free(curve);
  7964. FREE_CURVE_SPECS();
  7965. #endif /* WOLFSSL_ATECC508A */
  7966. (void)keySz;
  7967. (void)hashlen;
  7968. return err;
  7969. #endif /* WOLFSSL_STM32_PKA */
  7970. }
  7971. #endif /* WOLF_CRYPTO_CB_ONLY_ECC */
  7972. #endif /* HAVE_ECC_VERIFY */
  7973. #ifdef HAVE_ECC_KEY_IMPORT
  7974. /* import point from der
  7975. * if shortKeySize != 0 then keysize is always (inLen-1)>>1 */
  7976. int wc_ecc_import_point_der_ex(const byte* in, word32 inLen,
  7977. const int curve_idx, ecc_point* point,
  7978. int shortKeySize)
  7979. {
  7980. int err = 0;
  7981. #ifdef HAVE_COMP_KEY
  7982. int compressed = 0;
  7983. #endif
  7984. int keysize;
  7985. byte pointType;
  7986. #ifndef HAVE_COMP_KEY
  7987. (void)shortKeySize;
  7988. #endif
  7989. if (in == NULL || point == NULL || (curve_idx < 0) ||
  7990. (wc_ecc_is_valid_idx(curve_idx) == 0))
  7991. return ECC_BAD_ARG_E;
  7992. /* must be odd */
  7993. if ((inLen & 1) == 0) {
  7994. return ECC_BAD_ARG_E;
  7995. }
  7996. /* clear if previously allocated */
  7997. mp_clear(point->x);
  7998. mp_clear(point->y);
  7999. mp_clear(point->z);
  8000. /* init point */
  8001. #ifdef ALT_ECC_SIZE
  8002. point->x = (mp_int*)&point->xyz[0];
  8003. point->y = (mp_int*)&point->xyz[1];
  8004. point->z = (mp_int*)&point->xyz[2];
  8005. alt_fp_init(point->x);
  8006. alt_fp_init(point->y);
  8007. alt_fp_init(point->z);
  8008. #else
  8009. err = mp_init_multi(point->x, point->y, point->z, NULL, NULL, NULL);
  8010. #endif
  8011. if (err != MP_OKAY)
  8012. return MEMORY_E;
  8013. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  8014. /* check for point type (4, 2, or 3) */
  8015. pointType = in[0];
  8016. if (pointType != ECC_POINT_UNCOMP && pointType != ECC_POINT_COMP_EVEN &&
  8017. pointType != ECC_POINT_COMP_ODD) {
  8018. err = ASN_PARSE_E;
  8019. }
  8020. if (pointType == ECC_POINT_COMP_EVEN || pointType == ECC_POINT_COMP_ODD) {
  8021. #ifdef HAVE_COMP_KEY
  8022. compressed = 1;
  8023. #else
  8024. err = NOT_COMPILED_IN;
  8025. #endif
  8026. }
  8027. /* adjust to skip first byte */
  8028. inLen -= 1;
  8029. in += 1;
  8030. /* calculate key size based on inLen / 2 if uncompressed or shortKeySize
  8031. * is true */
  8032. #ifdef HAVE_COMP_KEY
  8033. keysize = (int)((compressed && !shortKeySize) ? inLen : inLen>>1);
  8034. #else
  8035. keysize = (int)(inLen>>1);
  8036. #endif
  8037. /* read data */
  8038. if (err == MP_OKAY)
  8039. err = mp_read_unsigned_bin(point->x, in, (word32)keysize);
  8040. #ifdef HAVE_COMP_KEY
  8041. if (err == MP_OKAY && compressed == 1) { /* build y */
  8042. #if defined(WOLFSSL_HAVE_SP_ECC)
  8043. #ifndef WOLFSSL_SP_NO_256
  8044. if (curve_idx != ECC_CUSTOM_IDX &&
  8045. ecc_sets[curve_idx].id == ECC_SECP256R1) {
  8046. err = sp_ecc_uncompress_256(point->x, pointType, point->y);
  8047. }
  8048. else
  8049. #endif
  8050. #ifdef WOLFSSL_SP_384
  8051. if (curve_idx != ECC_CUSTOM_IDX &&
  8052. ecc_sets[curve_idx].id == ECC_SECP384R1) {
  8053. err = sp_ecc_uncompress_384(point->x, pointType, point->y);
  8054. }
  8055. else
  8056. #endif
  8057. #ifdef WOLFSSL_SP_521
  8058. if (curve_idx != ECC_CUSTOM_IDX &&
  8059. ecc_sets[curve_idx].id == ECC_SECP521R1) {
  8060. err = sp_ecc_uncompress_521(point->x, pointType, point->y);
  8061. }
  8062. else
  8063. #endif
  8064. #endif
  8065. #if !defined(WOLFSSL_SP_MATH)
  8066. {
  8067. int did_init = 0;
  8068. #ifdef WOLFSSL_SMALL_STACK
  8069. mp_int* t1 = NULL;
  8070. mp_int* t2 = NULL;
  8071. #else
  8072. mp_int t1[1], t2[1];
  8073. #endif
  8074. DECLARE_CURVE_SPECS(3);
  8075. ALLOC_CURVE_SPECS(3, err);
  8076. #ifdef WOLFSSL_SMALL_STACK
  8077. if (err == MP_OKAY) {
  8078. t1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL,
  8079. DYNAMIC_TYPE_BIGINT);
  8080. if (t1 == NULL) {
  8081. err = MEMORY_E;
  8082. }
  8083. }
  8084. if (err == MP_OKAY) {
  8085. t2 = (mp_int*)XMALLOC(sizeof(mp_int), NULL,
  8086. DYNAMIC_TYPE_BIGINT);
  8087. if (t2 == NULL) {
  8088. err = MEMORY_E;
  8089. }
  8090. }
  8091. #endif
  8092. if (err == MP_OKAY) {
  8093. if (mp_init_multi(t1, t2, NULL, NULL, NULL, NULL) != MP_OKAY)
  8094. err = MEMORY_E;
  8095. else
  8096. did_init = 1;
  8097. }
  8098. /* load curve info */
  8099. if (err == MP_OKAY)
  8100. err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve,
  8101. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  8102. ECC_CURVE_FIELD_BF));
  8103. #if defined(WOLFSSL_CUSTOM_CURVES) && \
  8104. defined(WOLFSSL_VALIDATE_ECC_IMPORT)
  8105. /* validate prime is prime for custom curves */
  8106. if (err == MP_OKAY && curve_idx == ECC_CUSTOM_IDX) {
  8107. int isPrime = MP_NO;
  8108. err = mp_prime_is_prime(curve->prime, 8, &isPrime);
  8109. if (err == MP_OKAY && isPrime == MP_NO)
  8110. err = MP_VAL;
  8111. }
  8112. #endif
  8113. /* compute x^3 */
  8114. if (err == MP_OKAY)
  8115. err = mp_sqr(point->x, t1);
  8116. if (err == MP_OKAY)
  8117. err = mp_mulmod(t1, point->x, curve->prime, t1);
  8118. /* compute x^3 + a*x */
  8119. if (err == MP_OKAY)
  8120. err = mp_mulmod(curve->Af, point->x, curve->prime, t2);
  8121. if (err == MP_OKAY)
  8122. err = mp_add(t1, t2, t1);
  8123. /* compute x^3 + a*x + b */
  8124. if (err == MP_OKAY)
  8125. err = mp_add(t1, curve->Bf, t1);
  8126. /* compute sqrt(x^3 + a*x + b) */
  8127. if (err == MP_OKAY)
  8128. err = mp_sqrtmod_prime(t1, curve->prime, t2);
  8129. /* adjust y */
  8130. if (err == MP_OKAY) {
  8131. if ((mp_isodd(t2) == MP_YES &&
  8132. pointType == ECC_POINT_COMP_ODD) ||
  8133. (mp_isodd(t2) == MP_NO &&
  8134. pointType == ECC_POINT_COMP_EVEN)) {
  8135. err = mp_mod(t2, curve->prime, point->y);
  8136. }
  8137. else {
  8138. err = mp_submod(curve->prime, t2, curve->prime, point->y);
  8139. }
  8140. }
  8141. if (did_init) {
  8142. mp_clear(t2);
  8143. mp_clear(t1);
  8144. }
  8145. #ifdef WOLFSSL_SMALL_STACK
  8146. if (t1 != NULL) {
  8147. XFREE(t1, NULL, DYNAMIC_TYPE_BIGINT);
  8148. }
  8149. if (t2 != NULL) {
  8150. XFREE(t2, NULL, DYNAMIC_TYPE_BIGINT);
  8151. }
  8152. #endif
  8153. wc_ecc_curve_free(curve);
  8154. FREE_CURVE_SPECS();
  8155. }
  8156. #else
  8157. {
  8158. err = WC_KEY_SIZE_E;
  8159. }
  8160. #endif
  8161. }
  8162. #endif
  8163. if (err == MP_OKAY) {
  8164. #ifdef HAVE_COMP_KEY
  8165. if (compressed == 0)
  8166. #endif
  8167. err = mp_read_unsigned_bin(point->y, in + keysize, (word32)keysize);
  8168. }
  8169. if (err == MP_OKAY)
  8170. err = mp_set(point->z, 1);
  8171. if (err != MP_OKAY) {
  8172. mp_clear(point->x);
  8173. mp_clear(point->y);
  8174. mp_clear(point->z);
  8175. }
  8176. RESTORE_VECTOR_REGISTERS();
  8177. return err;
  8178. }
  8179. /* function for backwards compatiblity with previous implementations */
  8180. int wc_ecc_import_point_der(const byte* in, word32 inLen, const int curve_idx,
  8181. ecc_point* point)
  8182. {
  8183. return wc_ecc_import_point_der_ex(in, inLen, curve_idx, point, 1);
  8184. }
  8185. #endif /* HAVE_ECC_KEY_IMPORT */
  8186. #ifdef HAVE_ECC_KEY_EXPORT
  8187. /* export point to der */
  8188. int wc_ecc_export_point_der_ex(const int curve_idx, ecc_point* point, byte* out,
  8189. word32* outLen, int compressed)
  8190. {
  8191. if (compressed == 0)
  8192. return wc_ecc_export_point_der(curve_idx, point, out, outLen);
  8193. #ifdef HAVE_COMP_KEY
  8194. else
  8195. return wc_ecc_export_point_der_compressed(curve_idx, point, out, outLen);
  8196. #else
  8197. return NOT_COMPILED_IN;
  8198. #endif
  8199. }
  8200. int wc_ecc_export_point_der(const int curve_idx, ecc_point* point, byte* out,
  8201. word32* outLen)
  8202. {
  8203. int ret = MP_OKAY;
  8204. word32 numlen;
  8205. #ifdef WOLFSSL_SMALL_STACK
  8206. byte* buf;
  8207. #else
  8208. byte buf[ECC_BUFSIZE];
  8209. #endif
  8210. if ((curve_idx < 0) || (wc_ecc_is_valid_idx(curve_idx) == 0))
  8211. return ECC_BAD_ARG_E;
  8212. numlen = (word32)ecc_sets[curve_idx].size;
  8213. /* return length needed only */
  8214. if (point != NULL && out == NULL && outLen != NULL) {
  8215. *outLen = 1 + 2*numlen;
  8216. return LENGTH_ONLY_E;
  8217. }
  8218. if (point == NULL || out == NULL || outLen == NULL)
  8219. return ECC_BAD_ARG_E;
  8220. if (*outLen < (1 + 2*numlen)) {
  8221. *outLen = 1 + 2*numlen;
  8222. return BUFFER_E;
  8223. }
  8224. /* Sanity check the ordinates' sizes. */
  8225. if (((word32)mp_unsigned_bin_size(point->x) > numlen) ||
  8226. ((word32)mp_unsigned_bin_size(point->y) > numlen)) {
  8227. return ECC_BAD_ARG_E;
  8228. }
  8229. /* store byte point type */
  8230. out[0] = ECC_POINT_UNCOMP;
  8231. #ifdef WOLFSSL_SMALL_STACK
  8232. buf = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8233. if (buf == NULL)
  8234. return MEMORY_E;
  8235. #endif
  8236. /* pad and store x */
  8237. XMEMSET(buf, 0, ECC_BUFSIZE);
  8238. ret = mp_to_unsigned_bin(point->x, buf +
  8239. (numlen - (word32)mp_unsigned_bin_size(point->x)));
  8240. if (ret != MP_OKAY)
  8241. goto done;
  8242. XMEMCPY(out+1, buf, numlen);
  8243. /* pad and store y */
  8244. XMEMSET(buf, 0, ECC_BUFSIZE);
  8245. ret = mp_to_unsigned_bin(point->y, buf +
  8246. (numlen - (word32)mp_unsigned_bin_size(point->y)));
  8247. if (ret != MP_OKAY)
  8248. goto done;
  8249. XMEMCPY(out+1+numlen, buf, numlen);
  8250. *outLen = 1 + 2*numlen;
  8251. done:
  8252. #ifdef WOLFSSL_SMALL_STACK
  8253. XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8254. #endif
  8255. return ret;
  8256. }
  8257. /* export point to der */
  8258. #ifdef HAVE_COMP_KEY
  8259. int wc_ecc_export_point_der_compressed(const int curve_idx, ecc_point* point,
  8260. byte* out, word32* outLen)
  8261. {
  8262. int ret = MP_OKAY;
  8263. word32 numlen;
  8264. word32 output_len;
  8265. #ifdef WOLFSSL_SMALL_STACK
  8266. byte* buf;
  8267. #else
  8268. byte buf[ECC_BUFSIZE];
  8269. #endif
  8270. if ((curve_idx < 0) || (wc_ecc_is_valid_idx(curve_idx) == 0))
  8271. return ECC_BAD_ARG_E;
  8272. numlen = (word32)ecc_sets[curve_idx].size;
  8273. output_len = 1 + numlen; /* y point type + x */
  8274. /* return length needed only */
  8275. if (point != NULL && out == NULL && outLen != NULL) {
  8276. *outLen = output_len;
  8277. return LENGTH_ONLY_E;
  8278. }
  8279. if (point == NULL || out == NULL || outLen == NULL)
  8280. return ECC_BAD_ARG_E;
  8281. if (*outLen < output_len) {
  8282. *outLen = output_len;
  8283. return BUFFER_E;
  8284. }
  8285. /* Sanity check the ordinate's size. */
  8286. if ((word32)mp_unsigned_bin_size(point->x) > numlen) {
  8287. return ECC_BAD_ARG_E;
  8288. }
  8289. /* store byte point type */
  8290. out[0] = mp_isodd(point->y) == MP_YES ? ECC_POINT_COMP_ODD :
  8291. ECC_POINT_COMP_EVEN;
  8292. #ifdef WOLFSSL_SMALL_STACK
  8293. buf = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8294. if (buf == NULL)
  8295. return MEMORY_E;
  8296. #endif
  8297. /* pad and store x */
  8298. XMEMSET(buf, 0, ECC_BUFSIZE);
  8299. ret = mp_to_unsigned_bin(point->x, buf +
  8300. (numlen - (word32)mp_unsigned_bin_size(point->x)));
  8301. if (ret != MP_OKAY)
  8302. goto done;
  8303. XMEMCPY(out+1, buf, numlen);
  8304. *outLen = output_len;
  8305. done:
  8306. #ifdef WOLFSSL_SMALL_STACK
  8307. XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8308. #endif
  8309. return ret;
  8310. }
  8311. #endif /* HAVE_COMP_KEY */
  8312. /* export public ECC key in ANSI X9.63 format */
  8313. WOLFSSL_ABI
  8314. int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen)
  8315. {
  8316. int ret = MP_OKAY;
  8317. word32 numlen;
  8318. #ifdef WOLFSSL_SMALL_STACK
  8319. byte* buf;
  8320. #else
  8321. byte buf[ECC_BUFSIZE];
  8322. #endif
  8323. word32 pubxlen, pubylen;
  8324. /* return length needed only */
  8325. if (key != NULL && out == NULL && outLen != NULL) {
  8326. /* if key hasn't been setup assume max bytes for size estimation */
  8327. numlen = key->dp ? (word32)key->dp->size : MAX_ECC_BYTES;
  8328. *outLen = 1 + 2 * numlen;
  8329. return LENGTH_ONLY_E;
  8330. }
  8331. if (key == NULL || out == NULL || outLen == NULL)
  8332. return ECC_BAD_ARG_E;
  8333. if (key->type == ECC_PRIVATEKEY_ONLY)
  8334. return ECC_PRIVATEONLY_E;
  8335. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  8336. /* check if public key in secure memory */
  8337. if (key->securePubKey > 0) {
  8338. int keySz = wc_ecc_size(key);
  8339. /* store byte point type */
  8340. out[0] = ECC_POINT_UNCOMP;
  8341. if (caamReadPartition((CAAM_ADDRESS)key->securePubKey, out+1, keySz*2) != 0)
  8342. return WC_HW_E;
  8343. *outLen = 1 + 2*keySz;
  8344. return MP_OKAY;
  8345. }
  8346. #endif
  8347. if (key->type == 0 || wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL){
  8348. return ECC_BAD_ARG_E;
  8349. }
  8350. numlen = (word32)key->dp->size;
  8351. /* verify room in out buffer */
  8352. if (*outLen < (1 + 2*numlen)) {
  8353. *outLen = 1 + 2*numlen;
  8354. return BUFFER_E;
  8355. }
  8356. /* verify public key length is less than key size */
  8357. pubxlen = (word32)mp_unsigned_bin_size(key->pubkey.x);
  8358. pubylen = (word32)mp_unsigned_bin_size(key->pubkey.y);
  8359. if ((pubxlen > numlen) || (pubylen > numlen)) {
  8360. WOLFSSL_MSG("Public key x/y invalid!");
  8361. return BUFFER_E;
  8362. }
  8363. /* store byte point type */
  8364. out[0] = ECC_POINT_UNCOMP;
  8365. #ifdef WOLFSSL_SMALL_STACK
  8366. buf = (byte*)XMALLOC(ECC_BUFSIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8367. if (buf == NULL)
  8368. return MEMORY_E;
  8369. #endif
  8370. /* pad and store x */
  8371. XMEMSET(buf, 0, ECC_BUFSIZE);
  8372. ret = mp_to_unsigned_bin(key->pubkey.x, buf + (numlen - pubxlen));
  8373. if (ret != MP_OKAY)
  8374. goto done;
  8375. XMEMCPY(out+1, buf, numlen);
  8376. /* pad and store y */
  8377. XMEMSET(buf, 0, ECC_BUFSIZE);
  8378. ret = mp_to_unsigned_bin(key->pubkey.y, buf + (numlen - pubylen));
  8379. if (ret != MP_OKAY)
  8380. goto done;
  8381. XMEMCPY(out+1+numlen, buf, numlen);
  8382. *outLen = 1 + 2*numlen;
  8383. done:
  8384. #ifdef WOLFSSL_SMALL_STACK
  8385. XFREE(buf, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  8386. #endif
  8387. return ret;
  8388. }
  8389. /* export public ECC key in ANSI X9.63 format, extended with
  8390. * compression option */
  8391. WOLFSSL_ABI
  8392. int wc_ecc_export_x963_ex(ecc_key* key, byte* out, word32* outLen,
  8393. int compressed)
  8394. {
  8395. if (compressed == 0)
  8396. return wc_ecc_export_x963(key, out, outLen);
  8397. #ifdef HAVE_COMP_KEY
  8398. else
  8399. return wc_ecc_export_x963_compressed(key, out, outLen);
  8400. #else
  8401. return NOT_COMPILED_IN;
  8402. #endif
  8403. }
  8404. #endif /* HAVE_ECC_KEY_EXPORT */
  8405. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  8406. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SE050) && \
  8407. !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(WOLFSSL_STM32_PKA)
  8408. /* is ecc point on curve described by dp ? */
  8409. static int _ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
  8410. {
  8411. #if !defined(WOLFSSL_SP_MATH)
  8412. int err;
  8413. #ifdef WOLFSSL_SMALL_STACK
  8414. mp_int* t1;
  8415. mp_int* t2;
  8416. #else
  8417. mp_int t1[1], t2[1];
  8418. #endif
  8419. #ifdef WOLFSSL_SMALL_STACK
  8420. t1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  8421. if (t1 == NULL)
  8422. return MEMORY_E;
  8423. t2 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  8424. if (t2 == NULL) {
  8425. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  8426. return MEMORY_E;
  8427. }
  8428. #endif
  8429. if ((err = mp_init_multi(t1, t2, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  8430. #ifdef WOLFSSL_SMALL_STACK
  8431. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  8432. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  8433. #endif
  8434. return err;
  8435. }
  8436. SAVE_VECTOR_REGISTERS(err = _svr_ret;);
  8437. /* compute y^2 */
  8438. if (err == MP_OKAY)
  8439. err = mp_sqr(ecp->y, t1);
  8440. /* compute x^3 */
  8441. if (err == MP_OKAY)
  8442. err = mp_sqr(ecp->x, t2);
  8443. if (err == MP_OKAY)
  8444. err = mp_mod(t2, prime, t2);
  8445. if (err == MP_OKAY)
  8446. err = mp_mul(ecp->x, t2, t2);
  8447. /* compute y^2 - x^3 */
  8448. if (err == MP_OKAY)
  8449. err = mp_submod(t1, t2, prime, t1);
  8450. /* Determine if curve "a" should be used in calc */
  8451. #ifdef WOLFSSL_CUSTOM_CURVES
  8452. if (err == MP_OKAY) {
  8453. /* Use a and prime to determine if a == 3 */
  8454. err = mp_set(t2, 0);
  8455. if (err == MP_OKAY)
  8456. err = mp_submod(prime, a, prime, t2);
  8457. }
  8458. if (err == MP_OKAY && mp_cmp_d(t2, 3) != MP_EQ) {
  8459. /* compute y^2 - x^3 + a*x */
  8460. if (err == MP_OKAY)
  8461. err = mp_mulmod(t2, ecp->x, prime, t2);
  8462. if (err == MP_OKAY)
  8463. err = mp_addmod(t1, t2, prime, t1);
  8464. }
  8465. else
  8466. #endif /* WOLFSSL_CUSTOM_CURVES */
  8467. {
  8468. /* assumes "a" == 3 */
  8469. (void)a;
  8470. /* compute y^2 - x^3 + 3x */
  8471. if (err == MP_OKAY)
  8472. err = mp_add(t1, ecp->x, t1);
  8473. if (err == MP_OKAY)
  8474. err = mp_add(t1, ecp->x, t1);
  8475. if (err == MP_OKAY)
  8476. err = mp_add(t1, ecp->x, t1);
  8477. if (err == MP_OKAY)
  8478. err = mp_mod(t1, prime, t1);
  8479. }
  8480. /* adjust range (0, prime) */
  8481. while (err == MP_OKAY && mp_isneg(t1)) {
  8482. err = mp_add(t1, prime, t1);
  8483. }
  8484. while (err == MP_OKAY && mp_cmp(t1, prime) != MP_LT) {
  8485. err = mp_sub(t1, prime, t1);
  8486. }
  8487. /* compare to b */
  8488. if (err == MP_OKAY) {
  8489. if (mp_cmp(t1, b) != MP_EQ) {
  8490. err = IS_POINT_E;
  8491. } else {
  8492. err = MP_OKAY;
  8493. }
  8494. }
  8495. mp_clear(t1);
  8496. mp_clear(t2);
  8497. RESTORE_VECTOR_REGISTERS();
  8498. #ifdef WOLFSSL_SMALL_STACK
  8499. XFREE(t2, NULL, DYNAMIC_TYPE_ECC);
  8500. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  8501. #endif
  8502. return err;
  8503. #else
  8504. (void)a;
  8505. (void)b;
  8506. #ifdef WOLFSSL_HAVE_SP_ECC
  8507. #ifndef WOLFSSL_SP_NO_256
  8508. if (mp_count_bits(prime) == 256) {
  8509. return sp_ecc_is_point_256(ecp->x, ecp->y);
  8510. }
  8511. #endif
  8512. #ifdef WOLFSSL_SP_384
  8513. if (mp_count_bits(prime) == 384) {
  8514. return sp_ecc_is_point_384(ecp->x, ecp->y);
  8515. }
  8516. #endif
  8517. #ifdef WOLFSSL_SP_521
  8518. if (mp_count_bits(prime) == 521) {
  8519. return sp_ecc_is_point_521(ecp->x, ecp->y);
  8520. }
  8521. #endif
  8522. #else
  8523. (void)ecp;
  8524. (void)prime;
  8525. #endif
  8526. return WC_KEY_SIZE_E;
  8527. #endif
  8528. }
  8529. int wc_ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
  8530. {
  8531. int err = MP_OKAY;
  8532. /* Validate parameters. */
  8533. if ((ecp == NULL) || (a == NULL) || (b == NULL) || (prime == NULL)) {
  8534. err = BAD_FUNC_ARG;
  8535. }
  8536. if (err == MP_OKAY) {
  8537. /* x must be in the range [0, p-1] */
  8538. if ((mp_cmp(ecp->x, prime) != MP_LT) || mp_isneg(ecp->x)) {
  8539. err = ECC_OUT_OF_RANGE_E;
  8540. }
  8541. }
  8542. if (err == MP_OKAY) {
  8543. /* y must be in the range [0, p-1] */
  8544. if ((mp_cmp(ecp->y, prime) != MP_LT) || mp_isneg(ecp->y)) {
  8545. err = ECC_OUT_OF_RANGE_E;
  8546. }
  8547. }
  8548. if (err == MP_OKAY) {
  8549. /* z must be one, that is point must be in affine form. */
  8550. if (!mp_isone(ecp->z)) {
  8551. err = ECC_BAD_ARG_E;
  8552. }
  8553. }
  8554. if (err == MP_OKAY) {
  8555. /* Check x and y are valid for curve equation. */
  8556. err = _ecc_is_point(ecp, a, b, prime);
  8557. }
  8558. return err;
  8559. }
  8560. #if (FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || \
  8561. (defined(WOLFSSL_VALIDATE_ECC_IMPORT) && !defined(WOLFSSL_SP_MATH))) && \
  8562. !defined(WOLFSSL_KCAPI_ECC) || defined(WOLFSSL_CAAM)
  8563. /* validate privkey * generator == pubkey, 0 on success */
  8564. static int ecc_check_privkey_gen(ecc_key* key, mp_int* a, mp_int* prime)
  8565. {
  8566. int err;
  8567. ecc_point* base = NULL;
  8568. ecc_point* res = NULL;
  8569. #ifdef WOLFSSL_NO_MALLOC
  8570. ecc_point lcl_base;
  8571. ecc_point lcl_res;
  8572. #endif
  8573. DECLARE_CURVE_SPECS(3);
  8574. if (key == NULL)
  8575. return BAD_FUNC_ARG;
  8576. ALLOC_CURVE_SPECS(3, err);
  8577. #ifdef WOLFSSL_NO_MALLOC
  8578. res = &lcl_res;
  8579. #endif
  8580. err = wc_ecc_new_point_ex(&res, key->heap);
  8581. #ifdef WOLFSSL_HAVE_SP_ECC
  8582. #ifndef WOLFSSL_SP_NO_256
  8583. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  8584. if (err == MP_OKAY) {
  8585. err = sp_ecc_mulmod_base_256(key->k, res, 1, key->heap);
  8586. }
  8587. }
  8588. else
  8589. #endif
  8590. #ifdef WOLFSSL_SP_384
  8591. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  8592. if (err == MP_OKAY) {
  8593. err = sp_ecc_mulmod_base_384(key->k, res, 1, key->heap);
  8594. }
  8595. }
  8596. else
  8597. #endif
  8598. #ifdef WOLFSSL_SP_521
  8599. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) {
  8600. if (err == MP_OKAY) {
  8601. err = sp_ecc_mulmod_base_521(key->k, res, 1, key->heap);
  8602. }
  8603. }
  8604. else
  8605. #endif
  8606. #endif
  8607. {
  8608. if (err == MP_OKAY) {
  8609. #ifdef WOLFSSL_NO_MALLOC
  8610. base = &lcl_base;
  8611. #endif
  8612. err = wc_ecc_new_point_ex(&base, key->heap);
  8613. }
  8614. if (err == MP_OKAY) {
  8615. /* load curve info */
  8616. err = wc_ecc_curve_load(key->dp, &curve, (ECC_CURVE_FIELD_GX |
  8617. ECC_CURVE_FIELD_GY | ECC_CURVE_FIELD_ORDER));
  8618. }
  8619. /* set up base generator */
  8620. if (err == MP_OKAY)
  8621. err = mp_copy(curve->Gx, base->x);
  8622. if (err == MP_OKAY)
  8623. err = mp_copy(curve->Gy, base->y);
  8624. if (err == MP_OKAY)
  8625. err = mp_set(base->z, 1);
  8626. #ifdef WOLFSSL_KCAPI_ECC
  8627. if (err == MP_OKAY) {
  8628. word32 pubkey_sz = (word32)key->dp->size*2;
  8629. if (key->handle == NULL) {
  8630. /* if handle loaded, then pubkey_raw already populated */
  8631. err = KcapiEcc_LoadKey(key, key->pubkey_raw, &pubkey_sz, 1);
  8632. }
  8633. if (err == 0) {
  8634. err = mp_read_unsigned_bin(res->x, key->pubkey_raw,
  8635. pubkey_sz/2);
  8636. }
  8637. if (err == MP_OKAY) {
  8638. err = mp_read_unsigned_bin(res->y,
  8639. key->pubkey_raw + pubkey_sz/2,
  8640. pubkey_sz/2);
  8641. }
  8642. if (err == MP_OKAY) {
  8643. err = mp_set(res->z, 1);
  8644. }
  8645. }
  8646. (void)a;
  8647. (void)prime;
  8648. #else
  8649. #ifdef ECC_TIMING_RESISTANT
  8650. if (err == MP_OKAY)
  8651. err = wc_ecc_mulmod_ex2(key->k, base, res, a, prime, curve->order,
  8652. key->rng, 1, key->heap);
  8653. #else
  8654. if (err == MP_OKAY)
  8655. err = wc_ecc_mulmod_ex2(key->k, base, res, a, prime, curve->order,
  8656. NULL, 1, key->heap);
  8657. #endif
  8658. #endif /* WOLFSSL_KCAPI_ECC */
  8659. }
  8660. if (err == MP_OKAY) {
  8661. /* compare result to public key */
  8662. if (mp_cmp(res->x, key->pubkey.x) != MP_EQ ||
  8663. mp_cmp(res->y, key->pubkey.y) != MP_EQ ||
  8664. mp_cmp(res->z, key->pubkey.z) != MP_EQ) {
  8665. /* didn't match */
  8666. err = ECC_PRIV_KEY_E;
  8667. }
  8668. }
  8669. wc_ecc_curve_free(curve);
  8670. wc_ecc_del_point_ex(res, key->heap);
  8671. wc_ecc_del_point_ex(base, key->heap);
  8672. FREE_CURVE_SPECS();
  8673. return err;
  8674. }
  8675. #endif /* FIPS_VERSION_GE(5,0) || WOLFSSL_VALIDATE_ECC_KEYGEN ||
  8676. * (!WOLFSSL_SP_MATH && WOLFSSL_VALIDATE_ECC_IMPORT) */
  8677. #if (FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_ECC_KEYGEN)) && \
  8678. !defined(WOLFSSL_KCAPI_ECC)
  8679. /* check privkey generator helper, creates prime needed */
  8680. static int ecc_check_privkey_gen_helper(ecc_key* key)
  8681. {
  8682. int err;
  8683. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A)
  8684. DECLARE_CURVE_SPECS(2);
  8685. #endif
  8686. if (key == NULL)
  8687. return BAD_FUNC_ARG;
  8688. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  8689. /* Hardware based private key, so this operation is not supported */
  8690. err = MP_OKAY; /* just report success */
  8691. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  8692. /* Hardware based private key, so this operation is not supported */
  8693. err = MP_OKAY; /* just report success */
  8694. #elif defined(WOLFSSL_KCAPI_ECC)
  8695. /* Hardware based private key, so this operation is not supported */
  8696. err = MP_OKAY; /* just report success */
  8697. #else
  8698. err = MP_OKAY;
  8699. ALLOC_CURVE_SPECS(2, err);
  8700. /* load curve info */
  8701. if (err == MP_OKAY)
  8702. err = wc_ecc_curve_load(key->dp, &curve,
  8703. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF));
  8704. if (err == MP_OKAY)
  8705. err = ecc_check_privkey_gen(key, curve->Af, curve->prime);
  8706. wc_ecc_curve_free(curve);
  8707. FREE_CURVE_SPECS();
  8708. #endif /* WOLFSSL_ATECC508A */
  8709. return err;
  8710. }
  8711. /* Performs a Pairwise Consistency Test on an ECC key pair. */
  8712. static int _ecc_pairwise_consistency_test(ecc_key* key, WC_RNG* rng)
  8713. {
  8714. int err = 0;
  8715. word32 flags = key->flags;
  8716. /* If flags not set default to cofactor and dec/sign */
  8717. if ((flags & (WC_ECC_FLAG_COFACTOR | WC_ECC_FLAG_DEC_SIGN)) == 0) {
  8718. flags = (WC_ECC_FLAG_COFACTOR | WC_ECC_FLAG_DEC_SIGN);
  8719. }
  8720. if (flags & WC_ECC_FLAG_COFACTOR) {
  8721. err = ecc_check_privkey_gen_helper(key);
  8722. }
  8723. if (!err && (flags & WC_ECC_FLAG_DEC_SIGN)) {
  8724. byte* sig;
  8725. byte* digest;
  8726. word32 sigLen, digestLen;
  8727. int dynRng = 0, res = 0;
  8728. sigLen = (word32)wc_ecc_sig_size(key);
  8729. digestLen = WC_SHA256_DIGEST_SIZE;
  8730. sig = (byte*)XMALLOC(sigLen + digestLen, NULL, DYNAMIC_TYPE_ECC);
  8731. if (sig == NULL)
  8732. return MEMORY_E;
  8733. digest = sig + sigLen;
  8734. if (rng == NULL) {
  8735. dynRng = 1;
  8736. rng = wc_rng_new(NULL, 0, NULL);
  8737. if (rng == NULL) {
  8738. XFREE(sig, NULL, DYNAMIC_TYPE_ECC);
  8739. return MEMORY_E;
  8740. }
  8741. }
  8742. err = wc_RNG_GenerateBlock(rng, digest, digestLen);
  8743. if (!err)
  8744. err = wc_ecc_sign_hash(digest, WC_SHA256_DIGEST_SIZE, sig, &sigLen,
  8745. rng, key);
  8746. if (!err)
  8747. err = wc_ecc_verify_hash(sig, sigLen,
  8748. digest, WC_SHA256_DIGEST_SIZE, &res, key);
  8749. if (res == 0)
  8750. err = ECC_PCT_E;
  8751. if (dynRng) {
  8752. wc_rng_free(rng);
  8753. }
  8754. ForceZero(sig, sigLen + digestLen);
  8755. XFREE(sig, NULL, DYNAMIC_TYPE_ECC);
  8756. }
  8757. (void)rng;
  8758. if (err != 0)
  8759. err = ECC_PCT_E;
  8760. return err;
  8761. }
  8762. #endif /* (FIPS v5 or later || WOLFSSL_VALIDATE_ECC_KEYGEN) &&!WOLFSSL_KCAPI_ECC */
  8763. #ifndef WOLFSSL_SP_MATH
  8764. /* validate order * pubkey = point at infinity, 0 on success */
  8765. static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
  8766. mp_int* prime, mp_int* order)
  8767. {
  8768. ecc_point* inf = NULL;
  8769. #ifdef WOLFSSL_NO_MALLOC
  8770. ecc_point lcl_inf;
  8771. #endif
  8772. int err;
  8773. if (key == NULL)
  8774. return BAD_FUNC_ARG;
  8775. if (mp_count_bits(pubkey->x) > mp_count_bits(prime) ||
  8776. mp_count_bits(pubkey->y) > mp_count_bits(prime) ||
  8777. mp_count_bits(pubkey->z) > mp_count_bits(prime)) {
  8778. return IS_POINT_E;
  8779. }
  8780. #ifdef WOLFSSL_NO_MALLOC
  8781. inf = &lcl_inf;
  8782. #endif
  8783. err = wc_ecc_new_point_ex(&inf, key->heap);
  8784. if (err == MP_OKAY) {
  8785. #ifdef WOLFSSL_HAVE_SP_ECC
  8786. #ifndef WOLFSSL_SP_NO_256
  8787. if (key->idx != ECC_CUSTOM_IDX &&
  8788. ecc_sets[key->idx].id == ECC_SECP256R1) {
  8789. err = sp_ecc_mulmod_256(order, pubkey, inf, 1, key->heap);
  8790. }
  8791. else
  8792. #endif
  8793. #ifdef WOLFSSL_SP_384
  8794. if (key->idx != ECC_CUSTOM_IDX &&
  8795. ecc_sets[key->idx].id == ECC_SECP384R1) {
  8796. err = sp_ecc_mulmod_384(order, pubkey, inf, 1, key->heap);
  8797. }
  8798. else
  8799. #endif
  8800. #ifdef WOLFSSL_SP_521
  8801. if (key->idx != ECC_CUSTOM_IDX &&
  8802. ecc_sets[key->idx].id == ECC_SECP521R1) {
  8803. err = sp_ecc_mulmod_521(order, pubkey, inf, 1, key->heap);
  8804. }
  8805. else
  8806. #endif
  8807. #endif
  8808. #if !defined(WOLFSSL_SP_MATH)
  8809. err = wc_ecc_mulmod_ex(order, pubkey, inf, a, prime, 1, key->heap);
  8810. if (err == MP_OKAY && !wc_ecc_point_is_at_infinity(inf))
  8811. err = ECC_INF_E;
  8812. #else
  8813. {
  8814. (void)a;
  8815. (void)prime;
  8816. err = WC_KEY_SIZE_E;
  8817. }
  8818. #endif
  8819. }
  8820. wc_ecc_del_point_ex(inf, key->heap);
  8821. return err;
  8822. }
  8823. #endif /* !WOLFSSL_SP_MATH */
  8824. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL*/
  8825. #ifdef OPENSSL_EXTRA
  8826. int wc_ecc_get_generator(ecc_point* ecp, int curve_idx)
  8827. {
  8828. int err = MP_OKAY;
  8829. DECLARE_CURVE_SPECS(2);
  8830. if (!ecp || curve_idx < 0 || curve_idx > (int)(ECC_SET_COUNT-1))
  8831. return BAD_FUNC_ARG;
  8832. ALLOC_CURVE_SPECS(2, err);
  8833. if (err == MP_OKAY)
  8834. err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve,
  8835. (ECC_CURVE_FIELD_GX | ECC_CURVE_FIELD_GY));
  8836. if (err == MP_OKAY)
  8837. err = mp_copy(curve->Gx, ecp->x);
  8838. if (err == MP_OKAY)
  8839. err = mp_copy(curve->Gy, ecp->y);
  8840. if (err == MP_OKAY)
  8841. err = mp_set(ecp->z, 1);
  8842. wc_ecc_curve_free(curve);
  8843. FREE_CURVE_SPECS();
  8844. return err;
  8845. }
  8846. #endif /* OPENSSLALL */
  8847. /* Validate the public key per SP 800-56Ar3 section 5.6.2.3.3,
  8848. * ECC Full Public Key Validation Routine. If the parameter
  8849. * partial is set, then it follows section 5.6.2.3.4, the ECC
  8850. * Partial Public Key Validation Routine.
  8851. * If the parameter priv is set, add in a few extra
  8852. * checks on the bounds of the private key. */
  8853. static int _ecc_validate_public_key(ecc_key* key, int partial, int priv)
  8854. {
  8855. int err = MP_OKAY;
  8856. #ifndef WOLFSSL_SP_MATH
  8857. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  8858. !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \
  8859. !defined(WOLFSSL_SE050) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) && \
  8860. !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(WOLFSSL_STM32_PKA)
  8861. mp_int* b = NULL;
  8862. #ifdef USE_ECC_B_PARAM
  8863. DECLARE_CURVE_SPECS(4);
  8864. #else
  8865. #ifndef WOLFSSL_SMALL_STACK
  8866. mp_int b_lcl;
  8867. #endif
  8868. DECLARE_CURVE_SPECS(3);
  8869. #endif /* USE_ECC_B_PARAM */
  8870. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A &&
  8871. !WOLFSSL_CRYPTOCELL && !WOLFSSL_SILABS_SE_ACCEL && !WOLFSSL_SE050 */
  8872. #endif /* !WOLFSSL_SP_MATH */
  8873. ASSERT_SAVED_VECTOR_REGISTERS();
  8874. if (key == NULL)
  8875. return BAD_FUNC_ARG;
  8876. #ifdef WOLFSSL_HAVE_SP_ECC
  8877. #ifndef WOLFSSL_SP_NO_256
  8878. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
  8879. return sp_ecc_check_key_256(key->pubkey.x, key->pubkey.y,
  8880. key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap);
  8881. }
  8882. #endif
  8883. #ifdef WOLFSSL_SP_384
  8884. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) {
  8885. return sp_ecc_check_key_384(key->pubkey.x, key->pubkey.y,
  8886. key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap);
  8887. }
  8888. #endif
  8889. #ifdef WOLFSSL_SP_521
  8890. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) {
  8891. return sp_ecc_check_key_521(key->pubkey.x, key->pubkey.y,
  8892. key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap);
  8893. }
  8894. #endif
  8895. #if defined(WOLFSSL_SP_1024) && defined(WOLFCRYPT_HAVE_SAKKE)
  8896. if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SAKKE_1) {
  8897. return sp_ecc_check_key_1024(key->pubkey.x, key->pubkey.y,
  8898. key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap);
  8899. }
  8900. #endif
  8901. #endif
  8902. #ifndef WOLFSSL_SP_MATH
  8903. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  8904. defined(WOLFSSL_CRYPTOCELL) || defined(WOLFSSL_SILABS_SE_ACCEL) || \
  8905. defined(WOLFSSL_SE050) || defined(WOLF_CRYPTO_CB_ONLY_ECC) || \
  8906. defined(WOLFSSL_XILINX_CRYPT_VERSAL) || defined(WOLFSSL_STM32_PKA)
  8907. /* consider key check success on HW crypto
  8908. * ex: ATECC508/608A, CryptoCell and Silabs
  8909. *
  8910. * consider key check success on Crypt Cb
  8911. */
  8912. err = MP_OKAY;
  8913. #else
  8914. #ifdef USE_ECC_B_PARAM
  8915. ALLOC_CURVE_SPECS(4, err);
  8916. #else
  8917. ALLOC_CURVE_SPECS(3, err);
  8918. #ifndef WOLFSSL_SMALL_STACK
  8919. b = &b_lcl;
  8920. #else
  8921. b = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  8922. if (b == NULL) {
  8923. FREE_CURVE_SPECS();
  8924. return MEMORY_E;
  8925. }
  8926. #endif
  8927. XMEMSET(b, 0, sizeof(mp_int));
  8928. #endif
  8929. #ifdef WOLFSSL_CAAM
  8930. /* keys can be black encrypted ones which can not be checked like plain text
  8931. * keys */
  8932. if (key->blackKey > 0) {
  8933. /* encrypted key was used */
  8934. #ifdef WOLFSSL_SMALL_STACK
  8935. XFREE(b, key->heap, DYNAMIC_TYPE_ECC);
  8936. #endif
  8937. FREE_CURVE_SPECS();
  8938. return 0;
  8939. }
  8940. #endif
  8941. /* SP 800-56Ar3, section 5.6.2.3.3, process step 1 */
  8942. /* SP 800-56Ar3, section 5.6.2.3.4, process step 1 */
  8943. /* pubkey point cannot be at infinity */
  8944. if (wc_ecc_point_is_at_infinity(&key->pubkey)) {
  8945. #ifdef WOLFSSL_SMALL_STACK
  8946. XFREE(b, key->heap, DYNAMIC_TYPE_ECC);
  8947. #endif
  8948. FREE_CURVE_SPECS();
  8949. return ECC_INF_E;
  8950. }
  8951. /* load curve info */
  8952. if (err == MP_OKAY)
  8953. err = wc_ecc_curve_load(key->dp, &curve, (ECC_CURVE_FIELD_PRIME |
  8954. ECC_CURVE_FIELD_AF | ECC_CURVE_FIELD_ORDER
  8955. #ifdef USE_ECC_B_PARAM
  8956. | ECC_CURVE_FIELD_BF
  8957. #endif
  8958. ));
  8959. #ifndef USE_ECC_B_PARAM
  8960. /* load curve b parameter */
  8961. if (err == MP_OKAY)
  8962. err = mp_init(b);
  8963. if (err == MP_OKAY)
  8964. err = mp_read_radix(b, key->dp->Bf, MP_RADIX_HEX);
  8965. #else
  8966. if (err == MP_OKAY)
  8967. b = curve->Bf;
  8968. #endif
  8969. /* SP 800-56Ar3, section 5.6.2.3.3, process step 2 */
  8970. /* SP 800-56Ar3, section 5.6.2.3.4, process step 2 */
  8971. /* Qx must be in the range [0, p-1] */
  8972. if (err == MP_OKAY) {
  8973. if ((mp_cmp(key->pubkey.x, curve->prime) != MP_LT) ||
  8974. mp_isneg(key->pubkey.x)) {
  8975. err = ECC_OUT_OF_RANGE_E;
  8976. }
  8977. }
  8978. /* Qy must be in the range [0, p-1] */
  8979. if (err == MP_OKAY) {
  8980. if ((mp_cmp(key->pubkey.y, curve->prime) != MP_LT) ||
  8981. mp_isneg(key->pubkey.y)) {
  8982. err = ECC_OUT_OF_RANGE_E;
  8983. }
  8984. }
  8985. /* SP 800-56Ar3, section 5.6.2.3.3, process step 3 */
  8986. /* SP 800-56Ar3, section 5.6.2.3.4, process step 3 */
  8987. /* make sure point is actually on curve */
  8988. if (err == MP_OKAY)
  8989. err = _ecc_is_point(&key->pubkey, curve->Af, b, curve->prime);
  8990. if (!partial) {
  8991. /* SP 800-56Ar3, section 5.6.2.3.3, process step 4 */
  8992. /* pubkey * order must be at infinity */
  8993. if (err == MP_OKAY)
  8994. err = ecc_check_pubkey_order(key, &key->pubkey, curve->Af,
  8995. curve->prime, curve->order);
  8996. }
  8997. if (priv) {
  8998. /* SP 800-56Ar3, section 5.6.2.1.2 */
  8999. /* private keys must be in the range [1, n-1] */
  9000. if ((err == MP_OKAY) && (key->type == ECC_PRIVATEKEY) &&
  9001. (mp_iszero(key->k) || mp_isneg(key->k) ||
  9002. (mp_cmp(key->k, curve->order) != MP_LT))
  9003. #ifdef WOLFSSL_KCAPI_ECC
  9004. && key->handle == NULL
  9005. #endif
  9006. ) {
  9007. err = ECC_PRIV_KEY_E;
  9008. }
  9009. #if defined(WOLFSSL_VALIDATE_ECC_IMPORT) || defined(WOLFSSL_CAAM)
  9010. /* SP 800-56Ar3, section 5.6.2.1.4, method (b) for ECC */
  9011. /* private * base generator must equal pubkey */
  9012. if (err == MP_OKAY && key->type == ECC_PRIVATEKEY)
  9013. err = ecc_check_privkey_gen(key, curve->Af, curve->prime);
  9014. #endif
  9015. }
  9016. wc_ecc_curve_free(curve);
  9017. #ifndef USE_ECC_B_PARAM
  9018. mp_clear(b);
  9019. #ifdef WOLFSSL_SMALL_STACK
  9020. XFREE(b, key->heap, DYNAMIC_TYPE_ECC);
  9021. #endif
  9022. #endif
  9023. FREE_CURVE_SPECS();
  9024. #endif /* HW Based Crypto */
  9025. #else
  9026. err = WC_KEY_SIZE_E;
  9027. #endif /* !WOLFSSL_SP_MATH */
  9028. (void)partial;
  9029. (void)priv;
  9030. return err;
  9031. }
  9032. /* perform sanity checks on ecc key validity, 0 on success */
  9033. WOLFSSL_ABI
  9034. int wc_ecc_check_key(ecc_key* key)
  9035. {
  9036. int ret;
  9037. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  9038. ret = _ecc_validate_public_key(key, 0, 1);
  9039. RESTORE_VECTOR_REGISTERS();
  9040. return ret;
  9041. }
  9042. #ifdef HAVE_ECC_KEY_IMPORT
  9043. /* import public ECC key in ANSI X9.63 format */
  9044. int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key,
  9045. int curve_id)
  9046. {
  9047. int err = MP_OKAY;
  9048. #ifdef HAVE_COMP_KEY
  9049. int compressed = 0;
  9050. #endif
  9051. int keysize = 0;
  9052. byte pointType;
  9053. #ifdef WOLFSSL_CRYPTOCELL
  9054. const CRYS_ECPKI_Domain_t* pDomain;
  9055. CRYS_ECPKI_BUILD_TempData_t tempBuff;
  9056. #endif
  9057. if (in == NULL || key == NULL)
  9058. return BAD_FUNC_ARG;
  9059. /* must be odd */
  9060. if ((inLen & 1) == 0) {
  9061. return ECC_BAD_ARG_E;
  9062. }
  9063. /* make sure required variables are reset */
  9064. wc_ecc_reset(key);
  9065. /* init key */
  9066. #ifdef ALT_ECC_SIZE
  9067. key->pubkey.x = (mp_int*)&key->pubkey.xyz[0];
  9068. key->pubkey.y = (mp_int*)&key->pubkey.xyz[1];
  9069. key->pubkey.z = (mp_int*)&key->pubkey.xyz[2];
  9070. alt_fp_init(key->pubkey.x);
  9071. alt_fp_init(key->pubkey.y);
  9072. alt_fp_init(key->pubkey.z);
  9073. key->k = (mp_int*)key->ka;
  9074. alt_fp_init(key->k);
  9075. #else
  9076. err = mp_init_multi(key->k,
  9077. key->pubkey.x, key->pubkey.y, key->pubkey.z, NULL, NULL);
  9078. #endif
  9079. if (err != MP_OKAY)
  9080. return MEMORY_E;
  9081. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  9082. /* check for point type (4, 2, or 3) */
  9083. pointType = in[0];
  9084. if (pointType != ECC_POINT_UNCOMP && pointType != ECC_POINT_COMP_EVEN &&
  9085. pointType != ECC_POINT_COMP_ODD) {
  9086. err = ASN_PARSE_E;
  9087. }
  9088. if (pointType == ECC_POINT_COMP_EVEN || pointType == ECC_POINT_COMP_ODD) {
  9089. #ifdef HAVE_COMP_KEY
  9090. compressed = 1;
  9091. #else
  9092. err = NOT_COMPILED_IN;
  9093. #endif
  9094. }
  9095. /* adjust to skip first byte */
  9096. inLen -= 1;
  9097. in += 1;
  9098. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  9099. /* For SECP256R1 only save raw public key for hardware */
  9100. if (curve_id == ECC_SECP256R1 && inLen <= (word32)sizeof(key->pubkey_raw)) {
  9101. #ifdef HAVE_COMP_KEY
  9102. if (!compressed)
  9103. #endif
  9104. XMEMCPY(key->pubkey_raw, (byte*)in, inLen);
  9105. }
  9106. #elif defined(WOLFSSL_KCAPI_ECC)
  9107. XMEMCPY(key->pubkey_raw, (byte*)in, inLen);
  9108. #endif
  9109. if (err == MP_OKAY) {
  9110. #ifdef HAVE_COMP_KEY
  9111. /* adjust inLen if compressed */
  9112. if (compressed)
  9113. inLen = inLen*2 + 1; /* used uncompressed len */
  9114. #endif
  9115. /* determine key size */
  9116. keysize = (int)(inLen>>1);
  9117. err = wc_ecc_set_curve(key, keysize, curve_id);
  9118. key->type = ECC_PUBLICKEY;
  9119. }
  9120. /* read data */
  9121. if (err == MP_OKAY)
  9122. err = mp_read_unsigned_bin(key->pubkey.x, in, (word32)keysize);
  9123. #ifdef HAVE_COMP_KEY
  9124. if (err == MP_OKAY && compressed == 1) { /* build y */
  9125. #if !defined(WOLFSSL_SP_MATH)
  9126. #ifdef WOLFSSL_SMALL_STACK
  9127. mp_int* t1 = NULL;
  9128. mp_int* t2 = NULL;
  9129. #else
  9130. mp_int t1[1], t2[1];
  9131. #endif
  9132. int did_init = 0;
  9133. DECLARE_CURVE_SPECS(3);
  9134. ALLOC_CURVE_SPECS(3, err);
  9135. #ifdef WOLFSSL_SMALL_STACK
  9136. if (err == MP_OKAY) {
  9137. t1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  9138. if (t1 == NULL) {
  9139. err = MEMORY_E;
  9140. }
  9141. }
  9142. if (err == MP_OKAY) {
  9143. t2 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  9144. if (t2 == NULL) {
  9145. err = MEMORY_E;
  9146. }
  9147. }
  9148. #endif
  9149. if (err == MP_OKAY) {
  9150. if (mp_init_multi(t1, t2, NULL, NULL, NULL, NULL) != MP_OKAY)
  9151. err = MEMORY_E;
  9152. else
  9153. did_init = 1;
  9154. }
  9155. /* load curve info */
  9156. if (err == MP_OKAY)
  9157. err = wc_ecc_curve_load(key->dp, &curve,
  9158. (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
  9159. ECC_CURVE_FIELD_BF));
  9160. #if defined(WOLFSSL_CUSTOM_CURVES) && \
  9161. defined(WOLFSSL_VALIDATE_ECC_IMPORT)
  9162. /* validate prime is prime for custom curves */
  9163. if (err == MP_OKAY && key->idx == ECC_CUSTOM_IDX) {
  9164. int isPrime = MP_NO;
  9165. err = mp_prime_is_prime(curve->prime, 8, &isPrime);
  9166. if (err == MP_OKAY && isPrime == MP_NO)
  9167. err = MP_VAL;
  9168. }
  9169. #endif
  9170. /* compute x^3 */
  9171. if (err == MP_OKAY)
  9172. err = mp_sqrmod(key->pubkey.x, curve->prime, t1);
  9173. if (err == MP_OKAY)
  9174. err = mp_mulmod(t1, key->pubkey.x, curve->prime, t1);
  9175. /* compute x^3 + a*x */
  9176. if (err == MP_OKAY)
  9177. err = mp_mulmod(curve->Af, key->pubkey.x, curve->prime, t2);
  9178. if (err == MP_OKAY)
  9179. err = mp_add(t1, t2, t1);
  9180. /* compute x^3 + a*x + b */
  9181. if (err == MP_OKAY)
  9182. err = mp_add(t1, curve->Bf, t1);
  9183. /* compute sqrt(x^3 + a*x + b) */
  9184. if (err == MP_OKAY)
  9185. err = mp_sqrtmod_prime(t1, curve->prime, t2);
  9186. /* adjust y */
  9187. if (err == MP_OKAY) {
  9188. if ((mp_isodd(t2) == MP_YES && pointType == ECC_POINT_COMP_ODD) ||
  9189. (mp_isodd(t2) == MP_NO && pointType == ECC_POINT_COMP_EVEN)) {
  9190. err = mp_mod(t2, curve->prime, t2);
  9191. }
  9192. else {
  9193. err = mp_submod(curve->prime, t2, curve->prime, t2);
  9194. }
  9195. if (err == MP_OKAY)
  9196. err = mp_copy(t2, key->pubkey.y);
  9197. }
  9198. if (did_init) {
  9199. mp_clear(t2);
  9200. mp_clear(t1);
  9201. }
  9202. #ifdef WOLFSSL_SMALL_STACK
  9203. if (t1 != NULL) {
  9204. XFREE(t1, NULL, DYNAMIC_TYPE_BIGINT);
  9205. }
  9206. if (t2 != NULL) {
  9207. XFREE(t2, NULL, DYNAMIC_TYPE_BIGINT);
  9208. }
  9209. #endif
  9210. wc_ecc_curve_free(curve);
  9211. FREE_CURVE_SPECS();
  9212. #else
  9213. #ifndef WOLFSSL_SP_NO_256
  9214. if (key->dp->id == ECC_SECP256R1) {
  9215. err = sp_ecc_uncompress_256(key->pubkey.x, pointType,
  9216. key->pubkey.y);
  9217. }
  9218. else
  9219. #endif
  9220. #ifdef WOLFSSL_SP_384
  9221. if (key->dp->id == ECC_SECP384R1) {
  9222. err = sp_ecc_uncompress_384(key->pubkey.x, pointType,
  9223. key->pubkey.y);
  9224. }
  9225. else
  9226. #endif
  9227. #ifdef WOLFSSL_SP_521
  9228. if (key->dp->id == ECC_SECP521R1) {
  9229. err = sp_ecc_uncompress_521(key->pubkey.x, pointType,
  9230. key->pubkey.y);
  9231. }
  9232. else
  9233. #endif
  9234. {
  9235. err = WC_KEY_SIZE_E;
  9236. }
  9237. #endif
  9238. }
  9239. #endif /* HAVE_COMP_KEY */
  9240. if (err == MP_OKAY) {
  9241. #ifdef HAVE_COMP_KEY
  9242. if (compressed == 0)
  9243. #endif
  9244. {
  9245. err = mp_read_unsigned_bin(key->pubkey.y, in + keysize,
  9246. (word32)keysize);
  9247. }
  9248. }
  9249. if (err == MP_OKAY)
  9250. err = mp_set(key->pubkey.z, 1);
  9251. #ifdef WOLFSSL_CRYPTOCELL
  9252. if (err == MP_OKAY) {
  9253. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id));
  9254. /* create public key from external key buffer */
  9255. err = CRYS_ECPKI_BuildPublKeyFullCheck(pDomain,
  9256. (byte*)in-1, /* re-adjust */
  9257. inLen+1, /* original input */
  9258. &key->ctx.pubKey,
  9259. &tempBuff);
  9260. if (err != SA_SILIB_RET_OK){
  9261. WOLFSSL_MSG("CRYS_ECPKI_BuildPublKeyFullCheck failed");
  9262. }
  9263. }
  9264. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  9265. if (err == MP_OKAY)
  9266. err = silabs_ecc_import(key, keysize);
  9267. #elif defined(WOLFSSL_SE050)
  9268. if (err == MP_OKAY) {
  9269. /* reset key ID, in case used before */
  9270. key->keyId = 0;
  9271. key->keyIdSet = 0;
  9272. }
  9273. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  9274. #ifndef HAVE_COMP_KEY
  9275. if (err == MP_OKAY) {
  9276. #else
  9277. if (err == MP_OKAY && !compressed) {
  9278. #endif
  9279. buf_reverse(&key->keyRaw[0], &in[0], keysize);
  9280. buf_reverse(&key->keyRaw[keysize], &in[keysize], keysize);
  9281. }
  9282. #endif
  9283. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9284. if (err == MP_OKAY)
  9285. err = wc_ecc_check_key(key);
  9286. #endif
  9287. #ifdef WOLFSSL_MAXQ10XX_CRYPTO
  9288. if (err == MP_OKAY) {
  9289. err = wc_MAXQ10XX_EccSetKey(key, keysize);
  9290. }
  9291. #endif
  9292. if (err != MP_OKAY) {
  9293. mp_clear(key->pubkey.x);
  9294. mp_clear(key->pubkey.y);
  9295. mp_clear(key->pubkey.z);
  9296. mp_clear(key->k);
  9297. }
  9298. RESTORE_VECTOR_REGISTERS();
  9299. return err;
  9300. }
  9301. WOLFSSL_ABI
  9302. int wc_ecc_import_x963(const byte* in, word32 inLen, ecc_key* key)
  9303. {
  9304. return wc_ecc_import_x963_ex(in, inLen, key, ECC_CURVE_DEF);
  9305. }
  9306. #endif /* HAVE_ECC_KEY_IMPORT */
  9307. #ifdef HAVE_ECC_KEY_EXPORT
  9308. /* export ecc key to component form, d is optional if only exporting public
  9309. * encType is WC_TYPE_UNSIGNED_BIN or WC_TYPE_HEX_STR
  9310. * return MP_OKAY on success */
  9311. int wc_ecc_export_ex(ecc_key* key, byte* qx, word32* qxLen,
  9312. byte* qy, word32* qyLen, byte* d, word32* dLen, int encType)
  9313. {
  9314. int err = 0;
  9315. word32 keySz;
  9316. if (key == NULL) {
  9317. return BAD_FUNC_ARG;
  9318. }
  9319. if (wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL) {
  9320. return ECC_BAD_ARG_E;
  9321. }
  9322. keySz = (word32)key->dp->size;
  9323. /* private key, d */
  9324. if (d != NULL) {
  9325. if (dLen == NULL ||
  9326. (key->type != ECC_PRIVATEKEY && key->type != ECC_PRIVATEKEY_ONLY))
  9327. return BAD_FUNC_ARG;
  9328. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  9329. /* Hardware cannot export private portion */
  9330. return NOT_COMPILED_IN;
  9331. #else
  9332. #if defined(WOLFSSL_SECO_CAAM)
  9333. if (key->blackKey > 0 && key->devId == WOLFSSL_SECO_DEVID) {
  9334. /* Hardware cannot export private portion */
  9335. WOLFSSL_MSG("Can not export private key from HSM");
  9336. return NOT_COMPILED_IN;
  9337. }
  9338. #endif
  9339. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  9340. if (key->blackKey == CAAM_BLACK_KEY_CCM) {
  9341. if (*dLen < keySz + WC_CAAM_MAC_SZ) {
  9342. *dLen = keySz + WC_CAAM_MAC_SZ;
  9343. return BUFFER_E;
  9344. }
  9345. err = wc_export_int(key->k, d, dLen, keySz + WC_CAAM_MAC_SZ,
  9346. encType);
  9347. *dLen = keySz + WC_CAAM_MAC_SZ;
  9348. }
  9349. else if (encType == WC_TYPE_BLACK_KEY &&
  9350. key->blackKey != CAAM_BLACK_KEY_ECB &&
  9351. key->blackKey > 0) {
  9352. if (*dLen < keySz + WC_CAAM_MAC_SZ) {
  9353. *dLen = keySz + WC_CAAM_MAC_SZ;
  9354. return BUFFER_E;
  9355. }
  9356. if (key->blackKey != CAAM_BLACK_KEY_CCM) {
  9357. if (caamReadPartition(key->blackKey, d, keySz + WC_CAAM_MAC_SZ) != 0)
  9358. return WC_HW_E;
  9359. }
  9360. *dLen = keySz + WC_CAAM_MAC_SZ;
  9361. }
  9362. else
  9363. #endif
  9364. {
  9365. err = wc_export_int(key->k, d, dLen, keySz, encType);
  9366. if (err != MP_OKAY)
  9367. return err;
  9368. }
  9369. #endif
  9370. }
  9371. /* public x component */
  9372. if (qx != NULL) {
  9373. if (qxLen == NULL || key->type == ECC_PRIVATEKEY_ONLY)
  9374. return BAD_FUNC_ARG;
  9375. err = wc_export_int(key->pubkey.x, qx, qxLen, keySz, encType);
  9376. if (err != MP_OKAY)
  9377. return err;
  9378. }
  9379. /* public y component */
  9380. if (qy != NULL) {
  9381. if (qyLen == NULL || key->type == ECC_PRIVATEKEY_ONLY)
  9382. return BAD_FUNC_ARG;
  9383. err = wc_export_int(key->pubkey.y, qy, qyLen, keySz, encType);
  9384. if (err != MP_OKAY)
  9385. return err;
  9386. }
  9387. return err;
  9388. }
  9389. /* export ecc private key only raw, outLen is in/out size as unsigned bin
  9390. return MP_OKAY on success */
  9391. WOLFSSL_ABI
  9392. int wc_ecc_export_private_only(ecc_key* key, byte* out, word32* outLen)
  9393. {
  9394. if (out == NULL || outLen == NULL) {
  9395. return BAD_FUNC_ARG;
  9396. }
  9397. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  9398. /* check if black key in secure memory */
  9399. if ((key->blackKey != CAAM_BLACK_KEY_CCM &&
  9400. key->blackKey != CAAM_BLACK_KEY_ECB) && key->blackKey > 0) {
  9401. return wc_ecc_export_ex(key, NULL, NULL, NULL, NULL, out, outLen,
  9402. WC_TYPE_BLACK_KEY);
  9403. }
  9404. #endif
  9405. return wc_ecc_export_ex(key, NULL, NULL, NULL, NULL, out, outLen,
  9406. WC_TYPE_UNSIGNED_BIN);
  9407. }
  9408. /* export public key to raw elements including public (Qx,Qy) as unsigned bin
  9409. * return MP_OKAY on success, negative on error */
  9410. int wc_ecc_export_public_raw(ecc_key* key, byte* qx, word32* qxLen,
  9411. byte* qy, word32* qyLen)
  9412. {
  9413. if (qx == NULL || qxLen == NULL || qy == NULL || qyLen == NULL) {
  9414. return BAD_FUNC_ARG;
  9415. }
  9416. return wc_ecc_export_ex(key, qx, qxLen, qy, qyLen, NULL, NULL,
  9417. WC_TYPE_UNSIGNED_BIN);
  9418. }
  9419. /* export ecc key to raw elements including public (Qx,Qy) and
  9420. * private (d) as unsigned bin
  9421. * return MP_OKAY on success, negative on error */
  9422. int wc_ecc_export_private_raw(ecc_key* key, byte* qx, word32* qxLen,
  9423. byte* qy, word32* qyLen, byte* d, word32* dLen)
  9424. {
  9425. return wc_ecc_export_ex(key, qx, qxLen, qy, qyLen, d, dLen,
  9426. WC_TYPE_UNSIGNED_BIN);
  9427. }
  9428. #endif /* HAVE_ECC_KEY_EXPORT */
  9429. #ifdef HAVE_ECC_KEY_IMPORT
  9430. /* import private key, public part optional if (pub) passed as NULL */
  9431. int wc_ecc_import_private_key_ex(const byte* priv, word32 privSz,
  9432. const byte* pub, word32 pubSz, ecc_key* key,
  9433. int curve_id)
  9434. {
  9435. int ret;
  9436. #ifdef WOLFSSL_CRYPTOCELL
  9437. const CRYS_ECPKI_Domain_t* pDomain;
  9438. #endif
  9439. if (key == NULL || priv == NULL)
  9440. return BAD_FUNC_ARG;
  9441. /* public optional, NULL if only importing private */
  9442. if (pub != NULL) {
  9443. #ifndef NO_ASN
  9444. word32 idx = 0;
  9445. ret = wc_ecc_import_x963_ex(pub, pubSz, key, curve_id);
  9446. if (ret < 0)
  9447. ret = wc_EccPublicKeyDecode(pub, &idx, key, pubSz);
  9448. key->type = ECC_PRIVATEKEY;
  9449. #else
  9450. (void)pubSz;
  9451. ret = NOT_COMPILED_IN;
  9452. #endif
  9453. }
  9454. else {
  9455. /* make sure required variables are reset */
  9456. wc_ecc_reset(key);
  9457. /* set key size */
  9458. ret = wc_ecc_set_curve(key, (int)privSz, curve_id);
  9459. key->type = ECC_PRIVATEKEY_ONLY;
  9460. }
  9461. if (ret != 0)
  9462. return ret;
  9463. #ifdef WOLFSSL_CRYPTOCELL
  9464. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id));
  9465. /* import private key - priv checked for NULL at top */
  9466. if (priv[0] != '\0') {
  9467. /* Create private key from external key buffer*/
  9468. ret = CRYS_ECPKI_BuildPrivKey(pDomain,
  9469. priv,
  9470. privSz,
  9471. &key->ctx.privKey);
  9472. if (ret != SA_SILIB_RET_OK) {
  9473. WOLFSSL_MSG("CRYS_ECPKI_BuildPrivKey failed");
  9474. return ret;
  9475. }
  9476. ret = mp_read_unsigned_bin(key->k, priv, privSz);
  9477. }
  9478. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  9479. if (ret == MP_OKAY)
  9480. ret = mp_read_unsigned_bin(key->k, priv, privSz);
  9481. if (ret == MP_OKAY) {
  9482. if (pub) {
  9483. ret = silabs_ecc_import(key, key->dp->size);
  9484. }
  9485. else {
  9486. ret = silabs_ecc_import_private(key, key->dp->size);
  9487. }
  9488. }
  9489. #elif defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  9490. if ((wc_ecc_size(key) + WC_CAAM_MAC_SZ) == (int)privSz) {
  9491. #ifdef WOLFSSL_CAAM_BLACK_KEY_SM
  9492. int part = caamFindUnusedPartition();
  9493. if (part >= 0) {
  9494. CAAM_ADDRESS vaddr = caamGetPartition(part, privSz*3);
  9495. if (vaddr == 0) {
  9496. WOLFSSL_MSG("Unable to get partition");
  9497. return MEMORY_E;
  9498. }
  9499. key->partNum = part;
  9500. key->blackKey = (word32)vaddr;
  9501. if (caamWriteToPartition(vaddr, priv, privSz) != 0)
  9502. return WC_HW_E;
  9503. if (pub != NULL) {
  9504. /* +1 to account for x963 compressed bit */
  9505. if (caamWriteToPartition(vaddr + privSz, pub + 1, pubSz - 1) != 0)
  9506. return WC_HW_E;
  9507. key->securePubKey = (word32)vaddr + privSz;
  9508. }
  9509. }
  9510. else {
  9511. WOLFSSL_MSG("Unable to find an unused partition");
  9512. return MEMORY_E;
  9513. }
  9514. #else
  9515. key->blackKey = CAAM_BLACK_KEY_CCM;
  9516. ret = mp_read_unsigned_bin(key->k, priv, privSz);
  9517. #endif
  9518. }
  9519. else {
  9520. key->blackKey = 0;
  9521. ret = mp_read_unsigned_bin(key->k, priv, privSz);
  9522. /* If using AES-ECB encrypted black keys check here if key is valid,
  9523. * if not valid than assume is an encrypted key. A public key is needed
  9524. * for testing validity. */
  9525. if (key->devId == WOLFSSL_CAAM_DEVID && (
  9526. wc_ecc_get_curve_id(key->idx) == ECC_SECP256R1 ||
  9527. wc_ecc_get_curve_id(key->idx) == ECC_SECP384R1)) {
  9528. if ((pub != NULL) && (ret == MP_OKAY) &&
  9529. (_ecc_validate_public_key(key, 1, 1) != MP_OKAY)) {
  9530. key->blackKey = CAAM_BLACK_KEY_ECB;
  9531. }
  9532. else if ((pub == NULL) && (ret == MP_OKAY)) {
  9533. WOLFSSL_MSG("Assuming encrypted key with no public key to check");
  9534. key->blackKey = CAAM_BLACK_KEY_ECB;
  9535. }
  9536. else {
  9537. WOLFSSL_MSG("Importing key that is not a black key!");
  9538. }
  9539. }
  9540. }
  9541. #else
  9542. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9543. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  9544. #endif
  9545. ret = mp_read_unsigned_bin(key->k, priv, privSz);
  9546. #ifdef HAVE_WOLF_BIGINT
  9547. if (ret == 0 &&
  9548. wc_bigint_from_unsigned_bin(&key->k->raw, priv, privSz) != 0) {
  9549. mp_clear(key->k);
  9550. ret = ASN_GETINT_E;
  9551. }
  9552. #endif /* HAVE_WOLF_BIGINT */
  9553. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9554. if (ret == 0) {
  9555. #ifdef WOLFSSL_SMALL_STACK
  9556. mp_int* order = NULL;
  9557. #else
  9558. mp_int order[1];
  9559. #endif
  9560. #ifdef WOLFSSL_SMALL_STACK
  9561. order = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
  9562. if (order == NULL) {
  9563. ret = MEMORY_E;
  9564. }
  9565. #endif
  9566. if (ret == 0) {
  9567. ret = mp_init(order);
  9568. }
  9569. if (ret == 0) {
  9570. ret = mp_read_radix(order, key->dp->order, MP_RADIX_HEX);
  9571. }
  9572. if ((ret == 0) && (mp_cmp(key->k, order) != MP_LT)) {
  9573. ret = ECC_PRIV_KEY_E;
  9574. }
  9575. #ifdef WOLFSSL_SMALL_STACK
  9576. XFREE(order, key->heap, DYNAMIC_TYPE_ECC);
  9577. #endif
  9578. }
  9579. #endif /* WOLFSSL_VALIDATE_ECC_IMPORT */
  9580. #endif /* WOLFSSL_CRYPTOCELL */
  9581. #if defined(WOLFSSL_VALIDATE_ECC_IMPORT) && !defined(WOLFSSL_KCAPI_ECC)
  9582. if ((pub != NULL) && (ret == MP_OKAY))
  9583. /* public key needed to perform key validation */
  9584. ret = _ecc_validate_public_key(key, 1, 1);
  9585. #endif
  9586. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9587. RESTORE_VECTOR_REGISTERS();
  9588. #endif
  9589. #ifdef WOLFSSL_MAXQ10XX_CRYPTO
  9590. if (ret == 0) {
  9591. ret = wc_MAXQ10XX_EccSetKey(key, key->dp->size);
  9592. }
  9593. #endif
  9594. return ret;
  9595. }
  9596. /* ecc private key import, public key in ANSI X9.63 format, private raw */
  9597. WOLFSSL_ABI
  9598. int wc_ecc_import_private_key(const byte* priv, word32 privSz, const byte* pub,
  9599. word32 pubSz, ecc_key* key)
  9600. {
  9601. return wc_ecc_import_private_key_ex(priv, privSz, pub, pubSz, key,
  9602. ECC_CURVE_DEF);
  9603. }
  9604. #endif /* HAVE_ECC_KEY_IMPORT */
  9605. #ifndef NO_ASN
  9606. /**
  9607. Convert ECC R,S to signature
  9608. r R component of signature
  9609. s S component of signature
  9610. out DER-encoded ECDSA signature
  9611. outlen [in/out] output buffer size, output signature size
  9612. return MP_OKAY on success
  9613. */
  9614. WOLFSSL_ABI
  9615. int wc_ecc_rs_to_sig(const char* r, const char* s, byte* out, word32* outlen)
  9616. {
  9617. int err;
  9618. #ifdef WOLFSSL_SMALL_STACK
  9619. mp_int* rtmp = NULL;
  9620. mp_int* stmp = NULL;
  9621. #else
  9622. mp_int rtmp[1];
  9623. mp_int stmp[1];
  9624. #endif
  9625. if (r == NULL || s == NULL || out == NULL || outlen == NULL)
  9626. return ECC_BAD_ARG_E;
  9627. #ifdef WOLFSSL_SMALL_STACK
  9628. rtmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  9629. if (rtmp == NULL)
  9630. return MEMORY_E;
  9631. stmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  9632. if (stmp == NULL) {
  9633. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  9634. return MEMORY_E;
  9635. }
  9636. #endif
  9637. err = mp_init_multi(rtmp, stmp, NULL, NULL, NULL, NULL);
  9638. if (err != MP_OKAY) {
  9639. #ifdef WOLFSSL_SMALL_STACK
  9640. XFREE(stmp, NULL, DYNAMIC_TYPE_ECC);
  9641. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  9642. #endif
  9643. return err;
  9644. }
  9645. err = mp_read_radix(rtmp, r, MP_RADIX_HEX);
  9646. if (err == MP_OKAY)
  9647. err = mp_read_radix(stmp, s, MP_RADIX_HEX);
  9648. if (err == MP_OKAY) {
  9649. if (mp_iszero(rtmp) == MP_YES || mp_iszero(stmp) == MP_YES)
  9650. err = MP_ZERO_E;
  9651. }
  9652. if (err == MP_OKAY) {
  9653. if (mp_isneg(rtmp) == MP_YES || mp_isneg(stmp) == MP_YES) {
  9654. err = MP_READ_E;
  9655. }
  9656. }
  9657. /* convert mp_ints to ECDSA sig, initializes rtmp and stmp internally */
  9658. if (err == MP_OKAY)
  9659. err = StoreECC_DSA_Sig(out, outlen, rtmp, stmp);
  9660. mp_clear(rtmp);
  9661. mp_clear(stmp);
  9662. #ifdef WOLFSSL_SMALL_STACK
  9663. XFREE(stmp, NULL, DYNAMIC_TYPE_ECC);
  9664. XFREE(rtmp, NULL, DYNAMIC_TYPE_ECC);
  9665. #endif
  9666. return err;
  9667. }
  9668. /**
  9669. Convert ECC R,S raw unsigned bin to signature
  9670. r R component of signature
  9671. rSz R size
  9672. s S component of signature
  9673. sSz S size
  9674. out DER-encoded ECDSA signature
  9675. outlen [in/out] output buffer size, output signature size
  9676. return MP_OKAY on success
  9677. */
  9678. int wc_ecc_rs_raw_to_sig(const byte* r, word32 rSz, const byte* s, word32 sSz,
  9679. byte* out, word32* outlen)
  9680. {
  9681. if (r == NULL || s == NULL || out == NULL || outlen == NULL)
  9682. return ECC_BAD_ARG_E;
  9683. /* convert mp_ints to ECDSA sig, initializes rtmp and stmp internally */
  9684. return StoreECC_DSA_Sig_Bin(out, outlen, r, rSz, s, sSz);
  9685. }
  9686. /**
  9687. Convert ECC signature to R,S
  9688. sig DER-encoded ECDSA signature
  9689. sigLen length of signature in octets
  9690. r R component of signature
  9691. rLen [in/out] output "r" buffer size, output "r" size
  9692. s S component of signature
  9693. sLen [in/out] output "s" buffer size, output "s" size
  9694. return MP_OKAY on success, negative on error
  9695. */
  9696. int wc_ecc_sig_to_rs(const byte* sig, word32 sigLen, byte* r, word32* rLen,
  9697. byte* s, word32* sLen)
  9698. {
  9699. if (sig == NULL || r == NULL || rLen == NULL || s == NULL || sLen == NULL)
  9700. return ECC_BAD_ARG_E;
  9701. return DecodeECC_DSA_Sig_Bin(sig, sigLen, r, rLen, s, sLen);
  9702. }
  9703. #endif /* !NO_ASN */
  9704. #ifdef HAVE_ECC_KEY_IMPORT
  9705. static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
  9706. const char* qy, const char* d, int curve_id, int encType)
  9707. {
  9708. int err = MP_OKAY;
  9709. #if defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_ATECC508A) && \
  9710. !defined(WOLFSSL_ATECC608A)
  9711. const CRYS_ECPKI_Domain_t* pDomain;
  9712. CRYS_ECPKI_BUILD_TempData_t tempBuff;
  9713. byte keyRaw[ECC_MAX_CRYPTO_HW_SIZE*2 + 1];
  9714. #endif
  9715. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
  9716. defined(WOLFSSL_SILABS_SE_ACCEL) || defined(WOLFSSL_CRYPTOCELL)
  9717. word32 keySz = 0;
  9718. #endif
  9719. /* if d is NULL, only import as public key using Qx,Qy */
  9720. if (key == NULL || qx == NULL || qy == NULL) {
  9721. return BAD_FUNC_ARG;
  9722. }
  9723. /* make sure required variables are reset */
  9724. wc_ecc_reset(key);
  9725. /* set curve type and index */
  9726. err = wc_ecc_set_curve(key, 0, curve_id);
  9727. if (err != 0) {
  9728. return err;
  9729. }
  9730. /* init key */
  9731. #ifdef ALT_ECC_SIZE
  9732. key->pubkey.x = (mp_int*)&key->pubkey.xyz[0];
  9733. key->pubkey.y = (mp_int*)&key->pubkey.xyz[1];
  9734. key->pubkey.z = (mp_int*)&key->pubkey.xyz[2];
  9735. alt_fp_init(key->pubkey.x);
  9736. alt_fp_init(key->pubkey.y);
  9737. alt_fp_init(key->pubkey.z);
  9738. key->k = (mp_int*)key->ka;
  9739. alt_fp_init(key->k);
  9740. #else
  9741. err = mp_init_multi(key->k, key->pubkey.x, key->pubkey.y, key->pubkey.z,
  9742. NULL, NULL);
  9743. #endif
  9744. if (err != MP_OKAY)
  9745. return MEMORY_E;
  9746. /* read Qx */
  9747. if (err == MP_OKAY) {
  9748. if (encType == WC_TYPE_HEX_STR)
  9749. err = mp_read_radix(key->pubkey.x, qx, MP_RADIX_HEX);
  9750. else
  9751. err = mp_read_unsigned_bin(key->pubkey.x, (const byte*)qx,
  9752. (word32)key->dp->size);
  9753. if (mp_isneg(key->pubkey.x)) {
  9754. WOLFSSL_MSG("Invalid Qx");
  9755. err = BAD_FUNC_ARG;
  9756. }
  9757. if (mp_unsigned_bin_size(key->pubkey.x) > key->dp->size) {
  9758. err = BAD_FUNC_ARG;
  9759. }
  9760. }
  9761. /* read Qy */
  9762. if (err == MP_OKAY) {
  9763. if (encType == WC_TYPE_HEX_STR)
  9764. err = mp_read_radix(key->pubkey.y, qy, MP_RADIX_HEX);
  9765. else
  9766. err = mp_read_unsigned_bin(key->pubkey.y, (const byte*)qy,
  9767. (word32)key->dp->size);
  9768. if (mp_isneg(key->pubkey.y)) {
  9769. WOLFSSL_MSG("Invalid Qy");
  9770. err = BAD_FUNC_ARG;
  9771. }
  9772. if (mp_unsigned_bin_size(key->pubkey.y) > key->dp->size) {
  9773. err = BAD_FUNC_ARG;
  9774. }
  9775. }
  9776. if (err == MP_OKAY) {
  9777. if (mp_iszero(key->pubkey.x) && mp_iszero(key->pubkey.y)) {
  9778. WOLFSSL_MSG("Invalid Qx and Qy");
  9779. err = ECC_INF_E;
  9780. }
  9781. }
  9782. if (err == MP_OKAY)
  9783. err = mp_set(key->pubkey.z, 1);
  9784. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  9785. /* For SECP256R1 only save raw public key for hardware */
  9786. if (err == MP_OKAY && curve_id == ECC_SECP256R1) {
  9787. keySz = key->dp->size;
  9788. err = wc_export_int(key->pubkey.x, key->pubkey_raw,
  9789. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  9790. if (err == MP_OKAY)
  9791. err = wc_export_int(key->pubkey.y, &key->pubkey_raw[keySz],
  9792. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  9793. }
  9794. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  9795. keySz = key->dp->size;
  9796. if (err == MP_OKAY) {
  9797. err = silabs_ecc_sig_to_rs(key, keySz);
  9798. }
  9799. #elif defined(WOLFSSL_CRYPTOCELL)
  9800. if (err == MP_OKAY) {
  9801. keyRaw[0] = ECC_POINT_UNCOMP;
  9802. keySz = (word32)key->dp->size;
  9803. err = wc_export_int(key->pubkey.x, &keyRaw[1], &keySz, keySz,
  9804. WC_TYPE_UNSIGNED_BIN);
  9805. if (err == MP_OKAY) {
  9806. err = wc_export_int(key->pubkey.y, &keyRaw[1+keySz],
  9807. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  9808. }
  9809. if (err == MP_OKAY) {
  9810. pDomain = CRYS_ECPKI_GetEcDomain(cc310_mapCurve(key->dp->id));
  9811. /* create public key from external key buffer */
  9812. err = CRYS_ECPKI_BuildPublKeyFullCheck(pDomain,
  9813. keyRaw,
  9814. keySz*2 + 1,
  9815. &key->ctx.pubKey,
  9816. &tempBuff);
  9817. }
  9818. if (err != SA_SILIB_RET_OK){
  9819. WOLFSSL_MSG("CRYS_ECPKI_BuildPublKeyFullCheck failed");
  9820. return err;
  9821. }
  9822. }
  9823. #elif defined(WOLFSSL_KCAPI_ECC)
  9824. if (err == MP_OKAY) {
  9825. word32 keySz = key->dp->size;
  9826. err = wc_export_int(key->pubkey.x, key->pubkey_raw,
  9827. &keySz, keySz, WC_TYPE_UNSIGNED_BIN);
  9828. if (err == MP_OKAY) {
  9829. err = wc_export_int(key->pubkey.y,
  9830. &key->pubkey_raw[keySz], &keySz, keySz,
  9831. WC_TYPE_UNSIGNED_BIN);
  9832. }
  9833. }
  9834. #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  9835. if (err == MP_OKAY) {
  9836. const word32 keySize = key->dp->size;
  9837. word32 bufSize = sizeof(key->keyRaw);
  9838. err = wc_export_int(key->pubkey.x, key->keyRaw, &bufSize, keySize,
  9839. WC_TYPE_UNSIGNED_BIN);
  9840. if (err == MP_OKAY) {
  9841. const word32 offset = bufSize;
  9842. bufSize = sizeof(key->keyRaw) - offset;
  9843. err = wc_export_int(key->pubkey.y, &key->keyRaw[offset], &bufSize,
  9844. keySize, WC_TYPE_UNSIGNED_BIN);
  9845. }
  9846. if (err == MP_OKAY) {
  9847. mp_reverse(key->keyRaw, keySize);
  9848. mp_reverse(&key->keyRaw[keySize], keySize);
  9849. WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->keyRaw),
  9850. keySize * 2);
  9851. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  9852. err = XSecure_EllipticValidateKey(&(key->xSec.cinst),
  9853. xil_curve_type[key->dp->id],
  9854. XIL_CAST_U64(key->keyRaw));
  9855. if (err) {
  9856. WOLFSSL_XIL_ERROR("Validation of ECC key failed", err);
  9857. err = WC_HW_E;
  9858. }
  9859. #endif
  9860. }
  9861. }
  9862. #endif
  9863. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9864. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  9865. #endif
  9866. /* import private key */
  9867. if (err == MP_OKAY) {
  9868. if (d != NULL) {
  9869. #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A)
  9870. /* Hardware doesn't support loading private key */
  9871. err = NOT_COMPILED_IN;
  9872. #elif defined(WOLFSSL_SILABS_SE_ACCEL)
  9873. err = silabs_ecc_import_private_raw(key, keySz, d, encType);
  9874. #elif defined(WOLFSSL_CRYPTOCELL)
  9875. key->type = ECC_PRIVATEKEY;
  9876. if (encType == WC_TYPE_HEX_STR)
  9877. err = mp_read_radix(key->k, d, MP_RADIX_HEX);
  9878. else
  9879. err = mp_read_unsigned_bin(key->k, (const byte*)d,
  9880. key->dp->size);
  9881. if (err == MP_OKAY) {
  9882. err = wc_export_int(key->k, &keyRaw[0], &keySz, keySz,
  9883. WC_TYPE_UNSIGNED_BIN);
  9884. }
  9885. if (err == MP_OKAY) {
  9886. /* Create private key from external key buffer*/
  9887. err = CRYS_ECPKI_BuildPrivKey(pDomain,
  9888. keyRaw,
  9889. keySz,
  9890. &key->ctx.privKey);
  9891. if (err != SA_SILIB_RET_OK){
  9892. WOLFSSL_MSG("CRYS_ECPKI_BuildPrivKey failed");
  9893. return err;
  9894. }
  9895. }
  9896. #else
  9897. key->type = ECC_PRIVATEKEY;
  9898. if (encType == WC_TYPE_HEX_STR)
  9899. err = mp_read_radix(key->k, d, MP_RADIX_HEX);
  9900. else {
  9901. #if defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM)
  9902. if (key->blackKey == CAAM_BLACK_KEY_CCM) {
  9903. err = mp_read_unsigned_bin(key->k, (const byte*)d,
  9904. key->dp->size + WC_CAAM_MAC_SZ);
  9905. }
  9906. else
  9907. #endif /* WOLFSSL_QNX_CAAM */
  9908. {
  9909. err = mp_read_unsigned_bin(key->k, (const byte*)d,
  9910. (word32)key->dp->size);
  9911. }
  9912. }
  9913. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  9914. if (err == MP_OKAY) {
  9915. const word32 key_size = key->dp->size;
  9916. word32 buf_size = key_size;
  9917. err = wc_export_int(key->k, key->privKey,
  9918. &buf_size, key_size, WC_TYPE_UNSIGNED_BIN);
  9919. mp_reverse(key->privKey, key_size);
  9920. }
  9921. #endif
  9922. #endif /* #else-case of custom HW-specific implementations */
  9923. if (mp_iszero(key->k) || mp_isneg(key->k)) {
  9924. WOLFSSL_MSG("Invalid private key");
  9925. err = BAD_FUNC_ARG;
  9926. }
  9927. } else {
  9928. key->type = ECC_PUBLICKEY;
  9929. }
  9930. }
  9931. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9932. if (err == MP_OKAY) {
  9933. err = wc_ecc_check_key(key);
  9934. if (err == IS_POINT_E && (mp_iszero(key->pubkey.x) ||
  9935. mp_iszero(key->pubkey.y))) {
  9936. err = BAD_FUNC_ARG;
  9937. }
  9938. }
  9939. #endif
  9940. #ifdef WOLFSSL_VALIDATE_ECC_IMPORT
  9941. RESTORE_VECTOR_REGISTERS();
  9942. #endif
  9943. #ifdef WOLFSSL_MAXQ10XX_CRYPTO
  9944. if (err == MP_OKAY) {
  9945. err = wc_MAXQ10XX_EccSetKey(key, key->dp->size);
  9946. }
  9947. #endif
  9948. if (err != MP_OKAY) {
  9949. mp_clear(key->pubkey.x);
  9950. mp_clear(key->pubkey.y);
  9951. mp_clear(key->pubkey.z);
  9952. mp_clear(key->k);
  9953. #if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
  9954. ForceZero(key->keyRaw, sizeof(key->keyRaw));
  9955. #endif
  9956. }
  9957. return err;
  9958. }
  9959. /**
  9960. Import raw ECC key
  9961. key The destination ecc_key structure
  9962. qx x component of the public key, as ASCII hex string
  9963. qy y component of the public key, as ASCII hex string
  9964. d private key, as ASCII hex string, optional if importing public
  9965. key only
  9966. dp Custom ecc_set_type
  9967. return MP_OKAY on success
  9968. */
  9969. int wc_ecc_import_raw_ex(ecc_key* key, const char* qx, const char* qy,
  9970. const char* d, int curve_id)
  9971. {
  9972. return wc_ecc_import_raw_private(key, qx, qy, d, curve_id,
  9973. WC_TYPE_HEX_STR);
  9974. }
  9975. /* Import x, y and optional private (d) as unsigned binary */
  9976. int wc_ecc_import_unsigned(ecc_key* key, const byte* qx, const byte* qy,
  9977. const byte* d, int curve_id)
  9978. {
  9979. return wc_ecc_import_raw_private(key, (const char*)qx, (const char*)qy,
  9980. (const char*)d, curve_id, WC_TYPE_UNSIGNED_BIN);
  9981. }
  9982. /**
  9983. Import raw ECC key
  9984. key The destination ecc_key structure
  9985. qx x component of the public key, as ASCII hex string
  9986. qy y component of the public key, as ASCII hex string
  9987. d private key, as ASCII hex string, optional if importing public
  9988. key only
  9989. curveName ECC curve name, from ecc_sets[]
  9990. return MP_OKAY on success
  9991. */
  9992. WOLFSSL_ABI
  9993. int wc_ecc_import_raw(ecc_key* key, const char* qx, const char* qy,
  9994. const char* d, const char* curveName)
  9995. {
  9996. int err, x;
  9997. /* if d is NULL, only import as public key using Qx,Qy */
  9998. if (key == NULL || qx == NULL || qy == NULL || curveName == NULL) {
  9999. return BAD_FUNC_ARG;
  10000. }
  10001. /* set curve type and index */
  10002. for (x = 0; ecc_sets[x].size != 0; x++) {
  10003. if (XSTRNCMP(ecc_sets[x].name, curveName,
  10004. XSTRLEN(curveName)) == 0) {
  10005. break;
  10006. }
  10007. }
  10008. if (ecc_sets[x].size == 0) {
  10009. WOLFSSL_MSG("ecc_set curve name not found");
  10010. err = ASN_PARSE_E;
  10011. } else {
  10012. return wc_ecc_import_raw_private(key, qx, qy, d, ecc_sets[x].id,
  10013. WC_TYPE_HEX_STR);
  10014. }
  10015. return err;
  10016. }
  10017. #endif /* HAVE_ECC_KEY_IMPORT */
  10018. #if defined(HAVE_ECC_ENCRYPT) && !defined(WOLFSSL_ECIES_OLD)
  10019. /* public key size in octets */
  10020. static int ecc_public_key_size(ecc_key* key, word32* sz)
  10021. {
  10022. if (key == NULL || key->dp == NULL)
  10023. return BAD_FUNC_ARG;
  10024. /* 'Uncompressed' | x | y */
  10025. *sz = 1 + 2 * (word32)key->dp->size;
  10026. return 0;
  10027. }
  10028. #endif
  10029. /* key size in octets */
  10030. WOLFSSL_ABI
  10031. int wc_ecc_size(ecc_key* key)
  10032. {
  10033. if (key == NULL || key->dp == NULL)
  10034. return 0;
  10035. return key->dp->size;
  10036. }
  10037. /* maximum signature size based on key size */
  10038. WOLFSSL_ABI
  10039. int wc_ecc_sig_size_calc(int sz)
  10040. {
  10041. int maxSigSz = 0;
  10042. /* calculate based on key bits */
  10043. /* maximum possible signature header size is 7 bytes plus 2 bytes padding */
  10044. maxSigSz = (sz * 2) + SIG_HEADER_SZ + ECC_MAX_PAD_SZ;
  10045. /* if total length is less than 128 + SEQ(1)+LEN(1) then subtract 1 */
  10046. if (maxSigSz < (128 + 2)) {
  10047. maxSigSz -= 1;
  10048. }
  10049. return maxSigSz;
  10050. }
  10051. /* maximum signature size based on actual key curve */
  10052. WOLFSSL_ABI
  10053. int wc_ecc_sig_size(const ecc_key* key)
  10054. {
  10055. int maxSigSz;
  10056. int orderBits, keySz;
  10057. if (key == NULL || key->dp == NULL)
  10058. return 0;
  10059. /* the signature r and s will always be less than order */
  10060. /* if the order MSB (top bit of byte) is set then ASN encoding needs
  10061. extra byte for r and s, so add 2 */
  10062. keySz = key->dp->size;
  10063. orderBits = wc_ecc_get_curve_order_bit_count(key->dp);
  10064. if (orderBits > keySz * 8) {
  10065. keySz = (orderBits + 7) / 8;
  10066. }
  10067. /* maximum possible signature header size is 7 bytes */
  10068. maxSigSz = (keySz * 2) + SIG_HEADER_SZ;
  10069. if ((orderBits % 8) == 0) {
  10070. /* MSB can be set, so add 2 */
  10071. maxSigSz += ECC_MAX_PAD_SZ;
  10072. }
  10073. /* if total length is less than 128 + SEQ(1)+LEN(1) then subtract 1 */
  10074. if (maxSigSz < (128 + 2)) {
  10075. maxSigSz -= 1;
  10076. }
  10077. return maxSigSz;
  10078. }
  10079. #ifdef FP_ECC
  10080. /* fixed point ECC cache */
  10081. /* number of entries in the cache */
  10082. #ifndef FP_ENTRIES
  10083. #define FP_ENTRIES 15
  10084. #endif
  10085. /* number of bits in LUT */
  10086. #ifndef FP_LUT
  10087. #define FP_LUT 8U
  10088. #endif
  10089. #ifdef ECC_SHAMIR
  10090. /* Sharmir requires a bigger LUT, TAO */
  10091. #if (FP_LUT > 12) || (FP_LUT < 4)
  10092. #error FP_LUT must be between 4 and 12 inclusively
  10093. #endif
  10094. #else
  10095. #if (FP_LUT > 12) || (FP_LUT < 2)
  10096. #error FP_LUT must be between 2 and 12 inclusively
  10097. #endif
  10098. #endif
  10099. #if !defined(WOLFSSL_SP_MATH)
  10100. /** Our FP cache */
  10101. typedef struct {
  10102. ecc_point* g; /* cached COPY of base point */
  10103. ecc_point* LUT[1U<<FP_LUT]; /* fixed point lookup */
  10104. int LUT_set; /* flag to determine if the LUT has been computed */
  10105. mp_int mu; /* copy of the montgomery constant */
  10106. int lru_count; /* amount of times this entry has been used */
  10107. int lock; /* flag to indicate cache eviction */
  10108. /* permitted (0) or not (1) */
  10109. } fp_cache_t;
  10110. /* if HAVE_THREAD_LS this cache is per thread, no locking needed */
  10111. static THREAD_LS_T fp_cache_t fp_cache[FP_ENTRIES];
  10112. #ifndef HAVE_THREAD_LS
  10113. static volatile int initMutex = 0; /* prevent multiple mutex inits */
  10114. static wolfSSL_Mutex ecc_fp_lock;
  10115. #endif /* HAVE_THREAD_LS */
  10116. /* simple table to help direct the generation of the LUT */
  10117. static const struct {
  10118. int ham, terma, termb;
  10119. } lut_orders[] = {
  10120. { 0, 0, 0 }, { 1, 0, 0 }, { 1, 0, 0 }, { 2, 1, 2 }, { 1, 0, 0 }, { 2, 1, 4 }, { 2, 2, 4 }, { 3, 3, 4 },
  10121. { 1, 0, 0 }, { 2, 1, 8 }, { 2, 2, 8 }, { 3, 3, 8 }, { 2, 4, 8 }, { 3, 5, 8 }, { 3, 6, 8 }, { 4, 7, 8 },
  10122. { 1, 0, 0 }, { 2, 1, 16 }, { 2, 2, 16 }, { 3, 3, 16 }, { 2, 4, 16 }, { 3, 5, 16 }, { 3, 6, 16 }, { 4, 7, 16 },
  10123. { 2, 8, 16 }, { 3, 9, 16 }, { 3, 10, 16 }, { 4, 11, 16 }, { 3, 12, 16 }, { 4, 13, 16 }, { 4, 14, 16 }, { 5, 15, 16 },
  10124. { 1, 0, 0 }, { 2, 1, 32 }, { 2, 2, 32 }, { 3, 3, 32 }, { 2, 4, 32 }, { 3, 5, 32 }, { 3, 6, 32 }, { 4, 7, 32 },
  10125. { 2, 8, 32 }, { 3, 9, 32 }, { 3, 10, 32 }, { 4, 11, 32 }, { 3, 12, 32 }, { 4, 13, 32 }, { 4, 14, 32 }, { 5, 15, 32 },
  10126. { 2, 16, 32 }, { 3, 17, 32 }, { 3, 18, 32 }, { 4, 19, 32 }, { 3, 20, 32 }, { 4, 21, 32 }, { 4, 22, 32 }, { 5, 23, 32 },
  10127. { 3, 24, 32 }, { 4, 25, 32 }, { 4, 26, 32 }, { 5, 27, 32 }, { 4, 28, 32 }, { 5, 29, 32 }, { 5, 30, 32 }, { 6, 31, 32 },
  10128. #if FP_LUT > 6
  10129. { 1, 0, 0 }, { 2, 1, 64 }, { 2, 2, 64 }, { 3, 3, 64 }, { 2, 4, 64 }, { 3, 5, 64 }, { 3, 6, 64 }, { 4, 7, 64 },
  10130. { 2, 8, 64 }, { 3, 9, 64 }, { 3, 10, 64 }, { 4, 11, 64 }, { 3, 12, 64 }, { 4, 13, 64 }, { 4, 14, 64 }, { 5, 15, 64 },
  10131. { 2, 16, 64 }, { 3, 17, 64 }, { 3, 18, 64 }, { 4, 19, 64 }, { 3, 20, 64 }, { 4, 21, 64 }, { 4, 22, 64 }, { 5, 23, 64 },
  10132. { 3, 24, 64 }, { 4, 25, 64 }, { 4, 26, 64 }, { 5, 27, 64 }, { 4, 28, 64 }, { 5, 29, 64 }, { 5, 30, 64 }, { 6, 31, 64 },
  10133. { 2, 32, 64 }, { 3, 33, 64 }, { 3, 34, 64 }, { 4, 35, 64 }, { 3, 36, 64 }, { 4, 37, 64 }, { 4, 38, 64 }, { 5, 39, 64 },
  10134. { 3, 40, 64 }, { 4, 41, 64 }, { 4, 42, 64 }, { 5, 43, 64 }, { 4, 44, 64 }, { 5, 45, 64 }, { 5, 46, 64 }, { 6, 47, 64 },
  10135. { 3, 48, 64 }, { 4, 49, 64 }, { 4, 50, 64 }, { 5, 51, 64 }, { 4, 52, 64 }, { 5, 53, 64 }, { 5, 54, 64 }, { 6, 55, 64 },
  10136. { 4, 56, 64 }, { 5, 57, 64 }, { 5, 58, 64 }, { 6, 59, 64 }, { 5, 60, 64 }, { 6, 61, 64 }, { 6, 62, 64 }, { 7, 63, 64 },
  10137. #if FP_LUT > 7
  10138. { 1, 0, 0 }, { 2, 1, 128 }, { 2, 2, 128 }, { 3, 3, 128 }, { 2, 4, 128 }, { 3, 5, 128 }, { 3, 6, 128 }, { 4, 7, 128 },
  10139. { 2, 8, 128 }, { 3, 9, 128 }, { 3, 10, 128 }, { 4, 11, 128 }, { 3, 12, 128 }, { 4, 13, 128 }, { 4, 14, 128 }, { 5, 15, 128 },
  10140. { 2, 16, 128 }, { 3, 17, 128 }, { 3, 18, 128 }, { 4, 19, 128 }, { 3, 20, 128 }, { 4, 21, 128 }, { 4, 22, 128 }, { 5, 23, 128 },
  10141. { 3, 24, 128 }, { 4, 25, 128 }, { 4, 26, 128 }, { 5, 27, 128 }, { 4, 28, 128 }, { 5, 29, 128 }, { 5, 30, 128 }, { 6, 31, 128 },
  10142. { 2, 32, 128 }, { 3, 33, 128 }, { 3, 34, 128 }, { 4, 35, 128 }, { 3, 36, 128 }, { 4, 37, 128 }, { 4, 38, 128 }, { 5, 39, 128 },
  10143. { 3, 40, 128 }, { 4, 41, 128 }, { 4, 42, 128 }, { 5, 43, 128 }, { 4, 44, 128 }, { 5, 45, 128 }, { 5, 46, 128 }, { 6, 47, 128 },
  10144. { 3, 48, 128 }, { 4, 49, 128 }, { 4, 50, 128 }, { 5, 51, 128 }, { 4, 52, 128 }, { 5, 53, 128 }, { 5, 54, 128 }, { 6, 55, 128 },
  10145. { 4, 56, 128 }, { 5, 57, 128 }, { 5, 58, 128 }, { 6, 59, 128 }, { 5, 60, 128 }, { 6, 61, 128 }, { 6, 62, 128 }, { 7, 63, 128 },
  10146. { 2, 64, 128 }, { 3, 65, 128 }, { 3, 66, 128 }, { 4, 67, 128 }, { 3, 68, 128 }, { 4, 69, 128 }, { 4, 70, 128 }, { 5, 71, 128 },
  10147. { 3, 72, 128 }, { 4, 73, 128 }, { 4, 74, 128 }, { 5, 75, 128 }, { 4, 76, 128 }, { 5, 77, 128 }, { 5, 78, 128 }, { 6, 79, 128 },
  10148. { 3, 80, 128 }, { 4, 81, 128 }, { 4, 82, 128 }, { 5, 83, 128 }, { 4, 84, 128 }, { 5, 85, 128 }, { 5, 86, 128 }, { 6, 87, 128 },
  10149. { 4, 88, 128 }, { 5, 89, 128 }, { 5, 90, 128 }, { 6, 91, 128 }, { 5, 92, 128 }, { 6, 93, 128 }, { 6, 94, 128 }, { 7, 95, 128 },
  10150. { 3, 96, 128 }, { 4, 97, 128 }, { 4, 98, 128 }, { 5, 99, 128 }, { 4, 100, 128 }, { 5, 101, 128 }, { 5, 102, 128 }, { 6, 103, 128 },
  10151. { 4, 104, 128 }, { 5, 105, 128 }, { 5, 106, 128 }, { 6, 107, 128 }, { 5, 108, 128 }, { 6, 109, 128 }, { 6, 110, 128 }, { 7, 111, 128 },
  10152. { 4, 112, 128 }, { 5, 113, 128 }, { 5, 114, 128 }, { 6, 115, 128 }, { 5, 116, 128 }, { 6, 117, 128 }, { 6, 118, 128 }, { 7, 119, 128 },
  10153. { 5, 120, 128 }, { 6, 121, 128 }, { 6, 122, 128 }, { 7, 123, 128 }, { 6, 124, 128 }, { 7, 125, 128 }, { 7, 126, 128 }, { 8, 127, 128 },
  10154. #if FP_LUT > 8
  10155. { 1, 0, 0 }, { 2, 1, 256 }, { 2, 2, 256 }, { 3, 3, 256 }, { 2, 4, 256 }, { 3, 5, 256 }, { 3, 6, 256 }, { 4, 7, 256 },
  10156. { 2, 8, 256 }, { 3, 9, 256 }, { 3, 10, 256 }, { 4, 11, 256 }, { 3, 12, 256 }, { 4, 13, 256 }, { 4, 14, 256 }, { 5, 15, 256 },
  10157. { 2, 16, 256 }, { 3, 17, 256 }, { 3, 18, 256 }, { 4, 19, 256 }, { 3, 20, 256 }, { 4, 21, 256 }, { 4, 22, 256 }, { 5, 23, 256 },
  10158. { 3, 24, 256 }, { 4, 25, 256 }, { 4, 26, 256 }, { 5, 27, 256 }, { 4, 28, 256 }, { 5, 29, 256 }, { 5, 30, 256 }, { 6, 31, 256 },
  10159. { 2, 32, 256 }, { 3, 33, 256 }, { 3, 34, 256 }, { 4, 35, 256 }, { 3, 36, 256 }, { 4, 37, 256 }, { 4, 38, 256 }, { 5, 39, 256 },
  10160. { 3, 40, 256 }, { 4, 41, 256 }, { 4, 42, 256 }, { 5, 43, 256 }, { 4, 44, 256 }, { 5, 45, 256 }, { 5, 46, 256 }, { 6, 47, 256 },
  10161. { 3, 48, 256 }, { 4, 49, 256 }, { 4, 50, 256 }, { 5, 51, 256 }, { 4, 52, 256 }, { 5, 53, 256 }, { 5, 54, 256 }, { 6, 55, 256 },
  10162. { 4, 56, 256 }, { 5, 57, 256 }, { 5, 58, 256 }, { 6, 59, 256 }, { 5, 60, 256 }, { 6, 61, 256 }, { 6, 62, 256 }, { 7, 63, 256 },
  10163. { 2, 64, 256 }, { 3, 65, 256 }, { 3, 66, 256 }, { 4, 67, 256 }, { 3, 68, 256 }, { 4, 69, 256 }, { 4, 70, 256 }, { 5, 71, 256 },
  10164. { 3, 72, 256 }, { 4, 73, 256 }, { 4, 74, 256 }, { 5, 75, 256 }, { 4, 76, 256 }, { 5, 77, 256 }, { 5, 78, 256 }, { 6, 79, 256 },
  10165. { 3, 80, 256 }, { 4, 81, 256 }, { 4, 82, 256 }, { 5, 83, 256 }, { 4, 84, 256 }, { 5, 85, 256 }, { 5, 86, 256 }, { 6, 87, 256 },
  10166. { 4, 88, 256 }, { 5, 89, 256 }, { 5, 90, 256 }, { 6, 91, 256 }, { 5, 92, 256 }, { 6, 93, 256 }, { 6, 94, 256 }, { 7, 95, 256 },
  10167. { 3, 96, 256 }, { 4, 97, 256 }, { 4, 98, 256 }, { 5, 99, 256 }, { 4, 100, 256 }, { 5, 101, 256 }, { 5, 102, 256 }, { 6, 103, 256 },
  10168. { 4, 104, 256 }, { 5, 105, 256 }, { 5, 106, 256 }, { 6, 107, 256 }, { 5, 108, 256 }, { 6, 109, 256 }, { 6, 110, 256 }, { 7, 111, 256 },
  10169. { 4, 112, 256 }, { 5, 113, 256 }, { 5, 114, 256 }, { 6, 115, 256 }, { 5, 116, 256 }, { 6, 117, 256 }, { 6, 118, 256 }, { 7, 119, 256 },
  10170. { 5, 120, 256 }, { 6, 121, 256 }, { 6, 122, 256 }, { 7, 123, 256 }, { 6, 124, 256 }, { 7, 125, 256 }, { 7, 126, 256 }, { 8, 127, 256 },
  10171. { 2, 128, 256 }, { 3, 129, 256 }, { 3, 130, 256 }, { 4, 131, 256 }, { 3, 132, 256 }, { 4, 133, 256 }, { 4, 134, 256 }, { 5, 135, 256 },
  10172. { 3, 136, 256 }, { 4, 137, 256 }, { 4, 138, 256 }, { 5, 139, 256 }, { 4, 140, 256 }, { 5, 141, 256 }, { 5, 142, 256 }, { 6, 143, 256 },
  10173. { 3, 144, 256 }, { 4, 145, 256 }, { 4, 146, 256 }, { 5, 147, 256 }, { 4, 148, 256 }, { 5, 149, 256 }, { 5, 150, 256 }, { 6, 151, 256 },
  10174. { 4, 152, 256 }, { 5, 153, 256 }, { 5, 154, 256 }, { 6, 155, 256 }, { 5, 156, 256 }, { 6, 157, 256 }, { 6, 158, 256 }, { 7, 159, 256 },
  10175. { 3, 160, 256 }, { 4, 161, 256 }, { 4, 162, 256 }, { 5, 163, 256 }, { 4, 164, 256 }, { 5, 165, 256 }, { 5, 166, 256 }, { 6, 167, 256 },
  10176. { 4, 168, 256 }, { 5, 169, 256 }, { 5, 170, 256 }, { 6, 171, 256 }, { 5, 172, 256 }, { 6, 173, 256 }, { 6, 174, 256 }, { 7, 175, 256 },
  10177. { 4, 176, 256 }, { 5, 177, 256 }, { 5, 178, 256 }, { 6, 179, 256 }, { 5, 180, 256 }, { 6, 181, 256 }, { 6, 182, 256 }, { 7, 183, 256 },
  10178. { 5, 184, 256 }, { 6, 185, 256 }, { 6, 186, 256 }, { 7, 187, 256 }, { 6, 188, 256 }, { 7, 189, 256 }, { 7, 190, 256 }, { 8, 191, 256 },
  10179. { 3, 192, 256 }, { 4, 193, 256 }, { 4, 194, 256 }, { 5, 195, 256 }, { 4, 196, 256 }, { 5, 197, 256 }, { 5, 198, 256 }, { 6, 199, 256 },
  10180. { 4, 200, 256 }, { 5, 201, 256 }, { 5, 202, 256 }, { 6, 203, 256 }, { 5, 204, 256 }, { 6, 205, 256 }, { 6, 206, 256 }, { 7, 207, 256 },
  10181. { 4, 208, 256 }, { 5, 209, 256 }, { 5, 210, 256 }, { 6, 211, 256 }, { 5, 212, 256 }, { 6, 213, 256 }, { 6, 214, 256 }, { 7, 215, 256 },
  10182. { 5, 216, 256 }, { 6, 217, 256 }, { 6, 218, 256 }, { 7, 219, 256 }, { 6, 220, 256 }, { 7, 221, 256 }, { 7, 222, 256 }, { 8, 223, 256 },
  10183. { 4, 224, 256 }, { 5, 225, 256 }, { 5, 226, 256 }, { 6, 227, 256 }, { 5, 228, 256 }, { 6, 229, 256 }, { 6, 230, 256 }, { 7, 231, 256 },
  10184. { 5, 232, 256 }, { 6, 233, 256 }, { 6, 234, 256 }, { 7, 235, 256 }, { 6, 236, 256 }, { 7, 237, 256 }, { 7, 238, 256 }, { 8, 239, 256 },
  10185. { 5, 240, 256 }, { 6, 241, 256 }, { 6, 242, 256 }, { 7, 243, 256 }, { 6, 244, 256 }, { 7, 245, 256 }, { 7, 246, 256 }, { 8, 247, 256 },
  10186. { 6, 248, 256 }, { 7, 249, 256 }, { 7, 250, 256 }, { 8, 251, 256 }, { 7, 252, 256 }, { 8, 253, 256 }, { 8, 254, 256 }, { 9, 255, 256 },
  10187. #if FP_LUT > 9
  10188. { 1, 0, 0 }, { 2, 1, 512 }, { 2, 2, 512 }, { 3, 3, 512 }, { 2, 4, 512 }, { 3, 5, 512 }, { 3, 6, 512 }, { 4, 7, 512 },
  10189. { 2, 8, 512 }, { 3, 9, 512 }, { 3, 10, 512 }, { 4, 11, 512 }, { 3, 12, 512 }, { 4, 13, 512 }, { 4, 14, 512 }, { 5, 15, 512 },
  10190. { 2, 16, 512 }, { 3, 17, 512 }, { 3, 18, 512 }, { 4, 19, 512 }, { 3, 20, 512 }, { 4, 21, 512 }, { 4, 22, 512 }, { 5, 23, 512 },
  10191. { 3, 24, 512 }, { 4, 25, 512 }, { 4, 26, 512 }, { 5, 27, 512 }, { 4, 28, 512 }, { 5, 29, 512 }, { 5, 30, 512 }, { 6, 31, 512 },
  10192. { 2, 32, 512 }, { 3, 33, 512 }, { 3, 34, 512 }, { 4, 35, 512 }, { 3, 36, 512 }, { 4, 37, 512 }, { 4, 38, 512 }, { 5, 39, 512 },
  10193. { 3, 40, 512 }, { 4, 41, 512 }, { 4, 42, 512 }, { 5, 43, 512 }, { 4, 44, 512 }, { 5, 45, 512 }, { 5, 46, 512 }, { 6, 47, 512 },
  10194. { 3, 48, 512 }, { 4, 49, 512 }, { 4, 50, 512 }, { 5, 51, 512 }, { 4, 52, 512 }, { 5, 53, 512 }, { 5, 54, 512 }, { 6, 55, 512 },
  10195. { 4, 56, 512 }, { 5, 57, 512 }, { 5, 58, 512 }, { 6, 59, 512 }, { 5, 60, 512 }, { 6, 61, 512 }, { 6, 62, 512 }, { 7, 63, 512 },
  10196. { 2, 64, 512 }, { 3, 65, 512 }, { 3, 66, 512 }, { 4, 67, 512 }, { 3, 68, 512 }, { 4, 69, 512 }, { 4, 70, 512 }, { 5, 71, 512 },
  10197. { 3, 72, 512 }, { 4, 73, 512 }, { 4, 74, 512 }, { 5, 75, 512 }, { 4, 76, 512 }, { 5, 77, 512 }, { 5, 78, 512 }, { 6, 79, 512 },
  10198. { 3, 80, 512 }, { 4, 81, 512 }, { 4, 82, 512 }, { 5, 83, 512 }, { 4, 84, 512 }, { 5, 85, 512 }, { 5, 86, 512 }, { 6, 87, 512 },
  10199. { 4, 88, 512 }, { 5, 89, 512 }, { 5, 90, 512 }, { 6, 91, 512 }, { 5, 92, 512 }, { 6, 93, 512 }, { 6, 94, 512 }, { 7, 95, 512 },
  10200. { 3, 96, 512 }, { 4, 97, 512 }, { 4, 98, 512 }, { 5, 99, 512 }, { 4, 100, 512 }, { 5, 101, 512 }, { 5, 102, 512 }, { 6, 103, 512 },
  10201. { 4, 104, 512 }, { 5, 105, 512 }, { 5, 106, 512 }, { 6, 107, 512 }, { 5, 108, 512 }, { 6, 109, 512 }, { 6, 110, 512 }, { 7, 111, 512 },
  10202. { 4, 112, 512 }, { 5, 113, 512 }, { 5, 114, 512 }, { 6, 115, 512 }, { 5, 116, 512 }, { 6, 117, 512 }, { 6, 118, 512 }, { 7, 119, 512 },
  10203. { 5, 120, 512 }, { 6, 121, 512 }, { 6, 122, 512 }, { 7, 123, 512 }, { 6, 124, 512 }, { 7, 125, 512 }, { 7, 126, 512 }, { 8, 127, 512 },
  10204. { 2, 128, 512 }, { 3, 129, 512 }, { 3, 130, 512 }, { 4, 131, 512 }, { 3, 132, 512 }, { 4, 133, 512 }, { 4, 134, 512 }, { 5, 135, 512 },
  10205. { 3, 136, 512 }, { 4, 137, 512 }, { 4, 138, 512 }, { 5, 139, 512 }, { 4, 140, 512 }, { 5, 141, 512 }, { 5, 142, 512 }, { 6, 143, 512 },
  10206. { 3, 144, 512 }, { 4, 145, 512 }, { 4, 146, 512 }, { 5, 147, 512 }, { 4, 148, 512 }, { 5, 149, 512 }, { 5, 150, 512 }, { 6, 151, 512 },
  10207. { 4, 152, 512 }, { 5, 153, 512 }, { 5, 154, 512 }, { 6, 155, 512 }, { 5, 156, 512 }, { 6, 157, 512 }, { 6, 158, 512 }, { 7, 159, 512 },
  10208. { 3, 160, 512 }, { 4, 161, 512 }, { 4, 162, 512 }, { 5, 163, 512 }, { 4, 164, 512 }, { 5, 165, 512 }, { 5, 166, 512 }, { 6, 167, 512 },
  10209. { 4, 168, 512 }, { 5, 169, 512 }, { 5, 170, 512 }, { 6, 171, 512 }, { 5, 172, 512 }, { 6, 173, 512 }, { 6, 174, 512 }, { 7, 175, 512 },
  10210. { 4, 176, 512 }, { 5, 177, 512 }, { 5, 178, 512 }, { 6, 179, 512 }, { 5, 180, 512 }, { 6, 181, 512 }, { 6, 182, 512 }, { 7, 183, 512 },
  10211. { 5, 184, 512 }, { 6, 185, 512 }, { 6, 186, 512 }, { 7, 187, 512 }, { 6, 188, 512 }, { 7, 189, 512 }, { 7, 190, 512 }, { 8, 191, 512 },
  10212. { 3, 192, 512 }, { 4, 193, 512 }, { 4, 194, 512 }, { 5, 195, 512 }, { 4, 196, 512 }, { 5, 197, 512 }, { 5, 198, 512 }, { 6, 199, 512 },
  10213. { 4, 200, 512 }, { 5, 201, 512 }, { 5, 202, 512 }, { 6, 203, 512 }, { 5, 204, 512 }, { 6, 205, 512 }, { 6, 206, 512 }, { 7, 207, 512 },
  10214. { 4, 208, 512 }, { 5, 209, 512 }, { 5, 210, 512 }, { 6, 211, 512 }, { 5, 212, 512 }, { 6, 213, 512 }, { 6, 214, 512 }, { 7, 215, 512 },
  10215. { 5, 216, 512 }, { 6, 217, 512 }, { 6, 218, 512 }, { 7, 219, 512 }, { 6, 220, 512 }, { 7, 221, 512 }, { 7, 222, 512 }, { 8, 223, 512 },
  10216. { 4, 224, 512 }, { 5, 225, 512 }, { 5, 226, 512 }, { 6, 227, 512 }, { 5, 228, 512 }, { 6, 229, 512 }, { 6, 230, 512 }, { 7, 231, 512 },
  10217. { 5, 232, 512 }, { 6, 233, 512 }, { 6, 234, 512 }, { 7, 235, 512 }, { 6, 236, 512 }, { 7, 237, 512 }, { 7, 238, 512 }, { 8, 239, 512 },
  10218. { 5, 240, 512 }, { 6, 241, 512 }, { 6, 242, 512 }, { 7, 243, 512 }, { 6, 244, 512 }, { 7, 245, 512 }, { 7, 246, 512 }, { 8, 247, 512 },
  10219. { 6, 248, 512 }, { 7, 249, 512 }, { 7, 250, 512 }, { 8, 251, 512 }, { 7, 252, 512 }, { 8, 253, 512 }, { 8, 254, 512 }, { 9, 255, 512 },
  10220. { 2, 256, 512 }, { 3, 257, 512 }, { 3, 258, 512 }, { 4, 259, 512 }, { 3, 260, 512 }, { 4, 261, 512 }, { 4, 262, 512 }, { 5, 263, 512 },
  10221. { 3, 264, 512 }, { 4, 265, 512 }, { 4, 266, 512 }, { 5, 267, 512 }, { 4, 268, 512 }, { 5, 269, 512 }, { 5, 270, 512 }, { 6, 271, 512 },
  10222. { 3, 272, 512 }, { 4, 273, 512 }, { 4, 274, 512 }, { 5, 275, 512 }, { 4, 276, 512 }, { 5, 277, 512 }, { 5, 278, 512 }, { 6, 279, 512 },
  10223. { 4, 280, 512 }, { 5, 281, 512 }, { 5, 282, 512 }, { 6, 283, 512 }, { 5, 284, 512 }, { 6, 285, 512 }, { 6, 286, 512 }, { 7, 287, 512 },
  10224. { 3, 288, 512 }, { 4, 289, 512 }, { 4, 290, 512 }, { 5, 291, 512 }, { 4, 292, 512 }, { 5, 293, 512 }, { 5, 294, 512 }, { 6, 295, 512 },
  10225. { 4, 296, 512 }, { 5, 297, 512 }, { 5, 298, 512 }, { 6, 299, 512 }, { 5, 300, 512 }, { 6, 301, 512 }, { 6, 302, 512 }, { 7, 303, 512 },
  10226. { 4, 304, 512 }, { 5, 305, 512 }, { 5, 306, 512 }, { 6, 307, 512 }, { 5, 308, 512 }, { 6, 309, 512 }, { 6, 310, 512 }, { 7, 311, 512 },
  10227. { 5, 312, 512 }, { 6, 313, 512 }, { 6, 314, 512 }, { 7, 315, 512 }, { 6, 316, 512 }, { 7, 317, 512 }, { 7, 318, 512 }, { 8, 319, 512 },
  10228. { 3, 320, 512 }, { 4, 321, 512 }, { 4, 322, 512 }, { 5, 323, 512 }, { 4, 324, 512 }, { 5, 325, 512 }, { 5, 326, 512 }, { 6, 327, 512 },
  10229. { 4, 328, 512 }, { 5, 329, 512 }, { 5, 330, 512 }, { 6, 331, 512 }, { 5, 332, 512 }, { 6, 333, 512 }, { 6, 334, 512 }, { 7, 335, 512 },
  10230. { 4, 336, 512 }, { 5, 337, 512 }, { 5, 338, 512 }, { 6, 339, 512 }, { 5, 340, 512 }, { 6, 341, 512 }, { 6, 342, 512 }, { 7, 343, 512 },
  10231. { 5, 344, 512 }, { 6, 345, 512 }, { 6, 346, 512 }, { 7, 347, 512 }, { 6, 348, 512 }, { 7, 349, 512 }, { 7, 350, 512 }, { 8, 351, 512 },
  10232. { 4, 352, 512 }, { 5, 353, 512 }, { 5, 354, 512 }, { 6, 355, 512 }, { 5, 356, 512 }, { 6, 357, 512 }, { 6, 358, 512 }, { 7, 359, 512 },
  10233. { 5, 360, 512 }, { 6, 361, 512 }, { 6, 362, 512 }, { 7, 363, 512 }, { 6, 364, 512 }, { 7, 365, 512 }, { 7, 366, 512 }, { 8, 367, 512 },
  10234. { 5, 368, 512 }, { 6, 369, 512 }, { 6, 370, 512 }, { 7, 371, 512 }, { 6, 372, 512 }, { 7, 373, 512 }, { 7, 374, 512 }, { 8, 375, 512 },
  10235. { 6, 376, 512 }, { 7, 377, 512 }, { 7, 378, 512 }, { 8, 379, 512 }, { 7, 380, 512 }, { 8, 381, 512 }, { 8, 382, 512 }, { 9, 383, 512 },
  10236. { 3, 384, 512 }, { 4, 385, 512 }, { 4, 386, 512 }, { 5, 387, 512 }, { 4, 388, 512 }, { 5, 389, 512 }, { 5, 390, 512 }, { 6, 391, 512 },
  10237. { 4, 392, 512 }, { 5, 393, 512 }, { 5, 394, 512 }, { 6, 395, 512 }, { 5, 396, 512 }, { 6, 397, 512 }, { 6, 398, 512 }, { 7, 399, 512 },
  10238. { 4, 400, 512 }, { 5, 401, 512 }, { 5, 402, 512 }, { 6, 403, 512 }, { 5, 404, 512 }, { 6, 405, 512 }, { 6, 406, 512 }, { 7, 407, 512 },
  10239. { 5, 408, 512 }, { 6, 409, 512 }, { 6, 410, 512 }, { 7, 411, 512 }, { 6, 412, 512 }, { 7, 413, 512 }, { 7, 414, 512 }, { 8, 415, 512 },
  10240. { 4, 416, 512 }, { 5, 417, 512 }, { 5, 418, 512 }, { 6, 419, 512 }, { 5, 420, 512 }, { 6, 421, 512 }, { 6, 422, 512 }, { 7, 423, 512 },
  10241. { 5, 424, 512 }, { 6, 425, 512 }, { 6, 426, 512 }, { 7, 427, 512 }, { 6, 428, 512 }, { 7, 429, 512 }, { 7, 430, 512 }, { 8, 431, 512 },
  10242. { 5, 432, 512 }, { 6, 433, 512 }, { 6, 434, 512 }, { 7, 435, 512 }, { 6, 436, 512 }, { 7, 437, 512 }, { 7, 438, 512 }, { 8, 439, 512 },
  10243. { 6, 440, 512 }, { 7, 441, 512 }, { 7, 442, 512 }, { 8, 443, 512 }, { 7, 444, 512 }, { 8, 445, 512 }, { 8, 446, 512 }, { 9, 447, 512 },
  10244. { 4, 448, 512 }, { 5, 449, 512 }, { 5, 450, 512 }, { 6, 451, 512 }, { 5, 452, 512 }, { 6, 453, 512 }, { 6, 454, 512 }, { 7, 455, 512 },
  10245. { 5, 456, 512 }, { 6, 457, 512 }, { 6, 458, 512 }, { 7, 459, 512 }, { 6, 460, 512 }, { 7, 461, 512 }, { 7, 462, 512 }, { 8, 463, 512 },
  10246. { 5, 464, 512 }, { 6, 465, 512 }, { 6, 466, 512 }, { 7, 467, 512 }, { 6, 468, 512 }, { 7, 469, 512 }, { 7, 470, 512 }, { 8, 471, 512 },
  10247. { 6, 472, 512 }, { 7, 473, 512 }, { 7, 474, 512 }, { 8, 475, 512 }, { 7, 476, 512 }, { 8, 477, 512 }, { 8, 478, 512 }, { 9, 479, 512 },
  10248. { 5, 480, 512 }, { 6, 481, 512 }, { 6, 482, 512 }, { 7, 483, 512 }, { 6, 484, 512 }, { 7, 485, 512 }, { 7, 486, 512 }, { 8, 487, 512 },
  10249. { 6, 488, 512 }, { 7, 489, 512 }, { 7, 490, 512 }, { 8, 491, 512 }, { 7, 492, 512 }, { 8, 493, 512 }, { 8, 494, 512 }, { 9, 495, 512 },
  10250. { 6, 496, 512 }, { 7, 497, 512 }, { 7, 498, 512 }, { 8, 499, 512 }, { 7, 500, 512 }, { 8, 501, 512 }, { 8, 502, 512 }, { 9, 503, 512 },
  10251. { 7, 504, 512 }, { 8, 505, 512 }, { 8, 506, 512 }, { 9, 507, 512 }, { 8, 508, 512 }, { 9, 509, 512 }, { 9, 510, 512 }, { 10, 511, 512 },
  10252. #if FP_LUT > 10
  10253. { 1, 0, 0 }, { 2, 1, 1024 }, { 2, 2, 1024 }, { 3, 3, 1024 }, { 2, 4, 1024 }, { 3, 5, 1024 }, { 3, 6, 1024 }, { 4, 7, 1024 },
  10254. { 2, 8, 1024 }, { 3, 9, 1024 }, { 3, 10, 1024 }, { 4, 11, 1024 }, { 3, 12, 1024 }, { 4, 13, 1024 }, { 4, 14, 1024 }, { 5, 15, 1024 },
  10255. { 2, 16, 1024 }, { 3, 17, 1024 }, { 3, 18, 1024 }, { 4, 19, 1024 }, { 3, 20, 1024 }, { 4, 21, 1024 }, { 4, 22, 1024 }, { 5, 23, 1024 },
  10256. { 3, 24, 1024 }, { 4, 25, 1024 }, { 4, 26, 1024 }, { 5, 27, 1024 }, { 4, 28, 1024 }, { 5, 29, 1024 }, { 5, 30, 1024 }, { 6, 31, 1024 },
  10257. { 2, 32, 1024 }, { 3, 33, 1024 }, { 3, 34, 1024 }, { 4, 35, 1024 }, { 3, 36, 1024 }, { 4, 37, 1024 }, { 4, 38, 1024 }, { 5, 39, 1024 },
  10258. { 3, 40, 1024 }, { 4, 41, 1024 }, { 4, 42, 1024 }, { 5, 43, 1024 }, { 4, 44, 1024 }, { 5, 45, 1024 }, { 5, 46, 1024 }, { 6, 47, 1024 },
  10259. { 3, 48, 1024 }, { 4, 49, 1024 }, { 4, 50, 1024 }, { 5, 51, 1024 }, { 4, 52, 1024 }, { 5, 53, 1024 }, { 5, 54, 1024 }, { 6, 55, 1024 },
  10260. { 4, 56, 1024 }, { 5, 57, 1024 }, { 5, 58, 1024 }, { 6, 59, 1024 }, { 5, 60, 1024 }, { 6, 61, 1024 }, { 6, 62, 1024 }, { 7, 63, 1024 },
  10261. { 2, 64, 1024 }, { 3, 65, 1024 }, { 3, 66, 1024 }, { 4, 67, 1024 }, { 3, 68, 1024 }, { 4, 69, 1024 }, { 4, 70, 1024 }, { 5, 71, 1024 },
  10262. { 3, 72, 1024 }, { 4, 73, 1024 }, { 4, 74, 1024 }, { 5, 75, 1024 }, { 4, 76, 1024 }, { 5, 77, 1024 }, { 5, 78, 1024 }, { 6, 79, 1024 },
  10263. { 3, 80, 1024 }, { 4, 81, 1024 }, { 4, 82, 1024 }, { 5, 83, 1024 }, { 4, 84, 1024 }, { 5, 85, 1024 }, { 5, 86, 1024 }, { 6, 87, 1024 },
  10264. { 4, 88, 1024 }, { 5, 89, 1024 }, { 5, 90, 1024 }, { 6, 91, 1024 }, { 5, 92, 1024 }, { 6, 93, 1024 }, { 6, 94, 1024 }, { 7, 95, 1024 },
  10265. { 3, 96, 1024 }, { 4, 97, 1024 }, { 4, 98, 1024 }, { 5, 99, 1024 }, { 4, 100, 1024 }, { 5, 101, 1024 }, { 5, 102, 1024 }, { 6, 103, 1024 },
  10266. { 4, 104, 1024 }, { 5, 105, 1024 }, { 5, 106, 1024 }, { 6, 107, 1024 }, { 5, 108, 1024 }, { 6, 109, 1024 }, { 6, 110, 1024 }, { 7, 111, 1024 },
  10267. { 4, 112, 1024 }, { 5, 113, 1024 }, { 5, 114, 1024 }, { 6, 115, 1024 }, { 5, 116, 1024 }, { 6, 117, 1024 }, { 6, 118, 1024 }, { 7, 119, 1024 },
  10268. { 5, 120, 1024 }, { 6, 121, 1024 }, { 6, 122, 1024 }, { 7, 123, 1024 }, { 6, 124, 1024 }, { 7, 125, 1024 }, { 7, 126, 1024 }, { 8, 127, 1024 },
  10269. { 2, 128, 1024 }, { 3, 129, 1024 }, { 3, 130, 1024 }, { 4, 131, 1024 }, { 3, 132, 1024 }, { 4, 133, 1024 }, { 4, 134, 1024 }, { 5, 135, 1024 },
  10270. { 3, 136, 1024 }, { 4, 137, 1024 }, { 4, 138, 1024 }, { 5, 139, 1024 }, { 4, 140, 1024 }, { 5, 141, 1024 }, { 5, 142, 1024 }, { 6, 143, 1024 },
  10271. { 3, 144, 1024 }, { 4, 145, 1024 }, { 4, 146, 1024 }, { 5, 147, 1024 }, { 4, 148, 1024 }, { 5, 149, 1024 }, { 5, 150, 1024 }, { 6, 151, 1024 },
  10272. { 4, 152, 1024 }, { 5, 153, 1024 }, { 5, 154, 1024 }, { 6, 155, 1024 }, { 5, 156, 1024 }, { 6, 157, 1024 }, { 6, 158, 1024 }, { 7, 159, 1024 },
  10273. { 3, 160, 1024 }, { 4, 161, 1024 }, { 4, 162, 1024 }, { 5, 163, 1024 }, { 4, 164, 1024 }, { 5, 165, 1024 }, { 5, 166, 1024 }, { 6, 167, 1024 },
  10274. { 4, 168, 1024 }, { 5, 169, 1024 }, { 5, 170, 1024 }, { 6, 171, 1024 }, { 5, 172, 1024 }, { 6, 173, 1024 }, { 6, 174, 1024 }, { 7, 175, 1024 },
  10275. { 4, 176, 1024 }, { 5, 177, 1024 }, { 5, 178, 1024 }, { 6, 179, 1024 }, { 5, 180, 1024 }, { 6, 181, 1024 }, { 6, 182, 1024 }, { 7, 183, 1024 },
  10276. { 5, 184, 1024 }, { 6, 185, 1024 }, { 6, 186, 1024 }, { 7, 187, 1024 }, { 6, 188, 1024 }, { 7, 189, 1024 }, { 7, 190, 1024 }, { 8, 191, 1024 },
  10277. { 3, 192, 1024 }, { 4, 193, 1024 }, { 4, 194, 1024 }, { 5, 195, 1024 }, { 4, 196, 1024 }, { 5, 197, 1024 }, { 5, 198, 1024 }, { 6, 199, 1024 },
  10278. { 4, 200, 1024 }, { 5, 201, 1024 }, { 5, 202, 1024 }, { 6, 203, 1024 }, { 5, 204, 1024 }, { 6, 205, 1024 }, { 6, 206, 1024 }, { 7, 207, 1024 },
  10279. { 4, 208, 1024 }, { 5, 209, 1024 }, { 5, 210, 1024 }, { 6, 211, 1024 }, { 5, 212, 1024 }, { 6, 213, 1024 }, { 6, 214, 1024 }, { 7, 215, 1024 },
  10280. { 5, 216, 1024 }, { 6, 217, 1024 }, { 6, 218, 1024 }, { 7, 219, 1024 }, { 6, 220, 1024 }, { 7, 221, 1024 }, { 7, 222, 1024 }, { 8, 223, 1024 },
  10281. { 4, 224, 1024 }, { 5, 225, 1024 }, { 5, 226, 1024 }, { 6, 227, 1024 }, { 5, 228, 1024 }, { 6, 229, 1024 }, { 6, 230, 1024 }, { 7, 231, 1024 },
  10282. { 5, 232, 1024 }, { 6, 233, 1024 }, { 6, 234, 1024 }, { 7, 235, 1024 }, { 6, 236, 1024 }, { 7, 237, 1024 }, { 7, 238, 1024 }, { 8, 239, 1024 },
  10283. { 5, 240, 1024 }, { 6, 241, 1024 }, { 6, 242, 1024 }, { 7, 243, 1024 }, { 6, 244, 1024 }, { 7, 245, 1024 }, { 7, 246, 1024 }, { 8, 247, 1024 },
  10284. { 6, 248, 1024 }, { 7, 249, 1024 }, { 7, 250, 1024 }, { 8, 251, 1024 }, { 7, 252, 1024 }, { 8, 253, 1024 }, { 8, 254, 1024 }, { 9, 255, 1024 },
  10285. { 2, 256, 1024 }, { 3, 257, 1024 }, { 3, 258, 1024 }, { 4, 259, 1024 }, { 3, 260, 1024 }, { 4, 261, 1024 }, { 4, 262, 1024 }, { 5, 263, 1024 },
  10286. { 3, 264, 1024 }, { 4, 265, 1024 }, { 4, 266, 1024 }, { 5, 267, 1024 }, { 4, 268, 1024 }, { 5, 269, 1024 }, { 5, 270, 1024 }, { 6, 271, 1024 },
  10287. { 3, 272, 1024 }, { 4, 273, 1024 }, { 4, 274, 1024 }, { 5, 275, 1024 }, { 4, 276, 1024 }, { 5, 277, 1024 }, { 5, 278, 1024 }, { 6, 279, 1024 },
  10288. { 4, 280, 1024 }, { 5, 281, 1024 }, { 5, 282, 1024 }, { 6, 283, 1024 }, { 5, 284, 1024 }, { 6, 285, 1024 }, { 6, 286, 1024 }, { 7, 287, 1024 },
  10289. { 3, 288, 1024 }, { 4, 289, 1024 }, { 4, 290, 1024 }, { 5, 291, 1024 }, { 4, 292, 1024 }, { 5, 293, 1024 }, { 5, 294, 1024 }, { 6, 295, 1024 },
  10290. { 4, 296, 1024 }, { 5, 297, 1024 }, { 5, 298, 1024 }, { 6, 299, 1024 }, { 5, 300, 1024 }, { 6, 301, 1024 }, { 6, 302, 1024 }, { 7, 303, 1024 },
  10291. { 4, 304, 1024 }, { 5, 305, 1024 }, { 5, 306, 1024 }, { 6, 307, 1024 }, { 5, 308, 1024 }, { 6, 309, 1024 }, { 6, 310, 1024 }, { 7, 311, 1024 },
  10292. { 5, 312, 1024 }, { 6, 313, 1024 }, { 6, 314, 1024 }, { 7, 315, 1024 }, { 6, 316, 1024 }, { 7, 317, 1024 }, { 7, 318, 1024 }, { 8, 319, 1024 },
  10293. { 3, 320, 1024 }, { 4, 321, 1024 }, { 4, 322, 1024 }, { 5, 323, 1024 }, { 4, 324, 1024 }, { 5, 325, 1024 }, { 5, 326, 1024 }, { 6, 327, 1024 },
  10294. { 4, 328, 1024 }, { 5, 329, 1024 }, { 5, 330, 1024 }, { 6, 331, 1024 }, { 5, 332, 1024 }, { 6, 333, 1024 }, { 6, 334, 1024 }, { 7, 335, 1024 },
  10295. { 4, 336, 1024 }, { 5, 337, 1024 }, { 5, 338, 1024 }, { 6, 339, 1024 }, { 5, 340, 1024 }, { 6, 341, 1024 }, { 6, 342, 1024 }, { 7, 343, 1024 },
  10296. { 5, 344, 1024 }, { 6, 345, 1024 }, { 6, 346, 1024 }, { 7, 347, 1024 }, { 6, 348, 1024 }, { 7, 349, 1024 }, { 7, 350, 1024 }, { 8, 351, 1024 },
  10297. { 4, 352, 1024 }, { 5, 353, 1024 }, { 5, 354, 1024 }, { 6, 355, 1024 }, { 5, 356, 1024 }, { 6, 357, 1024 }, { 6, 358, 1024 }, { 7, 359, 1024 },
  10298. { 5, 360, 1024 }, { 6, 361, 1024 }, { 6, 362, 1024 }, { 7, 363, 1024 }, { 6, 364, 1024 }, { 7, 365, 1024 }, { 7, 366, 1024 }, { 8, 367, 1024 },
  10299. { 5, 368, 1024 }, { 6, 369, 1024 }, { 6, 370, 1024 }, { 7, 371, 1024 }, { 6, 372, 1024 }, { 7, 373, 1024 }, { 7, 374, 1024 }, { 8, 375, 1024 },
  10300. { 6, 376, 1024 }, { 7, 377, 1024 }, { 7, 378, 1024 }, { 8, 379, 1024 }, { 7, 380, 1024 }, { 8, 381, 1024 }, { 8, 382, 1024 }, { 9, 383, 1024 },
  10301. { 3, 384, 1024 }, { 4, 385, 1024 }, { 4, 386, 1024 }, { 5, 387, 1024 }, { 4, 388, 1024 }, { 5, 389, 1024 }, { 5, 390, 1024 }, { 6, 391, 1024 },
  10302. { 4, 392, 1024 }, { 5, 393, 1024 }, { 5, 394, 1024 }, { 6, 395, 1024 }, { 5, 396, 1024 }, { 6, 397, 1024 }, { 6, 398, 1024 }, { 7, 399, 1024 },
  10303. { 4, 400, 1024 }, { 5, 401, 1024 }, { 5, 402, 1024 }, { 6, 403, 1024 }, { 5, 404, 1024 }, { 6, 405, 1024 }, { 6, 406, 1024 }, { 7, 407, 1024 },
  10304. { 5, 408, 1024 }, { 6, 409, 1024 }, { 6, 410, 1024 }, { 7, 411, 1024 }, { 6, 412, 1024 }, { 7, 413, 1024 }, { 7, 414, 1024 }, { 8, 415, 1024 },
  10305. { 4, 416, 1024 }, { 5, 417, 1024 }, { 5, 418, 1024 }, { 6, 419, 1024 }, { 5, 420, 1024 }, { 6, 421, 1024 }, { 6, 422, 1024 }, { 7, 423, 1024 },
  10306. { 5, 424, 1024 }, { 6, 425, 1024 }, { 6, 426, 1024 }, { 7, 427, 1024 }, { 6, 428, 1024 }, { 7, 429, 1024 }, { 7, 430, 1024 }, { 8, 431, 1024 },
  10307. { 5, 432, 1024 }, { 6, 433, 1024 }, { 6, 434, 1024 }, { 7, 435, 1024 }, { 6, 436, 1024 }, { 7, 437, 1024 }, { 7, 438, 1024 }, { 8, 439, 1024 },
  10308. { 6, 440, 1024 }, { 7, 441, 1024 }, { 7, 442, 1024 }, { 8, 443, 1024 }, { 7, 444, 1024 }, { 8, 445, 1024 }, { 8, 446, 1024 }, { 9, 447, 1024 },
  10309. { 4, 448, 1024 }, { 5, 449, 1024 }, { 5, 450, 1024 }, { 6, 451, 1024 }, { 5, 452, 1024 }, { 6, 453, 1024 }, { 6, 454, 1024 }, { 7, 455, 1024 },
  10310. { 5, 456, 1024 }, { 6, 457, 1024 }, { 6, 458, 1024 }, { 7, 459, 1024 }, { 6, 460, 1024 }, { 7, 461, 1024 }, { 7, 462, 1024 }, { 8, 463, 1024 },
  10311. { 5, 464, 1024 }, { 6, 465, 1024 }, { 6, 466, 1024 }, { 7, 467, 1024 }, { 6, 468, 1024 }, { 7, 469, 1024 }, { 7, 470, 1024 }, { 8, 471, 1024 },
  10312. { 6, 472, 1024 }, { 7, 473, 1024 }, { 7, 474, 1024 }, { 8, 475, 1024 }, { 7, 476, 1024 }, { 8, 477, 1024 }, { 8, 478, 1024 }, { 9, 479, 1024 },
  10313. { 5, 480, 1024 }, { 6, 481, 1024 }, { 6, 482, 1024 }, { 7, 483, 1024 }, { 6, 484, 1024 }, { 7, 485, 1024 }, { 7, 486, 1024 }, { 8, 487, 1024 },
  10314. { 6, 488, 1024 }, { 7, 489, 1024 }, { 7, 490, 1024 }, { 8, 491, 1024 }, { 7, 492, 1024 }, { 8, 493, 1024 }, { 8, 494, 1024 }, { 9, 495, 1024 },
  10315. { 6, 496, 1024 }, { 7, 497, 1024 }, { 7, 498, 1024 }, { 8, 499, 1024 }, { 7, 500, 1024 }, { 8, 501, 1024 }, { 8, 502, 1024 }, { 9, 503, 1024 },
  10316. { 7, 504, 1024 }, { 8, 505, 1024 }, { 8, 506, 1024 }, { 9, 507, 1024 }, { 8, 508, 1024 }, { 9, 509, 1024 }, { 9, 510, 1024 }, { 10, 511, 1024 },
  10317. { 2, 512, 1024 }, { 3, 513, 1024 }, { 3, 514, 1024 }, { 4, 515, 1024 }, { 3, 516, 1024 }, { 4, 517, 1024 }, { 4, 518, 1024 }, { 5, 519, 1024 },
  10318. { 3, 520, 1024 }, { 4, 521, 1024 }, { 4, 522, 1024 }, { 5, 523, 1024 }, { 4, 524, 1024 }, { 5, 525, 1024 }, { 5, 526, 1024 }, { 6, 527, 1024 },
  10319. { 3, 528, 1024 }, { 4, 529, 1024 }, { 4, 530, 1024 }, { 5, 531, 1024 }, { 4, 532, 1024 }, { 5, 533, 1024 }, { 5, 534, 1024 }, { 6, 535, 1024 },
  10320. { 4, 536, 1024 }, { 5, 537, 1024 }, { 5, 538, 1024 }, { 6, 539, 1024 }, { 5, 540, 1024 }, { 6, 541, 1024 }, { 6, 542, 1024 }, { 7, 543, 1024 },
  10321. { 3, 544, 1024 }, { 4, 545, 1024 }, { 4, 546, 1024 }, { 5, 547, 1024 }, { 4, 548, 1024 }, { 5, 549, 1024 }, { 5, 550, 1024 }, { 6, 551, 1024 },
  10322. { 4, 552, 1024 }, { 5, 553, 1024 }, { 5, 554, 1024 }, { 6, 555, 1024 }, { 5, 556, 1024 }, { 6, 557, 1024 }, { 6, 558, 1024 }, { 7, 559, 1024 },
  10323. { 4, 560, 1024 }, { 5, 561, 1024 }, { 5, 562, 1024 }, { 6, 563, 1024 }, { 5, 564, 1024 }, { 6, 565, 1024 }, { 6, 566, 1024 }, { 7, 567, 1024 },
  10324. { 5, 568, 1024 }, { 6, 569, 1024 }, { 6, 570, 1024 }, { 7, 571, 1024 }, { 6, 572, 1024 }, { 7, 573, 1024 }, { 7, 574, 1024 }, { 8, 575, 1024 },
  10325. { 3, 576, 1024 }, { 4, 577, 1024 }, { 4, 578, 1024 }, { 5, 579, 1024 }, { 4, 580, 1024 }, { 5, 581, 1024 }, { 5, 582, 1024 }, { 6, 583, 1024 },
  10326. { 4, 584, 1024 }, { 5, 585, 1024 }, { 5, 586, 1024 }, { 6, 587, 1024 }, { 5, 588, 1024 }, { 6, 589, 1024 }, { 6, 590, 1024 }, { 7, 591, 1024 },
  10327. { 4, 592, 1024 }, { 5, 593, 1024 }, { 5, 594, 1024 }, { 6, 595, 1024 }, { 5, 596, 1024 }, { 6, 597, 1024 }, { 6, 598, 1024 }, { 7, 599, 1024 },
  10328. { 5, 600, 1024 }, { 6, 601, 1024 }, { 6, 602, 1024 }, { 7, 603, 1024 }, { 6, 604, 1024 }, { 7, 605, 1024 }, { 7, 606, 1024 }, { 8, 607, 1024 },
  10329. { 4, 608, 1024 }, { 5, 609, 1024 }, { 5, 610, 1024 }, { 6, 611, 1024 }, { 5, 612, 1024 }, { 6, 613, 1024 }, { 6, 614, 1024 }, { 7, 615, 1024 },
  10330. { 5, 616, 1024 }, { 6, 617, 1024 }, { 6, 618, 1024 }, { 7, 619, 1024 }, { 6, 620, 1024 }, { 7, 621, 1024 }, { 7, 622, 1024 }, { 8, 623, 1024 },
  10331. { 5, 624, 1024 }, { 6, 625, 1024 }, { 6, 626, 1024 }, { 7, 627, 1024 }, { 6, 628, 1024 }, { 7, 629, 1024 }, { 7, 630, 1024 }, { 8, 631, 1024 },
  10332. { 6, 632, 1024 }, { 7, 633, 1024 }, { 7, 634, 1024 }, { 8, 635, 1024 }, { 7, 636, 1024 }, { 8, 637, 1024 }, { 8, 638, 1024 }, { 9, 639, 1024 },
  10333. { 3, 640, 1024 }, { 4, 641, 1024 }, { 4, 642, 1024 }, { 5, 643, 1024 }, { 4, 644, 1024 }, { 5, 645, 1024 }, { 5, 646, 1024 }, { 6, 647, 1024 },
  10334. { 4, 648, 1024 }, { 5, 649, 1024 }, { 5, 650, 1024 }, { 6, 651, 1024 }, { 5, 652, 1024 }, { 6, 653, 1024 }, { 6, 654, 1024 }, { 7, 655, 1024 },
  10335. { 4, 656, 1024 }, { 5, 657, 1024 }, { 5, 658, 1024 }, { 6, 659, 1024 }, { 5, 660, 1024 }, { 6, 661, 1024 }, { 6, 662, 1024 }, { 7, 663, 1024 },
  10336. { 5, 664, 1024 }, { 6, 665, 1024 }, { 6, 666, 1024 }, { 7, 667, 1024 }, { 6, 668, 1024 }, { 7, 669, 1024 }, { 7, 670, 1024 }, { 8, 671, 1024 },
  10337. { 4, 672, 1024 }, { 5, 673, 1024 }, { 5, 674, 1024 }, { 6, 675, 1024 }, { 5, 676, 1024 }, { 6, 677, 1024 }, { 6, 678, 1024 }, { 7, 679, 1024 },
  10338. { 5, 680, 1024 }, { 6, 681, 1024 }, { 6, 682, 1024 }, { 7, 683, 1024 }, { 6, 684, 1024 }, { 7, 685, 1024 }, { 7, 686, 1024 }, { 8, 687, 1024 },
  10339. { 5, 688, 1024 }, { 6, 689, 1024 }, { 6, 690, 1024 }, { 7, 691, 1024 }, { 6, 692, 1024 }, { 7, 693, 1024 }, { 7, 694, 1024 }, { 8, 695, 1024 },
  10340. { 6, 696, 1024 }, { 7, 697, 1024 }, { 7, 698, 1024 }, { 8, 699, 1024 }, { 7, 700, 1024 }, { 8, 701, 1024 }, { 8, 702, 1024 }, { 9, 703, 1024 },
  10341. { 4, 704, 1024 }, { 5, 705, 1024 }, { 5, 706, 1024 }, { 6, 707, 1024 }, { 5, 708, 1024 }, { 6, 709, 1024 }, { 6, 710, 1024 }, { 7, 711, 1024 },
  10342. { 5, 712, 1024 }, { 6, 713, 1024 }, { 6, 714, 1024 }, { 7, 715, 1024 }, { 6, 716, 1024 }, { 7, 717, 1024 }, { 7, 718, 1024 }, { 8, 719, 1024 },
  10343. { 5, 720, 1024 }, { 6, 721, 1024 }, { 6, 722, 1024 }, { 7, 723, 1024 }, { 6, 724, 1024 }, { 7, 725, 1024 }, { 7, 726, 1024 }, { 8, 727, 1024 },
  10344. { 6, 728, 1024 }, { 7, 729, 1024 }, { 7, 730, 1024 }, { 8, 731, 1024 }, { 7, 732, 1024 }, { 8, 733, 1024 }, { 8, 734, 1024 }, { 9, 735, 1024 },
  10345. { 5, 736, 1024 }, { 6, 737, 1024 }, { 6, 738, 1024 }, { 7, 739, 1024 }, { 6, 740, 1024 }, { 7, 741, 1024 }, { 7, 742, 1024 }, { 8, 743, 1024 },
  10346. { 6, 744, 1024 }, { 7, 745, 1024 }, { 7, 746, 1024 }, { 8, 747, 1024 }, { 7, 748, 1024 }, { 8, 749, 1024 }, { 8, 750, 1024 }, { 9, 751, 1024 },
  10347. { 6, 752, 1024 }, { 7, 753, 1024 }, { 7, 754, 1024 }, { 8, 755, 1024 }, { 7, 756, 1024 }, { 8, 757, 1024 }, { 8, 758, 1024 }, { 9, 759, 1024 },
  10348. { 7, 760, 1024 }, { 8, 761, 1024 }, { 8, 762, 1024 }, { 9, 763, 1024 }, { 8, 764, 1024 }, { 9, 765, 1024 }, { 9, 766, 1024 }, { 10, 767, 1024 },
  10349. { 3, 768, 1024 }, { 4, 769, 1024 }, { 4, 770, 1024 }, { 5, 771, 1024 }, { 4, 772, 1024 }, { 5, 773, 1024 }, { 5, 774, 1024 }, { 6, 775, 1024 },
  10350. { 4, 776, 1024 }, { 5, 777, 1024 }, { 5, 778, 1024 }, { 6, 779, 1024 }, { 5, 780, 1024 }, { 6, 781, 1024 }, { 6, 782, 1024 }, { 7, 783, 1024 },
  10351. { 4, 784, 1024 }, { 5, 785, 1024 }, { 5, 786, 1024 }, { 6, 787, 1024 }, { 5, 788, 1024 }, { 6, 789, 1024 }, { 6, 790, 1024 }, { 7, 791, 1024 },
  10352. { 5, 792, 1024 }, { 6, 793, 1024 }, { 6, 794, 1024 }, { 7, 795, 1024 }, { 6, 796, 1024 }, { 7, 797, 1024 }, { 7, 798, 1024 }, { 8, 799, 1024 },
  10353. { 4, 800, 1024 }, { 5, 801, 1024 }, { 5, 802, 1024 }, { 6, 803, 1024 }, { 5, 804, 1024 }, { 6, 805, 1024 }, { 6, 806, 1024 }, { 7, 807, 1024 },
  10354. { 5, 808, 1024 }, { 6, 809, 1024 }, { 6, 810, 1024 }, { 7, 811, 1024 }, { 6, 812, 1024 }, { 7, 813, 1024 }, { 7, 814, 1024 }, { 8, 815, 1024 },
  10355. { 5, 816, 1024 }, { 6, 817, 1024 }, { 6, 818, 1024 }, { 7, 819, 1024 }, { 6, 820, 1024 }, { 7, 821, 1024 }, { 7, 822, 1024 }, { 8, 823, 1024 },
  10356. { 6, 824, 1024 }, { 7, 825, 1024 }, { 7, 826, 1024 }, { 8, 827, 1024 }, { 7, 828, 1024 }, { 8, 829, 1024 }, { 8, 830, 1024 }, { 9, 831, 1024 },
  10357. { 4, 832, 1024 }, { 5, 833, 1024 }, { 5, 834, 1024 }, { 6, 835, 1024 }, { 5, 836, 1024 }, { 6, 837, 1024 }, { 6, 838, 1024 }, { 7, 839, 1024 },
  10358. { 5, 840, 1024 }, { 6, 841, 1024 }, { 6, 842, 1024 }, { 7, 843, 1024 }, { 6, 844, 1024 }, { 7, 845, 1024 }, { 7, 846, 1024 }, { 8, 847, 1024 },
  10359. { 5, 848, 1024 }, { 6, 849, 1024 }, { 6, 850, 1024 }, { 7, 851, 1024 }, { 6, 852, 1024 }, { 7, 853, 1024 }, { 7, 854, 1024 }, { 8, 855, 1024 },
  10360. { 6, 856, 1024 }, { 7, 857, 1024 }, { 7, 858, 1024 }, { 8, 859, 1024 }, { 7, 860, 1024 }, { 8, 861, 1024 }, { 8, 862, 1024 }, { 9, 863, 1024 },
  10361. { 5, 864, 1024 }, { 6, 865, 1024 }, { 6, 866, 1024 }, { 7, 867, 1024 }, { 6, 868, 1024 }, { 7, 869, 1024 }, { 7, 870, 1024 }, { 8, 871, 1024 },
  10362. { 6, 872, 1024 }, { 7, 873, 1024 }, { 7, 874, 1024 }, { 8, 875, 1024 }, { 7, 876, 1024 }, { 8, 877, 1024 }, { 8, 878, 1024 }, { 9, 879, 1024 },
  10363. { 6, 880, 1024 }, { 7, 881, 1024 }, { 7, 882, 1024 }, { 8, 883, 1024 }, { 7, 884, 1024 }, { 8, 885, 1024 }, { 8, 886, 1024 }, { 9, 887, 1024 },
  10364. { 7, 888, 1024 }, { 8, 889, 1024 }, { 8, 890, 1024 }, { 9, 891, 1024 }, { 8, 892, 1024 }, { 9, 893, 1024 }, { 9, 894, 1024 }, { 10, 895, 1024 },
  10365. { 4, 896, 1024 }, { 5, 897, 1024 }, { 5, 898, 1024 }, { 6, 899, 1024 }, { 5, 900, 1024 }, { 6, 901, 1024 }, { 6, 902, 1024 }, { 7, 903, 1024 },
  10366. { 5, 904, 1024 }, { 6, 905, 1024 }, { 6, 906, 1024 }, { 7, 907, 1024 }, { 6, 908, 1024 }, { 7, 909, 1024 }, { 7, 910, 1024 }, { 8, 911, 1024 },
  10367. { 5, 912, 1024 }, { 6, 913, 1024 }, { 6, 914, 1024 }, { 7, 915, 1024 }, { 6, 916, 1024 }, { 7, 917, 1024 }, { 7, 918, 1024 }, { 8, 919, 1024 },
  10368. { 6, 920, 1024 }, { 7, 921, 1024 }, { 7, 922, 1024 }, { 8, 923, 1024 }, { 7, 924, 1024 }, { 8, 925, 1024 }, { 8, 926, 1024 }, { 9, 927, 1024 },
  10369. { 5, 928, 1024 }, { 6, 929, 1024 }, { 6, 930, 1024 }, { 7, 931, 1024 }, { 6, 932, 1024 }, { 7, 933, 1024 }, { 7, 934, 1024 }, { 8, 935, 1024 },
  10370. { 6, 936, 1024 }, { 7, 937, 1024 }, { 7, 938, 1024 }, { 8, 939, 1024 }, { 7, 940, 1024 }, { 8, 941, 1024 }, { 8, 942, 1024 }, { 9, 943, 1024 },
  10371. { 6, 944, 1024 }, { 7, 945, 1024 }, { 7, 946, 1024 }, { 8, 947, 1024 }, { 7, 948, 1024 }, { 8, 949, 1024 }, { 8, 950, 1024 }, { 9, 951, 1024 },
  10372. { 7, 952, 1024 }, { 8, 953, 1024 }, { 8, 954, 1024 }, { 9, 955, 1024 }, { 8, 956, 1024 }, { 9, 957, 1024 }, { 9, 958, 1024 }, { 10, 959, 1024 },
  10373. { 5, 960, 1024 }, { 6, 961, 1024 }, { 6, 962, 1024 }, { 7, 963, 1024 }, { 6, 964, 1024 }, { 7, 965, 1024 }, { 7, 966, 1024 }, { 8, 967, 1024 },
  10374. { 6, 968, 1024 }, { 7, 969, 1024 }, { 7, 970, 1024 }, { 8, 971, 1024 }, { 7, 972, 1024 }, { 8, 973, 1024 }, { 8, 974, 1024 }, { 9, 975, 1024 },
  10375. { 6, 976, 1024 }, { 7, 977, 1024 }, { 7, 978, 1024 }, { 8, 979, 1024 }, { 7, 980, 1024 }, { 8, 981, 1024 }, { 8, 982, 1024 }, { 9, 983, 1024 },
  10376. { 7, 984, 1024 }, { 8, 985, 1024 }, { 8, 986, 1024 }, { 9, 987, 1024 }, { 8, 988, 1024 }, { 9, 989, 1024 }, { 9, 990, 1024 }, { 10, 991, 1024 },
  10377. { 6, 992, 1024 }, { 7, 993, 1024 }, { 7, 994, 1024 }, { 8, 995, 1024 }, { 7, 996, 1024 }, { 8, 997, 1024 }, { 8, 998, 1024 }, { 9, 999, 1024 },
  10378. { 7, 1000, 1024 }, { 8, 1001, 1024 }, { 8, 1002, 1024 }, { 9, 1003, 1024 }, { 8, 1004, 1024 }, { 9, 1005, 1024 }, { 9, 1006, 1024 }, { 10, 1007, 1024 },
  10379. { 7, 1008, 1024 }, { 8, 1009, 1024 }, { 8, 1010, 1024 }, { 9, 1011, 1024 }, { 8, 1012, 1024 }, { 9, 1013, 1024 }, { 9, 1014, 1024 }, { 10, 1015, 1024 },
  10380. { 8, 1016, 1024 }, { 9, 1017, 1024 }, { 9, 1018, 1024 }, { 10, 1019, 1024 }, { 9, 1020, 1024 }, { 10, 1021, 1024 }, { 10, 1022, 1024 }, { 11, 1023, 1024 },
  10381. #if FP_LUT > 11
  10382. { 1, 0, 0 }, { 2, 1, 2048 }, { 2, 2, 2048 }, { 3, 3, 2048 }, { 2, 4, 2048 }, { 3, 5, 2048 }, { 3, 6, 2048 }, { 4, 7, 2048 },
  10383. { 2, 8, 2048 }, { 3, 9, 2048 }, { 3, 10, 2048 }, { 4, 11, 2048 }, { 3, 12, 2048 }, { 4, 13, 2048 }, { 4, 14, 2048 }, { 5, 15, 2048 },
  10384. { 2, 16, 2048 }, { 3, 17, 2048 }, { 3, 18, 2048 }, { 4, 19, 2048 }, { 3, 20, 2048 }, { 4, 21, 2048 }, { 4, 22, 2048 }, { 5, 23, 2048 },
  10385. { 3, 24, 2048 }, { 4, 25, 2048 }, { 4, 26, 2048 }, { 5, 27, 2048 }, { 4, 28, 2048 }, { 5, 29, 2048 }, { 5, 30, 2048 }, { 6, 31, 2048 },
  10386. { 2, 32, 2048 }, { 3, 33, 2048 }, { 3, 34, 2048 }, { 4, 35, 2048 }, { 3, 36, 2048 }, { 4, 37, 2048 }, { 4, 38, 2048 }, { 5, 39, 2048 },
  10387. { 3, 40, 2048 }, { 4, 41, 2048 }, { 4, 42, 2048 }, { 5, 43, 2048 }, { 4, 44, 2048 }, { 5, 45, 2048 }, { 5, 46, 2048 }, { 6, 47, 2048 },
  10388. { 3, 48, 2048 }, { 4, 49, 2048 }, { 4, 50, 2048 }, { 5, 51, 2048 }, { 4, 52, 2048 }, { 5, 53, 2048 }, { 5, 54, 2048 }, { 6, 55, 2048 },
  10389. { 4, 56, 2048 }, { 5, 57, 2048 }, { 5, 58, 2048 }, { 6, 59, 2048 }, { 5, 60, 2048 }, { 6, 61, 2048 }, { 6, 62, 2048 }, { 7, 63, 2048 },
  10390. { 2, 64, 2048 }, { 3, 65, 2048 }, { 3, 66, 2048 }, { 4, 67, 2048 }, { 3, 68, 2048 }, { 4, 69, 2048 }, { 4, 70, 2048 }, { 5, 71, 2048 },
  10391. { 3, 72, 2048 }, { 4, 73, 2048 }, { 4, 74, 2048 }, { 5, 75, 2048 }, { 4, 76, 2048 }, { 5, 77, 2048 }, { 5, 78, 2048 }, { 6, 79, 2048 },
  10392. { 3, 80, 2048 }, { 4, 81, 2048 }, { 4, 82, 2048 }, { 5, 83, 2048 }, { 4, 84, 2048 }, { 5, 85, 2048 }, { 5, 86, 2048 }, { 6, 87, 2048 },
  10393. { 4, 88, 2048 }, { 5, 89, 2048 }, { 5, 90, 2048 }, { 6, 91, 2048 }, { 5, 92, 2048 }, { 6, 93, 2048 }, { 6, 94, 2048 }, { 7, 95, 2048 },
  10394. { 3, 96, 2048 }, { 4, 97, 2048 }, { 4, 98, 2048 }, { 5, 99, 2048 }, { 4, 100, 2048 }, { 5, 101, 2048 }, { 5, 102, 2048 }, { 6, 103, 2048 },
  10395. { 4, 104, 2048 }, { 5, 105, 2048 }, { 5, 106, 2048 }, { 6, 107, 2048 }, { 5, 108, 2048 }, { 6, 109, 2048 }, { 6, 110, 2048 }, { 7, 111, 2048 },
  10396. { 4, 112, 2048 }, { 5, 113, 2048 }, { 5, 114, 2048 }, { 6, 115, 2048 }, { 5, 116, 2048 }, { 6, 117, 2048 }, { 6, 118, 2048 }, { 7, 119, 2048 },
  10397. { 5, 120, 2048 }, { 6, 121, 2048 }, { 6, 122, 2048 }, { 7, 123, 2048 }, { 6, 124, 2048 }, { 7, 125, 2048 }, { 7, 126, 2048 }, { 8, 127, 2048 },
  10398. { 2, 128, 2048 }, { 3, 129, 2048 }, { 3, 130, 2048 }, { 4, 131, 2048 }, { 3, 132, 2048 }, { 4, 133, 2048 }, { 4, 134, 2048 }, { 5, 135, 2048 },
  10399. { 3, 136, 2048 }, { 4, 137, 2048 }, { 4, 138, 2048 }, { 5, 139, 2048 }, { 4, 140, 2048 }, { 5, 141, 2048 }, { 5, 142, 2048 }, { 6, 143, 2048 },
  10400. { 3, 144, 2048 }, { 4, 145, 2048 }, { 4, 146, 2048 }, { 5, 147, 2048 }, { 4, 148, 2048 }, { 5, 149, 2048 }, { 5, 150, 2048 }, { 6, 151, 2048 },
  10401. { 4, 152, 2048 }, { 5, 153, 2048 }, { 5, 154, 2048 }, { 6, 155, 2048 }, { 5, 156, 2048 }, { 6, 157, 2048 }, { 6, 158, 2048 }, { 7, 159, 2048 },
  10402. { 3, 160, 2048 }, { 4, 161, 2048 }, { 4, 162, 2048 }, { 5, 163, 2048 }, { 4, 164, 2048 }, { 5, 165, 2048 }, { 5, 166, 2048 }, { 6, 167, 2048 },
  10403. { 4, 168, 2048 }, { 5, 169, 2048 }, { 5, 170, 2048 }, { 6, 171, 2048 }, { 5, 172, 2048 }, { 6, 173, 2048 }, { 6, 174, 2048 }, { 7, 175, 2048 },
  10404. { 4, 176, 2048 }, { 5, 177, 2048 }, { 5, 178, 2048 }, { 6, 179, 2048 }, { 5, 180, 2048 }, { 6, 181, 2048 }, { 6, 182, 2048 }, { 7, 183, 2048 },
  10405. { 5, 184, 2048 }, { 6, 185, 2048 }, { 6, 186, 2048 }, { 7, 187, 2048 }, { 6, 188, 2048 }, { 7, 189, 2048 }, { 7, 190, 2048 }, { 8, 191, 2048 },
  10406. { 3, 192, 2048 }, { 4, 193, 2048 }, { 4, 194, 2048 }, { 5, 195, 2048 }, { 4, 196, 2048 }, { 5, 197, 2048 }, { 5, 198, 2048 }, { 6, 199, 2048 },
  10407. { 4, 200, 2048 }, { 5, 201, 2048 }, { 5, 202, 2048 }, { 6, 203, 2048 }, { 5, 204, 2048 }, { 6, 205, 2048 }, { 6, 206, 2048 }, { 7, 207, 2048 },
  10408. { 4, 208, 2048 }, { 5, 209, 2048 }, { 5, 210, 2048 }, { 6, 211, 2048 }, { 5, 212, 2048 }, { 6, 213, 2048 }, { 6, 214, 2048 }, { 7, 215, 2048 },
  10409. { 5, 216, 2048 }, { 6, 217, 2048 }, { 6, 218, 2048 }, { 7, 219, 2048 }, { 6, 220, 2048 }, { 7, 221, 2048 }, { 7, 222, 2048 }, { 8, 223, 2048 },
  10410. { 4, 224, 2048 }, { 5, 225, 2048 }, { 5, 226, 2048 }, { 6, 227, 2048 }, { 5, 228, 2048 }, { 6, 229, 2048 }, { 6, 230, 2048 }, { 7, 231, 2048 },
  10411. { 5, 232, 2048 }, { 6, 233, 2048 }, { 6, 234, 2048 }, { 7, 235, 2048 }, { 6, 236, 2048 }, { 7, 237, 2048 }, { 7, 238, 2048 }, { 8, 239, 2048 },
  10412. { 5, 240, 2048 }, { 6, 241, 2048 }, { 6, 242, 2048 }, { 7, 243, 2048 }, { 6, 244, 2048 }, { 7, 245, 2048 }, { 7, 246, 2048 }, { 8, 247, 2048 },
  10413. { 6, 248, 2048 }, { 7, 249, 2048 }, { 7, 250, 2048 }, { 8, 251, 2048 }, { 7, 252, 2048 }, { 8, 253, 2048 }, { 8, 254, 2048 }, { 9, 255, 2048 },
  10414. { 2, 256, 2048 }, { 3, 257, 2048 }, { 3, 258, 2048 }, { 4, 259, 2048 }, { 3, 260, 2048 }, { 4, 261, 2048 }, { 4, 262, 2048 }, { 5, 263, 2048 },
  10415. { 3, 264, 2048 }, { 4, 265, 2048 }, { 4, 266, 2048 }, { 5, 267, 2048 }, { 4, 268, 2048 }, { 5, 269, 2048 }, { 5, 270, 2048 }, { 6, 271, 2048 },
  10416. { 3, 272, 2048 }, { 4, 273, 2048 }, { 4, 274, 2048 }, { 5, 275, 2048 }, { 4, 276, 2048 }, { 5, 277, 2048 }, { 5, 278, 2048 }, { 6, 279, 2048 },
  10417. { 4, 280, 2048 }, { 5, 281, 2048 }, { 5, 282, 2048 }, { 6, 283, 2048 }, { 5, 284, 2048 }, { 6, 285, 2048 }, { 6, 286, 2048 }, { 7, 287, 2048 },
  10418. { 3, 288, 2048 }, { 4, 289, 2048 }, { 4, 290, 2048 }, { 5, 291, 2048 }, { 4, 292, 2048 }, { 5, 293, 2048 }, { 5, 294, 2048 }, { 6, 295, 2048 },
  10419. { 4, 296, 2048 }, { 5, 297, 2048 }, { 5, 298, 2048 }, { 6, 299, 2048 }, { 5, 300, 2048 }, { 6, 301, 2048 }, { 6, 302, 2048 }, { 7, 303, 2048 },
  10420. { 4, 304, 2048 }, { 5, 305, 2048 }, { 5, 306, 2048 }, { 6, 307, 2048 }, { 5, 308, 2048 }, { 6, 309, 2048 }, { 6, 310, 2048 }, { 7, 311, 2048 },
  10421. { 5, 312, 2048 }, { 6, 313, 2048 }, { 6, 314, 2048 }, { 7, 315, 2048 }, { 6, 316, 2048 }, { 7, 317, 2048 }, { 7, 318, 2048 }, { 8, 319, 2048 },
  10422. { 3, 320, 2048 }, { 4, 321, 2048 }, { 4, 322, 2048 }, { 5, 323, 2048 }, { 4, 324, 2048 }, { 5, 325, 2048 }, { 5, 326, 2048 }, { 6, 327, 2048 },
  10423. { 4, 328, 2048 }, { 5, 329, 2048 }, { 5, 330, 2048 }, { 6, 331, 2048 }, { 5, 332, 2048 }, { 6, 333, 2048 }, { 6, 334, 2048 }, { 7, 335, 2048 },
  10424. { 4, 336, 2048 }, { 5, 337, 2048 }, { 5, 338, 2048 }, { 6, 339, 2048 }, { 5, 340, 2048 }, { 6, 341, 2048 }, { 6, 342, 2048 }, { 7, 343, 2048 },
  10425. { 5, 344, 2048 }, { 6, 345, 2048 }, { 6, 346, 2048 }, { 7, 347, 2048 }, { 6, 348, 2048 }, { 7, 349, 2048 }, { 7, 350, 2048 }, { 8, 351, 2048 },
  10426. { 4, 352, 2048 }, { 5, 353, 2048 }, { 5, 354, 2048 }, { 6, 355, 2048 }, { 5, 356, 2048 }, { 6, 357, 2048 }, { 6, 358, 2048 }, { 7, 359, 2048 },
  10427. { 5, 360, 2048 }, { 6, 361, 2048 }, { 6, 362, 2048 }, { 7, 363, 2048 }, { 6, 364, 2048 }, { 7, 365, 2048 }, { 7, 366, 2048 }, { 8, 367, 2048 },
  10428. { 5, 368, 2048 }, { 6, 369, 2048 }, { 6, 370, 2048 }, { 7, 371, 2048 }, { 6, 372, 2048 }, { 7, 373, 2048 }, { 7, 374, 2048 }, { 8, 375, 2048 },
  10429. { 6, 376, 2048 }, { 7, 377, 2048 }, { 7, 378, 2048 }, { 8, 379, 2048 }, { 7, 380, 2048 }, { 8, 381, 2048 }, { 8, 382, 2048 }, { 9, 383, 2048 },
  10430. { 3, 384, 2048 }, { 4, 385, 2048 }, { 4, 386, 2048 }, { 5, 387, 2048 }, { 4, 388, 2048 }, { 5, 389, 2048 }, { 5, 390, 2048 }, { 6, 391, 2048 },
  10431. { 4, 392, 2048 }, { 5, 393, 2048 }, { 5, 394, 2048 }, { 6, 395, 2048 }, { 5, 396, 2048 }, { 6, 397, 2048 }, { 6, 398, 2048 }, { 7, 399, 2048 },
  10432. { 4, 400, 2048 }, { 5, 401, 2048 }, { 5, 402, 2048 }, { 6, 403, 2048 }, { 5, 404, 2048 }, { 6, 405, 2048 }, { 6, 406, 2048 }, { 7, 407, 2048 },
  10433. { 5, 408, 2048 }, { 6, 409, 2048 }, { 6, 410, 2048 }, { 7, 411, 2048 }, { 6, 412, 2048 }, { 7, 413, 2048 }, { 7, 414, 2048 }, { 8, 415, 2048 },
  10434. { 4, 416, 2048 }, { 5, 417, 2048 }, { 5, 418, 2048 }, { 6, 419, 2048 }, { 5, 420, 2048 }, { 6, 421, 2048 }, { 6, 422, 2048 }, { 7, 423, 2048 },
  10435. { 5, 424, 2048 }, { 6, 425, 2048 }, { 6, 426, 2048 }, { 7, 427, 2048 }, { 6, 428, 2048 }, { 7, 429, 2048 }, { 7, 430, 2048 }, { 8, 431, 2048 },
  10436. { 5, 432, 2048 }, { 6, 433, 2048 }, { 6, 434, 2048 }, { 7, 435, 2048 }, { 6, 436, 2048 }, { 7, 437, 2048 }, { 7, 438, 2048 }, { 8, 439, 2048 },
  10437. { 6, 440, 2048 }, { 7, 441, 2048 }, { 7, 442, 2048 }, { 8, 443, 2048 }, { 7, 444, 2048 }, { 8, 445, 2048 }, { 8, 446, 2048 }, { 9, 447, 2048 },
  10438. { 4, 448, 2048 }, { 5, 449, 2048 }, { 5, 450, 2048 }, { 6, 451, 2048 }, { 5, 452, 2048 }, { 6, 453, 2048 }, { 6, 454, 2048 }, { 7, 455, 2048 },
  10439. { 5, 456, 2048 }, { 6, 457, 2048 }, { 6, 458, 2048 }, { 7, 459, 2048 }, { 6, 460, 2048 }, { 7, 461, 2048 }, { 7, 462, 2048 }, { 8, 463, 2048 },
  10440. { 5, 464, 2048 }, { 6, 465, 2048 }, { 6, 466, 2048 }, { 7, 467, 2048 }, { 6, 468, 2048 }, { 7, 469, 2048 }, { 7, 470, 2048 }, { 8, 471, 2048 },
  10441. { 6, 472, 2048 }, { 7, 473, 2048 }, { 7, 474, 2048 }, { 8, 475, 2048 }, { 7, 476, 2048 }, { 8, 477, 2048 }, { 8, 478, 2048 }, { 9, 479, 2048 },
  10442. { 5, 480, 2048 }, { 6, 481, 2048 }, { 6, 482, 2048 }, { 7, 483, 2048 }, { 6, 484, 2048 }, { 7, 485, 2048 }, { 7, 486, 2048 }, { 8, 487, 2048 },
  10443. { 6, 488, 2048 }, { 7, 489, 2048 }, { 7, 490, 2048 }, { 8, 491, 2048 }, { 7, 492, 2048 }, { 8, 493, 2048 }, { 8, 494, 2048 }, { 9, 495, 2048 },
  10444. { 6, 496, 2048 }, { 7, 497, 2048 }, { 7, 498, 2048 }, { 8, 499, 2048 }, { 7, 500, 2048 }, { 8, 501, 2048 }, { 8, 502, 2048 }, { 9, 503, 2048 },
  10445. { 7, 504, 2048 }, { 8, 505, 2048 }, { 8, 506, 2048 }, { 9, 507, 2048 }, { 8, 508, 2048 }, { 9, 509, 2048 }, { 9, 510, 2048 }, { 10, 511, 2048 },
  10446. { 2, 512, 2048 }, { 3, 513, 2048 }, { 3, 514, 2048 }, { 4, 515, 2048 }, { 3, 516, 2048 }, { 4, 517, 2048 }, { 4, 518, 2048 }, { 5, 519, 2048 },
  10447. { 3, 520, 2048 }, { 4, 521, 2048 }, { 4, 522, 2048 }, { 5, 523, 2048 }, { 4, 524, 2048 }, { 5, 525, 2048 }, { 5, 526, 2048 }, { 6, 527, 2048 },
  10448. { 3, 528, 2048 }, { 4, 529, 2048 }, { 4, 530, 2048 }, { 5, 531, 2048 }, { 4, 532, 2048 }, { 5, 533, 2048 }, { 5, 534, 2048 }, { 6, 535, 2048 },
  10449. { 4, 536, 2048 }, { 5, 537, 2048 }, { 5, 538, 2048 }, { 6, 539, 2048 }, { 5, 540, 2048 }, { 6, 541, 2048 }, { 6, 542, 2048 }, { 7, 543, 2048 },
  10450. { 3, 544, 2048 }, { 4, 545, 2048 }, { 4, 546, 2048 }, { 5, 547, 2048 }, { 4, 548, 2048 }, { 5, 549, 2048 }, { 5, 550, 2048 }, { 6, 551, 2048 },
  10451. { 4, 552, 2048 }, { 5, 553, 2048 }, { 5, 554, 2048 }, { 6, 555, 2048 }, { 5, 556, 2048 }, { 6, 557, 2048 }, { 6, 558, 2048 }, { 7, 559, 2048 },
  10452. { 4, 560, 2048 }, { 5, 561, 2048 }, { 5, 562, 2048 }, { 6, 563, 2048 }, { 5, 564, 2048 }, { 6, 565, 2048 }, { 6, 566, 2048 }, { 7, 567, 2048 },
  10453. { 5, 568, 2048 }, { 6, 569, 2048 }, { 6, 570, 2048 }, { 7, 571, 2048 }, { 6, 572, 2048 }, { 7, 573, 2048 }, { 7, 574, 2048 }, { 8, 575, 2048 },
  10454. { 3, 576, 2048 }, { 4, 577, 2048 }, { 4, 578, 2048 }, { 5, 579, 2048 }, { 4, 580, 2048 }, { 5, 581, 2048 }, { 5, 582, 2048 }, { 6, 583, 2048 },
  10455. { 4, 584, 2048 }, { 5, 585, 2048 }, { 5, 586, 2048 }, { 6, 587, 2048 }, { 5, 588, 2048 }, { 6, 589, 2048 }, { 6, 590, 2048 }, { 7, 591, 2048 },
  10456. { 4, 592, 2048 }, { 5, 593, 2048 }, { 5, 594, 2048 }, { 6, 595, 2048 }, { 5, 596, 2048 }, { 6, 597, 2048 }, { 6, 598, 2048 }, { 7, 599, 2048 },
  10457. { 5, 600, 2048 }, { 6, 601, 2048 }, { 6, 602, 2048 }, { 7, 603, 2048 }, { 6, 604, 2048 }, { 7, 605, 2048 }, { 7, 606, 2048 }, { 8, 607, 2048 },
  10458. { 4, 608, 2048 }, { 5, 609, 2048 }, { 5, 610, 2048 }, { 6, 611, 2048 }, { 5, 612, 2048 }, { 6, 613, 2048 }, { 6, 614, 2048 }, { 7, 615, 2048 },
  10459. { 5, 616, 2048 }, { 6, 617, 2048 }, { 6, 618, 2048 }, { 7, 619, 2048 }, { 6, 620, 2048 }, { 7, 621, 2048 }, { 7, 622, 2048 }, { 8, 623, 2048 },
  10460. { 5, 624, 2048 }, { 6, 625, 2048 }, { 6, 626, 2048 }, { 7, 627, 2048 }, { 6, 628, 2048 }, { 7, 629, 2048 }, { 7, 630, 2048 }, { 8, 631, 2048 },
  10461. { 6, 632, 2048 }, { 7, 633, 2048 }, { 7, 634, 2048 }, { 8, 635, 2048 }, { 7, 636, 2048 }, { 8, 637, 2048 }, { 8, 638, 2048 }, { 9, 639, 2048 },
  10462. { 3, 640, 2048 }, { 4, 641, 2048 }, { 4, 642, 2048 }, { 5, 643, 2048 }, { 4, 644, 2048 }, { 5, 645, 2048 }, { 5, 646, 2048 }, { 6, 647, 2048 },
  10463. { 4, 648, 2048 }, { 5, 649, 2048 }, { 5, 650, 2048 }, { 6, 651, 2048 }, { 5, 652, 2048 }, { 6, 653, 2048 }, { 6, 654, 2048 }, { 7, 655, 2048 },
  10464. { 4, 656, 2048 }, { 5, 657, 2048 }, { 5, 658, 2048 }, { 6, 659, 2048 }, { 5, 660, 2048 }, { 6, 661, 2048 }, { 6, 662, 2048 }, { 7, 663, 2048 },
  10465. { 5, 664, 2048 }, { 6, 665, 2048 }, { 6, 666, 2048 }, { 7, 667, 2048 }, { 6, 668, 2048 }, { 7, 669, 2048 }, { 7, 670, 2048 }, { 8, 671, 2048 },
  10466. { 4, 672, 2048 }, { 5, 673, 2048 }, { 5, 674, 2048 }, { 6, 675, 2048 }, { 5, 676, 2048 }, { 6, 677, 2048 }, { 6, 678, 2048 }, { 7, 679, 2048 },
  10467. { 5, 680, 2048 }, { 6, 681, 2048 }, { 6, 682, 2048 }, { 7, 683, 2048 }, { 6, 684, 2048 }, { 7, 685, 2048 }, { 7, 686, 2048 }, { 8, 687, 2048 },
  10468. { 5, 688, 2048 }, { 6, 689, 2048 }, { 6, 690, 2048 }, { 7, 691, 2048 }, { 6, 692, 2048 }, { 7, 693, 2048 }, { 7, 694, 2048 }, { 8, 695, 2048 },
  10469. { 6, 696, 2048 }, { 7, 697, 2048 }, { 7, 698, 2048 }, { 8, 699, 2048 }, { 7, 700, 2048 }, { 8, 701, 2048 }, { 8, 702, 2048 }, { 9, 703, 2048 },
  10470. { 4, 704, 2048 }, { 5, 705, 2048 }, { 5, 706, 2048 }, { 6, 707, 2048 }, { 5, 708, 2048 }, { 6, 709, 2048 }, { 6, 710, 2048 }, { 7, 711, 2048 },
  10471. { 5, 712, 2048 }, { 6, 713, 2048 }, { 6, 714, 2048 }, { 7, 715, 2048 }, { 6, 716, 2048 }, { 7, 717, 2048 }, { 7, 718, 2048 }, { 8, 719, 2048 },
  10472. { 5, 720, 2048 }, { 6, 721, 2048 }, { 6, 722, 2048 }, { 7, 723, 2048 }, { 6, 724, 2048 }, { 7, 725, 2048 }, { 7, 726, 2048 }, { 8, 727, 2048 },
  10473. { 6, 728, 2048 }, { 7, 729, 2048 }, { 7, 730, 2048 }, { 8, 731, 2048 }, { 7, 732, 2048 }, { 8, 733, 2048 }, { 8, 734, 2048 }, { 9, 735, 2048 },
  10474. { 5, 736, 2048 }, { 6, 737, 2048 }, { 6, 738, 2048 }, { 7, 739, 2048 }, { 6, 740, 2048 }, { 7, 741, 2048 }, { 7, 742, 2048 }, { 8, 743, 2048 },
  10475. { 6, 744, 2048 }, { 7, 745, 2048 }, { 7, 746, 2048 }, { 8, 747, 2048 }, { 7, 748, 2048 }, { 8, 749, 2048 }, { 8, 750, 2048 }, { 9, 751, 2048 },
  10476. { 6, 752, 2048 }, { 7, 753, 2048 }, { 7, 754, 2048 }, { 8, 755, 2048 }, { 7, 756, 2048 }, { 8, 757, 2048 }, { 8, 758, 2048 }, { 9, 759, 2048 },
  10477. { 7, 760, 2048 }, { 8, 761, 2048 }, { 8, 762, 2048 }, { 9, 763, 2048 }, { 8, 764, 2048 }, { 9, 765, 2048 }, { 9, 766, 2048 }, { 10, 767, 2048 },
  10478. { 3, 768, 2048 }, { 4, 769, 2048 }, { 4, 770, 2048 }, { 5, 771, 2048 }, { 4, 772, 2048 }, { 5, 773, 2048 }, { 5, 774, 2048 }, { 6, 775, 2048 },
  10479. { 4, 776, 2048 }, { 5, 777, 2048 }, { 5, 778, 2048 }, { 6, 779, 2048 }, { 5, 780, 2048 }, { 6, 781, 2048 }, { 6, 782, 2048 }, { 7, 783, 2048 },
  10480. { 4, 784, 2048 }, { 5, 785, 2048 }, { 5, 786, 2048 }, { 6, 787, 2048 }, { 5, 788, 2048 }, { 6, 789, 2048 }, { 6, 790, 2048 }, { 7, 791, 2048 },
  10481. { 5, 792, 2048 }, { 6, 793, 2048 }, { 6, 794, 2048 }, { 7, 795, 2048 }, { 6, 796, 2048 }, { 7, 797, 2048 }, { 7, 798, 2048 }, { 8, 799, 2048 },
  10482. { 4, 800, 2048 }, { 5, 801, 2048 }, { 5, 802, 2048 }, { 6, 803, 2048 }, { 5, 804, 2048 }, { 6, 805, 2048 }, { 6, 806, 2048 }, { 7, 807, 2048 },
  10483. { 5, 808, 2048 }, { 6, 809, 2048 }, { 6, 810, 2048 }, { 7, 811, 2048 }, { 6, 812, 2048 }, { 7, 813, 2048 }, { 7, 814, 2048 }, { 8, 815, 2048 },
  10484. { 5, 816, 2048 }, { 6, 817, 2048 }, { 6, 818, 2048 }, { 7, 819, 2048 }, { 6, 820, 2048 }, { 7, 821, 2048 }, { 7, 822, 2048 }, { 8, 823, 2048 },
  10485. { 6, 824, 2048 }, { 7, 825, 2048 }, { 7, 826, 2048 }, { 8, 827, 2048 }, { 7, 828, 2048 }, { 8, 829, 2048 }, { 8, 830, 2048 }, { 9, 831, 2048 },
  10486. { 4, 832, 2048 }, { 5, 833, 2048 }, { 5, 834, 2048 }, { 6, 835, 2048 }, { 5, 836, 2048 }, { 6, 837, 2048 }, { 6, 838, 2048 }, { 7, 839, 2048 },
  10487. { 5, 840, 2048 }, { 6, 841, 2048 }, { 6, 842, 2048 }, { 7, 843, 2048 }, { 6, 844, 2048 }, { 7, 845, 2048 }, { 7, 846, 2048 }, { 8, 847, 2048 },
  10488. { 5, 848, 2048 }, { 6, 849, 2048 }, { 6, 850, 2048 }, { 7, 851, 2048 }, { 6, 852, 2048 }, { 7, 853, 2048 }, { 7, 854, 2048 }, { 8, 855, 2048 },
  10489. { 6, 856, 2048 }, { 7, 857, 2048 }, { 7, 858, 2048 }, { 8, 859, 2048 }, { 7, 860, 2048 }, { 8, 861, 2048 }, { 8, 862, 2048 }, { 9, 863, 2048 },
  10490. { 5, 864, 2048 }, { 6, 865, 2048 }, { 6, 866, 2048 }, { 7, 867, 2048 }, { 6, 868, 2048 }, { 7, 869, 2048 }, { 7, 870, 2048 }, { 8, 871, 2048 },
  10491. { 6, 872, 2048 }, { 7, 873, 2048 }, { 7, 874, 2048 }, { 8, 875, 2048 }, { 7, 876, 2048 }, { 8, 877, 2048 }, { 8, 878, 2048 }, { 9, 879, 2048 },
  10492. { 6, 880, 2048 }, { 7, 881, 2048 }, { 7, 882, 2048 }, { 8, 883, 2048 }, { 7, 884, 2048 }, { 8, 885, 2048 }, { 8, 886, 2048 }, { 9, 887, 2048 },
  10493. { 7, 888, 2048 }, { 8, 889, 2048 }, { 8, 890, 2048 }, { 9, 891, 2048 }, { 8, 892, 2048 }, { 9, 893, 2048 }, { 9, 894, 2048 }, { 10, 895, 2048 },
  10494. { 4, 896, 2048 }, { 5, 897, 2048 }, { 5, 898, 2048 }, { 6, 899, 2048 }, { 5, 900, 2048 }, { 6, 901, 2048 }, { 6, 902, 2048 }, { 7, 903, 2048 },
  10495. { 5, 904, 2048 }, { 6, 905, 2048 }, { 6, 906, 2048 }, { 7, 907, 2048 }, { 6, 908, 2048 }, { 7, 909, 2048 }, { 7, 910, 2048 }, { 8, 911, 2048 },
  10496. { 5, 912, 2048 }, { 6, 913, 2048 }, { 6, 914, 2048 }, { 7, 915, 2048 }, { 6, 916, 2048 }, { 7, 917, 2048 }, { 7, 918, 2048 }, { 8, 919, 2048 },
  10497. { 6, 920, 2048 }, { 7, 921, 2048 }, { 7, 922, 2048 }, { 8, 923, 2048 }, { 7, 924, 2048 }, { 8, 925, 2048 }, { 8, 926, 2048 }, { 9, 927, 2048 },
  10498. { 5, 928, 2048 }, { 6, 929, 2048 }, { 6, 930, 2048 }, { 7, 931, 2048 }, { 6, 932, 2048 }, { 7, 933, 2048 }, { 7, 934, 2048 }, { 8, 935, 2048 },
  10499. { 6, 936, 2048 }, { 7, 937, 2048 }, { 7, 938, 2048 }, { 8, 939, 2048 }, { 7, 940, 2048 }, { 8, 941, 2048 }, { 8, 942, 2048 }, { 9, 943, 2048 },
  10500. { 6, 944, 2048 }, { 7, 945, 2048 }, { 7, 946, 2048 }, { 8, 947, 2048 }, { 7, 948, 2048 }, { 8, 949, 2048 }, { 8, 950, 2048 }, { 9, 951, 2048 },
  10501. { 7, 952, 2048 }, { 8, 953, 2048 }, { 8, 954, 2048 }, { 9, 955, 2048 }, { 8, 956, 2048 }, { 9, 957, 2048 }, { 9, 958, 2048 }, { 10, 959, 2048 },
  10502. { 5, 960, 2048 }, { 6, 961, 2048 }, { 6, 962, 2048 }, { 7, 963, 2048 }, { 6, 964, 2048 }, { 7, 965, 2048 }, { 7, 966, 2048 }, { 8, 967, 2048 },
  10503. { 6, 968, 2048 }, { 7, 969, 2048 }, { 7, 970, 2048 }, { 8, 971, 2048 }, { 7, 972, 2048 }, { 8, 973, 2048 }, { 8, 974, 2048 }, { 9, 975, 2048 },
  10504. { 6, 976, 2048 }, { 7, 977, 2048 }, { 7, 978, 2048 }, { 8, 979, 2048 }, { 7, 980, 2048 }, { 8, 981, 2048 }, { 8, 982, 2048 }, { 9, 983, 2048 },
  10505. { 7, 984, 2048 }, { 8, 985, 2048 }, { 8, 986, 2048 }, { 9, 987, 2048 }, { 8, 988, 2048 }, { 9, 989, 2048 }, { 9, 990, 2048 }, { 10, 991, 2048 },
  10506. { 6, 992, 2048 }, { 7, 993, 2048 }, { 7, 994, 2048 }, { 8, 995, 2048 }, { 7, 996, 2048 }, { 8, 997, 2048 }, { 8, 998, 2048 }, { 9, 999, 2048 },
  10507. { 7, 1000, 2048 }, { 8, 1001, 2048 }, { 8, 1002, 2048 }, { 9, 1003, 2048 }, { 8, 1004, 2048 }, { 9, 1005, 2048 }, { 9, 1006, 2048 }, { 10, 1007, 2048 },
  10508. { 7, 1008, 2048 }, { 8, 1009, 2048 }, { 8, 1010, 2048 }, { 9, 1011, 2048 }, { 8, 1012, 2048 }, { 9, 1013, 2048 }, { 9, 1014, 2048 }, { 10, 1015, 2048 },
  10509. { 8, 1016, 2048 }, { 9, 1017, 2048 }, { 9, 1018, 2048 }, { 10, 1019, 2048 }, { 9, 1020, 2048 }, { 10, 1021, 2048 }, { 10, 1022, 2048 }, { 11, 1023, 2048 },
  10510. { 2, 1024, 2048 }, { 3, 1025, 2048 }, { 3, 1026, 2048 }, { 4, 1027, 2048 }, { 3, 1028, 2048 }, { 4, 1029, 2048 }, { 4, 1030, 2048 }, { 5, 1031, 2048 },
  10511. { 3, 1032, 2048 }, { 4, 1033, 2048 }, { 4, 1034, 2048 }, { 5, 1035, 2048 }, { 4, 1036, 2048 }, { 5, 1037, 2048 }, { 5, 1038, 2048 }, { 6, 1039, 2048 },
  10512. { 3, 1040, 2048 }, { 4, 1041, 2048 }, { 4, 1042, 2048 }, { 5, 1043, 2048 }, { 4, 1044, 2048 }, { 5, 1045, 2048 }, { 5, 1046, 2048 }, { 6, 1047, 2048 },
  10513. { 4, 1048, 2048 }, { 5, 1049, 2048 }, { 5, 1050, 2048 }, { 6, 1051, 2048 }, { 5, 1052, 2048 }, { 6, 1053, 2048 }, { 6, 1054, 2048 }, { 7, 1055, 2048 },
  10514. { 3, 1056, 2048 }, { 4, 1057, 2048 }, { 4, 1058, 2048 }, { 5, 1059, 2048 }, { 4, 1060, 2048 }, { 5, 1061, 2048 }, { 5, 1062, 2048 }, { 6, 1063, 2048 },
  10515. { 4, 1064, 2048 }, { 5, 1065, 2048 }, { 5, 1066, 2048 }, { 6, 1067, 2048 }, { 5, 1068, 2048 }, { 6, 1069, 2048 }, { 6, 1070, 2048 }, { 7, 1071, 2048 },
  10516. { 4, 1072, 2048 }, { 5, 1073, 2048 }, { 5, 1074, 2048 }, { 6, 1075, 2048 }, { 5, 1076, 2048 }, { 6, 1077, 2048 }, { 6, 1078, 2048 }, { 7, 1079, 2048 },
  10517. { 5, 1080, 2048 }, { 6, 1081, 2048 }, { 6, 1082, 2048 }, { 7, 1083, 2048 }, { 6, 1084, 2048 }, { 7, 1085, 2048 }, { 7, 1086, 2048 }, { 8, 1087, 2048 },
  10518. { 3, 1088, 2048 }, { 4, 1089, 2048 }, { 4, 1090, 2048 }, { 5, 1091, 2048 }, { 4, 1092, 2048 }, { 5, 1093, 2048 }, { 5, 1094, 2048 }, { 6, 1095, 2048 },
  10519. { 4, 1096, 2048 }, { 5, 1097, 2048 }, { 5, 1098, 2048 }, { 6, 1099, 2048 }, { 5, 1100, 2048 }, { 6, 1101, 2048 }, { 6, 1102, 2048 }, { 7, 1103, 2048 },
  10520. { 4, 1104, 2048 }, { 5, 1105, 2048 }, { 5, 1106, 2048 }, { 6, 1107, 2048 }, { 5, 1108, 2048 }, { 6, 1109, 2048 }, { 6, 1110, 2048 }, { 7, 1111, 2048 },
  10521. { 5, 1112, 2048 }, { 6, 1113, 2048 }, { 6, 1114, 2048 }, { 7, 1115, 2048 }, { 6, 1116, 2048 }, { 7, 1117, 2048 }, { 7, 1118, 2048 }, { 8, 1119, 2048 },
  10522. { 4, 1120, 2048 }, { 5, 1121, 2048 }, { 5, 1122, 2048 }, { 6, 1123, 2048 }, { 5, 1124, 2048 }, { 6, 1125, 2048 }, { 6, 1126, 2048 }, { 7, 1127, 2048 },
  10523. { 5, 1128, 2048 }, { 6, 1129, 2048 }, { 6, 1130, 2048 }, { 7, 1131, 2048 }, { 6, 1132, 2048 }, { 7, 1133, 2048 }, { 7, 1134, 2048 }, { 8, 1135, 2048 },
  10524. { 5, 1136, 2048 }, { 6, 1137, 2048 }, { 6, 1138, 2048 }, { 7, 1139, 2048 }, { 6, 1140, 2048 }, { 7, 1141, 2048 }, { 7, 1142, 2048 }, { 8, 1143, 2048 },
  10525. { 6, 1144, 2048 }, { 7, 1145, 2048 }, { 7, 1146, 2048 }, { 8, 1147, 2048 }, { 7, 1148, 2048 }, { 8, 1149, 2048 }, { 8, 1150, 2048 }, { 9, 1151, 2048 },
  10526. { 3, 1152, 2048 }, { 4, 1153, 2048 }, { 4, 1154, 2048 }, { 5, 1155, 2048 }, { 4, 1156, 2048 }, { 5, 1157, 2048 }, { 5, 1158, 2048 }, { 6, 1159, 2048 },
  10527. { 4, 1160, 2048 }, { 5, 1161, 2048 }, { 5, 1162, 2048 }, { 6, 1163, 2048 }, { 5, 1164, 2048 }, { 6, 1165, 2048 }, { 6, 1166, 2048 }, { 7, 1167, 2048 },
  10528. { 4, 1168, 2048 }, { 5, 1169, 2048 }, { 5, 1170, 2048 }, { 6, 1171, 2048 }, { 5, 1172, 2048 }, { 6, 1173, 2048 }, { 6, 1174, 2048 }, { 7, 1175, 2048 },
  10529. { 5, 1176, 2048 }, { 6, 1177, 2048 }, { 6, 1178, 2048 }, { 7, 1179, 2048 }, { 6, 1180, 2048 }, { 7, 1181, 2048 }, { 7, 1182, 2048 }, { 8, 1183, 2048 },
  10530. { 4, 1184, 2048 }, { 5, 1185, 2048 }, { 5, 1186, 2048 }, { 6, 1187, 2048 }, { 5, 1188, 2048 }, { 6, 1189, 2048 }, { 6, 1190, 2048 }, { 7, 1191, 2048 },
  10531. { 5, 1192, 2048 }, { 6, 1193, 2048 }, { 6, 1194, 2048 }, { 7, 1195, 2048 }, { 6, 1196, 2048 }, { 7, 1197, 2048 }, { 7, 1198, 2048 }, { 8, 1199, 2048 },
  10532. { 5, 1200, 2048 }, { 6, 1201, 2048 }, { 6, 1202, 2048 }, { 7, 1203, 2048 }, { 6, 1204, 2048 }, { 7, 1205, 2048 }, { 7, 1206, 2048 }, { 8, 1207, 2048 },
  10533. { 6, 1208, 2048 }, { 7, 1209, 2048 }, { 7, 1210, 2048 }, { 8, 1211, 2048 }, { 7, 1212, 2048 }, { 8, 1213, 2048 }, { 8, 1214, 2048 }, { 9, 1215, 2048 },
  10534. { 4, 1216, 2048 }, { 5, 1217, 2048 }, { 5, 1218, 2048 }, { 6, 1219, 2048 }, { 5, 1220, 2048 }, { 6, 1221, 2048 }, { 6, 1222, 2048 }, { 7, 1223, 2048 },
  10535. { 5, 1224, 2048 }, { 6, 1225, 2048 }, { 6, 1226, 2048 }, { 7, 1227, 2048 }, { 6, 1228, 2048 }, { 7, 1229, 2048 }, { 7, 1230, 2048 }, { 8, 1231, 2048 },
  10536. { 5, 1232, 2048 }, { 6, 1233, 2048 }, { 6, 1234, 2048 }, { 7, 1235, 2048 }, { 6, 1236, 2048 }, { 7, 1237, 2048 }, { 7, 1238, 2048 }, { 8, 1239, 2048 },
  10537. { 6, 1240, 2048 }, { 7, 1241, 2048 }, { 7, 1242, 2048 }, { 8, 1243, 2048 }, { 7, 1244, 2048 }, { 8, 1245, 2048 }, { 8, 1246, 2048 }, { 9, 1247, 2048 },
  10538. { 5, 1248, 2048 }, { 6, 1249, 2048 }, { 6, 1250, 2048 }, { 7, 1251, 2048 }, { 6, 1252, 2048 }, { 7, 1253, 2048 }, { 7, 1254, 2048 }, { 8, 1255, 2048 },
  10539. { 6, 1256, 2048 }, { 7, 1257, 2048 }, { 7, 1258, 2048 }, { 8, 1259, 2048 }, { 7, 1260, 2048 }, { 8, 1261, 2048 }, { 8, 1262, 2048 }, { 9, 1263, 2048 },
  10540. { 6, 1264, 2048 }, { 7, 1265, 2048 }, { 7, 1266, 2048 }, { 8, 1267, 2048 }, { 7, 1268, 2048 }, { 8, 1269, 2048 }, { 8, 1270, 2048 }, { 9, 1271, 2048 },
  10541. { 7, 1272, 2048 }, { 8, 1273, 2048 }, { 8, 1274, 2048 }, { 9, 1275, 2048 }, { 8, 1276, 2048 }, { 9, 1277, 2048 }, { 9, 1278, 2048 }, { 10, 1279, 2048 },
  10542. { 3, 1280, 2048 }, { 4, 1281, 2048 }, { 4, 1282, 2048 }, { 5, 1283, 2048 }, { 4, 1284, 2048 }, { 5, 1285, 2048 }, { 5, 1286, 2048 }, { 6, 1287, 2048 },
  10543. { 4, 1288, 2048 }, { 5, 1289, 2048 }, { 5, 1290, 2048 }, { 6, 1291, 2048 }, { 5, 1292, 2048 }, { 6, 1293, 2048 }, { 6, 1294, 2048 }, { 7, 1295, 2048 },
  10544. { 4, 1296, 2048 }, { 5, 1297, 2048 }, { 5, 1298, 2048 }, { 6, 1299, 2048 }, { 5, 1300, 2048 }, { 6, 1301, 2048 }, { 6, 1302, 2048 }, { 7, 1303, 2048 },
  10545. { 5, 1304, 2048 }, { 6, 1305, 2048 }, { 6, 1306, 2048 }, { 7, 1307, 2048 }, { 6, 1308, 2048 }, { 7, 1309, 2048 }, { 7, 1310, 2048 }, { 8, 1311, 2048 },
  10546. { 4, 1312, 2048 }, { 5, 1313, 2048 }, { 5, 1314, 2048 }, { 6, 1315, 2048 }, { 5, 1316, 2048 }, { 6, 1317, 2048 }, { 6, 1318, 2048 }, { 7, 1319, 2048 },
  10547. { 5, 1320, 2048 }, { 6, 1321, 2048 }, { 6, 1322, 2048 }, { 7, 1323, 2048 }, { 6, 1324, 2048 }, { 7, 1325, 2048 }, { 7, 1326, 2048 }, { 8, 1327, 2048 },
  10548. { 5, 1328, 2048 }, { 6, 1329, 2048 }, { 6, 1330, 2048 }, { 7, 1331, 2048 }, { 6, 1332, 2048 }, { 7, 1333, 2048 }, { 7, 1334, 2048 }, { 8, 1335, 2048 },
  10549. { 6, 1336, 2048 }, { 7, 1337, 2048 }, { 7, 1338, 2048 }, { 8, 1339, 2048 }, { 7, 1340, 2048 }, { 8, 1341, 2048 }, { 8, 1342, 2048 }, { 9, 1343, 2048 },
  10550. { 4, 1344, 2048 }, { 5, 1345, 2048 }, { 5, 1346, 2048 }, { 6, 1347, 2048 }, { 5, 1348, 2048 }, { 6, 1349, 2048 }, { 6, 1350, 2048 }, { 7, 1351, 2048 },
  10551. { 5, 1352, 2048 }, { 6, 1353, 2048 }, { 6, 1354, 2048 }, { 7, 1355, 2048 }, { 6, 1356, 2048 }, { 7, 1357, 2048 }, { 7, 1358, 2048 }, { 8, 1359, 2048 },
  10552. { 5, 1360, 2048 }, { 6, 1361, 2048 }, { 6, 1362, 2048 }, { 7, 1363, 2048 }, { 6, 1364, 2048 }, { 7, 1365, 2048 }, { 7, 1366, 2048 }, { 8, 1367, 2048 },
  10553. { 6, 1368, 2048 }, { 7, 1369, 2048 }, { 7, 1370, 2048 }, { 8, 1371, 2048 }, { 7, 1372, 2048 }, { 8, 1373, 2048 }, { 8, 1374, 2048 }, { 9, 1375, 2048 },
  10554. { 5, 1376, 2048 }, { 6, 1377, 2048 }, { 6, 1378, 2048 }, { 7, 1379, 2048 }, { 6, 1380, 2048 }, { 7, 1381, 2048 }, { 7, 1382, 2048 }, { 8, 1383, 2048 },
  10555. { 6, 1384, 2048 }, { 7, 1385, 2048 }, { 7, 1386, 2048 }, { 8, 1387, 2048 }, { 7, 1388, 2048 }, { 8, 1389, 2048 }, { 8, 1390, 2048 }, { 9, 1391, 2048 },
  10556. { 6, 1392, 2048 }, { 7, 1393, 2048 }, { 7, 1394, 2048 }, { 8, 1395, 2048 }, { 7, 1396, 2048 }, { 8, 1397, 2048 }, { 8, 1398, 2048 }, { 9, 1399, 2048 },
  10557. { 7, 1400, 2048 }, { 8, 1401, 2048 }, { 8, 1402, 2048 }, { 9, 1403, 2048 }, { 8, 1404, 2048 }, { 9, 1405, 2048 }, { 9, 1406, 2048 }, { 10, 1407, 2048 },
  10558. { 4, 1408, 2048 }, { 5, 1409, 2048 }, { 5, 1410, 2048 }, { 6, 1411, 2048 }, { 5, 1412, 2048 }, { 6, 1413, 2048 }, { 6, 1414, 2048 }, { 7, 1415, 2048 },
  10559. { 5, 1416, 2048 }, { 6, 1417, 2048 }, { 6, 1418, 2048 }, { 7, 1419, 2048 }, { 6, 1420, 2048 }, { 7, 1421, 2048 }, { 7, 1422, 2048 }, { 8, 1423, 2048 },
  10560. { 5, 1424, 2048 }, { 6, 1425, 2048 }, { 6, 1426, 2048 }, { 7, 1427, 2048 }, { 6, 1428, 2048 }, { 7, 1429, 2048 }, { 7, 1430, 2048 }, { 8, 1431, 2048 },
  10561. { 6, 1432, 2048 }, { 7, 1433, 2048 }, { 7, 1434, 2048 }, { 8, 1435, 2048 }, { 7, 1436, 2048 }, { 8, 1437, 2048 }, { 8, 1438, 2048 }, { 9, 1439, 2048 },
  10562. { 5, 1440, 2048 }, { 6, 1441, 2048 }, { 6, 1442, 2048 }, { 7, 1443, 2048 }, { 6, 1444, 2048 }, { 7, 1445, 2048 }, { 7, 1446, 2048 }, { 8, 1447, 2048 },
  10563. { 6, 1448, 2048 }, { 7, 1449, 2048 }, { 7, 1450, 2048 }, { 8, 1451, 2048 }, { 7, 1452, 2048 }, { 8, 1453, 2048 }, { 8, 1454, 2048 }, { 9, 1455, 2048 },
  10564. { 6, 1456, 2048 }, { 7, 1457, 2048 }, { 7, 1458, 2048 }, { 8, 1459, 2048 }, { 7, 1460, 2048 }, { 8, 1461, 2048 }, { 8, 1462, 2048 }, { 9, 1463, 2048 },
  10565. { 7, 1464, 2048 }, { 8, 1465, 2048 }, { 8, 1466, 2048 }, { 9, 1467, 2048 }, { 8, 1468, 2048 }, { 9, 1469, 2048 }, { 9, 1470, 2048 }, { 10, 1471, 2048 },
  10566. { 5, 1472, 2048 }, { 6, 1473, 2048 }, { 6, 1474, 2048 }, { 7, 1475, 2048 }, { 6, 1476, 2048 }, { 7, 1477, 2048 }, { 7, 1478, 2048 }, { 8, 1479, 2048 },
  10567. { 6, 1480, 2048 }, { 7, 1481, 2048 }, { 7, 1482, 2048 }, { 8, 1483, 2048 }, { 7, 1484, 2048 }, { 8, 1485, 2048 }, { 8, 1486, 2048 }, { 9, 1487, 2048 },
  10568. { 6, 1488, 2048 }, { 7, 1489, 2048 }, { 7, 1490, 2048 }, { 8, 1491, 2048 }, { 7, 1492, 2048 }, { 8, 1493, 2048 }, { 8, 1494, 2048 }, { 9, 1495, 2048 },
  10569. { 7, 1496, 2048 }, { 8, 1497, 2048 }, { 8, 1498, 2048 }, { 9, 1499, 2048 }, { 8, 1500, 2048 }, { 9, 1501, 2048 }, { 9, 1502, 2048 }, { 10, 1503, 2048 },
  10570. { 6, 1504, 2048 }, { 7, 1505, 2048 }, { 7, 1506, 2048 }, { 8, 1507, 2048 }, { 7, 1508, 2048 }, { 8, 1509, 2048 }, { 8, 1510, 2048 }, { 9, 1511, 2048 },
  10571. { 7, 1512, 2048 }, { 8, 1513, 2048 }, { 8, 1514, 2048 }, { 9, 1515, 2048 }, { 8, 1516, 2048 }, { 9, 1517, 2048 }, { 9, 1518, 2048 }, { 10, 1519, 2048 },
  10572. { 7, 1520, 2048 }, { 8, 1521, 2048 }, { 8, 1522, 2048 }, { 9, 1523, 2048 }, { 8, 1524, 2048 }, { 9, 1525, 2048 }, { 9, 1526, 2048 }, { 10, 1527, 2048 },
  10573. { 8, 1528, 2048 }, { 9, 1529, 2048 }, { 9, 1530, 2048 }, { 10, 1531, 2048 }, { 9, 1532, 2048 }, { 10, 1533, 2048 }, { 10, 1534, 2048 }, { 11, 1535, 2048 },
  10574. { 3, 1536, 2048 }, { 4, 1537, 2048 }, { 4, 1538, 2048 }, { 5, 1539, 2048 }, { 4, 1540, 2048 }, { 5, 1541, 2048 }, { 5, 1542, 2048 }, { 6, 1543, 2048 },
  10575. { 4, 1544, 2048 }, { 5, 1545, 2048 }, { 5, 1546, 2048 }, { 6, 1547, 2048 }, { 5, 1548, 2048 }, { 6, 1549, 2048 }, { 6, 1550, 2048 }, { 7, 1551, 2048 },
  10576. { 4, 1552, 2048 }, { 5, 1553, 2048 }, { 5, 1554, 2048 }, { 6, 1555, 2048 }, { 5, 1556, 2048 }, { 6, 1557, 2048 }, { 6, 1558, 2048 }, { 7, 1559, 2048 },
  10577. { 5, 1560, 2048 }, { 6, 1561, 2048 }, { 6, 1562, 2048 }, { 7, 1563, 2048 }, { 6, 1564, 2048 }, { 7, 1565, 2048 }, { 7, 1566, 2048 }, { 8, 1567, 2048 },
  10578. { 4, 1568, 2048 }, { 5, 1569, 2048 }, { 5, 1570, 2048 }, { 6, 1571, 2048 }, { 5, 1572, 2048 }, { 6, 1573, 2048 }, { 6, 1574, 2048 }, { 7, 1575, 2048 },
  10579. { 5, 1576, 2048 }, { 6, 1577, 2048 }, { 6, 1578, 2048 }, { 7, 1579, 2048 }, { 6, 1580, 2048 }, { 7, 1581, 2048 }, { 7, 1582, 2048 }, { 8, 1583, 2048 },
  10580. { 5, 1584, 2048 }, { 6, 1585, 2048 }, { 6, 1586, 2048 }, { 7, 1587, 2048 }, { 6, 1588, 2048 }, { 7, 1589, 2048 }, { 7, 1590, 2048 }, { 8, 1591, 2048 },
  10581. { 6, 1592, 2048 }, { 7, 1593, 2048 }, { 7, 1594, 2048 }, { 8, 1595, 2048 }, { 7, 1596, 2048 }, { 8, 1597, 2048 }, { 8, 1598, 2048 }, { 9, 1599, 2048 },
  10582. { 4, 1600, 2048 }, { 5, 1601, 2048 }, { 5, 1602, 2048 }, { 6, 1603, 2048 }, { 5, 1604, 2048 }, { 6, 1605, 2048 }, { 6, 1606, 2048 }, { 7, 1607, 2048 },
  10583. { 5, 1608, 2048 }, { 6, 1609, 2048 }, { 6, 1610, 2048 }, { 7, 1611, 2048 }, { 6, 1612, 2048 }, { 7, 1613, 2048 }, { 7, 1614, 2048 }, { 8, 1615, 2048 },
  10584. { 5, 1616, 2048 }, { 6, 1617, 2048 }, { 6, 1618, 2048 }, { 7, 1619, 2048 }, { 6, 1620, 2048 }, { 7, 1621, 2048 }, { 7, 1622, 2048 }, { 8, 1623, 2048 },
  10585. { 6, 1624, 2048 }, { 7, 1625, 2048 }, { 7, 1626, 2048 }, { 8, 1627, 2048 }, { 7, 1628, 2048 }, { 8, 1629, 2048 }, { 8, 1630, 2048 }, { 9, 1631, 2048 },
  10586. { 5, 1632, 2048 }, { 6, 1633, 2048 }, { 6, 1634, 2048 }, { 7, 1635, 2048 }, { 6, 1636, 2048 }, { 7, 1637, 2048 }, { 7, 1638, 2048 }, { 8, 1639, 2048 },
  10587. { 6, 1640, 2048 }, { 7, 1641, 2048 }, { 7, 1642, 2048 }, { 8, 1643, 2048 }, { 7, 1644, 2048 }, { 8, 1645, 2048 }, { 8, 1646, 2048 }, { 9, 1647, 2048 },
  10588. { 6, 1648, 2048 }, { 7, 1649, 2048 }, { 7, 1650, 2048 }, { 8, 1651, 2048 }, { 7, 1652, 2048 }, { 8, 1653, 2048 }, { 8, 1654, 2048 }, { 9, 1655, 2048 },
  10589. { 7, 1656, 2048 }, { 8, 1657, 2048 }, { 8, 1658, 2048 }, { 9, 1659, 2048 }, { 8, 1660, 2048 }, { 9, 1661, 2048 }, { 9, 1662, 2048 }, { 10, 1663, 2048 },
  10590. { 4, 1664, 2048 }, { 5, 1665, 2048 }, { 5, 1666, 2048 }, { 6, 1667, 2048 }, { 5, 1668, 2048 }, { 6, 1669, 2048 }, { 6, 1670, 2048 }, { 7, 1671, 2048 },
  10591. { 5, 1672, 2048 }, { 6, 1673, 2048 }, { 6, 1674, 2048 }, { 7, 1675, 2048 }, { 6, 1676, 2048 }, { 7, 1677, 2048 }, { 7, 1678, 2048 }, { 8, 1679, 2048 },
  10592. { 5, 1680, 2048 }, { 6, 1681, 2048 }, { 6, 1682, 2048 }, { 7, 1683, 2048 }, { 6, 1684, 2048 }, { 7, 1685, 2048 }, { 7, 1686, 2048 }, { 8, 1687, 2048 },
  10593. { 6, 1688, 2048 }, { 7, 1689, 2048 }, { 7, 1690, 2048 }, { 8, 1691, 2048 }, { 7, 1692, 2048 }, { 8, 1693, 2048 }, { 8, 1694, 2048 }, { 9, 1695, 2048 },
  10594. { 5, 1696, 2048 }, { 6, 1697, 2048 }, { 6, 1698, 2048 }, { 7, 1699, 2048 }, { 6, 1700, 2048 }, { 7, 1701, 2048 }, { 7, 1702, 2048 }, { 8, 1703, 2048 },
  10595. { 6, 1704, 2048 }, { 7, 1705, 2048 }, { 7, 1706, 2048 }, { 8, 1707, 2048 }, { 7, 1708, 2048 }, { 8, 1709, 2048 }, { 8, 1710, 2048 }, { 9, 1711, 2048 },
  10596. { 6, 1712, 2048 }, { 7, 1713, 2048 }, { 7, 1714, 2048 }, { 8, 1715, 2048 }, { 7, 1716, 2048 }, { 8, 1717, 2048 }, { 8, 1718, 2048 }, { 9, 1719, 2048 },
  10597. { 7, 1720, 2048 }, { 8, 1721, 2048 }, { 8, 1722, 2048 }, { 9, 1723, 2048 }, { 8, 1724, 2048 }, { 9, 1725, 2048 }, { 9, 1726, 2048 }, { 10, 1727, 2048 },
  10598. { 5, 1728, 2048 }, { 6, 1729, 2048 }, { 6, 1730, 2048 }, { 7, 1731, 2048 }, { 6, 1732, 2048 }, { 7, 1733, 2048 }, { 7, 1734, 2048 }, { 8, 1735, 2048 },
  10599. { 6, 1736, 2048 }, { 7, 1737, 2048 }, { 7, 1738, 2048 }, { 8, 1739, 2048 }, { 7, 1740, 2048 }, { 8, 1741, 2048 }, { 8, 1742, 2048 }, { 9, 1743, 2048 },
  10600. { 6, 1744, 2048 }, { 7, 1745, 2048 }, { 7, 1746, 2048 }, { 8, 1747, 2048 }, { 7, 1748, 2048 }, { 8, 1749, 2048 }, { 8, 1750, 2048 }, { 9, 1751, 2048 },
  10601. { 7, 1752, 2048 }, { 8, 1753, 2048 }, { 8, 1754, 2048 }, { 9, 1755, 2048 }, { 8, 1756, 2048 }, { 9, 1757, 2048 }, { 9, 1758, 2048 }, { 10, 1759, 2048 },
  10602. { 6, 1760, 2048 }, { 7, 1761, 2048 }, { 7, 1762, 2048 }, { 8, 1763, 2048 }, { 7, 1764, 2048 }, { 8, 1765, 2048 }, { 8, 1766, 2048 }, { 9, 1767, 2048 },
  10603. { 7, 1768, 2048 }, { 8, 1769, 2048 }, { 8, 1770, 2048 }, { 9, 1771, 2048 }, { 8, 1772, 2048 }, { 9, 1773, 2048 }, { 9, 1774, 2048 }, { 10, 1775, 2048 },
  10604. { 7, 1776, 2048 }, { 8, 1777, 2048 }, { 8, 1778, 2048 }, { 9, 1779, 2048 }, { 8, 1780, 2048 }, { 9, 1781, 2048 }, { 9, 1782, 2048 }, { 10, 1783, 2048 },
  10605. { 8, 1784, 2048 }, { 9, 1785, 2048 }, { 9, 1786, 2048 }, { 10, 1787, 2048 }, { 9, 1788, 2048 }, { 10, 1789, 2048 }, { 10, 1790, 2048 }, { 11, 1791, 2048 },
  10606. { 4, 1792, 2048 }, { 5, 1793, 2048 }, { 5, 1794, 2048 }, { 6, 1795, 2048 }, { 5, 1796, 2048 }, { 6, 1797, 2048 }, { 6, 1798, 2048 }, { 7, 1799, 2048 },
  10607. { 5, 1800, 2048 }, { 6, 1801, 2048 }, { 6, 1802, 2048 }, { 7, 1803, 2048 }, { 6, 1804, 2048 }, { 7, 1805, 2048 }, { 7, 1806, 2048 }, { 8, 1807, 2048 },
  10608. { 5, 1808, 2048 }, { 6, 1809, 2048 }, { 6, 1810, 2048 }, { 7, 1811, 2048 }, { 6, 1812, 2048 }, { 7, 1813, 2048 }, { 7, 1814, 2048 }, { 8, 1815, 2048 },
  10609. { 6, 1816, 2048 }, { 7, 1817, 2048 }, { 7, 1818, 2048 }, { 8, 1819, 2048 }, { 7, 1820, 2048 }, { 8, 1821, 2048 }, { 8, 1822, 2048 }, { 9, 1823, 2048 },
  10610. { 5, 1824, 2048 }, { 6, 1825, 2048 }, { 6, 1826, 2048 }, { 7, 1827, 2048 }, { 6, 1828, 2048 }, { 7, 1829, 2048 }, { 7, 1830, 2048 }, { 8, 1831, 2048 },
  10611. { 6, 1832, 2048 }, { 7, 1833, 2048 }, { 7, 1834, 2048 }, { 8, 1835, 2048 }, { 7, 1836, 2048 }, { 8, 1837, 2048 }, { 8, 1838, 2048 }, { 9, 1839, 2048 },
  10612. { 6, 1840, 2048 }, { 7, 1841, 2048 }, { 7, 1842, 2048 }, { 8, 1843, 2048 }, { 7, 1844, 2048 }, { 8, 1845, 2048 }, { 8, 1846, 2048 }, { 9, 1847, 2048 },
  10613. { 7, 1848, 2048 }, { 8, 1849, 2048 }, { 8, 1850, 2048 }, { 9, 1851, 2048 }, { 8, 1852, 2048 }, { 9, 1853, 2048 }, { 9, 1854, 2048 }, { 10, 1855, 2048 },
  10614. { 5, 1856, 2048 }, { 6, 1857, 2048 }, { 6, 1858, 2048 }, { 7, 1859, 2048 }, { 6, 1860, 2048 }, { 7, 1861, 2048 }, { 7, 1862, 2048 }, { 8, 1863, 2048 },
  10615. { 6, 1864, 2048 }, { 7, 1865, 2048 }, { 7, 1866, 2048 }, { 8, 1867, 2048 }, { 7, 1868, 2048 }, { 8, 1869, 2048 }, { 8, 1870, 2048 }, { 9, 1871, 2048 },
  10616. { 6, 1872, 2048 }, { 7, 1873, 2048 }, { 7, 1874, 2048 }, { 8, 1875, 2048 }, { 7, 1876, 2048 }, { 8, 1877, 2048 }, { 8, 1878, 2048 }, { 9, 1879, 2048 },
  10617. { 7, 1880, 2048 }, { 8, 1881, 2048 }, { 8, 1882, 2048 }, { 9, 1883, 2048 }, { 8, 1884, 2048 }, { 9, 1885, 2048 }, { 9, 1886, 2048 }, { 10, 1887, 2048 },
  10618. { 6, 1888, 2048 }, { 7, 1889, 2048 }, { 7, 1890, 2048 }, { 8, 1891, 2048 }, { 7, 1892, 2048 }, { 8, 1893, 2048 }, { 8, 1894, 2048 }, { 9, 1895, 2048 },
  10619. { 7, 1896, 2048 }, { 8, 1897, 2048 }, { 8, 1898, 2048 }, { 9, 1899, 2048 }, { 8, 1900, 2048 }, { 9, 1901, 2048 }, { 9, 1902, 2048 }, { 10, 1903, 2048 },
  10620. { 7, 1904, 2048 }, { 8, 1905, 2048 }, { 8, 1906, 2048 }, { 9, 1907, 2048 }, { 8, 1908, 2048 }, { 9, 1909, 2048 }, { 9, 1910, 2048 }, { 10, 1911, 2048 },
  10621. { 8, 1912, 2048 }, { 9, 1913, 2048 }, { 9, 1914, 2048 }, { 10, 1915, 2048 }, { 9, 1916, 2048 }, { 10, 1917, 2048 }, { 10, 1918, 2048 }, { 11, 1919, 2048 },
  10622. { 5, 1920, 2048 }, { 6, 1921, 2048 }, { 6, 1922, 2048 }, { 7, 1923, 2048 }, { 6, 1924, 2048 }, { 7, 1925, 2048 }, { 7, 1926, 2048 }, { 8, 1927, 2048 },
  10623. { 6, 1928, 2048 }, { 7, 1929, 2048 }, { 7, 1930, 2048 }, { 8, 1931, 2048 }, { 7, 1932, 2048 }, { 8, 1933, 2048 }, { 8, 1934, 2048 }, { 9, 1935, 2048 },
  10624. { 6, 1936, 2048 }, { 7, 1937, 2048 }, { 7, 1938, 2048 }, { 8, 1939, 2048 }, { 7, 1940, 2048 }, { 8, 1941, 2048 }, { 8, 1942, 2048 }, { 9, 1943, 2048 },
  10625. { 7, 1944, 2048 }, { 8, 1945, 2048 }, { 8, 1946, 2048 }, { 9, 1947, 2048 }, { 8, 1948, 2048 }, { 9, 1949, 2048 }, { 9, 1950, 2048 }, { 10, 1951, 2048 },
  10626. { 6, 1952, 2048 }, { 7, 1953, 2048 }, { 7, 1954, 2048 }, { 8, 1955, 2048 }, { 7, 1956, 2048 }, { 8, 1957, 2048 }, { 8, 1958, 2048 }, { 9, 1959, 2048 },
  10627. { 7, 1960, 2048 }, { 8, 1961, 2048 }, { 8, 1962, 2048 }, { 9, 1963, 2048 }, { 8, 1964, 2048 }, { 9, 1965, 2048 }, { 9, 1966, 2048 }, { 10, 1967, 2048 },
  10628. { 7, 1968, 2048 }, { 8, 1969, 2048 }, { 8, 1970, 2048 }, { 9, 1971, 2048 }, { 8, 1972, 2048 }, { 9, 1973, 2048 }, { 9, 1974, 2048 }, { 10, 1975, 2048 },
  10629. { 8, 1976, 2048 }, { 9, 1977, 2048 }, { 9, 1978, 2048 }, { 10, 1979, 2048 }, { 9, 1980, 2048 }, { 10, 1981, 2048 }, { 10, 1982, 2048 }, { 11, 1983, 2048 },
  10630. { 6, 1984, 2048 }, { 7, 1985, 2048 }, { 7, 1986, 2048 }, { 8, 1987, 2048 }, { 7, 1988, 2048 }, { 8, 1989, 2048 }, { 8, 1990, 2048 }, { 9, 1991, 2048 },
  10631. { 7, 1992, 2048 }, { 8, 1993, 2048 }, { 8, 1994, 2048 }, { 9, 1995, 2048 }, { 8, 1996, 2048 }, { 9, 1997, 2048 }, { 9, 1998, 2048 }, { 10, 1999, 2048 },
  10632. { 7, 2000, 2048 }, { 8, 2001, 2048 }, { 8, 2002, 2048 }, { 9, 2003, 2048 }, { 8, 2004, 2048 }, { 9, 2005, 2048 }, { 9, 2006, 2048 }, { 10, 2007, 2048 },
  10633. { 8, 2008, 2048 }, { 9, 2009, 2048 }, { 9, 2010, 2048 }, { 10, 2011, 2048 }, { 9, 2012, 2048 }, { 10, 2013, 2048 }, { 10, 2014, 2048 }, { 11, 2015, 2048 },
  10634. { 7, 2016, 2048 }, { 8, 2017, 2048 }, { 8, 2018, 2048 }, { 9, 2019, 2048 }, { 8, 2020, 2048 }, { 9, 2021, 2048 }, { 9, 2022, 2048 }, { 10, 2023, 2048 },
  10635. { 8, 2024, 2048 }, { 9, 2025, 2048 }, { 9, 2026, 2048 }, { 10, 2027, 2048 }, { 9, 2028, 2048 }, { 10, 2029, 2048 }, { 10, 2030, 2048 }, { 11, 2031, 2048 },
  10636. { 8, 2032, 2048 }, { 9, 2033, 2048 }, { 9, 2034, 2048 }, { 10, 2035, 2048 }, { 9, 2036, 2048 }, { 10, 2037, 2048 }, { 10, 2038, 2048 }, { 11, 2039, 2048 },
  10637. { 9, 2040, 2048 }, { 10, 2041, 2048 }, { 10, 2042, 2048 }, { 11, 2043, 2048 }, { 10, 2044, 2048 }, { 11, 2045, 2048 }, { 11, 2046, 2048 }, { 12, 2047, 2048 },
  10638. #endif
  10639. #endif
  10640. #endif
  10641. #endif
  10642. #endif
  10643. #endif
  10644. };
  10645. /* find a hole and free as required, return -1 if no hole found */
  10646. static int find_hole(void)
  10647. {
  10648. int x, y, z;
  10649. for (z = -1, y = INT_MAX, x = 0; x < FP_ENTRIES; x++) {
  10650. if (fp_cache[x].lru_count < y && fp_cache[x].lock == 0) {
  10651. z = x;
  10652. y = fp_cache[x].lru_count;
  10653. }
  10654. }
  10655. /* decrease all */
  10656. for (x = 0; x < FP_ENTRIES; x++) {
  10657. if (fp_cache[x].lru_count > 3) {
  10658. --(fp_cache[x].lru_count);
  10659. }
  10660. }
  10661. /* free entry z */
  10662. if (z >= 0 && fp_cache[z].g) {
  10663. mp_clear(&fp_cache[z].mu);
  10664. wc_ecc_del_point(fp_cache[z].g);
  10665. fp_cache[z].g = NULL;
  10666. for (x = 0; x < (1<<FP_LUT); x++) {
  10667. wc_ecc_del_point(fp_cache[z].LUT[x]);
  10668. fp_cache[z].LUT[x] = NULL;
  10669. }
  10670. fp_cache[z].LUT_set = 0;
  10671. fp_cache[z].lru_count = 0;
  10672. }
  10673. return z;
  10674. }
  10675. /* determine if a base is already in the cache and if so, where */
  10676. static int find_base(ecc_point* g)
  10677. {
  10678. int x;
  10679. for (x = 0; x < FP_ENTRIES; x++) {
  10680. if (fp_cache[x].g != NULL &&
  10681. mp_cmp(fp_cache[x].g->x, g->x) == MP_EQ &&
  10682. mp_cmp(fp_cache[x].g->y, g->y) == MP_EQ &&
  10683. mp_cmp(fp_cache[x].g->z, g->z) == MP_EQ) {
  10684. break;
  10685. }
  10686. }
  10687. if (x == FP_ENTRIES) {
  10688. x = -1;
  10689. }
  10690. return x;
  10691. }
  10692. /* add a new base to the cache */
  10693. static int add_entry(int idx, ecc_point *g)
  10694. {
  10695. unsigned x, y;
  10696. /* allocate base and LUT */
  10697. fp_cache[idx].g = wc_ecc_new_point();
  10698. if (fp_cache[idx].g == NULL) {
  10699. return GEN_MEM_ERR;
  10700. }
  10701. /* copy x and y */
  10702. if ((mp_copy(g->x, fp_cache[idx].g->x) != MP_OKAY) ||
  10703. (mp_copy(g->y, fp_cache[idx].g->y) != MP_OKAY) ||
  10704. (mp_copy(g->z, fp_cache[idx].g->z) != MP_OKAY)) {
  10705. wc_ecc_del_point(fp_cache[idx].g);
  10706. fp_cache[idx].g = NULL;
  10707. return GEN_MEM_ERR;
  10708. }
  10709. for (x = 0; x < (1U<<FP_LUT); x++) {
  10710. fp_cache[idx].LUT[x] = wc_ecc_new_point();
  10711. if (fp_cache[idx].LUT[x] == NULL) {
  10712. for (y = 0; y < x; y++) {
  10713. wc_ecc_del_point(fp_cache[idx].LUT[y]);
  10714. fp_cache[idx].LUT[y] = NULL;
  10715. }
  10716. wc_ecc_del_point(fp_cache[idx].g);
  10717. fp_cache[idx].g = NULL;
  10718. fp_cache[idx].lru_count = 0;
  10719. return GEN_MEM_ERR;
  10720. }
  10721. }
  10722. fp_cache[idx].LUT_set = 0;
  10723. fp_cache[idx].lru_count = 0;
  10724. return MP_OKAY;
  10725. }
  10726. #endif
  10727. #if !defined(WOLFSSL_SP_MATH)
  10728. /* build the LUT by spacing the bits of the input by #modulus/FP_LUT bits apart
  10729. *
  10730. * The algorithm builds patterns in increasing bit order by first making all
  10731. * single bit input patterns, then all two bit input patterns and so on
  10732. */
  10733. static int build_lut(int idx, mp_int* a, mp_int* modulus, mp_digit mp,
  10734. mp_int* mu)
  10735. {
  10736. int err;
  10737. unsigned x, y, bitlen, lut_gap;
  10738. #ifdef WOLFSSL_SMALL_STACK
  10739. mp_int *tmp = NULL;
  10740. #else
  10741. mp_int tmp[1];
  10742. #endif
  10743. int infinity;
  10744. #ifdef WOLFSSL_SMALL_STACK
  10745. if ((tmp = (mp_int *)XMALLOC(sizeof(*tmp), NULL, DYNAMIC_TYPE_ECC_BUFFER)) == NULL)
  10746. return MEMORY_E;
  10747. #endif
  10748. err = mp_init(tmp);
  10749. if (err != MP_OKAY) {
  10750. err = GEN_MEM_ERR;
  10751. goto errout;
  10752. }
  10753. /* sanity check to make sure lut_order table is of correct size,
  10754. should compile out to a NOP if true */
  10755. if ((sizeof(lut_orders) / sizeof(lut_orders[0])) < (1U<<FP_LUT)) {
  10756. err = BAD_FUNC_ARG;
  10757. goto errout;
  10758. }
  10759. /* get bitlen and round up to next multiple of FP_LUT */
  10760. bitlen = (unsigned)mp_unsigned_bin_size(modulus) << 3;
  10761. x = bitlen % FP_LUT;
  10762. if (x) {
  10763. bitlen += FP_LUT - x;
  10764. }
  10765. lut_gap = bitlen / FP_LUT;
  10766. /* init the mu */
  10767. err = mp_init_copy(&fp_cache[idx].mu, mu);
  10768. if (err != MP_OKAY)
  10769. goto errout;
  10770. /* copy base */
  10771. if ((mp_mulmod(fp_cache[idx].g->x, mu, modulus,
  10772. fp_cache[idx].LUT[1]->x) != MP_OKAY) ||
  10773. (mp_mulmod(fp_cache[idx].g->y, mu, modulus,
  10774. fp_cache[idx].LUT[1]->y) != MP_OKAY) ||
  10775. (mp_mulmod(fp_cache[idx].g->z, mu, modulus,
  10776. fp_cache[idx].LUT[1]->z) != MP_OKAY)) {
  10777. err = MP_MULMOD_E;
  10778. goto errout;
  10779. }
  10780. /* make all single bit entries */
  10781. for (x = 1; x < FP_LUT; x++) {
  10782. if ((mp_copy(fp_cache[idx].LUT[1<<(x-1)]->x,
  10783. fp_cache[idx].LUT[1<<x]->x) != MP_OKAY) ||
  10784. (mp_copy(fp_cache[idx].LUT[1<<(x-1)]->y,
  10785. fp_cache[idx].LUT[1<<x]->y) != MP_OKAY) ||
  10786. (mp_copy(fp_cache[idx].LUT[1<<(x-1)]->z,
  10787. fp_cache[idx].LUT[1<<x]->z) != MP_OKAY)){
  10788. err = MP_INIT_E;
  10789. goto errout;
  10790. } else {
  10791. /* now double it bitlen/FP_LUT times */
  10792. for (y = 0; y < lut_gap; y++) {
  10793. if ((err = ecc_projective_dbl_point_safe(fp_cache[idx].LUT[1<<x],
  10794. fp_cache[idx].LUT[1<<x], a, modulus, mp)) != MP_OKAY) {
  10795. goto errout;
  10796. }
  10797. }
  10798. }
  10799. }
  10800. /* now make all entries in increase order of hamming weight */
  10801. for (x = 2; x <= FP_LUT; x++) {
  10802. if (err != MP_OKAY)
  10803. goto errout;
  10804. for (y = 0; y < (1UL<<FP_LUT); y++) {
  10805. if (lut_orders[y].ham != (int)x) continue;
  10806. /* perform the add */
  10807. if ((err = ecc_projective_add_point_safe(
  10808. fp_cache[idx].LUT[lut_orders[y].terma],
  10809. fp_cache[idx].LUT[lut_orders[y].termb],
  10810. fp_cache[idx].LUT[y], a, modulus, mp,
  10811. &infinity)) != MP_OKAY) {
  10812. goto errout;
  10813. }
  10814. }
  10815. }
  10816. /* now map all entries back to affine space to make point addition faster */
  10817. for (x = 1; x < (1UL<<FP_LUT); x++) {
  10818. if (err != MP_OKAY)
  10819. break;
  10820. /* convert z to normal from montgomery */
  10821. err = mp_montgomery_reduce(fp_cache[idx].LUT[x]->z, modulus, mp);
  10822. /* invert it */
  10823. if (err == MP_OKAY)
  10824. err = mp_invmod(fp_cache[idx].LUT[x]->z, modulus,
  10825. fp_cache[idx].LUT[x]->z);
  10826. if (err == MP_OKAY)
  10827. /* now square it */
  10828. err = mp_sqrmod(fp_cache[idx].LUT[x]->z, modulus, tmp);
  10829. if (err == MP_OKAY)
  10830. /* fix x */
  10831. err = mp_mulmod(fp_cache[idx].LUT[x]->x, tmp, modulus,
  10832. fp_cache[idx].LUT[x]->x);
  10833. if (err == MP_OKAY)
  10834. /* get 1/z^3 */
  10835. err = mp_mulmod(tmp, fp_cache[idx].LUT[x]->z, modulus, tmp);
  10836. if (err == MP_OKAY)
  10837. /* fix y */
  10838. err = mp_mulmod(fp_cache[idx].LUT[x]->y, tmp, modulus,
  10839. fp_cache[idx].LUT[x]->y);
  10840. if (err == MP_OKAY)
  10841. /* free z */
  10842. mp_clear(fp_cache[idx].LUT[x]->z);
  10843. }
  10844. errout:
  10845. mp_clear(tmp);
  10846. #ifdef WOLFSSL_SMALL_STACK
  10847. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  10848. #endif
  10849. if (err == MP_OKAY) {
  10850. fp_cache[idx].LUT_set = 1;
  10851. return MP_OKAY;
  10852. }
  10853. /* err cleanup */
  10854. for (y = 0; y < (1U<<FP_LUT); y++) {
  10855. wc_ecc_del_point(fp_cache[idx].LUT[y]);
  10856. fp_cache[idx].LUT[y] = NULL;
  10857. }
  10858. wc_ecc_del_point(fp_cache[idx].g);
  10859. fp_cache[idx].g = NULL;
  10860. fp_cache[idx].LUT_set = 0;
  10861. fp_cache[idx].lru_count = 0;
  10862. mp_clear(&fp_cache[idx].mu);
  10863. return err;
  10864. }
  10865. /* perform a fixed point ECC mulmod */
  10866. static int accel_fp_mul(int idx, const mp_int* k, ecc_point *R, mp_int* a,
  10867. mp_int* modulus, mp_digit mp, int map)
  10868. {
  10869. #ifdef WOLFCRYPT_HAVE_SAKKE
  10870. #define KB_SIZE 256
  10871. #else
  10872. #define KB_SIZE 128
  10873. #endif
  10874. #ifdef WOLFSSL_SMALL_STACK
  10875. unsigned char* kb = NULL;
  10876. mp_int* tk = NULL;
  10877. mp_int* order = NULL;
  10878. #else
  10879. unsigned char kb[KB_SIZE];
  10880. mp_int tk[1];
  10881. mp_int order[1];
  10882. #endif
  10883. int x, err;
  10884. unsigned y, z = 0, bitlen, bitpos, lut_gap;
  10885. int first;
  10886. int tk_zeroize = 0;
  10887. #ifdef WOLFSSL_SMALL_STACK
  10888. tk = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  10889. if (tk == NULL) {
  10890. err = MEMORY_E; goto done;
  10891. }
  10892. order = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  10893. if (order == NULL) {
  10894. err = MEMORY_E; goto done;
  10895. }
  10896. #endif
  10897. if (mp_init_multi(tk, order, NULL, NULL, NULL, NULL) != MP_OKAY) {
  10898. err = MP_INIT_E; goto done;
  10899. }
  10900. if ((err = mp_copy(k, tk)) != MP_OKAY)
  10901. goto done;
  10902. tk_zeroize = 1;
  10903. #ifdef WOLFSSL_CHECK_MEM_ZERO
  10904. mp_memzero_add("accel_fp_mul tk", tk);
  10905. #endif
  10906. /* if it's smaller than modulus we fine */
  10907. if (mp_unsigned_bin_size(k) > mp_unsigned_bin_size(modulus)) {
  10908. /* find order */
  10909. y = (unsigned)mp_unsigned_bin_size(modulus);
  10910. for (x = 0; ecc_sets[x].size; x++) {
  10911. if (y <= (unsigned)ecc_sets[x].size) break;
  10912. }
  10913. /* back off if we are on the 521 bit curve */
  10914. if (y == 66) --x;
  10915. if ((err = mp_read_radix(order, ecc_sets[x].order,
  10916. MP_RADIX_HEX)) != MP_OKAY) {
  10917. goto done;
  10918. }
  10919. /* k must be less than modulus */
  10920. if (mp_cmp(tk, order) != MP_LT) {
  10921. if ((err = mp_mod(tk, order, tk)) != MP_OKAY) {
  10922. goto done;
  10923. }
  10924. }
  10925. }
  10926. /* get bitlen and round up to next multiple of FP_LUT */
  10927. bitlen = (unsigned)mp_unsigned_bin_size(modulus) << 3;
  10928. x = bitlen % FP_LUT;
  10929. if (x) {
  10930. bitlen += FP_LUT - (unsigned)x;
  10931. }
  10932. lut_gap = bitlen / FP_LUT;
  10933. /* get the k value */
  10934. if (mp_unsigned_bin_size(tk) > (int)(KB_SIZE - 2)) {
  10935. err = BUFFER_E; goto done;
  10936. }
  10937. /* store k */
  10938. #ifdef WOLFSSL_SMALL_STACK
  10939. kb = (unsigned char*)XMALLOC(KB_SIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  10940. if (kb == NULL) {
  10941. err = MEMORY_E; goto done;
  10942. }
  10943. #endif
  10944. XMEMSET(kb, 0, KB_SIZE);
  10945. if ((err = mp_to_unsigned_bin(tk, kb)) == MP_OKAY) {
  10946. #ifdef WOLFSSL_CHECK_MEM_ZERO
  10947. wc_MemZero_Add("accel_fp_mul kb", kb, KB_SIZE);
  10948. #endif
  10949. /* let's reverse kb so it's little endian */
  10950. x = 0;
  10951. y = (unsigned)mp_unsigned_bin_size(tk);
  10952. if (y > 0) {
  10953. y -= 1;
  10954. }
  10955. while ((unsigned)x < y) {
  10956. z = kb[x]; kb[x] = kb[y]; kb[y] = (byte)z;
  10957. ++x; --y;
  10958. }
  10959. /* at this point we can start, yipee */
  10960. first = 1;
  10961. for (x = (int)lut_gap-1; x >= 0; x--) {
  10962. /* extract FP_LUT bits from kb spread out by lut_gap bits and offset
  10963. by x bits from the start */
  10964. bitpos = (unsigned)x;
  10965. for (y = z = 0; y < FP_LUT; y++) {
  10966. z |= ((kb[bitpos>>3] >> (bitpos&7)) & 1) << y;
  10967. bitpos += lut_gap; /* it's y*lut_gap + x, but here we can avoid
  10968. the mult in each loop */
  10969. }
  10970. /* double if not first */
  10971. if (!first) {
  10972. if ((err = ecc_projective_dbl_point_safe(R, R, a, modulus,
  10973. mp)) != MP_OKAY) {
  10974. break;
  10975. }
  10976. }
  10977. /* add if not first, otherwise copy */
  10978. if (!first && z) {
  10979. if ((err = ecc_projective_add_point_safe(R, fp_cache[idx].LUT[z],
  10980. R, a, modulus, mp, &first)) != MP_OKAY) {
  10981. break;
  10982. }
  10983. } else if (z) {
  10984. if ((mp_copy(fp_cache[idx].LUT[z]->x, R->x) != MP_OKAY) ||
  10985. (mp_copy(fp_cache[idx].LUT[z]->y, R->y) != MP_OKAY) ||
  10986. (mp_copy(&fp_cache[idx].mu, R->z) != MP_OKAY)) {
  10987. err = GEN_MEM_ERR;
  10988. break;
  10989. }
  10990. first = 0;
  10991. }
  10992. }
  10993. }
  10994. if (err == MP_OKAY) {
  10995. (void) z; /* Acknowledge the unused assignment */
  10996. ForceZero(kb, KB_SIZE);
  10997. /* map R back from projective space */
  10998. if (map) {
  10999. err = ecc_map(R, modulus, mp);
  11000. } else {
  11001. err = MP_OKAY;
  11002. }
  11003. }
  11004. done:
  11005. /* cleanup */
  11006. mp_clear(order);
  11007. /* Ensure it was initialized. */
  11008. if (tk_zeroize) {
  11009. mp_forcezero(tk);
  11010. }
  11011. #ifdef WOLFSSL_SMALL_STACK
  11012. XFREE(kb, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11013. XFREE(order, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11014. XFREE(tk, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11015. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  11016. wc_MemZero_Check(kb, KB_SIZE);
  11017. mp_memzero_check(tk);
  11018. #endif
  11019. #undef KB_SIZE
  11020. return err;
  11021. }
  11022. #endif
  11023. #ifdef ECC_SHAMIR
  11024. #if !defined(WOLFSSL_SP_MATH)
  11025. /* perform a fixed point ECC mulmod */
  11026. static int accel_fp_mul2add(int idx1, int idx2,
  11027. mp_int* kA, mp_int* kB,
  11028. ecc_point *R, mp_int* a,
  11029. mp_int* modulus, mp_digit mp)
  11030. {
  11031. #define KB_SIZE 128
  11032. #ifdef WOLFSSL_SMALL_STACK
  11033. unsigned char* kb[2] = {NULL, NULL};
  11034. mp_int* tka = NULL;
  11035. mp_int* tkb = NULL;
  11036. mp_int* order = NULL;
  11037. #else
  11038. unsigned char kb[2][KB_SIZE];
  11039. mp_int tka[1];
  11040. mp_int tkb[1];
  11041. mp_int order[1];
  11042. #endif
  11043. int x, err;
  11044. unsigned y, z, bitlen, bitpos, lut_gap, zA, zB;
  11045. int first;
  11046. #ifdef WOLFSSL_SMALL_STACK
  11047. tka = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  11048. if (tka == NULL) {
  11049. err = MEMORY_E; goto done;
  11050. }
  11051. tkb = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  11052. if (tkb == NULL) {
  11053. err = MEMORY_E; goto done;
  11054. }
  11055. order = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC);
  11056. if (order == NULL) {
  11057. err = MEMORY_E; goto done;
  11058. }
  11059. #endif
  11060. if (mp_init_multi(tka, tkb, order, NULL, NULL, NULL) != MP_OKAY) {
  11061. err = MP_INIT_E; goto done;
  11062. }
  11063. /* if it's smaller than modulus we fine */
  11064. if (mp_unsigned_bin_size(kA) > mp_unsigned_bin_size(modulus)) {
  11065. /* find order */
  11066. y = (unsigned)mp_unsigned_bin_size(modulus);
  11067. for (x = 0; ecc_sets[x].size; x++) {
  11068. if (y <= (unsigned)ecc_sets[x].size) break;
  11069. }
  11070. /* back off if we are on the 521 bit curve */
  11071. if (y == 66) --x;
  11072. if ((err = mp_read_radix(order, ecc_sets[x].order,
  11073. MP_RADIX_HEX)) != MP_OKAY) {
  11074. goto done;
  11075. }
  11076. /* kA must be less than modulus */
  11077. if (mp_cmp(kA, order) != MP_LT) {
  11078. if ((err = mp_mod(kA, order, tka)) != MP_OKAY) {
  11079. goto done;
  11080. }
  11081. } else {
  11082. if ((err = mp_copy(kA, tka)) != MP_OKAY) {
  11083. goto done;
  11084. }
  11085. }
  11086. } else {
  11087. if ((err = mp_copy(kA, tka)) != MP_OKAY) {
  11088. goto done;
  11089. }
  11090. }
  11091. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11092. mp_memzero_add("accel_fp_mul2add tka", tka);
  11093. #endif
  11094. /* if it's smaller than modulus we fine */
  11095. if (mp_unsigned_bin_size(kB) > mp_unsigned_bin_size(modulus)) {
  11096. /* find order */
  11097. y = (unsigned)mp_unsigned_bin_size(modulus);
  11098. for (x = 0; ecc_sets[x].size; x++) {
  11099. if (y <= (unsigned)ecc_sets[x].size) break;
  11100. }
  11101. /* back off if we are on the 521 bit curve */
  11102. if (y == 66) --x;
  11103. if ((err = mp_read_radix(order, ecc_sets[x].order,
  11104. MP_RADIX_HEX)) != MP_OKAY) {
  11105. goto done;
  11106. }
  11107. /* kB must be less than modulus */
  11108. if (mp_cmp(kB, order) != MP_LT) {
  11109. if ((err = mp_mod(kB, order, tkb)) != MP_OKAY) {
  11110. goto done;
  11111. }
  11112. } else {
  11113. if ((err = mp_copy(kB, tkb)) != MP_OKAY) {
  11114. goto done;
  11115. }
  11116. }
  11117. } else {
  11118. if ((err = mp_copy(kB, tkb)) != MP_OKAY) {
  11119. goto done;
  11120. }
  11121. }
  11122. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11123. mp_memzero_add("accel_fp_mul2add tkb", tkb);
  11124. #endif
  11125. /* get bitlen and round up to next multiple of FP_LUT */
  11126. bitlen = (unsigned)mp_unsigned_bin_size(modulus) << 3;
  11127. x = bitlen % FP_LUT;
  11128. if (x) {
  11129. bitlen += FP_LUT - (unsigned)x;
  11130. }
  11131. lut_gap = bitlen / FP_LUT;
  11132. /* get the k value */
  11133. if ((mp_unsigned_bin_size(tka) > (int)(KB_SIZE - 2)) ||
  11134. (mp_unsigned_bin_size(tkb) > (int)(KB_SIZE - 2)) ) {
  11135. err = BUFFER_E; goto done;
  11136. }
  11137. /* store k */
  11138. #ifdef WOLFSSL_SMALL_STACK
  11139. kb[0] = (unsigned char*)XMALLOC(KB_SIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11140. if (kb[0] == NULL) {
  11141. err = MEMORY_E; goto done;
  11142. }
  11143. #endif
  11144. XMEMSET(kb[0], 0, KB_SIZE);
  11145. if ((err = mp_to_unsigned_bin(tka, kb[0])) != MP_OKAY) {
  11146. goto done;
  11147. }
  11148. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11149. wc_MemZero_Add("accel_fp_mul2add kb[0]", kb[0], KB_SIZE);
  11150. #endif
  11151. /* let's reverse kb so it's little endian */
  11152. x = 0;
  11153. y = (unsigned)mp_unsigned_bin_size(tka);
  11154. if (y > 0) {
  11155. y -= 1;
  11156. }
  11157. mp_clear(tka);
  11158. while ((unsigned)x < y) {
  11159. z = kb[0][x]; kb[0][x] = kb[0][y]; kb[0][y] = (byte)z;
  11160. ++x; --y;
  11161. }
  11162. /* store b */
  11163. #ifdef WOLFSSL_SMALL_STACK
  11164. kb[1] = (unsigned char*)XMALLOC(KB_SIZE, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11165. if (kb[1] == NULL) {
  11166. err = MEMORY_E; goto done;
  11167. }
  11168. #endif
  11169. XMEMSET(kb[1], 0, KB_SIZE);
  11170. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11171. wc_MemZero_Add("accel_fp_mul2add kb[1]", kb[1], KB_SIZE);
  11172. #endif
  11173. if ((err = mp_to_unsigned_bin(tkb, kb[1])) == MP_OKAY) {
  11174. x = 0;
  11175. y = (unsigned)mp_unsigned_bin_size(tkb);
  11176. if (y > 0) {
  11177. y -= 1;
  11178. }
  11179. while ((unsigned)x < y) {
  11180. z = kb[1][x]; kb[1][x] = kb[1][y]; kb[1][y] = (byte)z;
  11181. ++x; --y;
  11182. }
  11183. /* at this point we can start, yipee */
  11184. first = 1;
  11185. for (x = (int)lut_gap-1; x >= 0; x--) {
  11186. /* extract FP_LUT bits from kb spread out by lut_gap bits and
  11187. offset by x bits from the start */
  11188. bitpos = (unsigned)x;
  11189. for (y = zA = zB = 0; y < FP_LUT; y++) {
  11190. zA |= ((kb[0][bitpos>>3] >> (bitpos&7)) & 1) << y;
  11191. zB |= ((kb[1][bitpos>>3] >> (bitpos&7)) & 1) << y;
  11192. bitpos += lut_gap; /* it's y*lut_gap + x, but here we can avoid
  11193. the mult in each loop */
  11194. }
  11195. /* double if not first */
  11196. if (!first) {
  11197. if ((err = ecc_projective_dbl_point_safe(R, R, a, modulus,
  11198. mp)) != MP_OKAY) {
  11199. break;
  11200. }
  11201. /* add if not first, otherwise copy */
  11202. if (zA) {
  11203. if ((err = ecc_projective_add_point_safe(R,
  11204. fp_cache[idx1].LUT[zA], R, a,
  11205. modulus, mp, &first)) != MP_OKAY) {
  11206. break;
  11207. }
  11208. }
  11209. if (zB) {
  11210. if ((err = ecc_projective_add_point_safe(R,
  11211. fp_cache[idx2].LUT[zB], R, a,
  11212. modulus, mp, &first)) != MP_OKAY) {
  11213. break;
  11214. }
  11215. }
  11216. } else {
  11217. if (zA) {
  11218. if ((mp_copy(fp_cache[idx1].LUT[zA]->x, R->x) != MP_OKAY) ||
  11219. (mp_copy(fp_cache[idx1].LUT[zA]->y, R->y) != MP_OKAY) ||
  11220. (mp_copy(&fp_cache[idx1].mu, R->z) != MP_OKAY)) {
  11221. err = GEN_MEM_ERR;
  11222. break;
  11223. }
  11224. first = 0;
  11225. }
  11226. if (zB && first == 0) {
  11227. if ((err = ecc_projective_add_point_safe(R,
  11228. fp_cache[idx2].LUT[zB], R, a,
  11229. modulus, mp, &first)) != MP_OKAY){
  11230. break;
  11231. }
  11232. } else if (zB && first == 1) {
  11233. if ((mp_copy(fp_cache[idx2].LUT[zB]->x, R->x) != MP_OKAY) ||
  11234. (mp_copy(fp_cache[idx2].LUT[zB]->y, R->y) != MP_OKAY) ||
  11235. (mp_copy(&fp_cache[idx2].mu, R->z) != MP_OKAY)) {
  11236. err = GEN_MEM_ERR;
  11237. break;
  11238. }
  11239. first = 0;
  11240. }
  11241. }
  11242. }
  11243. }
  11244. done:
  11245. /* cleanup */
  11246. mp_forcezero(tkb);
  11247. mp_forcezero(tka);
  11248. mp_clear(order);
  11249. #ifdef WOLFSSL_SMALL_STACK
  11250. if (kb[0])
  11251. #endif
  11252. ForceZero(kb[0], KB_SIZE);
  11253. #ifdef WOLFSSL_SMALL_STACK
  11254. if (kb[1])
  11255. #endif
  11256. ForceZero(kb[1], KB_SIZE);
  11257. #ifdef WOLFSSL_SMALL_STACK
  11258. XFREE(kb[1], NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11259. XFREE(kb[0], NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11260. XFREE(order, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11261. XFREE(tkb, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11262. XFREE(tka, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11263. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  11264. wc_MemZero_Check(kb[1], KB_SIZE);
  11265. wc_MemZero_Check(kb[0], KB_SIZE);
  11266. mp_memzero_check(tkb);
  11267. mp_memzero_check(tka);
  11268. #endif
  11269. #undef KB_SIZE
  11270. if (err != MP_OKAY)
  11271. return err;
  11272. return ecc_map(R, modulus, mp);
  11273. }
  11274. /** ECC Fixed Point mulmod global with heap hint used
  11275. Computes kA*A + kB*B = C using Shamir's Trick
  11276. A First point to multiply
  11277. kA What to multiple A by
  11278. B Second point to multiply
  11279. kB What to multiple B by
  11280. C [out] Destination point (can overlap with A or B)
  11281. a ECC curve parameter a
  11282. modulus Modulus for curve
  11283. return MP_OKAY on success
  11284. */
  11285. int ecc_mul2add(ecc_point* A, mp_int* kA,
  11286. ecc_point* B, mp_int* kB,
  11287. ecc_point* C, mp_int* a, mp_int* modulus, void* heap)
  11288. {
  11289. int idx1 = -1, idx2 = -1, err, mpInit = 0;
  11290. mp_digit mp;
  11291. #ifdef WOLFSSL_SMALL_STACK
  11292. mp_int *mu = (mp_int *)XMALLOC(sizeof *mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11293. if (mu == NULL)
  11294. return MP_MEM;
  11295. #else
  11296. mp_int mu[1];
  11297. #endif
  11298. err = mp_init(mu);
  11299. if (err != MP_OKAY) {
  11300. #ifdef WOLFSSL_SMALL_STACK
  11301. XFREE(mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11302. #endif
  11303. return err;
  11304. }
  11305. #ifndef HAVE_THREAD_LS
  11306. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  11307. wc_InitMutex(&ecc_fp_lock);
  11308. initMutex = 1;
  11309. }
  11310. if (wc_LockMutex(&ecc_fp_lock) != 0) {
  11311. #ifdef WOLFSSL_SMALL_STACK
  11312. XFREE(mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11313. #endif
  11314. return BAD_MUTEX_E;
  11315. }
  11316. #endif /* HAVE_THREAD_LS */
  11317. SAVE_VECTOR_REGISTERS(err = _svr_ret;);
  11318. /* find point */
  11319. idx1 = find_base(A);
  11320. /* no entry? */
  11321. if (idx1 == -1) {
  11322. /* find hole and add it */
  11323. if ((idx1 = find_hole()) >= 0) {
  11324. err = add_entry(idx1, A);
  11325. }
  11326. }
  11327. if (err == MP_OKAY && idx1 != -1) {
  11328. /* increment LRU */
  11329. ++(fp_cache[idx1].lru_count);
  11330. }
  11331. if (err == MP_OKAY) {
  11332. /* find point */
  11333. idx2 = find_base(B);
  11334. /* no entry? */
  11335. if (idx2 == -1) {
  11336. /* find hole and add it */
  11337. if ((idx2 = find_hole()) >= 0)
  11338. err = add_entry(idx2, B);
  11339. }
  11340. }
  11341. if (err == MP_OKAY && idx2 != -1) {
  11342. /* increment LRU */
  11343. ++(fp_cache[idx2].lru_count);
  11344. }
  11345. if (err == MP_OKAY) {
  11346. /* if it's >= 2 AND the LUT is not set build the LUT */
  11347. if (idx1 >= 0 && fp_cache[idx1].lru_count >= 2 && !fp_cache[idx1].LUT_set) {
  11348. /* compute mp */
  11349. err = mp_montgomery_setup(modulus, &mp);
  11350. if (err == MP_OKAY) {
  11351. mpInit = 1;
  11352. err = mp_montgomery_calc_normalization(mu, modulus);
  11353. }
  11354. if (err == MP_OKAY)
  11355. /* build the LUT */
  11356. err = build_lut(idx1, a, modulus, mp, mu);
  11357. }
  11358. }
  11359. if (err == MP_OKAY) {
  11360. /* if it's >= 2 AND the LUT is not set build the LUT */
  11361. if (idx2 >= 0 && fp_cache[idx2].lru_count >= 2 && !fp_cache[idx2].LUT_set) {
  11362. if (mpInit == 0) {
  11363. /* compute mp */
  11364. err = mp_montgomery_setup(modulus, &mp);
  11365. if (err == MP_OKAY) {
  11366. mpInit = 1;
  11367. err = mp_montgomery_calc_normalization(mu, modulus);
  11368. }
  11369. }
  11370. if (err == MP_OKAY)
  11371. /* build the LUT */
  11372. err = build_lut(idx2, a, modulus, mp, mu);
  11373. }
  11374. }
  11375. if (err == MP_OKAY) {
  11376. if (idx1 >=0 && idx2 >= 0 && fp_cache[idx1].LUT_set &&
  11377. fp_cache[idx2].LUT_set) {
  11378. if (mpInit == 0) {
  11379. /* compute mp */
  11380. err = mp_montgomery_setup(modulus, &mp);
  11381. }
  11382. if (err == MP_OKAY)
  11383. err = accel_fp_mul2add(idx1, idx2, kA, kB, C, a, modulus, mp);
  11384. } else {
  11385. err = normal_ecc_mul2add(A, kA, B, kB, C, a, modulus, heap);
  11386. }
  11387. }
  11388. RESTORE_VECTOR_REGISTERS();
  11389. #ifndef HAVE_THREAD_LS
  11390. wc_UnLockMutex(&ecc_fp_lock);
  11391. #endif /* HAVE_THREAD_LS */
  11392. mp_clear(mu);
  11393. #ifdef WOLFSSL_SMALL_STACK
  11394. XFREE(mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11395. #endif
  11396. return err;
  11397. }
  11398. #endif
  11399. #endif /* ECC_SHAMIR */
  11400. /** ECC Fixed Point mulmod global
  11401. k The multiplicand
  11402. G Base point to multiply
  11403. R [out] Destination of product
  11404. a ECC curve parameter a
  11405. modulus The modulus for the curve
  11406. map [boolean] If non-zero maps the point back to affine coordinates,
  11407. otherwise it's left in jacobian-montgomery form
  11408. return MP_OKAY if successful
  11409. */
  11410. int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  11411. mp_int* modulus, int map, void* heap)
  11412. {
  11413. #if !defined(WOLFSSL_SP_MATH)
  11414. int idx, err = MP_OKAY;
  11415. mp_digit mp;
  11416. #ifdef WOLFSSL_SMALL_STACK
  11417. mp_int *mu = NULL;
  11418. #else
  11419. mp_int mu[1];
  11420. #endif
  11421. int mpSetup = 0;
  11422. #ifndef HAVE_THREAD_LS
  11423. int got_ecc_fp_lock = 0;
  11424. #endif
  11425. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL) {
  11426. return ECC_BAD_ARG_E;
  11427. }
  11428. /* k can't have more bits than modulus count plus 1 */
  11429. if (mp_count_bits(k) > mp_count_bits(modulus) + 1) {
  11430. return ECC_OUT_OF_RANGE_E;
  11431. }
  11432. #ifdef WOLFSSL_SMALL_STACK
  11433. if ((mu = (mp_int *)XMALLOC(sizeof(*mu), NULL, DYNAMIC_TYPE_ECC_BUFFER)) == NULL)
  11434. return MP_MEM;
  11435. #endif
  11436. if (mp_init(mu) != MP_OKAY) {
  11437. err = MP_INIT_E;
  11438. goto out;
  11439. }
  11440. #ifndef HAVE_THREAD_LS
  11441. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  11442. wc_InitMutex(&ecc_fp_lock);
  11443. initMutex = 1;
  11444. }
  11445. if (wc_LockMutex(&ecc_fp_lock) != 0) {
  11446. err = BAD_MUTEX_E;
  11447. goto out;
  11448. }
  11449. got_ecc_fp_lock = 1;
  11450. #endif /* HAVE_THREAD_LS */
  11451. SAVE_VECTOR_REGISTERS(err = _svr_ret; goto out;);
  11452. /* find point */
  11453. idx = find_base(G);
  11454. /* no entry? */
  11455. if (idx == -1) {
  11456. /* find hole and add it */
  11457. idx = find_hole();
  11458. if (idx >= 0)
  11459. err = add_entry(idx, G);
  11460. }
  11461. if (err == MP_OKAY && idx >= 0) {
  11462. /* increment LRU */
  11463. ++(fp_cache[idx].lru_count);
  11464. }
  11465. if (err == MP_OKAY) {
  11466. /* if it's 2 build the LUT, if it's higher just use the LUT */
  11467. if (idx >= 0 && fp_cache[idx].lru_count >= 2 && !fp_cache[idx].LUT_set) {
  11468. /* compute mp */
  11469. err = mp_montgomery_setup(modulus, &mp);
  11470. if (err == MP_OKAY) {
  11471. /* compute mu */
  11472. mpSetup = 1;
  11473. err = mp_montgomery_calc_normalization(mu, modulus);
  11474. }
  11475. if (err == MP_OKAY)
  11476. /* build the LUT */
  11477. err = build_lut(idx, a, modulus, mp, mu);
  11478. }
  11479. }
  11480. if (err == MP_OKAY) {
  11481. if (idx >= 0 && fp_cache[idx].LUT_set) {
  11482. if (mpSetup == 0) {
  11483. /* compute mp */
  11484. err = mp_montgomery_setup(modulus, &mp);
  11485. }
  11486. if (err == MP_OKAY)
  11487. err = accel_fp_mul(idx, k, R, a, modulus, mp, map);
  11488. } else {
  11489. err = normal_ecc_mulmod(k, G, R, a, modulus, NULL, map, heap);
  11490. }
  11491. }
  11492. RESTORE_VECTOR_REGISTERS();
  11493. out:
  11494. #ifndef HAVE_THREAD_LS
  11495. if (got_ecc_fp_lock)
  11496. wc_UnLockMutex(&ecc_fp_lock);
  11497. #endif /* HAVE_THREAD_LS */
  11498. mp_clear(mu);
  11499. #ifdef WOLFSSL_SMALL_STACK
  11500. XFREE(mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11501. #endif
  11502. return err;
  11503. #else /* WOLFSSL_SP_MATH */
  11504. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL) {
  11505. return ECC_BAD_ARG_E;
  11506. }
  11507. if (mp_count_bits(G->x) > mp_count_bits(modulus) ||
  11508. mp_count_bits(G->y) > mp_count_bits(modulus) ||
  11509. mp_count_bits(G->z) > mp_count_bits(modulus)) {
  11510. return IS_POINT_E;
  11511. }
  11512. #ifndef WOLFSSL_SP_NO_256
  11513. if (mp_count_bits(modulus) == 256) {
  11514. int ret;
  11515. SAVE_VECTOR_REGISTERS(return _svr_ret);
  11516. ret = sp_ecc_mulmod_256(k, G, R, map, heap);
  11517. RESTORE_VECTOR_REGISTERS();
  11518. return ret;
  11519. }
  11520. #endif
  11521. #ifdef WOLFSSL_SP_384
  11522. if (mp_count_bits(modulus) == 384) {
  11523. int ret;
  11524. SAVE_VECTOR_REGISTERS(return _svr_ret);
  11525. ret = sp_ecc_mulmod_384(k, G, R, map, heap);
  11526. RESTORE_VECTOR_REGISTERS();
  11527. return ret;
  11528. }
  11529. #endif
  11530. #ifdef WOLFSSL_SP_521
  11531. if (mp_count_bits(modulus) == 521) {
  11532. int ret;
  11533. SAVE_VECTOR_REGISTERS(return _svr_ret);
  11534. ret = sp_ecc_mulmod_521(k, G, R, map, heap);
  11535. RESTORE_VECTOR_REGISTERS();
  11536. return ret;
  11537. }
  11538. #endif
  11539. return WC_KEY_SIZE_E;
  11540. #endif /* WOLFSSL_SP_MATH */
  11541. }
  11542. /** ECC Fixed Point mulmod global
  11543. k The multiplicand
  11544. G Base point to multiply
  11545. R [out] Destination of product
  11546. a ECC curve parameter a
  11547. modulus The modulus for the curve
  11548. map [boolean] If non-zero maps the point back to affine coordinates,
  11549. otherwise it's left in jacobian-montgomery form
  11550. return MP_OKAY if successful
  11551. */
  11552. int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
  11553. mp_int* modulus, mp_int* order, WC_RNG* rng, int map, void* heap)
  11554. {
  11555. #if !defined(WOLFSSL_SP_MATH)
  11556. int idx, err = MP_OKAY;
  11557. mp_digit mp;
  11558. #ifdef WOLFSSL_SMALL_STACK
  11559. mp_int *mu = NULL;
  11560. #else
  11561. mp_int mu[1];
  11562. #endif
  11563. int mpSetup = 0;
  11564. #ifndef HAVE_THREAD_LS
  11565. int got_ecc_fp_lock = 0;
  11566. #endif
  11567. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL ||
  11568. order == NULL) {
  11569. return ECC_BAD_ARG_E;
  11570. }
  11571. /* k can't have more bits than order */
  11572. if (mp_count_bits(k) > mp_count_bits(order)) {
  11573. return ECC_OUT_OF_RANGE_E;
  11574. }
  11575. #ifdef WOLFSSL_SMALL_STACK
  11576. if ((mu = (mp_int *)XMALLOC(sizeof(*mu), NULL, DYNAMIC_TYPE_ECC_BUFFER)) == NULL)
  11577. return MP_MEM;
  11578. #endif
  11579. if (mp_init(mu) != MP_OKAY) {
  11580. err = MP_INIT_E;
  11581. goto out;
  11582. }
  11583. #ifndef HAVE_THREAD_LS
  11584. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  11585. wc_InitMutex(&ecc_fp_lock);
  11586. initMutex = 1;
  11587. }
  11588. if (wc_LockMutex(&ecc_fp_lock) != 0) {
  11589. err = BAD_MUTEX_E;
  11590. goto out;
  11591. }
  11592. got_ecc_fp_lock = 1;
  11593. #endif /* HAVE_THREAD_LS */
  11594. SAVE_VECTOR_REGISTERS(err = _svr_ret; goto out;);
  11595. /* find point */
  11596. idx = find_base(G);
  11597. /* no entry? */
  11598. if (idx == -1) {
  11599. /* find hole and add it */
  11600. idx = find_hole();
  11601. if (idx >= 0)
  11602. err = add_entry(idx, G);
  11603. }
  11604. if (err == MP_OKAY && idx >= 0) {
  11605. /* increment LRU */
  11606. ++(fp_cache[idx].lru_count);
  11607. }
  11608. if (err == MP_OKAY) {
  11609. /* if it's 2 build the LUT, if it's higher just use the LUT */
  11610. if (idx >= 0 && fp_cache[idx].lru_count >= 2 && !fp_cache[idx].LUT_set) {
  11611. /* compute mp */
  11612. err = mp_montgomery_setup(modulus, &mp);
  11613. if (err == MP_OKAY) {
  11614. /* compute mu */
  11615. mpSetup = 1;
  11616. err = mp_montgomery_calc_normalization(mu, modulus);
  11617. }
  11618. if (err == MP_OKAY)
  11619. /* build the LUT */
  11620. err = build_lut(idx, a, modulus, mp, mu);
  11621. }
  11622. }
  11623. if (err == MP_OKAY) {
  11624. if (idx >= 0 && fp_cache[idx].LUT_set) {
  11625. if (mpSetup == 0) {
  11626. /* compute mp */
  11627. err = mp_montgomery_setup(modulus, &mp);
  11628. }
  11629. if (err == MP_OKAY)
  11630. err = accel_fp_mul(idx, k, R, a, modulus, mp, map);
  11631. } else {
  11632. err = normal_ecc_mulmod(k, G, R, a, modulus, rng, map, heap);
  11633. }
  11634. }
  11635. RESTORE_VECTOR_REGISTERS();
  11636. out:
  11637. #ifndef HAVE_THREAD_LS
  11638. if (got_ecc_fp_lock)
  11639. wc_UnLockMutex(&ecc_fp_lock);
  11640. #endif /* HAVE_THREAD_LS */
  11641. mp_clear(mu);
  11642. #ifdef WOLFSSL_SMALL_STACK
  11643. XFREE(mu, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  11644. #endif
  11645. return err;
  11646. #else /* WOLFSSL_SP_MATH */
  11647. (void)rng;
  11648. if (k == NULL || G == NULL || R == NULL || a == NULL || modulus == NULL ||
  11649. order == NULL) {
  11650. return ECC_BAD_ARG_E;
  11651. }
  11652. if (mp_count_bits(G->x) > mp_count_bits(modulus) ||
  11653. mp_count_bits(G->y) > mp_count_bits(modulus) ||
  11654. mp_count_bits(G->z) > mp_count_bits(modulus)) {
  11655. return IS_POINT_E;
  11656. }
  11657. #ifndef WOLFSSL_SP_NO_256
  11658. if (mp_count_bits(modulus) == 256) {
  11659. int ret;
  11660. SAVE_VECTOR_REGISTERS(return _svr_ret);
  11661. ret = sp_ecc_mulmod_256(k, G, R, map, heap);
  11662. RESTORE_VECTOR_REGISTERS();
  11663. return ret;
  11664. }
  11665. #endif
  11666. #ifdef WOLFSSL_SP_384
  11667. if (mp_count_bits(modulus) == 384) {
  11668. int ret;
  11669. SAVE_VECTOR_REGISTERS(return _svr_ret);
  11670. ret = sp_ecc_mulmod_384(k, G, R, map, heap);
  11671. RESTORE_VECTOR_REGISTERS();
  11672. return ret;
  11673. }
  11674. #endif
  11675. #ifdef WOLFSSL_SP_521
  11676. if (mp_count_bits(modulus) == 521) {
  11677. int ret;
  11678. SAVE_VECTOR_REGISTERS(return _svr_ret);
  11679. ret = sp_ecc_mulmod_521(k, G, R, map, heap);
  11680. RESTORE_VECTOR_REGISTERS();
  11681. return ret;
  11682. }
  11683. #endif
  11684. return WC_KEY_SIZE_E;
  11685. #endif /* WOLFSSL_SP_MATH */
  11686. }
  11687. #if !defined(WOLFSSL_SP_MATH)
  11688. /* helper function for freeing the cache ...
  11689. must be called with the cache mutex locked */
  11690. static void wc_ecc_fp_free_cache(void)
  11691. {
  11692. unsigned x, y;
  11693. for (x = 0; x < FP_ENTRIES; x++) {
  11694. if (fp_cache[x].g != NULL) {
  11695. for (y = 0; y < (1U<<FP_LUT); y++) {
  11696. wc_ecc_del_point(fp_cache[x].LUT[y]);
  11697. fp_cache[x].LUT[y] = NULL;
  11698. }
  11699. wc_ecc_del_point(fp_cache[x].g);
  11700. fp_cache[x].g = NULL;
  11701. mp_clear(&fp_cache[x].mu);
  11702. fp_cache[x].LUT_set = 0;
  11703. fp_cache[x].lru_count = 0;
  11704. fp_cache[x].lock = 0;
  11705. }
  11706. }
  11707. }
  11708. #endif
  11709. /** Init the Fixed Point cache */
  11710. void wc_ecc_fp_init(void)
  11711. {
  11712. #ifndef WOLFSSL_SP_MATH
  11713. #ifndef HAVE_THREAD_LS
  11714. if (initMutex == 0) {
  11715. wc_InitMutex(&ecc_fp_lock);
  11716. initMutex = 1;
  11717. }
  11718. #endif
  11719. #endif
  11720. }
  11721. /** Free the Fixed Point cache */
  11722. WOLFSSL_ABI
  11723. void wc_ecc_fp_free(void)
  11724. {
  11725. #if !defined(WOLFSSL_SP_MATH)
  11726. #ifndef HAVE_THREAD_LS
  11727. if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
  11728. wc_InitMutex(&ecc_fp_lock);
  11729. initMutex = 1;
  11730. }
  11731. if (wc_LockMutex(&ecc_fp_lock) == 0) {
  11732. #endif /* HAVE_THREAD_LS */
  11733. wc_ecc_fp_free_cache();
  11734. #ifndef HAVE_THREAD_LS
  11735. wc_UnLockMutex(&ecc_fp_lock);
  11736. wc_FreeMutex(&ecc_fp_lock);
  11737. initMutex = 0;
  11738. }
  11739. #endif /* HAVE_THREAD_LS */
  11740. #endif
  11741. }
  11742. #endif /* FP_ECC */
  11743. int wc_ecc_set_rng(ecc_key* key, WC_RNG* rng)
  11744. {
  11745. int err = 0;
  11746. #ifdef ECC_TIMING_RESISTANT
  11747. if (key == NULL) {
  11748. err = BAD_FUNC_ARG;
  11749. }
  11750. else {
  11751. key->rng = rng;
  11752. }
  11753. #else
  11754. (void)key;
  11755. (void)rng;
  11756. /* report success, not an error if ECC_TIMING_RESISTANT is not defined */
  11757. #endif
  11758. return err;
  11759. }
  11760. #ifdef HAVE_ECC_ENCRYPT
  11761. enum ecCliState {
  11762. ecCLI_INIT = 1,
  11763. ecCLI_SALT_GET = 2,
  11764. ecCLI_SALT_SET = 3,
  11765. ecCLI_SENT_REQ = 4,
  11766. ecCLI_RECV_RESP = 5,
  11767. ecCLI_BAD_STATE = 99
  11768. };
  11769. enum ecSrvState {
  11770. ecSRV_INIT = 1,
  11771. ecSRV_SALT_GET = 2,
  11772. ecSRV_SALT_SET = 3,
  11773. ecSRV_RECV_REQ = 4,
  11774. ecSRV_SENT_RESP = 5,
  11775. ecSRV_BAD_STATE = 99
  11776. };
  11777. struct ecEncCtx {
  11778. const byte* kdfSalt; /* optional salt for kdf */
  11779. const byte* kdfInfo; /* optional info for kdf */
  11780. const byte* macSalt; /* optional salt for mac */
  11781. word32 kdfSaltSz; /* size of kdfSalt */
  11782. word32 kdfInfoSz; /* size of kdfInfo */
  11783. word32 macSaltSz; /* size of macSalt */
  11784. void* heap; /* heap hint for memory used */
  11785. byte clientSalt[EXCHANGE_SALT_SZ]; /* for msg exchange */
  11786. byte serverSalt[EXCHANGE_SALT_SZ]; /* for msg exchange */
  11787. byte encAlgo; /* which encryption type */
  11788. byte kdfAlgo; /* which key derivation function type */
  11789. byte macAlgo; /* which mac function type */
  11790. byte protocol; /* are we REQ_RESP client or server ? */
  11791. byte cliSt; /* protocol state, for sanity checks */
  11792. byte srvSt; /* protocol state, for sanity checks */
  11793. WC_RNG* rng;
  11794. };
  11795. /* optional set info, can be called before or after set_peer_salt */
  11796. int wc_ecc_ctx_set_algo(ecEncCtx* ctx, byte encAlgo, byte kdfAlgo, byte macAlgo)
  11797. {
  11798. if (ctx == NULL)
  11799. return BAD_FUNC_ARG;
  11800. ctx->encAlgo = encAlgo;
  11801. ctx->kdfAlgo = kdfAlgo;
  11802. ctx->macAlgo = macAlgo;
  11803. return 0;
  11804. }
  11805. const byte* wc_ecc_ctx_get_own_salt(ecEncCtx* ctx)
  11806. {
  11807. if (ctx == NULL || ctx->protocol == 0)
  11808. return NULL;
  11809. if (ctx->protocol == REQ_RESP_CLIENT) {
  11810. if (ctx->cliSt == ecCLI_INIT) {
  11811. ctx->cliSt = ecCLI_SALT_GET;
  11812. return ctx->clientSalt;
  11813. }
  11814. else {
  11815. ctx->cliSt = ecCLI_BAD_STATE;
  11816. return NULL;
  11817. }
  11818. }
  11819. else if (ctx->protocol == REQ_RESP_SERVER) {
  11820. if (ctx->srvSt == ecSRV_INIT) {
  11821. ctx->srvSt = ecSRV_SALT_GET;
  11822. return ctx->serverSalt;
  11823. }
  11824. else {
  11825. ctx->srvSt = ecSRV_BAD_STATE;
  11826. return NULL;
  11827. }
  11828. }
  11829. return NULL;
  11830. }
  11831. /* optional set info, can be called before or after set_peer_salt */
  11832. int wc_ecc_ctx_set_info(ecEncCtx* ctx, const byte* info, int sz)
  11833. {
  11834. if (ctx == NULL || info == 0 || sz < 0)
  11835. return BAD_FUNC_ARG;
  11836. ctx->kdfInfo = info;
  11837. ctx->kdfInfoSz = (word32)sz;
  11838. return 0;
  11839. }
  11840. static const char* exchange_info = "Secure Message Exchange";
  11841. int wc_ecc_ctx_set_peer_salt(ecEncCtx* ctx, const byte* salt)
  11842. {
  11843. byte tmp[EXCHANGE_SALT_SZ/2];
  11844. int halfSz = EXCHANGE_SALT_SZ/2;
  11845. if (ctx == NULL || ctx->protocol == 0 || salt == NULL)
  11846. return BAD_FUNC_ARG;
  11847. if (ctx->protocol == REQ_RESP_CLIENT) {
  11848. XMEMCPY(ctx->serverSalt, salt, EXCHANGE_SALT_SZ);
  11849. if (ctx->cliSt == ecCLI_SALT_GET)
  11850. ctx->cliSt = ecCLI_SALT_SET;
  11851. else {
  11852. ctx->cliSt = ecCLI_BAD_STATE;
  11853. return BAD_STATE_E;
  11854. }
  11855. }
  11856. else {
  11857. XMEMCPY(ctx->clientSalt, salt, EXCHANGE_SALT_SZ);
  11858. if (ctx->srvSt == ecSRV_SALT_GET)
  11859. ctx->srvSt = ecSRV_SALT_SET;
  11860. else {
  11861. ctx->srvSt = ecSRV_BAD_STATE;
  11862. return BAD_STATE_E;
  11863. }
  11864. }
  11865. /* mix half and half */
  11866. /* tmp stores 2nd half of client before overwrite */
  11867. XMEMCPY(tmp, ctx->clientSalt + halfSz, (size_t)halfSz);
  11868. XMEMCPY(ctx->clientSalt + halfSz, ctx->serverSalt, (size_t)halfSz);
  11869. XMEMCPY(ctx->serverSalt, tmp, (size_t)halfSz);
  11870. ctx->kdfSalt = ctx->clientSalt;
  11871. ctx->kdfSaltSz = EXCHANGE_SALT_SZ;
  11872. ctx->macSalt = ctx->serverSalt;
  11873. ctx->macSaltSz = EXCHANGE_SALT_SZ;
  11874. if (ctx->kdfInfo == NULL) {
  11875. /* default info */
  11876. ctx->kdfInfo = (const byte*)exchange_info;
  11877. ctx->kdfInfoSz = EXCHANGE_INFO_SZ;
  11878. }
  11879. return 0;
  11880. }
  11881. /* Set the salt pointer into context.
  11882. *
  11883. * @param [in, out] ctx ECIES context object.
  11884. * @param [in] salt Salt to use with KDF.
  11885. * @param [in] len Length of salt in bytes.
  11886. * @return 0 on success.
  11887. * @return BAD_FUNC_ARG when ctx is NULL or salt is NULL and len is not 0.
  11888. */
  11889. int wc_ecc_ctx_set_kdf_salt(ecEncCtx* ctx, const byte* salt, word32 len)
  11890. {
  11891. if (ctx == NULL || (salt == NULL && len != 0))
  11892. return BAD_FUNC_ARG;
  11893. ctx->kdfSalt = salt;
  11894. ctx->kdfSaltSz = len;
  11895. if (ctx->protocol == REQ_RESP_CLIENT) {
  11896. ctx->cliSt = ecCLI_SALT_SET;
  11897. }
  11898. else if (ctx->protocol == REQ_RESP_SERVER) {
  11899. ctx->srvSt = ecSRV_SALT_SET;
  11900. }
  11901. return 0;
  11902. }
  11903. static int ecc_ctx_set_salt(ecEncCtx* ctx, int flags)
  11904. {
  11905. byte* saltBuffer = NULL;
  11906. if (ctx == NULL || flags == 0)
  11907. return BAD_FUNC_ARG;
  11908. saltBuffer = (flags == REQ_RESP_CLIENT) ? ctx->clientSalt : ctx->serverSalt;
  11909. return wc_RNG_GenerateBlock(ctx->rng, saltBuffer, EXCHANGE_SALT_SZ);
  11910. }
  11911. static void ecc_ctx_init(ecEncCtx* ctx, int flags, WC_RNG* rng)
  11912. {
  11913. if (ctx) {
  11914. XMEMSET(ctx, 0, sizeof(ecEncCtx));
  11915. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  11916. #ifdef WOLFSSL_AES_128
  11917. ctx->encAlgo = ecAES_128_CBC;
  11918. #else
  11919. ctx->encAlgo = ecAES_256_CBC;
  11920. #endif
  11921. #elif !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
  11922. #ifdef WOLFSSL_AES_256
  11923. ctx->encAlgo = ecAES_256_CTR;
  11924. #else
  11925. ctx->encAlgo = ecAES_128_CTR;
  11926. #endif
  11927. #else
  11928. #error "No valid encryption algorithm for ECIES configured."
  11929. #endif
  11930. ctx->kdfAlgo = ecHKDF_SHA256;
  11931. ctx->macAlgo = ecHMAC_SHA256;
  11932. ctx->protocol = (byte)flags;
  11933. ctx->rng = rng;
  11934. if (flags == REQ_RESP_CLIENT)
  11935. ctx->cliSt = ecCLI_INIT;
  11936. if (flags == REQ_RESP_SERVER)
  11937. ctx->srvSt = ecSRV_INIT;
  11938. }
  11939. }
  11940. /* allow ecc context reset so user doesn't have to init/free for reuse */
  11941. WOLFSSL_ABI
  11942. int wc_ecc_ctx_reset(ecEncCtx* ctx, WC_RNG* rng)
  11943. {
  11944. if (ctx == NULL || rng == NULL)
  11945. return BAD_FUNC_ARG;
  11946. ecc_ctx_init(ctx, ctx->protocol, rng);
  11947. return ecc_ctx_set_salt(ctx, ctx->protocol);
  11948. }
  11949. ecEncCtx* wc_ecc_ctx_new_ex(int flags, WC_RNG* rng, void* heap)
  11950. {
  11951. int ret = 0;
  11952. ecEncCtx* ctx = (ecEncCtx*)XMALLOC(sizeof(ecEncCtx), heap,
  11953. DYNAMIC_TYPE_ECC);
  11954. if (ctx) {
  11955. ctx->protocol = (byte)flags;
  11956. ctx->heap = heap;
  11957. }
  11958. ret = wc_ecc_ctx_reset(ctx, rng);
  11959. if (ret != 0) {
  11960. wc_ecc_ctx_free(ctx);
  11961. ctx = NULL;
  11962. }
  11963. return ctx;
  11964. }
  11965. /* alloc/init and set defaults, return new Context */
  11966. WOLFSSL_ABI
  11967. ecEncCtx* wc_ecc_ctx_new(int flags, WC_RNG* rng)
  11968. {
  11969. return wc_ecc_ctx_new_ex(flags, rng, NULL);
  11970. }
  11971. /* free any resources, clear any keys */
  11972. WOLFSSL_ABI
  11973. void wc_ecc_ctx_free(ecEncCtx* ctx)
  11974. {
  11975. if (ctx) {
  11976. void* heap = ctx->heap;
  11977. ForceZero(ctx, sizeof(ecEncCtx));
  11978. XFREE(ctx, heap, DYNAMIC_TYPE_ECC);
  11979. (void)heap;
  11980. }
  11981. }
  11982. static int ecc_get_key_sizes(ecEncCtx* ctx, int* encKeySz, int* ivSz,
  11983. int* keysLen, word32* digestSz, word32* blockSz)
  11984. {
  11985. if (ctx) {
  11986. switch (ctx->encAlgo) {
  11987. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  11988. case ecAES_128_CBC:
  11989. *encKeySz = KEY_SIZE_128;
  11990. *ivSz = IV_SIZE_128;
  11991. *blockSz = AES_BLOCK_SIZE;
  11992. break;
  11993. case ecAES_256_CBC:
  11994. *encKeySz = KEY_SIZE_256;
  11995. *ivSz = IV_SIZE_128;
  11996. *blockSz = AES_BLOCK_SIZE;
  11997. break;
  11998. #endif
  11999. #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
  12000. case ecAES_128_CTR:
  12001. *encKeySz = KEY_SIZE_128;
  12002. *ivSz = 12;
  12003. *blockSz = 1;
  12004. break;
  12005. case ecAES_256_CTR:
  12006. *encKeySz = KEY_SIZE_256;
  12007. *ivSz = 12;
  12008. *blockSz = 1;
  12009. break;
  12010. #endif
  12011. default:
  12012. return BAD_FUNC_ARG;
  12013. }
  12014. switch (ctx->macAlgo) {
  12015. case ecHMAC_SHA256:
  12016. *digestSz = WC_SHA256_DIGEST_SIZE;
  12017. break;
  12018. default:
  12019. return BAD_FUNC_ARG;
  12020. }
  12021. } else
  12022. return BAD_FUNC_ARG;
  12023. #ifdef WOLFSSL_ECIES_OLD
  12024. *keysLen = *encKeySz + *ivSz + (int)*digestSz;
  12025. #else
  12026. *keysLen = *encKeySz + (int)*digestSz;
  12027. #endif
  12028. return 0;
  12029. }
  12030. /* ecc encrypt with shared secret run through kdf
  12031. ctx holds non default algos and inputs
  12032. msgSz should be the right size for encAlgo, i.e., already padded
  12033. return 0 on success */
  12034. int wc_ecc_encrypt_ex(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  12035. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx, int compressed)
  12036. {
  12037. int ret = 0;
  12038. word32 blockSz = 0;
  12039. #ifndef WOLFSSL_ECIES_OLD
  12040. #ifndef WOLFSSL_ECIES_GEN_IV
  12041. byte iv[ECC_MAX_IV_SIZE];
  12042. #endif
  12043. word32 pubKeySz = 0;
  12044. #endif
  12045. word32 digestSz = 0;
  12046. ecEncCtx localCtx;
  12047. #ifdef WOLFSSL_SMALL_STACK
  12048. byte* sharedSecret;
  12049. byte* keys;
  12050. #else
  12051. #if defined(WOLFSSL_ECIES_OLD) || !defined(WOLFSSL_ECIES_ISO18033)
  12052. byte sharedSecret[ECC_MAXSIZE]; /* 521 max size */
  12053. #else
  12054. byte sharedSecret[ECC_MAXSIZE * 3 + 1]; /* Public key too */
  12055. #endif
  12056. byte keys[ECC_BUFSIZE]; /* max size */
  12057. #endif
  12058. #if defined(WOLFSSL_ECIES_OLD) || !defined(WOLFSSL_ECIES_ISO18033)
  12059. word32 sharedSz = ECC_MAXSIZE;
  12060. #else
  12061. /* 'Uncompressed' byte | public key x | public key y | secret */
  12062. word32 sharedSz = 1 + ECC_MAXSIZE * 3;
  12063. #endif
  12064. int keysLen = 0;
  12065. int encKeySz = 0;
  12066. int ivSz = 0;
  12067. int offset = 0; /* keys offset if doing msg exchange */
  12068. byte* encKey = NULL;
  12069. byte* encIv = NULL;
  12070. byte* macKey = NULL;
  12071. if (privKey == NULL || pubKey == NULL || msg == NULL || out == NULL ||
  12072. outSz == NULL)
  12073. return BAD_FUNC_ARG;
  12074. if (ctx == NULL) { /* use defaults */
  12075. ecc_ctx_init(&localCtx, 0, NULL);
  12076. ctx = &localCtx;
  12077. }
  12078. ret = ecc_get_key_sizes(ctx, &encKeySz, &ivSz, &keysLen, &digestSz,
  12079. &blockSz);
  12080. if (ret != 0)
  12081. return ret;
  12082. #ifndef WOLFSSL_ECIES_OLD
  12083. if (!compressed) {
  12084. pubKeySz = 1 + (word32)wc_ecc_size(privKey) * 2;
  12085. }
  12086. else {
  12087. pubKeySz = 1 + (word32)wc_ecc_size(privKey);
  12088. }
  12089. #else
  12090. (void) compressed; /* avoid unused parameter if WOLFSSL_ECIES_OLD is defined */
  12091. #endif
  12092. if (ctx->protocol == REQ_RESP_SERVER) {
  12093. offset = keysLen;
  12094. keysLen *= 2;
  12095. if (ctx->srvSt != ecSRV_RECV_REQ)
  12096. return BAD_STATE_E;
  12097. ctx->srvSt = ecSRV_BAD_STATE; /* we're done no more ops allowed */
  12098. }
  12099. else if (ctx->protocol == REQ_RESP_CLIENT) {
  12100. if (ctx->cliSt != ecCLI_SALT_SET)
  12101. return BAD_STATE_E;
  12102. ctx->cliSt = ecCLI_SENT_REQ; /* only do this once */
  12103. }
  12104. if (keysLen > ECC_BUFSIZE) /* keys size */
  12105. return BUFFER_E;
  12106. if ((msgSz % blockSz) != 0)
  12107. return BAD_PADDING_E;
  12108. #ifdef WOLFSSL_ECIES_OLD
  12109. if (*outSz < (msgSz + digestSz))
  12110. return BUFFER_E;
  12111. #elif defined(WOLFSSL_ECIES_GEN_IV)
  12112. if (*outSz < (pubKeySz + ivSz + msgSz + digestSz))
  12113. return BUFFER_E;
  12114. #else
  12115. if (*outSz < (pubKeySz + msgSz + digestSz))
  12116. return BUFFER_E;
  12117. #endif
  12118. #ifdef ECC_TIMING_RESISTANT
  12119. if (ctx->rng != NULL && privKey->rng == NULL)
  12120. privKey->rng = ctx->rng;
  12121. #endif
  12122. #ifndef WOLFSSL_ECIES_OLD
  12123. if (privKey->type == ECC_PRIVATEKEY_ONLY) {
  12124. #ifdef ECC_TIMING_RESISTANT
  12125. ret = wc_ecc_make_pub_ex(privKey, NULL, privKey->rng);
  12126. #else
  12127. ret = wc_ecc_make_pub_ex(privKey, NULL, NULL);
  12128. #endif
  12129. if (ret != 0)
  12130. return ret;
  12131. }
  12132. ret = wc_ecc_export_x963_ex(privKey, out, &pubKeySz, compressed);
  12133. if (ret != 0)
  12134. return ret;
  12135. out += pubKeySz;
  12136. #endif
  12137. #ifdef WOLFSSL_SMALL_STACK
  12138. sharedSecret = (byte*)XMALLOC(sharedSz, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12139. if (sharedSecret == NULL)
  12140. return MEMORY_E;
  12141. keys = (byte*)XMALLOC(ECC_BUFSIZE, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12142. if (keys == NULL) {
  12143. XFREE(sharedSecret, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12144. return MEMORY_E;
  12145. }
  12146. #endif
  12147. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  12148. #ifdef WOLFSSL_ECIES_ISO18033
  12149. XMEMCPY(sharedSecret, out - pubKeySz, pubKeySz);
  12150. sharedSz -= pubKeySz;
  12151. #endif
  12152. do {
  12153. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  12154. ret = wc_AsyncWait(ret, &privKey->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  12155. if (ret != 0)
  12156. break;
  12157. #endif
  12158. #ifndef WOLFSSL_ECIES_ISO18033
  12159. ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret, &sharedSz);
  12160. #else
  12161. ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret + pubKeySz,
  12162. &sharedSz);
  12163. #endif
  12164. } while (ret == WC_PENDING_E);
  12165. if (ret == 0) {
  12166. #ifdef WOLFSSL_ECIES_ISO18033
  12167. /* KDF data is encoded public key and secret. */
  12168. sharedSz += pubKeySz;
  12169. #endif
  12170. switch (ctx->kdfAlgo) {
  12171. case ecHKDF_SHA256 :
  12172. ret = wc_HKDF(WC_SHA256, sharedSecret, sharedSz, ctx->kdfSalt,
  12173. ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
  12174. keys, (word32)keysLen);
  12175. break;
  12176. default:
  12177. ret = BAD_FUNC_ARG;
  12178. break;
  12179. }
  12180. }
  12181. if (ret == 0) {
  12182. #ifdef WOLFSSL_ECIES_OLD
  12183. encKey = keys + offset;
  12184. encIv = encKey + encKeySz;
  12185. macKey = encKey + encKeySz + ivSz;
  12186. #elif defined(WOLFSSL_ECIES_GEN_IV)
  12187. encKey = keys + offset;
  12188. encIv = out;
  12189. out += ivSz;
  12190. macKey = encKey + encKeySz;
  12191. ret = wc_RNG_GenerateBlock(privKey->rng, encIv, ivSz);
  12192. #else
  12193. XMEMSET(iv, 0, (size_t)ivSz);
  12194. encKey = keys + offset;
  12195. encIv = iv;
  12196. macKey = encKey + encKeySz;
  12197. #endif
  12198. }
  12199. if (ret == 0) {
  12200. switch (ctx->encAlgo) {
  12201. case ecAES_128_CBC:
  12202. case ecAES_256_CBC:
  12203. {
  12204. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  12205. #ifdef WOLFSSL_SMALL_STACK
  12206. Aes *aes = (Aes *)XMALLOC(sizeof *aes, ctx->heap,
  12207. DYNAMIC_TYPE_AES);
  12208. if (aes == NULL) {
  12209. ret = MEMORY_E;
  12210. break;
  12211. }
  12212. #else
  12213. Aes aes[1];
  12214. #endif
  12215. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  12216. if (ret == 0) {
  12217. ret = wc_AesSetKey(aes, encKey, (word32)encKeySz, encIv,
  12218. AES_ENCRYPTION);
  12219. if (ret == 0) {
  12220. ret = wc_AesCbcEncrypt(aes, out, msg, msgSz);
  12221. #if defined(WOLFSSL_ASYNC_CRYPT) && \
  12222. defined(WC_ASYNC_ENABLE_AES)
  12223. ret = wc_AsyncWait(ret, &aes->asyncDev,
  12224. WC_ASYNC_FLAG_NONE);
  12225. #endif
  12226. }
  12227. wc_AesFree(aes);
  12228. }
  12229. #ifdef WOLFSSL_SMALL_STACK
  12230. XFREE(aes, ctx->heap, DYNAMIC_TYPE_AES);
  12231. #endif
  12232. #else
  12233. ret = NOT_COMPILED_IN;
  12234. #endif
  12235. break;
  12236. }
  12237. case ecAES_128_CTR:
  12238. case ecAES_256_CTR:
  12239. {
  12240. #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
  12241. byte ctr_iv[AES_BLOCK_SIZE];
  12242. #ifndef WOLFSSL_SMALL_STACK
  12243. Aes aes[1];
  12244. #else
  12245. Aes *aes = (Aes *)XMALLOC(sizeof *aes, ctx->heap,
  12246. DYNAMIC_TYPE_AES);
  12247. if (aes == NULL) {
  12248. ret = MEMORY_E;
  12249. break;
  12250. }
  12251. #endif
  12252. /* Include 4 byte counter starting at all zeros. */
  12253. XMEMCPY(ctr_iv, encIv, WOLFSSL_ECIES_GEN_IV_SIZE);
  12254. XMEMSET(ctr_iv + WOLFSSL_ECIES_GEN_IV_SIZE, 0,
  12255. AES_BLOCK_SIZE - WOLFSSL_ECIES_GEN_IV_SIZE);
  12256. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  12257. if (ret == 0) {
  12258. ret = wc_AesSetKey(aes, encKey, (word32)encKeySz, ctr_iv,
  12259. AES_ENCRYPTION);
  12260. if (ret == 0) {
  12261. ret = wc_AesCtrEncrypt(aes, out, msg, msgSz);
  12262. #if defined(WOLFSSL_ASYNC_CRYPT) && \
  12263. defined(WC_ASYNC_ENABLE_AES)
  12264. ret = wc_AsyncWait(ret, &aes->asyncDev,
  12265. WC_ASYNC_FLAG_NONE);
  12266. #endif
  12267. }
  12268. wc_AesFree(aes);
  12269. }
  12270. #ifdef WOLFSSL_SMALL_STACK
  12271. XFREE(aes, ctx->heap, DYNAMIC_TYPE_AES);
  12272. #endif
  12273. #else
  12274. ret = NOT_COMPILED_IN;
  12275. #endif
  12276. break;
  12277. }
  12278. default:
  12279. ret = BAD_FUNC_ARG;
  12280. break;
  12281. }
  12282. }
  12283. if (ret == 0) {
  12284. switch (ctx->macAlgo) {
  12285. case ecHMAC_SHA256:
  12286. {
  12287. #ifdef WOLFSSL_SMALL_STACK
  12288. Hmac *hmac = (Hmac *)XMALLOC(sizeof *hmac, ctx->heap,
  12289. DYNAMIC_TYPE_HMAC);
  12290. if (hmac == NULL) {
  12291. ret = MEMORY_E;
  12292. break;
  12293. }
  12294. #else
  12295. Hmac hmac[1];
  12296. #endif
  12297. ret = wc_HmacInit(hmac, NULL, INVALID_DEVID);
  12298. if (ret == 0) {
  12299. ret = wc_HmacSetKey(hmac, WC_SHA256, macKey,
  12300. WC_SHA256_DIGEST_SIZE);
  12301. if (ret == 0) {
  12302. #if !defined(WOLFSSL_ECIES_GEN_IV)
  12303. ret = wc_HmacUpdate(hmac, out, msgSz);
  12304. #else
  12305. /* IV is before encrypted message. */
  12306. ret = wc_HmacUpdate(hmac, encIv, ivSz + msgSz);
  12307. #endif
  12308. }
  12309. if (ret == 0)
  12310. ret = wc_HmacUpdate(hmac, ctx->macSalt, ctx->macSaltSz);
  12311. if (ret == 0)
  12312. ret = wc_HmacFinal(hmac, out+msgSz);
  12313. wc_HmacFree(hmac);
  12314. }
  12315. #ifdef WOLFSSL_SMALL_STACK
  12316. XFREE(hmac, ctx->heap, DYNAMIC_TYPE_HMAC);
  12317. #endif
  12318. break;
  12319. }
  12320. default:
  12321. ret = BAD_FUNC_ARG;
  12322. break;
  12323. }
  12324. }
  12325. if (ret == 0) {
  12326. #ifdef WOLFSSL_ECIES_OLD
  12327. *outSz = msgSz + digestSz;
  12328. #elif defined(WOLFSSL_ECIES_GEN_IV)
  12329. *outSz = pubKeySz + ivSz + msgSz + digestSz;
  12330. #else
  12331. *outSz = pubKeySz + msgSz + digestSz;
  12332. #endif
  12333. }
  12334. RESTORE_VECTOR_REGISTERS();
  12335. #ifdef WOLFSSL_SMALL_STACK
  12336. XFREE(sharedSecret, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12337. XFREE(keys, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12338. #endif
  12339. return ret;
  12340. }
  12341. /* ecc encrypt with shared secret run through kdf
  12342. ctx holds non default algos and inputs
  12343. msgSz should be the right size for encAlgo, i.e., already padded
  12344. return 0 on success */
  12345. WOLFSSL_ABI
  12346. int wc_ecc_encrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  12347. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx)
  12348. {
  12349. return wc_ecc_encrypt_ex(privKey, pubKey, msg, msgSz, out, outSz, ctx, 0);
  12350. }
  12351. /* ecc decrypt with shared secret run through kdf
  12352. ctx holds non default algos and inputs
  12353. return 0 on success */
  12354. WOLFSSL_ABI
  12355. int wc_ecc_decrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  12356. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx)
  12357. {
  12358. int ret = 0;
  12359. word32 blockSz = 0;
  12360. #ifndef WOLFSSL_ECIES_OLD
  12361. #ifndef WOLFSSL_ECIES_GEN_IV
  12362. byte iv[ECC_MAX_IV_SIZE];
  12363. #endif
  12364. word32 pubKeySz = 0;
  12365. #ifdef WOLFSSL_SMALL_STACK
  12366. ecc_key* peerKey = NULL;
  12367. #else
  12368. ecc_key peerKey[1];
  12369. #endif
  12370. #endif
  12371. word32 digestSz = 0;
  12372. ecEncCtx localCtx;
  12373. #ifdef WOLFSSL_SMALL_STACK
  12374. byte* sharedSecret;
  12375. byte* keys;
  12376. #else
  12377. #if defined(WOLFSSL_ECIES_OLD) || !defined(WOLFSSL_ECIES_ISO18033)
  12378. byte sharedSecret[ECC_MAXSIZE]; /* 521 max size */
  12379. #else
  12380. byte sharedSecret[ECC_MAXSIZE * 3 + 1]; /* Public key too */
  12381. #endif
  12382. byte keys[ECC_BUFSIZE]; /* max size */
  12383. #endif
  12384. #if defined(WOLFSSL_ECIES_OLD) || !defined(WOLFSSL_ECIES_ISO18033)
  12385. word32 sharedSz = ECC_MAXSIZE;
  12386. #else
  12387. word32 sharedSz = ECC_MAXSIZE * 3 + 1;
  12388. #endif
  12389. int keysLen = 0;
  12390. int encKeySz = 0;
  12391. int ivSz = 0;
  12392. int offset = 0; /* in case using msg exchange */
  12393. byte* encKey = NULL;
  12394. const byte* encIv = NULL;
  12395. byte* macKey = NULL;
  12396. if (privKey == NULL || msg == NULL || out == NULL || outSz == NULL)
  12397. return BAD_FUNC_ARG;
  12398. #ifdef WOLFSSL_ECIES_OLD
  12399. if (pubKey == NULL)
  12400. return BAD_FUNC_ARG;
  12401. #endif
  12402. if (ctx == NULL) { /* use defaults */
  12403. ecc_ctx_init(&localCtx, 0, NULL);
  12404. ctx = &localCtx;
  12405. }
  12406. ret = ecc_get_key_sizes(ctx, &encKeySz, &ivSz, &keysLen, &digestSz,
  12407. &blockSz);
  12408. if (ret != 0)
  12409. return ret;
  12410. #ifndef WOLFSSL_ECIES_OLD
  12411. ret = ecc_public_key_size(privKey, &pubKeySz);
  12412. if (ret != 0)
  12413. return ret;
  12414. #ifdef HAVE_COMP_KEY
  12415. if ((msgSz > 1) && ((msg[0] == 0x02) || (msg[0] == 0x03))) {
  12416. pubKeySz = (pubKeySz / 2) + 1;
  12417. }
  12418. #endif /* HAVE_COMP_KEY */
  12419. #endif /* WOLFSSL_ECIES_OLD */
  12420. if (ctx->protocol == REQ_RESP_CLIENT) {
  12421. offset = keysLen;
  12422. keysLen *= 2;
  12423. if (ctx->cliSt != ecCLI_SENT_REQ)
  12424. return BAD_STATE_E;
  12425. ctx->cliSt = ecSRV_BAD_STATE; /* we're done no more ops allowed */
  12426. }
  12427. else if (ctx->protocol == REQ_RESP_SERVER) {
  12428. if (ctx->srvSt != ecSRV_SALT_SET)
  12429. return BAD_STATE_E;
  12430. ctx->srvSt = ecSRV_RECV_REQ; /* only do this once */
  12431. }
  12432. if (keysLen > ECC_BUFSIZE) /* keys size */
  12433. return BUFFER_E;
  12434. #ifdef WOLFSSL_ECIES_OLD
  12435. if (((msgSz - digestSz) % blockSz) != 0)
  12436. return BAD_PADDING_E;
  12437. if (*outSz < (msgSz - digestSz))
  12438. return BUFFER_E;
  12439. #elif defined(WOLFSSL_ECIES_GEN_IV)
  12440. if (((msgSz - ivSz - digestSz - pubKeySz) % blockSz) != 0)
  12441. return BAD_PADDING_E;
  12442. if (msgSz < pubKeySz + ivSz + blockSz + digestSz)
  12443. return BAD_FUNC_ARG;
  12444. if (*outSz < (msgSz - ivSz - digestSz - pubKeySz))
  12445. return BUFFER_E;
  12446. #else
  12447. if (((msgSz - digestSz - pubKeySz) % blockSz) != 0)
  12448. return BAD_PADDING_E;
  12449. if (msgSz < pubKeySz + blockSz + digestSz)
  12450. return BAD_FUNC_ARG;
  12451. if (*outSz < (msgSz - digestSz - pubKeySz))
  12452. return BUFFER_E;
  12453. #endif
  12454. #ifdef ECC_TIMING_RESISTANT
  12455. if (ctx->rng != NULL && privKey->rng == NULL)
  12456. privKey->rng = ctx->rng;
  12457. #endif
  12458. #ifdef WOLFSSL_SMALL_STACK
  12459. sharedSecret = (byte*)XMALLOC(sharedSz, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12460. if (sharedSecret == NULL) {
  12461. #ifndef WOLFSSL_ECIES_OLD
  12462. if (pubKey == peerKey)
  12463. wc_ecc_free(peerKey);
  12464. #endif
  12465. return MEMORY_E;
  12466. }
  12467. keys = (byte*)XMALLOC(ECC_BUFSIZE, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12468. if (keys == NULL) {
  12469. XFREE(sharedSecret, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12470. #ifndef WOLFSSL_ECIES_OLD
  12471. if (pubKey == peerKey)
  12472. wc_ecc_free(peerKey);
  12473. #endif
  12474. return MEMORY_E;
  12475. }
  12476. #endif
  12477. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  12478. #ifndef WOLFSSL_ECIES_OLD
  12479. if (pubKey == NULL) {
  12480. #ifdef WOLFSSL_SMALL_STACK
  12481. peerKey = (ecc_key*)XMALLOC(sizeof(*peerKey), ctx->heap,
  12482. DYNAMIC_TYPE_ECC_BUFFER);
  12483. if (peerKey == NULL)
  12484. ret = MEMORY_E;
  12485. #endif
  12486. pubKey = peerKey;
  12487. }
  12488. else {
  12489. /* if a public key was passed in we should free it here before init
  12490. * and import */
  12491. wc_ecc_free(pubKey);
  12492. }
  12493. if (ret == 0) {
  12494. ret = wc_ecc_init_ex(pubKey, privKey->heap, INVALID_DEVID);
  12495. }
  12496. if (ret == 0) {
  12497. ret = wc_ecc_import_x963_ex(msg, pubKeySz, pubKey, privKey->dp->id);
  12498. }
  12499. if (ret == 0) {
  12500. /* Point is not MACed. */
  12501. msg += pubKeySz;
  12502. msgSz -= pubKeySz;
  12503. }
  12504. #endif
  12505. if (ret == 0) {
  12506. #ifdef WOLFSSL_ECIES_ISO18033
  12507. XMEMCPY(sharedSecret, msg - pubKeySz, pubKeySz);
  12508. sharedSz -= pubKeySz;
  12509. #endif
  12510. do {
  12511. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
  12512. ret = wc_AsyncWait(ret, &privKey->asyncDev,
  12513. WC_ASYNC_FLAG_CALL_AGAIN);
  12514. if (ret != 0)
  12515. break;
  12516. #endif
  12517. #ifndef WOLFSSL_ECIES_ISO18033
  12518. ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret,
  12519. &sharedSz);
  12520. #else
  12521. ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret +
  12522. pubKeySz, &sharedSz);
  12523. #endif
  12524. } while (ret == WC_PENDING_E);
  12525. }
  12526. if (ret == 0) {
  12527. #ifdef WOLFSSL_ECIES_ISO18033
  12528. /* KDF data is encoded public key and secret. */
  12529. sharedSz += pubKeySz;
  12530. #endif
  12531. switch (ctx->kdfAlgo) {
  12532. case ecHKDF_SHA256 :
  12533. ret = wc_HKDF(WC_SHA256, sharedSecret, sharedSz, ctx->kdfSalt,
  12534. ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz,
  12535. keys, (word32)keysLen);
  12536. break;
  12537. default:
  12538. ret = BAD_FUNC_ARG;
  12539. break;
  12540. }
  12541. }
  12542. if (ret == 0) {
  12543. #ifdef WOLFSSL_ECIES_OLD
  12544. encKey = keys + offset;
  12545. encIv = encKey + encKeySz;
  12546. macKey = encKey + encKeySz + ivSz;
  12547. #elif defined(WOLFSSL_ECIES_GEN_IV)
  12548. encKey = keys + offset;
  12549. encIv = msg;
  12550. msg += ivSz;
  12551. msgSz -= ivSz;
  12552. macKey = encKey + encKeySz;
  12553. #else
  12554. XMEMSET(iv, 0, (size_t)ivSz);
  12555. encKey = keys + offset;
  12556. encIv = iv;
  12557. macKey = encKey + encKeySz;
  12558. #endif
  12559. switch (ctx->macAlgo) {
  12560. case ecHMAC_SHA256:
  12561. {
  12562. byte verify[WC_SHA256_DIGEST_SIZE];
  12563. #ifdef WOLFSSL_SMALL_STACK
  12564. Hmac *hmac = (Hmac *)XMALLOC(sizeof *hmac, ctx->heap,
  12565. DYNAMIC_TYPE_HMAC);
  12566. if (hmac == NULL) {
  12567. ret = MEMORY_E;
  12568. break;
  12569. }
  12570. #else
  12571. Hmac hmac[1];
  12572. #endif
  12573. ret = wc_HmacInit(hmac, NULL, INVALID_DEVID);
  12574. if (ret == 0) {
  12575. ret = wc_HmacSetKey(hmac, WC_SHA256, macKey,
  12576. WC_SHA256_DIGEST_SIZE);
  12577. if (ret == 0)
  12578. #if !defined(WOLFSSL_ECIES_GEN_IV)
  12579. ret = wc_HmacUpdate(hmac, msg, msgSz-digestSz);
  12580. #else
  12581. /* IV is before encrypted message. */
  12582. ret = wc_HmacUpdate(hmac, encIv, ivSz+msgSz-digestSz);
  12583. #endif
  12584. if (ret == 0)
  12585. ret = wc_HmacUpdate(hmac, ctx->macSalt, ctx->macSaltSz);
  12586. if (ret == 0)
  12587. ret = wc_HmacFinal(hmac, verify);
  12588. if ((ret == 0) && (XMEMCMP(verify, msg + msgSz - digestSz,
  12589. digestSz) != 0)) {
  12590. ret = -1;
  12591. }
  12592. wc_HmacFree(hmac);
  12593. }
  12594. #ifdef WOLFSSL_SMALL_STACK
  12595. XFREE(hmac, ctx->heap, DYNAMIC_TYPE_HMAC);
  12596. #endif
  12597. break;
  12598. }
  12599. default:
  12600. ret = BAD_FUNC_ARG;
  12601. break;
  12602. }
  12603. }
  12604. if (ret == 0) {
  12605. switch (ctx->encAlgo) {
  12606. #if !defined(NO_AES) && defined(HAVE_AES_CBC)
  12607. case ecAES_128_CBC:
  12608. case ecAES_256_CBC:
  12609. {
  12610. #ifdef WOLFSSL_SMALL_STACK
  12611. Aes *aes = (Aes *)XMALLOC(sizeof *aes, ctx->heap,
  12612. DYNAMIC_TYPE_AES);
  12613. if (aes == NULL) {
  12614. ret = MEMORY_E;
  12615. break;
  12616. }
  12617. #else
  12618. Aes aes[1];
  12619. #endif
  12620. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  12621. if (ret == 0) {
  12622. ret = wc_AesSetKey(aes, encKey, (word32)encKeySz, encIv,
  12623. AES_DECRYPTION);
  12624. if (ret == 0) {
  12625. ret = wc_AesCbcDecrypt(aes, out, msg, msgSz-digestSz);
  12626. #if defined(WOLFSSL_ASYNC_CRYPT) && \
  12627. defined(WC_ASYNC_ENABLE_AES)
  12628. ret = wc_AsyncWait(ret, &aes->asyncDev,
  12629. WC_ASYNC_FLAG_NONE);
  12630. #endif
  12631. }
  12632. wc_AesFree(aes);
  12633. }
  12634. #ifdef WOLFSSL_SMALL_STACK
  12635. XFREE(aes, ctx->heap, DYNAMIC_TYPE_AES);
  12636. #endif
  12637. break;
  12638. }
  12639. #endif
  12640. #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER)
  12641. case ecAES_128_CTR:
  12642. case ecAES_256_CTR:
  12643. {
  12644. #ifdef WOLFSSL_SMALL_STACK
  12645. Aes *aes = (Aes *)XMALLOC(sizeof *aes, ctx->heap,
  12646. DYNAMIC_TYPE_AES);
  12647. if (aes == NULL) {
  12648. ret = MEMORY_E;
  12649. break;
  12650. }
  12651. #else
  12652. Aes aes[1];
  12653. #endif
  12654. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  12655. if (ret == 0) {
  12656. byte ctr_iv[AES_BLOCK_SIZE];
  12657. /* Make a 16 byte IV from the bytes passed in. */
  12658. XMEMCPY(ctr_iv, encIv, WOLFSSL_ECIES_GEN_IV_SIZE);
  12659. XMEMSET(ctr_iv + WOLFSSL_ECIES_GEN_IV_SIZE, 0,
  12660. AES_BLOCK_SIZE - WOLFSSL_ECIES_GEN_IV_SIZE);
  12661. ret = wc_AesSetKey(aes, encKey, (word32)encKeySz, ctr_iv,
  12662. AES_ENCRYPTION);
  12663. if (ret == 0) {
  12664. ret = wc_AesCtrEncrypt(aes, out, msg, msgSz-digestSz);
  12665. #if defined(WOLFSSL_ASYNC_CRYPT) && \
  12666. defined(WC_ASYNC_ENABLE_AES)
  12667. ret = wc_AsyncWait(ret, &aes->asyncDev,
  12668. WC_ASYNC_FLAG_NONE);
  12669. #endif
  12670. }
  12671. wc_AesFree(aes);
  12672. }
  12673. #ifdef WOLFSSL_SMALL_STACK
  12674. XFREE(aes, ctx->heap, DYNAMIC_TYPE_AES);
  12675. #endif
  12676. break;
  12677. }
  12678. #endif
  12679. default:
  12680. ret = BAD_FUNC_ARG;
  12681. break;
  12682. }
  12683. }
  12684. if (ret == 0)
  12685. *outSz = msgSz - digestSz;
  12686. RESTORE_VECTOR_REGISTERS();
  12687. #ifndef WOLFSSL_ECIES_OLD
  12688. if (pubKey == peerKey)
  12689. wc_ecc_free(peerKey);
  12690. #endif
  12691. #ifdef WOLFSSL_SMALL_STACK
  12692. #ifndef WOLFSSL_ECIES_OLD
  12693. if (peerKey != NULL) {
  12694. XFREE(peerKey, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12695. }
  12696. #endif
  12697. XFREE(sharedSecret, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12698. XFREE(keys, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
  12699. #endif
  12700. return ret;
  12701. }
  12702. #endif /* HAVE_ECC_ENCRYPT */
  12703. #ifdef HAVE_COMP_KEY
  12704. #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
  12705. !defined(WOLFSSL_CRYPTOCELL)
  12706. #ifndef WOLFSSL_SP_MATH
  12707. /* computes the jacobi c = (a | n) (or Legendre if n is prime)
  12708. */
  12709. int mp_jacobi(mp_int* a, mp_int* n, int* c)
  12710. {
  12711. #ifdef WOLFSSL_SMALL_STACK
  12712. mp_int* a1 = NULL;
  12713. mp_int* n1 = NULL;
  12714. #else
  12715. mp_int a1[1], n1[1];
  12716. #endif
  12717. int res;
  12718. int s = 1;
  12719. int k;
  12720. mp_int* t[2];
  12721. mp_int* ts;
  12722. mp_digit residue;
  12723. if (mp_isneg(a) == MP_YES) {
  12724. return MP_VAL;
  12725. }
  12726. if (mp_isneg(n) == MP_YES) {
  12727. return MP_VAL;
  12728. }
  12729. if (mp_iseven(n) == MP_YES) {
  12730. return MP_VAL;
  12731. }
  12732. #ifdef WOLFSSL_SMALL_STACK
  12733. a1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  12734. if (a1 == NULL) {
  12735. return MP_MEM;
  12736. }
  12737. n1 = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
  12738. if (n1 == NULL) {
  12739. XFREE(a1, NULL, DYNAMIC_TYPE_BIGINT);
  12740. return MP_MEM;
  12741. }
  12742. #endif
  12743. if ((res = mp_init_multi(a1, n1, NULL, NULL, NULL, NULL)) != MP_OKAY) {
  12744. #ifdef WOLFSSL_SMALL_STACK
  12745. XFREE(a1, NULL, DYNAMIC_TYPE_BIGINT);
  12746. XFREE(n1, NULL, DYNAMIC_TYPE_BIGINT);
  12747. #endif
  12748. return res;
  12749. }
  12750. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  12751. if ((res = mp_mod(a, n, a1)) != MP_OKAY) {
  12752. goto done;
  12753. }
  12754. if ((res = mp_copy(n, n1)) != MP_OKAY) {
  12755. goto done;
  12756. }
  12757. t[0] = a1;
  12758. t[1] = n1;
  12759. /* Keep reducing until first number is 0. */
  12760. while (!mp_iszero(t[0])) {
  12761. /* Divide by 2 until odd. */
  12762. k = mp_cnt_lsb(t[0]);
  12763. if (k > 0) {
  12764. mp_rshb(t[0], k);
  12765. /* Negate s each time we divide by 2 if t[1] mod 8 == 3 or 5.
  12766. * Odd number of divides results in a negate.
  12767. */
  12768. residue = t[1]->dp[0] & 7;
  12769. if ((k & 1) && ((residue == 3) || (residue == 5))) {
  12770. s = -s;
  12771. }
  12772. }
  12773. /* Swap t[0] and t[1]. */
  12774. ts = t[0];
  12775. t[0] = t[1];
  12776. t[1] = ts;
  12777. /* Negate s if both numbers == 3 mod 4. */
  12778. if (((t[0]->dp[0] & 3) == 3) && ((t[1]->dp[0] & 3) == 3)) {
  12779. s = -s;
  12780. }
  12781. /* Reduce first number modulo second. */
  12782. if ((k == 0) && (mp_count_bits(t[0]) == mp_count_bits(t[1]))) {
  12783. res = mp_sub(t[0], t[1], t[0]);
  12784. }
  12785. else {
  12786. res = mp_mod(t[0], t[1], t[0]);
  12787. }
  12788. if (res != MP_OKAY) {
  12789. goto done;
  12790. }
  12791. }
  12792. /* When the two numbers have divisors in common. */
  12793. if (!mp_isone(t[1])) {
  12794. s = 0;
  12795. }
  12796. *c = s;
  12797. done:
  12798. RESTORE_VECTOR_REGISTERS();
  12799. /* cleanup */
  12800. mp_clear(n1);
  12801. mp_clear(a1);
  12802. #ifdef WOLFSSL_SMALL_STACK
  12803. XFREE(a1, NULL, DYNAMIC_TYPE_BIGINT);
  12804. XFREE(n1, NULL, DYNAMIC_TYPE_BIGINT);
  12805. #endif
  12806. return res;
  12807. }
  12808. /* Solves the modular equation x^2 = n (mod p)
  12809. * where prime number is greater than 2 (odd prime).
  12810. * The result is returned in the third argument x
  12811. * the function returns MP_OKAY on success, MP_VAL or another error on failure
  12812. */
  12813. int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret)
  12814. {
  12815. #ifdef SQRTMOD_USE_MOD_EXP
  12816. int res;
  12817. mp_int e;
  12818. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  12819. res = mp_init(&e);
  12820. if (res == MP_OKAY)
  12821. res = mp_add_d(prime, 1, &e);
  12822. if (res == MP_OKAY)
  12823. res = mp_div_2d(&e, 2, &e, NULL);
  12824. if (res == MP_OKAY)
  12825. res = mp_exptmod(n, &e, prime, ret);
  12826. mp_clear(&e);
  12827. RESTORE_VECTOR_REGISTERS();
  12828. return res;
  12829. #else
  12830. int res, legendre, done = 0;
  12831. mp_digit i;
  12832. #ifdef WOLFSSL_SMALL_STACK
  12833. mp_int *t1 = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  12834. mp_int *C = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  12835. mp_int *Q = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  12836. mp_int *S = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  12837. mp_int *Z = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  12838. mp_int *M = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  12839. mp_int *T = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  12840. mp_int *R = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  12841. mp_int *N = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  12842. mp_int *two = (mp_int *)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC_BUFFER);
  12843. #else
  12844. mp_int t1[1], C[1], Q[1], S[1], Z[1], M[1], T[1], R[1], N[1], two[1];
  12845. #endif
  12846. SAVE_VECTOR_REGISTERS(res = _svr_ret; goto out;);
  12847. if ((mp_init_multi(t1, C, Q, S, Z, M) != MP_OKAY) ||
  12848. (mp_init_multi(T, R, N, two, NULL, NULL) != MP_OKAY)) {
  12849. res = MP_INIT_E;
  12850. goto out;
  12851. }
  12852. #ifdef WOLFSSL_SMALL_STACK
  12853. if ((t1 == NULL) ||
  12854. (C == NULL) ||
  12855. (Q == NULL) ||
  12856. (S == NULL) ||
  12857. (Z == NULL) ||
  12858. (M == NULL) ||
  12859. (T == NULL) ||
  12860. (R == NULL) ||
  12861. (N == NULL) ||
  12862. (two == NULL)) {
  12863. res = MP_MEM;
  12864. goto out;
  12865. }
  12866. #endif
  12867. /* first handle the simple cases n = 0 or n = 1 */
  12868. if (mp_cmp_d(n, 0) == MP_EQ) {
  12869. mp_zero(ret);
  12870. res = MP_OKAY;
  12871. goto out;
  12872. }
  12873. if (mp_cmp_d(n, 1) == MP_EQ) {
  12874. res = mp_set(ret, 1);
  12875. goto out;
  12876. }
  12877. /* prime must be odd */
  12878. if (mp_cmp_d(prime, 2) == MP_EQ) {
  12879. res = MP_VAL;
  12880. goto out;
  12881. }
  12882. /* reduce n to less than prime */
  12883. res = mp_mod(n, prime, N);
  12884. if (res != MP_OKAY) {
  12885. goto out;
  12886. }
  12887. /* when N is zero, sqrt is zero */
  12888. if (mp_iszero(N)) {
  12889. mp_set(ret, 0);
  12890. goto out;
  12891. }
  12892. /* is quadratic non-residue mod prime */
  12893. if ((res = mp_jacobi(N, prime, &legendre)) != MP_OKAY) {
  12894. goto out;
  12895. }
  12896. if (legendre == -1) {
  12897. res = MP_VAL;
  12898. goto out;
  12899. }
  12900. /* SPECIAL CASE: if prime mod 4 == 3
  12901. * compute directly: res = n^(prime+1)/4 mod prime
  12902. * Handbook of Applied Cryptography algorithm 3.36
  12903. */
  12904. res = mp_mod_d(prime, 4, &i);
  12905. if (res == MP_OKAY && i == 3) {
  12906. res = mp_add_d(prime, 1, t1);
  12907. if (res == MP_OKAY)
  12908. res = mp_div_2(t1, t1);
  12909. if (res == MP_OKAY)
  12910. res = mp_div_2(t1, t1);
  12911. if (res == MP_OKAY)
  12912. res = mp_exptmod(N, t1, prime, ret);
  12913. done = 1;
  12914. }
  12915. /* NOW: TonelliShanks algorithm */
  12916. if (res == MP_OKAY && done == 0) {
  12917. /* factor out powers of 2 from prime-1, defining Q and S
  12918. * as: prime-1 = Q*2^S */
  12919. /* Q = prime - 1 */
  12920. res = mp_copy(prime, Q);
  12921. if (res == MP_OKAY)
  12922. res = mp_sub_d(Q, 1, Q);
  12923. /* S = 0 */
  12924. if (res == MP_OKAY)
  12925. mp_zero(S);
  12926. while (res == MP_OKAY && mp_iseven(Q) == MP_YES) {
  12927. /* Q = Q / 2 */
  12928. res = mp_div_2(Q, Q);
  12929. /* S = S + 1 */
  12930. if (res == MP_OKAY)
  12931. res = mp_add_d(S, 1, S);
  12932. }
  12933. /* find a Z such that the Legendre symbol (Z|prime) == -1 */
  12934. /* Z = 2 */
  12935. if (res == MP_OKAY)
  12936. res = mp_set_int(Z, 2);
  12937. while (res == MP_OKAY) {
  12938. res = mp_jacobi(Z, prime, &legendre);
  12939. if (res == MP_OKAY && legendre == -1)
  12940. break;
  12941. /* Z = Z + 1 */
  12942. if (res == MP_OKAY)
  12943. res = mp_add_d(Z, 1, Z);
  12944. }
  12945. /* C = Z ^ Q mod prime */
  12946. if (res == MP_OKAY)
  12947. res = mp_exptmod(Z, Q, prime, C);
  12948. /* t1 = (Q + 1) / 2 */
  12949. if (res == MP_OKAY)
  12950. res = mp_add_d(Q, 1, t1);
  12951. if (res == MP_OKAY)
  12952. res = mp_div_2(t1, t1);
  12953. /* R = n ^ ((Q + 1) / 2) mod prime */
  12954. if (res == MP_OKAY)
  12955. res = mp_exptmod(N, t1, prime, R);
  12956. /* T = n ^ Q mod prime */
  12957. if (res == MP_OKAY)
  12958. res = mp_exptmod(N, Q, prime, T);
  12959. /* M = S */
  12960. if (res == MP_OKAY)
  12961. res = mp_copy(S, M);
  12962. if (res == MP_OKAY)
  12963. res = mp_set_int(two, 2);
  12964. while (res == MP_OKAY && done == 0) {
  12965. res = mp_copy(T, t1);
  12966. /* reduce to 1 and count */
  12967. i = 0;
  12968. while (res == MP_OKAY) {
  12969. if (mp_cmp_d(t1, 1) == MP_EQ)
  12970. break;
  12971. res = mp_exptmod(t1, two, prime, t1);
  12972. if (res == MP_OKAY)
  12973. i++;
  12974. }
  12975. if (res == MP_OKAY && i == 0) {
  12976. res = mp_copy(R, ret);
  12977. done = 1;
  12978. }
  12979. if (done == 0) {
  12980. /* t1 = 2 ^ (M - i - 1) */
  12981. if (res == MP_OKAY)
  12982. res = mp_sub_d(M, i, t1);
  12983. if (res == MP_OKAY)
  12984. res = mp_sub_d(t1, 1, t1);
  12985. if (res == MP_OKAY)
  12986. res = mp_exptmod(two, t1, prime, t1);
  12987. /* t1 = C ^ (2 ^ (M - i - 1)) mod prime */
  12988. if (res == MP_OKAY)
  12989. res = mp_exptmod(C, t1, prime, t1);
  12990. /* C = (t1 * t1) mod prime */
  12991. if (res == MP_OKAY)
  12992. res = mp_sqrmod(t1, prime, C);
  12993. /* R = (R * t1) mod prime */
  12994. if (res == MP_OKAY)
  12995. res = mp_mulmod(R, t1, prime, R);
  12996. /* T = (T * C) mod prime */
  12997. if (res == MP_OKAY)
  12998. res = mp_mulmod(T, C, prime, T);
  12999. /* M = i */
  13000. if (res == MP_OKAY)
  13001. res = mp_set(M, i);
  13002. }
  13003. }
  13004. }
  13005. out:
  13006. RESTORE_VECTOR_REGISTERS();
  13007. #ifdef WOLFSSL_SMALL_STACK
  13008. if (t1) {
  13009. if (res != MP_INIT_E)
  13010. mp_clear(t1);
  13011. XFREE(t1, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13012. }
  13013. if (C) {
  13014. if (res != MP_INIT_E)
  13015. mp_clear(C);
  13016. XFREE(C, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13017. }
  13018. if (Q) {
  13019. if (res != MP_INIT_E)
  13020. mp_clear(Q);
  13021. XFREE(Q, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13022. }
  13023. if (S) {
  13024. if (res != MP_INIT_E)
  13025. mp_clear(S);
  13026. XFREE(S, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13027. }
  13028. if (Z) {
  13029. if (res != MP_INIT_E)
  13030. mp_clear(Z);
  13031. XFREE(Z, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13032. }
  13033. if (M) {
  13034. if (res != MP_INIT_E)
  13035. mp_clear(M);
  13036. XFREE(M, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13037. }
  13038. if (T) {
  13039. if (res != MP_INIT_E)
  13040. mp_clear(T);
  13041. XFREE(T, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13042. }
  13043. if (R) {
  13044. if (res != MP_INIT_E)
  13045. mp_clear(R);
  13046. XFREE(R, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13047. }
  13048. if (N) {
  13049. if (res != MP_INIT_E)
  13050. mp_clear(N);
  13051. XFREE(N, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13052. }
  13053. if (two) {
  13054. if (res != MP_INIT_E)
  13055. mp_clear(two);
  13056. XFREE(two, NULL, DYNAMIC_TYPE_ECC_BUFFER);
  13057. }
  13058. #else
  13059. if (res != MP_INIT_E) {
  13060. mp_clear(t1);
  13061. mp_clear(C);
  13062. mp_clear(Q);
  13063. mp_clear(S);
  13064. mp_clear(Z);
  13065. mp_clear(M);
  13066. mp_clear(T);
  13067. mp_clear(R);
  13068. mp_clear(N);
  13069. mp_clear(two);
  13070. }
  13071. #endif
  13072. return res;
  13073. #endif
  13074. }
  13075. #endif /* !WOLFSSL_SP_MATH */
  13076. #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A && !WOLFSSL_CRYPTOCELL */
  13077. #ifdef HAVE_ECC_KEY_EXPORT
  13078. /* export public ECC key in ANSI X9.63 format compressed */
  13079. static int wc_ecc_export_x963_compressed(ecc_key* key, byte* out, word32* outLen)
  13080. {
  13081. word32 numlen;
  13082. int ret = MP_OKAY;
  13083. if (key == NULL || outLen == NULL)
  13084. return BAD_FUNC_ARG;
  13085. if (key->type == ECC_PRIVATEKEY_ONLY)
  13086. return ECC_PRIVATEONLY_E;
  13087. if (key->type == 0 || wc_ecc_is_valid_idx(key->idx) == 0 || key->dp == NULL){
  13088. return ECC_BAD_ARG_E;
  13089. }
  13090. numlen = (word32)key->dp->size;
  13091. if (*outLen < (1 + numlen)) {
  13092. *outLen = 1 + numlen;
  13093. return LENGTH_ONLY_E;
  13094. }
  13095. if (out == NULL)
  13096. return BAD_FUNC_ARG;
  13097. if (mp_unsigned_bin_size(key->pubkey.x) > (int)numlen)
  13098. return ECC_BAD_ARG_E;
  13099. /* store first byte */
  13100. out[0] = mp_isodd(key->pubkey.y) == MP_YES ? ECC_POINT_COMP_ODD : ECC_POINT_COMP_EVEN;
  13101. /* pad and store x */
  13102. XMEMSET(out+1, 0, numlen);
  13103. ret = mp_to_unsigned_bin(
  13104. key->pubkey.x,
  13105. out+1 + (numlen - (word32)mp_unsigned_bin_size(key->pubkey.x)));
  13106. *outLen = 1 + numlen;
  13107. return ret;
  13108. }
  13109. #endif /* HAVE_ECC_KEY_EXPORT */
  13110. #endif /* HAVE_COMP_KEY */
  13111. int wc_ecc_get_oid(word32 oidSum, const byte** oid, word32* oidSz)
  13112. {
  13113. int x;
  13114. if (oidSum == 0) {
  13115. return BAD_FUNC_ARG;
  13116. }
  13117. /* find matching OID sum (based on encoded value) */
  13118. for (x = 0; ecc_sets[x].size != 0; x++) {
  13119. if (ecc_sets[x].oidSum == oidSum) {
  13120. int ret;
  13121. #ifdef HAVE_OID_ENCODING
  13122. ret = 0;
  13123. /* check cache */
  13124. oid_cache_t* o = &ecc_oid_cache[x];
  13125. if (o->oidSz == 0) {
  13126. o->oidSz = sizeof(o->oid);
  13127. ret = EncodeObjectId(ecc_sets[x].oid, ecc_sets[x].oidSz,
  13128. o->oid, &o->oidSz);
  13129. }
  13130. if (oidSz) {
  13131. *oidSz = o->oidSz;
  13132. }
  13133. if (oid) {
  13134. *oid = o->oid;
  13135. }
  13136. /* on success return curve id */
  13137. if (ret == 0) {
  13138. ret = ecc_sets[x].id;
  13139. }
  13140. #else
  13141. if (oidSz) {
  13142. *oidSz = ecc_sets[x].oidSz;
  13143. }
  13144. if (oid) {
  13145. *oid = ecc_sets[x].oid;
  13146. }
  13147. ret = ecc_sets[x].id;
  13148. #endif
  13149. return ret;
  13150. }
  13151. }
  13152. return NOT_COMPILED_IN;
  13153. }
  13154. #ifdef WOLFSSL_CUSTOM_CURVES
  13155. int wc_ecc_set_custom_curve(ecc_key* key, const ecc_set_type* dp)
  13156. {
  13157. if (key == NULL || dp == NULL) {
  13158. return BAD_FUNC_ARG;
  13159. }
  13160. key->idx = ECC_CUSTOM_IDX;
  13161. key->dp = dp;
  13162. return 0;
  13163. }
  13164. #endif /* WOLFSSL_CUSTOM_CURVES */
  13165. #if defined(HAVE_X963_KDF) && !defined(NO_HASH_WRAPPER)
  13166. static WC_INLINE void IncrementX963KdfCounter(byte* inOutCtr)
  13167. {
  13168. int i;
  13169. /* in network byte order so start at end and work back */
  13170. for (i = 3; i >= 0; i--) {
  13171. if (++inOutCtr[i]) /* we're done unless we overflow */
  13172. return;
  13173. }
  13174. }
  13175. /* ASN X9.63 Key Derivation Function (SEC1) */
  13176. int wc_X963_KDF(enum wc_HashType type, const byte* secret, word32 secretSz,
  13177. const byte* sinfo, word32 sinfoSz, byte* out, word32 outSz)
  13178. {
  13179. int ret;
  13180. word32 digestSz, copySz, remaining = outSz;
  13181. byte* outIdx;
  13182. byte counter[4];
  13183. byte tmp[WC_MAX_DIGEST_SIZE];
  13184. #ifdef WOLFSSL_SMALL_STACK
  13185. wc_HashAlg* hash;
  13186. #else
  13187. wc_HashAlg hash[1];
  13188. #endif
  13189. if (secret == NULL || secretSz == 0 || out == NULL)
  13190. return BAD_FUNC_ARG;
  13191. /* X9.63 allowed algos only */
  13192. if (type != WC_HASH_TYPE_SHA && type != WC_HASH_TYPE_SHA224 &&
  13193. type != WC_HASH_TYPE_SHA256 && type != WC_HASH_TYPE_SHA384 &&
  13194. type != WC_HASH_TYPE_SHA512)
  13195. return BAD_FUNC_ARG;
  13196. ret = wc_HashGetDigestSize(type);
  13197. if (ret < 0)
  13198. return ret;
  13199. digestSz = (word32)ret;
  13200. #ifdef WOLFSSL_SMALL_STACK
  13201. hash = (wc_HashAlg*)XMALLOC(sizeof(wc_HashAlg), NULL,
  13202. DYNAMIC_TYPE_HASHES);
  13203. if (hash == NULL)
  13204. return MEMORY_E;
  13205. #endif
  13206. ret = wc_HashInit(hash, type);
  13207. if (ret != 0) {
  13208. #ifdef WOLFSSL_SMALL_STACK
  13209. XFREE(hash, NULL, DYNAMIC_TYPE_HASHES);
  13210. #endif
  13211. return ret;
  13212. }
  13213. outIdx = out;
  13214. XMEMSET(counter, 0, sizeof(counter));
  13215. while (remaining > 0) {
  13216. IncrementX963KdfCounter(counter);
  13217. ret = wc_HashUpdate(hash, type, secret, secretSz);
  13218. if (ret != 0) {
  13219. break;
  13220. }
  13221. ret = wc_HashUpdate(hash, type, counter, sizeof(counter));
  13222. if (ret != 0) {
  13223. break;
  13224. }
  13225. if (sinfo) {
  13226. ret = wc_HashUpdate(hash, type, sinfo, sinfoSz);
  13227. if (ret != 0) {
  13228. break;
  13229. }
  13230. }
  13231. ret = wc_HashFinal(hash, type, tmp);
  13232. if (ret != 0) {
  13233. break;
  13234. }
  13235. copySz = min(remaining, digestSz);
  13236. XMEMCPY(outIdx, tmp, copySz);
  13237. remaining -= copySz;
  13238. outIdx += copySz;
  13239. }
  13240. wc_HashFree(hash, type);
  13241. #ifdef WOLFSSL_SMALL_STACK
  13242. XFREE(hash, NULL, DYNAMIC_TYPE_HASHES);
  13243. #endif
  13244. return ret;
  13245. }
  13246. #endif /* HAVE_X963_KDF && !NO_HASH_WRAPPER */
  13247. #ifdef WOLFSSL_SE050
  13248. /* Use specified hardware key ID with ecc_key operations. Unlike devId,
  13249. * keyId is a word32, can be used for key IDs larger than an int.
  13250. *
  13251. * key initialized ecc_key struct
  13252. * keyId hardware key ID which stores ECC key
  13253. * flags optional flags, currently unused
  13254. *
  13255. * Return 0 on success, negative on error */
  13256. int wc_ecc_use_key_id(ecc_key* key, word32 keyId, word32 flags)
  13257. {
  13258. (void)flags;
  13259. if (key == NULL) {
  13260. return BAD_FUNC_ARG;
  13261. }
  13262. return se050_ecc_use_key_id(key, keyId);
  13263. }
  13264. /* Get hardware key ID associated with this ecc_key structure.
  13265. *
  13266. * key initialized ecc_key struct
  13267. * keyId [OUT] output for key ID associated with this structure
  13268. *
  13269. * Returns 0 on success, negative on error.
  13270. */
  13271. int wc_ecc_get_key_id(ecc_key* key, word32* keyId)
  13272. {
  13273. if (key == NULL || keyId == NULL) {
  13274. return BAD_FUNC_ARG;
  13275. }
  13276. return se050_ecc_get_key_id(key, keyId);
  13277. }
  13278. #endif /* WOLFSSL_SE050 */
  13279. #ifdef WC_ECC_NONBLOCK
  13280. /* Enable ECC support for non-blocking operations */
  13281. int wc_ecc_set_nonblock(ecc_key *key, ecc_nb_ctx_t* ctx)
  13282. {
  13283. if (key) {
  13284. if (ctx) {
  13285. XMEMSET(ctx, 0, sizeof(ecc_nb_ctx_t));
  13286. }
  13287. key->nb_ctx = ctx;
  13288. }
  13289. return 0;
  13290. }
  13291. #endif /* WC_ECC_NONBLOCK */
  13292. #endif /* HAVE_ECC */