UNPKG

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
"use strict"; 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;