blob: 8173a8977ad4ad8f23a8568c723db09c8d243dac [file] [log] [blame]
/**
* @license
* Copyright 2016 Google Inc. All rights reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.security.wycheproof;
import java.math.BigInteger;
import junit.framework.TestCase;
/**
* Test BigInteger class.
*
* <p>This unit tests focuses on checking security relevant properties.
*/
public class BigIntegerTest extends TestCase {
public static final BigInteger[] NONPRIMES =
new BigInteger[] {
// small non prime integers
new BigInteger("-1"),
new BigInteger("0"),
new BigInteger("1"),
// If p is prime then the Mersenne number 2^p-1 is pseudoprime for base 2.
new BigInteger("147573952589676412927"),
new BigInteger("2361183241434822606847"),
// pseudoprime squares derived from Wiefrich primes
new BigInteger("1194649"),
new BigInteger("12327121"),
// G. Jaeschke: "On strong pseudoprimes to several bases", Math o. comp. v.61, p 915-926
new BigInteger("2152302898747"),
new BigInteger("3474749660383"),
new BigInteger("341550071728321"),
new BigInteger("41234316135705689041"),
new BigInteger("1553360566073143205541002401"),
new BigInteger("56897193526942024370326972321"),
// A list of strong pseudoprimes to 12 or more bases from
// https://arxiv.org/pdf/1509.00864v1.pdf
new BigInteger("360681321802296925566181"),
new BigInteger("164280218643672633986221"),
new BigInteger("318665857834031151167461"),
new BigInteger("7395010240794120709381"),
new BigInteger("2995741773170734841812261"),
new BigInteger("667636712015520329618581"),
new BigInteger("3317044064679887385961981"),
new BigInteger("3110269097300703345712981"),
new BigInteger("552727880697763694556181"),
new BigInteger("3404730287403079539471001"),
// Richarg G.E. Pinch, "Some primality testing algorithms"
// Some composites that passed Maple V's primality test.
new BigInteger("10710604680091"),
new BigInteger("4498414682539051"),
new BigInteger("6830509209595831"),
// Composites that passed the primality test of Mathematica 2.0
new BigInteger("38200901201"),
new BigInteger("6646915915638769"),
// Composites that passed Axioms primality tests
new BigInteger("168790877523676911809192454171451"),
new BigInteger("68528663395046912244223605902738356719751082784386681071"),
// A composite q that was acceptied by Gnu Crypto. p = 2*q + 1 is prime and could have been
// used to break the SRP with that library.
// http://www.iacr.org/archive/pkc2005/33860010/33860010.pdf
new BigInteger(
"2338274894573145273314679073561004052325493799717332496500873981"
+ "9154269566267911565762670147721173495706686483597956042863296855"
+ "8985491020031718032728786934761830612407539788738389834804112831"
+ "0484933712924414264511799715503596253054638290097305254378560604"
+ "3457282155730383806702845548017315217454390994052035233808454053"
+ "2209678251"),
// I. Damgard, P. Landrock, and C. Pomerance. "Average case error estimates for the strong
// probable prime test." Math. of Comp. v.61 (203), pp. 177-194.
//
// This paper gives bounds for the number of bases necessary to distinguish composites from
// primes assuming that the tested integer has been chosen at random.
//
// The result is sometimes misinterpreted and used for pseudo primality tests. There the
// assumption of the paper may not be valid, especially if the integer to test has been
// chosen by a potentially malicious party. The following pseudoprimes are 1024 to 1280 bits
// long, pass the MR test for about 1/4 of all bases. They may expose pseudo primality tests
// that misinterpret the paper above.
new BigInteger(
"1730626114143993906582329178627391355248485443639984363030847275"
+ "1308542667309368405802823431259718338553667079600118481458180717"
+ "8685660312964257923307841168376622412972295432300191118906455596"
+ "0636099366430317210651098229261736987868487865820945209431391380"
+ "09108180649097618810676094425505547347369635059151651"),
new BigInteger(
"1360998858923994584770803056737393786894832450662215840614559215"
+ "7078401469699701619693552331616875038702785662417391573713804038"
+ "4334162971247398689854706029275431407028615888533012918610480990"
+ "0223861487963796923928503972465761214360888693859314270808955367"
+ "40913457414488449790876563256100025424908640036566991"),
new BigInteger(
"3166883756083864374213797577792765404121225450334428749136082272"
+ "6277047033553982548405648549530365358167591776542577633638251648"
+ "4708794514891794859629545011811469601460428778510574606216627610"
+ "9305946545256861710197652701722202600572822026157108510694466031"
+ "21873496655525294839125742517721479483987924741221051"),
new BigInteger(
"1867856940026786421328012256561867196437042470176831233408635728"
+ "4012048133274069029642553787088950310027377534718962029124718226"
+ "6051117402306961193255486702389001315623336948708913938663766675"
+ "8226042898352219886123870222547007370332879734207273564946511954"
+ "31833673259400609717994958747847898007198993092012403"),
new BigInteger(
"1796390661263009677994016718416108866609292079197277387452323006"
+ "0275054640418696223480642324316099214952402651731083265854610369"
+ "8224730515713772933976457906751697355710699183284927973990745341"
+ "2311585789546147810071014069499060003398982340466066800822746698"
+ "64309065127941774208780103317444828873858305613764441"),
new BigInteger(
"1971945240855615239359385779848543278459852521629467703761094672"
+ "8118959477624582999696057042356627216821194209090396598966531204"
+ "6718418693934025583647341695134065566474352554207810854787929284"
+ "0150420997586371167811999782663434687606795518115913678131471778"
+ "75984898571603525952885934025286780854976730638309011"),
new BigInteger(
"3150008132483461686934076250569912489352161839369648385736587811"
+ "5997183822673267428826594197361084397177321281419482762875475084"
+ "9549588421903702315436565970387119142993552663715551586581960248"
+ "0385985798377103010348982470471826679560834315129605222126122792"
+ "66245495948831504762364224662571600318327270033084451"),
new BigInteger(
"1708946102366142320715649564941267111465045510329061281476212740"
+ "3257341007679575909346478379354045686824680545379443269343860874"
+ "7656833753674500442989626468892341565281803639470271121897646438"
+ "0297951614184327979794615696929197488480659590917557764806142256"
+ "64177795195470929762281195447906351417368682849843661"),
new BigInteger(
"3440003701993474165051634746793659123122285886429390887874425798"
+ "0539628797086399700050400512078053335053587477375429177907276765"
+ "7299212000552180980839328379536622696237474649639004862671352175"
+ "9289352494669383679530748723706821659664185661303953233767365167"
+ "67872755699135674189217223109386132423577475778316621"),
new BigInteger(
"1384489093437226718803143517408309162781203263729355872818628349"
+ "4469526441585078582037579393159945688413133085030944516305313234"
+ "8118439725196722488178936032989162127096990828542718648126854836"
+ "3215014994571003679167792328172868632219526006267874696849394364"
+ "51238457213158274397103569820623680840515654121967511"),
new BigInteger(
"3164393868232068713466361644489248900506521258778648162638744470"
+ "1911965299134147189251276735683301303659631352068168884603764242"
+ "2058303711027020977731971469313828021385806157441077657252831199"
+ "5151267291454080409585783805054468065763411635886980943812129069"
+ "12979884469786023782783106107762632814558326808787771"),
new BigInteger(
"3429610981008641614862240834440649965306153336087134811684334214"
+ "2781784784880823158748073620472850986640780368357758806487624898"
+ "6627917970721407574366482474956464008840562218539437088991213443"
+ "6865812444686702307687466249240837612849694711488568460832793683"
+ "75653516879275492605255161494494045951397742913942521"),
new BigInteger(
"1452625971469501984029833170297844688666257429198467445330023676"
+ "9656278238192507513913993052034672663086092503841752084104847874"
+ "8173408690100803386628315407260460724324957380860416531476612359"
+ "3906755149555321240901275978836270398698785709389076413509994529"
+ "42901485886289548101644664410043634050840333618736241"),
new BigInteger(
"1038759703926769528247935492263828939187707228977771863002037516"
+ "6447956205097712397228992931571755867770661683705025240420111189"
+ "2868394359927108413461144788316226799790655169187714036057483534"
+ "1379449940364129845302840193911613461736295410032863048528135257"
+ "04436628490382188950208123780350213139500089456366841"),
new BigInteger(
"2092626848347087607813788288260128832160456227715887480495928337"
+ "8143090879636401536763351823849725734769339835456348322174433133"
+ "2528919261931329808331753456631473557050588173643619875493912344"
+ "2621229276297788264420214803881217267094948976676445054939538411"
+ "22580436721054077839958796624587867034849970594728503"),
new BigInteger(
"2599619740922490310102276030628575944314398371981276430688469612"
+ "6677200542107317525516057185980658562393307608335402672015071146"
+ "4375869967746325500371685760342898099183114419807958654613613854"
+ "3992594086574371567802232690430810966098771990068625112489903295"
+ "89067604336669355585402887916288037943709029191674911"),
new BigInteger(
"1484944124031033226177904474729672080414277081288126930486713099"
+ "2951571588154552341076434413035940622712601649739964234772603407"
+ "4857469854866669198948655053082186111410005989963123962723450119"
+ "6642285521712848015932226566546835102733706632115364632204156914"
+ "64644614536183219912321808854090915103775109695786903"),
new BigInteger(
"1989518237873611249304118136102198299910749751063921465712157675"
+ "0160983808717982713586255483659294934004326549705203383719900307"
+ "1263871954417468537542759843054899935687365194283002403584007149"
+ "4878371117610681917576307737065411378178051858121032451282900716"
+ "73542006653340382017735899123084476453857081318545991"),
new BigInteger(
"1001516549472529960430483041632117547467775871427023066924341669"
+ "8403875533009883195522874469432253701609651260735835128759135299"
+ "5655554893223580483857764100115214746205606713424344869011314868"
+ "3107942731565140938612794494135227597999675233998980692687287393"
+ "67463341929936509718884001903262839905032784262429503"),
new BigInteger(
"9523120659259647017050060990584944204556454726505878376759616021"
+ "0162649328723702952067039028722189901551617226203049071432575686"
+ "9121080710327716161595367835528315683397536615084723082551568364"
+ "5739952184995573677453019127607472426963971562388390300785220049"
+ "6655144350028488056721467755918814393298596327869403"),
new BigInteger(
"1132692896131390459872218381686704761578367301590229517271338668"
+ "7180351798454882497438382954425835621126393661367213143371283272"
+ "0317909560575328664237540188143415517690966913820407105917871661"
+ "6365405171372246705778112163771743546945868623307467307997875571"
+ "40869529264839386342569691698111927128704157615097153"),
new BigInteger(
"1468478445343635885853097900396288249751127795088868633754583040"
+ "9902362001013473990040942210829761549194134324343879441927807081"
+ "4832779046634885071582835688508933384516245429006116427382617949"
+ "0797131644177507421862332328509904031871287120929769029086074503"
+ "38866991708762791875618755240139448209180903665732503"),
new BigInteger(
"3584128102219288461651881096063603237206550481422480899564693370"
+ "6989198816192527918220789937223699304075118319904981106473056074"
+ "6022073963857677172123650694187762839204698560127083582857191356"
+ "7619601857134928125369766912580367127840531257344393938629885107"
+ "16841734490107828355376447675347185589367615046902903"),
new BigInteger(
"1364132540730201251194341844655148002850736352953819312409033451"
+ "0581806956034928961765696532883678319811153534823893271895441595"
+ "1560405730847235775035340408484490592989244418679611824558459897"
+ "3970103405588145228028549820125837425523682281669049087481368021"
+ "33702260393866732616878693744975284760231993354960641"),
new BigInteger(
"1201213090774136737579735845388953400530787071160074364126728551"
+ "5147303301856817241515212573079940841340044269783294804816431383"
+ "8284868252529547559069691488487393115675459439240223181642866729"
+ "3429931964973711015111163544551414299071832349845971998375812575"
+ "43510797169400923829329952407436122292964382266031253"),
new BigInteger(
"2749611624987217008377958765718501619519235049877079452181305657"
+ "4724564026272242180811435338643866876903591496649439319889570905"
+ "0358277453956447636555409300854018401232502616530331143658908539"
+ "1682266093367017969369633046927346949982338985082398103545735993"
+ "26268702707614772584950389057955691219494031838859791"),
new BigInteger(
"2472982114742145360236684931488791833991329788857529670921519821"
+ "2275589064185672494327017904494686810840150314271250166999768972"
+ "5488277075239138647902134463451436706674384070937644414378922408"
+ "3974240802538174272534726968041801996779685771019246098603577098"
+ "48139330190576017582503777009836399771498662905893541"),
new BigInteger(
"1865347188865809981733701115448160790425846704558108501171803277"
+ "4616363375301457541345495992357828826645510919897778446537615423"
+ "0882378024111971510810465276396395657415178370245114122816237302"
+ "3283933030997110906700611097744954222271394790237582780817507949"
+ "50528224900273599212004329531461848157373189908642761"),
new BigInteger(
"2852220663043188088074403487569592065121097371561337653207919689"
+ "5806125544163953214258963319594971029379263400735515369955250013"
+ "4028759770788754166339078427645792536001991144766729628117371050"
+ "3065276544543379585207323093069812639902415298676791716773723086"
+ "01834079961869281917489638496882679996929360595283091"),
new BigInteger(
"1812266945737014247808099956042081894034544124660090203840602123"
+ "8933795306490611245152382127750687774085253618514158494675518742"
+ "0904863344271961110077635791220319963938065397633608138595169161"
+ "4365952732191284608496816156732317034130054052863296504407952482"
+ "70402413500178325587999299003705988651612697260381081"),
new BigInteger(
"3461478020849089881636057301867459968070516872602987322072552610"
+ "6122696717667098851127207650635960731479969936151065921604956606"
+ "9966154794154897232197433347544538725616640069913605417680979153"
+ "7941663920296351630552463916932109774095427601318332413237900565"
+ "33380330505490643091283956267491266793755039018149751"),
new BigInteger(
"2919979800970068658905539811038971051531482233418344434620488229"
+ "7069955478191515351496193695554391114007400265274653645749899336"
+ "1682279972987736655018586409178146143048864596533190807270958265"
+ "8386345811616055097769189859096393752934393213978617302764485594"
+ "27971296399182413971389773786687947710326691137231821"),
new BigInteger(
"4145154657949019520090421067892641813006171355169512965016842717"
+ "9656056083456770700476740539321891137934371895885040718614132068"
+ "7659642286859932894319946334724710913927915623235424403674960713"
+ "3015105499354740364264523832014989327244648027567866644179973588"
+ "6851400410006028767095438327490143741004842299878541824964849824"
+ "9350463409537126165182086675091928210325509674933575383432172361"
+ "1"),
new BigInteger(
"7263570684005586918409651676342477962666063384721447164820162267"
+ "3637900031379949446961412145104626127789865770334124795558653625"
+ "0265693033953361779942717984970881106667840356057452866357943677"
+ "0299187611159071848712668510417692823114550446719084221850233353"
+ "5448622581084864206413295247972240845959033925761759264503271102"
+ "8711358281311325650083539770515252900036932499310037595977096965"
+ "3"),
new BigInteger(
"3266663369261434628530741133725226939380890029427130078147736465"
+ "2996576096098663002890375510448427552966457154556853852292297530"
+ "3748877081504218804805934729044054195328441392083622877088337833"
+ "3839361634881282676119589334709165541036798092721269225600972531"
+ "5718770210834831734568895865334347621480511738343920340920819445"
+ "8602267925535790135884214787193459118783550610652631217006506945"
+ "3"),
new BigInteger(
"2714275054823322283846947242758076394288969833351667671546539844"
+ "8651643040817257191932781992745878593029648459331742640462067216"
+ "1697889841582474665251728415469605782526629276939159099241968231"
+ "4563946417035619325266947257091436696492494177352417584114484475"
+ "6610785746958696759938071286674788996869751533043564234638049802"
+ "5949514917474176492949501669603402532532836245346872590582496734"
+ "1"),
new BigInteger(
"9266983839147571189339684823228253420616685503762301572754412275"
+ "1127843293258964600702452397526178329259267484695086911638972315"
+ "4961995491900251718105624646921122900256992784437600453557273835"
+ "3861591882136393291951512396743267427648075154617935904316277726"
+ "4493865072538820667287351636308197262473273185496543102226470825"
+ "6662877019047683511136380480413028925833068997034750517865449915"
+ "3"),
new BigInteger(
"6943685859962113005380005918916483733270787990846044283782171250"
+ "1096851232736318325302320935157976786131666696364333532268184395"
+ "8665950723719162662956110077840013184726020313880442980629145593"
+ "2383952066228056762115442513166346145910224582828425403465971492"
+ "7260150227126350939033438077449255619231502836209591891037493966"
+ "9366963730251619187615962926310287121840421140621429191345783703"
+ "1"),
new BigInteger(
"8697498751458522624235585703214358189002281420472600166267178848"
+ "9809876665869248037334395420081653868096056103537493131465377226"
+ "0261527380426559408040456405219848362023445401145511114936506394"
+ "6240472545398288332411818055040869427951279027405975059749360297"
+ "5868667379863439430711990295232153128900808256212596912819669440"
+ "8461633147852596585348243485566178333170181585431955731179108942"
+ "1"),
new BigInteger(
"4252141813347264797276096871298065242070358505647997888003056375"
+ "0053145248543520793105289129514510723624029989029530989695904117"
+ "1040883775014117200916554841688641022136017868157290925811239787"
+ "3664014299809018676076741787758620956387796785085878200748397774"
+ "1000982778291877557074489243525397961477916369196578483491169386"
+ "2005017885694815977695115290403992818456642027646266206320076800"
+ "3"),
new BigInteger(
"3356647398302910967427184201762737607743709740247537918189248572"
+ "1755339542838026890625250818518527348898974773340867800840791470"
+ "3182072707032492007084043715576322632015800128489921814932124611"
+ "2300036417841991332124497348096579076242448857352000771247540736"
+ "1254949324799638105796121388483225300620211599611028678202393567"
+ "8095635541751658983704832859578366318530922805928053806070359946"
+ "1"),
new BigInteger(
"3687125575229624930459923973437509789116885700012081850445193578"
+ "4486423768425089350932846437401841871613673810991112360643320652"
+ "0225782089986669258803208183278659152741552450801685341843048568"
+ "1125008729650000322084879372381541270180139663134377177885154388"
+ "9558281508372272794193460069397070875763691455289959733530070186"
+ "0360525342531389354962332229432027179470095997955180502375530175"
+ "3"),
new BigInteger(
"6088560764944279853795552546797623009536823218028533977947580608"
+ "2015023514992395624319060987001625566234648211868300524182306472"
+ "7026872385780533326083682960047644674758988927136149502626557718"
+ "2561494515318563339483672950711193945073071458843901227339418284"
+ "3084182493461642555372639047162641075337152622892862251731700231"
+ "6672547426448574167370804559242233207791080547486632014153528258"
+ "1"),
new BigInteger(
"6081766267938901970682791123502557184373300073506187731779846380"
+ "4083193288475152882563422230130613717216469536080649276981712202"
+ "8895707724700107471391574673087393411637415445150131834443587280"
+ "4243131225731630921851260690656608624225797294197741881140769183"
+ "0474230365914155543155728342161658185646742117306992051014301383"
+ "8040790841165308968256142923362988225719340573836171022480960175"
+ "3"),
new BigInteger(
"5000879164859908887599881582814678322611278734193303790540199067"
+ "6946804876309491380295619810590406766227048051997595053442615914"
+ "2677702465219525342790323338314172797422380779526016709102650201"
+ "6058553529785304239405043134061167377896985489252957729348463979"
+ "6066933483020351454994081895283883114206539208013308687170796286"
+ "8268752695525736731805658439398227370325903928664994918343915975"
+ "3"),
new BigInteger(
"5033660524073962747735388920230339629907033897027296197974576730"
+ "5654422857706257645566447425553553516325935964234373316093019314"
+ "9125347663842235853602126989737378697014753612431648011618832921"
+ "3881347704723060451053853932258315572365588301231482715348124261"
+ "9244292433503547002496906691530720882968955274299548904791181715"
+ "4190217453383503386985567684902027707247767653326442247588135031"
+ "1"),
new BigInteger(
"7656692474335471169217545128846872228367812415627865759181393395"
+ "8241618825828371173259648247363305034462523584509943049089351382"
+ "5433879053475325827330864407124355159557574919864955631956757119"
+ "9044097578241324151657090338112756973390540016908863938814598847"
+ "5396824620980380695503598397306050849284639259137342875066075738"
+ "4060141031090753207116787791385102134328808638802350088507846845"
+ "1"),
new BigInteger(
"6916552449605114038869281931877716049700938960849845402874660241"
+ "3416574115770967736955518993475194932835724065347138687353620520"
+ "8331524408574865319265572656228099650675609929009824224767253657"
+ "5459382651810818256784829505942965567114371502731619372511210627"
+ "1610362520274480185346478545007812850057950851029848830710521787"
+ "8356932374617076535457900683468313279449103472700012568700849319"
+ "1"),
// F. Arnault, "Rabin-Miller primality test: composite numbers which pass it", Math. comp.
// v.64, n.209, p 355-361.
//
// A strong pseudoprime for the first 46 primes
new BigInteger(
"8038374574536394912570796143419421081388376882875581458374889175"
+ "2229742737653336521865023361639600454579150420236032087665699667"
+ "6098728404396540823292873879185086916685732826776177102938969773"
+ "9470167082304286871099974399765441448453411558724506334092790222"
+ "7529622941498423068816854043264575340183297861112989606448452161"
+ "91652872597534901"),
// Richard G.E. Pinch, Absolute quadratic pseudorprimes
// http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.210.6783&rep=rep1&type=pdf
// Lucas-Charmichael-(-) numbers
new BigInteger("28295303263921"),
new BigInteger("443372888629441"),
new BigInteger("582920080863121"),
new BigInteger("894221105778001"),
new BigInteger("2013745337604001"),
// Lucas-Charmichael-(+) numbers
new BigInteger("6479"),
new BigInteger("84419"),
new BigInteger("1930499"),
new BigInteger("7110179"),
new BigInteger("15857855"),
new BigInteger("63278892599"),
new BigInteger("79397009999"),
};
/**
* Tests BigInteger.isProbablePrime with a list of composite integers. The integers have been
* chosen to check for weak pseudoprimality tests. E.g., they are counterexamples to weak
* implementations. The implementation in jdk uses a combination of a Miller-Rabin test and a
* Lucas test. This is similar to the Baillie-PSW test
* https://en.wikipedia.org/wiki/Baillie%E2%80%93PSW_primality_test
*/
public void testIsProbablePrime() throws Exception {
// The probability that a non-prime passes should be at most 1-2^{-certainty}.
int certainty = 80;
for (BigInteger n : NONPRIMES) {
if (n.isProbablePrime(certainty)) {
fail("Composite number " + n.toString() + " passed as probable prime test");
}
}
}
}