feat: add more shifting capabilities for gfmul
This commit is contained in:
parent
f4c49a9137
commit
ccf0b03ec0
2 changed files with 57 additions and 17 deletions
|
|
@ -15,14 +15,28 @@ pub fn xor_bytes(vec1: &Vec<u8>, mut vec2: Vec<u8>) -> Result<Vec<u8>> {
|
||||||
pub struct ByteArray(pub Vec<u8>);
|
pub struct ByteArray(pub Vec<u8>);
|
||||||
|
|
||||||
impl ByteArray {
|
impl ByteArray {
|
||||||
pub fn left_shift(&mut self) -> u8 {
|
pub fn left_shift(&mut self, semantic: &str) -> Result<u8> {
|
||||||
|
match semantic {
|
||||||
|
"xex" => {
|
||||||
let mut carry = 0u8;
|
let mut carry = 0u8;
|
||||||
for byte in self.0.iter_mut() {
|
for byte in self.0.iter_mut() {
|
||||||
let new_carry = *byte >> 7;
|
let new_carry = *byte >> 7;
|
||||||
*byte = (*byte << 1) | carry;
|
*byte = (*byte << 1) | carry;
|
||||||
carry = new_carry;
|
carry = new_carry;
|
||||||
}
|
}
|
||||||
carry
|
Ok(carry)
|
||||||
|
}
|
||||||
|
"gcm" => {
|
||||||
|
let mut carry = 0u8;
|
||||||
|
for byte in self.0.iter_mut() {
|
||||||
|
let new_carry = *byte & 1;
|
||||||
|
*byte = (*byte >> 1) | (carry << 7);
|
||||||
|
carry = new_carry;
|
||||||
|
}
|
||||||
|
Ok(carry)
|
||||||
|
}
|
||||||
|
_ => Err(anyhow!("Failure in lsh. No compatible action found")),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn left_shift_reduce(&mut self, semantic: &str) {
|
pub fn left_shift_reduce(&mut self, semantic: &str) {
|
||||||
|
|
@ -97,7 +111,7 @@ mod tests {
|
||||||
fn test_byte_array_shift1() {
|
fn test_byte_array_shift1() {
|
||||||
let mut byte_array: ByteArray = ByteArray(vec![0x00, 0x01]);
|
let mut byte_array: ByteArray = ByteArray(vec![0x00, 0x01]);
|
||||||
let shifted_array: ByteArray = ByteArray(vec![0x00, 0x02]);
|
let shifted_array: ByteArray = ByteArray(vec![0x00, 0x02]);
|
||||||
byte_array.left_shift();
|
byte_array.left_shift("xex");
|
||||||
|
|
||||||
assert_eq!(byte_array.0, shifted_array.0);
|
assert_eq!(byte_array.0, shifted_array.0);
|
||||||
}
|
}
|
||||||
|
|
@ -106,7 +120,7 @@ mod tests {
|
||||||
fn test_byte_array_shift2() {
|
fn test_byte_array_shift2() {
|
||||||
let mut byte_array: ByteArray = ByteArray(vec![0xFF, 0x00]);
|
let mut byte_array: ByteArray = ByteArray(vec![0xFF, 0x00]);
|
||||||
let shifted_array: ByteArray = ByteArray(vec![0xFE, 0x01]);
|
let shifted_array: ByteArray = ByteArray(vec![0xFE, 0x01]);
|
||||||
byte_array.left_shift();
|
byte_array.left_shift("xex");
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
byte_array.0, shifted_array.0,
|
byte_array.0, shifted_array.0,
|
||||||
|
|
@ -115,6 +129,32 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_byte_array_shift1_gcm() {
|
||||||
|
let mut byte_array: ByteArray = ByteArray(vec![0xFF, 0x00]);
|
||||||
|
let shifted_array: ByteArray = ByteArray(vec![0x7F, 0x80]);
|
||||||
|
byte_array.left_shift("gcm");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
byte_array.0, shifted_array.0,
|
||||||
|
"Failure: Shifted array was: {:02X?}",
|
||||||
|
byte_array.0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_byte_array_shift1_right_gcm() {
|
||||||
|
let mut byte_array: ByteArray = ByteArray(vec![0xFF, 0x00]);
|
||||||
|
let shifted_array: ByteArray = ByteArray(vec![0xFE, 0x00]);
|
||||||
|
byte_array.right_shift("gcm");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
byte_array.0, shifted_array.0,
|
||||||
|
"Failure: Shifted array was: {:02X?}",
|
||||||
|
byte_array.0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_byte_array_shift_right() {
|
fn test_byte_array_shift_right() {
|
||||||
let mut byte_array: ByteArray = ByteArray(vec![0x02]);
|
let mut byte_array: ByteArray = ByteArray(vec![0x02]);
|
||||||
|
|
@ -130,13 +170,13 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_lsb_one() {
|
fn test_lsb_one() {
|
||||||
let mut byte_array: ByteArray = ByteArray(vec![0x00, 0xFF]);
|
let byte_array: ByteArray = ByteArray(vec![0x00, 0xFF]);
|
||||||
assert!(!byte_array.LSB_is_one());
|
assert!(!byte_array.LSB_is_one());
|
||||||
|
|
||||||
let mut byte_array2: ByteArray = ByteArray(vec![0x02, 0xFF]);
|
let byte_array2: ByteArray = ByteArray(vec![0x02, 0xFF]);
|
||||||
assert!(!byte_array2.LSB_is_one());
|
assert!(!byte_array2.LSB_is_one());
|
||||||
|
|
||||||
let mut byte_array3: ByteArray = ByteArray(vec![0xFF, 0x00]);
|
let byte_array3: ByteArray = ByteArray(vec![0xFF, 0x00]);
|
||||||
assert!(byte_array3.LSB_is_one());
|
assert!(byte_array3.LSB_is_one());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,21 +19,21 @@ pub fn gfmul(poly_a: Vec<u8>, poly_b: Vec<u8>, semantic: &str) -> Result<Vec<u8>
|
||||||
|
|
||||||
if poly2.LSB_is_one() {
|
if poly2.LSB_is_one() {
|
||||||
result.xor_byte_arrays(&poly1);
|
result.xor_byte_arrays(&poly1);
|
||||||
poly2.right_shift(semantic);
|
poly2.right_shift(semantic)?;
|
||||||
} else {
|
} else {
|
||||||
poly2.right_shift(semantic);
|
poly2.right_shift(semantic)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
while !poly2.is_empty() {
|
while !poly2.is_empty() {
|
||||||
if poly2.LSB_is_one() {
|
if poly2.LSB_is_one() {
|
||||||
poly1.left_shift();
|
poly1.left_shift(semantic)?;
|
||||||
poly1.xor_byte_arrays(&red_poly_bytes);
|
poly1.xor_byte_arrays(&red_poly_bytes);
|
||||||
result.xor_byte_arrays(&poly1);
|
result.xor_byte_arrays(&poly1);
|
||||||
} else {
|
} else {
|
||||||
poly1.left_shift();
|
poly1.left_shift(semantic)?;
|
||||||
poly1.xor_byte_arrays(&red_poly_bytes);
|
poly1.xor_byte_arrays(&red_poly_bytes);
|
||||||
}
|
}
|
||||||
poly2.right_shift(semantic);
|
poly2.right_shift(semantic)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
result.0.remove(16);
|
result.0.remove(16);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue