Skip to content

Commit

Permalink
fix: more tests passing (#282)
Browse files Browse the repository at this point in the history
<!-- enter the gh issue after hash -->

- [x] addresses issue #247
- [x] follows contribution
[guide](https://github.com/keep-starknet-strange/shinigami/blob/main/CONTRIBUTING.md)
- [ ] ~code change includes tests~

<!-- PR description below -->
### New tests passing:
 - `SIG_HIGH_S`:
 ```
["0x48
0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001","0x21
0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640
CHECKSIG","LOW_S","SIG_HIGH_S","P2PK with high S"]
```

- `DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM`:
```

[["304402205ae57ae0534c05ca9981c8a6cdf353b505eaacb7375f96681a2d1a4ba6f02f84022056248e68643b7d8ce7c7d128c9f1f348bcab8be15d094ad5cadd24251a28df8001","0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",0E-8],"","1
0x14
0x91b24bf9f5288532960ac687abb035127b1d28a5","DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM,P2SH,WITNESS","DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM","P2WPKH
with future witness version"],
```

---------

Co-authored-by: Brandon Roberts <brandonjroberts22@gmail.com>
  • Loading branch information
SoarinSkySagar and b-j-roberts authored Nov 18, 2024
1 parent ff444ed commit 739a292
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 22 deletions.
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;
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

0 comments on commit 739a292

Please sign in to comment.