1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
use md5::compute; use std::io; #[macro_export] macro_rules! ready { ($e:expr $(,)?) => { match $e { std::task::Poll::Ready(t) => t, std::task::Poll::Pending => return std::task::Poll::Pending, } }; } static MD5_LENGTH: u32 = 16; pub fn other(desc: &str) -> io::Error { io::Error::new(io::ErrorKind::Other, desc) } pub fn eof() -> io::Error { io::Error::new(io::ErrorKind::UnexpectedEof, "early eof") } pub fn generate_key(data: &[u8], key_len: usize) -> Vec<u8> { let count = (key_len as f32 / MD5_LENGTH as f32).ceil() as u32; let mut key = Vec::from(&compute(data)[..]); let mut start = 0; for _ in 1..count { start += MD5_LENGTH; let mut d = Vec::from(&key[(start - MD5_LENGTH) as usize..start as usize]); d.extend_from_slice(data); let d = compute(d); key.extend_from_slice(&*d); } key }