UNPKG

wampy

Version:

Amazingly fast, feature-rich, lightweight WAMP Javascript client (for browser and node.js)

64 lines 2.1 kB
// src/auth/wampcra/wampy-cra.ts var isNode = typeof process === "object" && Object.prototype.toString.call(process) === "[object process]"; var cryptoModule = isNode ? await import("crypto") : globalThis.crypto; var subtle = "subtle" in cryptoModule ? cryptoModule.subtle : cryptoModule.subtle; async function deriveKey(secret, salt, iterations = 1e3, keylen = 32) { const encoder = new TextEncoder(); const secretBuffer = encoder.encode(secret); const saltBuffer = encoder.encode(salt); const algorithm = { name: "PBKDF2", hash: "SHA-256", iterations }; const derivedKey = await subtle.importKey( "raw", secretBuffer, algorithm, false, ["deriveBits"] ); const keyBuffer = await subtle.deriveBits( { name: "PBKDF2", salt: saltBuffer, iterations, hash: "SHA-256" }, derivedKey, keylen * 8 ); const keyArray = [...new Uint8Array(keyBuffer)]; return btoa(String.fromCodePoint(...keyArray)); } async function signManual(key, challenge) { const encoder = new TextEncoder(); const keyBuffer = encoder.encode(key); const challengeBuffer = encoder.encode(challenge); const keyData = await subtle.importKey( "raw", keyBuffer, { name: "HMAC", hash: "SHA-256" }, false, ["sign"] ); const signature = await subtle.sign("HMAC", keyData, challengeBuffer); const signatureArray = [...new Uint8Array(signature)]; return btoa(String.fromCodePoint(...signatureArray)); } function sign(secret) { return async function(method, info) { if (method === "wampcra") { return info.salt ? signManual( await deriveKey(secret, info.salt, info.iterations, info.keylen), info.challenge ) : signManual(secret, info.challenge); } else { throw new Error("Unknown authentication method requested!"); } }; } export { deriveKey, sign, signManual }; /** * Wampy.js Challenge Response Authentication plugin * * Copyright 2016 KSDaemon. Licensed under the MIT License. * See @license text at http://www.opensource.org/licenses/mit-license.php * */ //# sourceMappingURL=wampy-cra.mjs.map