mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-05-29 20:28:45 +00:00
signing/multisig: fix signature order in input_script_multisig
This commit is contained in:
parent
d6c0fae045
commit
e9ae9e6f1e
@ -158,8 +158,9 @@ def get_p2wsh_witness(multisig: MultisigRedeemScriptType, signature: bytes, sign
|
|||||||
for s in signatures:
|
for s in signatures:
|
||||||
append_signature(w, s, sighash) # size of the witness included
|
append_signature(w, s, sighash) # size of the witness included
|
||||||
|
|
||||||
redeem_script = script_multisig(multisig_get_pubkeys(multisig), multisig.m)
|
# redeem script
|
||||||
|
pubkeys = multisig_get_pubkeys(multisig)
|
||||||
|
redeem_script = script_multisig(pubkeys, multisig.m)
|
||||||
write_varint(w, len(redeem_script))
|
write_varint(w, len(redeem_script))
|
||||||
write_bytes(w, redeem_script)
|
write_bytes(w, redeem_script)
|
||||||
return w
|
return w
|
||||||
@ -167,22 +168,28 @@ def get_p2wsh_witness(multisig: MultisigRedeemScriptType, signature: bytes, sign
|
|||||||
|
|
||||||
# -------------------------- Multisig --------------------------
|
# -------------------------- Multisig --------------------------
|
||||||
|
|
||||||
def input_script_multisig(current_signature, other_signatures, pubkeys, m: int, sighash: int):
|
def input_script_multisig(multisig: MultisigRedeemScriptType, signature: bytes, signature_index: int, sighash: int):
|
||||||
|
|
||||||
|
signatures = multisig.signatures # other signatures
|
||||||
|
if len(signatures[signature_index]) > 0:
|
||||||
|
raise ScriptsError('One of the multisig signatures occupies the current signature\'s spot')
|
||||||
|
signatures[signature_index] = signature # our signature
|
||||||
|
|
||||||
w = bytearray()
|
w = bytearray()
|
||||||
# starts with OP_FALSE because of an old OP_CHECKMULTISIG bug,
|
# starts with OP_FALSE because of an old OP_CHECKMULTISIG bug,
|
||||||
# which consumes one additional item on the stack
|
# which consumes one additional item on the stack
|
||||||
# see https://bitcoin.org/en/developer-guide#standard-transactions
|
# see https://bitcoin.org/en/developer-guide#standard-transactions
|
||||||
w.append(0x00)
|
w.append(0x00)
|
||||||
for s in other_signatures:
|
|
||||||
|
for s in signatures:
|
||||||
if len(s):
|
if len(s):
|
||||||
append_signature(w, s, sighash)
|
append_signature(w, s, sighash)
|
||||||
|
|
||||||
append_signature(w, current_signature, sighash)
|
|
||||||
|
|
||||||
# redeem script
|
# redeem script
|
||||||
redeem_script = script_multisig(pubkeys, m)
|
pubkeys = multisig_get_pubkeys(multisig)
|
||||||
|
redeem_script = script_multisig(pubkeys, multisig.m)
|
||||||
write_op_push(w, len(redeem_script))
|
write_op_push(w, len(redeem_script))
|
||||||
write_bytes(w, script_multisig(pubkeys, m))
|
write_bytes(w, redeem_script)
|
||||||
return w
|
return w
|
||||||
|
|
||||||
|
|
||||||
|
@ -504,8 +504,9 @@ def input_derive_script(coin: CoinType, i: TxInputType, pubkey: bytes, signature
|
|||||||
|
|
||||||
if i.script_type == InputScriptType.SPENDP2SHWITNESS: # p2wpkh or p2wsh using p2sh
|
if i.script_type == InputScriptType.SPENDP2SHWITNESS: # p2wpkh or p2wsh using p2sh
|
||||||
if i.multisig: # p2wsh in p2sh
|
if i.multisig: # p2wsh in p2sh
|
||||||
return input_script_p2wsh_in_p2sh(output_script_multisig_p2wsh(multisig_get_pubkeys(i.multisig),
|
pubkeys = multisig_get_pubkeys(i.multisig)
|
||||||
i.multisig.m))
|
script_hash = output_script_multisig_p2wsh(pubkeys, i.multisig.m)
|
||||||
|
return input_script_p2wsh_in_p2sh(script_hash)
|
||||||
# p2wpkh in p2sh
|
# p2wpkh in p2sh
|
||||||
return input_script_p2wpkh_in_p2sh(ecdsa_hash_pubkey(pubkey))
|
return input_script_p2wpkh_in_p2sh(ecdsa_hash_pubkey(pubkey))
|
||||||
|
|
||||||
@ -514,8 +515,12 @@ def input_derive_script(coin: CoinType, i: TxInputType, pubkey: bytes, signature
|
|||||||
|
|
||||||
# multisig
|
# multisig
|
||||||
elif i.script_type == InputScriptType.SPENDMULTISIG:
|
elif i.script_type == InputScriptType.SPENDMULTISIG:
|
||||||
return input_script_multisig(signature, i.multisig.signatures, multisig_get_pubkeys(i.multisig), i.multisig.m,
|
signature_index = multisig_pubkey_index(i.multisig, pubkey)
|
||||||
get_hash_type(coin))
|
if signature_index is None:
|
||||||
|
raise SigningError(FailureType.DataError,
|
||||||
|
'Pubkey not found in multisig script')
|
||||||
|
return input_script_multisig(
|
||||||
|
i.multisig, signature, signature_index, get_hash_type(coin))
|
||||||
else:
|
else:
|
||||||
raise SigningError(FailureType.ProcessError, 'Invalid script type')
|
raise SigningError(FailureType.ProcessError, 'Invalid script type')
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user