{"version":3,"sources":["../../../../src/auth/wampcra/wampy-cra.ts"],"sourcesContent":["/**\n * Wampy.js Challenge Response Authentication plugin\n *\n * Copyright 2016 KSDaemon. Licensed under the MIT License.\n * See @license text at http://www.opensource.org/licenses/mit-license.php\n *\n */\n\nconst isNode = (typeof process === 'object' && Object.prototype.toString.call(process) === '[object process]');\nconst cryptoModule = isNode ? await import('node:crypto') : globalThis.crypto;\nconst subtle: SubtleCrypto = ('subtle' in cryptoModule ? cryptoModule.subtle : (cryptoModule as Crypto).subtle) as SubtleCrypto;\n\n/**\n * Information required for WAMP-CRA signing.\n */\ninterface WampCraInfo {\n    challenge: string;\n    salt?: string;\n    iterations?: number;\n    keylen?: number;\n}\n\n/**\n * Derives a key using PBKDF2 algorithm.\n */\nexport async function deriveKey(secret: string, salt: string, iterations: number = 1000, keylen: number = 32): Promise<string> {\n    // This is how it can be done shorter using node specific API\n    // if (isNode) {\n    //     const key = crypto.pbkdf2Sync(secret, salt, iterations, keylen, 'sha256');\n    //     return key.toString('base64');\n    // } else {\n        const encoder = new TextEncoder();\n        const secretBuffer = encoder.encode(secret);\n        const saltBuffer = encoder.encode(salt);\n        const algorithm = { name: 'PBKDF2', hash: 'SHA-256', iterations };\n        const derivedKey = await subtle.importKey(\n            'raw', secretBuffer, algorithm, false, ['deriveBits']);\n        const keyBuffer = await subtle.deriveBits(\n            { name: 'PBKDF2', salt: saltBuffer, iterations, hash: 'SHA-256' },\n            derivedKey,\n            keylen * 8\n        );\n        const keyArray = [...new Uint8Array(keyBuffer)];\n        return btoa(String.fromCodePoint(...keyArray));\n    // }\n}\n\n/**\n * Signs a challenge using the manual method.\n */\nexport async function signManual(key: string, challenge: string): Promise<string> {\n    // This is how it can be done shorter using node specific API\n    // if (isNode) {\n    //     const hmac = crypto.createHmac('sha256', key);\n    //     hmac.update(challenge);\n    //     return hmac.digest('base64');\n    // } else {\n        const encoder = new TextEncoder();\n        const keyBuffer = encoder.encode(key);\n        const challengeBuffer = encoder.encode(challenge);\n        const keyData = await subtle.importKey('raw',\n            keyBuffer,\n            { name: 'HMAC', hash: 'SHA-256' },\n            false,\n            ['sign']);\n        const signature = await subtle.sign('HMAC', keyData, challengeBuffer);\n        const signatureArray = [...new Uint8Array(signature)];\n        return btoa(String.fromCodePoint(...signatureArray));\n    // }\n}\n\n/**\n * Creates a signing function using the specified secret.\n */\nexport function sign(secret: string): (method: string, info: WampCraInfo) => Promise<string> {\n    /**\n     * Signs a challenge using the wampcra method.\n     */\n    return async function (method: string, info: WampCraInfo): Promise<string> {\n        if (method === 'wampcra') {\n            return info.salt ? signManual(await deriveKey(secret, info.salt, info.iterations, info.keylen),\n                info.challenge) : signManual(secret, info.challenge);\n        } else {\n            throw new Error('Unknown authentication method requested!');\n        }\n    };\n}\n"],"mappings":";AAQA,IAAM,SAAU,OAAO,YAAY,YAAY,OAAO,UAAU,SAAS,KAAK,OAAO,MAAM;AAC3F,IAAM,eAAe,SAAS,MAAM,OAAO,QAAa,IAAI,WAAW;AACvE,IAAM,SAAwB,YAAY,eAAe,aAAa,SAAU,aAAwB;AAexG,eAAsB,UAAU,QAAgB,MAAc,aAAqB,KAAM,SAAiB,IAAqB;AAMvH,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,eAAe,QAAQ,OAAO,MAAM;AAC1C,QAAM,aAAa,QAAQ,OAAO,IAAI;AACtC,QAAM,YAAY,EAAE,MAAM,UAAU,MAAM,WAAW,WAAW;AAChE,QAAM,aAAa,MAAM,OAAO;AAAA,IAC5B;AAAA,IAAO;AAAA,IAAc;AAAA,IAAW;AAAA,IAAO,CAAC,YAAY;AAAA,EAAC;AACzD,QAAM,YAAY,MAAM,OAAO;AAAA,IAC3B,EAAE,MAAM,UAAU,MAAM,YAAY,YAAY,MAAM,UAAU;AAAA,IAChE;AAAA,IACA,SAAS;AAAA,EACb;AACA,QAAM,WAAW,CAAC,GAAG,IAAI,WAAW,SAAS,CAAC;AAC9C,SAAO,KAAK,OAAO,cAAc,GAAG,QAAQ,CAAC;AAErD;AAKA,eAAsB,WAAW,KAAa,WAAoC;AAO1E,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,YAAY,QAAQ,OAAO,GAAG;AACpC,QAAM,kBAAkB,QAAQ,OAAO,SAAS;AAChD,QAAM,UAAU,MAAM,OAAO;AAAA,IAAU;AAAA,IACnC;AAAA,IACA,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC;AAAA,IACA,CAAC,MAAM;AAAA,EAAC;AACZ,QAAM,YAAY,MAAM,OAAO,KAAK,QAAQ,SAAS,eAAe;AACpE,QAAM,iBAAiB,CAAC,GAAG,IAAI,WAAW,SAAS,CAAC;AACpD,SAAO,KAAK,OAAO,cAAc,GAAG,cAAc,CAAC;AAE3D;AAKO,SAAS,KAAK,QAAwE;AAIzF,SAAO,eAAgB,QAAgB,MAAoC;AACvE,QAAI,WAAW,WAAW;AACtB,aAAO,KAAK,OAAO;AAAA,QAAW,MAAM,UAAU,QAAQ,KAAK,MAAM,KAAK,YAAY,KAAK,MAAM;AAAA,QACzF,KAAK;AAAA,MAAS,IAAI,WAAW,QAAQ,KAAK,SAAS;AAAA,IAC3D,OAAO;AACH,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC9D;AAAA,EACJ;AACJ;","names":[]}