migrate HC
diff --git a/rand_hc/src/hc128.rs b/rand_hc/src/hc128.rs
index 94d7577..ef4734c 100644
--- a/rand_hc/src/hc128.rs
+++ b/rand_hc/src/hc128.rs
@@ -68,6 +68,11 @@
impl RngCore for Hc128Rng {
#[inline]
+ fn next_bool(&mut self) -> bool {
+ self.0.next_bool()
+ }
+
+ #[inline]
fn next_u32(&mut self) -> u32 {
self.0.next_u32()
}
@@ -106,7 +111,7 @@
impl PartialEq for Hc128Rng {
fn eq(&self, rhs: &Self) -> bool {
- self.0.core == rhs.0.core && self.0.index() == rhs.0.index()
+ self.0.eq(&rhs.0)
}
}
impl Eq for Hc128Rng {}
@@ -125,9 +130,31 @@
}
}
+/// Type representing result of the [`Hc128Core`] iteration
+#[derive(Eq, PartialEq, Clone, Debug)]
+#[repr(align(4))]
+pub struct Results([u8; 64]);
+
+impl Default for Results {
+ fn default() -> Self {
+ Self([0u8; 64])
+ }
+}
+
+impl AsRef<[u8]> for Results {
+ fn as_ref(&self) -> &[u8] {
+ &self.0
+ }
+}
+
+impl AsMut<[u8]> for Results {
+ fn as_mut(&mut self) -> &mut [u8] {
+ &mut self.0
+ }
+}
+
impl BlockRngCore for Hc128Core {
- type Item = u32;
- type Results = [u32; 16];
+ type Results = Results;
fn generate(&mut self, results: &mut Self::Results) {
assert!(self.counter1024 % 16 == 0);
@@ -142,42 +169,52 @@
assert!(cc + 15 < 512);
assert!(dd < 512);
+ macro_rules! step {
+ (
+ $f:ident, $n:expr,
+ $a:expr, $b:expr, $c:expr, $d:expr, $e:expr
+ ) => {
+ let v = self.$f($a, $b, $c, $d, $e);
+ results.0[4*$n..4*($n+1)].copy_from_slice(&v.to_le_bytes());
+ };
+ }
+
if self.counter1024 & 512 == 0 {
// P block
- results[0] = self.step_p(cc+0, cc+1, ee+13, ee+6, ee+4);
- results[1] = self.step_p(cc+1, cc+2, ee+14, ee+7, ee+5);
- results[2] = self.step_p(cc+2, cc+3, ee+15, ee+8, ee+6);
- results[3] = self.step_p(cc+3, cc+4, cc+0, ee+9, ee+7);
- results[4] = self.step_p(cc+4, cc+5, cc+1, ee+10, ee+8);
- results[5] = self.step_p(cc+5, cc+6, cc+2, ee+11, ee+9);
- results[6] = self.step_p(cc+6, cc+7, cc+3, ee+12, ee+10);
- results[7] = self.step_p(cc+7, cc+8, cc+4, ee+13, ee+11);
- results[8] = self.step_p(cc+8, cc+9, cc+5, ee+14, ee+12);
- results[9] = self.step_p(cc+9, cc+10, cc+6, ee+15, ee+13);
- results[10] = self.step_p(cc+10, cc+11, cc+7, cc+0, ee+14);
- results[11] = self.step_p(cc+11, cc+12, cc+8, cc+1, ee+15);
- results[12] = self.step_p(cc+12, cc+13, cc+9, cc+2, cc+0);
- results[13] = self.step_p(cc+13, cc+14, cc+10, cc+3, cc+1);
- results[14] = self.step_p(cc+14, cc+15, cc+11, cc+4, cc+2);
- results[15] = self.step_p(cc+15, dd+0, cc+12, cc+5, cc+3);
+ step!(step_p, 0, cc+0, cc+1, ee+13, ee+6, ee+4);
+ step!(step_p, 1, cc+1, cc+2, ee+14, ee+7, ee+5);
+ step!(step_p, 2, cc+2, cc+3, ee+15, ee+8, ee+6);
+ step!(step_p, 3, cc+3, cc+4, cc+0, ee+9, ee+7);
+ step!(step_p, 4, cc+4, cc+5, cc+1, ee+10, ee+8);
+ step!(step_p, 5, cc+5, cc+6, cc+2, ee+11, ee+9);
+ step!(step_p, 6, cc+6, cc+7, cc+3, ee+12, ee+10);
+ step!(step_p, 7, cc+7, cc+8, cc+4, ee+13, ee+11);
+ step!(step_p, 8, cc+8, cc+9, cc+5, ee+14, ee+12);
+ step!(step_p, 9, cc+9, cc+10, cc+6, ee+15, ee+13);
+ step!(step_p, 10, cc+10, cc+11, cc+7, cc+0, ee+14);
+ step!(step_p, 11, cc+11, cc+12, cc+8, cc+1, ee+15);
+ step!(step_p, 12, cc+12, cc+13, cc+9, cc+2, cc+0);
+ step!(step_p, 13, cc+13, cc+14, cc+10, cc+3, cc+1);
+ step!(step_p, 14, cc+14, cc+15, cc+11, cc+4, cc+2);
+ step!(step_p, 15, cc+15, dd+0, cc+12, cc+5, cc+3);
} else {
// Q block
- results[0] = self.step_q(cc+0, cc+1, ee+13, ee+6, ee+4);
- results[1] = self.step_q(cc+1, cc+2, ee+14, ee+7, ee+5);
- results[2] = self.step_q(cc+2, cc+3, ee+15, ee+8, ee+6);
- results[3] = self.step_q(cc+3, cc+4, cc+0, ee+9, ee+7);
- results[4] = self.step_q(cc+4, cc+5, cc+1, ee+10, ee+8);
- results[5] = self.step_q(cc+5, cc+6, cc+2, ee+11, ee+9);
- results[6] = self.step_q(cc+6, cc+7, cc+3, ee+12, ee+10);
- results[7] = self.step_q(cc+7, cc+8, cc+4, ee+13, ee+11);
- results[8] = self.step_q(cc+8, cc+9, cc+5, ee+14, ee+12);
- results[9] = self.step_q(cc+9, cc+10, cc+6, ee+15, ee+13);
- results[10] = self.step_q(cc+10, cc+11, cc+7, cc+0, ee+14);
- results[11] = self.step_q(cc+11, cc+12, cc+8, cc+1, ee+15);
- results[12] = self.step_q(cc+12, cc+13, cc+9, cc+2, cc+0);
- results[13] = self.step_q(cc+13, cc+14, cc+10, cc+3, cc+1);
- results[14] = self.step_q(cc+14, cc+15, cc+11, cc+4, cc+2);
- results[15] = self.step_q(cc+15, dd+0, cc+12, cc+5, cc+3);
+ step!(step_q, 0, cc+0, cc+1, ee+13, ee+6, ee+4);
+ step!(step_q, 1, cc+1, cc+2, ee+14, ee+7, ee+5);
+ step!(step_q, 2, cc+2, cc+3, ee+15, ee+8, ee+6);
+ step!(step_q, 3, cc+3, cc+4, cc+0, ee+9, ee+7);
+ step!(step_q, 4, cc+4, cc+5, cc+1, ee+10, ee+8);
+ step!(step_q, 5, cc+5, cc+6, cc+2, ee+11, ee+9);
+ step!(step_q, 6, cc+6, cc+7, cc+3, ee+12, ee+10);
+ step!(step_q, 7, cc+7, cc+8, cc+4, ee+13, ee+11);
+ step!(step_q, 8, cc+8, cc+9, cc+5, ee+14, ee+12);
+ step!(step_q, 9, cc+9, cc+10, cc+6, ee+15, ee+13);
+ step!(step_q, 10, cc+10, cc+11, cc+7, cc+0, ee+14);
+ step!(step_q, 11, cc+11, cc+12, cc+8, cc+1, ee+15);
+ step!(step_q, 12, cc+12, cc+13, cc+9, cc+2, cc+0);
+ step!(step_q, 13, cc+13, cc+14, cc+10, cc+3, cc+1);
+ step!(step_q, 14, cc+14, cc+15, cc+11, cc+4, cc+2);
+ step!(step_q, 15, cc+15, dd+0, cc+12, cc+5, cc+3);
}
self.counter1024 = self.counter1024.wrapping_add(16);
}