use super::{OperationError, PrimitiveErrorReason};
use crate::secret_material::{bind_operation_policy, SecretMaterialOperation};
pub fn equal(left: &[u8], right: &[u8]) -> bool {
let _policy = bind_operation_policy(SecretMaterialOperation::ConstantTimeCompare);
crypto_constant_time::ct_eq(left, right)
}
pub fn equal_fixed<const N: usize>(left: &[u8; N], right: &[u8; N]) -> bool {
let _policy = bind_operation_policy(SecretMaterialOperation::ConstantTimeCompare);
crypto_constant_time::ct_eq_fixed(left, right)
}
pub fn require_equal(left: &[u8], right: &[u8]) -> Result<(), OperationError> {
let _policy = bind_operation_policy(SecretMaterialOperation::ConstantTimeCompare);
if left.len() != right.len() {
return Err(OperationError::Primitive {
reason: PrimitiveErrorReason::InvalidLength,
});
}
if equal(left, right) {
return Ok(());
}
Err(OperationError::Primitive {
reason: PrimitiveErrorReason::VerificationFailed,
})
}