4 pub struct ChecksumReader
<'a
, R
> {
6 hasher
: crc32fast
::Hasher
,
7 signer
: Option
<openssl
::sign
::Signer
<'a
>>,
10 impl <'a
, R
: Read
> ChecksumReader
<'a
, R
> {
12 pub fn new(reader
: R
, signer
: Option
<openssl
::sign
::Signer
<'a
>>) -> Self {
13 let hasher
= crc32fast
::Hasher
::new();
14 Self { reader, hasher, signer }
17 pub fn finish(mut self) -> Result
<(R
, u32, Option
<[u8; 32]>), Error
> {
18 let crc
= self.hasher
.finalize();
20 if let Some(ref mut signer
) = self.signer
{
21 let mut tag
= [0u8; 32];
22 signer
.sign(&mut tag
)?
;
23 Ok((self.reader
, crc
, Some(tag
)))
25 Ok((self.reader
, crc
, None
))
30 impl <'a
, R
: Read
> Read
for ChecksumReader
<'a
, R
> {
32 fn read(&mut self, buf
: &mut [u8]) -> Result
<usize, std
::io
::Error
> {
33 let count
= self.reader
.read(buf
)?
;
35 self.hasher
.update(&buf
[..count
]);
36 if let Some(ref mut signer
) = self.signer
{
37 signer
.update(&buf
[..count
])
40 std
::io
::ErrorKind
::Other
,
41 format
!("hmac update failed - {}", err
))