6 use pbs_tools
::crypt_config
::CryptConfig
;
8 pub struct CryptWriter
<W
> {
11 encr_buf
: Box
<[u8; 64*1024]>,
13 crypter
: openssl
::symm
::Crypter
,
16 impl <W
: Write
> CryptWriter
<W
> {
18 pub fn new(writer
: W
, config
: Arc
<CryptConfig
>) -> Result
<Self, Error
> {
19 let mut iv
= [0u8; 16];
20 proxmox
::sys
::linux
::fill_with_random_data(&mut iv
)?
;
21 let block_size
= config
.cipher().block_size();
23 let crypter
= config
.data_crypter(&iv
, openssl
::symm
::Mode
::Encrypt
)?
;
25 Ok(Self { writer, iv, crypter, block_size, encr_buf: Box::new([0u8; 64*1024]) }
)
28 pub fn finish(mut self) -> Result
<(W
, [u8; 16], [u8; 16]), Error
> {
29 let rest
= self.crypter
.finalize(self.encr_buf
.as_mut())?
;
31 self.writer
.write_all(&self.encr_buf
[..rest
])?
;
36 let mut tag
= [0u8; 16];
37 self.crypter
.get_tag(&mut tag
)?
;
39 Ok((self.writer
, self.iv
, tag
))
43 impl <W
: Write
> Write
for CryptWriter
<W
> {
45 fn write(&mut self, buf
: &[u8]) -> Result
<usize, std
::io
::Error
> {
46 let mut write_size
= buf
.len();
47 if write_size
> (self.encr_buf
.len() - self.block_size
) {
48 write_size
= self.encr_buf
.len() - self.block_size
;
50 let count
= self.crypter
.update(&buf
[..write_size
], self.encr_buf
.as_mut())
53 std
::io
::ErrorKind
::Other
,
54 format
!("crypter update failed - {}", err
))
57 self.writer
.write_all(&self.encr_buf
[..count
])?
;
62 fn flush(&mut self) -> Result
<(), std
::io
::Error
> {