webpsan 0.5.3

An WebP file sanitizer.
Documentation
pub mod webp;

use bytes::BufMut;
use webp::{TestFileHeaderSpecBuilder, TestWebpBuilder};

use self::webp::{TestAlphSpecBuilder, TestAnmfSpecBuilder, TestVp8xSpecBuilder};

pub fn test_alph() -> TestAlphSpecBuilder {
    Default::default()
}

pub fn test_anmf() -> TestAnmfSpecBuilder {
    Default::default()
}

pub fn test_header() -> TestFileHeaderSpecBuilder {
    Default::default()
}

pub fn test_vp8x() -> TestVp8xSpecBuilder {
    Default::default()
}

pub fn test_webp() -> TestWebpBuilder {
    Default::default()
}

pub fn write_test_chunk(out: &mut Vec<u8>, name: &[u8; 4], data: &[u8]) {
    out.extend_from_slice(name);
    out.put_u32_le(data.len() as u32);
    out.extend_from_slice(data);
    if data.len() % 2 == 1 {
        out.put_u8(0);
    }
}

pub fn write_test_alph(out: &mut Vec<u8>, flags: u8, data: &[u8]) {
    out.extend_from_slice(b"ALPH");
    out.put_u32_le(1 + data.len() as u32);
    out.put_u8(flags);
    out.extend_from_slice(data);
    if (1 + data.len()) % 2 == 1 {
        out.put_u8(0);
    }
}

pub fn write_test_anim(out: &mut Vec<u8>) {
    out.extend_from_slice(b"ANIM");
    out.put_u32_le(6);
    out.put_u32_le(0xFACEC4FE);
    out.put_u16_le(0xF00F);
}

pub fn write_test_anmf(out: &mut Vec<u8>, x: u32, y: u32, width: u32, height: u32, data: &[u8]) {
    out.extend_from_slice(b"ANMF");
    out.put_u32_le(16 + data.len() as u32);
    out.put_uint_le(x.into(), 3);
    out.put_uint_le(y.into(), 3);
    out.put_uint_le(width.into(), 3);
    out.put_uint_le(height.into(), 3);
    out.put_uint_le(0xC0FFEE, 3);
    out.put_u8(0);
    out.extend_from_slice(data);
}

pub fn write_test_exif(out: &mut Vec<u8>) {
    write_test_chunk(out, b"EXIF", b"dummy EXIF data");
}

pub fn write_test_iccp(out: &mut Vec<u8>) {
    write_test_chunk(out, b"ICCP", b"dummy ICCP profile");
}

pub fn write_test_vp8x(out: &mut Vec<u8>, flags: u8, width: u32, height: u32) {
    out.extend_from_slice(b"VP8X");
    out.put_u32_le(10);
    out.push(flags);
    out.extend_from_slice(&[0; 3]);
    assert!(width < 2u32.pow(24));
    out.put_int_le(width as i64, 3);
    assert!(height < 2u32.pow(24));
    out.put_int_le(height as i64, 3);
}

pub fn write_test_xmp(out: &mut Vec<u8>) {
    write_test_chunk(out, b"XMP ", b"dummy XMP data");
}