diff --git a/src/tasks/tasks01/gfmul.rs b/src/tasks/tasks01/gfmul.rs index 58e5afb..0ca5480 100644 --- a/src/tasks/tasks01/gfmul.rs +++ b/src/tasks/tasks01/gfmul.rs @@ -48,4 +48,64 @@ mod tests { ); Ok(()) } + + #[test] + fn gfmul_task02() -> Result<()> { + let args: Value = json!({"a": "AwEAAAAAAAAAAAAAAAAAgA==", "b": "gBAAAAAAAAAAAAAAAAAAAA=="}); + + let poly1_text: String = serde_json::from_value(args["a"].clone())?; + let poly_a = BASE64_STANDARD.decode(poly1_text)?; + + let poly2_text: String = serde_json::from_value(args["b"].clone())?; + let poly_b = BASE64_STANDARD.decode(poly2_text)?; + + let result = BASE64_STANDARD.encode(gfmul(poly_a, poly_b, "xex")?); + + assert_eq!( + result, "QKgUAAAAAAAAAAAAAAAAAA==", + "Failure. Calulated result was: {}", + result + ); + Ok(()) + } + + #[test] + fn gfmul_task03() -> Result<()> { + let args: Value = json!({"a": "AwEAAAAAAAAAAAAAAAAAgA==", "b": "oBAAAAAAAAAAAAAAAAAAAA=="}); + + let poly1_text: String = serde_json::from_value(args["a"].clone())?; + let poly_a = BASE64_STANDARD.decode(poly1_text)?; + + let poly2_text: String = serde_json::from_value(args["b"].clone())?; + let poly_b = BASE64_STANDARD.decode(poly2_text)?; + + let result = BASE64_STANDARD.encode(gfmul(poly_a, poly_b, "xex")?); + + assert_eq!( + result, "UIAUAAAAAAAAAAAAAAAAAA==", + "Failure. Calulated result was: {}", + result + ); + Ok(()) + } + + #[test] + fn gfmul_task04() -> Result<()> { + let args: Value = json!({"a": "ARIAAAAAAAAAAAAAAAAAgA==", "b": "AgAAAAAAAAAAAAAAAAAAAA=="}); + + let poly1_text: String = serde_json::from_value(args["a"].clone())?; + let poly_a = BASE64_STANDARD.decode(poly1_text)?; + + let poly2_text: String = serde_json::from_value(args["b"].clone())?; + let poly_b = BASE64_STANDARD.decode(poly2_text)?; + + let result = BASE64_STANDARD.encode(gfmul(poly_a, poly_b, "xex")?); + + assert_eq!( + result, "hSQAAAAAAAAAAAAAAAAAAA==", + "Failure. Calulated result was: {}", + result + ); + Ok(()) + } } diff --git a/src/utils/math.rs b/src/utils/math.rs index f0308ba..98836a9 100644 --- a/src/utils/math.rs +++ b/src/utils/math.rs @@ -92,6 +92,10 @@ impl ByteArray { (self.0.first().unwrap() & 1) == 1 } + pub fn msb_is_one(&self) -> bool { + (self.0.last().unwrap() & 1) == 1 + } + pub fn is_empty(&self) -> bool { for i in self.0.iter() { if *i != 0 { diff --git a/src/utils/poly.rs b/src/utils/poly.rs index 5b6fb9a..82336d7 100644 --- a/src/utils/poly.rs +++ b/src/utils/poly.rs @@ -19,20 +19,20 @@ pub fn gfmul(poly_a: Vec, poly_b: Vec, semantic: &str) -> Result if poly2.LSB_is_one() { result.xor_byte_arrays(&poly1); - poly2.right_shift(semantic)?; - } else { - poly2.right_shift(semantic)?; } + poly2.right_shift(semantic)?; while !poly2.is_empty() { - if poly2.LSB_is_one() { - poly1.left_shift(semantic)?; - poly1.xor_byte_arrays(&red_poly_bytes); - result.xor_byte_arrays(&poly1); - } else { - poly1.left_shift(semantic)?; + poly1.left_shift(semantic)?; + + if poly1.msb_is_one() { poly1.xor_byte_arrays(&red_poly_bytes); } + + if poly2.LSB_is_one() { + result.xor_byte_arrays(&poly1); + } + poly2.right_shift(semantic)?; }