use crypto::aes; use crypto::symmetriccipher::SynchronousStreamCipher; use readall::ReadAllExt; use std::io; use audio_key::AudioKey; const AUDIO_AESIV : &'static [u8] = &[ 0x72,0xe0,0x67,0xfb,0xdd,0xcb,0xcf,0x77,0xeb,0xe8,0xbc,0x64,0x3f,0x63,0x0d,0x93, ]; pub struct AudioDecrypt { cipher: Box, key: AudioKey, reader: T, } impl AudioDecrypt { pub fn new(key: AudioKey, mut reader: T) -> AudioDecrypt { let mut cipher = aes::ctr(aes::KeySize::KeySize128, &key, AUDIO_AESIV); let mut buf = [0; 0xa7]; let mut buf2 = [0; 0xa7]; reader.read_all(&mut buf).unwrap(); cipher.process(&buf, &mut buf2); AudioDecrypt { cipher: cipher, key: key, reader: reader, } } } impl io::Read for AudioDecrypt { fn read(&mut self, output: &mut [u8]) -> io::Result { let mut buffer = vec![0u8; output.len()]; let len = try!(self.reader.read(&mut buffer)); self.cipher.process(&buffer[..len], &mut output[..len]); Ok(len) } } impl io::Seek for AudioDecrypt { fn seek(&mut self, _pos: io::SeekFrom) -> io::Result { Err(io::Error::new(io::ErrorKind::Other, "Cannot seek")) } }