basant307/AI_Governance_Project
048
1/*global module*/2var Buffer = require('safe-buffer').Buffer;3var DataStream = require('./data-stream');4var jwa = require('jwa');5var Stream = require('stream');6var toString = require('./tostring');7var util = require('util');8 9function base64url(string, encoding) {10 return Buffer11 .from(string, encoding)12 .toString('base64')13 .replace(/=/g, '')14 .replace(/\+/g, '-')15 .replace(/\//g, '_');16}17 18function jwsSecuredInput(header, payload, encoding) {19 encoding = encoding || 'utf8';20 var encodedHeader = base64url(toString(header), 'binary');21 var encodedPayload = base64url(toString(payload), encoding);22 return util.format('%s.%s', encodedHeader, encodedPayload);23}24 25function jwsSign(opts) {26 var header = opts.header;27 var payload = opts.payload;28 var secretOrKey = opts.secret || opts.privateKey;29 var encoding = opts.encoding;30 var algo = jwa(header.alg);31 var securedInput = jwsSecuredInput(header, payload, encoding);32 var signature = algo.sign(securedInput, secretOrKey);33 return util.format('%s.%s', securedInput, signature);34}35 36function SignStream(opts) {37 var secret = opts.secret;38 secret = secret == null ? opts.privateKey : secret;39 secret = secret == null ? opts.key : secret;40 if (/^hs/i.test(opts.header.alg) === true && secret == null) {41 throw new TypeError('secret must be a string or buffer or a KeyObject')42 }43 var secretStream = new DataStream(secret);44 this.readable = true;45 this.header = opts.header;46 this.encoding = opts.encoding;47 this.secret = this.privateKey = this.key = secretStream;48 this.payload = new DataStream(opts.payload);49 this.secret.once('close', function () {50 if (!this.payload.writable && this.readable)51 this.sign();52 }.bind(this));53 54 this.payload.once('close', function () {55 if (!this.secret.writable && this.readable)56 this.sign();57 }.bind(this));58}59util.inherits(SignStream, Stream);60 61SignStream.prototype.sign = function sign() {62 try {63 var signature = jwsSign({64 header: this.header,65 payload: this.payload.buffer,66 secret: this.secret.buffer,67 encoding: this.encoding68 });69 this.emit('done', signature);70 this.emit('data', signature);71 this.emit('end');72 this.readable = false;73 return signature;74 } catch (e) {75 this.readable = false;76 this.emit('error', e);77 this.emit('close');78 }79};80 81SignStream.sign = jwsSign;82 83module.exports = SignStream;84 