functionalscript 0.0.301 → 0.0.302
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/sha2/index.js +104 -78
package/package.json
CHANGED
package/sha2/index.js
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* }} HashInput
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
*/
|
|
8
|
+
/** @typedef {Int32Array} Hash8 */
|
|
9
|
+
|
|
10
|
+
/** @typedef {Int32Array} Array16 */
|
|
11
11
|
|
|
12
12
|
/** @type {(input: number) => (pos: number) => number} */
|
|
13
13
|
const appendOne = input => pos => input | (1 << 31 - pos)
|
|
@@ -16,8 +16,7 @@ const appendOne = input => pos => input | (1 << 31 - pos)
|
|
|
16
16
|
const mod = a => b => (a % b + b) % b
|
|
17
17
|
|
|
18
18
|
/** @type {(input: readonly number[]) => (bits: number) => HashInput} */
|
|
19
|
-
const padding = input => bitsCount =>
|
|
20
|
-
{
|
|
19
|
+
const padding = input => bitsCount => {
|
|
21
20
|
const appendBlockIndex = (bitsCount / 32) | 0
|
|
22
21
|
const length = (bitsCount + mod(447 - bitsCount)(512) + 65) / 32
|
|
23
22
|
/** @type {(i: number) => number} */
|
|
@@ -26,13 +25,18 @@ const padding = input => bitsCount =>
|
|
|
26
25
|
input[i] :
|
|
27
26
|
i === appendBlockIndex ?
|
|
28
27
|
(appendBlockIndex >= input.length ? 0x8000_0000 : appendOne(input[appendBlockIndex])(bitsCount % 32)) :
|
|
29
|
-
i === length - 2 ?
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
i === length - 2 ?
|
|
29
|
+
(bitsCount / 0x1_0000_0000) | 0 :
|
|
30
|
+
i === length - 1 ?
|
|
31
|
+
bitsCount % 0x1_0000_0000 : 0
|
|
32
|
+
return ({ f, length })
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
/** @type {(
|
|
35
|
-
const rotr =
|
|
35
|
+
/** @type {(d: number) => (n: number) => number} */
|
|
36
|
+
const rotr = d => {
|
|
37
|
+
const r = 32 - d
|
|
38
|
+
return n => n >>> d | n << r
|
|
39
|
+
}
|
|
36
40
|
|
|
37
41
|
/** @type {(x: number) => (y: number) => (z: number) => number} */
|
|
38
42
|
const ch = x => y => z => x & y ^ ~x & z
|
|
@@ -40,20 +44,32 @@ const ch = x => y => z => x & y ^ ~x & z
|
|
|
40
44
|
/** @type {(x: number) => (y: number) => (z: number) => number} */
|
|
41
45
|
const maj = x => y => z => x & y ^ x & z ^ y & z
|
|
42
46
|
|
|
43
|
-
/** @type {(
|
|
44
|
-
const shr =
|
|
47
|
+
/** @type {(d: number) => (n: number) => number} */
|
|
48
|
+
const shr = d => n => n >>> d
|
|
49
|
+
|
|
50
|
+
/** @type {(a: number) => (b: number) => (c: number) => (x: number) => number} */
|
|
51
|
+
const bigSigma = a => b => c => {
|
|
52
|
+
const ra = rotr(a)
|
|
53
|
+
const rb = rotr(b)
|
|
54
|
+
const rc = rotr(c)
|
|
55
|
+
return x => ra(x) ^ rb(x) ^ rc(x)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const bigSigma0 = bigSigma(2)(13)(22)
|
|
45
59
|
|
|
46
|
-
|
|
47
|
-
const bsig0 = x => rotr(x)(2) ^ rotr(x)(13) ^ rotr(x)(22)
|
|
60
|
+
const bigSigma1 = bigSigma(6)(11)(25)
|
|
48
61
|
|
|
49
|
-
/** @type {(x: number) => number} */
|
|
50
|
-
const
|
|
62
|
+
/** @type {(a: number) => (b: number) => (c: number) => (x: number) => number} */
|
|
63
|
+
const smallSigma = a => b => c => {
|
|
64
|
+
const ra = rotr(a)
|
|
65
|
+
const rb = rotr(b)
|
|
66
|
+
const sc = shr(c)
|
|
67
|
+
return x => ra(x) ^ rb(x) ^ sc(x)
|
|
68
|
+
}
|
|
51
69
|
|
|
52
|
-
|
|
53
|
-
const ssig0 = x => rotr(x)(7) ^ rotr(x)(18) ^ shr(x)(3)
|
|
70
|
+
const smallSigma0 = smallSigma(7)(18)(3)
|
|
54
71
|
|
|
55
|
-
|
|
56
|
-
const ssig1 = x => rotr(x)(17) ^ rotr(x)(19) ^ shr(x)(10)
|
|
72
|
+
const smallSigma1 = smallSigma(17)(19)(10)
|
|
57
73
|
|
|
58
74
|
/** @type {Hash8} */
|
|
59
75
|
const init256 = new Int32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19])
|
|
@@ -64,61 +80,53 @@ const computeSha256 = input => bitsCount => compute(input)(bitsCount)(init256)
|
|
|
64
80
|
/** @type {Hash8} */
|
|
65
81
|
const init224 = new Int32Array([0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4])
|
|
66
82
|
|
|
67
|
-
const k =
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
])
|
|
83
|
+
const k = [
|
|
84
|
+
new Int32Array([
|
|
85
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
86
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174]),
|
|
87
|
+
new Int32Array([
|
|
88
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
89
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967]),
|
|
90
|
+
new Int32Array([
|
|
91
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
92
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070]),
|
|
93
|
+
new Int32Array([
|
|
94
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
95
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]),
|
|
96
|
+
];
|
|
77
97
|
|
|
78
98
|
/** @type {(input: readonly number[]) => (bitsCount: number) => Hash8} */
|
|
79
99
|
const computeSha224 = input => bitsCount => compute(input)(bitsCount)(init224)
|
|
80
100
|
|
|
81
|
-
/** @type {(input:
|
|
82
|
-
const
|
|
83
|
-
{
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
let h2 = init[2]
|
|
89
|
-
let h3 = init[3]
|
|
90
|
-
let h4 = init[4]
|
|
91
|
-
let h5 = init[5]
|
|
92
|
-
let h6 = init[6]
|
|
93
|
-
let h7 = init[7]
|
|
94
|
-
|
|
95
|
-
const chunkCount = padded.length / 16
|
|
96
|
-
for(let i = 0; i < chunkCount; i++)
|
|
97
|
-
{
|
|
98
|
-
const w = new Int32Array(64)
|
|
99
|
-
for(let t = 0; t < 16; t++)
|
|
100
|
-
{
|
|
101
|
-
w[t] = padded.f(t + i * 16)
|
|
102
|
-
}
|
|
101
|
+
/** @type {(input: Array16) => Array16} */
|
|
102
|
+
const nextW = w => {
|
|
103
|
+
for (let t = 0; t < 16; t++) {
|
|
104
|
+
w[t] = smallSigma1(w[(t + 14) & 0xF]) + w[(t + 9) & 0xF] + smallSigma0(w[(t + 1) & 0xF]) + w[t]
|
|
105
|
+
}
|
|
106
|
+
return w
|
|
107
|
+
}
|
|
103
108
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
/** @type {(init: Hash8) => (data: Array16) => Hash8} */
|
|
110
|
+
const compress = init => data => {
|
|
111
|
+
let w = new Int32Array(16)
|
|
112
|
+
for (let t = 0; t < 16; t++) {
|
|
113
|
+
w[t] = data[t]
|
|
114
|
+
}
|
|
108
115
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
116
|
+
let a = init[0]
|
|
117
|
+
let b = init[1]
|
|
118
|
+
let c = init[2]
|
|
119
|
+
let d = init[3]
|
|
120
|
+
let e = init[4]
|
|
121
|
+
let f = init[5]
|
|
122
|
+
let g = init[6]
|
|
123
|
+
let h = init[7]
|
|
124
|
+
|
|
125
|
+
for (let i = 0; i < 4; ++i) {
|
|
126
|
+
const ki = k[i]
|
|
127
|
+
for (let j = 0; j < 16; ++j) {
|
|
128
|
+
const t1 = h + bigSigma1(e) + ch(e)(f)(g) + ki[j] + w[j]
|
|
129
|
+
const t2 = bigSigma0(a) + maj(a)(b)(c)
|
|
122
130
|
h = g
|
|
123
131
|
g = f
|
|
124
132
|
f = e
|
|
@@ -128,18 +136,36 @@ const compute = input => bitsCount => init =>
|
|
|
128
136
|
b = a
|
|
129
137
|
a = (t1 + t2) | 0
|
|
130
138
|
}
|
|
139
|
+
w = nextW(w)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return new Int32Array([
|
|
143
|
+
init[0] + a,
|
|
144
|
+
init[1] + b,
|
|
145
|
+
init[2] + c,
|
|
146
|
+
init[3] + d,
|
|
147
|
+
init[4] + e,
|
|
148
|
+
init[5] + f,
|
|
149
|
+
init[6] + g,
|
|
150
|
+
init[7] + h,
|
|
151
|
+
])
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** @type {(input: readonly number[]) => (bitsCount: number) => (init: Hash8) => Hash8} */
|
|
155
|
+
const compute = input => bitsCount => init => {
|
|
156
|
+
const { f, length } = padding(input)(bitsCount)
|
|
157
|
+
|
|
158
|
+
let result = init
|
|
131
159
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
h6 = (h6 + g) | 0
|
|
139
|
-
h7 = (h7 + h) | 0
|
|
160
|
+
const chunkCount = length / 16
|
|
161
|
+
for (let i = 0; i < chunkCount; i++) {
|
|
162
|
+
const s = i * 16
|
|
163
|
+
result = compress(result)(new Int32Array([
|
|
164
|
+
f(s + 0), f(s + 1), f(s + 2), f(s + 3), f(s + 4), f(s + 5), f(s + 6), f(s + 7),
|
|
165
|
+
f(s + 8), f(s + 9), f(s + 10), f(s + 11), f(s + 12), f(s + 13), f(s + 14), f(s + 15)]))
|
|
140
166
|
}
|
|
141
167
|
|
|
142
|
-
return
|
|
168
|
+
return result
|
|
143
169
|
}
|
|
144
170
|
|
|
145
171
|
module.exports = {
|