Create EncryptionStream struct
This commit is contained in:
parent
4003be7485
commit
a769a07c37
1 changed files with 60 additions and 0 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
use std::io::{Read, Seek, SeekFrom};
|
||||||
|
|
||||||
pub(crate) mod local;
|
pub(crate) mod local;
|
||||||
pub(crate) mod server;
|
pub(crate) mod server;
|
||||||
|
|
||||||
|
@ -86,3 +88,61 @@ impl From<u8> for HashType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct EncryptionStream {
|
||||||
|
data: Vec<u8>,
|
||||||
|
pos: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Read for EncryptionStream {
|
||||||
|
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
|
||||||
|
let range = self.pos..(self.pos + buf.len()).clamp(0, self.data.len() - buf.len());
|
||||||
|
let size = range.len();
|
||||||
|
buf.copy_from_slice(&self.data[range]);
|
||||||
|
Ok(size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Seek for EncryptionStream {
|
||||||
|
fn seek(&mut self, pos: std::io::SeekFrom) -> std::io::Result<u64> {
|
||||||
|
let cur = self.pos;
|
||||||
|
|
||||||
|
let newpos = match pos {
|
||||||
|
SeekFrom::Start(x) => {
|
||||||
|
if x > self.data.len() as u64 {
|
||||||
|
return Err(std::io::Error::new(
|
||||||
|
std::io::ErrorKind::InvalidInput,
|
||||||
|
"Seek position out of buffer bounds.",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
x
|
||||||
|
}
|
||||||
|
SeekFrom::End(x) => {
|
||||||
|
if x > self.data.len() as i64 {
|
||||||
|
return Err(std::io::Error::new(
|
||||||
|
std::io::ErrorKind::InvalidInput,
|
||||||
|
"Seek position out of buffer bounds.",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
(self.data.len() as i64 - x) as u64
|
||||||
|
}
|
||||||
|
SeekFrom::Current(x) => {
|
||||||
|
let new = self.pos as i64 + x;
|
||||||
|
|
||||||
|
if new < 0 || new > self.data.len() as i64 {
|
||||||
|
return Err(std::io::Error::new(
|
||||||
|
std::io::ErrorKind::InvalidInput,
|
||||||
|
"Seek position out of buffer bounds.",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
new as u64
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
self.pos = newpos as usize;
|
||||||
|
|
||||||
|
Ok(cur as u64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue