normalize DER signature length.
This commit is contained in:
parent
d22dc02e8f
commit
86cebb7e3b
@ -295,7 +295,7 @@ Pool.prototype.startServer = function startServer() {
|
|||||||
|
|
||||||
this.server.on('connection', function(socket) {
|
this.server.on('connection', function(socket) {
|
||||||
self._addLeech(socket);
|
self._addLeech(socket);
|
||||||
})
|
});
|
||||||
|
|
||||||
this.server.on('listening', function() {
|
this.server.on('listening', function() {
|
||||||
var data = self.server.address();
|
var data = self.server.address();
|
||||||
|
|||||||
@ -304,6 +304,11 @@ script.checksig = function checksig(msg, sig, key) {
|
|||||||
|
|
||||||
sig = sig.slice(0, -1);
|
sig = sig.slice(0, -1);
|
||||||
|
|
||||||
|
// Attempt to normalize the signature
|
||||||
|
// length before passing to elliptic.
|
||||||
|
// https://github.com/indutny/elliptic/issues/78
|
||||||
|
sig = script.normalizeDER(sig);
|
||||||
|
|
||||||
// Use a try catch in case there are
|
// Use a try catch in case there are
|
||||||
// any uncaught errors for bad inputs in verify().
|
// any uncaught errors for bad inputs in verify().
|
||||||
try {
|
try {
|
||||||
@ -311,6 +316,11 @@ script.checksig = function checksig(msg, sig, key) {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
utils.debug('Elliptic threw during verification:');
|
utils.debug('Elliptic threw during verification:');
|
||||||
utils.debug(e.stack + '');
|
utils.debug(e.stack + '');
|
||||||
|
utils.debug({
|
||||||
|
msg: utils.toHex(msg),
|
||||||
|
sig: utils.toHex(sig),
|
||||||
|
key: utils.toHex(key)
|
||||||
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -340,6 +350,56 @@ script.sign = function sign(msg, key, type) {
|
|||||||
return sig;
|
return sig;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
script.normalizeDER = function normalizeDER(signature) {
|
||||||
|
var data, p, len, rlen, slen;
|
||||||
|
|
||||||
|
if (Buffer.isBuffer(signature))
|
||||||
|
signature = Array.prototype.slice.call(signature);
|
||||||
|
else if (typeof signature === 'string')
|
||||||
|
signature = utils.toArray(signature, 'hex');
|
||||||
|
|
||||||
|
data = signature.slice();
|
||||||
|
p = { place: 0 };
|
||||||
|
|
||||||
|
if (data[p.place++] !== 0x30)
|
||||||
|
return signature;
|
||||||
|
|
||||||
|
len = getLength(data, p);
|
||||||
|
|
||||||
|
if (data.length > len + p.place)
|
||||||
|
data = data.slice(0, len + p.place);
|
||||||
|
|
||||||
|
if (data[p.place++] !== 0x02)
|
||||||
|
return signature;
|
||||||
|
|
||||||
|
rlen = getLength(data, p);
|
||||||
|
p.place += rlen;
|
||||||
|
|
||||||
|
if (data[p.place++] !== 0x02)
|
||||||
|
return signature;
|
||||||
|
|
||||||
|
slen = getLength(data, p);
|
||||||
|
if (data.length > slen + p.place)
|
||||||
|
data = data.slice(0, slen + p.place);
|
||||||
|
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|
||||||
|
function getLength(buf, p) {
|
||||||
|
var initial = buf[p.place++];
|
||||||
|
if (!(initial & 0x80)) {
|
||||||
|
return initial;
|
||||||
|
}
|
||||||
|
var octetLen = initial & 0xf;
|
||||||
|
var val = 0;
|
||||||
|
for (var i = 0, off = p.place; i < octetLen; i++, off++) {
|
||||||
|
val <<= 8;
|
||||||
|
val |= buf[off];
|
||||||
|
}
|
||||||
|
p.place = off;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
script._next = function _next(to, s, pc) {
|
script._next = function _next(to, s, pc) {
|
||||||
var depth = 0;
|
var depth = 0;
|
||||||
var o;
|
var o;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user