use crate::enforcement::{ContentFingerprint, GenericImpossibilityWitness};
use crate::witness_scaffolds::{MintLiftObstruction, MintLiftObstructionInputs};
use crate::HostTypes;
fn fingerprint_for_inputs(chunks: &[&[u8]]) -> ContentFingerprint {
let mut buf = [0u8; 32];
let mut global: usize = 0;
let mut chunk_idx = 0;
while chunk_idx < chunks.len() {
let chunk = chunks[chunk_idx];
let mut i = 0;
while i < chunk.len() {
let pos = global % 32;
#[allow(clippy::cast_possible_truncation)]
let salt = global as u8;
buf[pos] ^= chunk[i].wrapping_add(salt);
i += 1;
global += 1;
}
let pos = global % 32;
buf[pos] ^= 0xFFu8;
global += 1;
chunk_idx += 1;
}
ContentFingerprint::from_buffer(buf, 32u8)
}
pub fn verify_type_lift_obstruction<H: HostTypes + 'static>(
inputs: MintLiftObstructionInputs<H>,
) -> Result<MintLiftObstruction, GenericImpossibilityWitness> {
if inputs.obstruction_trivial {
if !inputs.obstruction_site.fingerprint.is_zero() {
return Err(GenericImpossibilityWitness::for_identity(
"https://uor.foundation/op/WLS_1",
));
}
} else if inputs.obstruction_site.fingerprint.is_zero() {
return Err(GenericImpossibilityWitness::for_identity(
"https://uor.foundation/op/WLS_2",
));
}
let trivial_byte = [u8::from(inputs.obstruction_trivial)];
let site_bytes = inputs.obstruction_site.fingerprint.as_bytes();
let fp = fingerprint_for_inputs(&[
b"https://uor.foundation/op/WLS_2",
&trivial_byte,
site_bytes,
]);
Ok(MintLiftObstruction::from_fingerprint(fp))
}