openttt 0.1.1 → 0.1.2

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/LICENSE ADDED
@@ -0,0 +1,48 @@
1
+ Business Source License 1.1
2
+
3
+ Parameters
4
+
5
+ Licensor: Helm Protocol Foundation
6
+ Licensed Work: TikitakaTime SDK v0.1.0 (OpenTTT)
7
+ Additional Use
8
+ Grant: Non-production evaluation and testing.
9
+ Change Date: March 14, 2030
10
+ Change License: Apache License, Version 2.0
11
+
12
+ 1. Grant of License. Licensor hereby grants you a world-wide, royalty-free,
13
+ non-exclusive, non-sublicensable, non-transferable license to use the
14
+ Licensed Work, subject to the conditions set forth in this License.
15
+
16
+ 2. Conditions. You may use the Licensed Work for any purpose, except for
17
+ Commercial Use.
18
+
19
+ 3. Commercial Use. Commercial Use means any use of the Licensed Work that is
20
+ intended for or directed toward commercial advantage or monetary
21
+ compensation.
22
+
23
+ 4. Change. On the Change Date, this License shall terminate and the Licensor
24
+ hereby grants you a license to the Licensed Work under the Change License.
25
+
26
+ 5. Intellectual Property. This License does not grant you any rights in the
27
+ Intellectual Property of the Licensor, except for the license to use the
28
+ Licensed Work as set forth in Section 1.
29
+
30
+ 6. Termination. This License shall terminate automatically if you fail to
31
+ comply with any of its terms and conditions.
32
+
33
+ 7. Disclaimer of Warranty. THE LICENSED WORK IS PROVIDED "AS IS", WITHOUT
34
+ WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
35
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
36
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
37
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
38
+ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
39
+ LICENSED WORK OR THE USE OR OTHER DEALINGS IN THE LICENSED WORK.
40
+
41
+ 8. Limitation of Liability. IN NO EVENT SHALL THE LICENSOR BE LIABLE FOR ANY
42
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
43
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
44
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
45
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
46
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
47
+ OUT OF THE USE OF THE LICENSED WORK, EVEN IF ADVISED OF THE POSSIBILITY OF
48
+ SUCH DAMAGE.
package/README.md CHANGED
@@ -1,12 +1,16 @@
1
1
  # OpenTTT
2
2
 
