{
  "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": ["index_exports", "__export", "reconstruct", "split", "__toCommonJS", "import_one_webcrypto", "GF256_LOG", "GF256_EXP", "initGF256Tables", "x", "i", "__name", "gfMul", "a", "b", "gfAdd", "gfDiv", "evaluatePolynomial", "coeffs", "result", "xPower", "term", "split", "secret", "options", "min", "total", "shares", "polynomials", "byteIndex", "randomBytes", "j", "shareIndex", "y", "reconstruct", "threshold", "secretByte", "numerator", "denominator", "lagrangeBasis"]
}
