#[cfg(feature = "secp256k1-fallback")]
mod secp256k1_impl;
#[cfg(feature = "blvm-secp256k1")]
mod blvm_impl;
use crate::error::Result;
use crate::types::Hash;
pub fn verify_ecdsa(
msg_hash: &[u8; 32],
sig_compact: &[u8; 64],
pubkey_compressed: &[u8; 33],
) -> Result<bool> {
#[cfg(feature = "blvm-secp256k1")]
return blvm_impl::verify_ecdsa(msg_hash, sig_compact, pubkey_compressed);
#[cfg(all(feature = "secp256k1-fallback", not(feature = "blvm-secp256k1")))]
return secp256k1_impl::verify_ecdsa(msg_hash, sig_compact, pubkey_compressed);
#[cfg(not(any(feature = "blvm-secp256k1", feature = "secp256k1-fallback")))]
Err(crate::error::ConsensusError::BlockValidation(
"no crypto backend enabled".into(),
))
}
pub fn verify_schnorr(sig: &[u8; 64], msg: &[u8], pubkey: &[u8; 32]) -> Result<bool> {
#[cfg(feature = "blvm-secp256k1")]
return blvm_impl::verify_schnorr(sig, msg, pubkey);
#[cfg(all(feature = "secp256k1-fallback", not(feature = "blvm-secp256k1")))]
return secp256k1_impl::verify_schnorr(sig, msg, pubkey);
#[cfg(not(any(feature = "blvm-secp256k1", feature = "secp256k1-fallback")))]
Err(crate::error::ConsensusError::BlockValidation(
"no crypto backend enabled".into(),
))
}
pub fn verify_schnorr_batch(
sigs: &[[u8; 64]],
msgs: &[&[u8]],
pubkeys: &[[u8; 32]],
) -> Result<Vec<bool>> {
#[cfg(feature = "blvm-secp256k1")]
return blvm_impl::verify_schnorr_batch(sigs, msgs, pubkeys);
#[cfg(all(feature = "secp256k1-fallback", not(feature = "blvm-secp256k1")))]
return secp256k1_impl::verify_schnorr_batch(sigs, msgs, pubkeys);
#[cfg(not(any(feature = "blvm-secp256k1", feature = "secp256k1-fallback")))]
Err(crate::error::ConsensusError::BlockValidation(
"no crypto backend enabled".into(),
))
}
#[cfg(feature = "blvm-secp256k1")]
#[inline]
pub fn verify_ecdsa_direct(
der_sig: &[u8],
pubkey_bytes: &[u8],
msg_hash: &[u8; 32],
strict_der: bool,
enforce_low_s: bool,
) -> Option<bool> {
blvm_secp256k1::ecdsa::verify_ecdsa_direct(
der_sig,
pubkey_bytes,
msg_hash,
strict_der,
enforce_low_s,
)
}
pub fn taproot_output_key(internal_pubkey: &[u8; 32], merkle_root: &Hash) -> Result<[u8; 32]> {
#[cfg(feature = "blvm-secp256k1")]
return blvm_impl::taproot_output_key(internal_pubkey, merkle_root);
#[cfg(all(feature = "secp256k1-fallback", not(feature = "blvm-secp256k1")))]
return secp256k1_impl::taproot_output_key(internal_pubkey, merkle_root);
#[cfg(not(any(feature = "blvm-secp256k1", feature = "secp256k1-fallback")))]
Err(crate::error::ConsensusError::BlockValidation(
"no crypto backend enabled".into(),
))
}
pub fn tap_leaf_hash(leaf_version: u8, script: &[u8]) -> [u8; 32] {
#[cfg(feature = "blvm-secp256k1")]
return blvm_secp256k1::taproot::tap_leaf_hash(leaf_version, script);
#[cfg(all(feature = "secp256k1-fallback", not(feature = "blvm-secp256k1")))]
return secp256k1_impl::tap_leaf_hash(leaf_version, script);
#[cfg(not(any(feature = "blvm-secp256k1", feature = "secp256k1-fallback")))]
[0u8; 32]
}
pub fn tap_branch_hash(left: &[u8; 32], right: &[u8; 32]) -> [u8; 32] {
#[cfg(feature = "blvm-secp256k1")]
return blvm_secp256k1::taproot::tap_branch_hash(left, right);
#[cfg(all(feature = "secp256k1-fallback", not(feature = "blvm-secp256k1")))]
return secp256k1_impl::tap_branch_hash(left, right);
#[cfg(not(any(feature = "blvm-secp256k1", feature = "secp256k1-fallback")))]
[0u8; 32]
}
pub fn tap_sighash_hash(data: &[u8]) -> [u8; 32] {
#[cfg(feature = "blvm-secp256k1")]
return blvm_secp256k1::taproot::tap_sighash_hash(data);
#[cfg(all(feature = "secp256k1-fallback", not(feature = "blvm-secp256k1")))]
return secp256k1_impl::tap_sighash_hash(data);
#[cfg(not(any(feature = "blvm-secp256k1", feature = "secp256k1-fallback")))]
[0u8; 32]
}