react / wstein / node_modules / browserify / node_modules / crypto-browserify / node_modules / browserify-sign / node_modules / elliptic / lib / elliptic / ec / signature.js
80621 views'use strict';12var bn = require('bn.js');34var elliptic = require('../../elliptic');5var utils = elliptic.utils;6var assert = utils.assert;78function Signature(options, enc) {9if (options instanceof Signature)10return options;1112if (this._importDER(options, enc))13return;1415assert(options.r && options.s, 'Signature without r or s');16this.r = new bn(options.r, 16);17this.s = new bn(options.s, 16);18}19module.exports = Signature;2021Signature.prototype._importDER = function _importDER(data, enc) {22data = utils.toArray(data, enc);23if (data.length < 6 || data[0] !== 0x30 || data[2] !== 0x02)24return false;25var total = data[1];26if (1 + total > data.length)27return false;28var rlen = data[3];29// Short length notation30if (rlen >= 0x80)31return false;32if (4 + rlen + 2 >= data.length)33return false;34if (data[4 + rlen] !== 0x02)35return false;36var slen = data[5 + rlen];37// Short length notation38if (slen >= 0x80)39return false;40if (4 + rlen + 2 + slen > data.length)41return false;4243this.r = new bn(data.slice(4, 4 + rlen));44this.s = new bn(data.slice(4 + rlen + 2, 4 + rlen + 2 + slen));4546return true;47};4849Signature.prototype.toDER = function toDER(enc) {50var r = this.r.toArray();51var s = this.s.toArray();5253// Pad values54if (r[0] & 0x80)55r = [ 0 ].concat(r);56// Pad values57if (s[0] & 0x80)58s = [ 0 ].concat(s);5960var total = r.length + s.length + 4;61var res = [ 0x30, total, 0x02, r.length ];62res = res.concat(r, [ 0x02, s.length ], s);63return utils.encode(res, enc);64};656667