Gost3411_2012Digest
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];
}
}
}
}