{
  "version": 3,
  "sources": ["../src/index.ts"],
  "sourcesContent": ["import { webcrypto } from '@substrate-system/one-webcrypto'\n\nexport interface Share {\n    x:number\n    y:Uint8Array\n    threshold?:number\n}\n\nconst GF256_LOG = new Uint8Array(256)\nconst GF256_EXP = new Uint8Array(256)\n\nfunction initGF256Tables () {\n    let x = 1\n    for (let i = 0; i < 255; i++) {\n        GF256_EXP[i] = x\n        GF256_LOG[x] = i\n        x = x << 1\n        if (x & 0x100) {  // if bit 8 is set (x >= 256)\n            x ^= 0x11d    // XOR with irreducible polynomial x^8 + x^4 + x^3 + x + 1\n        }\n    }\n    GF256_EXP[255] = GF256_EXP[0]\n    GF256_LOG[0] = 255  // Special case for log(0) = undefined, use 255 as sentinel\n}\n\ninitGF256Tables()\n\nfunction gfMul (a:number, b:number):number {\n    if (a === 0 || b === 0) return 0\n    return GF256_EXP[(GF256_LOG[a] + GF256_LOG[b]) % 255]\n}\n\nfunction gfAdd (a:number, b:number):number {\n    return a ^ b\n}\n\nfunction gfDiv (a:number, b:number):number {\n    if (b === 0) throw new Error('Division by zero in GF(256)')\n    if (a === 0) return 0\n    return GF256_EXP[(GF256_LOG[a] - GF256_LOG[b] + 255) % 255]\n}\n\nfunction evaluatePolynomial (coeffs:number[], x:number):number {\n    let result = 0\n    let xPower = 1\n\n    for (let i = 0; i < coeffs.length; i++) {\n        const term = gfMul(coeffs[i], xPower)\n        result = gfAdd(result, term)\n        xPower = gfMul(xPower, x)\n    }\n\n    return result\n}\n\nexport function split (\n    secret:Uint8Array,\n    options:{\n        min:number\n        total:number\n    }\n):Share[] {\n    const { min, total } = options\n\n    if (min < 2 || min > total) {\n        throw new Error('Invalid threshold: must be >= 2 and <= total')\n    }\n\n    if (total > 254) {\n        throw new Error('Maximum 254 shares supported')\n    }\n\n    const shares:Share[] = []\n\n    // Generate random coefficients for each byte's polynomial\n    const polynomials:number[][] = []\n    for (let byteIndex = 0; byteIndex < secret.length; byteIndex++) {\n        const coeffs = [secret[byteIndex]]  // constant term is the secret byte\n\n        // Generate random coefficients for higher-order terms\n        const randomBytes = webcrypto.getRandomValues(new Uint8Array(min - 1))\n        for (let j = 1; j < min; j++) {\n            coeffs.push(randomBytes[j - 1])\n        }\n\n        polynomials.push(coeffs)\n    }\n\n    // Generate shares by evaluating polynomials at different x values\n    for (let shareIndex = 1; shareIndex <= total; shareIndex++) {\n        const y = new Uint8Array(secret.length)\n\n        for (let byteIndex = 0; byteIndex < secret.length; byteIndex++) {\n            y[byteIndex] = evaluatePolynomial(polynomials[byteIndex], shareIndex)\n        }\n\n        shares.push({ x: shareIndex, y, threshold: min })\n    }\n\n    return shares\n}\n\nexport function reconstruct (shares:Share[]):Uint8Array {\n    if (shares.length === 0) {\n        throw new Error('No shares provided')\n    }\n\n    const threshold = shares[0].threshold\n    if (threshold && shares.length < threshold) {\n        throw new Error(`Insufficient shares: need ${threshold}, got ${shares.length}`)\n    }\n\n    const result = new Uint8Array(shares[0].y.length)\n\n    for (let byteIndex = 0; byteIndex < shares[0].y.length; byteIndex++) {\n        let secretByte = 0\n\n        for (let i = 0; i < shares.length; i++) {\n            let numerator = 1\n            let denominator = 1\n\n            // Calculate Lagrange basis polynomial for x=0\n            for (let j = 0; j < shares.length; j++) {\n                if (i !== j) {\n                    numerator = gfMul(numerator, shares[j].x)\n                    denominator = gfMul(denominator, gfAdd(shares[i].x, shares[j].x))\n                }\n            }\n\n            const lagrangeBasis = gfDiv(numerator, denominator)\n            secretByte = gfAdd(secretByte, gfMul(shares[i].y[byteIndex], lagrangeBasis))\n        }\n\n        result[byteIndex] = secretByte\n    }\n\n    return result\n}\n"],
  "mappings": "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",
  "names": []
}
