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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/sha2/index.js +104 -78
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functionalscript",
3
- "version": "0.0.301",
3
+ "version": "0.0.302",
4
4
  "description": "FunctionalScript is a functional subset of JavaScript",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/sha2/index.js CHANGED
@@ -5,9 +5,9 @@
5
5
  * }} HashInput
6
6
  */
7
7
 
8
- /**
9
- * @typedef {Int32Array} Hash8
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 ? (bitsCount / 0x1_0000_0000) | 0 :
30
- i === length - 1 ? bitsCount % 0x1_0000_0000 : 0
31
- return ({f, length})
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 {(n: number) => (d: number) => number} */
35
- const rotr = n => d => n >>> d | n << (32 - d)
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 {(n: number) => (d: number) => number} */
44
- const shr = n => d => n >>> d
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
- /** @type {(x: number) => number} */
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 bsig1 = x => rotr(x)(6) ^ rotr(x)(11) ^ rotr(x)(25)
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
- /** @type {(x: number) => number} */
53
- const ssig0 = x => rotr(x)(7) ^ rotr(x)(18) ^ shr(x)(3)
70
+ const smallSigma0 = smallSigma(7)(18)(3)
54
71
 
55
- /** @type {(x: number) => number} */
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 = 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
- ]);
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: readonly number[]) => (bitsCount: number) => (init: Hash8) => Hash8} */
82
- const compute = input => bitsCount => init =>
83
- {
84
- const padded = padding(input)(bitsCount)
85
-
86
- let h0 = init[0]
87
- let h1 = init[1]
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
- 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
- }
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
- let a = h0
110
- let b = h1
111
- let c = h2
112
- let d = h3
113
- let e = h4
114
- let f = h5
115
- let g = h6
116
- let h = h7
117
-
118
- for(let t = 0; t < 64; t++)
119
- {
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
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
- 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
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 new Int32Array([h0, h1, h2, h3, h4, h5, h6, h7])
168
+ return result
143
169
  }
144
170
 
145
171
  module.exports = {