functionalscript 0.0.301 → 0.0.305
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 +125 -84
- package/sha2/test.js +11 -4
- package/types/array/index.js +12 -0
package/package.json
CHANGED
package/sha2/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const array = require('../types/array')
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* @typedef {{
|
|
3
5
|
* readonly f: (i: number) => number
|
|
@@ -5,19 +7,18 @@
|
|
|
5
7
|
* }} HashInput
|
|
6
8
|
*/
|
|
7
9
|
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
*/
|
|
10
|
+
/** @typedef {array.Array8<number>} Hash8 */
|
|
11
|
+
|
|
12
|
+
/** @typedef {array.Array16<number>} Array16 */
|
|
11
13
|
|
|
12
14
|
/** @type {(input: number) => (pos: number) => number} */
|
|
13
|
-
const
|
|
15
|
+
const appendOneWithZeros = input => pos => (input >> pos << pos) | (1 << pos)
|
|
14
16
|
|
|
15
17
|
/** @type {(input: number) => (pos: number) => number} */
|
|
16
18
|
const mod = a => b => (a % b + b) % b
|
|
17
19
|
|
|
18
20
|
/** @type {(input: readonly number[]) => (bits: number) => HashInput} */
|
|
19
|
-
const padding = input => bitsCount =>
|
|
20
|
-
{
|
|
21
|
+
const padding = input => bitsCount => {
|
|
21
22
|
const appendBlockIndex = (bitsCount / 32) | 0
|
|
22
23
|
const length = (bitsCount + mod(447 - bitsCount)(512) + 65) / 32
|
|
23
24
|
/** @type {(i: number) => number} */
|
|
@@ -25,14 +26,19 @@ const padding = input => bitsCount =>
|
|
|
25
26
|
i < appendBlockIndex ?
|
|
26
27
|
input[i] :
|
|
27
28
|
i === appendBlockIndex ?
|
|
28
|
-
(appendBlockIndex >= input.length ? 0x8000_0000 :
|
|
29
|
-
i === length - 2 ?
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
(appendBlockIndex >= input.length ? 0x8000_0000 : appendOneWithZeros(input[appendBlockIndex])(31 - bitsCount % 32)) :
|
|
30
|
+
i === length - 2 ?
|
|
31
|
+
(bitsCount / 0x1_0000_0000) | 0 :
|
|
32
|
+
i === length - 1 ?
|
|
33
|
+
bitsCount % 0x1_0000_0000 : 0
|
|
34
|
+
return ({ f, length })
|
|
32
35
|
}
|
|
33
36
|
|
|
34
|
-
/** @type {(
|
|
35
|
-
const rotr =
|
|
37
|
+
/** @type {(d: number) => (n: number) => number} */
|
|
38
|
+
const rotr = d => {
|
|
39
|
+
const r = 32 - d
|
|
40
|
+
return n => n >>> d | n << r
|
|
41
|
+
}
|
|
36
42
|
|
|
37
43
|
/** @type {(x: number) => (y: number) => (z: number) => number} */
|
|
38
44
|
const ch = x => y => z => x & y ^ ~x & z
|
|
@@ -40,85 +46,102 @@ const ch = x => y => z => x & y ^ ~x & z
|
|
|
40
46
|
/** @type {(x: number) => (y: number) => (z: number) => number} */
|
|
41
47
|
const maj = x => y => z => x & y ^ x & z ^ y & z
|
|
42
48
|
|
|
43
|
-
/** @type {(
|
|
44
|
-
const shr =
|
|
49
|
+
/** @type {(d: number) => (n: number) => number} */
|
|
50
|
+
const shr = d => n => n >>> d
|
|
45
51
|
|
|
46
|
-
/** @type {(x: number) => number} */
|
|
47
|
-
const
|
|
52
|
+
/** @type {(a: number) => (b: number) => (c: number) => (x: number) => number} */
|
|
53
|
+
const bigSigma = a => b => c => {
|
|
54
|
+
const ra = rotr(a)
|
|
55
|
+
const rb = rotr(b)
|
|
56
|
+
const rc = rotr(c)
|
|
57
|
+
return x => ra(x) ^ rb(x) ^ rc(x)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const bigSigma0 = bigSigma(2)(13)(22)
|
|
48
61
|
|
|
49
|
-
|
|
50
|
-
const bsig1 = x => rotr(x)(6) ^ rotr(x)(11) ^ rotr(x)(25)
|
|
62
|
+
const bigSigma1 = bigSigma(6)(11)(25)
|
|
51
63
|
|
|
52
|
-
/** @type {(x: number) => number} */
|
|
53
|
-
const
|
|
64
|
+
/** @type {(a: number) => (b: number) => (c: number) => (x: number) => number} */
|
|
65
|
+
const smallSigma = a => b => c => {
|
|
66
|
+
const ra = rotr(a)
|
|
67
|
+
const rb = rotr(b)
|
|
68
|
+
const sc = shr(c)
|
|
69
|
+
return x => ra(x) ^ rb(x) ^ sc(x)
|
|
70
|
+
}
|
|
54
71
|
|
|
55
|
-
|
|
56
|
-
|
|
72
|
+
const smallSigma0 = smallSigma(7)(18)(3)
|
|
73
|
+
|
|
74
|
+
const smallSigma1 = smallSigma(17)(19)(10)
|
|
57
75
|
|
|
58
76
|
/** @type {Hash8} */
|
|
59
|
-
const init256 =
|
|
77
|
+
const init256 = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]
|
|
60
78
|
|
|
61
79
|
/** @type {(input: readonly number[]) => (bitsCount: number) => Hash8} */
|
|
62
80
|
const computeSha256 = input => bitsCount => compute(input)(bitsCount)(init256)
|
|
63
81
|
|
|
64
82
|
/** @type {Hash8} */
|
|
65
|
-
const init224 =
|
|
66
|
-
|
|
67
|
-
const k =
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
]
|
|
83
|
+
const init224 = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4]
|
|
84
|
+
|
|
85
|
+
const k = [
|
|
86
|
+
[
|
|
87
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
88
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174],
|
|
89
|
+
[
|
|
90
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
91
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967],
|
|
92
|
+
[
|
|
93
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
94
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070],
|
|
95
|
+
[
|
|
96
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
97
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2],
|
|
98
|
+
];
|
|
77
99
|
|
|
78
100
|
/** @type {(input: readonly number[]) => (bitsCount: number) => Hash8} */
|
|
79
101
|
const computeSha224 = input => bitsCount => compute(input)(bitsCount)(init224)
|
|
80
102
|
|
|
81
|
-
/** @type {(
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
for(let t = 16; t < 64; t++)
|
|
105
|
-
{
|
|
106
|
-
w[t] = (ssig1(w[t - 2]) + w[t - 7] + ssig0(w[t-15]) + w[t - 16]) | 0
|
|
107
|
-
}
|
|
103
|
+
/** @type {(a: array.Array4<number>) => number} */
|
|
104
|
+
const wi = a => (smallSigma1(a[0]) + a[1] + smallSigma0(a[2]) + a[3]) | 0
|
|
105
|
+
|
|
106
|
+
/** @type {(input: Array16) => Array16} */
|
|
107
|
+
const nextW = w => {
|
|
108
|
+
const _0 = wi([w[14], w[ 9], w[ 1], w[ 0]])
|
|
109
|
+
const _1 = wi([w[15], w[10], w[ 2], w[ 1]])
|
|
110
|
+
const _2 = wi([ _0, w[11], w[ 3], w[ 2]])
|
|
111
|
+
const _3 = wi([ _1, w[12], w[ 4], w[ 3]])
|
|
112
|
+
const _4 = wi([ _2, w[13], w[ 5], w[ 4]])
|
|
113
|
+
const _5 = wi([ _3, w[14], w[ 6], w[ 5]])
|
|
114
|
+
const _6 = wi([ _4, w[15], w[ 7], w[ 6]])
|
|
115
|
+
const _7 = wi([ _5, _0, w[ 8], w[ 7]])
|
|
116
|
+
const _8 = wi([ _6, _1, w[ 9], w[ 8]])
|
|
117
|
+
const _9 = wi([ _7, _2, w[10], w[ 9]])
|
|
118
|
+
const _A = wi([ _8, _3, w[11], w[10]])
|
|
119
|
+
const _B = wi([ _9, _4, w[12], w[11]])
|
|
120
|
+
const _C = wi([ _A, _5, w[13], w[12]])
|
|
121
|
+
const _D = wi([ _B, _6, w[14], w[13]])
|
|
122
|
+
const _E = wi([ _C, _7, w[15], w[14]])
|
|
123
|
+
const _F = wi([ _D, _8, _0, w[15]])
|
|
124
|
+
return [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _A, _B, _C, _D, _E, _F]
|
|
125
|
+
}
|
|
108
126
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
127
|
+
/** @type {(init: Hash8) => (data: Array16) => Hash8} */
|
|
128
|
+
const compress = init => data => {
|
|
129
|
+
let w = data
|
|
130
|
+
|
|
131
|
+
let a = init[0]
|
|
132
|
+
let b = init[1]
|
|
133
|
+
let c = init[2]
|
|
134
|
+
let d = init[3]
|
|
135
|
+
let e = init[4]
|
|
136
|
+
let f = init[5]
|
|
137
|
+
let g = init[6]
|
|
138
|
+
let h = init[7]
|
|
139
|
+
|
|
140
|
+
for (let i = 0; i < 4; ++i) {
|
|
141
|
+
const ki = k[i]
|
|
142
|
+
for (let j = 0; j < 16; ++j) {
|
|
143
|
+
const t1 = h + bigSigma1(e) + ch(e)(f)(g) + ki[j] + w[j]
|
|
144
|
+
const t2 = bigSigma0(a) + maj(a)(b)(c)
|
|
122
145
|
h = g
|
|
123
146
|
g = f
|
|
124
147
|
f = e
|
|
@@ -128,18 +151,36 @@ const compute = input => bitsCount => init =>
|
|
|
128
151
|
b = a
|
|
129
152
|
a = (t1 + t2) | 0
|
|
130
153
|
}
|
|
154
|
+
w = nextW(w)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return [
|
|
158
|
+
(init[0] + a) | 0,
|
|
159
|
+
(init[1] + b) | 0,
|
|
160
|
+
(init[2] + c) | 0,
|
|
161
|
+
(init[3] + d) | 0,
|
|
162
|
+
(init[4] + e) | 0,
|
|
163
|
+
(init[5] + f) | 0,
|
|
164
|
+
(init[6] + g) | 0,
|
|
165
|
+
(init[7] + h) | 0,
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** @type {(input: readonly number[]) => (bitsCount: number) => (init: Hash8) => Hash8} */
|
|
170
|
+
const compute = input => bitsCount => init => {
|
|
171
|
+
const { f, length } = padding(input)(bitsCount)
|
|
172
|
+
|
|
173
|
+
let result = init
|
|
131
174
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
h6 = (h6 + g) | 0
|
|
139
|
-
h7 = (h7 + h) | 0
|
|
175
|
+
const chunkCount = length / 16
|
|
176
|
+
for (let i = 0; i < chunkCount; i++) {
|
|
177
|
+
const s = i * 16
|
|
178
|
+
result = compress(result)([
|
|
179
|
+
f(s + 0), f(s + 1), f(s + 2), f(s + 3), f(s + 4), f(s + 5), f(s + 6), f(s + 7),
|
|
180
|
+
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
181
|
}
|
|
141
182
|
|
|
142
|
-
return
|
|
183
|
+
return result
|
|
143
184
|
}
|
|
144
185
|
|
|
145
186
|
module.exports = {
|
package/sha2/test.js
CHANGED
|
@@ -34,20 +34,27 @@ const stringify = a => json.stringify(sort)(a)
|
|
|
34
34
|
|
|
35
35
|
{
|
|
36
36
|
const hash = _.computeSha256([])(0)
|
|
37
|
-
const result = stringify(
|
|
37
|
+
const result = stringify(hash.map(toHexString))
|
|
38
38
|
if (result !== '["e3b0c442","98fc1c14","9afbf4c8","996fb924","27ae41e4","649b934c","a495991b","7852b855"]') { throw result }
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
{
|
|
42
42
|
const hash = _.computeSha224([])(0)
|
|
43
|
-
const result = stringify(
|
|
43
|
+
const result = stringify(hash.map(toHexString))
|
|
44
44
|
if (result !== '["d14a028c","2a3a2bc9","476102bb","288234c4","15a2b01f","828ea62a","c5b3e42f","bdd387cb"]') { throw result }
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
{
|
|
48
48
|
//[0x68656C6C, 0x6F20776F, 0x726C6400] represents phrase 'hello world'
|
|
49
49
|
const hash = _.computeSha256([0x68656C6C, 0x6F20776F, 0x726C6400])(88)
|
|
50
|
-
const result = stringify(
|
|
50
|
+
const result = stringify(hash.map(toHexString))
|
|
51
|
+
if (result !== '["b94d27b9","934d3e08","a52e52d7","da7dabfa","c484efe3","7a5380ee","9088f7ac","e2efcde9"]') { throw result }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
{
|
|
55
|
+
//[0x68656C6C, 0x6F20776F, 0x726C6488] represents phrase 'hello world' with 1's at the end
|
|
56
|
+
const hash = _.computeSha256([0x68656C6C, 0x6F20776F, 0x726C64FF])(88)
|
|
57
|
+
const result = stringify(hash.map(toHexString))
|
|
51
58
|
if (result !== '["b94d27b9","934d3e08","a52e52d7","da7dabfa","c484efe3","7a5380ee","9088f7ac","e2efcde9"]') { throw result }
|
|
52
59
|
}
|
|
53
60
|
|
|
@@ -60,7 +67,7 @@ const stringify = a => json.stringify(sort)(a)
|
|
|
60
67
|
{
|
|
61
68
|
const input = Array(16).fill(0x31313131)
|
|
62
69
|
const hash = _.computeSha256(input)(512)
|
|
63
|
-
const result = stringify(
|
|
70
|
+
const result = stringify(hash.map(toHexString))
|
|
64
71
|
if (result !== '["3138bb9b","c78df27c","473ecfd1","410f7bd4","5ebac1f5","9cf3ff9c","fe4db77a","ab7aedd3"]') { throw result }
|
|
65
72
|
}
|
|
66
73
|
|
package/types/array/index.js
CHANGED
|
@@ -47,6 +47,18 @@ const seq = require('../list')
|
|
|
47
47
|
* @typedef {readonly[T, T, T, T, T]} Array5
|
|
48
48
|
*/
|
|
49
49
|
|
|
50
|
+
/**
|
|
51
|
+
* @template T
|
|
52
|
+
* @typedef {readonly[T, T, T, T, T, T, T, T]} Array8
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @template T
|
|
57
|
+
* @typedef {readonly[T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T]} Array16
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
/** @typedef {0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15} Index16 */
|
|
61
|
+
|
|
50
62
|
/**
|
|
51
63
|
* @template T
|
|
52
64
|
* @typedef {Array1<T>| Array2<T> | Array3<T> | Array4<T> | Array5<T>} Array1_5
|