3
+ > **Reference implementation of [draft-helmprotocol-tttps-00](https://datatracker.ietf.org/doc/draft-helmprotocol-tttps/)**
4
+
3
5
  **OpenSSL for Transaction Ordering** -- TLS-grade Proof of Time for DeFi.
4
6
 
5
7
  OpenTTT brings cryptographic time verification to blockchain transaction ordering. Where TLS made HTTP trustworthy, OpenTTT makes transaction sequencing verifiable. No trust assumptions. No gentleman's agreements. Physics.
6
8
 
7
9
  [![npm](https://img.shields.io/npm/v/openttt)](https://www.npmjs.com/package/openttt)
8
10
  [![License: BSL-1.1](https://img.shields.io/badge/License-BSL--1.1-blue.svg)](LICENSE)
9
- [![Tests](https://img.shields.io/badge/tests-104%20passing%20%C2%B7%2018%20suites-brightgreen)]()
11
+ [![CI](https://github.com/Helm-Protocol/OpenTTT/actions/workflows/ci.yml/badge.svg)](https://github.com/Helm-Protocol/OpenTTT/actions/workflows/ci.yml)
12
+ [![codecov](https://codecov.io/gh/Helm-Protocol/OpenTTT/branch/main/graph/badge.svg)](https://codecov.io/gh/Helm-Protocol/OpenTTT)
13
+ [![Tests](https://img.shields.io/badge/tests-273%20passing%20%C2%B7%2029%20suites-brightgreen)]()
10
14
 
11
15
  ```
12
16
  npm install openttt
@@ -41,14 +45,14 @@ Three lines to start minting TimeTokens:
41
45
  ```typescript
42
46
  import { TTTClient } from "openttt";
43
47
 
44
- const ttt = await TTTClient.forBase({
45
- signer: { type: "privateKey", envVar: "OPERATOR_PK" },
46
- });
48
+ const ttt = await TTTClient.forBase({ privateKey: process.env.OPERATOR_PK! });
47
49
  ttt.startAutoMint();
48
50
  ```
49
51
 
50
52
  That is it. The SDK connects to Base Mainnet, synthesizes time from three atomic clock sources, and begins minting Proof-of-Time tokens at your configured tier interval.
51
53
 
54
+ > **Shorthand**: Pass `privateKey` directly as a string instead of the full `signer` config object. The verbose form `{ signer: { type: "privateKey", key: "0x..." } }` still works for when you need other signer types (Turnkey, KMS, Privy).
55
+
52
56
  ---
53
57
 
54
58
  ## Progressive Disclosure
@@ -60,9 +64,7 @@ OpenTTT is designed around progressive disclosure. Start simple, add control as
60
64
  ```typescript
61
65
  import { TTTClient } from "openttt";
62
66
 
63
- const ttt = await TTTClient.forBase({
64
- signer: { type: "privateKey", envVar: "OPERATOR_PK" },
65
- });
67
+ const ttt = await TTTClient.forBase({ privateKey: process.env.OPERATOR_PK! });
66
68
  ttt.startAutoMint();
67
69
  ```
68
70
 
@@ -70,7 +72,7 @@ ttt.startAutoMint();
70
72
 
71
73
  ```typescript
72
74
  const ttt = await TTTClient.forSepolia({
73
- signer: { type: "privateKey", key: process.env.OPERATOR_PK! },
75
+ privateKey: process.env.OPERATOR_PK!,
74
76
  rpcUrl: "https://my-rpc.example.com",
75
77
  tier: "T2_slot",
76
78
  });
@@ -111,7 +113,7 @@ OpenTTT abstracts away signer complexity. Use a raw private key for development,
111
113
  |---|---|---|
112
114
  | `privateKey` | Development, small operators | `{ type: "privateKey", key: "0x..." }` or `{ type: "privateKey", envVar: "OPERATOR_PK" }` |
113
115
  | `turnkey` | Production, TEE-backed institutional custody | `{ type: "turnkey", apiBaseUrl, organizationId, privateKeyId, apiPublicKey, apiPrivateKey }` |
114
- | `privy` | Embedded wallets, consumer-facing apps | `{ type: "privy", appId, appSecret }` |
116
+ | `privy` | Embedded wallets, consumer-facing apps (coming soon) | `{ type: "privy", appId, appSecret }` |
115
117
  | `kms` | Cloud HSM (AWS KMS or GCP Cloud KMS) | `{ type: "kms", provider: "aws"\|"gcp", keyId, ... }` |
116
118
 
117
119
  **AWS KMS** requires `@aws-sdk/client-kms`. **GCP KMS** requires `@google-cloud/kms`. Both are optional peer dependencies -- install only what you use.
@@ -312,7 +314,7 @@ OpenTTT queries multiple atomic clock-synchronized NTP sources in parallel and p
312
314
  - **KRISS** (time.kriss.re.kr) -- Korean national standard
313
315
  - **Google** (time.google.com) -- Leap-smeared public NTP
314
316
 
315
- All readings must fall within 100ms tolerance of the synthesized median, or the Proof of Time is rejected. Single-source operation triggers a degraded-confidence warning.
317
+ All readings must fall within a stratum-dependent tolerance of the synthesized median (10ms for stratum 1, 25ms for stratum 2, 50ms for stratum 3+), or the Proof of Time is rejected. Single-source operation triggers a degraded-confidence warning.
316
318
 
317
319
  ---
318
320
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openttt",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "OpenTTT — TLS-grade transaction ordering for DeFi. Time + Logic + Sync.",
5
5
  "license": "BSL-1.1",
6
6
  "repository": {
@@ -17,6 +17,9 @@
17
17
  "base",
18
18
  "ethereum"
19
19
  ],
20
+ "engines": {
21
+ "node": ">=18"
22
+ },
20
23
  "main": "dist/index.js",
21
24
  "types": "dist/index.d.ts",
22
25
  "exports": {
@@ -28,19 +31,35 @@
28
31
  },
29
32
  "files": [
30
33
  "dist",
34
+ "vendor",
31
35
  "README.md"
32
36
  ],
33
37
  "scripts": {
34
38
  "build": "tsc",
35
- "test": "jest"
39
+ "test": "jest",
40
+ "test:coverage": "jest --coverage --forceExit",
41
+ "verify": "cd contracts && npx hardhat verify --network"
36
42
  },
37
43
  "dependencies": {
38
- "@privy-io/server-auth": "^1.32.5",
39
- "@turnkey/api-key-stamper": "^0.6.2",
40
- "@turnkey/ethers": "^1.3.25",
41
44
  "buffer": "^6.0.3",
42
45
  "ethers": "^6.10.0"
43
46
  },
47
+ "peerDependencies": {
48
+ "@privy-io/server-auth": "^1.32.5",
49
+ "@turnkey/api-key-stamper": "^0.6.2",
50
+ "@turnkey/ethers": "^1.3.25"
51
+ },
52
+ "peerDependenciesMeta": {
53
+ "@privy-io/server-auth": {
54
+ "optional": true
55
+ },
56
+ "@turnkey/api-key-stamper": {
57
+ "optional": true
58
+ },
59
+ "@turnkey/ethers": {
60
+ "optional": true
61
+ }
62
+ },
44
63
  "devDependencies": {
45
64
  "@types/jest": "^29.5.12",
46
65
  "@types/node": "^20.11.19",
@@ -0,0 +1,6 @@
1
+ export declare function golayEncode(data: Uint8Array): Uint8Array;
2
+ export declare function golayDecode(encoded: Uint8Array): {
3
+ data: Uint8Array;
4
+ corrected: number;
5
+ uncorrectable: boolean;
6
+ };
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ // sdk/src/golay.ts
3
+ // 🔱 Golay(24,12) Extended Binary Golay Code (RE-SURGERY)
4
+ // Corrects up to 3 bit errors, detects 4 bit errors.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.golayEncode = golayEncode;
7
+ exports.golayDecode = golayDecode;
8
+ // Standard Golay Parity Matrix P (12x12) - Systematic Form [I12 | P]
9
+ // Every row has weight 7.
10
+ // Verified: P*P^T = I (mod 2), all rows weight 7.
11
+ // Derived from g(x) = x^11+x^10+x^6+x^5+x^4+x^2+1 with parity extension.
12
+ const P = [
13
+ 0xC75, 0x49F, 0xD4B, 0x6E3, 0x9B3, 0xB66,
14
+ 0xECC, 0x1ED, 0x3DA, 0x7B4, 0xB1D, 0xE3A
15
+ ];
16
+ // R7-P0-1: P^T (transpose of P) — required for second syndrome computation.
17
+ // P is NOT symmetric, so s2 = s*P^T must use this separate matrix.
18
+ // Without this, decodeWord fails ~24% of weight-2 and ~50% of weight-3 error patterns.
19
+ const PT = [
20
+ 0xAE3, 0xF25, 0x16F, 0x2DE, 0x5BC, 0xB78,
21
+ 0x9D5, 0xC8F, 0x63B, 0xC76, 0x7C9, 0xF92
22
+ ];
23
+ const UNIT_VECTORS = [
24
+ 0x800, 0x400, 0x200, 0x100, 0x080, 0x040,
25
+ 0x020, 0x010, 0x008, 0x004, 0x002, 0x001
26
+ ];
27
+ /**
28
+ * Calculates weight (number of set bits).
29
+ */
30
+ function weight(n) {
31
+ let count = 0;
32
+ let temp = n & 0xFFF;
33
+ while (temp > 0) {
34
+ temp &= (temp - 1);
35
+ count++;
36
+ }
37
+ return count;
38
+ }
39
+ /**
40
+ * Multiplies a 12-bit vector by the parity matrix P.
41
+ */
42
+ function multiplyP(v) {
43
+ let res = 0;
44
+ for (let i = 0; i < 12; i++) {
45
+ if ((v >> (11 - i)) & 1) {
46
+ res ^= P[i];
47
+ }
48
+ }
49
+ return res & 0xFFF;
50
+ }
51
+ /**
52
+ * R7-P0-1: Multiplies a 12-bit vector by P^T (transpose of P).
53
+ * Required for second syndrome computation in decodeWord steps 3-5.
54
+ */
55
+ function multiplyPT(v) {
56
+ let res = 0;
57
+ for (let i = 0; i < 12; i++) {
58
+ if ((v >> (11 - i)) & 1) {
59
+ res ^= PT[i];
60
+ }
61
+ }
62
+ return res & 0xFFF;
63
+ }
64
+ function encodeWord(msg) {
65
+ const parity = multiplyP(msg & 0xFFF);
66
+ return ((msg & 0xFFF) << 12) | parity;
67
+ }
68
+ /**
69
+ * Full Syndrome Decoding for Golay(24,12)
70
+ */
71
+ function decodeWord(received) {
72
+ let r_m = (received >> 12) & 0xFFF;
73
+ const r_p = received & 0xFFF;
74
+ // Syndrome s = r_m * P + r_p
75
+ const s = multiplyP(r_m) ^ r_p;
76
+ if (s === 0)
77
+ return { msg: r_m, corrected: 0, uncorrectable: false };
78
+ // 1. wt(s) <= 3 -> Error in parity
79
+ if (weight(s) <= 3) {
80
+ return { msg: r_m, corrected: weight(s), uncorrectable: false };
81
+ }
82
+ // 2. wt(s + P_i) <= 2 -> Error in msg bit i (+ possible 1-2 errors in parity)
83
+ for (let i = 0; i < 12; i++) {
84
+ if (weight(s ^ P[i]) <= 2) {
85
+ return { msg: r_m ^ UNIT_VECTORS[i], corrected: weight(s ^ P[i]) + 1, uncorrectable: false };
86
+ }
87
+ }
88
+ // 3. R7-P0-1: Second syndrome s2 = s * P^T (NOT s * P — P is not symmetric!)
89
+ const s2 = multiplyPT(s);
90
+ // 4. wt(s2) <= 3 -> Error in message
91
+ if (weight(s2) <= 3) {
92
+ return { msg: r_m ^ s2, corrected: weight(s2), uncorrectable: false };
93
+ }
94
+ // 5. wt(s2 + PT_i) <= 2 -> Error in parity bit i + message errors
95
+ // R7-P0-1: Must use PT rows (columns of P), not P rows
96
+ for (let i = 0; i < 12; i++) {
97
+ if (weight(s2 ^ PT[i]) <= 2) {
98
+ const error_m = s2 ^ PT[i];
99
+ return { msg: r_m ^ error_m, corrected: weight(s2 ^ PT[i]) + 1, uncorrectable: false };
100
+ }
101
+ }
102
+ return { msg: r_m, corrected: 0, uncorrectable: true };
103
+ }
104
+ function golayEncode(data) {
105
+ // B1-6: Correct output size calculation to avoid buffer overflow
106
+ const out = new Uint8Array(Math.ceil(data.length / 3) * 6);
107
+ let outIdx = 0;
108
+ // Process in 3-byte blocks -> two 12-bit words -> two 24-bit (3-byte) codewords
109
+ for (let i = 0; i < data.length; i += 3) {
110
+ const b1 = data[i];
111
+ const b2 = i + 1 < data.length ? data[i + 1] : 0;
112
+ const b3 = i + 2 < data.length ? data[i + 2] : 0;
113
+ // Word 1 (12 bits)
114
+ const w1 = (b1 << 4) | (b2 >> 4);
115
+ const c1 = encodeWord(w1);
116
+ out[outIdx++] = (c1 >> 16) & 0xFF;
117
+ out[outIdx++] = (c1 >> 8) & 0xFF;
118
+ out[outIdx++] = c1 & 0xFF;
119
+ if (i + 1 < data.length) {
120
+ // Word 2 (12 bits)
121
+ const w2 = ((b2 & 0x0F) << 8) | b3;
122
+ const c2 = encodeWord(w2);
123
+ out[outIdx++] = (c2 >> 16) & 0xFF;
124
+ out[outIdx++] = (c2 >> 8) & 0xFF;
125
+ out[outIdx++] = c2 & 0xFF;
126
+ }
127
+ }
128
+ return out;
129
+ }
130
+ function golayDecode(encoded) {
131
+ // B1-6: Throws if length is not a multiple of 6
132
+ if (encoded.length % 6 !== 0) {
133
+ throw new Error("Invalid Golay encoded data: length must be multiple of 6");
134
+ }
135
+ const outLen = Math.floor(encoded.length / 2);
136
+ const out = new Uint8Array(outLen);
137
+ let outIdx = 0;
138
+ let totalCorrected = 0;
139
+ let anyUncorrectable = false;
140
+ for (let i = 0; i < encoded.length; i += 6) {
141
+ const c1 = (encoded[i] << 16) | (encoded[i + 1] << 8) | encoded[i + 2];
142
+ const res1 = decodeWord(c1);
143
+ totalCorrected += res1.corrected;
144
+ if (res1.uncorrectable)
145
+ anyUncorrectable = true;
146
+ if (outIdx < outLen)
147
+ out[outIdx++] = (res1.msg >> 4) & 0xFF;
148
+ const b2_high = (res1.msg & 0x0F) << 4;
149
+ if (i + 3 < encoded.length) {
150
+ const c2 = (encoded[i + 3] << 16) | (encoded[i + 4] << 8) | encoded[i + 5];
151
+ const res2 = decodeWord(c2);
152
+ totalCorrected += res2.corrected;
153
+ if (res2.uncorrectable)
154
+ anyUncorrectable = true;
155
+ if (outIdx < outLen)
156
+ out[outIdx++] = b2_high | (res2.msg >> 8);
157
+ if (outIdx < outLen)
158
+ out[outIdx++] = res2.msg & 0xFF;
159
+ }
160
+ else {
161
+ if (outIdx < outLen)
162
+ out[outIdx++] = b2_high;
163
+ }
164
+ }
165
+ return { data: out, corrected: totalCorrected, uncorrectable: anyUncorrectable };
166
+ }
167
+ //# sourceMappingURL=golay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"golay.js","sourceRoot":"","sources":["../src/golay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare class GrgForward {
2
+ /**
3
+ * Golomb-Rice encoding.
4
+ *
5
+ * Golomb-Rice is optimal for small-value biased distributions (e.g., timestamp deltas).
6
+ * For uniformly distributed data (random bytes), expect ~50% expansion.
7
+ * The primary purpose in the GRG pipeline is structured encoding for error correction,
8
+ * not compression.
9
+ *
10
+ * @param data Raw bytes to encode.
11
+ * @param m Golomb divisor (must be a power of 2, default 16).
12
+ */
13
+ static golombEncode(data: Uint8Array, m?: number): Uint8Array;
14
+ static redstuffEncode(data: Uint8Array, shards?: number, parity?: number): Uint8Array[];
15
+ /**
16
+ * Derives an HMAC key from GRG payload context (chainId + poolAddress).
17
+ * Both parameters are required — no default key fallback.
18
+ */
19
+ static deriveHmacKey(chainId: number, poolAddress: string): Buffer;
20
+ static golayEncodeWrapper(data: Uint8Array, hmacKey: Buffer): Uint8Array;
21
+ static encode(data: Uint8Array, chainId: number, poolAddress: string): Uint8Array[];
22
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GrgForward = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const ethers_1 = require("ethers");
6
+ const golay_1 = require("./golay");
7
+ const reed_solomon_1 = require("./reed_solomon");
8
+ class GrgForward {
9
+ /**
10
+ * Golomb-Rice encoding.
11
+ *
12
+ * Golomb-Rice is optimal for small-value biased distributions (e.g., timestamp deltas).
13
+ * For uniformly distributed data (random bytes), expect ~50% expansion.
14
+ * The primary purpose in the GRG pipeline is structured encoding for error correction,
15
+ * not compression.
16
+ *
17
+ * @param data Raw bytes to encode.
18
+ * @param m Golomb divisor (must be a power of 2, default 16).
19
+ */
20
+ static golombEncode(data, m = 16) {
21
+ if (m < 2)
22
+ throw new Error("[GRG] Golomb parameter m must be >= 2");
23
+ const k = Math.log2(m);
24
+ if (!Number.isInteger(k))
25
+ throw new Error("M must be power of 2");
26
+ const bits = [];
27
+ for (const byte of data) {
28
+ const q = Math.floor(byte / m);
29
+ const r = byte % m;
30
+ for (let i = 0; i < q; i++)
31
+ bits.push(1);
32
+ bits.push(0);
33
+ for (let i = k - 1; i >= 0; i--)
34
+ bits.push((r >> i) & 1);
35
+ }
36
+ const out = new Uint8Array(Math.ceil(bits.length / 8));
37
+ for (let i = 0; i < bits.length; i++) {
38
+ if (bits[i])
39
+ out[i >> 3] |= (0x80 >> (i & 7));
40
+ }
41
+ return out;
42
+ }
43
+ // 2. RedStuff Erasure Coding (Reed-Solomon GF(2^8))
44
+ static redstuffEncode(data, shards = 4, parity = 2) {
45
+ return reed_solomon_1.ReedSolomon.encode(data, shards, parity);
46
+ }
47
+ /**
48
+ * Derives an HMAC key from GRG payload context (chainId + poolAddress).
49
+ * Both parameters are required — no default key fallback.
50
+ */
51
+ static deriveHmacKey(chainId, poolAddress) {
52
+ if (chainId === undefined || chainId === null || !poolAddress) {
53
+ throw new Error("[GRG] chainId and poolAddress are required for HMAC key derivation. No default key is allowed.");
54
+ }
55
+ const packed = (0, ethers_1.keccak256)(ethers_1.AbiCoder.defaultAbiCoder().encode(["uint256", "address"], [chainId, poolAddress]));
56
+ return Buffer.from(packed.slice(2), "hex"); // 32 bytes
57
+ }
58
+ // 3. Golay(24,12) Error Correction Encoding
59
+ static golayEncodeWrapper(data, hmacKey) {
60
+ const encoded = (0, golay_1.golayEncode)(data);
61
+ // 🔱 Integrity: Append 8-byte HMAC-SHA256 of the encoded shard (keyed hash)
62
+ const key = hmacKey;
63
+ const mac = (0, crypto_1.createHmac)("sha256", key).update(Buffer.from(encoded)).digest();
64
+ const checksum = mac.subarray(0, 8);
65
+ const final = new Uint8Array(encoded.length + 8);
66
+ final.set(encoded);
67
+ final.set(checksum, encoded.length);
68
+ return final;
69
+ }
70
+ static encode(data, chainId, poolAddress) {
71
+ // R3-P0-3: Reject empty input — roundtrip breaks ([] → [0])
72
+ if (data.length === 0) {
73
+ throw new Error("[GRG] Cannot encode empty input — roundtrip identity violation");
74
+ }
75
+ const compressed = this.golombEncode(data);
76
+ // Prepend original length (4 bytes, big-endian) for exact roundtrip
77
+ const withLen = new Uint8Array(4 + compressed.length);
78
+ withLen[0] = (data.length >> 24) & 0xFF;
79
+ withLen[1] = (data.length >> 16) & 0xFF;
80
+ withLen[2] = (data.length >> 8) & 0xFF;
81
+ withLen[3] = data.length & 0xFF;
82
+ withLen.set(compressed, 4);
83
+ const shards = this.redstuffEncode(withLen);
84
+ const hmacKey = this.deriveHmacKey(chainId, poolAddress);
85
+ return shards.map(s => this.golayEncodeWrapper(s, hmacKey));
86
+ }
87
+ }
88
+ exports.GrgForward = GrgForward;
89
+ //# sourceMappingURL=grg_forward.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grg_forward.js","sourceRoot":"","sources":["../src/grg_forward.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare class GrgInverse {
2
+ static golayDecodeWrapper(data: Uint8Array, hmacKey: Buffer): Uint8Array;
3
+ static redstuffDecode(shards: (Uint8Array | null)[], dataShardCount?: number, parityShardCount?: number): Uint8Array;
4
+ private static readonly MAX_GOLOMB_Q;
5
+ /**
6
+ * Decode a Golomb-Rice compressed byte stream.
7
+ *
8
+ * @param data - Golomb-encoded bit-packed bytes
9
+ * @param m - Golomb divisor (must be power of 2, default 16)
10
+ * @param originalLength - If provided, stop decoding once this many values
11
+ * have been emitted. This prevents phantom trailing bytes caused by
12
+ * zero-padding in the last byte of the encoded stream.
13
+ */
14
+ static golombDecode(data: Uint8Array, m?: number, originalLength?: number): Uint8Array;
15
+ static verify(data: Uint8Array, originalShards: Uint8Array[], chainId: number, poolAddress: string): boolean;
16
+ }
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GrgInverse = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const golay_1 = require("./golay");
6
+ const grg_forward_1 = require("./grg_forward");
7
+ const logger_1 = require("./logger");
8
+ const reed_solomon_1 = require("./reed_solomon");
9
+ class GrgInverse {
10
+ // 1. Golay Decoding & Integrity Check
11
+ static golayDecodeWrapper(data, hmacKey) {
12
+ if (data.length < 8)
13
+ throw new Error("GRG shard too short for checksum");
14
+ // Split data and checksum (last 8 bytes)
15
+ const encoded = data.subarray(0, data.length - 8);
16
+ const checksum = data.subarray(data.length - 8);
17
+ // Verify HMAC-SHA256 Checksum (keyed hash, B1-5: 8 bytes truncated)
18
+ const key = hmacKey;
19
+ const mac = (0, crypto_1.createHmac)("sha256", key).update(Buffer.from(encoded)).digest();
20
+ const expected = mac.subarray(0, 8);
21
+ if (!Buffer.from(checksum).equals(Buffer.from(expected))) {
22
+ throw new Error("GRG tamper detected: HMAC-SHA256 checksum mismatch");
23
+ }
24
+ // Proceed to Golay decode
25
+ const res = (0, golay_1.golayDecode)(encoded);
26
+ if (res.uncorrectable) {
27
+ throw new Error("GRG tamper detected: uncorrectable bit errors in Golay codeword");
28
+ }
29
+ return res.data;
30
+ }
31
+ // 2. RedStuff Decoding (Reed-Solomon GF(2^8))
32
+ static redstuffDecode(shards, dataShardCount = 4, parityShardCount = 2) {
33
+ return reed_solomon_1.ReedSolomon.decode(shards, dataShardCount, parityShardCount);
34
+ }
35
+ /**
36
+ * Decode a Golomb-Rice compressed byte stream.
37
+ *
38
+ * @param data - Golomb-encoded bit-packed bytes
39
+ * @param m - Golomb divisor (must be power of 2, default 16)
40
+ * @param originalLength - If provided, stop decoding once this many values
41
+ * have been emitted. This prevents phantom trailing bytes caused by
42
+ * zero-padding in the last byte of the encoded stream.
43
+ */
44
+ static golombDecode(data, m = 16, originalLength) {
45
+ if (m < 2)
46
+ throw new Error("[GRG] Golomb parameter m must be >= 2");
47
+ const k = Math.log2(m);
48
+ const totalBits = data.length * 8;
49
+ // Helper to read a single bit from the packed byte array
50
+ const readBit = (pos) => {
51
+ return (data[pos >> 3] >> (7 - (pos & 7))) & 1;
52
+ };
53
+ const result = [];
54
+ let i = 0;
55
+ while (i < totalBits) {
56
+ // Guard: stop at expected length to avoid processing padding bits
57
+ if (originalLength !== undefined && result.length >= originalLength)
58
+ break;
59
+ // Read unary part: count 1-bits until a 0-bit
60
+ let q = 0;
61
+ while (i < totalBits && readBit(i) === 1) {
62
+ q++;
63
+ i++;
64
+ if (q > this.MAX_GOLOMB_Q)
65
+ throw new Error(`[GRG] Golomb decode: unary run exceeds ${this.MAX_GOLOMB_Q} — malformed or malicious input`);
66
+ }
67
+ if (i < totalBits && readBit(i) === 0)
68
+ i++; // skip the 0 delimiter
69
+ // Read k-bit remainder
70
+ if (i + k > totalBits)
71
+ break;
72
+ let r = 0;
73
+ for (let j = 0; j < k; j++) {
74
+ r = (r << 1) | readBit(i + j);
75
+ }
76
+ result.push(q * m + r);
77
+ i += k;
78
+ }
79
+ return new Uint8Array(result);
80
+ }
81
+ static verify(data, originalShards, chainId, poolAddress) {
82
+ try {
83
+ const hmacKey = grg_forward_1.GrgForward.deriveHmacKey(chainId, poolAddress);
84
+ const decodedShards = originalShards.map(s => {
85
+ try {
86
+ return this.golayDecodeWrapper(s, hmacKey);
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ });
92
+ const withLen = this.redstuffDecode(decodedShards);
93
+ // Extract original length
94
+ if (withLen.length < 4)
95
+ return false;
96
+ const origLen = (withLen[0] << 24) | (withLen[1] << 16) | (withLen[2] << 8) | withLen[3];
97
+ const compressed = withLen.subarray(4);
98
+ const decoded = this.golombDecode(compressed);
99
+ const final = decoded.subarray(0, origLen);
100
+ if (final.length !== data.length)
101
+ return false;
102
+ for (let i = 0; i < data.length; i++) {
103
+ if (final[i] !== data[i])
104
+ return false;
105
+ }
106
+ return true;
107
+ }
108
+ catch (e) {
109
+ logger_1.logger.warn(`[GRG Inverse] Verification failed: ${e}`);
110
+ return false;
111
+ }
112
+ }
113
+ }
114
+ exports.GrgInverse = GrgInverse;
115
+ // 3. Golomb-Rice Decompression
116
+ // R4-P2-3: Max unary run length to prevent amplification DoS
117
+ GrgInverse.MAX_GOLOMB_Q = 1000000;
118
+ //# sourceMappingURL=grg_inverse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grg_inverse.js","sourceRoot":"","sources":["../src/grg_inverse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare class GrgPipeline {
2
+ static readonly MAX_INPUT_SIZE: number;
3
+ /**
4
+ * Runs the full forward pipeline:
5
+ * Golomb-Rice -> RedStuff (Erasure) -> Golay(24,12)
6
+ */
7
+ static processForward(data: Uint8Array, chainId: number, poolAddress: string): Uint8Array[];
8
+ /**
9
+ * Runs the full inverse pipeline:
10
+ * Golay(24,12) -> RedStuff (Reconstruction) -> Golomb-Rice Decompression
11
+ */
12
+ static processInverse(shards: Uint8Array[], originalLength: number, chainId: number, poolAddress: string): Uint8Array;
13
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GrgPipeline = void 0;
4
+ const grg_forward_1 = require("./grg_forward");
5
+ const grg_inverse_1 = require("./grg_inverse");
6
+ const logger_1 = require("./logger");
7
+ class GrgPipeline {
8
+ /**
9
+ * Runs the full forward pipeline:
10
+ * Golomb-Rice -> RedStuff (Erasure) -> Golay(24,12)
11
+ */
12
+ static processForward(data, chainId, poolAddress) {
13
+ if (data.length > this.MAX_INPUT_SIZE) {
14
+ throw new Error(`[GRG] Input size ${data.length} exceeds MAX_INPUT_SIZE ${this.MAX_INPUT_SIZE}`);
15
+ }
16
+ logger_1.logger.info("Starting GRG forward pipeline...");
17
+ try {
18
+ const shards = grg_forward_1.GrgForward.encode(data, chainId, poolAddress);
19
+ logger_1.logger.info(`GRG forward pipeline complete. Generated ${shards.length} shards.`);
20
+ return shards;
21
+ }
22
+ catch (error) {
23
+ logger_1.logger.error(`GRG forward pipeline failed: ${error}`);
24
+ throw error;
25
+ }
26
+ }
27
+ /**
28
+ * Runs the full inverse pipeline:
29
+ * Golay(24,12) -> RedStuff (Reconstruction) -> Golomb-Rice Decompression
30
+ */
31
+ static processInverse(shards, originalLength, chainId, poolAddress) {
32
+ logger_1.logger.info("Starting GRG inverse pipeline...");
33
+ try {
34
+ const hmacKey = grg_forward_1.GrgForward.deriveHmacKey(chainId, poolAddress);
35
+ const decodedShards = shards.map(s => {
36
+ try {
37
+ return grg_inverse_1.GrgInverse.golayDecodeWrapper(s, hmacKey);
38
+ }
39
+ catch (e) {
40
+ logger_1.logger.warn(`Golay decode failed for a shard: ${e}`);
41
+ return null;
42
+ }
43
+ });
44
+ const withLen = grg_inverse_1.GrgInverse.redstuffDecode(decodedShards);
45
+ // Extract original length from the first 4 bytes
46
+ const decodedLength = (withLen[0] << 24) | (withLen[1] << 16) | (withLen[2] << 8) | withLen[3];
47
+ const compressed = withLen.subarray(4);
48
+ const decompressed = grg_inverse_1.GrgInverse.golombDecode(compressed);
49
+ const final = decompressed.subarray(0, decodedLength);
50
+ // P1-4 FIX: Length mismatch is a corruption signal — throw instead of warn
51
+ if (final.length !== originalLength) {
52
+ throw new Error(`[GRG] Length mismatch in inverse: expected ${originalLength}, got ${final.length}`);
53
+ }
54
+ logger_1.logger.info("GRG inverse pipeline complete.");
55
+ return final;
56
+ }
57
+ catch (error) {
58
+ logger_1.logger.error(`GRG inverse pipeline failed: ${error}`);
59
+ throw error;
60
+ }
61
+ }
62
+ }
63
+ exports.GrgPipeline = GrgPipeline;
64
+ // P1-3: Max input size to prevent OOM attacks (100 MB)
65
+ GrgPipeline.MAX_INPUT_SIZE = 100 * 1024 * 1024;
66
+ //# sourceMappingURL=grg_pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grg_pipeline.js","sourceRoot":"","sources":["../src/grg_pipeline.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;AAC3C,+CAA2C;AAC3C,qCAAkC;AAElC,MAAa,WAAW;IAItB;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,IAAgB,EAAE,OAAe,EAAE,WAAmB;QAC1E,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,2BAA2B,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACnG,CAAC;QACD,eAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,wBAAU,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YAC7D,eAAM,CAAC,IAAI,CAAC,4CAA4C,MAAM,CAAC,MAAM,UAAU,CAAC,CAAC;YACjF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,MAAoB,EAAE,cAAsB,EAAE,OAAe,EAAE,WAAmB;QACtG,eAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,wBAAU,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC/D,MAAM,aAAa,GAA0B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC1D,IAAI,CAAC;oBACH,OAAO,wBAAU,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACnD,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,eAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC;oBACrD,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,wBAAU,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAEzD,iDAAiD;YACjD,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/F,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEvC,MAAM,YAAY,GAAG,wBAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YAEtD,2EAA2E;YAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,8CAA8C,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACvG,CAAC;YAED,eAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;;AA3DH,kCA4DC;AA3DC,uDAAuD;AACvC,0BAAc,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { golayEncode, golayDecode } from "./golay";
2
+ export { ReedSolomon } from "./reed_solomon";
3
+ export { GrgForward } from "./grg_forward";
4
+ export { GrgInverse } from "./grg_inverse";
5
+ export { GrgPipeline } from "./grg_pipeline";
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ // @helm-protocol/helm-crypto — GRG Cryptographic Pipeline (PRIVATE)
3
+ // Golomb-Rice -> Reed-Solomon -> Golay(24,12)
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.GrgPipeline = exports.GrgInverse = exports.GrgForward = exports.ReedSolomon = exports.golayDecode = exports.golayEncode = void 0;
6
+ var golay_1 = require("./golay");
7
+ Object.defineProperty(exports, "golayEncode", { enumerable: true, get: function () { return golay_1.golayEncode; } });
8
+ Object.defineProperty(exports, "golayDecode", { enumerable: true, get: function () { return golay_1.golayDecode; } });
9
+ var reed_solomon_1 = require("./reed_solomon");
10
+ Object.defineProperty(exports, "ReedSolomon", { enumerable: true, get: function () { return reed_solomon_1.ReedSolomon; } });
11
+ var grg_forward_1 = require("./grg_forward");
12
+ Object.defineProperty(exports, "GrgForward", { enumerable: true, get: function () { return grg_forward_1.GrgForward; } });
13
+ var grg_inverse_1 = require("./grg_inverse");
14
+ Object.defineProperty(exports, "GrgInverse", { enumerable: true, get: function () { return grg_inverse_1.GrgInverse; } });
15
+ var grg_pipeline_1 = require("./grg_pipeline");
16
+ Object.defineProperty(exports, "GrgPipeline", { enumerable: true, get: function () { return grg_pipeline_1.GrgPipeline; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,oEAAoE;AACpE,8CAA8C;;;AAE9C,iCAAmD;AAA1C,oGAAA,WAAW,OAAA;AAAE,oGAAA,WAAW,OAAA;AACjC,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
@@ -0,0 +1,6 @@
1
+ export declare const logger: {
2
+ info: (msg: string) => void;
3
+ warn: (msg: string) => void;
4
+ error: (msg: string) => void;
5
+ debug: (msg: string) => void;
6
+ };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ // Minimal logger for helm-crypto (standalone, no external dependency)
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.logger = void 0;
5
+ exports.logger = {
6
+ info: (msg) => console.log(`[helm-crypto] ${msg}`),
7
+ warn: (msg) => console.warn(`[helm-crypto] ${msg}`),
8
+ error: (msg) => console.error(`[helm-crypto] ${msg}`),
9
+ debug: (msg) => console.debug(`[helm-crypto] ${msg}`),
10
+ };
11
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAAA,sEAAsE;;;AAEzD,QAAA,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC1D,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC3D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC7D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC;CAC9D,CAAC"}
@@ -0,0 +1,37 @@
1
+ export declare class ReedSolomon {
2
+ private static expTable;
3
+ private static logTable;
4
+ private static initialized;
5
+ /**
6
+ * Static Vandermonde matrix cache keyed by "${totalShards}-${dataShards}".
7
+ * Avoids recomputing the GF(2^8) Vandermonde + inverse on every tick,
8
+ * which is the most expensive part of RS encoding/decoding.
9
+ */
10
+ private static vandermondeCache;
11
+ static init(): void;
12
+ static mul(a: number, b: number): number;
13
+ static div(a: number, b: number): number;
14
+ private static invertMatrix;
15
+ /**
16
+ * Build (or retrieve from cache) the normalized Vandermonde encoding matrix.
17
+ * Cache key: "${rows}-${cols}" — RS parameters rarely change within a session,
18
+ * so caching eliminates redundant GF(2^8) matrix inversion on every tick.
19
+ */
20
+ private static buildVandermonde;
21
+ static encode(data: Uint8Array, dataShards?: number, parityShards?: number): Uint8Array[];
22
+ /**
23
+ * Decode data from a set of Reed-Solomon shards (data + parity).
24
+ *
25
+ * Shards should be provided in order of reliability: place higher-quality,
26
+ * more trustworthy shards first. The decoder selects the first `dataShards`
27
+ * non-null entries for recovery, so ordering by reliability ensures the
28
+ * most dependable shards are preferred. The implementation already handles
29
+ * missing (null) shards transparently via GF(2^8) matrix inversion.
30
+ *
31
+ * @param shards - Array of shard buffers (null for missing/corrupted shards)
32
+ * @param dataShards - Number of data shards (default 4)
33
+ * @param parityShards - Number of parity shards (default 2)
34
+ * @returns Reconstructed data as a single Uint8Array
35
+ */
36
+ static decode(shards: (Uint8Array | null)[], dataShards?: number, parityShards?: number): Uint8Array;
37
+ }
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReedSolomon = void 0;
4
+ class ReedSolomon {
5
+ static init() {
6
+ if (this.initialized)
7
+ return;
8
+ let x = 1;
9
+ for (let i = 0; i < 255; i++) {
10
+ this.expTable[i] = x;
11
+ this.logTable[x] = i;
12
+ x <<= 1;
13
+ if (x & 0x100) {
14
+ x ^= 0x11D; // x^8 + x^4 + x^3 + x^2 + 1
15
+ }
16
+ }
17
+ this.expTable[255] = this.expTable[0];
18
+ this.logTable[0] = 0;
19
+ this.initialized = true;
20
+ }
21
+ static mul(a, b) {
22
+ if (a === 0 || b === 0)
23
+ return 0;
24
+ return this.expTable[(this.logTable[a] + this.logTable[b]) % 255];
25
+ }
26
+ static div(a, b) {
27
+ if (b === 0)
28
+ throw new Error("Division by zero");
29
+ if (a === 0)
30
+ return 0;
31
+ return this.expTable[(this.logTable[a] - this.logTable[b] + 255) % 255];
32
+ }
33
+ static invertMatrix(matrix) {
34
+ const n = matrix.length;
35
+ const aug = [];
36
+ for (let i = 0; i < n; i++) {
37
+ aug[i] = [];
38
+ for (let j = 0; j < n; j++) {
39
+ aug[i][j] = matrix[i][j];
40
+ }
41
+ for (let j = 0; j < n; j++) {
42
+ aug[i][j + n] = (i === j) ? 1 : 0;
43
+ }
44
+ }
45
+ for (let i = 0; i < n; i++) {
46
+ let pivot = i;
47
+ while (pivot < n && aug[pivot][i] === 0) {
48
+ pivot++;
49
+ }
50
+ if (pivot === n)
51
+ throw new Error("Singular matrix");
52
+ if (pivot !== i) {
53
+ const temp = aug[i];
54
+ aug[i] = aug[pivot];
55
+ aug[pivot] = temp;
56
+ }
57
+ const pivotVal = aug[i][i];
58
+ if (pivotVal !== 1) {
59
+ for (let j = i; j < 2 * n; j++) {
60
+ aug[i][j] = this.div(aug[i][j], pivotVal);
61
+ }
62
+ }
63
+ for (let j = 0; j < n; j++) {
64
+ if (i !== j && aug[j][i] !== 0) {
65
+ const factor = aug[j][i];
66
+ for (let k = i; k < 2 * n; k++) {
67
+ aug[j][k] ^= this.mul(factor, aug[i][k]);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ const inv = [];
73
+ for (let i = 0; i < n; i++) {
74
+ inv[i] = [];
75
+ for (let j = 0; j < n; j++) {
76
+ inv[i][j] = aug[i][j + n];
77
+ }
78
+ }
79
+ return inv;
80
+ }
81
+ /**
82
+ * Build (or retrieve from cache) the normalized Vandermonde encoding matrix.
83
+ * Cache key: "${rows}-${cols}" — RS parameters rarely change within a session,
84
+ * so caching eliminates redundant GF(2^8) matrix inversion on every tick.
85
+ */
86
+ static buildVandermonde(rows, cols) {
87
+ const cacheKey = `${rows}-${cols}`;
88
+ const cached = this.vandermondeCache.get(cacheKey);
89
+ if (cached)
90
+ return cached;
91
+ const V = [];
92
+ for (let r = 0; r < rows; r++) {
93
+ V[r] = [];
94
+ const x = r + 1;
95
+ for (let c = 0; c < cols; c++) {
96
+ if (c === 0) {
97
+ V[r][c] = 1;
98
+ }
99
+ else {
100
+ V[r][c] = this.mul(V[r][c - 1], x);
101
+ }
102
+ }
103
+ }
104
+ const V_top = [];
105
+ for (let i = 0; i < cols; i++) {
106
+ V_top.push([...V[i]]);
107
+ }
108
+ const V_top_inv = this.invertMatrix(V_top);
109
+ const G = [];
110
+ for (let r = 0; r < rows; r++) {
111
+ G[r] = [];
112
+ for (let c = 0; c < cols; c++) {
113
+ let val = 0;
114
+ for (let k = 0; k < cols; k++) {
115
+ val ^= this.mul(V[r][k], V_top_inv[k][c]);
116
+ }
117
+ G[r][c] = val;
118
+ }
119
+ }
120
+ this.vandermondeCache.set(cacheKey, G);
121
+ return G;
122
+ }
123
+ static encode(data, dataShards = 4, parityShards = 2) {
124
+ this.init();
125
+ const totalShards = dataShards + parityShards;
126
+ const rawShardSize = Math.ceil(data.length / dataShards);
127
+ const shardSize = Math.ceil(rawShardSize / 3) * 3;
128
+ const matrix = this.buildVandermonde(totalShards, dataShards);
129
+ const shards = [];
130
+ for (let i = 0; i < totalShards; i++) {
131
+ shards.push(new Uint8Array(shardSize));
132
+ }
133
+ for (let i = 0; i < dataShards; i++) {
134
+ shards[i].set(data.subarray(i * shardSize, Math.min((i + 1) * shardSize, data.length)));
135
+ }
136
+ for (let c = 0; c < shardSize; c++) {
137
+ for (let r = dataShards; r < totalShards; r++) {
138
+ let val = 0;
139
+ for (let j = 0; j < dataShards; j++) {
140
+ val ^= this.mul(matrix[r][j], shards[j][c]);
141
+ }
142
+ shards[r][c] = val;
143
+ }
144
+ }
145
+ return shards;
146
+ }
147
+ /**
148
+ * Decode data from a set of Reed-Solomon shards (data + parity).
149
+ *
150
+ * Shards should be provided in order of reliability: place higher-quality,
151
+ * more trustworthy shards first. The decoder selects the first `dataShards`
152
+ * non-null entries for recovery, so ordering by reliability ensures the
153
+ * most dependable shards are preferred. The implementation already handles
154
+ * missing (null) shards transparently via GF(2^8) matrix inversion.
155
+ *
156
+ * @param shards - Array of shard buffers (null for missing/corrupted shards)
157
+ * @param dataShards - Number of data shards (default 4)
158
+ * @param parityShards - Number of parity shards (default 2)
159
+ * @returns Reconstructed data as a single Uint8Array
160
+ */
161
+ static decode(shards, dataShards = 4, parityShards = 2) {
162
+ this.init();
163
+ const totalShards = dataShards + parityShards;
164
+ if (shards.length !== totalShards) {
165
+ throw new Error(`[RS] Expected ${totalShards} shards, got ${shards.length}`);
166
+ }
167
+ const presentIndices = [];
168
+ const presentShards = [];
169
+ for (let i = 0; i < totalShards; i++) {
170
+ if (shards[i] !== null && shards[i] !== undefined) {
171
+ presentIndices.push(i);
172
+ presentShards.push(shards[i]);
173
+ if (presentIndices.length === dataShards)
174
+ break;
175
+ }
176
+ }
177
+ if (presentIndices.length < dataShards) {
178
+ throw new Error(`[RS] Not enough shards for recovery: need ${dataShards}, got ${presentIndices.length}`);
179
+ }
180
+ const shardSize = presentShards[0].length;
181
+ const origMatrix = this.buildVandermonde(totalShards, dataShards);
182
+ const subMatrix = [];
183
+ for (let i = 0; i < dataShards; i++) {
184
+ subMatrix.push([...origMatrix[presentIndices[i]]]);
185
+ }
186
+ const invMatrix = this.invertMatrix(subMatrix);
187
+ const result = new Uint8Array(shardSize * dataShards);
188
+ for (let c = 0; c < shardSize; c++) {
189
+ for (let r = 0; r < dataShards; r++) {
190
+ let val = 0;
191
+ for (let j = 0; j < dataShards; j++) {
192
+ val ^= this.mul(invMatrix[r][j], presentShards[j][c]);
193
+ }
194
+ result[r * shardSize + c] = val;
195
+ }
196
+ }
197
+ return result;
198
+ }
199
+ }
200
+ exports.ReedSolomon = ReedSolomon;
201
+ ReedSolomon.expTable = new Uint8Array(256);
202
+ ReedSolomon.logTable = new Uint8Array(256);
203
+ ReedSolomon.initialized = false;
204
+ /**
205
+ * Static Vandermonde matrix cache keyed by "${totalShards}-${dataShards}".
206
+ * Avoids recomputing the GF(2^8) Vandermonde + inverse on every tick,
207
+ * which is the most expensive part of RS encoding/decoding.
208
+ */
209
+ ReedSolomon.vandermondeCache = new Map();
210
+ //# sourceMappingURL=reed_solomon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reed_solomon.js","sourceRoot":"","sources":["../src/reed_solomon.ts"],"names":[],"mappings":"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"}