blob: fa4b16683537758e6cf62e58238cf602e3241f37 [file] [log] [blame]
Austin Schuh36244a12019-09-21 17:52:38 -07001// Copyright 2017 The Abseil Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef ABSL_RANDOM_INTERNAL_RANDEN_KEYS_INC_
16#define ABSL_RANDOM_INTERNAL_RANDEN_KEYS_INC_
17
18// Textual header to include the randen_keys where necessary.
19// REQUIRES: struct u64x2{}
20//
21// PROVIDES: kKeys
22// PROVIDES: round_keys[]
23
24// "Nothing up my sleeve" numbers from the first hex digits of Pi, obtained
25// from http://hexpi.sourceforge.net/. The array was generated by following
26// Python script:
27/*
28python << EOF
29"""Generates Randen round keys array from pi-hex.62500.txt file."""
30import binascii
31
32KEYS = 136
33
34def chunks(l, n):
35 """Yield successive n-sized chunks from l."""
36 for i in range(0, len(l), n):
37 yield l[i:i + n]
38
39def pairwise(t):
40 """Transforms sequence into sequence of pairs."""
41 it = iter(t)
42 return zip(it,it)
43
44def digits_from_pi():
45 """Reads digits from hexpi.sourceforge.net file."""
46 with open("pi-hex.62500.txt") as file:
47 return file.read()
48
49def digits_from_urandom():
50 """Reads digits from /dev/urandom."""
51 with open("/dev/urandom") as file:
52 return binascii.hexlify(file.read(KEYS * 16))
53
54digits = digits_from_pi()
55print("static constexpr const size_t kRoundKeys = {0};\n".format(KEYS))
56print("alignas(16) constexpr const u64x2 round_keys[kRoundKeys] = {")
57
58for i, (hi, lo) in zip(range(KEYS), pairwise(chunks(digits, 16))):
59 hi = "0x{0}ull".format(hi)
60 lo = "0x{0}ull".format(lo)
61 print(" u64x2({0}, {1}){2}".format(hi, lo, ',' if i+1 < KEYS else ''))
62
63print("};")
64EOF
65*/
66
67static constexpr const size_t kRoundKeys = 136;
68
69alignas(16) constexpr u64x2 round_keys[kRoundKeys] = {
70 u64x2(0x243F6A8885A308D3ull, 0x13198A2E03707344ull),
71 u64x2(0xA4093822299F31D0ull, 0x082EFA98EC4E6C89ull),
72 u64x2(0x452821E638D01377ull, 0xBE5466CF34E90C6Cull),
73 u64x2(0xC0AC29B7C97C50DDull, 0x3F84D5B5B5470917ull),
74 u64x2(0x9216D5D98979FB1Bull, 0xD1310BA698DFB5ACull),
75 u64x2(0x2FFD72DBD01ADFB7ull, 0xB8E1AFED6A267E96ull),
76 u64x2(0xBA7C9045F12C7F99ull, 0x24A19947B3916CF7ull),
77 u64x2(0x0801F2E2858EFC16ull, 0x636920D871574E69ull),
78 u64x2(0xA458FEA3F4933D7Eull, 0x0D95748F728EB658ull),
79 u64x2(0x718BCD5882154AEEull, 0x7B54A41DC25A59B5ull),
80 u64x2(0x9C30D5392AF26013ull, 0xC5D1B023286085F0ull),
81 u64x2(0xCA417918B8DB38EFull, 0x8E79DCB0603A180Eull),
82 u64x2(0x6C9E0E8BB01E8A3Eull, 0xD71577C1BD314B27ull),
83 u64x2(0x78AF2FDA55605C60ull, 0xE65525F3AA55AB94ull),
84 u64x2(0x5748986263E81440ull, 0x55CA396A2AAB10B6ull),
85 u64x2(0xB4CC5C341141E8CEull, 0xA15486AF7C72E993ull),
86 u64x2(0xB3EE1411636FBC2Aull, 0x2BA9C55D741831F6ull),
87 u64x2(0xCE5C3E169B87931Eull, 0xAFD6BA336C24CF5Cull),
88 u64x2(0x7A32538128958677ull, 0x3B8F48986B4BB9AFull),
89 u64x2(0xC4BFE81B66282193ull, 0x61D809CCFB21A991ull),
90 u64x2(0x487CAC605DEC8032ull, 0xEF845D5DE98575B1ull),
91 u64x2(0xDC262302EB651B88ull, 0x23893E81D396ACC5ull),
92 u64x2(0x0F6D6FF383F44239ull, 0x2E0B4482A4842004ull),
93 u64x2(0x69C8F04A9E1F9B5Eull, 0x21C66842F6E96C9Aull),
94 u64x2(0x670C9C61ABD388F0ull, 0x6A51A0D2D8542F68ull),
95 u64x2(0x960FA728AB5133A3ull, 0x6EEF0B6C137A3BE4ull),
96 u64x2(0xBA3BF0507EFB2A98ull, 0xA1F1651D39AF0176ull),
97 u64x2(0x66CA593E82430E88ull, 0x8CEE8619456F9FB4ull),
98 u64x2(0x7D84A5C33B8B5EBEull, 0xE06F75D885C12073ull),
99 u64x2(0x401A449F56C16AA6ull, 0x4ED3AA62363F7706ull),
100 u64x2(0x1BFEDF72429B023Dull, 0x37D0D724D00A1248ull),
101 u64x2(0xDB0FEAD349F1C09Bull, 0x075372C980991B7Bull),
102 u64x2(0x25D479D8F6E8DEF7ull, 0xE3FE501AB6794C3Bull),
103 u64x2(0x976CE0BD04C006BAull, 0xC1A94FB6409F60C4ull),
104 u64x2(0x5E5C9EC2196A2463ull, 0x68FB6FAF3E6C53B5ull),
105 u64x2(0x1339B2EB3B52EC6Full, 0x6DFC511F9B30952Cull),
106 u64x2(0xCC814544AF5EBD09ull, 0xBEE3D004DE334AFDull),
107 u64x2(0x660F2807192E4BB3ull, 0xC0CBA85745C8740Full),
108 u64x2(0xD20B5F39B9D3FBDBull, 0x5579C0BD1A60320Aull),
109 u64x2(0xD6A100C6402C7279ull, 0x679F25FEFB1FA3CCull),
110 u64x2(0x8EA5E9F8DB3222F8ull, 0x3C7516DFFD616B15ull),
111 u64x2(0x2F501EC8AD0552ABull, 0x323DB5FAFD238760ull),
112 u64x2(0x53317B483E00DF82ull, 0x9E5C57BBCA6F8CA0ull),
113 u64x2(0x1A87562EDF1769DBull, 0xD542A8F6287EFFC3ull),
114 u64x2(0xAC6732C68C4F5573ull, 0x695B27B0BBCA58C8ull),
115 u64x2(0xE1FFA35DB8F011A0ull, 0x10FA3D98FD2183B8ull),
116 u64x2(0x4AFCB56C2DD1D35Bull, 0x9A53E479B6F84565ull),
117 u64x2(0xD28E49BC4BFB9790ull, 0xE1DDF2DAA4CB7E33ull),
118 u64x2(0x62FB1341CEE4C6E8ull, 0xEF20CADA36774C01ull),
119 u64x2(0xD07E9EFE2BF11FB4ull, 0x95DBDA4DAE909198ull),
120 u64x2(0xEAAD8E716B93D5A0ull, 0xD08ED1D0AFC725E0ull),
121 u64x2(0x8E3C5B2F8E7594B7ull, 0x8FF6E2FBF2122B64ull),
122 u64x2(0x8888B812900DF01Cull, 0x4FAD5EA0688FC31Cull),
123 u64x2(0xD1CFF191B3A8C1ADull, 0x2F2F2218BE0E1777ull),
124 u64x2(0xEA752DFE8B021FA1ull, 0xE5A0CC0FB56F74E8ull),
125 u64x2(0x18ACF3D6CE89E299ull, 0xB4A84FE0FD13E0B7ull),
126 u64x2(0x7CC43B81D2ADA8D9ull, 0x165FA26680957705ull),
127 u64x2(0x93CC7314211A1477ull, 0xE6AD206577B5FA86ull),
128 u64x2(0xC75442F5FB9D35CFull, 0xEBCDAF0C7B3E89A0ull),
129 u64x2(0xD6411BD3AE1E7E49ull, 0x00250E2D2071B35Eull),
130 u64x2(0x226800BB57B8E0AFull, 0x2464369BF009B91Eull),
131 u64x2(0x5563911D59DFA6AAull, 0x78C14389D95A537Full),
132 u64x2(0x207D5BA202E5B9C5ull, 0x832603766295CFA9ull),
133 u64x2(0x11C819684E734A41ull, 0xB3472DCA7B14A94Aull),
134 u64x2(0x1B5100529A532915ull, 0xD60F573FBC9BC6E4ull),
135 u64x2(0x2B60A47681E67400ull, 0x08BA6FB5571BE91Full),
136 u64x2(0xF296EC6B2A0DD915ull, 0xB6636521E7B9F9B6ull),
137 u64x2(0xFF34052EC5855664ull, 0x53B02D5DA99F8FA1ull),
138 u64x2(0x08BA47996E85076Aull, 0x4B7A70E9B5B32944ull),
139 u64x2(0xDB75092EC4192623ull, 0xAD6EA6B049A7DF7Dull),
140 u64x2(0x9CEE60B88FEDB266ull, 0xECAA8C71699A18FFull),
141 u64x2(0x5664526CC2B19EE1ull, 0x193602A575094C29ull),
142 u64x2(0xA0591340E4183A3Eull, 0x3F54989A5B429D65ull),
143 u64x2(0x6B8FE4D699F73FD6ull, 0xA1D29C07EFE830F5ull),
144 u64x2(0x4D2D38E6F0255DC1ull, 0x4CDD20868470EB26ull),
145 u64x2(0x6382E9C6021ECC5Eull, 0x09686B3F3EBAEFC9ull),
146 u64x2(0x3C9718146B6A70A1ull, 0x687F358452A0E286ull),
147 u64x2(0xB79C5305AA500737ull, 0x3E07841C7FDEAE5Cull),
148 u64x2(0x8E7D44EC5716F2B8ull, 0xB03ADA37F0500C0Dull),
149 u64x2(0xF01C1F040200B3FFull, 0xAE0CF51A3CB574B2ull),
150 u64x2(0x25837A58DC0921BDull, 0xD19113F97CA92FF6ull),
151 u64x2(0x9432477322F54701ull, 0x3AE5E58137C2DADCull),
152 u64x2(0xC8B576349AF3DDA7ull, 0xA94461460FD0030Eull),
153 u64x2(0xECC8C73EA4751E41ull, 0xE238CD993BEA0E2Full),
154 u64x2(0x3280BBA1183EB331ull, 0x4E548B384F6DB908ull),
155 u64x2(0x6F420D03F60A04BFull, 0x2CB8129024977C79ull),
156 u64x2(0x5679B072BCAF89AFull, 0xDE9A771FD9930810ull),
157 u64x2(0xB38BAE12DCCF3F2Eull, 0x5512721F2E6B7124ull),
158 u64x2(0x501ADDE69F84CD87ull, 0x7A5847187408DA17ull),
159 u64x2(0xBC9F9ABCE94B7D8Cull, 0xEC7AEC3ADB851DFAull),
160 u64x2(0x63094366C464C3D2ull, 0xEF1C18473215D808ull),
161 u64x2(0xDD433B3724C2BA16ull, 0x12A14D432A65C451ull),
162 u64x2(0x50940002133AE4DDull, 0x71DFF89E10314E55ull),
163 u64x2(0x81AC77D65F11199Bull, 0x043556F1D7A3C76Bull),
164 u64x2(0x3C11183B5924A509ull, 0xF28FE6ED97F1FBFAull),
165 u64x2(0x9EBABF2C1E153C6Eull, 0x86E34570EAE96FB1ull),
166 u64x2(0x860E5E0A5A3E2AB3ull, 0x771FE71C4E3D06FAull),
167 u64x2(0x2965DCB999E71D0Full, 0x803E89D65266C825ull),
168 u64x2(0x2E4CC9789C10B36Aull, 0xC6150EBA94E2EA78ull),
169 u64x2(0xA6FC3C531E0A2DF4ull, 0xF2F74EA7361D2B3Dull),
170 u64x2(0x1939260F19C27960ull, 0x5223A708F71312B6ull),
171 u64x2(0xEBADFE6EEAC31F66ull, 0xE3BC4595A67BC883ull),
172 u64x2(0xB17F37D1018CFF28ull, 0xC332DDEFBE6C5AA5ull),
173 u64x2(0x6558218568AB9702ull, 0xEECEA50FDB2F953Bull),
174 u64x2(0x2AEF7DAD5B6E2F84ull, 0x1521B62829076170ull),
175 u64x2(0xECDD4775619F1510ull, 0x13CCA830EB61BD96ull),
176 u64x2(0x0334FE1EAA0363CFull, 0xB5735C904C70A239ull),
177 u64x2(0xD59E9E0BCBAADE14ull, 0xEECC86BC60622CA7ull),
178 u64x2(0x9CAB5CABB2F3846Eull, 0x648B1EAF19BDF0CAull),
179 u64x2(0xA02369B9655ABB50ull, 0x40685A323C2AB4B3ull),
180 u64x2(0x319EE9D5C021B8F7ull, 0x9B540B19875FA099ull),
181 u64x2(0x95F7997E623D7DA8ull, 0xF837889A97E32D77ull),
182 u64x2(0x11ED935F16681281ull, 0x0E358829C7E61FD6ull),
183 u64x2(0x96DEDFA17858BA99ull, 0x57F584A51B227263ull),
184 u64x2(0x9B83C3FF1AC24696ull, 0xCDB30AEB532E3054ull),
185 u64x2(0x8FD948E46DBC3128ull, 0x58EBF2EF34C6FFEAull),
186 u64x2(0xFE28ED61EE7C3C73ull, 0x5D4A14D9E864B7E3ull),
187 u64x2(0x42105D14203E13E0ull, 0x45EEE2B6A3AAABEAull),
188 u64x2(0xDB6C4F15FACB4FD0ull, 0xC742F442EF6ABBB5ull),
189 u64x2(0x654F3B1D41CD2105ull, 0xD81E799E86854DC7ull),
190 u64x2(0xE44B476A3D816250ull, 0xCF62A1F25B8D2646ull),
191 u64x2(0xFC8883A0C1C7B6A3ull, 0x7F1524C369CB7492ull),
192 u64x2(0x47848A0B5692B285ull, 0x095BBF00AD19489Dull),
193 u64x2(0x1462B17423820D00ull, 0x58428D2A0C55F5EAull),
194 u64x2(0x1DADF43E233F7061ull, 0x3372F0928D937E41ull),
195 u64x2(0xD65FECF16C223BDBull, 0x7CDE3759CBEE7460ull),
196 u64x2(0x4085F2A7CE77326Eull, 0xA607808419F8509Eull),
197 u64x2(0xE8EFD85561D99735ull, 0xA969A7AAC50C06C2ull),
198 u64x2(0x5A04ABFC800BCADCull, 0x9E447A2EC3453484ull),
199 u64x2(0xFDD567050E1E9EC9ull, 0xDB73DBD3105588CDull),
200 u64x2(0x675FDA79E3674340ull, 0xC5C43465713E38D8ull),
201 u64x2(0x3D28F89EF16DFF20ull, 0x153E21E78FB03D4Aull),
202 u64x2(0xE6E39F2BDB83ADF7ull, 0xE93D5A68948140F7ull),
203 u64x2(0xF64C261C94692934ull, 0x411520F77602D4F7ull),
204 u64x2(0xBCF46B2ED4A10068ull, 0xD40824713320F46Aull),
205 u64x2(0x43B7D4B7500061AFull, 0x1E39F62E97244546ull)};
206
207#endif // ABSL_RANDOM_INTERNAL_RANDEN_KEYS_INC_