mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 05:12:45 +01:00
bitcoin_script: fix out-by-one error in multisig.
Was using 3 instead of 2. OP_LITERAL() was a bad idea anyway, as it would only handle numbers up to 16 (and we use 32). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
17c56a8cfc
commit
769d2fd722
@ -9,7 +9,6 @@
|
||||
|
||||
/* Some standard ops */
|
||||
#define OP_PUSHBYTES(val) (val)
|
||||
#define OP_LITERAL(val) (0x51 + (val))
|
||||
#define OP_PUSHDATA1 0x4C
|
||||
#define OP_PUSHDATA2 0x4D
|
||||
#define OP_PUSHDATA4 0x4E
|
||||
@ -61,6 +60,20 @@ static void add_push_bytes(u8 **scriptp, const void *mem, size_t len)
|
||||
add(scriptp, mem, len);
|
||||
}
|
||||
|
||||
static void add_number(u8 **script, u32 num)
|
||||
{
|
||||
if (num == 0)
|
||||
add_op(script, 0);
|
||||
else if (num <= 16)
|
||||
add_op(script, 0x50 + num);
|
||||
else {
|
||||
u8 n = num;
|
||||
/* We could handle others, but currently unnecessary. */
|
||||
assert(num < 256);
|
||||
add_push_bytes(script, &n, sizeof(n));
|
||||
}
|
||||
}
|
||||
|
||||
static void add_push_key(u8 **scriptp, const struct pubkey *key)
|
||||
{
|
||||
add_push_bytes(scriptp, key->key, pubkey_len(key));
|
||||
@ -194,7 +207,7 @@ u8 *bitcoin_redeem_2of2(const tal_t *ctx,
|
||||
const struct pubkey *key2)
|
||||
{
|
||||
u8 *script = tal_arr(ctx, u8, 0);
|
||||
add_op(&script, OP_LITERAL(2));
|
||||
add_number(&script, 2);
|
||||
if (key_less(key1, key2)) {
|
||||
add_push_key(&script, key1);
|
||||
add_push_key(&script, key2);
|
||||
@ -202,7 +215,7 @@ u8 *bitcoin_redeem_2of2(const tal_t *ctx,
|
||||
add_push_key(&script, key2);
|
||||
add_push_key(&script, key1);
|
||||
}
|
||||
add_op(&script, OP_LITERAL(2));
|
||||
add_number(&script, 2);
|
||||
add_op(&script, OP_CHECKMULTISIG);
|
||||
return script;
|
||||
}
|
||||
@ -326,7 +339,7 @@ u8 *bitcoin_redeem_revocable(const tal_t *ctx,
|
||||
|
||||
/* If the top arg is a hashpreimage. */
|
||||
add_op(&script, OP_SIZE);
|
||||
add_op(&script, OP_LITERAL(32));
|
||||
add_number(&script, 32);
|
||||
add_op(&script, OP_EQUAL);
|
||||
add_op(&script, OP_IF);
|
||||
|
||||
@ -347,7 +360,7 @@ u8 *bitcoin_redeem_revocable(const tal_t *ctx,
|
||||
* will return). */
|
||||
add_op(&script, OP_ELSE);
|
||||
|
||||
add_op(&script, OP_LITERAL(2));
|
||||
add_number(&script, 2);
|
||||
/* This obscures whose key is whose. Probably unnecessary? */
|
||||
if (key_less(mykey, theirkey)) {
|
||||
add_push_key(&script, mykey);
|
||||
@ -356,7 +369,7 @@ u8 *bitcoin_redeem_revocable(const tal_t *ctx,
|
||||
add_push_key(&script, theirkey);
|
||||
add_push_key(&script, mykey);
|
||||
}
|
||||
add_op(&script, OP_LITERAL(2));
|
||||
add_number(&script, 2);
|
||||
add_op(&script, OP_CHECKMULTISIG);
|
||||
add_op(&script, OP_ENDIF);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user