'use strict';
var bn = require('bn.js');
var elliptic = require('../../elliptic');
var utils = elliptic.utils;
var assert = utils.assert;
function Signature(options, enc) {
if (options instanceof Signature)
return options;
if (this._importDER(options, enc))
return;
assert(options.r && options.s, 'Signature without r or s');
this.r = new bn(options.r, 16);
this.s = new bn(options.s, 16);
}
module.exports = Signature;
Signature.prototype._importDER = function _importDER(data, enc) {
data = utils.toArray(data, enc);
if (data.length < 6 || data[0] !== 0x30 || data[2] !== 0x02)
return false;
var total = data[1];
if (1 + total > data.length)
return false;
var rlen = data[3];
if (rlen >= 0x80)
return false;
if (4 + rlen + 2 >= data.length)
return false;
if (data[4 + rlen] !== 0x02)
return false;
var slen = data[5 + rlen];
if (slen >= 0x80)
return false;
if (4 + rlen + 2 + slen > data.length)
return false;
this.r = new bn(data.slice(4, 4 + rlen));
this.s = new bn(data.slice(4 + rlen + 2, 4 + rlen + 2 + slen));
return true;
};
Signature.prototype.toDER = function toDER(enc) {
var r = this.r.toArray();
var s = this.s.toArray();
if (r[0] & 0x80)
r = [ 0 ].concat(r);
if (s[0] & 0x80)
s = [ 0 ].concat(s);
var total = r.length + s.length + 4;
var res = [ 0x30, total, 0x02, r.length ];
res = res.concat(r, [ 0x02, s.length ], s);
return utils.encode(res, enc);
};