<PackageReference Include="BouncyCastle.Cryptography" Version="2.5.1" />

Gost3411_2012Digest

public abstract class Gost3411_2012Digest : IDigest, IMemoable
using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Crypto.Digests { public abstract class Gost3411_2012Digest : IDigest, IMemoable { private readonly byte[] IV = new byte[64]; private readonly byte[] N = new byte[64]; private readonly byte[] Sigma = new byte[64]; private readonly byte[] Ki = new byte[64]; private readonly byte[] m = new byte[64]; private readonly byte[] h = new byte[64]; private readonly byte[] tmp = new byte[64]; private readonly byte[] block = new byte[64]; private int bOff = 64; private static readonly byte[][] C = new byte[12][] { new byte[64] { 177, 8, 91, 218, 30, 202, 218, 233, 235, 203, 47, 129, 192, 101, 124, 31, 47, 106, 118, 67, 46, 69, 208, 22, 113, 78, 184, 141, 117, 133, 196, 252, 75, 124, 224, 145, 146, 103, 105, 1, 162, 66, 42, 8, 164, 96, 211, 21, 5, 118, 116, 54, 204, 116, 77, 35, 221, 128, 101, 89, 242, 166, 69, 7 }, new byte[64] { 111, 163, 181, 138, 169, 157, 47, 26, 79, 227, 157, 70, 15, 112, 181, 215, 243, 254, 234, 114, 10, 35, 43, 152, 97, 213, 94, 15, 22, 181, 1, 49, 154, 181, 23, 107, 18, 214, 153, 88, 92, 181, 97, 194, 219, 10, 167, 202, 85, 221, 162, 27, 215, 203, 205, 86, 230, 121, 4, 112, 33, 177, 155, 183 }, new byte[64] { 245, 116, 220, 172, 43, 206, 47, 199, 10, 57, 252, 40, 106, 61, 132, 53, 6, 241, 94, 95, 82, 156, 31, 139, 242, 234, 117, 20, 177, 41, 123, 123, 211, 226, 15, 228, 144, 53, 158, 177, 193, 201, 58, 55, 96, 98, 219, 9, 194, 182, 244, 67, 134, 122, 219, 49, 153, 30, 150, 245, 10, 186, 10, 178 }, new byte[64] { 239, 31, 223, 179, 232, 21, 102, 210, 249, 72, 225, 160, 93, 113, 228, 221, 72, 142, 133, 126, 51, 92, 60, 125, 157, 114, 28, 173, 104, 94, 53, 63, 169, 215, 44, 130, 237, 3, 214, 117, 216, 183, 19, 51, 147, 82, 3, 190, 52, 83, 234, 161, 147, 232, 55, 241, 34, 12, 190, 188, 132, 227, 209, 46 }, new byte[64] { 75, 234, 107, 172, 173, 71, 71, 153, 154, 63, 65, 12, 108, 169, 35, 99, 127, 21, 28, 31, 22, 134, 16, 74, 53, 158, 53, 215, 128, 15, byte.MaxValue, 189, 191, 205, 23, 71, 37, 58, 245, 163, 223, byte.MaxValue, 0, 183, 35, 39, 26, 22, 122, 86, 162, 126, 169, 234, 99, 245, 96, 23, 88, 253, 124, 108, 254, 87 }, new byte[64] { 174, 79, 174, 174, 29, 58, 211, 217, 111, 164, 195, 59, 122, 48, 57, 192, 45, 102, 196, 249, 81, 66, 164, 108, 24, 127, 154, 180, 154, 240, 142, 198, 207, 250, 166, 183, 28, 154, 183, 180, 10, 242, 31, 102, 194, 190, 198, 182, 191, 113, 197, 114, 54, 144, 79, 53, 250, 104, 64, 122, 70, 100, 125, 110 }, new byte[64] { 244, 199, 14, 22, 238, 170, 197, 236, 81, 172, 134, 254, 191, 36, 9, 84, 57, 158, 198, 199, 230, 191, 135, 201, 211, 71, 62, 51, 25, 122, 147, 201, 9, 146, 171, 197, 45, 130, 44, 55, 6, 71, 105, 131, 40, 74, 5, 4, 53, 23, 69, 76, 162, 60, 74, 243, 136, 134, 86, 77, 58, 20, 212, 147 }, new byte[64] { 155, 31, 91, 66, 77, 147, 201, 167, 3, 231, 170, 2, 12, 110, 65, 65, 78, 183, 248, 113, 156, 54, 222, 30, 137, 180, 68, 59, 77, 219, 196, 154, 244, 137, 43, 203, 146, 155, 6, 144, 105, 209, 141, 43, 209, 165, 196, 47, 54, 172, 194, 53, 89, 81, 168, 217, 164, 127, 13, 212, 191, 2, 231, 30 }, new byte[64] { 55, 143, 90, 84, 22, 49, 34, 155, 148, 76, 154, 216, 236, 22, 95, 222, 58, 125, 58, 27, 37, 137, 66, 36, 60, 217, 85, 183, 224, 13, 9, 132, 128, 10, 68, 11, 219, 178, 206, 177, 123, 43, 138, 154, 166, 7, 156, 84, 14, 56, 220, 146, 203, 31, 42, 96, 114, 97, 68, 81, 131, 35, 90, 219 }, new byte[64] { 171, 190, 222, 166, 128, 5, 111, 82, 56, 42, 229, 72, 178, 228, 243, 243, 137, 65, 231, 28, byte.MaxValue, 138, 120, 219, 31, byte.MaxValue, 225, 138, 27, 51, 97, 3, 159, 231, 103, 2, 175, 105, 51, 75, 122, 30, 108, 48, 59, 118, 82, 244, 54, 152, 250, 209, 21, 59, 182, 195, 116, 180, 199, 251, 152, 69, 156, 237 }, new byte[64] { 123, 205, 158, 208, 239, 200, 137, 251, 48, 2, 198, 205, 99, 90, 254, 148, 216, 250, 107, 187, 235, 171, 7, 97, 32, 1, 128, 33, 20, 132, 102, 121, 138, 29, 113, 239, 234, 72, 185, 202, 239, 186, 205, 29, 125, 71, 110, 152, 222, 162, 89, 74, 192, 111, 216, 93, 107, 202, 164, 205, 129, 243, 45, 27 }, new byte[64] { 55, 142, 231, 103, 241, 22, 49, 186, 210, 19, 128, 176, 4, 73, 177, 122, 205, 164, 60, 50, 188, 223, 29, 119, 248, 32, 18, 212, 48, 33, 159, 155, 93, 128, 239, 157, 24, 145, 204, 134, 231, 29, 164, 170, 136, 225, 40, 82, 250, 244, 23, 213, 217, 178, 27, 153, 72, 188, 146, 74, 241, 27, 215, 32 } }; private static readonly byte[] Zero = new byte[64]; private static readonly ulong[][] T = new ulong[8][] { new ulong[256] { 16643191358083899344, 2703135593145367062, 14432313314890392744, 6577092334268629354, 806964168861892974, 12383271304659295334, 17732807706536339062, 17716047611503416651, 5215999108449717233, 18400690592850740677, 14664421492831770517, 7409386412115095689, 3849627103271945136, 8988319201874450849, 3938119337751376013, 11436513915861524438, 10023317675342802487, 11299449278894865675, 13550338097771745114, 16515794415152327917, 14898690228356210642, 17039395261956034398, 13352261127337576221, 10097173395646645421, 8519831221648263471, 6380786457702773335, 4606327678483665726, 1135139788101916873, 17150000018454982019, 1220450159802546598, 6759235690777098768, 5340123591806085420, 6034809048673841977, 13039342382114553097, 6896344311240562893, 16756255438728353529, 9184934662348565148, 14262951085445095100, 11989701146933847666, 3364644269219363704, 989048157634869780, 9390583993925520772, 3387584785362250392, 6665082552186727408, 8806730920978768603, 9502751530347994212, 14947525897166917170, 9613964225661560606, 13062563757722791145, 13330165100546479869, 2007762480278943944, 7071029175581714734, 18201297078263772920, 11348284945966902507, 5517131305049330262, 2524355749569298796, 3276936053954857029, 17613168268544492715, 13672639287818444474, 4227838725751020409, 17337927304403721484, 2880731531503622347, 9899166798150700266, 1904883134495025448, 10431738646323369727, 4850405589464713887, 17844694253179975574, 2081972218582700626, 1379356218675464859, 11936901258434843983, 3166351970529817407, 15521334050161542599, 12092580492986202002, 15771347623125549011, 9700811178911405091, 4095269026725968292, 7284836791436182452, 178206167350026973, 9859056374997736714, 10596801556360226242, 5686309239594266763, 3626867272058218794, 4695292606739097666, 12861765287137887859, 7805587275216445447, 6553870956925915274, 2247080073069027695, 14085863101410174406, 4136504802722867268, 2992705483290644962, 4655464135170259362, 16805373066242361113, 867873424238963700, 6139766898342725699, 5048711494641582808, 2360957084007330385, 7917754814463914471, 11594761360985693448, 8900603062938514235, 4819584321579539327, 15611174550416907534, 14284208185211612545, 2409792751347803057, 7449496838093054313, 2608138101170875382, 15357211532675213082, 6775169570724432173, 2898833334747545602, 10370594140041967504, 1717647244194337596, 16173369581285336234, 8669102231478190086, 7938185699155198682, 9733039751760463299, 3969222566346957165, 12457959604312733436, 9134972545477524348, 13884760396816717563, 18002934140551462591, 8321595681021526376, 3740161260836255946, 12223660219698249403, 16465551444743798029, 10257300151532365424, 5892660270079857124, 2502541675832561804, 15642277772978588910, 3575476887658224151, 15246058200794700896, 669897467106812851, 11238190422791214993, 14752624989210410255, 3809516679850545744, 5718256960103440747, 16113790886966425492, 2758712437335984427, 13819266239833930855, 15989664336639546697, 4334551115747581955, 10481700764928886559, 7539375937215052192, 13153907711413100500, 1449546416188301313, 10970082038091293868, 7253733569142936148, 14035900984807568422, 4494160142329627358, 5797380680492875780, 5033684639528710629, 6942380200648117235, 18135530224823884898, 11626709078934113512, 5452010138718157004, 646676091767009875, 13907700920084023067, 11458327989329825334, 471514214048988026, 17134674851811450558, 8614828720478738639, 3471190102295415799, 10201460180741018957, 17898929444480167775, 16929928319467713572, 12279266611417189766, 11065079529797350732, 0, 17378882219737664748, 8143953700710785973, 12621352907304863169, 10952011996134456421, 1847633384726895125, 10773808170632978104, 15876370350422262953, 10679936021821443928, 9235497396103343961, 14142057341829074780, 18022518333658336642, 17502585284089954257, 7698943044753169277, 5558086220651709366, 273485755470967613, 16009504095842346612, 3045458228384031455, 8041346034719003450, 15324982954333320954, 13489933794196071872, 10831118253720235397, 16952024345057011140, 378507382706538567, 11825014717556671663, 16409080926193522583, 9338657737701047993, 12581524441769923617, 17534533004330692145, 7175315966437357774, 5161723385538695992, 11755314076501405237, 8789995975362646502, 122301190315135456, 1339527752872090491, 8500289773969701394, 15811458049371942451, 2206125151973814415, 5912507865751560921, 16287906185945826935, 18369869324697130021, 14569423993732859509, 7055674186596964883, 16666412735158177328, 3226973935617776037, 1613642550683796188, 12110648323039866715, 2113919936262685618, 13204150689214484020, 15014857054700793693, 18241125550101047064, 6290905146667117214, 520631834711206554, 6090649271097153955, 6268809121346255742, 13723986651981426055, 9011259725410191425, 4260067298331642521, 7571604515825379392, 12488780875022903068, 12805342026244830542, 4929679943725850629, 1562558313115120097, 8378270681804975090, 6431029428379739063, 17272301201645698147, 7740178818457750173, 4437711457076851171, 11714359155137757141, 1735746844117158901, 1251271430781151302, 13440816173802288160, 15127024593679826621, 12684167292580488366, 9572728449396225790, 8122139634094273109, 1040986648309745961, 356411355647007143, 756721191328944270, 5318878451677075985, 9992214447015657431, 14774439056095358191, 14554332407323555144, 10573861039948903458, 14378080326902922337, 16267522719607272778, 15142897865499331968, 11116171328892012145, 12955918427198494611, 8272760012479254664, 15480098276725396519 }, new ulong[256] { 14416488623970932190, 7346976492199675417, 17820627941079412291, 9627885164147495734, 6533467991705271684, 17998565102924987645, 11682290849618289423, 14822454089690596717, 9241203884170920837, 12861281897341358396, 11016838668432197665, 13790417110750001176, 1151735774811599048, 12294974454994705048, 6942284815962019498, 17743186425950817333, 3304311495801540674, 13615607175011632002, 7559468737934159677, 12086978407351415740, 2957424603572281991, 13249085212744581519, 15637041785948145051, 15490736964426020179, 15379540838187847369, 16875309257069950292, 8085181091649676441, 14854792058562395895, 18236790505793211960, 7642183762405766865, 6618156441656008690, 14625287379506105394, 12725675947919526096, 6768646983239759067, 1229560361235927109, 2545497942825370364, 14198931498357636346, 8332055718082846467, 9018811952317763005, 4566156016530439069, 9578872965805076800, 4447555131281990257, 1889868047608435272, 9132310989383824935, 8423405394594584156, 1791576812070341540, 895921998879640402, 14310611323784447840, 8686043850126826766, 18187216356076809294, 3505479608743889749, 3164974344323824491, 15983355795994687326, 11065428791749044823, 1491256427646959862, 13524521346665040605, 5832729293860314623, 16778152971070057656, 5588041959860897512, 13969351553252232767, 8960651507453538251, 3404044757246527918, 7427396029290209269, 1567782000193888896, 2125332809319160599, 15750446333599546881, 9762612037615848154, 14665011075415780932, 405965478745608371, 1334608620921465823, 10283812314525356347, 6009835698019100261, 6362838478626120808, 15531164210339026725, 12192858250690617602, 10021977722754318728, 15045784853695487610, 5388605995385671607, 4789436484882904608, 8273825248612433269, 6807803589745610561, 17643602969366402521, 10402470611175420342, 9487505662496421919, 13884311246691511369, 11599311963427125987, 11828896870259984422, 12530171073360712647, 12569865343065303133, 14159137227003829900, 13058444037354018915, 447961557886364457, 11640371804876806293, 7989344413684106260, 7745519667033183399, 15284366481134480575, 16558308431455503772, 11775845520284565881, 5873227033075236745, 18442457284438988756, 11331596615082596498, 2021362311995275617, 17399916748381652330, 11098401108231983565, 4652678544566382540, 1850721214614677970, 3779734978877634960, 16220639879209580377, 13354894618632655665, 10461614931578557376, 1609153642657618202, 4480481336861891051, 9972894948967769086, 10111053643493542103, 4986581067319345023, 209097870346312172, 16170362179490862383, 13999482202363688357, 7798271984477724152, 7243570012128126063, 15113725370733198348, 12902693100934476618, 9428713116562070121, 11255071236346149604, 18037622684799010663, 11445008741517796104, 13269290432258683207, 11202301361362088891, 14405433630425769238, 1180970181547717171, 5176105366933055123, 7188535108749356336, 3071419591516346653, 8871593212975408788, 7377047836268559747, 745784333737205883, 523712867556149599, 3218003841565405748, 2276692251301888763, 4042724623974101698, 6062869490421444410, 1668368207247227756, 18339543398465779106, 2916365256580759793, 17701763194650376111, 9835873103984114194, 6147487227497352524, 16084205907180383922, 347243151226876613, 6999741710823961820, 2806071973676585551, 9658008234483460268, 17263250852726433255, 3821216675772636134, 16657742647079378032, 15229027975163028960, 16016335965578415300, 10572801009443498074, 17296932700355831580, 13696158890081409646, 17554522822051683462, 5286400504730760237, 7609746906341231947, 15898737839338493224, 944934528471361828, 0, 6430778939292435998, 3336736409998420952, 7875361642996334478, 16600215533801848326, 8821948844834997474, 12436686564748095921, 706136312374746081, 9940546931731077220, 8606606803205598662, 6252543065422558934, 258180561991695258, 3932361041049477244, 2228031909561065613, 3591083712976693539, 8046871333151188578, 4829160237163942998, 12381352628294170862, 12610854471631768107, 4380598834454315015, 10649256363573758508, 14068055968846895059, 5548248045526197406, 12819864006535506598, 4026619618737144330, 8789027980293848952, 5914590821894013971, 5201360692628199003, 1438508405363181993, 1047132165489660606, 5627682402975382898, 14753809747772696347, 1966322907280535614, 2694302999865518549, 2361664381868374374, 13457635568901744811, 17504877959453114096, 9317025438026129907, 10808279102775697669, 6673472819996841645, 10887564197671041257, 13657089091486917108, 4917937056650714377, 17110791576323341323, 8472979738121466922, 12991487546715896341, 10838903498911111839, 17212902440124499857, 3621785006072287929, 12125479410148983668, 17921053425751121547, 2600818822502173603, 18095853622957810961, 5457179844010077633, 104674322205155958, 2459119713154539658, 10359563843775427405, 16481219104186197994, 8162692825194907375, 2847061296053530681, 17007385453270867581, 2429042753721621264, 15845690715266440311, 11504223637356675454, 14939902389728255105, 15596543964592056301, 4291817720210491736, 4250406047929019182, 16835609371473809102, 6848231166907919671, 5722504929196957444, 13163410864325338105, 10169775613993200289, 14511240905997678504, 16428453455105502901, 804576823300162061, 16952328422295033634, 10704308825032065907, 9209752147493311569, 11915204881515227728, 630314289831180695, 5090994841956713701, 15144339993900648342, 6320413364043601056, 4136912626218684596, 3688671278293774543, 16325117494106688707, 7111516025665441606, 12019670279683559882, 4747430357904739770, 8503693248481660848 }, new ulong[256] { 5022191610516858060, 12645839371960098056, 325196729119310435, 10544111738277527250, 17171723943877278631, 1619663718359036237, 18091587880400184708, 5335828035754758151, 11379178129143138841, 14648217640238887722, 13086832364598786016, 15914535959731104950, 1287844858498292800, 16375051820953423571, 11583759697334954435, 550964732710513933, 8585995564513096669, 15686472308550713348, 13325075562694951572, 17630740042449523023, 8916962000159598712, 14192583705586485217, 8560921352511315212, 7426955371667046732, 7096434795747339774, 2543027200294554449, 10419956338547081069, 5721517685081291957, 1937338776563641064, 13736071204485071176, 17106932809158825161, 4899378514713126672, 14773093419524387062, 16698373717390806192, 3710095511616993728, 7340570904524980467, 5918098101825092432, 10804520625326298079, 9730090089577636081, 4697601972911171247, 10480451310123618748, 5151346661287437683, 3331340938598661669, 9395203941325327427, 11242079635202581704, 2915854855682031097, 1492126639482712306, 6290138385502410722, 9851336768255988794, 1856873279258002822, 5831708560246045423, 9075623880903535524, 8815370023405405865, 13167394464051894414, 4378109956818586891, 15006898764834764563, 17307241128934970156, 2668061343609997453, 15557224681013713438, 6825682518352077045, 9524557205897875359, 8172884461239939073, 12192217863250075348, 4603827798664618597, 2867088101655710002, 8332998285759836606, 10671362497273609486, 4672530790940461182, 1134559637999613131, 3897488771451098482, 10309743511802411319, 17673793229178945438, 16718005676701005947, 7221495326637043234, 16597347416266760801, 9272158342823316988, 7909827430729881909, 16002662719275707657, 14283453708927338078, 10869263363796925617, 16345475348111384578, 137665338910158545, 12515539920715504823, 10988984776972674731, 6746265954835287963, 18257106040948926040, 17421816711713963517, 16919288509122574788, 17268808778493482358, 5838760703968564286, 14031617523076498493, 780392312595241081, 18336540041995274550, 12842206973407828717, 13656722531824102950, 7015947325939974800, 3645098545556231953, 17884924832500353770, 17512690432282197058, 2066784160966486324, 13412572121352667947, 2661572689932379740, 1033530071105264154, 12957343035395093564, 13868125990049039746, 3121291101747188375, 6662680657495023946, 4471231211228269748, 15424627025727239375, 12580275654379647961, 4219404094166535895, 4762278602948970945, 9478790587773903506, 9898893830113671915, 14973264685418819913, 453876631214605276, 4407685011702703066, 6616899736578362439, 13003248198425336113, 12419015558860141158, 7990341289637279323, 14442713494739508292, 11215801851269958085, 13332124370822523973, 1373724075619900927, 13783625232014225305, 15359939653945809825, 12751808085835111250, 6083572248920684684, 3484333688484746926, 14521793786758034069, 11937786166553331057, 9139255992929895626, 10222251748408277128, 12255784141711061434, 2189202321390233739, 716843780901418775, 8359149623152811187, 2415494092048157422, 5243176795453837752, 18210112488466909321, 4154687863979303353, 2272222198031926874, 8690072078618429206, 202427615156584895, 9639695198538801486, 18415623364178962407, 8942462418363155829, 907753262429150117, 11810680268281218733, 7665181140788048952, 10898276329415234144, 3239326427400699802, 6868174095610514980, 3808219771792118989, 7543278091629671815, 9168270020997671451, 12392885120222240619, 968811775037617524, 16140326090467902424, 584245825585813958, 15816256665709806011, 13531648566339513850, 8750568181363911111, 1698743779072106396, 0, 16943798148194031381, 8236472591980224367, 13209882775544247903, 4035151075898375075, 10302693318479402982, 16855667680011982506, 1948891778265760825, 9719098429884157472, 11054545481701918842, 18085100094794517333, 390196158411648178, 6501762612143760022, 2496032298569901440, 6037175610368660865, 12762796728381896067, 14204135840323823920, 16148186350413554109, 17041934512146922008, 4925668384127994397, 12167143351085101061, 6410254435445760809, 15330361267764327792, 14853624750388125592, 6421246412478107128, 10056755301905365844, 17754265602204553456, 15589384456651501269, 3832728561082858012, 1367237356757087022, 15171532294165509804, 5272189459801538409, 3250881896629883211, 8001331881476413578, 6968391399550921793, 15232592138832550013, 809969847888836264, 11442741800557897079, 11677520222457276540, 16472678002634826718, 11836194988174371744, 15751256438176362346, 14766608101443821095, 3078237133952334918, 11467814949005020070, 13951147765685021523, 12061945554227725518, 3445914570843754740, 6242581091097786675, 16533735384072260879, 1539119056502398499, 7794692769390540772, 1168206872894059153, 15939048079214002791, 226938317788999534, 7419906245093191581, 10103172840323946073, 3581420404919564415, 10645700449263505411, 7585766634561542998, 2998877762491110184, 7174951347083690799, 8107322624236560080, 13578204632486592759, 5494625981129708507, 8496251452686250594, 5596216022932782346, 5661024595188978276, 2747447103066187747, 16280780971239378796, 15107926451017931202, 14398026278718810255, 9978235489092097413, 5085786205181774754, 4053661314365738856, 2109836211124176869, 2336412667751326783, 11612775692986304274, 9314648022329008941, 17501136362727821971, 1742301027778505559, 14601226005391810043, 7748764524654516969, 18004566148294681659, 5468987013722291926, 6162091280534394461, 4280460676255686662, 12001449201751239199, 17837288741426265633, 14074668225098984172, 11119279424363751188 }, new ulong[256] { 412778415529865760, 3577342882794069583, 12805512713741006036, 10086389182405830274, 9631348414619490491, 11029226397073373641, 11627792458048644653, 8540370589362648094, 17925746536371200188, 13719614496949379764, 7380585705851070183, 5532990722829248072, 10754888447158766146, 2363770411641709807, 4799219136276863089, 886827555711267723, 14761170299289685203, 10870602893012709289, 14053970170398186163, 15159452414945845267, 152494743391849906, 14797380007077078154, 12067788661428416998, 3618765265895209892, 16730148953297482309, 6638666397703976113, 6746862217775881448, 12434579095834639871, 6325409020385589416, 11881705736862929933, 4058193356686090212, 7086287341885701278, 15674826541200387082, 10483145580681646139, 11728250915792503750, 16457218618247725518, 17804566359647483612, 9778627006082503945, 12613833228843374612, 12973791078126503668, 3891946276334412253, 15267727468379129930, 17962016790450440421, 8437586805018431989, 10621274027794111881, 11432405351048939099, 5716202677831336867, 3243582143937888061, 15866832917474188842, 16875173606078234615, 2399609570378190006, 7345426154655236876, 7619693495944769671, 15822815208912544184, 15130995325890332152, 9371659578628761385, 7194324827586368711, 4309013456660281871, 10250322826443576482, 4166240605864818621, 1366177816882650955, 12337542112347144813, 6217414342487101681, 7783606731388437159, 17120176822620799077, 9037712741102696455, 17012341578268600380, 16118235504218274753, 8304362858347251262, 8707177795482651175, 15023151349731995041, 13385369152941776166, 16304327354866472453, 10358449395342638331, 18075424330969541902, 11764513330537491359, 11174112167783249019, 11138113584220445730, 1945973140213898976, 4200834197375652438, 5435457027409418714, 7756135292223372597, 16717045777202619429, 2508515451320396125, 9523284449426682082, 14317999436018362515, 609168629503044082, 3755788431048666223, 17152592151573603726, 5399380291345002883, 12301351165578275380, 12189559766827372511, 8884253657276313548, 7648167075477099884, 1809525021741863762, 6185017703168619802, 14510683649402109683, 2064551487375270258, 16010179378360767384, 3469367101608228374, 1536322983539794137, 5796100959046534970, 1773386847580617483, 108346540153546841, 9001722862285623390, 2544785687349641476, 17260840743582043607, 551619354788593554, 16565125331131263383, 6486896028513362810, 13119530067680070470, 717443701121057195, 2214371934970162368, 13227357483453784863, 1140410460104840800, 7488913346602372798, 13429536041485875405, 16412374620625092188, 994812197283306450, 10114437580603988240, 2804228341285155620, 260410206251574763, 11468694089796595202, 12153782305157883782, 4835367340339408936, 14935941453496953144, 6348897592219414216, 13580632830920879878, 10447068863337265250, 2250650893928301721, 7511575676904462558, 10993078211198701968, 15566911097060688979, 443413779826989003, 16983149403301320622, 16608725716676480124, 1500526641193339008, 8152292870049500044, 9978535451240877787, 11591943528381025908, 12470629360879408550, 858245894210178073, 10222432276826665289, 13827511182212795117, 15446122921225714282, 8743440194190385790, 1218336215312585465, 1032276353674575417, 14900145093364744545, 18402470457342123822, 10906820163225880560, 5903954706119241571, 3395223664118723215, 5940852870679710344, 12577914836476031053, 4685830293981560218, 12946605235894991206, 9228745979626367643, 11917827469888011348, 17379906352690864407, 9183300283681142197, 4649831692234020291, 9147178532201324012, 15296022985070163928, 17486629686828287228, 0, 6898510060154343770, 1643589765241144626, 12697544478944746637, 1402114711967872786, 13537723148088938644, 9937131744855075632, 4353588900056941981, 14172271166703691041, 5292673456375059560, 14626957485788666648, 15714468687486372321, 9828864528591782761, 3999781539141355908, 11292166047742839785, 15554107579106054707, 12031798801067137471, 11328023846638773168, 6049120102845506257, 7933416458737094421, 4461908978498334148, 6790446112744143107, 3726873057198478333, 7237529453753559893, 3864037041512891446, 7046626506133690741, 304722305440127609, 18266442068824101532, 14208550143986027896, 2934657069911674141, 6076891152586415427, 14663026374551417665, 4953135073593642938, 5569207977274658321, 4501008218251986991, 4608914949056012406, 14017832012144685802, 4989423796032989155, 10719102116777386523, 3207522108247185252, 17522399594662456485, 3108845752482162934, 12838487398799446335, 5256746322603637809, 3359313093287303894, 1679799455245938027, 5680416363222969338, 10585346912750056912, 5089304188877242888, 5125161971465923153, 2663698829192085142, 17343705367582804302, 18366341168314316663, 2840208181611518845, 13688960456037058399, 6456820608799639185, 7891434163331525374, 8401668394735843756, 16166056177409219511, 3072644785963581615, 17657281445989989230, 9479582578768039792, 13876877822288985944, 8268585413250313831, 1254405120516291232, 1909966976157497017, 8848404743649085333, 14353865065657041098, 9670431168224853328, 17768506339595050629, 16838256760641149468, 8116101939860513749, 750401899863958592, 13277331648651621759, 6938439418119057708, 6595232530173053731, 16274235453266392046, 2970426959157404996, 14474746770758882986, 13082049433730969261, 9337082464844055234, 15404157107807690625, 18230462244674452165, 8576420872327912519, 2100417098697099563, 18111263507761251671, 15975038508208797299, 2699828134389257935, 8041674830518265676, 13912883970442876673, 17621370890793685815 }, new ulong[256] { 4535860555263248921, 16852860281346875951, 6140263643322089338, 11478926500824812339, 9378015351203239756, 13327564710645084082, 14720227639147585363, 3976828915743059002, 10848963853955034384, 1674533312481288529, 12560205794591624211, 18251760262641326195, 1971238590622152549, 3457832774275448914, 16150883333172724748, 11794428727689681111, 4727861667757458726, 18086103234836705689, 258683541723454221, 14234423747971299696, 13746687986412618920, 2233564259985426290, 1378062126584976310, 595850907021173971, 1148729542089166137, 7220711707371485274, 4275768676387371534, 3496324401055548880, 5165544922527804988, 17490393461649265994, 8412095690608439521, 14978908882929042526, 16577882496662810390, 8847930418030264104, 3309372870217980335, 12420682712621503982, 15313638727721349947, 4387469920445666276, 15069308889790759724, 7765336488733668707, 7626271911434349726, 11162557623114971940, 14550225336477740868, 15462274553512913606, 14126703745409497984, 4089712366057758979, 2084822880951770767, 15217945823675505361, 15628305894032057615, 12769693467676363153, 8115270375799669254, 5758785072471788271, 17025131558859428408, 6401431119593581502, 2607396063788253068, 149165799264492029, 10429296302893549066, 10743412135794079261, 11655258597668356394, 3161051439931945653, 2862129545546507393, 12732210800733670241, 1786865009825524840, 15183877174701053985, 3531814185980970784, 1489042636343605852, 7953372014297400692, 4127379132466308083, 703148615521134115, 3051392466055327813, 8884721462095101400, 10883429997862481888, 8288941250235652363, 18364623810490598270, 2902931453887900088, 8254758264932555771, 446716860198103834, 6435790520947517774, 13467158152785180239, 14590483660463305801, 9043176952977856194, 5945702658036389520, 5618980515518141202, 10464882797601703162, 15944691810401457432, 4424111993825693972, 13996955283450564762, 15498010045204162614, 15034711375462777308, 2457938976092230806, 17280995377108044085, 1042563110803492809, 14698967823614015161, 1000057432295396548, 298081034413880039, 17972098505603721876, 9182311907627011903, 4237995257073580286, 7360269973856297383, 13151329901121790075, 12073241782278564400, 14383131042028101773, 6575665438039683251, 6873491385755763284, 5461089107914913800, 14868969018190677678, 10359842278252856200, 9238174518821588657, 17527071737039935418, 13502357048437945535, 15348847553065546187, 11339121943878505166, 9517911241040346198, 9971396702494946207, 4759102407226695211, 17378647008906169927, 8551269127753525532, 3200854107087625055, 18216411296800512643, 2268055074172700034, 17342145754611272887, 16259542889635186428, 7467557820838912855, 5842407176390331805, 13781293231417820760, 11545326463606686682, 406460662087397399, 12248428481276306937, 2713878548564622716, 15813794323767901698, 12909252825081827436, 16687682160775540198, 13363292471131286850, 16093363920219344101, 17173522193701129157, 1340149631943889222, 17937642222676617316, 13187698676877812363, 13848249080340613479, 10604652161736989959, 8063408691889325956, 2565552841162102374, 4619087852284151766, 5214791045043151621, 11825258692200411453, 8447401294454977041, 11060374817020715049, 2118998135578172543, 18400220166708232590, 1638138058256147361, 11933752785043076045, 11022751975238574809, 7923814141646626425, 8745197289204327461, 10251172860281438584, 110046607829271280, 17001249825241725906, 13607620101989539157, 12527281127159060254, 852275931467612126, 12280242513132584692, 6838009262779170980, 17658513533341858976, 1935925255570044309, 16894801472302283042, 0, 9624367324648619686, 5055648419791580364, 744521925918424366, 8708792173461317333, 3012835619118082888, 2417128113004220315, 1525826018450700460, 9485585257278707132, 14103543837016167018, 11442415316829571523, 555623154201897450, 9144795202799799759, 3942477176883605194, 9657855435820246443, 18120314326393467753, 5511376580148613602, 15664667007830861823, 2755821882842654321, 7814304129864883337, 5354596692910111480, 15776976912903093490, 6280103384783087239, 1191443428809820347, 9831487700257630818, 3349066620751495842, 7030425627006208077, 12141104268537423625, 15906742984900188136, 17132709196148330696, 11964432129338157248, 13954451705047518103, 4572398174778067177, 11684814352765786663, 12387952654176517124, 17620705939241991760, 6698133237560285529, 6924249334748056253, 4915877947555788081, 10111296835088767109, 13048598907028568950, 893432504920462900, 13011771634646415750, 11302435937273876542, 3644679859973545005, 1822496103478537880, 4867631031866531035, 11200357486546532820, 9345637772528684097, 16055873590790557205, 5651355959728424991, 6102500154237255050, 5321106438415311349, 12666416081784098531, 17769131758322608045, 6541340121823556163, 10219929968899119733, 9941277503389493394, 14829851944308301219, 5982354661116236896, 7656949129855104915, 6733579076392590249, 16299238792081284593, 6242444349043369079, 14275799167331476093, 16539327809960162331, 10709193381743359213, 7063352394543305536, 7169984984404332976, 10081152420505776495, 5805861825662078829, 16746518581295898847, 9005272120822338610, 14441423414742904244, 8149771120223764726, 16429564429454849771, 10569310857845530615, 12871313860553036444, 2309691269046898027, 3794159109699761975, 16407864263942807297, 5025527060452063169, 17806764530333181277, 7517355687739125358, 7328458050963454634, 8586890291714583532, 9764207066100180827, 1228969994608986699, 3680135560314805981, 13641698681201336229, 3828474564935022023 }, new ulong[256] { 9993673838465935981, 4884127456122942266, 633234397777501925, 4175331866391974078, 13960862214643959730, 3179702086296496554, 16933906489121384602, 10694170786544668381, 2821567796802171918, 10017225945983459410, 8620367719189969058, 11912340740684202118, 2483193514877514189, 15820547210744392958, 6709821147687032714, 1033155461149792359, 17176581185527344473, 12676916669343913757, 7895548116537857006, 17715094920495729706, 17733400074663874411, 10798980099858302178, 17017586219309622311, 14869918229733283306, 14186578078356341361, 5087312367917758201, 4403136284925796162, 11445060531346954566, 3775805186400799640, 7039684027147830007, 14348961028615061808, 9697319919564979060, 9738807224246382923, 15223411982051930651, 7393281011622612554, 14606960238789696022, 11882147622572427961, 4010248068099147993, 1391157335655481238, 9401574542884107400, 4570854599768479292, 10257649927482729873, 6677411409753660853, 1869614486838700045, 2692552123250949488, 5803321545042218156, 2939237684151739990, 12563222234819403042, 979419644422445862, 3673082354135452954, 11533447497148368197, 18030958354471640690, 17612545135863809557, 8160101394646269472, 8665997893524695802, 13625616718215733940, 18235386795261924047, 5384800866856167392, 12916723256358730451, 13592733055320369291, 1572125733959825684, 16319952048648813632, 5756880660441440803, 9141459606454807672, 5643134515567552540, 16615690806985356220, 3878345071173861799, 9227030292403715574, 2223083610095396016, 7793025783231257041, 270525564056519489, 17847006580419200340, 14816163592450856619, 14466615231819486056, 15073980746734173029, 2096675571659106289, 15724638447412750017, 11654178806006959994, 10463964225571785502, 3546709370140069467, 15706368347685578112, 177299642257213822, 5128824965654363334, 3284371762775499669, 13419641178229583369, 16654934045169170819, 18403114047913597873, 14517143817528858967, 14108395695510474444, 11707930154007137339, 11096530083400914427, 1469770529583346475, 16266162354777931521, 8788550027033796805, 7435101501630170229, 14015179664977724659, 7273261710249789236, 17122228403727216152, 18126471264669209677, 4054715969654905473, 7599903567200476178, 5246485543787097758, 2066061333143563726, 8899911909190592955, 11318703078624401927, 6203347905963379246, 13279357838919968631, 8982737327710905606, 12768987285517661101, 4733860583378205252, 8385890890472733667, 9576385652165374474, 1983784429268132211, 1144615724587504216, 9497500870535659191, 874653248460230937, 8806272569836118916, 13123279255654448912, 8490507753801150940, 4996983704035276216, 15899414662248931395, 10203863540057188048, 3101674511553930519, 8063548039483480720, 2782314667368316465, 7188904195392064393, 13234879149618951471, 9015613289737121593, 12161612559689161632, 6918945025995344072, 10371370779234316206, 6314684983379722257, 18205211228616546544, 516733887222336701, 5295035016025023649, 4372970618206377341, 1367579971541251497, 16771488207379590107, 4788193436127426821, 10413312453672812833, 16525909700027724029, 8286510523341552993, 4528946180991933443, 17331684625243261417, 354332099228667900, 1703685653761847402, 16413616708890474111, 17892572632091416332, 1749306493112033842, 6593587578816598280, 15307631993767476902, 3696774096474081061, 6359145787360465481, 13751446413401596405, 7551609152712119853, 15025544492090470746, 18361178145650889102, 5408360666650553823, 1887903149406137164, 11803390319907948036, 1193308391354416343, 12323998817483741409, 7714012032021747052, 17506448615360610455, 3338705706857455828, 0, 14628435370100609065, 16493078850282879682, 8307846011238545246, 7949845912698622127, 123000737600621119, 14981351001126100949, 3896669045897085670, 1241734746156300008, 3450192318869875435, 16822271919490900452, 773588076271081371, 13000385682190022254, 4966387029739569031, 12002158269635560391, 9180589562619618887, 10928066111586602396, 15930056384200567420, 14219030733708445774, 9855367461831697171, 5589364474795928413, 12718291570760726930, 13105010246454705233, 9347225068603062217, 12895380067559026924, 795073098915667364, 17380094451920307158, 12508908074841628259, 7690267545386164051, 2659693781377578831, 13401935256959085896, 10589758866316740703, 6500344023943830327, 16056445859796592957, 13837888969188904333, 13513288218419651638, 1589851584549665365, 2429422383846896268, 6482023338771290230, 15410014681647150233, 6185590308720085359, 12209899281950724511, 9606974634150672437, 6080806279852835664, 2576885667214146546, 11484734779036570489, 6001208834408615917, 6836195239104500939, 12406411034606736476, 15541565663606373863, 3080356643708727080, 15586050454049992639, 2306958247692105907, 12043971067315669496, 477155333442143874, 14711407087855869076, 386794645880882627, 7093418736453091766, 4288595764497750464, 15199807134400952356, 5979776620583929298, 14309409966946880271, 16143708109906736446, 7303480121366170891, 10973644831137980356, 16912616113304036005, 11114834129878537914, 11286268056177528888, 5486956530453307746, 16097845240139637506, 13790601654062869450, 10611216364554256992, 683790475565323482, 10101463287957875951, 8109430964352234527, 4193092754259694591, 4613640514157211771, 6875861785975561972, 2264473090495966863, 18013216012281093427, 3498327026982732900, 9903891640980875564, 15427721694518818776, 17288057906222606182, 10816721333284587427, 12300279623953421022, 8508793109654811293, 5853965616021964435, 17530150257591650984, 11208102969231252613, 2990031287613762665 }, new ulong[256] { 9094991057681989827, 8606138803235823195, 16160543087529014701, 9722527943682365778, 16797595215276895029, 4026406244121087995, 10810880735842556538, 793466831469952157, 17570873574801040652, 7069806061322532341, 9025437343642800970, 7902240744518357090, 11483956163069641954, 17042883494617269171, 169507756355412485, 12159611706920405785, 18050581113201408916, 13094669269567229859, 8708198706664012748, 16371399438833100324, 14361924315882092926, 1669125631761648043, 14039613357159666168, 6740073072435942682, 9627137974267120347, 2010954567078870965, 17744533894276238730, 15208954621100286812, 734067863229058321, 16730891229222345401, 11666396599453668737, 17212276558031167926, 17506990798142313600, 919214179616323102, 13610264944790049083, 3253262042600145346, 8178958160323126612, 3337947751052939851, 18012048573685573661, 11417239120312989038, 14850353257827313638, 1052577896389186587, 2193586592470914867, 2442179127876909020, 14667795724615946080, 10275106697555981894, 5137708932055784227, 12218975353350290069, 10142868812109927491, 4815958689639822245, 84753878177706380, 6315843737766598667, 18382000460611982098, 3871579785502944766, 14543332760762117477, 5793075969118851720, 249718177605522313, 10016556418199002816, 17931853270716930449, 5498396982908774334, 12758117762690160297, 7667703386526505697, 16683173451180408622, 9308406252338238417, 18135310527241439768, 1929022448056995385, 1586665506641377319, 11971724948115332866, 8445678447034858590, 7274058453835599610, 2629305166521655130, 15808997092930047048, 8787833086900898368, 1545819354008644526, 3789645467455986802, 5856993792710681348, 17343191981176845957, 2091361543251510458, 7459518732372467059, 7397325080452181247, 15335405622202837471, 4059487177496226412, 559362848516098691, 3155811880282733261, 339015512710764810, 499436355210984207, 4260721118560188901, 673503137787469464, 15081211333024874841, 4141949501641595872, 9781889391086627038, 12476916589205824415, 5626135598191838651, 15420137235268491347, 11586150856392483853, 14798864416891614319, 9563233069935360855, 16068176052423353550, 5444143179324534077, 11152674838723308644, 609631631123197716, 12923016366159787180, 5576337977799677490, 17125332349745738303, 17828665414509968390, 14295222528848431346, 4387173184941765478, 13364476147137460669, 13874622463430112253, 5708620050009289783, 6430542613299891216, 15458737944500718554, 1851664366124113328, 13012174097513791023, 9392599482526842968, 10442066843459281269, 17402610465748322057, 10690912919127767167, 4978440652618840358, 4581695294717042927, 13282578800170846257, 3091344129077791553, 7147744857192531065, 4652093626960253344, 17290252874733146170, 15016728463536386261, 9833286126441041225, 11912919544491543691, 16242464486312756257, 17589663661478784911, 1346746777927262509, 15729327665759993284, 2259738658050909887, 6111753265489546114, 12645228008055390618, 16891355708455647420, 16563324312999238955, 12860835633502684448, 7729369582102031213, 8912221009216268357, 4519477316101755235, 1281193087194051236, 15149005862685217488, 10355350241595738058, 8118974354974954712, 9897718555834973381, 8521442237103337431, 8066035438451585639, 4453855455643222762, 5377403871458974897, 6345848246193028508, 6845086483143640723, 7988624098924168171, 8365446172989525458, 1467823520972380706, 2935396374752471364, 2813067799104965843, 10892780281834253302, 403485462937118854, 2688701935736925910, 15963727550304450375, 14201530205386742651, 3468874151188153720, 13250621696684830118, 1132260792577222039, 0, 3535028415789053172, 2491459977799754837, 1003369614229768082, 6675627174024062102, 2029743588748113206, 4729507165508558892, 3637180897245407101, 13952596581111186033, 1413426849607831713, 12561037251630870550, 15570063509623791553, 12397269289706770963, 2575613213387593177, 5320806183970131768, 11314453079775012583, 3422699430205023175, 11852957454497512711, 11074756040358150125, 5071567999032830639, 16127596736020452674, 15899842574624294603, 12691402918954395429, 13406940540233951796, 16497147783287368871, 14139300956777540343, 10637081362510967548, 10227584894573028815, 3173053820371464270, 15538935446490790486, 2362498430710285904, 4897844766612488745, 6236211556551125383, 9224217694939325021, 17669330889627426307, 1774266358176803900, 10768348173029132787, 13484373595114429368, 8283899003267266269, 4916772258018216106, 16294021496973776808, 18249652692721135895, 14601621393924980460, 18317519790144905886, 9472244583004484052, 14932272457585972842, 12314433492482058524, 2749198491462122847, 10503721769042972921, 8966051432100897478, 9158911080295248207, 14481701886997601513, 12036159576530677390, 6195919557778536974, 5258610333024763572, 7340795562680270710, 7820356866570772974, 14721488674053178851, 13743694907000058686, 1218977307603845928, 13172660635703827498, 13676381963436941495, 5926479337025089677, 10996792780356243041, 11235172209801846248, 9956596527230578508, 11798704853650126724, 16953587156089932080, 14122060013263036532, 11252270148092827499, 7508364738339027172, 6905068089466205983, 18189706133331673243, 3949006037152890487, 2995320669031979208, 11713986572161402376, 5985863049541370113, 4182723086503020649, 7574503472341076328, 8348347100700559185, 8828052517901670857, 6506238233651847065, 6937453620375099376, 16621540378390793890, 3698801050773903089, 15654197228883127885, 7019935873167451772, 10570962144843170672, 12378340595835246736, 13805347633558651570, 6586468308675751445 }, new ulong[256] { 15001986890517004262, 1637721477308921125, 12149495623811231944, 7646921253694161755, 7930897700415732235, 7354091399752226219, 8517004666874317814, 5453187778286554101, 17402767330240624456, 14251910686351372799, 10737788899373396171, 9883539568181426278, 12734457949266690357, 11623707008269186684, 10170823345874272566, 15471862682949014686, 3965582442916511115, 818990539008627868, 6511022660614307004, 17126666484504068069, 15184024750296067534, 6797246517703968236, 2154964243676750265, 12492451583515533452, 3398770582681996406, 6305239209379988312, 4529647259392179007, 14544757854385923855, 9493043882612360686, 11962608485028754448, 1169952615461543517, 3200289132027606858, 4147956921301236051, 708224122457687732, 14832107397699362399, 17986746842616076520, 11299623869485987455, 13594198486351288261, 8231768351619019430, 8694883466081947438, 1455760652066973453, 9579750024852670338, 11015579459201929007, 17314613109171068508, 15811118054803696506, 7243836256093423491, 3660620939660078543, 2208053939432577669, 16834810824707884725, 18271848992774824376, 14417021283697659419, 3377712478417560930, 17894792228341543420, 16945073801847805085, 6217894297849621068, 7825436358742779939, 4987043392780078893, 12382858497269484532, 13415820639865306301, 8746199649574856250, 869662533239166704, 14650457721364100391, 16925141562858405257, 2911244210510417434, 18382312974373876624, 11498597901617990979, 10828667572279970807, 5928147536793457436, 11212941572902532115, 5738424067781505701, 4545920254677684779, 14357837190168765399, 10540746283984138919, 15236432095734105306, 2538748850867346054, 11856293991052060216, 13021741769935452261, 15990798677628125186, 763205940277591432, 14016609120497251219, 10061287064328956494, 3093811003563252786, 4790004205042634049, 8356374131917757362, 525807322001048172, 9973800865292223322, 8060006530596508447, 14306696413404433091, 4971791225320957497, 16356195123205149225, 11676952182109293888, 1866917567049488617, 17601962695443621644, 4878334347704591445, 15577684812609376326, 5838476093026002976, 16661444707372843629, 585131888633540512, 4258502335484898171, 9216164226481474882, 1051613531605566680, 9311100443926583238, 12786619038457767969, 7592012931346331751, 17784440428065453348, 1921896258116084693, 3288584640079142494, 182885720694182440, 10430896929374429327, 4347442274373970199, 12254875670338446048, 470303682846092152, 15755474228186677870, 14073238624926194311, 7877737635941138743, 18183412781327927468, 8981595325954651774, 18092225707227040448, 13829189599099727097, 7536474657577537907, 14599035985023753267, 13539018426536891817, 998525038457700324, 8121292137418072206, 16463535689691560273, 10154726272180381730, 17216498010023871705, 1689003026191473713, 6955846591918243539, 12968836256081541641, 10451497052958755227, 1104161065046732236, 5822238831865856308, 7770259743761115727, 10722677434777197023, 3109098905151763750, 7477148998953467071, 5270373732550072797, 235152363269307196, 2264823631868769169, 11566760878849073000, 15293842507372922550, 129144564315678996, 12435787444463389080, 6107963510664673380, 2809900646717377218, 16044592061068688190, 292565944326076752, 16550986154605973573, 17513004949887526240, 7062097245496290555, 16747641319377612705, 14707889229881751371, 6021262719684655624, 1972895747902540481, 3945791491441759391, 8801111098641915142, 13700503016009418221, 14942809973861092471, 17799868517652798512, 5560617129282953357, 6890080809738628344, 2627701227983280362, 9690522075866191274, 5539875718724946329, 0, 17034008114061809393, 13077421330682024305, 13963290176307300527, 7299656588959035031, 1583357035284794905, 13305652357639548565, 12200671035189303772, 6400302286636641940, 6420058603497817984, 6691528990365472708, 9400350877559778554, 15130709207736669938, 9038681643377794922, 13132277426487405133, 4440522822651396099, 8411535559894538718, 16096717416137511466, 4238992274866487919, 18077078508495971284, 13838789949392609723, 9599646529712778902, 14123892125294942443, 5169063728564034821, 12670779828505572004, 10920656821177770723, 13361612877962987393, 2428230993188407470, 3570877924549138163, 14885899578566174051, 4060646644394037319, 3855408526229221283, 16641794458759736185, 16173936262127370241, 8928671747737777170, 1348049825574685813, 3677174894530839771, 10353696833961841438, 15701199224267946322, 8644847306339132130, 2719514554751545854, 8462570783810646218, 1405101508380157281, 3478079366649118695, 11907751461527015212, 15861795400831396118, 6598086612559222184, 12839867613895398173, 3768380308409468599, 6708048310613262032, 1739040292966674941, 11410407946413892695, 11121233283590249735, 11801135715313362004, 9091840505278506070, 9777726215814167742, 4700331558701315709, 11030972914175796795, 4679309188558905193, 2030323828767328429, 5649811934742993841, 415940168518455364, 16266875523426953493, 17492088132592553076, 13255757203528008537, 7190925116101314031, 11320506052158021483, 16372326831517072189, 15417076028166565794, 17693635250630774296, 5077496726762238993, 2339654594279481786, 13646640466407096017, 12546315335725685680, 18361677116664093316, 6127437837148246384, 3002776577694476046, 12090310421094014212, 10260721838532639242, 1294312070793836361, 15527788568662064522, 17232911777424223693, 5255402455948538057, 2517972805691405202, 7008429859484506055, 5361338717396067041, 9294722410648223442, 8178097563976550810, 10629217130044840883, 9863923954178969970, 2824906557929530326 } }; public abstract string AlgorithmName { get; } protected Gost3411_2012Digest(byte[] IV) { Array.Copy(IV, this.IV, 64); Array.Copy(IV, h, 64); } public abstract IMemoable Copy(); public virtual int DoFinal(byte[] output, int outOff) { int num = 64 - bOff; for (int i = 0; i != 64 - num; i++) { m[i] = 0; } m[63 - num] = 1; if (bOff != 64) Array.Copy(block, bOff, m, 64 - num, num); g_N(h, N, m); addMod512(N, num * 8); addMod512(Sigma, m); g_N(h, Zero, N); g_N(h, Zero, Sigma); reverse(h, tmp); Array.Copy(tmp, 0, output, outOff, 64); Reset(); return 64; } public int GetByteLength() { return 64; } public abstract int GetDigestSize(); public void Reset() { bOff = 64; Arrays.Fill(N, 0); Arrays.Fill(Sigma, 0); Array.Copy(IV, 0, h, 0, 64); Arrays.Fill(block, 0); } public void Reset(IMemoable other) { Gost3411_2012Digest gost3411_2012Digest = (Gost3411_2012Digest)other; Array.Copy(gost3411_2012Digest.IV, 0, IV, 0, 64); Array.Copy(gost3411_2012Digest.N, 0, N, 0, 64); Array.Copy(gost3411_2012Digest.Sigma, 0, Sigma, 0, 64); Array.Copy(gost3411_2012Digest.Ki, 0, Ki, 0, 64); Array.Copy(gost3411_2012Digest.m, 0, m, 0, 64); Array.Copy(gost3411_2012Digest.h, 0, h, 0, 64); Array.Copy(gost3411_2012Digest.block, 0, block, 0, 64); bOff = gost3411_2012Digest.bOff; } public void Update(byte input) { block[--bOff] = input; if (bOff == 0) { g_N(h, N, block); addMod512(N, 512); addMod512(Sigma, block); bOff = 64; } } public void BlockUpdate(byte[] input, int inOff, int len) { while (bOff != 64 && len > 0) { Update(input[inOff++]); len--; } while (len >= 64) { Array.Copy(input, inOff, tmp, 0, 64); reverse(tmp, block); g_N(h, N, block); addMod512(N, 512); addMod512(Sigma, block); len -= 64; inOff += 64; } while (len > 0) { Update(input[inOff++]); len--; } } private void F(byte[] V) { ulong[] obj = new ulong[8]; ulong num = 0; num ^= T[0][V[56] & 255]; num ^= T[1][V[48] & 255]; num ^= T[2][V[40] & 255]; num ^= T[3][V[32] & 255]; num ^= T[4][V[24] & 255]; num ^= T[5][V[16] & 255]; num ^= T[6][V[8] & 255]; num = (obj[0] = (num ^ T[7][V[0] & 255])); num = 0; num ^= T[0][V[57] & 255]; num ^= T[1][V[49] & 255]; num ^= T[2][V[41] & 255]; num ^= T[3][V[33] & 255]; num ^= T[4][V[25] & 255]; num ^= T[5][V[17] & 255]; num ^= T[6][V[9] & 255]; num = (obj[1] = (num ^ T[7][V[1] & 255])); num = 0; num ^= T[0][V[58] & 255]; num ^= T[1][V[50] & 255]; num ^= T[2][V[42] & 255]; num ^= T[3][V[34] & 255]; num ^= T[4][V[26] & 255]; num ^= T[5][V[18] & 255]; num ^= T[6][V[10] & 255]; num = (obj[2] = (num ^ T[7][V[2] & 255])); num = 0; num ^= T[0][V[59] & 255]; num ^= T[1][V[51] & 255]; num ^= T[2][V[43] & 255]; num ^= T[3][V[35] & 255]; num ^= T[4][V[27] & 255]; num ^= T[5][V[19] & 255]; num ^= T[6][V[11] & 255]; num = (obj[3] = (num ^ T[7][V[3] & 255])); num = 0; num ^= T[0][V[60] & 255]; num ^= T[1][V[52] & 255]; num ^= T[2][V[44] & 255]; num ^= T[3][V[36] & 255]; num ^= T[4][V[28] & 255]; num ^= T[5][V[20] & 255]; num ^= T[6][V[12] & 255]; num = (obj[4] = (num ^ T[7][V[4] & 255])); num = 0; num ^= T[0][V[61] & 255]; num ^= T[1][V[53] & 255]; num ^= T[2][V[45] & 255]; num ^= T[3][V[37] & 255]; num ^= T[4][V[29] & 255]; num ^= T[5][V[21] & 255]; num ^= T[6][V[13] & 255]; num = (obj[5] = (num ^ T[7][V[5] & 255])); num = 0; num ^= T[0][V[62] & 255]; num ^= T[1][V[54] & 255]; num ^= T[2][V[46] & 255]; num ^= T[3][V[38] & 255]; num ^= T[4][V[30] & 255]; num ^= T[5][V[22] & 255]; num ^= T[6][V[14] & 255]; num = (obj[6] = (num ^ T[7][V[6] & 255])); num = 0; num ^= T[0][V[63] & 255]; num ^= T[1][V[55] & 255]; num ^= T[2][V[47] & 255]; num ^= T[3][V[39] & 255]; num ^= T[4][V[31] & 255]; num ^= T[5][V[23] & 255]; num ^= T[6][V[15] & 255]; num = (obj[7] = (num ^ T[7][V[7] & 255])); num = obj[0]; V[7] = (byte)(num >> 56); V[6] = (byte)(num >> 48); V[5] = (byte)(num >> 40); V[4] = (byte)(num >> 32); V[3] = (byte)(num >> 24); V[2] = (byte)(num >> 16); V[1] = (byte)(num >> 8); V[0] = (byte)num; num = obj[1]; V[15] = (byte)(num >> 56); V[14] = (byte)(num >> 48); V[13] = (byte)(num >> 40); V[12] = (byte)(num >> 32); V[11] = (byte)(num >> 24); V[10] = (byte)(num >> 16); V[9] = (byte)(num >> 8); V[8] = (byte)num; num = obj[2]; V[23] = (byte)(num >> 56); V[22] = (byte)(num >> 48); V[21] = (byte)(num >> 40); V[20] = (byte)(num >> 32); V[19] = (byte)(num >> 24); V[18] = (byte)(num >> 16); V[17] = (byte)(num >> 8); V[16] = (byte)num; num = obj[3]; V[31] = (byte)(num >> 56); V[30] = (byte)(num >> 48); V[29] = (byte)(num >> 40); V[28] = (byte)(num >> 32); V[27] = (byte)(num >> 24); V[26] = (byte)(num >> 16); V[25] = (byte)(num >> 8); V[24] = (byte)num; num = obj[4]; V[39] = (byte)(num >> 56); V[38] = (byte)(num >> 48); V[37] = (byte)(num >> 40); V[36] = (byte)(num >> 32); V[35] = (byte)(num >> 24); V[34] = (byte)(num >> 16); V[33] = (byte)(num >> 8); V[32] = (byte)num; num = obj[5]; V[47] = (byte)(num >> 56); V[46] = (byte)(num >> 48); V[45] = (byte)(num >> 40); V[44] = (byte)(num >> 32); V[43] = (byte)(num >> 24); V[42] = (byte)(num >> 16); V[41] = (byte)(num >> 8); V[40] = (byte)num; num = obj[6]; V[55] = (byte)(num >> 56); V[54] = (byte)(num >> 48); V[53] = (byte)(num >> 40); V[52] = (byte)(num >> 32); V[51] = (byte)(num >> 24); V[50] = (byte)(num >> 16); V[49] = (byte)(num >> 8); V[48] = (byte)num; num = obj[7]; V[63] = (byte)(num >> 56); V[62] = (byte)(num >> 48); V[61] = (byte)(num >> 40); V[60] = (byte)(num >> 32); V[59] = (byte)(num >> 24); V[58] = (byte)(num >> 16); V[57] = (byte)(num >> 8); V[56] = (byte)num; } private static void Xor512(byte[] A, byte[] B) { Bytes.XorTo(64, B, A); } private void E(byte[] K, byte[] m) { Array.Copy(K, 0, Ki, 0, 64); Xor512(K, m); F(K); for (int i = 0; i < 11; i++) { Xor512(Ki, C[i]); F(Ki); Xor512(K, Ki); F(K); } Xor512(Ki, C[11]); F(Ki); Xor512(K, Ki); } private void g_N(byte[] h, byte[] N, byte[] m) { Array.Copy(h, 0, tmp, 0, 64); Xor512(h, N); F(h); E(h, m); Xor512(h, tmp); Xor512(h, m); } private void addMod512(byte[] A, int num) { int num2 = (A[63] & 255) + (num & 255); A[63] = (byte)num2; num2 = (A[62] & 255) + ((num >> 8) & 255) + (num2 >> 8); A[62] = (byte)num2; int num3 = 61; while (num3 >= 0 && num2 > 0) { num2 = (A[num3] & 255) + (num2 >> 8); A[num3] = (byte)num2; num3--; } } private void addMod512(byte[] A, byte[] B) { int num = 0; for (int num2 = 63; num2 >= 0; num2--) { num = (A[num2] & 255) + (B[num2] & 255) + (num >> 8); A[num2] = (byte)num; } } private void reverse(byte[] src, byte[] dst) { int num = src.Length; for (int i = 0; i < num; i++) { dst[num - 1 - i] = src[i]; } } } }