multipassify-ts
Version:
This is an example TypeScript Package ready to be published on npm. It has been set up with automated tests and package publishing workflow using GitHub Actions CI/CD. It is made primarily for GitHub + VS Code (Windows / Mac / Linux) users who are about t
50 lines (49 loc) • 1.95 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Multipassify = void 0;
var crypto_1 = __importDefault(require("crypto"));
var BLOCK_SIZE = 16;
var Multipassify = /** @class */ (function () {
function Multipassify(secret) {
if (!(secret.length > 0))
throw new Error('Invalid Secret');
var hash = crypto_1.default.createHash('sha256').update(secret).digest();
this._encryptionKey = hash.subarray(0, BLOCK_SIZE);
this._signingKey = hash.subarray(BLOCK_SIZE, 32);
}
Multipassify.prototype.encode = function (obj) {
if (!obj)
throw new Error('No data encoded');
obj['created_at'] = new Date().toISOString();
var cipherText = this.encrypt(JSON.stringify(obj));
var token = Buffer.concat([cipherText, this.sign(cipherText)]).toString('base64url');
return token;
};
Multipassify.prototype.generateUrl = function (obj, domain) {
if (!domain)
throw new Error('No domain specified');
return 'https://' + domain + '/account/login/multipass/' + this.encode(obj);
};
Multipassify.prototype.sign = function (data) {
var signed = crypto_1.default
.createHmac('sha256', this._signingKey)
.update(data)
.digest();
return signed;
};
Multipassify.prototype.encrypt = function (plaintext) {
var iv = crypto_1.default.randomBytes(BLOCK_SIZE);
var cipher = crypto_1.default.createCipheriv('aes-128-cbc', this._encryptionKey, iv);
var encrypted = Buffer.concat([
iv,
cipher.update(plaintext, 'utf8'),
cipher.final(),
]);
return encrypted;
};
return Multipassify;
}());
exports.Multipassify = Multipassify;