Skip to content

Commit fbb0fad

Browse files
committed
tweak code
1 parent 9b92270 commit fbb0fad

2 files changed

Lines changed: 42 additions & 27 deletions

File tree

sponge-cursor/src/lib.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ impl<const RATE: usize> SpongeCursor<RATE> {
107107
head
108108
};
109109

110-
utils::xor_into_state::<N, RATE>(state, pos, head);
110+
utils::absorb_partial::<N, RATE>(state, pos, head);
111111

112112
if is_partial {
113113
self.pos = u8::try_from(pos + head.len()).expect("the sum is smaller than Rate");
@@ -121,19 +121,13 @@ impl<const RATE: usize> SpongeCursor<RATE> {
121121
let tail = blocks.remainder();
122122

123123
for block in blocks {
124-
let chunks = block.chunks_exact(size_of::<u64>());
125-
assert!(chunks.remainder().is_empty());
126-
127-
for (dst, chunk) in state.iter_mut().zip(chunks) {
128-
let chunk = chunk.try_into().expect("chunk has correct length");
129-
*dst ^= u64::from_le_bytes(chunk);
130-
}
131-
124+
let block: &[u8; RATE] = block.try_into().expect("block has correct size");
125+
utils::absorb_full(state, block);
132126
sponge(state);
133127
}
134128

135129
if !tail.is_empty() {
136-
utils::xor_into_state::<N, RATE>(state, 0, tail);
130+
utils::absorb_partial::<N, RATE>(state, 0, tail);
137131
}
138132

139133
self.pos = u8::try_from(tail.len()).expect("tail.len() is smaller than RATE");
@@ -171,6 +165,7 @@ impl<const RATE: usize> SpongeCursor<RATE> {
171165
);
172166
}
173167

168+
#[inline(always)]
174169
fn squeeze_inner_u64_le<const N: usize>(
175170
&mut self,
176171
state: &mut [u64; N],

sponge-cursor/src/utils.rs

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,29 @@
1+
//! Utility functions.
2+
//!
3+
//! Note that support of big-endian targets is somewhat sub-optimal since we prioritized
4+
//! simplicity of the implementation.
5+
6+
#[inline(always)]
7+
pub(crate) fn absorb_full<const N: usize, const RATE: usize>(
8+
state: &mut [u64; N],
9+
block: &[u8; RATE],
10+
) {
11+
const {
12+
assert!(size_of::<[u8; RATE]>() <= size_of::<[u64; N]>());
13+
assert!(RATE % size_of::<u64>() == 0);
14+
};
15+
16+
let chunks = block.chunks_exact(size_of::<u64>());
17+
assert!(chunks.remainder().is_empty());
18+
19+
for (dst, chunk) in state.iter_mut().zip(chunks) {
20+
let chunk = chunk.try_into().expect("chunk has correct length");
21+
*dst ^= u64::from_le_bytes(chunk);
22+
}
23+
}
24+
125
#[inline(always)]
2-
pub(crate) fn xor_into_state<const N: usize, const RATE: usize>(
26+
pub(crate) fn absorb_partial<const N: usize, const RATE: usize>(
327
state: &mut [u64; N],
428
offset: usize,
529
data: &[u8],
@@ -61,22 +85,20 @@ pub(crate) fn squeeze_read_partial<const N: usize, const RATE: usize>(
6185
assert!(RATE % size_of::<u64>() == 0);
6286
};
6387

64-
let (sub_state, mut buf);
65-
if cfg!(target_endian = "little") {
88+
let mut buf = [0u8; RATE];
89+
90+
let sub_state: &[u8; RATE] = if cfg!(target_endian = "little") {
6691
// SAFETY: casting of `&[u64; N]` into `&[u8; M]` is safe if
6792
// `size_of::<[u8; M]>() <= size_of::<[u64; N]>())`
68-
sub_state = unsafe { &*(state.as_ptr().cast::<[u8; RATE]>()) };
93+
unsafe { &*(state.as_ptr().cast::<[u8; RATE]>()) }
6994
} else {
70-
buf = [0u8; RATE];
71-
7295
let mut chunks = buf.chunks_exact_mut(size_of::<u64>());
7396
for (src, dst) in state.iter().zip(&mut chunks) {
7497
dst.copy_from_slice(&src.to_le_bytes());
7598
}
7699
assert!(chunks.into_remainder().is_empty());
77-
78-
sub_state = &buf;
79-
}
100+
&buf
101+
};
80102

81103
let src = &sub_state[offset..][..dst.len()];
82104
dst.copy_from_slice(src);
@@ -112,22 +134,20 @@ pub(crate) fn squeeze_xor_partial<const N: usize, const RATE: usize>(
112134
assert!(RATE % size_of::<u64>() == 0);
113135
};
114136

115-
let (sub_state, mut buf);
116-
if cfg!(target_endian = "little") {
137+
let mut buf = [0u8; RATE];
138+
139+
let sub_state: &[u8; RATE] = if cfg!(target_endian = "little") {
117140
// SAFETY: casting of `&[u64; N]` into `&[u8; M]` is safe if
118141
// `size_of::<[u8; M]>() <= size_of::<[u64; N]>())`
119-
sub_state = unsafe { &*(state.as_ptr().cast::<[u8; RATE]>()) };
142+
unsafe { &*(state.as_ptr().cast::<[u8; RATE]>()) }
120143
} else {
121-
buf = [0u8; RATE];
122-
123144
let mut chunks = buf.chunks_exact_mut(size_of::<u64>());
124145
for (src, dst) in state.iter().zip(&mut chunks) {
125146
dst.copy_from_slice(&src.to_le_bytes());
126147
}
127148
assert!(chunks.into_remainder().is_empty());
128-
129-
sub_state = &buf;
130-
}
149+
&buf
150+
};
131151

132152
let src = &sub_state[offset..][..dst.len()];
133153
for i in 0..dst.len() {

0 commit comments

Comments
 (0)