1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
crate::ix!();

//-------------------------------------------[.cpp/bitcoin/src/test/fuzz/signature_checker.cpp]

pub fn initialize_signature_checker()  {
    
    todo!();
        /*
            static const auto verify_handle = std::make_unique<ECCVerifyHandle>();
        */
}

pub struct FuzzedSignatureChecker {
    fuzzed_data_provider: Rc<RefCell<FuzzedDataProvider>>,
}

impl BaseSignatureChecker for FuzzedSignatureChecker {

}

impl FuzzedSignatureChecker {

    pub fn new(fuzzed_data_provider: &mut FuzzedDataProvider) -> Self {
    
        todo!();
        /*
        : fuzzed_data_provider(fuzzed_data_provider),

        
        */
    }
    
    pub fn check_ecdsa_signature(&self, 
        script_sig:  &Vec<u8>,
        vch_pub_key: &Vec<u8>,
        script_code: &Script,
        sigversion:  SigVersion) -> bool {
        
        todo!();
        /*
            return m_fuzzed_data_provider.ConsumeBool();
        */
    }
    
    pub fn check_schnorr_signature(&self, 
        sig:        &[u8],
        pubkey:     &[u8],
        sigversion: SigVersion,
        execdata:   &ScriptExecutionData,
        serror:     Option<*mut ScriptError>) -> bool {

        todo!();
        /*
            return m_fuzzed_data_provider.ConsumeBool();
        */
    }
    
    pub fn check_lock_time(&self, n_lock_time: &ScriptNum) -> bool {
        
        todo!();
        /*
            return m_fuzzed_data_provider.ConsumeBool();
        */
    }
    
    pub fn check_sequence(&self, n_sequence: &ScriptNum) -> bool {
        
        todo!();
        /*
            return m_fuzzed_data_provider.ConsumeBool();
        */
    }
}

#[fuzz_test(initializer = "initialize_signature_checker")]
fn signature_checker() {
    todo!();
    /*
    
        FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
        const unsigned int flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
        const SigVersion sig_version = fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0});
        const auto script_1 = ConsumeScript(fuzzed_data_provider, 65536);
        const auto script_2 = ConsumeScript(fuzzed_data_provider, 65536);
        std::vector<std::vector<unsigned char>> stack;
        (c_void)EvalScript(stack, script_1, flags, FuzzedSignatureChecker(fuzzed_data_provider), sig_version, nullptr);
        if (!IsValidFlagCombination(flags)) {
            return;
        }
        (c_void)VerifyScript(script_1, script_2, nullptr, flags, FuzzedSignatureChecker(fuzzed_data_provider), nullptr);

    */
}