1
1
//! An implementation of SipHash.
2
2
3
- // ignore-tidy-undocumented-unsafe
4
-
5
3
#![ allow( deprecated) ] // the types in this module are deprecated
6
4
7
5
use crate :: cmp;
@@ -265,6 +263,7 @@ impl<S: Sip> super::Hasher for Hasher<S> {
265
263
266
264
if self . ntail != 0 {
267
265
needed = 8 - self . ntail ;
266
+ // SAFETY: `cmp::min(length, needed)` is guaranteed to not be over `length`
268
267
self . tail |= unsafe { u8to64_le ( msg, 0 , cmp:: min ( length, needed) ) } << ( 8 * self . ntail ) ;
269
268
if length < needed {
270
269
self . ntail += length;
@@ -279,10 +278,13 @@ impl<S: Sip> super::Hasher for Hasher<S> {
279
278
280
279
// Buffered tail is now flushed, process new input.
281
280
let len = length - needed;
282
- let left = len & 0x7 ;
281
+ let left = len & 0x7 ; // len % 8
283
282
284
283
let mut i = needed;
285
284
while i < len - left {
285
+ // SAFETY: because `len - left` is the biggest multiple of 8 under
286
+ // `len`, and because `i` starts at `needed` where `len` is `length - needed`,
287
+ // `i + 8` is guaranteed to be less than or equal to `length`.
286
288
let mi = unsafe { load_int_le ! ( msg, i, u64 ) } ;
287
289
288
290
self . state . v3 ^= mi;
@@ -292,6 +294,9 @@ impl<S: Sip> super::Hasher for Hasher<S> {
292
294
i += 8 ;
293
295
}
294
296
297
+ // SAFETY: `i` is now `needed + len.div_euclid(8) * 8`,
298
+ // so `i + left` = `needed + len` = `length`, which is by
299
+ // definition equal to `msg.len()`.
295
300
self . tail = unsafe { u8to64_le ( msg, i, left) } ;
296
301
self . ntail = left;
297
302
}
0 commit comments