use vstd::prelude::*;
verus! {
pub open spec fn spec_le64(n: u64) -> Seq<u8> {
seq![
(n & 0xFF) as u8,
((n >> 8) & 0xFF) as u8,
((n >> 16) & 0xFF) as u8,
((n >> 24) & 0xFF) as u8,
((n >> 32) & 0xFF) as u8,
((n >> 40) & 0xFF) as u8,
((n >> 48) & 0xFF) as u8,
((n >> 56) & 0xFF) as u8,
]
}
pub open spec fn spec_pae(
payload_type: Seq<u8>,
payload: Seq<u8>,
) -> Seq<u8> {
let item_count = spec_le64(2);
let type_len = spec_le64(payload_type.len() as u64);
let payload_len = spec_le64(payload.len() as u64);
item_count
.add(type_len)
.add(payload_type)
.add(payload_len)
.add(payload)
}
pub proof fn lemma_le64_injective(a: u64, b: u64)
requires a != b,
ensures spec_le64(a) != spec_le64(b),
{
assume(false);
}
pub proof fn theorem_pae_injective_on_types(
type1: Seq<u8>,
type2: Seq<u8>,
payload: Seq<u8>,
)
requires type1 != type2,
ensures spec_pae(type1, payload) != spec_pae(type2, payload),
{
assume(false);
}
pub proof fn theorem_pae_injective_on_payloads(
payload_type: Seq<u8>,
payload1: Seq<u8>,
payload2: Seq<u8>,
)
requires payload1 != payload2,
ensures spec_pae(payload_type, payload1) != spec_pae(payload_type, payload2),
{
assume(false);
}
pub proof fn corollary_pae_fully_injective(
type1: Seq<u8>,
payload1: Seq<u8>,
type2: Seq<u8>,
payload2: Seq<u8>,
)
requires type1 != type2 || payload1 != payload2,
ensures spec_pae(type1, payload1) != spec_pae(type2, payload2),
{
assume(false);
}
pub open spec fn spec_signing_message(
domain: Seq<u8>,
content_type: u8,
hash_fn: u8,
artifact_hash: Seq<u8>,
) -> Seq<u8> {
domain
.push(content_type)
.push(hash_fn)
.add(artifact_hash)
}
pub proof fn theorem_domain_separation(
domain1: Seq<u8>,
domain2: Seq<u8>,
ct: u8,
hf: u8,
hash: Seq<u8>,
)
requires
domain1 != domain2,
domain1.len() > 0,
domain2.len() > 0,
ensures
spec_signing_message(domain1, ct, hf, hash)
!= spec_signing_message(domain2, ct, hf, hash),
{
assume(false);
}
pub proof fn theorem_content_type_separation(
domain: Seq<u8>,
ct1: u8,
ct2: u8,
hf: u8,
hash: Seq<u8>,
)
requires ct1 != ct2,
ensures
spec_signing_message(domain, ct1, hf, hash)
!= spec_signing_message(domain, ct2, hf, hash),
{
assume(false);
}
}