recover keys.
This commit is contained in:
parent
e68bab4ab3
commit
a6b1e8bdb0
@ -1740,6 +1740,23 @@ script.getOuputMN = function getOuputMN(s) {
|
|||||||
return { m: 1, n: 1 };
|
return { m: 1, n: 1 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
script.recoverKey = function recoverKey(sig, msg) {
|
||||||
|
var key;
|
||||||
|
|
||||||
|
try {
|
||||||
|
key = bcoin.ecdsa.recoverPubKey(msg, sig.slice(0, -1), 0);
|
||||||
|
} catch (e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bcoin.ecdsa.keyPair({ pub: key }).getPublic(true, 'array');
|
||||||
|
};
|
||||||
|
|
||||||
|
script.guessKey = function guessKey(sig, prev, tx, i) {
|
||||||
|
var msg = tx.signatureHash(i, prev, sig[sig.length - 1]);
|
||||||
|
return script.recoverKey(sig, msg);
|
||||||
|
};
|
||||||
|
|
||||||
script.isPubkey = function isPubkey(s, key) {
|
script.isPubkey = function isPubkey(s, key) {
|
||||||
var res;
|
var res;
|
||||||
|
|
||||||
@ -1894,7 +1911,7 @@ script.getInputType = function getInputType(s, prev) {
|
|||||||
|| null;
|
|| null;
|
||||||
};
|
};
|
||||||
|
|
||||||
script.isPubkeyInput = function isPubkeyInput(s, key, tx, i) {
|
script.isPubkeyInput = function isPubkeyInput(s, key, tx, index) {
|
||||||
if (s.length !== 1)
|
if (s.length !== 1)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -1906,11 +1923,17 @@ script.isPubkeyInput = function isPubkeyInput(s, key, tx, i) {
|
|||||||
// This will only work if the script verifies.
|
// This will only work if the script verifies.
|
||||||
if (key) {
|
if (key) {
|
||||||
assert(tx);
|
assert(tx);
|
||||||
assert(i != null);
|
assert(index != null);
|
||||||
if (!script.verify(s, [key, 'checksig'], tx, i))
|
if (!script.verify(s, [key, 'checksig'], tx, index))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if (key) {
|
||||||
|
// var recovered;
|
||||||
|
// recovered = script.guessKey(s[0], [key, 'checksig'], tx, index);
|
||||||
|
// return utils.isEqual(key, recovered || []);
|
||||||
|
// }
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1932,8 +1955,8 @@ script.isPubkeyhashInput = function isPubkeyhashInput(s, key) {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
script.isMultisigInput = function isMultisigInput(s, keys, tx, i) {
|
script.isMultisigInput = function isMultisigInput(s, keys, tx, index) {
|
||||||
var i, o;
|
var i, prev;
|
||||||
|
|
||||||
// We need to rule out scripthash because
|
// We need to rule out scripthash because
|
||||||
// it may look like multisig. This is
|
// it may look like multisig. This is
|
||||||
@ -1959,20 +1982,31 @@ script.isMultisigInput = function isMultisigInput(s, keys, tx, i) {
|
|||||||
if (keys) {
|
if (keys) {
|
||||||
assert(keys.length >= 2);
|
assert(keys.length >= 2);
|
||||||
assert(tx);
|
assert(tx);
|
||||||
assert(i != null);
|
assert(index != null);
|
||||||
o = script.createMultisig(keys, s.length - 1, keys.length);
|
prev = script.createMultisig(keys, s.length - 1, keys.length);
|
||||||
if (!script.verify(s, o, tx, i))
|
if (!script.verify(s, prev, tx, index))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We also also try to recover the keys from the signatures.
|
// We also also try to recover the keys from the signatures.
|
||||||
// var recovered = [];
|
// if (keys) {
|
||||||
// for (i = 1; i < s.length; i++) {
|
// var prev, recovered, j, total;
|
||||||
// var sig = s[i];
|
// recovered = [];
|
||||||
// var prev = script.createMultisig(keys, s.length - 1, keys.length);
|
// total = 0;
|
||||||
// var msg = tx.signatureHash(i, prev, s[s.length - 1]);
|
// for (i = 1; i < s.length; i++) {
|
||||||
// var key = bcoin.ecdsa.recoverPubKey(msg, sig.slice(0, -1), 0).toArray();
|
// prev = script.createMultisig(keys, s.length - 1, keys.length);
|
||||||
// recovered.push(key);
|
// recovered.push(script.guessKey(s[i], prev, tx, index) || []);
|
||||||
|
// }
|
||||||
|
// for (i = 0; i < recovered.length; i++) {
|
||||||
|
// for (j = 0; j < keys.length; j++) {
|
||||||
|
// if (utils.isEqual(recovered[i], keys[j])) {
|
||||||
|
// total++;
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (total !== s.length - 1)
|
||||||
|
// return false;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user