#[cfg(all(feature = "bls-backend-dusk", feature = "bls-backend-blst"))]
compile_error!("features 'bls-backend-dusk' and 'bls-backend-blst' are mutually exclusive");
#[cfg(not(any(feature = "bls-backend-dusk", feature = "bls-backend-blst")))]
compile_error!(
"no backend selected: enable either 'bls-backend-dusk' (default) or 'bls-backend-blst'"
);
#[cfg(all(feature = "bls-backend-blst", feature = "parallel"))]
compile_error!(
"feature 'parallel' is not supported with 'bls-backend-blst': the blst backend \
uses blst's own multi-scalar multiplication and does not use rayon; \
use the default 'bls-backend-dusk' backend for parallel support"
);
#[cfg(feature = "bls-backend-blst")]
mod backend_blst;
#[cfg(feature = "bls-backend-blst")]
use backend_blst as backend;
#[cfg(feature = "bls-backend-dusk")]
mod backend_dusk;
#[cfg(feature = "bls-backend-dusk")]
use backend_dusk as backend;
pub use backend::{
BlsScalar, G1Affine, G1Projective, G2Affine, G2Prepared, G2Projective, GENERATOR, Gt,
MillerLoopResult, ROOT_OF_UNITY, Scalar, TWO_ADACITY,
};
#[cfg(feature = "rkyv-impl")]
pub use backend::{
ArchivedBlsScalar, ArchivedG1Affine, ArchivedG2Affine, ArchivedG2Prepared, ArchivedGt,
ArchivedMillerLoopResult, BlsScalarResolver, G1AffineResolver, G2AffineResolver,
G2PreparedResolver, GtResolver, MillerLoopResultResolver,
};
#[cfg(all(feature = "rkyv-impl", feature = "bls-backend-blst"))]
pub use backend::{
InvalidG1Affine, InvalidG2Affine, InvalidG2Prepared, InvalidGt, InvalidMillerLoopResult,
};
#[must_use]
#[inline]
pub fn hash_to_scalar(bytes: &[u8]) -> Scalar {
backend::hash_to_scalar(bytes)
}
#[must_use]
#[inline]
pub fn scalar_from_wide(bytes: &[u8; 64]) -> Scalar {
backend::scalar_from_wide(bytes)
}
#[must_use]
#[inline]
pub fn msm_variable_base(points: &[G1Affine], scalars: &[Scalar]) -> G1Projective {
backend::msm_variable_base(points, scalars)
}
#[must_use]
#[inline]
pub fn multi_miller_loop_result(terms: &[(&G1Affine, &G2Prepared)]) -> Gt {
backend::multi_miller_loop_result(terms)
}
#[must_use]
#[inline]
pub fn pairing_product_is_identity(terms: &[(&G1Affine, &G2Affine)]) -> bool {
backend::pairing_product_is_identity(terms)
}