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

44 lines (43 loc) 1.63 kB
import crypto from 'crypto'; var BLOCK_SIZE = 16; var Multipassify = /** @class */ (function () { function Multipassify(secret) { if (!(secret.length > 0)) throw new Error('Invalid Secret'); var hash = crypto.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 .createHmac('sha256', this._signingKey) .update(data) .digest(); return signed; }; Multipassify.prototype.encrypt = function (plaintext) { var iv = crypto.randomBytes(BLOCK_SIZE); var cipher = crypto.createCipheriv('aes-128-cbc', this._encryptionKey, iv); var encrypted = Buffer.concat([ iv, cipher.update(plaintext, 'utf8'), cipher.final(), ]); return encrypted; }; return Multipassify; }()); export { Multipassify };