1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | export class Int_64 {
|
14 | |
15 |
|
16 |
|
17 |
|
18 | readonly highOrder: number;
|
19 | readonly lowOrder: number;
|
20 | constructor(msint_32: number, lsint_32: number) {
|
21 | this.highOrder = msint_32;
|
22 | this.lowOrder = lsint_32;
|
23 | }
|
24 | }
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 | export function rotl_64(x: Int_64, n: number): Int_64 {
|
36 | let tmp;
|
37 | if (n > 32) {
|
38 | tmp = 64 - n;
|
39 | return new Int_64((x.lowOrder << n) | (x.highOrder >>> tmp), (x.highOrder << n) | (x.lowOrder >>> tmp));
|
40 | } else if (0 !== n) {
|
41 | tmp = 32 - n;
|
42 | return new Int_64((x.highOrder << n) | (x.lowOrder >>> tmp), (x.lowOrder << n) | (x.highOrder >>> tmp));
|
43 | } else {
|
44 | return x;
|
45 | }
|
46 | }
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 | function rotr_64(x: Int_64, n: number): Int_64 {
|
58 | let tmp;
|
59 | if (n < 32) {
|
60 | tmp = 32 - n;
|
61 | return new Int_64((x.highOrder >>> n) | (x.lowOrder << tmp), (x.lowOrder >>> n) | (x.highOrder << tmp));
|
62 | } else {
|
63 | tmp = 64 - n;
|
64 | return new Int_64((x.lowOrder >>> n) | (x.highOrder << tmp), (x.highOrder >>> n) | (x.lowOrder << tmp));
|
65 | }
|
66 | }
|
67 |
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 | function shr_64(x: Int_64, n: number): Int_64 {
|
78 | return new Int_64(x.highOrder >>> n, (x.lowOrder >>> n) | (x.highOrder << (32 - n)));
|
79 | }
|
80 |
|
81 |
|
82 |
|
83 |
|
84 |
|
85 |
|
86 |
|
87 |
|
88 |
|
89 | export function ch_64(x: Int_64, y: Int_64, z: Int_64): Int_64 {
|
90 | return new Int_64(
|
91 | (x.highOrder & y.highOrder) ^ (~x.highOrder & z.highOrder),
|
92 | (x.lowOrder & y.lowOrder) ^ (~x.lowOrder & z.lowOrder)
|
93 | );
|
94 | }
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 |
|
103 |
|
104 | export function maj_64(x: Int_64, y: Int_64, z: Int_64): Int_64 {
|
105 | return new Int_64(
|
106 | (x.highOrder & y.highOrder) ^ (x.highOrder & z.highOrder) ^ (y.highOrder & z.highOrder),
|
107 | (x.lowOrder & y.lowOrder) ^ (x.lowOrder & z.lowOrder) ^ (y.lowOrder & z.lowOrder)
|
108 | );
|
109 | }
|
110 |
|
111 |
|
112 |
|
113 |
|
114 |
|
115 |
|
116 |
|
117 | export function sigma0_64(x: Int_64): Int_64 {
|
118 | const rotr28 = rotr_64(x, 28),
|
119 | rotr34 = rotr_64(x, 34),
|
120 | rotr39 = rotr_64(x, 39);
|
121 |
|
122 | return new Int_64(
|
123 | rotr28.highOrder ^ rotr34.highOrder ^ rotr39.highOrder,
|
124 | rotr28.lowOrder ^ rotr34.lowOrder ^ rotr39.lowOrder
|
125 | );
|
126 | }
|
127 |
|
128 |
|
129 |
|
130 |
|
131 |
|
132 |
|
133 |
|
134 |
|
135 | export function safeAdd_64_2(x: Int_64, y: Int_64): Int_64 {
|
136 | let lsw, msw;
|
137 |
|
138 | lsw = (x.lowOrder & 0xffff) + (y.lowOrder & 0xffff);
|
139 | msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16);
|
140 | const lowOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff);
|
141 |
|
142 | lsw = (x.highOrder & 0xffff) + (y.highOrder & 0xffff) + (msw >>> 16);
|
143 | msw = (x.highOrder >>> 16) + (y.highOrder >>> 16) + (lsw >>> 16);
|
144 | const highOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff);
|
145 |
|
146 | return new Int_64(highOrder, lowOrder);
|
147 | }
|
148 |
|
149 |
|
150 |
|
151 |
|
152 |
|
153 |
|
154 |
|
155 |
|
156 |
|
157 |
|
158 | export function safeAdd_64_4(a: Int_64, b: Int_64, c: Int_64, d: Int_64): Int_64 {
|
159 | let lsw, msw;
|
160 |
|
161 | lsw = (a.lowOrder & 0xffff) + (b.lowOrder & 0xffff) + (c.lowOrder & 0xffff) + (d.lowOrder & 0xffff);
|
162 | msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16);
|
163 | const lowOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff);
|
164 |
|
165 | lsw =
|
166 | (a.highOrder & 0xffff) + (b.highOrder & 0xffff) + (c.highOrder & 0xffff) + (d.highOrder & 0xffff) + (msw >>> 16);
|
167 | msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (lsw >>> 16);
|
168 | const highOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff);
|
169 |
|
170 | return new Int_64(highOrder, lowOrder);
|
171 | }
|
172 |
|
173 |
|
174 |
|
175 |
|
176 |
|
177 |
|
178 |
|
179 |
|
180 |
|
181 |
|
182 |
|
183 | export function safeAdd_64_5(a: Int_64, b: Int_64, c: Int_64, d: Int_64, e: Int_64): Int_64 {
|
184 | let lsw, msw;
|
185 |
|
186 | lsw =
|
187 | (a.lowOrder & 0xffff) +
|
188 | (b.lowOrder & 0xffff) +
|
189 | (c.lowOrder & 0xffff) +
|
190 | (d.lowOrder & 0xffff) +
|
191 | (e.lowOrder & 0xffff);
|
192 | msw =
|
193 | (a.lowOrder >>> 16) +
|
194 | (b.lowOrder >>> 16) +
|
195 | (c.lowOrder >>> 16) +
|
196 | (d.lowOrder >>> 16) +
|
197 | (e.lowOrder >>> 16) +
|
198 | (lsw >>> 16);
|
199 | const lowOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff);
|
200 |
|
201 | lsw =
|
202 | (a.highOrder & 0xffff) +
|
203 | (b.highOrder & 0xffff) +
|
204 | (c.highOrder & 0xffff) +
|
205 | (d.highOrder & 0xffff) +
|
206 | (e.highOrder & 0xffff) +
|
207 | (msw >>> 16);
|
208 | msw =
|
209 | (a.highOrder >>> 16) +
|
210 | (b.highOrder >>> 16) +
|
211 | (c.highOrder >>> 16) +
|
212 | (d.highOrder >>> 16) +
|
213 | (e.highOrder >>> 16) +
|
214 | (lsw >>> 16);
|
215 | const highOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff);
|
216 |
|
217 | return new Int_64(highOrder, lowOrder);
|
218 | }
|
219 |
|
220 |
|
221 |
|
222 |
|
223 |
|
224 |
|
225 |
|
226 |
|
227 | export function xor_64_2(a: Int_64, b: Int_64): Int_64 {
|
228 | return new Int_64(a.highOrder ^ b.highOrder, a.lowOrder ^ b.lowOrder);
|
229 | }
|
230 |
|
231 |
|
232 |
|
233 |
|
234 |
|
235 |
|
236 |
|
237 |
|
238 |
|
239 |
|
240 |
|
241 | export function xor_64_5(a: Int_64, b: Int_64, c: Int_64, d: Int_64, e: Int_64): Int_64 {
|
242 | return new Int_64(
|
243 | a.highOrder ^ b.highOrder ^ c.highOrder ^ d.highOrder ^ e.highOrder,
|
244 | a.lowOrder ^ b.lowOrder ^ c.lowOrder ^ d.lowOrder ^ e.lowOrder
|
245 | );
|
246 | }
|
247 |
|
248 |
|
249 |
|
250 |
|
251 |
|
252 |
|
253 |
|
254 | export function gamma1_64(x: Int_64): Int_64 {
|
255 | const rotr19 = rotr_64(x, 19),
|
256 | rotr61 = rotr_64(x, 61),
|
257 | shr6 = shr_64(x, 6);
|
258 |
|
259 | return new Int_64(
|
260 | rotr19.highOrder ^ rotr61.highOrder ^ shr6.highOrder,
|
261 | rotr19.lowOrder ^ rotr61.lowOrder ^ shr6.lowOrder
|
262 | );
|
263 | }
|
264 |
|
265 |
|
266 |
|
267 |
|
268 |
|
269 |
|
270 |
|
271 | export function gamma0_64(x: Int_64): Int_64 {
|
272 | const rotr1 = rotr_64(x, 1),
|
273 | rotr8 = rotr_64(x, 8),
|
274 | shr7 = shr_64(x, 7);
|
275 |
|
276 | return new Int_64(
|
277 | rotr1.highOrder ^ rotr8.highOrder ^ shr7.highOrder,
|
278 | rotr1.lowOrder ^ rotr8.lowOrder ^ shr7.lowOrder
|
279 | );
|
280 | }
|
281 |
|
282 |
|
283 |
|
284 |
|
285 |
|
286 |
|
287 |
|
288 | export function sigma1_64(x: Int_64): Int_64 {
|
289 | const rotr14 = rotr_64(x, 14),
|
290 | rotr18 = rotr_64(x, 18),
|
291 | rotr41 = rotr_64(x, 41);
|
292 |
|
293 | return new Int_64(
|
294 | rotr14.highOrder ^ rotr18.highOrder ^ rotr41.highOrder,
|
295 | rotr14.lowOrder ^ rotr18.lowOrder ^ rotr41.lowOrder
|
296 | );
|
297 | }
|