feat: Adding gcd implementation

This commit is contained in:
Alivecow 2024-11-23 12:31:27 +01:00
parent 8be8dc7a54
commit 0b18ba1bff
4 changed files with 102 additions and 9 deletions

View file

@ -9,8 +9,8 @@ use tasks01::{
gfmul::gfmul_task, gfmul::gfmul_task,
pad_oracle::padding_oracle, pad_oracle::padding_oracle,
pfmath::{ pfmath::{
gfdiv, gfpoly_add, gfpoly_diff, gfpoly_divmod, gfpoly_make_monic, gfpoly_mul, gfpoly_pow, gfdiv, gfpoly_add, gfpoly_diff, gfpoly_divmod, gfpoly_gcd, gfpoly_make_monic, gfpoly_mul,
gfpoly_powmod, gfpoly_sort, gfpoly_sqrt, gfpoly_pow, gfpoly_powmod, gfpoly_sort, gfpoly_sqrt,
}, },
poly2block::poly2block, poly2block::poly2block,
sea128::sea128, sea128::sea128,
@ -151,6 +151,12 @@ pub fn task_deploy(testcase: &Testcase) -> Result<Value> {
Ok(json) Ok(json)
} }
"gfpoly_gcd" => {
let result = gfpoly_gcd(args)?;
let json = json!({"G" : result.to_c_array()});
Ok(json)
}
_ => Err(anyhow!( _ => Err(anyhow!(
"Fatal. No compatible action found. Json data was {:?}. Arguments were; {:?}", "Fatal. No compatible action found. Json data was {:?}. Arguments were; {:?}",

View file

@ -2,7 +2,10 @@ use anyhow::Result;
use base64::{prelude::BASE64_STANDARD, Engine}; use base64::{prelude::BASE64_STANDARD, Engine};
use serde_json::Value; 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<Polynomial> { pub fn gfpoly_add(args: &Value) -> Result<Polynomial> {
let poly_a = Polynomial::from_c_array(&args["A"].clone()); let poly_a = Polynomial::from_c_array(&args["A"].clone());
@ -105,6 +108,15 @@ pub fn gfpoly_diff(args: &Value) -> Result<Polynomial> {
Ok(result) Ok(result)
} }
pub fn gfpoly_gcd(args: &Value) -> Result<Polynomial> {
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)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;

View file

@ -467,6 +467,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<Polynomial>) -> Result<Vec<Polynomial>> { pub fn sort_polynomial_array(mut polys: Vec<Polynomial>) -> Result<Vec<Polynomial>> {
// Algorithm to sort polynomials // Algorithm to sort polynomials
// First sorting round // First sorting round
@ -1226,4 +1234,58 @@ mod tests {
assert_eq!(json!(result.to_c_array()), expected); assert_eq!(json!(result.to_c_array()), expected);
} }
#[test]
fn test_poly_diff_multi_zero() {
let json1 = json!([
"AAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAA==",
]);
let expected = json!(["AAAAAAAAAAAAAAAAAAAAAA==",]);
let element1: Polynomial = Polynomial::from_c_array(&json1);
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);
}
} }

View file

@ -1,13 +1,26 @@
{ {
"testcases": { "testcases": {
"sandbox": { "sandbox": {
"action": "gfpoly_diff", "action": "gfpoly_gcd",
"arguments": { "arguments": {
"F": [ "A": [
"IJustWannaTellYouAAAAA==", "DNWpXnnY24XecPa7a8vrEA==",
"HowImFeelingAAAAAAAAAA==", "I8uYpCbsiPaVvUznuv1IcA==",
"GottaMakeYouAAAAAAAAAA==", "wsbiU432ARWuO93He3vbvA==",
"UnderstaaaaaaaaaaaaanQ==" "zp0g3o8iNz7Y+8oUxw1vJw==",
"J0GekE3uendpN6WUAuJ4AA==",
"wACd0e6u1ii4AAAAAAAAAA==",
"ACAAAAAAAAAAAAAAAAAAAA=="
],
"B": [
"I20VjJmlSnRSe88gaDiLRQ==",
"0Cw5HxJm/pfybJoQDf7/4w==",
"8ByrMMf+vVj5r3YXUNCJ1g==",
"rEU/f2UZRXqmZ6V7EPKfBA==",
"LfdALhvCrdhhGZWl9l9DSg==",
"KSUKhN0n6/DZmHPozd1prw==",
"DQrRkuA9Zx279wAAAAAAAA==",
"AhCEAAAAAAAAAAAAAAAAAA=="
] ]
} }
} }