Newer
Older
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
let incorrect_flags = VerificationFlags::default().verify_checkdatasig(false);
let correct_signature_script = Builder::default()
.push_data(&*correct_signature)
.push_data(&*message)
.push_data(&*pubkey)
.push_opcode(Opcode::OP_CHECKDATASIGVERIFY)
.into_script();
// <sig> <msg> <pubKey> OP_CHECKDATASIGVERIFY fails if 15 November 2018 protocol upgrade is not yet activated.
basic_test_with_flags(&correct_signature_script, &incorrect_flags, Err(Error::DisabledOpcode(Opcode::OP_CHECKDATASIGVERIFY)), vec![].into());
// <sig> <msg> OP_CHECKDATASIGVERIFY fails if there are fewer than 3 item on stack.
let too_few_args_sig_script = Builder::default()
.push_data(&[1u8; 32])
.push_data(&*message)
.push_opcode(Opcode::OP_CHECKDATASIGVERIFY)
.into_script();
basic_test_with_flags(&too_few_args_sig_script, &correct_flags, Err(Error::InvalidStackOperation), vec![].into());
// <sig> <msg> <pubKey> OP_CHECKDATASIGVERIFYfails if <pubKey> is not a validly encoded public key.
let incorrect_pubkey_script = Builder::default()
.push_data(&*correct_signature)
.push_data(&*message)
.push_data(&[77u8; 15])
.push_opcode(Opcode::OP_CHECKDATASIGVERIFY)
.into_script();
basic_test_with_flags(&incorrect_pubkey_script, &correct_flags, Err(Error::PubkeyType), vec![].into());
// assuming that check_signature_encoding correctness is proved by other tests:
// <sig> <msg> <pubKey> OP_CHECKDATASIGVERIFY fails if <sig> is not a validly encoded signature with strict DER encoding.
// <sig> <msg> <pubKey> OP_CHECKDATASIGVERIFY fails if signature <sig> is not empty and does not pass the Low S check.
let incorrectly_encoded_signature_script = Builder::default()
.push_data(&[0u8; 65])
.push_data(&*message)
.push_data(&*pubkey)
.push_opcode(Opcode::OP_CHECKDATASIGVERIFY)
.into_script();
basic_test_with_flags(&incorrectly_encoded_signature_script, &correct_flags, Err(Error::SignatureDer), vec![].into());
// <sig> <msg> <pubKey> OP_CHECKDATASIGVERIFY fails if <sig> is not a valid signature of <msg> with respect to <pubKey>.
let incorrect_signature_script = Builder::default()
.push_data(&*correct_signature_for_other_message)
.push_data(&*message)
.push_data(&*pubkey)
.push_opcode(Opcode::OP_CHECKDATASIGVERIFY)
.into_script();
basic_test_with_flags(&incorrect_signature_script, &correct_flags, Err(Error::CheckDataSigVerify), vec![].into());
// <sig> <msg> <pubKey> OP_CHECKDATASIGVERIFY pops the top three stack elements if <sig> is a valid signature of <msg> with respect to <pubKey>.
// Ok(false) means success here, because OP_CHECKDATASIGVERIFY leaves empty stack
basic_test_with_flags(&correct_signature_script, &correct_flags, Ok(false), vec![].into());
}