diff --git a/fastcrypto-vdf/Cargo.toml b/fastcrypto-vdf/Cargo.toml index cde783bda..1feda716c 100644 --- a/fastcrypto-vdf/Cargo.toml +++ b/fastcrypto-vdf/Cargo.toml @@ -44,3 +44,8 @@ required-features = ["experimental"] name = "math" harness = false required-features = ["experimental"] + +[[bench]] +name = "vdf_rsa" +harness = false +required-features = ["experimental"] diff --git a/fastcrypto-vdf/benches/vdf_rsa.rs b/fastcrypto-vdf/benches/vdf_rsa.rs new file mode 100644 index 000000000..122035ecc --- /dev/null +++ b/fastcrypto-vdf/benches/vdf_rsa.rs @@ -0,0 +1,88 @@ +// Copyright (c) 2022, Mysten Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +#[macro_use] +extern crate criterion; + +use criterion::Criterion; +use fastcrypto_vdf::rsa_group::modulus::RSAModulus; +use fastcrypto_vdf::rsa_group::RSAGroupElement; +use fastcrypto_vdf::vdf::pietrzak::PietrzaksVDF; +use fastcrypto_vdf::vdf::VDF; +use num_bigint::BigUint; +use std::str::FromStr; + +fn verify(c: &mut Criterion) { + let mut group = c.benchmark_group("VDF RSA verify".to_string()); + + let modulus = RSAModulus::from_str("22529839904807742196558773392430766620630713202204326167346456925862066285712069978308045976033918808540171076811098215136401323342247576789054764683787147408289170989302937775178809187827657352584557953877946352196797789035355954596527030584944622221752357105572088106020206921431118198373122638305846252087992561841631797199384157902018140720267433956687491591657652730221337591680012205319549572614035105482287002884850178224609018864719685310905426619874727796905080238179726224664042154200651710137931048812546957419686875805576245376866031854569863410951649630469236463991472642618512857920826701027482532358669").unwrap(); + let input = RSAGroupElement::new(BigUint::from_str("7").unwrap(), &modulus); + let output = RSAGroupElement::new(BigUint::from_str("5444492704319037537848849382997130257458091920313310963469599923419703322783721383332109208071192007557615663183709224467386234852497629153152862377352121173048526345424682535646669446469859574126553162833057561585756085240298759978160929333377462489673762757617615488844937948142822445192628606262358969710943309545220005004589359213014081265816729325781163844917705028512211829185246994502190312893740732721476675890088117384780398379029251987352350936426404657867918708673019983190873326725524276319375086010890288455110170206157276274338097127077627478306923934005199981674848420937081987060498813534932341681789").unwrap(), &modulus); + let proof = vec![ + RSAGroupElement::new(BigUint::from_str("6679564366832139503104283762888037404416870541732134274345877919199993324193969718846105771024937544710181071087136201974785027004914352648574124684693816014994559313060393627240840995238994231678396027767667426048898390145848692775163146129731932852781416910309047480731258260241241382574335141639822579457784571250591710321475871390379928140009906646970098497494641257580809187860341678530657717503900219052291973828241271410633714169613716821114221182102857285161270011055285216655874337576269892227808931677859577932565763671291426810526285050598131279446635203657933827350410624719442501770019110680598892398152").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("8830026480062475995526266795391104557549324011188327807841169130514396667832957063918454846193915712802172368220922010213303515222320020775307399425117206223345904729492618552871702509246506391151154533791229891398375796043267465869582158251107795953989726048402397904128628900765258350376529604744766206156631348742571251470380283726192057269949174220643225715483850828088855159842868982977595655696560379303994778772384458362696836515830059740361363238193014345369144543311973745014652055754794521871424888114124253400717220063139105291227569155712626764713425536544640678700493351143361879971872613195697448768854").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("4567376911074252994892820099899858319597575296558822561094419535972809736926757879517592504401123541187071411103935004234313200066650757414820280036684803703218689866640882052107641189113280248967660749157290015236422943444317573070545542478767227686576718794211459463367507245744333491937377222528222160875907760444624169878351688100865381442755981182106427481693693489122050957534144372353154587911577148763865664412332986802653778275376806156680604686798742199098862320996130500805950341059059392491567052465822972458008807702728706609715566039261635620825229947330227697818469526034157154277798949157190300959344").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("996272150845384396336578562861076798409589068696313627904543062182212193459997554779164533761663471955220807663834104218464825236298714033514091957880852597544529764874909147690094083084648783218593934128778200543125060918583527681090691816686106557162649719234527918352005646527901089219055611735077869896544443175854202060522481179294993557863562928051077005632575849195250051336272843318147928309689256304460819541129284799398766284973761345057403584267345347567770453465994853663271415584853041590433212190378960078204103929441513863878962365511430609480252696833980748597817427210648563423934602453982923160094").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("6238550360643262698945628540905407504780337502829929670500433543579366303467537975695490898172712218688397435624336559661536915018569686579051138878490121820191125820906159492643255165248638464345969514717587471620738367952008420151216255190359365978361264079241724434397625186211851390680746593680756672414655250945945490977321722600551180124516129346899148580713219398959044537496300453748150472536705386767864008630199179535421300337242493833278077448468345533881716494075982921151609329941748306781096400960158513811062331702911412589986331892781108803599612720655199723327247128986344584819182835736797821603558").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("10837607066921996591795993952322177854066391723468796953000339987303683875617802104812781784627014864942149377875899706116183891065351648052993174162770263383849083355880203247034605476650318766715075633701321752230183760475506579469613656854770154009242238130290139926271048470074714897860491857853163846718422299360687331917663643177268150407297645001921296185912119487109328033435547732901327112791412766608578929151510783743351200514531902420496157404420863175226845241472262226108815737926295314537433886685357961117955257807561293783393492948193236574056345595599913569887974223638147698876953644828714365628179").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("7994259239253794295173619937199386562231580500474414986670808972637528694217340544040889932888105191421829056977768104671621035803499192706948401688652310167160301149889068063538488672010796592555585502136615547193166612090820401851999801602529795240956735868145040304228379910982352565265695552265653179159054741787142460152895639437208272927869827346025553071028755638198819233564368212168527448101948739130882000696286940735837924352064216483062213119866547365665996744674892661014624845535743204086923496410967380314364340679026672665102112612937982505210032081470981257651674525758627106585382911242143866332914").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("3608019239630916898309992472513277775866368473213909478878215776229992040747344723991100830707569069281812511489290319013270255120376743702932760887769357470417668943613403808823456851687156888333455047506026599084656153612047966428938556792526826441933185584577425264012280792905399817745258888274960706587956814794704453550362067278487253176426701439997123152287085168529437668408279216056358543261930931955756882909913031447076605154886793254214630987360166739186790163739420992616002476472379561780524976767726864377741160871224794475689920025321251866549997735486961540077939420519082033388965232546636368851227").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("4759490826349827039200409720647341257919528301044151904785354853208232665461182238248761230753357601921858430882674823080645930020166090875048707050593029067571989314966468232846487639831232827610167572535947172231671128964668386567713301611109426401824618031977705409666353166086976368880070435160335956501408676118609400354732336896783291602166773139970876546273443366849374185169132661511890681335976318064005220699421285987255900838641983851230674968058416338887637053959485406158127702828050728692252209701615681597164793810634869466392790541233796115226314074351145666059470025356196975194030400549853243526343").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("6426798149437008715502679585543556314341096707007488032267381203405162243718456189768755048206553314424248566454930205083567156045259096786454362324685595540904584644519983211179863322905769355919709086496334930754870740672902572697450749145478100579550752852739727800277567254996128068227351445996406714639361068496541506047931805347905671613533698738240358924931144243517207797493342210148818863705131898275032296924994970976486952072855429433776281756942308835948890107675667370407477593939350980417325489721169516391190780830181908584815419820934676775344126828549321614574780715930771736409952280676594360110007").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("8576512546202745430405196454745548325303238928278225593536747105456629542894386780466909650208043533280026336611762630455553906448255704258942262534120878861437810581665116797372488839729580284327201546753452766514294571928255026443962542601833745004397596871092073436807308532211388275712765767906862047404056954993995935342294561114090073707066565114388999252619533730657376326195957429117317707828365010804381855093131044984784188740618798903868549755755171660621336689600960361394055223398271860423739705236118432366706405291111390418976717294445955994861939703320492335363933930897922217917364615893894663242914").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("1594309578700299215782484702440884607726544123277900726751381142165676894942592865255253178847068995824244944723693777121937602393945357366680202725526564758954230186870479854152481884346734818458320104100838435353514504901003282687105948903067518657374810480985815427481489469799882059105045179324040602082302359472510346348098257413816514068854728279950149431179514567937105036098833630193694525747802859491290914584509750587722572843824387296342773183274814134056378826183595802659577283310521264436026618861010755733209211000171144765310240303812404039237591020733823666289717674127223235144286568673449333087637").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("8138647179001707172009654400314268729378927605545738322637046605268070617543648016156543823901125717738756780248884754369138795692741691451575752343522605493256163378171574747447998693520986866864254262736662476291842500072937880911035888315728088257717480682250388313969431929022831273817915319589151270255799479821004980541352363107073812428358950275908943196368686378996133140327568146151991442711485966579027128511642662125982668700779573378771139662719141754983392636772085915756801563443675996634499085021667653867791321294332915882302187297601465826089745392741631907826981438426869756897080958222984973081204").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("3454719077561128894831789241733898805019079457386518686168821002885372884456743800580740575027899279929603662096321583201397334926641498312582362866553167694687257297663688077721423886984804276622760131161856857966206923016317229144522969277817929030624933959526182200328227928742118797797628059748568036631001489186038162690891267740507268925444771814874376454863115385250256074198205648746168153300937495301218193124499201461719473381130716031434141216763900790355135005161995753026585263963219066334751164209190548426038644516587603310090988801762979912851002693017396159777254403269051437893570367640096944783487").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("21244828106426429953070138031229432584536226684515576322274929495105659810140396888026390817693598102538010351685043920352948246264772640554194266831971970348159046833924917761609931495034028003585737930558210281585111682939888786370071508385317231417841799265780582883126426878831495614062895031891839847345007846929141562036327803957153468054471920600746979579484561254214094933407729890565325102398574665671956583318550423088696698918529384489090746517150779139532800960287322052544840580147862310356905763883971341215629696878379017447694181032173323913588132013239469856515183142028744158121490771330297866506").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("881893646739992679961040621040759781484988502627514096906915722941027965533956405601201776348565320844285869882447194019408953941639677126234724198000417018002149302936648312833789825383911660055491500774540804332398890433018710773891495564035152488751539865251903884643678914740738826596765391754017863970470811428161295811972396387917841552112600884670151383054307439937589268173417423418548818319785628513825795027335597244328581341428286410523784798616381143755239969089490401541065757018249668613187662786844172833746370971165588807308179417543383825376314439304726804535361230741303349887552758072650736106053").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("8431958041176971105755112368113650255175678180644179180043701701157393478296077319663139475094664908101099642845995508093156505245993276758182487684963250401439079471592920918074295959996341393578065945706496035673215448386892271378242325777073709685133209523638403736317079308043808416519364180382861393772001566830591346581262388905442782036503077846188100249878060389520221126272504982239094537281084582364093303640947823808468155791205138326132853764855125750606538505873409090149045143401352005235218391876150720031979469906680882405961347957402513974676567136624629816081540736316266610999590729877586274828598").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("10556351351836090824545314858760238287069027276927396524617109164422086771664826078200261905613830772779639740325067943359443083181365969385009887862710144404404793758005654298629911456676632086491469091248688984582231158278176588145142499807454181284759072148408605473092536412205032481339075343020656367760901479067266427162854188514628757018720171668387578557746623621932013562047973871773564628423231665250218672671536592019504787275624112960225825334400544048556594249966207695463903039725921664514873591280536188133323155456206359459995344692614894299418256010030065095560532975704338684511848838732346909913402").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("3443467329641215662596725634037716237143909833318346606913166429962363085605102743485915559902041202687404030898145924844677673664208229993415790230054130031305834088339554725516738613608504261843094714196902836588533375854196643195364558281313689163803378666553264139456725325284132383186881952464362849033925736125612950905670334959507334645134214487473223738315694326407337453783726404168027648986541712328980987895863002615234318789817095660459604017108295674955671181149215955043286527667758655263715710334150698692437911468223423858227401708126394948804927067636994401347447701319134685860736492692504184388877").unwrap(), &modulus), + ]; + + let vdf = PietrzaksVDF::::new(&modulus, 1000000); + group.bench_function("VDF RSA2048 verify ", |b| { + b.iter(|| { + vdf.verify(&input, &output, &proof).unwrap(); + }); + }); + + let modulus = RSAModulus::from_str("742766292573789461138430713106656498577482106105452767343211753017973550878861638590047246174848574634573720584492944669558785810905825702100325794803983120697401526210439826606874730300903862093323398754125584892080731234772626570955922576399434033022944334623029747454371697865218999618129768679013891932765999545116374192173968985738129135224425889467654431372779943313524100225335793262665132039441111162352797240438393795570253671786791600672076401253164614309929080014895216439462173458352253266568535919120175826866378039177020829725517356783703110010084715777806343235841345264684364598708732655710904078855499605447884872767583987312177520332134164321746982952420498393591583416464199126272682424674947720461866762624768163777784559646117979893432692133818266724658906066075396922419161138847526583266030290937955148683298741803605463007526904924936746018546134099068479370078440023459839544052468222048449819089106832452146002755336956394669648596035188293917750838002531358091511944112847917218550963597247358780879029417872466325821996717925086546502702016501643824750668459565101211439428003662613442032518886622942136328590823063627643918273848803884791311375697313014431195473178892344923166262358299334827234064598421").unwrap(); + let input = RSAGroupElement::new(BigUint::from_str("7").unwrap(), &modulus); + let output = RSAGroupElement::new(BigUint::from_str("132258848912681879646098197896496547288205862103934859932529976604904958041346566371820866238006440492133351730211726558748466734451161741983687751455338552085922834778591158255931128756916923460943022870480146470705760516670408102001179017585107797175799261423471710408261206410510989316174706742594610853718404041983173093564665135120594233162270159146008584474720944483027159585187036972793622500307542051023108208171744336428649389940463612190806385991432441517865560300622707352662446374993485401034776999734365000449744888947318713227581736414052030766152718428961916594340731379307219383547450196111136588163954962748068859548429954137597211549762678066136030122566357052570414924934638411066013218693597156387572760972023693802780980708941425417499693512705847883914931313131720314863161719080016852840728116436130859161018849458818394939331256820001947145817472764809414120193413010033320147612277422098544583785604791216623819862583746950714445344252433407686501128621128159495422736646703235176604397499876682408299735773176003073430752769593983398012687617197424433068607624164589222714136997374366461982095925849209363782348382653209156036371580757318894017137805671508219360308514181874127780842081911617845825709798435").unwrap(), &modulus); + let proof = vec![ + RSAGroupElement::new(BigUint::from_str("289419356547973777906407640653224827492298119452089874159500229810468629996173719151436326814518051917462612097025856791206908521490123868536881508772973901216817150969429935022175258193733587689481779573216106975919578776249063558194468844345608969026122208477866775322822864916915836488498735628153509450440647537048709761043264251306245860061404449299241880224706021693240169669578496294297040547737838309279903372113929703412207069654097741218436911985378025416842985200324158794464306488132209524029729844134360423495896721871306046616405810829054610196451388357608395851539518436760268370546808070333791518834296292858755790836628469073159396772541415067156283017834402836964164221793725682782177742707581911363640429878332763855452719640283566713093374815332050843956648572301442625353341197066879098021691259822582350272913118919517537356356570653119999384945109758014129547980982793267916948585764291029089854150405668480707737100257778642819770576703330282599575650350806648302741790816625918051723319652667341755852066661251601605666161763762242326790262022272162659264407285976264358100947735369402258158917349542864983888784792360101166072332477091896885155392136424157046382896022406861452279600558746034100946048392169").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("75025111541194704319017410960102287573085230928245345435489994128410163343003059702434037036352550781164548409080694665589803829083934941724534313967656901550624142710728319432216211933233120503690671951857839586050939871577206313190419670995270168397429053795147354256994752157500918183085407377403904385025602896394281521916589823791902897626290508133040824110252617933644847251446736023218700675547655985067472067564683827755730745670053840309461228777276164100717895121562462868674779072307572336751414244643876029183263390067413290650278677887974056175647693702225969710171528499191420050284580891726143592145447637699987324419444383614306120883234120972310054845709642375332688841956151909560323257412534330356278346825015277452106748519887468312394482493524414383970249866605764476904042854902579027895820960119870594498421198603407128869097759432986008125924522301484636916991505196724400337823430101882881372135867939206661784471258008403332194307734463477796918443021163755892579605787928263669542397463624597039674149601621008285352418322244333277346054620953605543898435707211735833652870276532721426911432386587271481015897594078743231660890502816446983649918692734023910386720732534732063403243993259591536223987914214").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("229136205623295294587485874077892206056651635985036933761537351920661799438366447739235023455581726432916943386868720809375375203860683692077287567586209162276927525781582015783871671165687893376471481972172814003580272460914340804132255850079509565329474584983914545721918914748195691431151129130273906608021655965664117633803771933808735644886793486308488733585496165252450888060438821439347314488164973125507283744928827683680644978465174642400954601770435715483154729448282971153975162602192202909559537265669488295406297038460566039683172006951190548852021683109883011878912415323255930264367966935395012409212705021624650917724711805225339114315003999474969590486376308294524772034243714205395819387399529001838447294415751067252260300800225250825762617947578764133707676838185739618936971029626269813036617298337559506018627314743807160140000772699144450572948236765437245987085386796097371104828581882684241109975905861661914147269538150701941938139448075207224115618554932526515650314452916838049822986667702985920789586989100717645904595932255909795598352134416566547045600228049747575077353138923447301557860764903153614890257452915652515756103220735990507643701277261862634561650120628783168389710004349766777931006884977").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("42628301627169384663786587001365018597077134542116124641566581891908232806881348257397164220655769011727874646130372056066930952592527038201474282051756543333342132998704373486222496043769342799328600828500202461090553858931151726061515986050021312849752962145399655653153101913959773307800836530670726903401024123640683007966683000128468882299264668322717221320388660468438704636557004044583564013260992886182011995872145582970509732592174604431087445702113621569598264068494503227864922958493324079443718084331829028837380198267168643456623156107145909079759766773360199009457102853977268053961898581237994230597831454785593085244340998481054352531915274978610099062446922656260219793209503755133682977213907007982690744990901426841333504821812063862693172575951045431303310652587953694426210039219956123858366608218280951321054260029539596390172505545576857489461910763080979550474148234146345029667990836043829977216253860334289724112935492809870059193939822670620972413207523465376787277172998430370644612673383274816279469285779674358770655884996658587369145684917275878197577525025440025402419761217207151485317280335572928392126709815479422583779703399990251931222107175552067616191526798892195760245190077992213877387969043").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("298871655702239378847200807330152183858717731405253751820175519915231604141225960710796510906135508418874236191041584906185598139149895674449693463184045678519393758420200501388001104256717166323763090192568458877381885534638209614806332103529772720614819664748407738885469318670447150322069004981063565192761065239154640682296208701826449168037809332596570147314985772906056495780388643163718908673294807192402808558528839985362286343025391721101198756952828745799546640703227053522418879311268177519411437556844152610226646034848465170383830028027279564571453379108619904315128999074142269771281013786393108345849204487120993880891797214196061660330512821047747799845764786567051982739099906519710912298466657615938040380679969330530110601300297033340640122432774957667865953875253278800641055856875664886186338643700780241789825039448236636039392071769718479607881769168070706375832590198232840651525306519726627607052279441629141859711758106489816845599782921384782669883432855347768786591910398159616981676825630997549201507678247435780327318155325734117015152938138882147044676209997032651957063149979643710659648985678202239384526088420865215396606148451369624705278519596812229058360258818521250133217509114293819627516938521").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("97977294693186276100537669034226884765695240466039984134176945261355337387521377959150762164639672079898031339617922936161064910959976576895108359105131456458613265524520017501761184994308649841900496779571336080717516274064022173240751189865040906185380718492828907794258175633761580624236285021763802739989109026463818640411017393051079090220380723215169690004993454645812142155886276769711392571811335544692630467403435565235140978361484118549623367740939218456642401863639758840696320797563011771968376112759203290638798748093084099606368497523835946556797244266549856533830882330386800785176389316672947818226016671966721392271284077110165388229062710778370114227067051979364340680018181919730936748036647365070620397424748157340837608988115845628858813289571377907060377208389011310845065169759709626900814821338836413220634217850640183007518243410337766463960707649771489819985743798784358162149751221612705363686034485506708160422361349770428246729936863861294169178794433038798354831833004188981923000588580177063995726456588674734668670045284639522810898142582865097438945795325440275388720688336028668766771794409741368991115559980299270366588072227441860187764606598649215077460271368430870534996110242174911848878393286").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("234396717548677227552140703075611079741905406933678826638283143398607888856679783839414332142478128076432135974203173888634927583403505254515625822572257213861019915667359234629456375172861781472262473590509985725707652842712233176750259291398069288758135263120232527048640697780721386451219206172140992324472274671460234906487944138652552775559618225643034823857999273609504585856951025371408341693519950204848272384660133878408280697356705750962666243675292999102194581409493740079065682420925121456435074564389229280818730647411126615670206885194340522606358065697999263114538422038841799712246677872626449118965584634283547430477716999835408058739084394094107228886553494429635214443241686503547153371234332831765221663835055111269697372598550645149655219448541304631356481287931665628846147297219394330658120295642353093958398060762793992709749181953202579604119265381543996838379521400423944248320430094466884622941621809481402417100519790285518061821113597888667890880535255300048777779921850933182939349104197011688379794985086789017575868984827906947516139197613668174643278167566561320976410333456251248576811755020510178893201351475434246983580447784101319636914941301345741217098158889468502811974744326099506605292220896").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("292249987113826038266439993795544982614541412864449848056097576837692853505159932923785086550642228250821929576936718177229986084415458193480090628209446655839452925785435313573677242335784727796110085479592221809378624016223057709942691153003654405094526999187070627854225208060213041432751074658725133896776449201426792681420973613104827540615102672368467021703825925552510313304916854409009701652565418540527147397309420456759922833434309957918793197330340912310940584514868944962635729031892929562298625959960283225695289786372492947700407539012016953070221020872772926923192782364769617441214919465589446840244208626885061751562963348373062907404906245648825768786717073856423994544470048611465847872770226898859890039893243231808478504189088908062596824195079226218488724597557079147750072991582041279073940791623271803252712597286636086499996975031815341607788005958821126592889013214258011698136746155684096517242961394911372748181071483941529939593820440152451803187071619183592591516110247673728380518608385031662735690872911640882279159799726156474583676787099528610474304218092537347544614404537154900902252831560559594480986297901944630649417114758757227505940658552058408536193252875060748865657705847028874510514930841").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("192255503350489147190723073998823989248198711219308112659871393153339741261104732647450410318149906317590050267178313962863092963851659208657332757420632604667528516317642033675730811562575399862397301603430029234965817683449028988267176996434820359505663679804489849453884292938689228011071810061562517656293432755778543401236480159345064209502050275408722223084964607150928680960941735751606507478282763741831626387857027797423460588072975401555789249570244852089196340305266518438650778479499441021101115060532733006614587829336222609529492382838912549774433458837703755103921496319483469915084255708811492305571473553660650834794583953138418042746303138766503526411173644157203689280700977532924111152415586713605057120822504339392804898715486308775266518870539560563937901840825654195725791574431880151543062034286866060791573819399797337102544356178048985652393566239956021808852370545387274973830123126449801809750528730161164349779961282352842160638895895467717666770430918134207434952450948063037056974869629171695657599127107893003791539139335709225852263888999502344033730252309210912040259589865503202544785292811100296705008763198412196473047636614574257486770657867568636855884543115449478382647830456468587724844545972").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("124588442190653150358281125156453643269494853617125882896610052205487469393936752422910558751083359440843417024920306600090922395459418546909972688979710330479241344798772892694403083194444576184222391649462594332134072821699758167059401169301532300482420765435554599091624668344724788830367350123725799394054765715937050807549987832561637797125966930866569487456122607661733125402172255547336951711751251124212771975413830251235694964710286214941770441412833917812000280163127711082774680942740267689519496192108932514962784266692372202584581932336690432079892188659931957304601355786179284009010807331621876425984074786125460464704346052391461866085764034093417979075139907633352128362707467256767051181265889842865553316548695262463790162796282522844024002521216433650706879136011086959909841070928334378205846259410875771693297515149130465194808406867998566621412914154445539711792048753519462571581069768825331566332431618959426660197084205994403934779891087136771775773797135044276099338955186727078610955349083552178764992510779620443937537760595526833680707364165712394593169313965232601885418559493192592167745700331288098300660381829981260500468675055038277888753967650906455786416990401526199741953197898910419768547483564").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("110401765449867630190728562092680347332925309084032686554398570948981094333625401314963389610459733796816186571062512410405498251245576623075401633606383957369347821656240999865401213998739256134794393167427367328818303829356601465140199990354881545932162058227108260342466422951434899296859808512185869375544634146819958102763472748745109215418309181927780539635674636617595256620966282213139179961561064058024572930497760703236817910657835012631454121863690657360368246943123115484424427240179858951899929906196935838523874184435532615728747525550229973608865084595476625978685771203370104677022340877800714132345860225373603925217224411408813477472562056913815179970132707817922983950378640501505142786152928761664494528379635105136815035718236358293993992940704539424485521563224663408680111884044601352931044691112590003309227556891929953792975114158841676405567354993918990367668970990483663901003183927462532666513300056487158293738104659060419005098046737214890768214486499921068938679356427974065489671722486269725583746917360640281303678453846351489640512395701637270028814286863314283365763472064658743351698695613592783669577654956181007995150099343882981667383226435467210927782333575020448136282426030965376417998311992").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("126809378706115500156730267729166107083986937118182960912929685509035583504270409552696208116564106918518980524864749720004440190289969784515843724385013485678722853987537759286142387318097497761641066639191320124575447369134787931439649502478420493241965699760855033067808876383319432553444552209421256574700408552464569321775985657046483350503753064402613196750155662810242754452631946797537346431338178424262269376887431199717164231296733279340716491674586548911192354704245994977267930373641822130703388712537292446729017423388840233674226511584090270166636053692341887478238797971807921864309358522001181041840840169241226726386643180671822449238840024006808923490316571433320154929626003239813322823753084025222849738277963188612876319655386068279335341301429117341669017862486308197336532931849282657774771320144097799557577660850115554521575825069436528839988304564613411990990275664591203051408160036767972455145540574063512021414980208305420975411884242128760399643863633776025628721330382210549513852828260214519679128990772370309681736881116154121687536727624520428355720270086159554542007954685181391409058962887125870589399257719884067472358788057518125036715292082816449184950430436768803200783361556606122328006802594").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("49343349045422429255977275040625080448185164963922626304865389947196030635195824306223988531236903986612078267017669872471562158040962033046511579594417813702432629786258941345229624834705022831239595685092241369579035392095378458137499044240754456184619136998334599986125587000683169459245917293171833949242888151268823309806524096428342793799223164906560182026509082183179750547500879791301716655110318271286862887279806928220516692245503277532036332540805473440403735055633827206026523198522590013036988151343465656547931568466331999358434760034783882991673483832496793945035045473936280920992003188878155047003428402845553354206255600362460017616687957885109829770802357253633890459280374909863795960793335395465833589581760854052187717914459495692982122490625576256073871540199953023940215399203414023799435592964376700706661436949682341477166134104786615545465266725399203762924237234000067289806236266818622251201779670525699325493703785666443746596650447718134272653469450795960607608372735846411821604013229371617225926227147704398935354986832269300278890114330620993462409369888811256478525905074334297212878542393452170097926679626158236534388744219402173755910563342977086006079954830193820969094689428102825828596818909").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("271805852452279398758769682184133351824070569124978682008086380520706543991724917142333491234831138278733662773960309506231029690567514791920970103058954460563193694934083084166378508667600821163124436368416331284032219226773573607636612928954577453596832948406169505701875678217970350084624461445741494084595253995550503003973229481438609267073173656916194579016999908415753176668827352514623454660565822447274915358463199884291018250500299007637482070893741498782382815263389234580769939094097492251772054241772099713185105635584955480148436596275425650889282418991774837862047797358382204670920024685081841494394564521313865964167180032266693902914544513647644119737670118104283657501077292088851402581932047557149852666387238151536324757057796244926845186583095118160517264939905807135384820715945864658144581643119884057906421216594332379436240760664891406544878944582719087056444721361351131016710569331366865808185143751982607635013148432720291088705571084364379858710749933620838641205887003120757734339701757459414467040634023649152342184045413033334995772128024890829838399861422506954965944528675706003730413718379229564994731279255853791885176126762872361985913599717090674950114248399959644204946904891964527984988595336").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("353892707681801435884587599575566418901831217558675603551107598354002735146681013855303541107098584949980496768283308651158181675092654078475291739023074683656740506788034121608100017863183028524522580618397444545265420051906164327033074039076244007716826786131011315562906302622630332013109868247015051733737686069992161935527461007553714047973241378524108244815394617098585115494248466824317521602384722330035308700987725636518144994909203321696651747593838907041019054845819904084735085598102873935046101730582690130068701181712413821349574003252988160221387284564741700054411259010176228372132609446415071336263660196789765857303531566293286478673013350299761062312988662815896742878827993534811860136041657378611395733248818412528702059725495995029694549787775099288226059947831971122315933231140250317088220654557496581134648876824552658369836204201274157208704160135136389358506315241139680451113177549548730335947215229017686450030740535499410661752353637718317045043495973213412224045407612605044633931756288059412448224436777849048546763936761804809597952144956531152688739395254348573052302311411293237908147826099915640793798250797368396084015335086651387384357659250665506259626803577621887580424268327606044805674743373").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("253831702518291780307021473553624833468759723276352802984968006817950064816616104760768810028887577634567373774389924581009052546416079118681521785761891050006589744947749662348832992566944925252832474850831461236445680949846668579107008538869650732686866047844201704000214955891701795220101421535725447176760251077910807779934168286773961276982497467851231373595117201849917066700655177331673909976657052524474567070365132819816373876035612922239008994182565789548071795238083631247275941421061272528671479111543790255916041332221158655828221348211206069547220809159935519115246596937092310522014551981239140540171841518034086470919737807854328571912677950376264407559270071995433613330124146251703899781856511236515399016107431241631688433529220943322039569328473000210122142074355018698670800840894103265588266671422115735649105995545041121488603294679932873113883861364225956675571427259718791000324899612173276962841953560993346672561861736062175752169844461863794278881027591691601977008433280360959856767905937419670132625961659037949911027018425618511229464828596624174281750016057394447771112518700519849845871139287137185160031266217725082001065658685660219455363889113812698785814744461724869093121736714051376764570808116").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("361916029332453334419888758162253676281470069828042712126595810897590901771252527959516804911444823261794135344672944912881698238485869979575574728508322322924013168203371670226997213204951205118102936417905542670587851365148357486447710214234957055201314819992270676192710664224337432219066231453403693944026619180774053122610308853341926652822580981056949785127704147002854001766230684395621574739559632760925935966760094745083808559084687560611623822018432036586313301181031536483757421330816941384979051975130068910675511483670344086611703201805904801231685519452288617914011226992829927216531329848253596725684020048257009613913147418745061352857250205713144955031438780878356774943174961725354897371556115905383961175421552940517703740972796102928871621004727296284174762821509902171207411084694445720830264508970529176133922159822633391979966692916580496243343993192941218133412379570106165821250713137061152165772830832889661874924079097882584785281441975945081716060994187844032624281099981819720663027443869967637391872651103994867637052661020561821392651563392236576772563008546367522609176262811809459075620518492817843732559319060851829002980752869623780813616456767540891508546447903508617648501531785526128990117378130").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("309278412737836925686425405460557325723622763607902524988438598123640077352765108490367564553768038400336562021779887563085635139222223943799504299668441397462632987482294021884182702536866592514512464694090604108780384651502861727203764364341181906045794517995009504499893058059238521134694917374417966632551230328712867182017275158208175111169661268217174664142113835059241224987885265254252595834384392225317056420558125853890978540401606655620185667709951723913127982679027812749491396914386438424033171987109380388498393006372772175688604327973768501254366562108420083254794657751296220009645677539722275428155184254405753598924763840184549347980837683014350343090804558609216222044021100301846381236260668124753806456996103817029400375882541789165906906082154497006266656696336077735995378861146887405311308546201552012351119402560550718866277284199682393231771985087381384018191095973695624169759047294431154998759517398583912764884690816441085253424907240758498083955127870110051873648169674581638894677315539531712611422383969369380179181655332286816876411206652353932168692645033623603154234465252225918630653997348074153561649074054547715755669362864036107238911470078320160245040189084789068112766730911391698248569656314").unwrap(), &modulus), + RSAGroupElement::new(BigUint::from_str("337539426773388711775970131718915663339383609247440212846563918183066665905016040313206105118748699194323349009358917128404755809163018647949454823930161022137342754692835959986079955609200095491835733158834407887741200621007744578685440968082958557091734422107435019729171241153813407378215255272789359904165703278497455208186507568481083877113874117286801498462959583178261529107225186965953572249486468378158387305998916871510902666330509152092732000168435680833318219209313342395533905529866295411783822955970712457078297227095342543480440584895472882990154406630037562028817504537503627757252901397435177642897936195327589764354826589294626548622624768873282740097255655336796334974689509162212581730760119227740626297913627016814747938717985330635560338764153408379295303053986290342021328898397676219023830689997382715661865893825647382407874225309687026712180391399378920854671376532572994734822860243736126734927354078968469762309860078456088842593271630665929295032817799548715049069156546698079647583684278708329908077317401066090427307714947324891337807455290193503830079507806181915090738441953357454988478286568064947054483705586539794747932112275048143666692490922877838220220120306135660334799811972193665612230733609").unwrap(), &modulus), + ]; + + let vdf = PietrzaksVDF::::new(&modulus, 1000000); + group.bench_function("VDF RSA4096 verify ", |b| { + b.iter(|| { + vdf.verify(&input, &output, &proof).unwrap(); + }); + }); +} +criterion_group! { + name = vdf_rsa_benchmarks; + config = Criterion::default().sample_size(100); + targets = verify, +} + +criterion_main!(vdf_rsa_benchmarks); diff --git a/fastcrypto-vdf/src/math/parameterized_group.rs b/fastcrypto-vdf/src/math/parameterized_group.rs index 4dc60bc39..6f52c368a 100644 --- a/fastcrypto-vdf/src/math/parameterized_group.rs +++ b/fastcrypto-vdf/src/math/parameterized_group.rs @@ -19,31 +19,25 @@ pub trait ParameterizedGroupElement: /// Returns true if this is an element of the group defined by `parameter`. fn is_in_group(&self, parameter: &Self::ParameterType) -> bool; -} -/// Compute self * scalar using a "Double-and-Add" algorithm for a positive scalar. -pub(crate) fn multiply( - input: &G, - scalar: &BigUint, - parameter: &G::ParameterType, -) -> G { - (0..scalar.bits()) - .rev() - .map(|i| scalar.bit(i)) - .fold(G::zero(parameter), |acc, bit| { - let mut res = acc.double(); - if bit { - res = res + input; - } - res - }) + /// Compute self * scalar. + fn multiply(&self, scalar: &BigUint, parameter: &Self::ParameterType) -> Self { + // Generic double-and-add algorithm. + (0..scalar.bits()) + .rev() + .map(|i| scalar.bit(i)) + .fold(Self::zero(parameter), |acc, bit| match bit { + true => acc.double() + self, + false => acc.double(), + }) + } } #[cfg(test)] mod tests { use crate::class_group::discriminant::Discriminant; use crate::class_group::QuadraticForm; - use crate::math::parameterized_group::{multiply, ParameterizedGroupElement}; + use crate::math::parameterized_group::ParameterizedGroupElement; use num_bigint::BigUint; use num_traits::{One, Zero}; @@ -55,12 +49,12 @@ mod tests { // Edge cases assert_eq!( QuadraticForm::zero(&discriminant), - multiply(&input, &BigUint::zero(), &discriminant) + input.multiply(&BigUint::zero(), &discriminant) ); - assert_eq!(input, multiply(&input, &BigUint::one(), &discriminant)); + assert_eq!(input, input.multiply(&BigUint::one(), &discriminant)); let exponent = 12345u64; - let output = multiply(&input, &BigUint::from(exponent), &discriminant); + let output = input.multiply(&BigUint::from(exponent), &discriminant); // Check alignment with repeated addition. let mut expected_output = input.clone(); diff --git a/fastcrypto-vdf/src/rsa_group/mod.rs b/fastcrypto-vdf/src/rsa_group/mod.rs index 4e60219ea..13adbe7c5 100644 --- a/fastcrypto-vdf/src/rsa_group/mod.rs +++ b/fastcrypto-vdf/src/rsa_group/mod.rs @@ -65,12 +65,19 @@ impl Doubling for RSAGroupElement<'_> { impl<'a> ParameterizedGroupElement for RSAGroupElement<'a> { type ParameterType = &'a RSAModulus; - fn zero(parameter: &Self::ParameterType) -> Self { - Self::new(BigUint::one(), parameter) + fn zero(modulus: &Self::ParameterType) -> Self { + Self::new(BigUint::one(), modulus) } - fn is_in_group(&self, parameter: &Self::ParameterType) -> bool { - &self.modulus == parameter + fn is_in_group(&self, modulus: &Self::ParameterType) -> bool { + &self.modulus == modulus + } + + fn multiply(&self, scalar: &BigUint, modulus: &Self::ParameterType) -> Self { + let value = self + .modulus + .ensure_in_subgroup(self.value.modpow(scalar, &modulus.value)); + Self { value, modulus } } } diff --git a/fastcrypto-vdf/src/rsa_group/modulus.rs b/fastcrypto-vdf/src/rsa_group/modulus.rs index a6f7dd053..1acc4e6dc 100644 --- a/fastcrypto-vdf/src/rsa_group/modulus.rs +++ b/fastcrypto-vdf/src/rsa_group/modulus.rs @@ -43,7 +43,12 @@ impl RSAModulus { /// modulus, the result is negated. This is to ensure that the result is in the subgroup /// ZN* / <±1>. pub(super) fn reduce(&self, value: BigUint) -> BigUint { - let value = value.mod_floor(&self.value); + self.ensure_in_subgroup(value.mod_floor(&self.value)) + } + + /// Assuming that `value < N`, this ensures that the given value is in the subgroup ZN* / <±1>. + /// Panics if `value` is greater than or equal to `N`. + pub(super) fn ensure_in_subgroup(&self, value: BigUint) -> BigUint { if value < self.half { value } else { diff --git a/fastcrypto-vdf/src/vdf/pietrzak.rs b/fastcrypto-vdf/src/vdf/pietrzak.rs index ea53c71b0..93b7e446e 100644 --- a/fastcrypto-vdf/src/vdf/pietrzak.rs +++ b/fastcrypto-vdf/src/vdf/pietrzak.rs @@ -1,7 +1,7 @@ // Copyright (c) 2022, Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -use crate::math::parameterized_group::{multiply, ParameterizedGroupElement}; +use crate::math::parameterized_group::ParameterizedGroupElement; use crate::vdf::VDF; use fastcrypto::error::FastCryptoError::{InvalidInput, InvalidProof}; use fastcrypto::error::FastCryptoResult; @@ -39,6 +39,14 @@ impl PietrzaksVDF { iterations, } } + + /// Compute the Fiat-Shamir challenge used in Pietrzak's VDF construction. + fn compute_challenge(&self, input: &G, output: &G, mu: &G) -> BigUint { + let seed = bcs::to_bytes(&(input, output, mu, self.iterations, &self.group_parameter)) + .expect("Failed to serialize Fiat-Shamir input."); + let hash = Keccak256::digest(seed); + BigUint::from_bytes_be(&hash.digest[..DEFAULT_CHALLENGE_SIZE_IN_BYTES]) + } } impl VDF for PietrzaksVDF @@ -75,9 +83,9 @@ where // TODO: Precompute some of the mu's to speed up the proof generation. let mu = x.clone().repeated_doubling(t); - let r = compute_challenge(self, &x, &y, &mu); - x = multiply(&x, &r, &self.group_parameter) + μ - y = multiply(&mu, &r, &self.group_parameter) + &y; + let r = self.compute_challenge(&x, &y, &mu); + x = x.multiply(&r, &self.group_parameter) + μ + y = mu.multiply(&r, &self.group_parameter) + &y; proof.push(mu); } @@ -103,9 +111,9 @@ where y = y.double(); } - let r = compute_challenge(self, &x, &y, mu); - x = multiply(&x, &r, &self.group_parameter) + mu; - y = multiply(mu, &r, &self.group_parameter) + &y; + let r = self.compute_challenge(&x, &y, mu); + x = x.multiply(&r, &self.group_parameter) + mu; + y = mu.multiply(&r, &self.group_parameter) + &y; } // In case the proof is shorter than the full proof, we need to compute the remaining powers. @@ -117,22 +125,6 @@ where } } -/// Compute the Fiat-Shamir challenge used in Pietrzak's VDF construction. -fn compute_challenge( - vdf: &PietrzaksVDF, - input: &G, - output: &G, - mu: &G, -) -> BigUint -where - G::ParameterType: Serialize, -{ - let seed = bcs::to_bytes(&(input, output, mu, vdf.iterations, &vdf.group_parameter)) - .expect("Failed to serialize Fiat-Shamir input."); - let hash = Keccak256::digest(seed); - BigUint::from_bytes_be(&hash.digest[..DEFAULT_CHALLENGE_SIZE_IN_BYTES]) -} - /// Replace t with (t+1) >> 1 and return true iff the input was odd. #[inline] fn check_parity_and_iterate(t: &mut u64) -> bool { @@ -210,4 +202,35 @@ mod tests { let other_input = input.clone() + &input; assert!(vdf.verify(&other_input, &output, &proof).is_err()) } + + #[test] + fn test_verification() { + let iterations = 100000u64; + let input = RSAGroupElement::new(7u32.into(), &AMAZON_MODULUS_2048_REF); + + let vdf = PietrzaksVDF::::new(&AMAZON_MODULUS_2048_REF, iterations); + + let output = RSAGroupElement::new(BigUint::from_str("3672355472927810456151679905868758794616388736583581652860721896616180315835575064423750778001349052163223791724800901623993790866712822248888484109754966734883928871058715188132045817948670396453684148159917970871906760229102881786328076485709065174288114937597861379962478300572943579355762549162779462210911294105646062939394772010450396339819711345421231813212879300843731930189807951083800491228370195479515271316034750609611188992819886615677507435486955879522713591072027715880883277172276263534234336298488388979051136904224916555055212735687426081668066225539132052845808964107807201586990131791093492371778").unwrap(), &AMAZON_MODULUS_2048_REF); + + let proof = [ + "8719512874474216460687150647680854955292132854750703068763484269093165999505251186898178062066004619862656663698343691868497980570426526019975578885850544581914946790597872355640934341428693413899572424721269873153938666911042969304059487718891954826837874698630809943131078862483827048179876513916989352726065292297373409109550091793480245914861995645289031849847427508439025383190674698027602276320860090412338328667933755723078371787557008469872399255533817861369300159517919410447709106340745759633527098227506660977309887993315579818822200330785614717258672305343338813672124794370455365197734851856001184976030", + "3524225440490227716581914005817764728689326138271987326546913156143949550779591139824077984832090908071998951770389914336769029333480915517009260387548811330930648406468414527213930607990485031826572327430297154420012068864491234371049362834108095572222288210563942740991735388228265830602511240768621994740770804049029617345757918078538264560135467586163671018157956690861770799025782115742787596459481739552535516586086172662006852110953782305125365361525831420213691071299126328246388152487905764478231871643596200406647908089848722382856021765764700103197413553278821980238755080812642569566460155874926864973989", + "3386256193912258600563321427374151160437651417107230398140990906215918611413870201888792916418033967177817103485384285178003637404550898822951512439384277984377627754055120144092077652950815810643804322665300251229793337536560764764926079235179412052806380151642397223785653772910005773851385366606281262555049596002588808028004178177665489626495310464581979168814142288652114023204247090962814602454684901841935354676441552550033218538383127851117213323460171046993929640395141844677358751651632616897741890084456824284415415554894221269513288351780048483154293635621337002324127284236944745716110705339322771478131", + "7408862030172429723032582356161847253198188005112855906630189356951227804097029509883935224836192563731148726408119632983128842196882987765881545177086653651757096748219643205448581241037817385331996915432821304066168098773880393211961153863820790217510052941214079784321117971743731404301810060365970610316645229069960509651124240339464525485721413226027035555493674864907371842778371294951677138477875018003840619969373647380251579931187688167577599725809029577381715849590344663076500835477018110706747067929066540698745588647653032284281207590297280558283161226254697184936417182114406611858688290199092351638794", + "9528369401155898421336374761623167878924922005826918572675787143246237849874471257635361123764028975937343311664804485861820128360684057779979271237362810683850151327885936654765160960323604793157027745850425197516858623567687919335408856735970509721863383148065881142539924459849066413081803234738981126021705399792445956657733940194160711501942192074012722676182134009812129315502787932498635715069416080651060699212375799959775531304461678248368699251392095272154244316553547920213132393799101764442827812390852292543047588306534171173257087058146331742057376971999785759427057334778797976189560957105013350467045", + "10294651820160651728456829898879555551196961487064613372692384294265418044982827373843041565455655933992371447144565864904575509809947198474416922744319637148661233405028052214366165153902932698351161834805653679280884257744536629934561559541496076130305993849014886971786115597309448966484871145453391677209950550556478590364500734905015127553627540473598051645020805146472132102067032709164655196448902087849028550166457630712049225557448992309930729811971031335828818305551184854572895352878770266426086789864481188000057417074198845278355152274308525042623428164257444044541498663412953148100768983136146188235997", + "4749045743059502299076848945196073558631005868948441651589845799068150488425734086270947139878995514214119726260212551705844889280663704807069073071616386852792450852711805042766312070760756053408646662762397826414400752299162726413950336169847086249885638830927861421398231965683427732018263765712940081366775804116587569845878336332182016655558080273929449303602571070901792076802687535487545915059452072480809069254144639332974988342423715575563084819806637919328178725980692796438546565820486572953340526856360623620668058599315200343597721637054937740264892162125653205249722406415399818735024248737314552063747", + "5272521386133313093121504847176339485318640410159988398538154570040609938127193342269575965623490130675739152927549782661334170941321238880903335951305493326431599940919086128527082527057864468821840814550477028653687293814925163394101119890565259089917449040659282833402394902253943586909550853333057424633788010291693428637999909856531013688038817805974292565379653351375127609695388247301423539646327950220115990830645404216008980887159586046198784837543462911777611082256896302074042733126733093536925128289699426032159423325697676408264099787619827716147575504711932293307925317181532838376975174334760490178044", + "4865631439244694792682051927120887855014714782764996443468316201280149186411764462638919743896836216210355086464033599674608823616620181993224084354774021985050767398675323086421509833372146310317782744044433481505781466337868841734616907727794600499486966898550073615373789361818554381065300597950458611369588509114065985025852518182253888929859936361242940138578344904177539257408094849163580060796966127477986366148739231408126796157723280304456556233704922267395211269025280937735721607598808102862937894271692476411316343801775630519501390182293503303960113390510808164020764496445889549138522442194944316766219", + "1716098664111733751302684239386687925838384836544658006905034083331006633019856429890234964042806996064770725585636147008586818637936193658888381443567507219576974926569248997425135873112782252084087049174247625853371226689113885574956468036468201035128573779522685641470930864834546438686526548212910642194495508777532033343509629089340426924730626446347003141889733967730229296355986139573616824252745173021579889146711264881818395175840508044230472692250294317790079274412733463156608459907600873015033659104883567469349509785038318299646299550636867596927464451110109337227918075217459535287195599185046432272198", + "10721991997697793738717595864735689654814408802179139713299139161130174918125420293856907422920539738936394204606043102026032040519309913895955997218242869889330722353056722164513913325053855254230359609203831468726499782865513152890774696492202216752929686242664105376380907060826609793521588890690791106895587503800467949772773581224066322672834898563688334924748703360423621150393100717027630221055080843102194314393166621862146840652586817200363151726362689280490364249590829799246039599450021900326960690007908969307676046114319938297872389335199854504572884094360772400490069773329668111595259339308363041063871", + "24993235836866849416196592570323660996972817499564456104037943507194360405061754866850348770077420997103335102890585709469767629001870643341451985396909081660774052156782419424390497656420915820543525425352103071684707145165891840374067169328373245883329511678687043434601293171271199312025423435502927076645446502230342559583292008660994947133886690268696014405994231692380704451596507223379197197420921324939035607218784585824666269355224282438899491842717180848598449014025167402088262687787425520237057062755968280168112911893559397514451243586114205429244216713755580836976353622394774491637290756440823473904", + "8002840044191636897394105768503100351367843810943426955203265943939407779211249672257698205017741561535958104095665612435684465282015904737730202451805337613184916942787797112106584192538882516595181912717026458237097485563704041509438199717078206419533982984474171725446518666727110378813664918107052405840880667070832701817128246672829292017261411874510037160227026367399797925223118665562035040322045995481973053566119964317652423365276712206105413327459764222767039305354559649984488929528403367306919207004930556248185192286629700484211799294085032088235292426962942458433119325773711776898892739174573133259798", + "9808298167953463044183224853747590991821290083082693475897746710109152766350649057730805604162385834890955802232144653208502844156265486182999277061377895494700822405534823371717810993077165144659899399251399946686003871122626066126316460159851320953097822716750103981636398570978788394229208496720512000415568014823831712088816947453635369935021640264506413372998966855334669695718142871353958255047552753123177745051748277174077245602488815883354127415057464229321675973890199622571893243720584859039940876060951672389949282570769956932017208645843036419518163184395801601473092002267026597399366492737904207164145", + "3419924672544574100524058325383025198496207713265005632195290353279586550544804988055757778145112066368161851153318915869887514873926726636081263451040999914232751332583833616365834650019287835558155301861869825336660948178770848366160254240651864317486675126510537151881923158433631746791994990810114742904187471698817430077934405459479950737131082312281050974043218768012562886561272629075590257984018309718254526858184923594606358659772686305061082946653881595244349982087597745499473392706220050012667178661314295322165215791098424265370584312926915581831293094295870670813932186950843650836176864709988630778898", + "3876660104277748734969970799207654963546831221524157837790450138448447235917188249028042741771865887141807354675325586321042930971396579383599429668029844089074571818157381649964860225310811444870630848131459324585689921588479979399255647304741995870412178808125039448834571923055165839896461006202917186695764779234307600813983399230786701019298692652551177614160338386117023117927173943068934500519930664358506164490744248358331236180729050425334573543140408803841919596166155205764351816894658586553341628917380296648889364729838239067182538618852656851850409265336348330079350182770839095482851902292535994651519" + ].into_iter().map(|s| RSAGroupElement::new(BigUint::from_str(s).unwrap(), &AMAZON_MODULUS_2048_REF)).collect::>(); + + assert!(vdf.verify(&input, &output, &proof).is_ok()); + } } diff --git a/fastcrypto-vdf/src/vdf/wesolowski.rs b/fastcrypto-vdf/src/vdf/wesolowski.rs index 15f616d2f..2af0f64dc 100644 --- a/fastcrypto-vdf/src/vdf/wesolowski.rs +++ b/fastcrypto-vdf/src/vdf/wesolowski.rs @@ -81,7 +81,7 @@ impl> VDF for Weso // Algorithm from page 3 on https://crypto.stanford.edu/~dabo/pubs/papers/VDFsurvey.pdf let challenge = (self.challenge)(self, input, &output); let mut quotient_remainder = (BigUint::from(0u8), BigUint::from(2u8)); - let mut proof = multiplier.mul("ient_remainder.0); + let mut proof = G::zero(&self.group_parameter); for _ in 1..self.iterations { quotient_remainder.1.shl_assign(1); quotient_remainder = quotient_remainder.1.div_mod_floor(&challenge);