diff --git a/src/tasks/mod.rs b/src/tasks/mod.rs index e72b502..0613d93 100644 --- a/src/tasks/mod.rs +++ b/src/tasks/mod.rs @@ -9,8 +9,8 @@ use tasks01::{ gfmul::gfmul_task, pad_oracle::padding_oracle, pfmath::{ - gfdiv, gfpoly_add, gfpoly_diff, gfpoly_divmod, gfpoly_make_monic, gfpoly_mul, gfpoly_pow, - gfpoly_powmod, gfpoly_sort, gfpoly_sqrt, + gfdiv, gfpoly_add, gfpoly_diff, gfpoly_divmod, gfpoly_gcd, gfpoly_make_monic, gfpoly_mul, + gfpoly_pow, gfpoly_powmod, gfpoly_sort, gfpoly_sqrt, }, poly2block::poly2block, sea128::sea128, @@ -151,6 +151,12 @@ pub fn task_deploy(testcase: &Testcase) -> Result { Ok(json) } + "gfpoly_gcd" => { + let result = gfpoly_gcd(args)?; + let json = json!({"G" : result.to_c_array()}); + + Ok(json) + } _ => Err(anyhow!( "Fatal. No compatible action found. Json data was {:?}. Arguments were; {:?}", diff --git a/src/tasks/tasks01/pfmath.rs b/src/tasks/tasks01/pfmath.rs index 3da23fc..ea60e78 100644 --- a/src/tasks/tasks01/pfmath.rs +++ b/src/tasks/tasks01/pfmath.rs @@ -2,7 +2,10 @@ use anyhow::Result; use base64::{prelude::BASE64_STANDARD, Engine}; use serde_json::Value; -use crate::utils::{field::FieldElement, poly::Polynomial}; +use crate::utils::{ + field::FieldElement, + poly::{gcd, Polynomial}, +}; pub fn gfpoly_add(args: &Value) -> Result { let poly_a = Polynomial::from_c_array(&args["A"].clone()); @@ -105,6 +108,15 @@ pub fn gfpoly_diff(args: &Value) -> Result { Ok(result) } +pub fn gfpoly_gcd(args: &Value) -> Result { + let poly_a = Polynomial::from_c_array(&args["A"].clone()); + let poly_b = Polynomial::from_c_array(&args["B"].clone()); + + let result = gcd(poly_a, poly_b); + + Ok(result) +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/utils/poly.rs b/src/utils/poly.rs index f999351..0be3b89 100644 --- a/src/utils/poly.rs +++ b/src/utils/poly.rs @@ -483,6 +483,14 @@ impl Ord for Polynomial { } } +pub fn gcd(a: Polynomial, b: Polynomial) -> Polynomial { + if a.is_zero() { + return b; + } + + return gcd(b.div(&a).1.monic(), a); +} + pub fn sort_polynomial_array(mut polys: Vec) -> Result> { // Algorithm to sort polynomials // First sorting round @@ -1254,10 +1262,46 @@ mod tests { ]); let expected = json!(["AAAAAAAAAAAAAAAAAAAAAA==",]); let element1: Polynomial = Polynomial::from_c_array(&json1); - eprintln!("Starting poly sqrt"); let result = element1.diff(); assert_eq!(json!(result.to_c_array()), expected); } + + #[test] + fn test_poly_gcd() { + let a = json!([ + "DNWpXnnY24XecPa7a8vrEA==", + "I8uYpCbsiPaVvUznuv1IcA==", + "wsbiU432ARWuO93He3vbvA==", + "zp0g3o8iNz7Y+8oUxw1vJw==", + "J0GekE3uendpN6WUAuJ4AA==", + "wACd0e6u1ii4AAAAAAAAAA==", + "ACAAAAAAAAAAAAAAAAAAAA==" + ]); + let b = json!([ + "I20VjJmlSnRSe88gaDiLRQ==", + "0Cw5HxJm/pfybJoQDf7/4w==", + "8ByrMMf+vVj5r3YXUNCJ1g==", + "rEU/f2UZRXqmZ6V7EPKfBA==", + "LfdALhvCrdhhGZWl9l9DSg==", + "KSUKhN0n6/DZmHPozd1prw==", + "DQrRkuA9Zx279wAAAAAAAA==", + "AhCEAAAAAAAAAAAAAAAAAA==" + ]); + let expected = json!([ + "NeverGonnaMakeYouCryAA==", + "NeverGonnaSayGoodbyeAA==", + "NeverGonnaTellALieAAAA==", + "AndHurtYouAAAAAAAAAAAA==", + "gAAAAAAAAAAAAAAAAAAAAA==" + ]); + + let a: Polynomial = Polynomial::from_c_array(&a); + let b: Polynomial = Polynomial::from_c_array(&b); + + let result = gcd(a.monic(), b.monic()); + + assert_eq!(json!(result.to_c_array()), expected); + } } diff --git a/test_json/sandbox.json b/test_json/sandbox.json index 8a670d3..48d59ed 100644 --- a/test_json/sandbox.json +++ b/test_json/sandbox.json @@ -1,13 +1,26 @@ { "testcases": { "sandbox": { - "action": "gfpoly_diff", + "action": "gfpoly_gcd", "arguments": { - "F": [ - "IJustWannaTellYouAAAAA==", - "HowImFeelingAAAAAAAAAA==", - "GottaMakeYouAAAAAAAAAA==", - "UnderstaaaaaaaaaaaaanQ==" + "A": [ + "DNWpXnnY24XecPa7a8vrEA==", + "I8uYpCbsiPaVvUznuv1IcA==", + "wsbiU432ARWuO93He3vbvA==", + "zp0g3o8iNz7Y+8oUxw1vJw==", + "J0GekE3uendpN6WUAuJ4AA==", + "wACd0e6u1ii4AAAAAAAAAA==", + "ACAAAAAAAAAAAAAAAAAAAA==" + ], + "B": [ + "I20VjJmlSnRSe88gaDiLRQ==", + "0Cw5HxJm/pfybJoQDf7/4w==", + "8ByrMMf+vVj5r3YXUNCJ1g==", + "rEU/f2UZRXqmZ6V7EPKfBA==", + "LfdALhvCrdhhGZWl9l9DSg==", + "KSUKhN0n6/DZmHPozd1prw==", + "DQrRkuA9Zx279wAAAAAAAA==", + "AhCEAAAAAAAAAAAAAAAAAA==" ] } }