audio_decrypt.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. use crypto::aes;
  2. use crypto::symmetriccipher::SynchronousStreamCipher;
  3. use std::io;
  4. use std::ops::Add;
  5. use num::FromPrimitive;
  6. use gmp::Mpz;
  7. use audio_key::AudioKey;
  8. const AUDIO_AESIV : &'static [u8] = &[
  9. 0x72,0xe0,0x67,0xfb,0xdd,0xcb,0xcf,0x77,0xeb,0xe8,0xbc,0x64,0x3f,0x63,0x0d,0x93,
  10. ];
  11. pub struct AudioDecrypt<T : io::Read> {
  12. cipher: Box<SynchronousStreamCipher + 'static>,
  13. key: AudioKey,
  14. reader: T,
  15. }
  16. impl <T : io::Read> AudioDecrypt<T> {
  17. pub fn new(key: AudioKey, reader: T) -> AudioDecrypt<T> {
  18. let cipher = aes::ctr(aes::KeySize::KeySize128,
  19. &key,
  20. AUDIO_AESIV);
  21. AudioDecrypt {
  22. cipher: cipher,
  23. key: key,
  24. reader: reader,
  25. }
  26. }
  27. }
  28. impl <T : io::Read> io::Read for AudioDecrypt<T> {
  29. fn read(&mut self, output: &mut [u8]) -> io::Result<usize> {
  30. let mut buffer = vec![0u8; output.len()];
  31. let len = try!(self.reader.read(&mut buffer));
  32. self.cipher.process(&buffer[..len], &mut output[..len]);
  33. Ok(len)
  34. }
  35. }
  36. impl <T : io::Read + io::Seek> io::Seek for AudioDecrypt<T> {
  37. fn seek(&mut self, pos: io::SeekFrom) -> io::Result<u64> {
  38. let newpos = try!(self.reader.seek(pos));
  39. let skip = newpos % 16;
  40. let iv = Mpz::from_bytes_be(AUDIO_AESIV)
  41. .add(Mpz::from_u64(newpos / 16).unwrap())
  42. .to_bytes_be();
  43. self.cipher = aes::ctr(aes::KeySize::KeySize128,
  44. &self.key,
  45. &iv);
  46. let buf = vec![0u8; skip as usize];
  47. let mut buf2 = vec![0u8; skip as usize];
  48. self.cipher.process(&buf, &mut buf2);
  49. Ok(newpos as u64)
  50. }
  51. }