use crate::enforcement::{ContentFingerprint, GenericImpossibilityWitness};
use crate::witness_scaffolds::{MintBornRuleVerification, MintBornRuleVerificationInputs};
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_cert_born_rule_verification<H: HostTypes + 'static>(
inputs: MintBornRuleVerificationInputs<H>,
) -> Result<MintBornRuleVerification, GenericImpossibilityWitness> {
if !inputs.verified {
return Err(GenericImpossibilityWitness::for_identity(
"https://uor.foundation/op/BR_1",
));
}
if !inputs.born_rule_verified {
return Err(GenericImpossibilityWitness::for_identity(
"https://uor.foundation/op/BR_2",
));
}
if inputs.witt_length == 0 {
return Err(GenericImpossibilityWitness::for_identity(
"https://uor.foundation/op/BR_3",
));
}
if core::ptr::eq(
inputs.certifies as *const _,
H::EMPTY_HOST_STRING as *const _,
) {
return Err(GenericImpossibilityWitness::for_identity(
"https://uor.foundation/op/BR_4",
));
}
let witt_bytes = inputs.witt_length.to_le_bytes();
let verified_byte = [u8::from(inputs.verified)];
let born_byte = [u8::from(inputs.born_rule_verified)];
let fp = fingerprint_for_inputs(&[
b"https://uor.foundation/op/QM_5",
&witt_bytes,
&verified_byte,
&born_byte,
]);
Ok(MintBornRuleVerification::from_fingerprint(fp))
}