6 use proxmox_borrow
::Tied
;
8 use pbs_tools
::crypt_config
::CryptConfig
;
10 pub struct ChecksumWriter
<W
> {
12 hasher
: crc32fast
::Hasher
,
13 signer
: Option
<Tied
<Arc
<CryptConfig
>, openssl
::sign
::Signer
<'
static>>>,
16 impl <W
: Write
> ChecksumWriter
<W
> {
18 pub fn new(writer
: W
, config
: Option
<Arc
<CryptConfig
>>) -> Self {
19 let hasher
= crc32fast
::Hasher
::new();
20 let signer
= match config
{
22 let tied_signer
= Tied
::new(config
, |config
| {
23 Box
::new(unsafe { (*config).data_signer() }
)
29 Self { writer, hasher, signer }
32 pub fn finish(mut self) -> Result
<(W
, u32, Option
<[u8; 32]>), Error
> {
33 let crc
= self.hasher
.finalize();
35 if let Some(ref mut signer
) = self.signer
{
36 let mut tag
= [0u8; 32];
37 signer
.sign(&mut tag
)?
;
38 Ok((self.writer
, crc
, Some(tag
)))
40 Ok((self.writer
, crc
, None
))
45 impl <W
: Write
> Write
for ChecksumWriter
<W
> {
47 fn write(&mut self, buf
: &[u8]) -> Result
<usize, std
::io
::Error
> {
48 self.hasher
.update(buf
);
49 if let Some(ref mut signer
) = self.signer
{
53 std
::io
::ErrorKind
::Other
,
54 format
!("hmac update failed - {}", err
))
57 self.writer
.write(buf
)
60 fn flush(&mut self) -> Result
<(), std
::io
::Error
> {