LibCrypto: Remove unused big numbers modular functions

Remove `Mod`, `ModularInverse`, `ModularPower` and `LCM` as
they are unused.
This commit is contained in:
devgianlu 2025-04-26 10:21:25 +02:00 committed by Jelle Raaijmakers
commit 1c3d849b8b
Notes: github-actions[bot] 2025-04-28 10:06:47 +00:00
3 changed files with 1 additions and 212 deletions

View file

@ -12,68 +12,6 @@
namespace Crypto::NumberTheory {
UnsignedBigInteger Mod(UnsignedBigInteger const& a, UnsignedBigInteger const& b)
{
UnsignedBigInteger result;
result.set_to(a);
result.set_to(result.divided_by(b).remainder);
return result;
}
UnsignedBigInteger ModularInverse(UnsignedBigInteger const& a, UnsignedBigInteger const& b)
{
if (b == 1)
return { 1 };
UnsignedBigInteger result;
UnsignedBigInteger temp_y;
UnsignedBigInteger temp_gcd;
UnsignedBigInteger temp_quotient;
UnsignedBigInteger temp_1;
UnsignedBigInteger temp_2;
UnsignedBigInteger temp_shift;
UnsignedBigInteger temp_r;
UnsignedBigInteger temp_s;
UnsignedBigInteger temp_t;
UnsignedBigIntegerAlgorithms::modular_inverse_without_allocation(a, b, result, temp_y, temp_gcd, temp_quotient, temp_1, temp_2, temp_shift, temp_r, temp_s, temp_t);
return result;
}
UnsignedBigInteger ModularPower(UnsignedBigInteger const& b, UnsignedBigInteger const& e, UnsignedBigInteger const& m)
{
if (m == 1)
return 0;
if (m.is_odd()) {
UnsignedBigInteger temp_z0 { 0 };
UnsignedBigInteger temp_rr { 0 };
UnsignedBigInteger temp_one { 0 };
UnsignedBigInteger temp_z { 0 };
UnsignedBigInteger temp_zz { 0 };
UnsignedBigInteger temp_x { 0 };
UnsignedBigInteger temp_extra { 0 };
UnsignedBigInteger result;
UnsignedBigIntegerAlgorithms::montgomery_modular_power_with_minimal_allocations(b, e, m, temp_z0, temp_rr, temp_one, temp_z, temp_zz, temp_x, temp_extra, result);
return result;
}
UnsignedBigInteger ep { e };
UnsignedBigInteger base { b };
UnsignedBigInteger result;
UnsignedBigInteger temp_1;
UnsignedBigInteger temp_multiply;
UnsignedBigInteger temp_quotient;
UnsignedBigInteger temp_remainder;
UnsignedBigIntegerAlgorithms::destructive_modular_power_without_allocation(ep, base, m, temp_1, temp_multiply, temp_quotient, temp_remainder, result);
return result;
}
UnsignedBigInteger GCD(UnsignedBigInteger const& a, UnsignedBigInteger const& b)
{
UnsignedBigInteger temp_a { a };
@ -87,31 +25,4 @@ UnsignedBigInteger GCD(UnsignedBigInteger const& a, UnsignedBigInteger const& b)
return output;
}
UnsignedBigInteger LCM(UnsignedBigInteger const& a, UnsignedBigInteger const& b)
{
UnsignedBigInteger temp_a { a };
UnsignedBigInteger temp_b { b };
UnsignedBigInteger temp_1;
UnsignedBigInteger temp_2;
UnsignedBigInteger temp_3;
UnsignedBigInteger temp_quotient;
UnsignedBigInteger temp_remainder;
UnsignedBigInteger gcd_output;
UnsignedBigInteger output { 0 };
UnsignedBigIntegerAlgorithms::destructive_GCD_without_allocation(temp_a, temp_b, temp_quotient, temp_remainder, gcd_output);
if (gcd_output == 0) {
dbgln_if(NT_DEBUG, "GCD is zero");
return output;
}
// output = (a / gcd_output) * b
UnsignedBigIntegerAlgorithms::divide_without_allocation(a, gcd_output, temp_quotient, temp_remainder);
UnsignedBigIntegerAlgorithms::multiply_without_allocation(temp_quotient, b, temp_1, output);
dbgln_if(NT_DEBUG, "quot: {} rem: {} out: {}", temp_quotient, temp_remainder, output);
return output;
}
}

View file

@ -10,10 +10,6 @@
namespace Crypto::NumberTheory {
UnsignedBigInteger Mod(UnsignedBigInteger const& a, UnsignedBigInteger const& b);
UnsignedBigInteger ModularInverse(UnsignedBigInteger const& a_, UnsignedBigInteger const& b);
UnsignedBigInteger ModularPower(UnsignedBigInteger const& b, UnsignedBigInteger const& e, UnsignedBigInteger const& m);
// Note: This function _will_ generate extremely huge numbers, and in doing so,
// it will allocate and free a lot of memory!
// Please use |ModularPower| if your use-case is modexp.
@ -39,6 +35,5 @@ static IntegerType Power(IntegerType const& b, IntegerType const& e)
}
UnsignedBigInteger GCD(UnsignedBigInteger const& a, UnsignedBigInteger const& b);
UnsignedBigInteger LCM(UnsignedBigInteger const& a, UnsignedBigInteger const& b);
}

View file

@ -9,8 +9,8 @@
#include <LibCrypto/BigInt/Algorithms/UnsignedBigIntegerAlgorithms.h>
#include <LibCrypto/BigInt/SignedBigInteger.h>
#include <LibCrypto/BigInt/UnsignedBigInteger.h>
#include <LibCrypto/NumberTheory/ModularFunctions.h>
#include <LibTest/TestCase.h>
#include <math.h>
static Crypto::UnsignedBigInteger bigint_fibonacci(size_t n)
@ -260,123 +260,6 @@ TEST_CASE(test_unsigned_bigint_base10_to_string)
EXPECT_EQ(result, "57195071295721390579057195715793");
}
TEST_CASE(test_bigint_modular_inverse)
{
auto result = Crypto::NumberTheory::ModularInverse(7, 87);
EXPECT_EQ(result, 25);
// RSA-like calculations (non-prime modulus)
// 256 bits
auto result0 = Crypto::NumberTheory::ModularInverse("65537"_bigint, "7716818999704200055673002605512017774829533873852931754420182187116755406508851421710377874835807810150544004124020368281638431187393087109588616395722976"_bigint);
EXPECT_EQ(result0, "6957112022178657251467710742735822058162610570160374638904992058315050936014396238029779769209358140634220249380773356423403675888538086147825555026035553"_bigint);
// 512 bits
auto result1 = Crypto::NumberTheory::ModularInverse("65537"_bigint, "66371585251075966819781098993500728937583856843831372038905151148345437332287092304882812087499010029105588098364783005919549558874442528396629248591406931414614111891501372333038520092291512484438801203423887203269149674846124095871663987547448839320258336408613886916453844596419759100107324930878071769740"_bigint);
EXPECT_EQ(result1, "26054622179142032720028508076442212084428946778480090764681215551421076128717366124902270573494164075542052047036494993565348604622774660543816175267575966621965870525545200512871843484053034799993241047965063186879250098185242452576259203314665246947408123972479812452501763277722372741633903726089081777013"_bigint);
// 1024 bits
auto result2 = Crypto::NumberTheory::ModularInverse("65537"_bigint, "15138018815872997670379340569590053786751606702300795170195880218956355437896550248537760818855924336022497803648355813501714375226639621651553768492566347398869904156530722997508431839019744455406614130583767126628559642684420295498410584657359791127851130600248257172505371207271304207113156882020325681053619922800978652053485848563399633561547330701503189380714480104549363705442836720246845910476607566548831148092234175836086100548136352482086041752239158391127234701836987492763766422215181929557528346258876471603164358341122158423252911442143627060117356562382539931055979839928020375814577774568506219095460"_bigint);
EXPECT_EQ(result2, "352944027811067647898738611629058427852304118911692860827613485123904223707309287574434266615985662838432895066522539680342700540859443396609154496797860427323087928211223350781892424890095206186754144857591836206851688878370908212484113910561145014928308094010701389437847432819789627667865537264858898647327940583790765221748422671237234540519772362358619915066782513690761367501055197957446641610208834119453346877106578279102485033455183279561583102635479714079717024343606159710438913791366678187343078155600092293050263813498247677964057687773249647494687288513671987040199233950440440274115001289968681855713"_bigint);
// 2048 bits
auto result3 = Crypto::NumberTheory::ModularInverse("65537"_bigint, "523474308603627394504956180621539730601163404544670078344572546811775850669696720017356530287979625576623354887741212994543899068001220583437221973327752079153585098984263865181019654102487287512742287583901185619943683690635892036920956164864785078974721208937251159192154678447234191958275430233568974368064153896258338157469723619961352235804796084551641896006827645045906990423304676288895690876254935487456610269572418962650650646690483258846109000171328266193988292013017586921119096421585767248613790649741313360067618201749482055683058067852760706162692126354831896695191672470846960268467251962491660154005556677209860743434696351971155125630603082354855591129257818487022326288868392996237441507506020729258165681956915422119008555908702541877086255318047295376505201886687588318922810022094799926224262663342802397393873785019139429897232975310359190270883355499980682538341383918065122655507451050546937038544941011313947405743092260202204107637846238518077467613057097554476001838993189751185435880317537273891467684330982378878693444450893688310488368914140946077563025119239896138217432169087237109636595561779480434253413579986644072788364909696328314076474006110809917696250643811113150325166438321806889977329096600"_bigint);
EXPECT_EQ(result3, "240127075385672984131139625830070783237907982221133353148189335410568341527428666156244401941613614961167400369106979053892812269120049657443477793981296225881475026790422579290126094592109424058098042199594448071964950528580600611958965243821505925343196113711042336371725072831518096843639993577853488509194999139161304606985554742922290191265996073819003163398587965470117671744141606775913928846496667921317852122223410154174992910744403897198385261335591218191096175027653809536744181084305551380061284286787205754668550681282247875856383030865885608272716379977803550823924611280514398989134855055135065370857211199581305881103457229188227055584369447256267812626743332730752890660577238791001818881550170150963398307775313919391546061252167851998883746488646960356804185182713413302894188591089552011567206439844281374992020196210238318522369271354430754186391905586095171569497490344824935263935189296620116395162680037583825943495347400986600883286030356418038099224122793594156156724989735012128839569555916857118867097884284041934024459778861054849599643478734444083949177169533378055193717492397723564200451231728283569509748271283984325804303130753631049728871294775611922359924670108389072405289815451858958044897456873"_bigint);
// Prime modulus
// 256 bits
auto result4 = Crypto::NumberTheory::ModularInverse("79065576377430658630291493727884901955697921969202460485568061955796483998089"_bigint, "105236333148230907525852233540677623156492475210517338560791379084799836582587"_bigint);
EXPECT_EQ(result4, "93504545219772953643321957341999793447107631393924073671776287172945600034443"_bigint);
// 512 bits
auto result5 = Crypto::NumberTheory::ModularInverse("6732413992718219635342848318074302303731222168385940253721776224551974038416513462421454674844777721589563127965274488341922551419528552939608455047714128"_bigint, "11522413189509252702442551731783393581283708206969207645140596867187940532466129960582867971721932546048110673296094625661627355203044884987258434322393611"_bigint);
EXPECT_EQ(result5, "11152730475146621030888388443393672975086889576414759677260744095766476531703359323453287638858041043666073703397243706949753685433502205695232485731849432"_bigint);
// 1024 bits
auto result6 = Crypto::NumberTheory::ModularInverse("74263833960189886466939196560269216955870235656416128238251461763825971916420974189969964837983352188966833052749715539825280552531258436173317484112004327881741531787519471213020298642984697548930887036556763982001107471012474873100069623257613164741565312643996566523133343615723683010756027848816042939202"_bigint, "95381964444589883427387341140753255405844325814158762996484790475715776875097467150855290612578232487289384615394165716659709100194630793773552674979686871441395261056953751419334210618336786252840280983695277648363095334709545375311967459037971278965116324165577308183006400447807648095049414919774916252747"_bigint);
EXPECT_EQ(result6, "58709722343881170435829301168583511620090591717154752336044125040931850388422639576614097557227300205781894345595418512100748823628637201919915110093901598005111776632116568475789059078360021536835127742733773460624284681421890935681567846755324337116900649074136799388542272888156479298282951539364264931616"_bigint);
// 2048 bits
auto result7 = Crypto::NumberTheory::ModularInverse("2083841562885492721290501151318058444158766003544222347122338319668970762119890042933475358898503059392439888781978346524976708635055122364241675726844930777696927712106305827918390408155067866218977660488635746552929258625544335318963328074495878439935663659069731717795216882935427203069231010795298950025561648743468756200717796561939220399337004980456668273620158478615916791124020696059432601192990947530965055857904582283829896086691653209249081553530465663724181700972927069397922147671340499270418643905380501155480764913403727582416414800901222394379992981688837765818280499497151738855424231982306618396076"_bigint, "16224364484369166277359386410182421629585266346687261081219199035627872465058014536404366328330233633748201670077151313307023144281234188494904998208639551259034363175330775169605905250528606169313713885192955997968412296964554695990505670926075345389730833276243454625387707778469967380099142375244892915645788614606443180803179195164798643205708829861402784554710221097157040790522116753790155662203858533778060827797234218324190122635514071740918420043227885163450453517325211468174509897086842869675754300089020572195273927710496253921910012981005407132203227555676309198192189264516679445448908377225879137304001"_bigint);
EXPECT_EQ(result7, "1920241917211855356722925925154440229550377096185083909958775862353126205660695403426655365321463320876264364542077391170885582314150929024605918556565268345499952616868512453484734433431514794042936426911598410457811519189984561227978039512706300456181926682048163061548216104149539350320019907684566461197120360812572564919099529762677479436223515410468281993579286727653390573176288887687204943283770190210493492026862067176323654605190038514894818679839404911730667301011930597975461644362994301634764766641419232360033891763076329125623575026815152128746383453332269905123747535275999442797020400268408062413004"_bigint);
}
TEST_CASE(test_bigint_even_simple_modular_power)
{
Crypto::UnsignedBigInteger base { 7 };
Crypto::UnsignedBigInteger exponent { 2 };
Crypto::UnsignedBigInteger modulo { 10 };
auto result = Crypto::NumberTheory::ModularPower(base, exponent, modulo);
EXPECT_EQ(result.words(), Vector<u32> { 9 });
}
TEST_CASE(test_bigint_odd_simple_modular_power)
{
Crypto::UnsignedBigInteger base { 10 };
Crypto::UnsignedBigInteger exponent { 2 };
Crypto::UnsignedBigInteger modulo { 9 };
auto result = Crypto::NumberTheory::ModularPower(base, exponent, modulo);
EXPECT_EQ(result.words(), Vector<u32> { 1 });
}
TEST_CASE(test_bigint_large_even_fibonacci_modular_power)
{
Crypto::UnsignedBigInteger base = bigint_fibonacci(200);
Crypto::UnsignedBigInteger exponent = bigint_fibonacci(100);
Crypto::UnsignedBigInteger modulo = bigint_fibonacci(150);
// Result according to Wolfram Alpha : 7195284628716783672927396027925
auto result = Crypto::NumberTheory::ModularPower(base, exponent, modulo);
Vector<u32> expected_result { 2042093077, 1351416233, 3510104665, 90 };
EXPECT_EQ(result.words(), expected_result);
}
TEST_CASE(test_bigint_large_odd_fibonacci_modular_power)
{
Crypto::UnsignedBigInteger base = bigint_fibonacci(200);
Crypto::UnsignedBigInteger exponent = bigint_fibonacci(100);
Crypto::UnsignedBigInteger modulo = bigint_fibonacci(149);
// Result according to Wolfram Alpha : 1136278609611966596838389694992
auto result = Crypto::NumberTheory::ModularPower(base, exponent, modulo);
Vector<u32> expected_result { 2106049040, 2169509253, 1468244710, 14 };
EXPECT_EQ(result.words(), expected_result);
}
TEST_CASE(test_bigint_large_odd_fibonacci_with_carry_modular_power)
{
Crypto::UnsignedBigInteger base = bigint_fibonacci(200);
Crypto::UnsignedBigInteger exponent = bigint_fibonacci(100);
Crypto::UnsignedBigInteger modulo = bigint_fibonacci(185);
// Result according to Wolfram Alpha : 55094573983071006678665780782730672080
auto result = Crypto::NumberTheory::ModularPower(base, exponent, modulo);
Vector<u32> expected_result { 1988720592, 2097784252, 347129583, 695391288 };
EXPECT_EQ(result.words(), expected_result);
}
TEST_CASE(test_bigint_modular_power_extra_tests)
{
struct {
Crypto::UnsignedBigInteger base;
Crypto::UnsignedBigInteger exp;
Crypto::UnsignedBigInteger mod;
Crypto::UnsignedBigInteger expected;
} mod_pow_tests[] = {
{ "2988348162058574136915891421498819466320163312926952423791023078876139"_bigint, "2351399303373464486466122544523690094744975233415544072992656881240319"_bigint, "10000"_bigint, "3059"_bigint },
{ "24231"_bigint, "12448"_bigint, "14679"_bigint, "4428"_bigint },
{ "1005404"_bigint, "8352654"_bigint, "8161408"_bigint, "2605696"_bigint },
{ "3665005778"_bigint, "3244425589"_bigint, "565668506"_bigint, "524766494"_bigint },
{ "10662083169959689657"_bigint, "11605678468317533000"_bigint, "1896834583057209739"_bigint, "1292743154593945858"_bigint },
{ "99667739213529524852296932424683448520"_bigint, "123394910770101395416306279070921784207"_bigint, "238026722756504133786938677233768788719"_bigint, "197165477545023317459748215952393063201"_bigint },
{ "49368547511968178788919424448914214709244872098814465088945281575062739912239"_bigint, "25201856190991298572337188495596990852134236115562183449699512394891190792064"_bigint, "45950460777961491021589776911422805972195170308651734432277141467904883064645"_bigint, "39917885806532796066922509794537889114718612292469285403012781055544152450051"_bigint },
{ "48399385336454791246880286907257136254351739111892925951016159217090949616810"_bigint, "5758661760571644379364752528081901787573279669668889744323710906207949658569"_bigint, "32812120644405991429173950312949738783216437173380339653152625840449006970808"_bigint, "7948464125034399875323770213514649646309423451213282653637296324080400293584"_bigint },
};
for (auto test_case : mod_pow_tests) {
auto actual = Crypto::NumberTheory::ModularPower(
test_case.base, test_case.exp, test_case.mod);
EXPECT_EQ(actual, test_case.expected);
}
}
TEST_CASE(test_bigint_import_big_endian_decode_encode_roundtrip)
{
u8 random_bytes[128];