Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80621 views
1
'use strict';
2
3
var bn = require('bn.js');
4
5
var elliptic = require('../../elliptic');
6
var utils = elliptic.utils;
7
var assert = utils.assert;
8
9
function Signature(options, enc) {
10
if (options instanceof Signature)
11
return options;
12
13
if (this._importDER(options, enc))
14
return;
15
16
assert(options.r && options.s, 'Signature without r or s');
17
this.r = new bn(options.r, 16);
18
this.s = new bn(options.s, 16);
19
}
20
module.exports = Signature;
21
22
Signature.prototype._importDER = function _importDER(data, enc) {
23
data = utils.toArray(data, enc);
24
if (data.length < 6 || data[0] !== 0x30 || data[2] !== 0x02)
25
return false;
26
var total = data[1];
27
if (1 + total > data.length)
28
return false;
29
var rlen = data[3];
30
// Short length notation
31
if (rlen >= 0x80)
32
return false;
33
if (4 + rlen + 2 >= data.length)
34
return false;
35
if (data[4 + rlen] !== 0x02)
36
return false;
37
var slen = data[5 + rlen];
38
// Short length notation
39
if (slen >= 0x80)
40
return false;
41
if (4 + rlen + 2 + slen > data.length)
42
return false;
43
44
this.r = new bn(data.slice(4, 4 + rlen));
45
this.s = new bn(data.slice(4 + rlen + 2, 4 + rlen + 2 + slen));
46
47
return true;
48
};
49
50
Signature.prototype.toDER = function toDER(enc) {
51
var r = this.r.toArray();
52
var s = this.s.toArray();
53
54
// Pad values
55
if (r[0] & 0x80)
56
r = [ 0 ].concat(r);
57
// Pad values
58
if (s[0] & 0x80)
59
s = [ 0 ].concat(s);
60
61
var total = r.length + s.length + 4;
62
var res = [ 0x30, total, 0x02, r.length ];
63
res = res.concat(r, [ 0x02, s.length ], s);
64
return utils.encode(res, enc);
65
};
66
67