Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: more tests passing #282

Merged
merged 11 commits into from
Nov 18, 2024
Merged
36 changes: 17 additions & 19 deletions packages/engine/src/flags.cairo
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
use shinigami_utils::byte_array::byte_array_to_felt252_be;

#[derive(Copy, Drop)]
pub enum ScriptFlags {
// ScriptBip16, allows P2SH transactions.
Expand Down Expand Up @@ -74,38 +72,38 @@ impl ScriptFlagsIntoU32 of Into<ScriptFlags, u32> {
}
}

fn flag_from_string(flag: felt252) -> u32 {
fn flag_from_string(flag: ByteArray) -> u32 {
// TODO: To map and remaining flags
if flag == 'P2SH' {
if flag == "P2SH" {
return ScriptFlags::ScriptBip16.into();
} else if flag == 'STRICTENC' {
} else if flag == "STRICTENC" {
return ScriptFlags::ScriptVerifyStrictEncoding.into();
} else if flag == 'MINIMALDATA' {
} else if flag == "MINIMALDATA" {
return ScriptFlags::ScriptVerifyMinimalData.into();
} else if flag == 'DISCOURAGE_UPGRADABLE_NOPS' {
} else if flag == "DISCOURAGE_UPGRADABLE_NOPS" {
return ScriptFlags::ScriptDiscourageUpgradableNops.into();
} else if flag == 'DERSIG' {
} else if flag == "DERSIG" {
return ScriptFlags::ScriptVerifyDERSignatures.into();
} else if flag == 'WITNESS' {
} else if flag == "WITNESS" {
return ScriptFlags::ScriptVerifyWitness.into();
} else if flag == 'LOW_S' {
} else if flag == "LOW_S" {
return ScriptFlags::ScriptVerifyLowS.into();
} else if flag == 'NULLDUMMY' {
} else if flag == "NULLDUMMY" {
// TODO: Double check this
return ScriptFlags::ScriptStrictMultiSig.into();
} else if flag == 'NULLFAIL' {
} else if flag == "NULLFAIL" {
return ScriptFlags::ScriptVerifyNullFail.into();
} else if flag == 'SIGPUSHONLY' {
} else if flag == "SIGPUSHONLY" {
return ScriptFlags::ScriptVerifySigPushOnly.into();
} else if flag == 'CLEANSTACK' {
} else if flag == "CLEANSTACK" {
return ScriptFlags::ScriptVerifyCleanStack.into();
} else if flag == 'DISCOURAGE_UPGRADABLE_WITNESS' {
} else if flag == "DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM" {
return ScriptFlags::ScriptVerifyDiscourageUpgradeableWitnessProgram.into();
} else if flag == 'WITNESS_PUBKEYTYPE' {
} else if flag == "WITNESS_PUBKEYTYPE" {
return ScriptFlags::ScriptVerifyWitnessPubKeyType.into();
} else if flag == 'MINIMALIF' {
} else if flag == "MINIMALIF" {
return ScriptFlags::ScriptVerifyMinimalIf.into();
} else if flag == 'CHECKSEQUENCEVERIFY' {
} else if flag == "CHECKSEQUENCEVERIFY" {
return ScriptFlags::ScriptVerifyCheckSequenceVerify.into();
} else {
return 0;
b-j-roberts marked this conversation as resolved.
Show resolved Hide resolved
Expand Down Expand Up @@ -145,7 +143,7 @@ pub fn parse_flags(flags: ByteArray) -> u32 {
let flags_len = split_flags.len();
while i != flags_len {
let flag = split_flags.at(i);
let flag_value = flag_from_string(byte_array_to_felt252_be(flag));
let flag_value = flag_from_string(flag.clone());
script_flags += flag_value;
i += 1;
};
Expand Down
7 changes: 6 additions & 1 deletion packages/engine/src/signature/signature.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,12 @@ pub fn check_signature_encoding<

// If the "low S" rule is enforced, check that the `S` value is below the threshold.
if low_s {
let s_value = u256_from_byte_array_with_offset(sig_bytes, s_offset, s_len);
let mut s_value = 0;
if s_len == 33 {
s_value = u256_from_byte_array_with_offset(sig_bytes, s_offset + 1, 32);
} else {
s_value = u256_from_byte_array_with_offset(sig_bytes, s_offset, s_len);
}
let mut half_order = Secp256Trait::<Secp256k1Point>::get_curve_size();

let (half_order_high_upper, half_order_high_lower) = DivRem::div_rem(half_order.high, 2);
Expand Down
5 changes: 5 additions & 0 deletions tests/run-core-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ jq -c '.[]' $SCRIPT_TESTS_JSON | {
WITNESS_MALLEATED_P2SH="Execution failed: Signature script for p2sh wit"
WITNESS_PUBKEYTYPE="Execution failed: Non-compressed key post-segwit"
SIG_HIGH_S="Execution failed: Sig not canonical high S value"
DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM="Execution failed: Upgradable witness program"
if echo "$RESULT" | grep -q "$EVAL_FALSE_RES"; then
SCRIPT_RESULT="EVAL_FALSE"
elif echo "$RESULT" | grep -q "$EMPTY_STACK_RES"; then
Expand Down Expand Up @@ -247,6 +248,10 @@ jq -c '.[]' $SCRIPT_TESTS_JSON | {
SCRIPT_RESULT="WITNESS_PUBKEYTYPE"
elif echo "$RESULT" | grep -q "$SIG_DER"; then
SCRIPT_RESULT="SIG_DER"
elif echo "$RESULT" | grep -q "$SIG_HIGH_S"; then
SCRIPT_RESULT="SIG_HIGH_S"
elif echo "$RESULT" | grep -q "$DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"; then
SCRIPT_RESULT="DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"
else
SCRIPT_RESULT="FAIL"
fi
Expand Down
3 changes: 3 additions & 0 deletions tests/run-failing-core-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ jq -c '.[]' $SCRIPT_TESTS_JSON | {
INVALID_WITNESS="Execution failed: Invalid witness program"
SIG_DER="Execution failed: Signature DER error"
SIG_HIGH_S="Execution failed: Sig not canonical high S value"
DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM="Execution failed: Upgradable witness program"
if echo "$RESULT" | grep -q "$EVAL_FALSE_RES"; then
SCRIPT_RESULT="EVAL_FALSE"
elif echo "$RESULT" | grep -q "$EMPTY_STACK_RES"; then
Expand Down Expand Up @@ -208,6 +209,8 @@ jq -c '.[]' $SCRIPT_TESTS_JSON | {
SCRIPT_RESULT="SIG_DER"
elif echo "$RESULT" | grep -q "$SIG_HIGH_S"; then
SCRIPT_RESULT="SIG_HIGH_S"
elif echo "$RESULT" | grep -q "$DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"; then
SCRIPT_RESULT="DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM"
else
SCRIPT_RESULT="FAIL"
fi
Expand Down
2 changes: 0 additions & 2 deletions tests/script_tests_failing.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
[
["0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001","0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG","LOW_S","SIG_HIGH_S","P2PK with high S"],
[["304402205ae57ae0534c05ca9981c8a6cdf353b505eaacb7375f96681a2d1a4ba6f02f84022056248e68643b7d8ce7c7d128c9f1f348bcab8be15d094ad5cadd24251a28df8001","0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",0E-8],"","1 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5","DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM,P2SH,WITNESS","DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM","P2WPKH with future witness version"],
[["","304402202d092ededd1f060609dbf8cb76950634ff42b3e62cf4adb69ab92397b07d742302204ff886f8d0817491a96d1daccdcc820f6feb122ee6230143303100db37dfa79f01","5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",1E-8],"","0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa","P2SH,WITNESS,WITNESS_PUBKEYTYPE","WITNESS_PUBKEYTYPE","P2WSH CHECKMULTISIG with first key uncompressed and signing with the first key"],
[["","304402202dd7e91243f2235481ffb626c3b7baf2c859ae3a5a77fb750ef97b99a8125dc002204960de3d3c3ab9496e218ec57e5240e0e10a6f9546316fe240c216d45116d29301","5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",1E-8],"0x22 0x002008a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa","HASH160 0x14 0x6f5ecd4b83b77f3c438f5214eff96454934fc5d1 EQUAL","P2SH,WITNESS,WITNESS_PUBKEYTYPE","WITNESS_PUBKEYTYPE","P2SH(P2WSH) CHECKMULTISIG with first key uncompressed and signing with the first key"],
[["","304402201e9e6f7deef5b2f21d8223c5189b7d5e82d237c10e97165dd08f547c4e5ce6ed02206796372eb1cc6acb52e13ee2d7f45807780bf96b132cb6697f69434be74b1af901","5121038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b852ae",1E-8],"","0 0x20 0x08a6665ebfd43b02323423e764e185d98d1587f903b81507dbb69bfc41005efa","P2SH,WITNESS,WITNESS_PUBKEYTYPE","WITNESS_PUBKEYTYPE","P2WSH CHECKMULTISIG with first key uncompressed and signing with the second key"],
Expand Down
2 changes: 2 additions & 0 deletions tests/script_tests_passing.json
Original file line number Diff line number Diff line change
Expand Up @@ -1041,6 +1041,7 @@
["0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101","0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG","","OK","P2PK with multi-byte hashtype, without DERSIG"],
["0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101","0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG","DERSIG","SIG_DER","P2PK with multi-byte hashtype, with DERSIG"],
["0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001","0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG","","OK","P2PK with high S but no LOW_S"],
["0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001","0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG","LOW_S","SIG_HIGH_S","P2PK with high S"],
["0x47 0x3044022057292e2d4dfe775becdd0a9e6547997c728cdf35390f6a017da56d654d374e4902206b643be2fc53763b4e284845bfea2c597d2dc7759941dce937636c9d341b71ed01","0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG","","OK","P2PK with hybrid pubkey but no STRICTENC"],
["0x47 0x3044022057292e2d4dfe775becdd0a9e6547997c728cdf35390f6a017da56d654d374e4902206b643be2fc53763b4e284845bfea2c597d2dc7759941dce937636c9d341b71ed01","0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG","STRICTENC","PUBKEYTYPE","P2PK with hybrid pubkey"],
["0x47 0x30440220035d554e3153c14950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101","0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT","","EVAL_FALSE","P2PK NOT with hybrid pubkey but no STRICTENC"],
Expand Down Expand Up @@ -1086,6 +1087,7 @@
[["304402203b3389b87448d7dfdb5e82fb854fcf92d7925f9938ea5444e36abef02c3d6a9602202410bc3265049abb07fd2e252c65ab7034d95c9d5acccabe9fadbdc63a52712601","0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",0E-8],"","0 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5","P2SH,WITNESS","EVAL_FALSE","Basic P2WPKH with wrong value"],
[["3044022000a30c4cfc10e4387be528613575434826ad3c15587475e0df8ce3b1746aa210022008149265e4f8e9dafe1f3ea50d90cb425e9e40ea7ebdd383069a7cfa2b77004701","410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",0E-8],"0x22 0x0020b95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64","HASH160 0x14 0xf386c2ba255cc56d20cfa6ea8b062f8b59945518 EQUAL","P2SH,WITNESS","EVAL_FALSE","Basic P2SH(P2WSH) with wrong value"],
[["304402204fc3a2cd61a47913f2a5f9107d0ad4a504c7b31ee2d6b3b2f38c2b10ee031e940220055d58b7c3c281aaa381d8f486ac0f3e361939acfd568046cb6a311cdfa974cf01","0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",0E-8],"0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5","HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL","P2SH,WITNESS","EVAL_FALSE","Basic P2SH(P2WPKH) with wrong value"],
[["304402205ae57ae0534c05ca9981c8a6cdf353b505eaacb7375f96681a2d1a4ba6f02f84022056248e68643b7d8ce7c7d128c9f1f348bcab8be15d094ad5cadd24251a28df8001","0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",0E-8],"","1 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5","DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM,P2SH,WITNESS","DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM","P2WPKH with future witness version"],
[["3044022064100ca0e2a33332136775a86cd83d0230e58b9aebb889c5ac952abff79a46ef02205f1bf900e022039ad3091bdaf27ac2aef3eae9ed9f190d821d3e508405b9513101","0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",0E-8],"","0 0x1f 0xb34b78da162751647974d5cb7410aa428ad339dbf7d1e16e833f68a0cbf1c3","P2SH,WITNESS","WITNESS_PROGRAM_WRONG_LENGTH","P2WPKH with wrong witness program length"],
["","0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64","P2SH,WITNESS","WITNESS_PROGRAM_WITNESS_EMPTY","P2WSH with empty witness"],
[["3044022039105b995a5f448639a997a5c90fda06f50b49df30c3bdb6663217bf79323db002206fecd54269dec569fcc517178880eb58bb40f381a282bb75766ff3637d5f4b4301","400479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",0E-8],"","0 0x20 0xb95237b48faaa69eb078e1170be3b5cbb3fddf16d0a991e14ad274f7b33a4f64","P2SH,WITNESS","WITNESS_PROGRAM_MISMATCH","P2WSH with witness program mismatch"],
Expand Down