mirror of
https://github.com/LBRYFoundation/lbcd.git
synced 2025-09-11 21:19:50 +00:00
Fix a number of bugs in signature checking
When given badly formatted signature or pubkeys like in block 0000000000000001e4241fd0b3469a713f41c5682605451c05d3033288fb2244, transaction fd9b541d23f6e9bddb34ede15c7684eeec36231118796b691ae525f95578acf1 we could fail on strange scripts because we returned an error instead of failing the opcode and putting a FALSE on the stack. Fixes chainfork issue on the aforementioned block.
This commit is contained in:
parent
b11f1620e2
commit
e8881196d6
1 changed files with 16 additions and 8 deletions
24
opcode.go
24
opcode.go
|
@ -1723,7 +1723,8 @@ func opcodeCheckSig(op *parsedOpcode, s *Script) error {
|
||||||
|
|
||||||
pubKey, err := btcec.ParsePubKey(pkStr, btcec.S256())
|
pubKey, err := btcec.ParsePubKey(pkStr, btcec.S256())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
s.dstack.PushBool(false)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var signature *btcec.Signature
|
var signature *btcec.Signature
|
||||||
|
@ -1733,7 +1734,8 @@ func opcodeCheckSig(op *parsedOpcode, s *Script) error {
|
||||||
signature, err = btcec.ParseSignature(sigStr, btcec.S256())
|
signature, err = btcec.ParseSignature(sigStr, btcec.S256())
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
s.dstack.PushBool(false)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Tracef("%v", newLogClosure(func() string {
|
log.Tracef("%v", newLogClosure(func() string {
|
||||||
|
@ -1798,32 +1800,38 @@ func opcodeCheckMultiSig(op *parsedOpcode, s *Script) error {
|
||||||
nsig := int(numSignatures.Int64())
|
nsig := int(numSignatures.Int64())
|
||||||
|
|
||||||
sigStrings := make([][]byte, nsig)
|
sigStrings := make([][]byte, nsig)
|
||||||
signatures := make([]*btcec.Signature, nsig)
|
signatures := make([]*btcec.Signature, 0, nsig)
|
||||||
for i := range signatures {
|
for i := range sigStrings {
|
||||||
sigStrings[i], err = s.dstack.PopByteArray()
|
sigStrings[i], err = s.dstack.PopByteArray()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
var sig *btcec.Signature
|
||||||
// skip off the last byte for hashtype
|
// skip off the last byte for hashtype
|
||||||
if s.der {
|
if s.der {
|
||||||
signatures[i], err =
|
sig, err =
|
||||||
btcec.ParseDERSignature(
|
btcec.ParseDERSignature(
|
||||||
sigStrings[i][:len(sigStrings[i])-1],
|
sigStrings[i][:len(sigStrings[i])-1],
|
||||||
btcec.S256())
|
btcec.S256())
|
||||||
} else {
|
} else {
|
||||||
signatures[i], err =
|
sig, err =
|
||||||
btcec.ParseSignature(
|
btcec.ParseSignature(
|
||||||
sigStrings[i][:len(sigStrings[i])-1],
|
sigStrings[i][:len(sigStrings[i])-1],
|
||||||
btcec.S256())
|
btcec.S256())
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err == nil {
|
||||||
return err
|
signatures = append(signatures, sig)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// bug in bitcoind mean we pop one more stack value than should be used.
|
// bug in bitcoind mean we pop one more stack value than should be used.
|
||||||
_, err = s.dstack.PopByteArray()
|
_, err = s.dstack.PopByteArray()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(signatures) == 0 {
|
||||||
|
s.dstack.PushBool(false)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue