bitcoin_block_parser/
xor.rs1use std::io::{Read, Seek, SeekFrom};
6
7pub const XOR_MASK_LEN: usize = 8;
9
10pub struct XorReader<R: Read> {
12 inner: R,
14 pos: u64,
17 mask: Option<[u8; XOR_MASK_LEN]>,
19}
20
21impl<R: Read> XorReader<R> {
22 pub fn new(reader: R, xor_mask: Option<[u8; 8]>) -> Self {
24 Self {
25 inner: reader,
26 pos: 0,
27 mask: xor_mask,
28 }
29 }
30}
31
32impl<R: Read> Read for XorReader<R> {
33 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
34 let size = self.inner.read(buf)?;
35 if let Some(mask) = self.mask {
36 for x in &mut buf[..size] {
37 *x ^= mask[(self.pos % mask.len() as u64) as usize];
38 self.pos += 1;
39 }
40 }
41 Ok(size)
42 }
43}
44
45impl<R: Seek + Read> Seek for XorReader<R> {
46 fn seek(&mut self, pos: SeekFrom) -> std::io::Result<u64> {
47 let result = self.inner.seek(pos);
48 self.pos = self.inner.stream_position()?;
50 result
51 }
52}