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
use crate::ExpandMsg;
use core::marker::PhantomData;
use digest::{ExtendableOutput, Update, XofReader};
#[derive(Debug)]
pub struct ExpandMsgXof<HashT> {
phantom: PhantomData<HashT>,
}
impl<HashT, const LEN_IN_BYTES: usize> ExpandMsg<LEN_IN_BYTES> for ExpandMsgXof<HashT>
where
HashT: Default + ExtendableOutput + Update,
{
fn expand_message(msg: &[u8], dst: &[u8]) -> [u8; LEN_IN_BYTES] {
let mut buf = [0u8; LEN_IN_BYTES];
let mut r = HashT::default()
.chain(msg)
.chain([(LEN_IN_BYTES >> 8) as u8, LEN_IN_BYTES as u8])
.chain(dst)
.chain([dst.len() as u8])
.finalize_xof();
r.read(&mut buf);
buf
}
}