use vstd::prelude::*;
verus! {
pub const MAX_HEADER_BYTES: usize = 8192;
pub const MAX_BODY_BYTES: usize = 1024 * 1024;
pub const MAX_BUFFER_OFFSET: usize = usize::MAX / 2;
pub open spec fn header_fits(header_end: usize) -> bool {
header_end + 4 <= MAX_HEADER_BYTES
}
pub open spec fn body_fits(length: usize) -> bool {
length <= MAX_BODY_BYTES
}
pub open spec fn frame_complete(header_end: usize, length: usize, buffered: usize) -> bool {
buffered >= header_end + 4 + length
}
pub fn header_admitted(header_end: usize) -> (fits: bool)
requires header_end <= MAX_BUFFER_OFFSET,
ensures fits == header_fits(header_end),
{
header_end + 4 <= MAX_HEADER_BYTES
}
pub fn body_admitted(length: usize) -> (fits: bool)
ensures fits == body_fits(length),
{
length <= MAX_BODY_BYTES
}
pub fn frame_ready(header_end: usize, length: usize, buffered: usize) -> (complete: bool)
requires
header_end <= MAX_BUFFER_OFFSET,
header_fits(header_end),
body_fits(length),
buffered <= MAX_BUFFER_OFFSET,
ensures complete == frame_complete(header_end, length, buffered),
{
buffered >= header_end + 4 + length
}
proof fn ready_frame_slices_in_bounds(
header_end: usize,
length: usize,
buffered: usize,
)
requires
header_end <= MAX_BUFFER_OFFSET,
header_fits(header_end),
body_fits(length),
buffered <= MAX_BUFFER_OFFSET,
frame_complete(header_end, length, buffered),
ensures
header_end + 4 + length <= buffered,
header_end + 4 <= buffered,
(header_end + 4) + length <= buffered,
{
}
}