1 | var sigma = [
|
2 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
|
3 | [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3],
|
4 | [11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4],
|
5 | [7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8],
|
6 | [9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13],
|
7 | [2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9],
|
8 | [12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11],
|
9 | [13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10],
|
10 | [6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5],
|
11 | [10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0],
|
12 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
|
13 | [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3]
|
14 | ]
|
15 |
|
16 | function G (r, i, a, b, c, d) {
|
17 | return `
|
18 | ;; G(${r}, ${i})
|
19 |
|
20 | ;; ${a} = ${a} + ${b} + $m${sigma[r][2 * i + 0]}
|
21 | (set_local ${a} (i64.add (get_local ${a}) (i64.add (get_local ${b}) (get_local $m${sigma[r][2 * i + 0]}))))
|
22 |
|
23 | ;; ${d} = rotr64(${d} ^ ${a}, 32)
|
24 | (set_local ${d} (i64.rotr (i64.xor (get_local ${d}) (get_local ${a})) (i64.const 32)))
|
25 |
|
26 | ;; ${c} = ${c} + ${d}
|
27 | (set_local ${c} (i64.add (get_local ${c}) (get_local ${d})))
|
28 |
|
29 | ;; ${b} = rotr64(${b} ^ ${c}, 24)
|
30 | (set_local ${b} (i64.rotr (i64.xor (get_local ${b}) (get_local ${c})) (i64.const 24)))
|
31 |
|
32 | ;; ${a} = ${a} + ${b} + $m${sigma[r][2 * i + 1]}
|
33 | (set_local ${a} (i64.add (get_local ${a}) (i64.add (get_local ${b}) (get_local $m${sigma[r][2 * i + 1]}))))
|
34 |
|
35 | ;; ${d} = rotr64(${d} ^ ${a}, 16)
|
36 | (set_local ${d} (i64.rotr (i64.xor (get_local ${d}) (get_local ${a})) (i64.const 16)))
|
37 |
|
38 | ;; ${c} = ${c} + ${d}
|
39 | (set_local ${c} (i64.add (get_local ${c}) (get_local ${d})))
|
40 |
|
41 | ;; ${b} = rotr64(${b} ^ ${c}, 63)
|
42 | (set_local ${b} (i64.rotr (i64.xor (get_local ${b}) (get_local ${c})) (i64.const 63)))`
|
43 | }
|
44 |
|
45 | function ROUND (r) {
|
46 | return `
|
47 | ;; ROUND(${r})
|
48 | ${G(r, 0, '$v0', '$v4', '$v8', '$v12')}
|
49 | ${G(r, 1, '$v1', '$v5', '$v9', '$v13')}
|
50 | ${G(r, 2, '$v2', '$v6', '$v10', '$v14')}
|
51 | ${G(r, 3, '$v3', '$v7', '$v11', '$v15')}
|
52 | ${G(r, 4, '$v0', '$v5', '$v10', '$v15')}
|
53 | ${G(r, 5, '$v1', '$v6', '$v11', '$v12')}
|
54 | ${G(r, 6, '$v2', '$v7', '$v8', '$v13')}
|
55 | ${G(r, 7, '$v3', '$v4', '$v9', '$v14')}
|
56 | `
|
57 | }
|
58 |
|
59 | console.log(
|
60 | ROUND(0),
|
61 | ROUND(1),
|
62 | ROUND(2),
|
63 | ROUND(3),
|
64 | ROUND(4),
|
65 | ROUND(5),
|
66 | ROUND(6),
|
67 | ROUND(7),
|
68 | ROUND(8),
|
69 | ROUND(9),
|
70 | ROUND(10),
|
71 | ROUND(11)
|
72 | )
|