wampy
Version:
Amazingly fast, feature-rich, lightweight WAMP Javascript client (for browser and node.js)
1 lines • 4.78 kB
Source Map (JSON)
{"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":[]}