1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#![deny(non_upper_case_globals)]
#![deny(non_camel_case_types)]
#![deny(non_snake_case)]
#![deny(unused_mut)]
#![deny(missing_docs)]
#![cfg_attr(all(test, feature = "unstable"), feature(test))]
#[cfg(all(test, feature = "unstable"))] extern crate test;
#[cfg(feature="serde")] extern crate serde;
#[cfg(all(test,feature="serde"))] extern crate serde_test;
extern crate byteorder;
#[macro_use] mod util;
#[macro_use] mod serde_macros;
pub mod error;
pub mod hex;
pub mod hash160;
pub mod hmac;
pub mod ripemd160;
pub mod sha1;
pub mod sha256;
pub mod sha512;
pub mod sha256d;
pub mod siphash24;
pub mod cmp;
use std::{borrow, fmt, hash, io, ops};
pub use hmac::{Hmac, HmacEngine};
pub use error::Error;
pub trait HashEngine: Clone + io::Write {
type MidState;
fn midstate(&self) -> Self::MidState;
const BLOCK_SIZE: usize;
#[inline(always)]
fn input(&mut self, data: &[u8]) {
self.write_all(data).expect("hash returned error");
}
}
pub trait Hash: Copy + Clone + PartialEq + Eq + Default + PartialOrd + Ord +
hash::Hash + fmt::Debug + fmt::Display + fmt::LowerHex +
ops::Index<ops::RangeFull, Output = [u8]> +
ops::Index<ops::RangeFrom<usize>, Output = [u8]> +
ops::Index<ops::RangeTo<usize>, Output = [u8]> +
ops::Index<ops::Range<usize>, Output = [u8]> +
ops::Index<usize, Output = u8> +
hex::ToHex + borrow::Borrow<[u8]>
{
type Engine: HashEngine;
type Inner: hex::FromHex;
fn engine() -> Self::Engine;
fn from_engine(e: Self::Engine) -> Self;
const LEN: usize;
fn from_slice(sl: &[u8]) -> Result<Self, Error>;
fn hash(data: &[u8]) -> Self {
use std::io::Write;
let mut engine = Self::engine();
engine.write_all(data).unwrap();
Self::from_engine(engine)
}
const DISPLAY_BACKWARD: bool = false;
fn into_inner(self) -> Self::Inner;
fn from_inner(inner: Self::Inner) -> Self;
}