functionalscript 0.0.300 → 0.0.301
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 +39 -42
- package/sha2/test.js +10 -6
package/package.json
CHANGED
package/sha2/index.js
CHANGED
|
@@ -6,40 +6,40 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
* @typedef {
|
|
9
|
+
* @typedef {Int32Array} Hash8
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
/** @type
|
|
12
|
+
/** @type {(input: number) => (pos: number) => number} */
|
|
13
13
|
const appendOne = input => pos => input | (1 << 31 - pos)
|
|
14
14
|
|
|
15
|
-
/** @type
|
|
16
|
-
const
|
|
15
|
+
/** @type {(input: number) => (pos: number) => number} */
|
|
16
|
+
const mod = a => b => (a % b + b) % b
|
|
17
17
|
|
|
18
18
|
/** @type {(input: readonly number[]) => (bits: number) => HashInput} */
|
|
19
19
|
const padding = input => bitsCount =>
|
|
20
20
|
{
|
|
21
21
|
const appendBlockIndex = (bitsCount / 32) | 0
|
|
22
|
-
const length = (bitsCount +
|
|
22
|
+
const length = (bitsCount + mod(447 - bitsCount)(512) + 65) / 32
|
|
23
23
|
/** @type {(i: number) => number} */
|
|
24
24
|
const f = i =>
|
|
25
25
|
i < appendBlockIndex ?
|
|
26
26
|
input[i] :
|
|
27
27
|
i === appendBlockIndex ?
|
|
28
|
-
(appendBlockIndex >= input.length ?
|
|
29
|
-
i === length - 2 ? (bitsCount /
|
|
30
|
-
i === length - 1 ? bitsCount %
|
|
28
|
+
(appendBlockIndex >= input.length ? 0x8000_0000 : appendOne(input[appendBlockIndex])(bitsCount % 32)) :
|
|
29
|
+
i === length - 2 ? (bitsCount / 0x1_0000_0000) | 0 :
|
|
30
|
+
i === length - 1 ? bitsCount % 0x1_0000_0000 : 0
|
|
31
31
|
return ({f, length})
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
/** @type {(n: number) => (d: number) => number} */
|
|
35
|
+
const rotr = n => d => n >>> d | n << (32 - d)
|
|
36
|
+
|
|
34
37
|
/** @type {(x: number) => (y: number) => (z: number) => number} */
|
|
35
38
|
const ch = x => y => z => x & y ^ ~x & z
|
|
36
39
|
|
|
37
40
|
/** @type {(x: number) => (y: number) => (z: number) => number} */
|
|
38
41
|
const maj = x => y => z => x & y ^ x & z ^ y & z
|
|
39
42
|
|
|
40
|
-
/** @type {(n: number) => (d: number) => number} */
|
|
41
|
-
const rotr = n => d => n >>> d | n << (32-d)
|
|
42
|
-
|
|
43
43
|
/** @type {(n: number) => (d: number) => number} */
|
|
44
44
|
const shr = n => d => n >>> d
|
|
45
45
|
|
|
@@ -55,17 +55,25 @@ const ssig0 = x => rotr(x)(7) ^ rotr(x)(18) ^ shr(x)(3)
|
|
|
55
55
|
/** @type {(x: number) => number} */
|
|
56
56
|
const ssig1 = x => rotr(x)(17) ^ rotr(x)(19) ^ shr(x)(10)
|
|
57
57
|
|
|
58
|
-
/** @type {(x: number) => number} */
|
|
59
|
-
const mod2pow32 = x => x % 0x100000000
|
|
60
|
-
|
|
61
58
|
/** @type {Hash8} */
|
|
62
|
-
const init256 = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]
|
|
59
|
+
const init256 = new Int32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19])
|
|
63
60
|
|
|
64
61
|
/** @type {(input: readonly number[]) => (bitsCount: number) => Hash8} */
|
|
65
62
|
const computeSha256 = input => bitsCount => compute(input)(bitsCount)(init256)
|
|
66
63
|
|
|
67
64
|
/** @type {Hash8} */
|
|
68
|
-
const init224 = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4]
|
|
65
|
+
const init224 = new Int32Array([0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4])
|
|
66
|
+
|
|
67
|
+
const k = new Int32Array([
|
|
68
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
69
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
70
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
71
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
72
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
73
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
74
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
75
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
76
|
+
]);
|
|
69
77
|
|
|
70
78
|
/** @type {(input: readonly number[]) => (bitsCount: number) => Hash8} */
|
|
71
79
|
const computeSha224 = input => bitsCount => compute(input)(bitsCount)(init224)
|
|
@@ -84,21 +92,10 @@ const compute = input => bitsCount => init =>
|
|
|
84
92
|
let h6 = init[6]
|
|
85
93
|
let h7 = init[7]
|
|
86
94
|
|
|
87
|
-
const k = [
|
|
88
|
-
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
89
|
-
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
90
|
-
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
91
|
-
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
92
|
-
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
93
|
-
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
94
|
-
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
95
|
-
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
96
|
-
];
|
|
97
|
-
|
|
98
|
-
let w = new Array(64)
|
|
99
95
|
const chunkCount = padded.length / 16
|
|
100
96
|
for(let i = 0; i < chunkCount; i++)
|
|
101
97
|
{
|
|
98
|
+
const w = new Int32Array(64)
|
|
102
99
|
for(let t = 0; t < 16; t++)
|
|
103
100
|
{
|
|
104
101
|
w[t] = padded.f(t + i * 16)
|
|
@@ -106,7 +103,7 @@ const compute = input => bitsCount => init =>
|
|
|
106
103
|
|
|
107
104
|
for(let t = 16; t < 64; t++)
|
|
108
105
|
{
|
|
109
|
-
w[t] =
|
|
106
|
+
w[t] = (ssig1(w[t - 2]) + w[t - 7] + ssig0(w[t-15]) + w[t - 16]) | 0
|
|
110
107
|
}
|
|
111
108
|
|
|
112
109
|
let a = h0
|
|
@@ -120,29 +117,29 @@ const compute = input => bitsCount => init =>
|
|
|
120
117
|
|
|
121
118
|
for(let t = 0; t < 64; t++)
|
|
122
119
|
{
|
|
123
|
-
let t1 =
|
|
124
|
-
let t2 =
|
|
120
|
+
let t1 = (h + bsig1(e) + ch(e)(f)(g) + k[t] + w[t]) | 0
|
|
121
|
+
let t2 = (bsig0(a) + maj(a)(b)(c)) | 0
|
|
125
122
|
h = g
|
|
126
123
|
g = f
|
|
127
124
|
f = e
|
|
128
|
-
e =
|
|
125
|
+
e = (d + t1) | 0
|
|
129
126
|
d = c
|
|
130
127
|
c = b
|
|
131
128
|
b = a
|
|
132
|
-
a =
|
|
129
|
+
a = (t1 + t2) | 0
|
|
133
130
|
}
|
|
134
131
|
|
|
135
|
-
h0 =
|
|
136
|
-
h1 =
|
|
137
|
-
h2 =
|
|
138
|
-
h3 =
|
|
139
|
-
h4 =
|
|
140
|
-
h5 =
|
|
141
|
-
h6 =
|
|
142
|
-
h7 =
|
|
132
|
+
h0 = (h0 + a) | 0
|
|
133
|
+
h1 = (h1 + b) | 0
|
|
134
|
+
h2 = (h2 + c) | 0
|
|
135
|
+
h3 = (h3 + d) | 0
|
|
136
|
+
h4 = (h4 + e) | 0
|
|
137
|
+
h5 = (h5 + f) | 0
|
|
138
|
+
h6 = (h6 + g) | 0
|
|
139
|
+
h7 = (h7 + h) | 0
|
|
143
140
|
}
|
|
144
141
|
|
|
145
|
-
return [h0, h1, h2, h3, h4, h5, h6, h7]
|
|
142
|
+
return new Int32Array([h0, h1, h2, h3, h4, h5, h6, h7])
|
|
146
143
|
}
|
|
147
144
|
|
|
148
145
|
module.exports = {
|
package/sha2/test.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
const _ = require('.')
|
|
2
2
|
const json = require('../json')
|
|
3
3
|
const { sort } = require('../types/object')
|
|
4
|
+
const list = require('../types/list')
|
|
5
|
+
|
|
6
|
+
/** @type {(a: number) => number} */
|
|
7
|
+
const toU32 = x => (x + 0x1_0000_0000) % 0x1_0000_0000
|
|
4
8
|
|
|
5
9
|
/** @type {(a: number) => string} */
|
|
6
|
-
const toHexString = x =>
|
|
10
|
+
const toHexString = x => toU32(x).toString(16).padStart(8, '0')
|
|
7
11
|
|
|
8
12
|
/** @type {(a: readonly json.Unknown[]) => string} */
|
|
9
13
|
const stringify = a => json.stringify(sort)(a)
|
|
@@ -30,33 +34,33 @@ const stringify = a => json.stringify(sort)(a)
|
|
|
30
34
|
|
|
31
35
|
{
|
|
32
36
|
const hash = _.computeSha256([])(0)
|
|
33
|
-
const result = stringify(hash.map(toHexString))
|
|
37
|
+
const result = stringify(Array.from(hash).map(toHexString))
|
|
34
38
|
if (result !== '["e3b0c442","98fc1c14","9afbf4c8","996fb924","27ae41e4","649b934c","a495991b","7852b855"]') { throw result }
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
{
|
|
38
42
|
const hash = _.computeSha224([])(0)
|
|
39
|
-
const result = stringify(hash.map(toHexString))
|
|
43
|
+
const result = stringify(Array.from(hash).map(toHexString))
|
|
40
44
|
if (result !== '["d14a028c","2a3a2bc9","476102bb","288234c4","15a2b01f","828ea62a","c5b3e42f","bdd387cb"]') { throw result }
|
|
41
45
|
}
|
|
42
46
|
|
|
43
47
|
{
|
|
44
48
|
//[0x68656C6C, 0x6F20776F, 0x726C6400] represents phrase 'hello world'
|
|
45
49
|
const hash = _.computeSha256([0x68656C6C, 0x6F20776F, 0x726C6400])(88)
|
|
46
|
-
const result = stringify(hash.map(toHexString))
|
|
50
|
+
const result = stringify(Array.from(hash).map(toHexString))
|
|
47
51
|
if (result !== '["b94d27b9","934d3e08","a52e52d7","da7dabfa","c484efe3","7a5380ee","9088f7ac","e2efcde9"]') { throw result }
|
|
48
52
|
}
|
|
49
53
|
|
|
50
54
|
{
|
|
51
55
|
const input = Array(8).fill(0x31313131)
|
|
52
56
|
const result = _.computeSha256(input)(256)
|
|
53
|
-
if (result[0] !== 0x8a83665f) { throw result[0] }
|
|
57
|
+
if (toU32(result[0]) !== 0x8a83665f) { throw result[0] }
|
|
54
58
|
}
|
|
55
59
|
|
|
56
60
|
{
|
|
57
61
|
const input = Array(16).fill(0x31313131)
|
|
58
62
|
const hash = _.computeSha256(input)(512)
|
|
59
|
-
const result = stringify(hash.map(toHexString))
|
|
63
|
+
const result = stringify(Array.from(hash).map(toHexString))
|
|
60
64
|
if (result !== '["3138bb9b","c78df27c","473ecfd1","410f7bd4","5ebac1f5","9cf3ff9c","fe4db77a","ab7aedd3"]') { throw result }
|
|
61
65
|
}
|
|
62
66
|
|