functionalscript 0.0.303 → 0.0.304
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 +47 -32
- package/sha2/test.js +4 -4
- package/types/array/index.js +2 -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,9 +7,9 @@
|
|
|
5
7
|
* }} HashInput
|
|
6
8
|
*/
|
|
7
9
|
|
|
8
|
-
/** @typedef {
|
|
10
|
+
/** @typedef {array.Array8<number>} Hash8 */
|
|
9
11
|
|
|
10
|
-
/** @typedef {
|
|
12
|
+
/** @typedef {array.Array16<number>} Array16 */
|
|
11
13
|
|
|
12
14
|
/** @type {(input: number) => (pos: number) => number} */
|
|
13
15
|
const appendOne = input => pos => input | (1 << 31 - pos)
|
|
@@ -72,46 +74,59 @@ const smallSigma0 = smallSigma(7)(18)(3)
|
|
|
72
74
|
const smallSigma1 = smallSigma(17)(19)(10)
|
|
73
75
|
|
|
74
76
|
/** @type {Hash8} */
|
|
75
|
-
const init256 =
|
|
77
|
+
const init256 = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]
|
|
76
78
|
|
|
77
79
|
/** @type {(input: readonly number[]) => (bitsCount: number) => Hash8} */
|
|
78
80
|
const computeSha256 = input => bitsCount => compute(input)(bitsCount)(init256)
|
|
79
81
|
|
|
80
82
|
/** @type {Hash8} */
|
|
81
|
-
const init224 =
|
|
83
|
+
const init224 = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4]
|
|
82
84
|
|
|
83
85
|
const k = [
|
|
84
|
-
|
|
86
|
+
[
|
|
85
87
|
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
86
|
-
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174]
|
|
87
|
-
|
|
88
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174],
|
|
89
|
+
[
|
|
88
90
|
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
89
|
-
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967]
|
|
90
|
-
|
|
91
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967],
|
|
92
|
+
[
|
|
91
93
|
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
92
|
-
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070]
|
|
93
|
-
|
|
94
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070],
|
|
95
|
+
[
|
|
94
96
|
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
95
|
-
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]
|
|
97
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2],
|
|
96
98
|
];
|
|
97
99
|
|
|
98
100
|
/** @type {(input: readonly number[]) => (bitsCount: number) => Hash8} */
|
|
99
101
|
const computeSha224 = input => bitsCount => compute(input)(bitsCount)(init224)
|
|
100
102
|
|
|
103
|
+
/** @type {(a: array.Array4<number>) => number} */
|
|
104
|
+
const wi = a => (smallSigma1(a[0]) + a[1] + smallSigma0(a[2]) + a[3]) | 0
|
|
105
|
+
|
|
101
106
|
/** @type {(input: Array16) => Array16} */
|
|
102
107
|
const nextW = w => {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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]
|
|
107
125
|
}
|
|
108
126
|
|
|
109
127
|
/** @type {(init: Hash8) => (data: Array16) => Hash8} */
|
|
110
128
|
const compress = init => data => {
|
|
111
|
-
let w =
|
|
112
|
-
for (let t = 0; t < 16; t++) {
|
|
113
|
-
w[t] = data[t]
|
|
114
|
-
}
|
|
129
|
+
let w = data
|
|
115
130
|
|
|
116
131
|
let a = init[0]
|
|
117
132
|
let b = init[1]
|
|
@@ -139,16 +154,16 @@ const compress = init => data => {
|
|
|
139
154
|
w = nextW(w)
|
|
140
155
|
}
|
|
141
156
|
|
|
142
|
-
return
|
|
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
|
-
]
|
|
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
|
+
]
|
|
152
167
|
}
|
|
153
168
|
|
|
154
169
|
/** @type {(input: readonly number[]) => (bitsCount: number) => (init: Hash8) => Hash8} */
|
|
@@ -160,9 +175,9 @@ const compute = input => bitsCount => init => {
|
|
|
160
175
|
const chunkCount = length / 16
|
|
161
176
|
for (let i = 0; i < chunkCount; i++) {
|
|
162
177
|
const s = i * 16
|
|
163
|
-
result = compress(result)(
|
|
178
|
+
result = compress(result)([
|
|
164
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),
|
|
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)])
|
|
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)])
|
|
166
181
|
}
|
|
167
182
|
|
|
168
183
|
return result
|
package/sha2/test.js
CHANGED
|
@@ -34,20 +34,20 @@ 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
51
|
if (result !== '["b94d27b9","934d3e08","a52e52d7","da7dabfa","c484efe3","7a5380ee","9088f7ac","e2efcde9"]') { throw result }
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -60,7 +60,7 @@ const stringify = a => json.stringify(sort)(a)
|
|
|
60
60
|
{
|
|
61
61
|
const input = Array(16).fill(0x31313131)
|
|
62
62
|
const hash = _.computeSha256(input)(512)
|
|
63
|
-
const result = stringify(
|
|
63
|
+
const result = stringify(hash.map(toHexString))
|
|
64
64
|
if (result !== '["3138bb9b","c78df27c","473ecfd1","410f7bd4","5ebac1f5","9cf3ff9c","fe4db77a","ab7aedd3"]') { throw result }
|
|
65
65
|
}
|
|
66
66
|
|
package/types/array/index.js
CHANGED
|
@@ -57,6 +57,8 @@ const seq = require('../list')
|
|
|
57
57
|
* @typedef {readonly[T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T]} Array16
|
|
58
58
|
*/
|
|
59
59
|
|
|
60
|
+
/** @typedef {0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15} Index16 */
|
|
61
|
+
|
|
60
62
|
/**
|
|
61
63
|
* @template T
|
|
62
64
|
* @typedef {Array1<T>| Array2<T> | Array3<T> | Array4<T> | Array5<T>} Array1_5
|