@microsoft/dev-tunnels-ssh
Version:
SSH library for Dev Tunnels
71 lines • 2.9 kB
JavaScript
;
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebHmac = void 0;
const buffer_1 = require("buffer");
const hmacAlgorithm_1 = require("../hmacAlgorithm");
class WebHmac extends hmacAlgorithm_1.HmacAlgorithm {
constructor(name, algorithmName, encryptThenMac = false) {
super(name, algorithmName, WebHmac.getHashKeyLength(algorithmName), WebHmac.getHashDigestLength(algorithmName));
this.encryptThenMac = encryptThenMac;
}
async createSigner(key) {
const hmac = new WebSignerVerifier(this.algorithmName, true, this.digestLength, this.encryptThenMac);
await hmac.init(key);
return hmac;
}
async createVerifier(key) {
const hmac = new WebSignerVerifier(this.algorithmName, false, this.digestLength, this.encryptThenMac);
await hmac.init(key);
return hmac;
}
static getHashKeyLength(hashAlgorithmName) {
if (hashAlgorithmName === 'SHA2-512')
return 512 / 8;
if (hashAlgorithmName === 'SHA2-384')
return 384 / 8;
if (hashAlgorithmName === 'SHA2-256')
return 256 / 8;
throw new Error(`Unsupported hash algorithm: ${hashAlgorithmName}`);
}
static getHashDigestLength(hashAlgorithmName) {
return this.getHashKeyLength(hashAlgorithmName);
}
static getWebHashAlgorithmName(hashAlgorithmName) {
if (hashAlgorithmName === 'SHA2-512')
return 'SHA-512';
if (hashAlgorithmName === 'SHA2-384')
return 'SHA-384';
if (hashAlgorithmName === 'SHA2-256')
return 'SHA-256';
throw new Error(`Unsupported hash algorithm: ${hashAlgorithmName}`);
}
}
exports.WebHmac = WebHmac;
class WebSignerVerifier {
constructor(algorithmName, isSigning, digestLength, encryptThenMac) {
this.algorithmName = algorithmName;
this.isSigning = isSigning;
this.digestLength = digestLength;
this.encryptThenMac = encryptThenMac;
}
async init(key) {
try {
const name = this.algorithmName.replace('SHA2-', 'SHA-');
this.key = await crypto.subtle.importKey('raw', key, { name: 'HMAC', hash: { name } }, false, this.isSigning ? ['sign'] : ['verify']);
}
catch (e) {
throw new Error('Failed to initialize HMAC: ' + e);
}
}
async sign(data) {
return buffer_1.Buffer.from(await crypto.subtle.sign({ name: 'HMAC', hash: { name: this.algorithmName } }, this.key, data));
}
async verify(data, signature) {
return await crypto.subtle.verify({ name: 'HMAC', hash: { name: this.algorithmName } }, this.key, signature, data);
}
dispose() { }
}
//# sourceMappingURL=webHmac.js.map