diff --git a/packages/engine/src/flags.cairo b/packages/engine/src/flags.cairo index 5dec8419..7a221fe0 100644 --- a/packages/engine/src/flags.cairo +++ b/packages/engine/src/flags.cairo @@ -1,5 +1,3 @@ -use shinigami_utils::byte_array::byte_array_to_felt252_be; - #[derive(Copy, Drop)] pub enum ScriptFlags { // ScriptBip16, allows P2SH transactions. @@ -74,38 +72,38 @@ impl ScriptFlagsIntoU32 of Into { } } -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; @@ -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; }; diff --git a/packages/engine/src/signature/signature.cairo b/packages/engine/src/signature/signature.cairo index f5e8091a..d4be7329 100644 --- a/packages/engine/src/signature/signature.cairo +++ b/packages/engine/src/signature/signature.cairo @@ -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::::get_curve_size(); let (half_order_high_upper, half_order_high_lower) = DivRem::div_rem(half_order.high, 2); diff --git a/tests/run-core-tests.sh b/tests/run-core-tests.sh index e351092b..08406a22 100755 --- a/tests/run-core-tests.sh +++ b/tests/run-core-tests.sh @@ -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 @@ -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 diff --git a/tests/run-failing-core-tests.sh b/tests/run-failing-core-tests.sh index 3d45f926..0f3d4103 100755 --- a/tests/run-failing-core-tests.sh +++ b/tests/run-failing-core-tests.sh @@ -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 @@ -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 diff --git a/tests/script_tests_failing.json b/tests/script_tests_failing.json index c8311a45..4afcebde 100644 --- a/tests/script_tests_failing.json +++ b/tests/script_tests_failing.json @@ -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"], diff --git a/tests/script_tests_passing.json b/tests/script_tests_passing.json index 264ba847..34fd33fc 100644 --- a/tests/script_tests_passing.json +++ b/tests/script_tests_passing.json @@ -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"], @@ -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"],