drawbridge_hash/
lib.rs

1// SPDX-FileCopyrightText: 2022 Profian Inc. <opensource@profian.com>
2// SPDX-License-Identifier: AGPL-3.0-only
3
4#![warn(rust_2018_idioms, unused_lifetimes, unused_qualifications, clippy::all)]
5#![forbid(unsafe_code)]
6
7mod hash;
8mod reader;
9mod writer;
10
11pub use hash::{Error, Hash};
12pub use reader::Reader;
13pub use writer::Writer;
14
15impl Hash {
16    pub fn reader<T>(self, reader: T) -> Reader<T> {
17        let inner = match self.0 {
18            hash::Inner::Sha224(..) => reader::Inner::Sha224(Default::default()),
19            hash::Inner::Sha256(..) => reader::Inner::Sha256(Default::default()),
20            hash::Inner::Sha384(..) => reader::Inner::Sha384(Default::default()),
21            hash::Inner::Sha512(..) => reader::Inner::Sha512(Default::default()),
22        };
23
24        Reader {
25            reader,
26            inner,
27            hash: self,
28        }
29    }
30
31    pub fn writer<T>(&self, writer: T) -> Writer<T> {
32        let inner = match self.0 {
33            hash::Inner::Sha224(..) => writer::Inner::Sha224(Default::default()),
34            hash::Inner::Sha256(..) => writer::Inner::Sha256(Default::default()),
35            hash::Inner::Sha384(..) => writer::Inner::Sha384(Default::default()),
36            hash::Inner::Sha512(..) => writer::Inner::Sha512(Default::default()),
37        };
38
39        Writer { writer, inner }
40    }
41}
42
43impl<T> Reader<T> {
44    fn hash(&self) -> Hash {
45        use hash::Buffer;
46        use sha2::Digest;
47
48        Hash(match &self.inner {
49            reader::Inner::Sha224(h) => hash::Inner::Sha224(Buffer(h.clone().finalize())),
50            reader::Inner::Sha256(h) => hash::Inner::Sha256(Buffer(h.clone().finalize())),
51            reader::Inner::Sha384(h) => hash::Inner::Sha384(Buffer(h.clone().finalize())),
52            reader::Inner::Sha512(h) => hash::Inner::Sha512(Buffer(h.clone().finalize())),
53        })
54    }
55}
56
57impl<T> Writer<T> {
58    pub fn finish(self) -> Hash {
59        use hash::Buffer;
60        use sha2::Digest;
61
62        Hash(match self.inner {
63            writer::Inner::Sha224(h) => hash::Inner::Sha224(Buffer(h.finalize())),
64            writer::Inner::Sha256(h) => hash::Inner::Sha256(Buffer(h.finalize())),
65            writer::Inner::Sha384(h) => hash::Inner::Sha384(Buffer(h.finalize())),
66            writer::Inner::Sha512(h) => hash::Inner::Sha512(Buffer(h.finalize())),
67        })
68    }
69}