wampy
Version:
Amazingly fast, feature-rich, lightweight WAMP Javascript client (for browser and node.js)
64 lines • 2.1 kB
JavaScript
// 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