decrypt.rs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use std::io;
  2. use aes_ctr::stream_cipher::generic_array::GenericArray;
  3. use aes_ctr::stream_cipher::{NewStreamCipher, SyncStreamCipher, SyncStreamCipherSeek};
  4. use aes_ctr::Aes128Ctr;
  5. use librespot_core::audio_key::AudioKey;
  6. const AUDIO_AESIV: [u8; 16] = [
  7. 0x72, 0xe0, 0x67, 0xfb, 0xdd, 0xcb, 0xcf, 0x77, 0xeb, 0xe8, 0xbc, 0x64, 0x3f, 0x63, 0x0d, 0x93,
  8. ];
  9. pub struct AudioDecrypt<T: io::Read> {
  10. cipher: Aes128Ctr,
  11. reader: T,
  12. }
  13. impl<T: io::Read> AudioDecrypt<T> {
  14. pub fn new(key: AudioKey, reader: T) -> AudioDecrypt<T> {
  15. let cipher = Aes128Ctr::new(
  16. &GenericArray::from_slice(&key.0),
  17. &GenericArray::from_slice(&AUDIO_AESIV),
  18. );
  19. AudioDecrypt { cipher, reader }
  20. }
  21. }
  22. impl<T: io::Read> io::Read for AudioDecrypt<T> {
  23. fn read(&mut self, output: &mut [u8]) -> io::Result<usize> {
  24. let len = self.reader.read(output)?;
  25. self.cipher.apply_keystream(&mut output[..len]);
  26. Ok(len)
  27. }
  28. }
  29. impl<T: io::Read + io::Seek> io::Seek for AudioDecrypt<T> {
  30. fn seek(&mut self, pos: io::SeekFrom) -> io::Result<u64> {
  31. let newpos = self.reader.seek(pos)?;
  32. self.cipher.seek(newpos);
  33. Ok(newpos)
  34. }
  35. }