interpreter.rs 172 KiB
Newer Older
		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());
	}