Merge pull request #22 from 0xalivecow/dev
feat: Adding gcd implementation
This commit is contained in:
commit
454790d24f
4 changed files with 85 additions and 10 deletions
|
|
@ -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; {:?}",
|
||||||
|
|
|
||||||
|
|
@ -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::*;
|
||||||
|
|
|
||||||
|
|
@ -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<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
|
||||||
|
|
@ -1254,10 +1262,46 @@ mod tests {
|
||||||
]);
|
]);
|
||||||
let expected = json!(["AAAAAAAAAAAAAAAAAAAAAA==",]);
|
let expected = json!(["AAAAAAAAAAAAAAAAAAAAAA==",]);
|
||||||
let element1: Polynomial = Polynomial::from_c_array(&json1);
|
let element1: Polynomial = Polynomial::from_c_array(&json1);
|
||||||
eprintln!("Starting poly sqrt");
|
|
||||||
|
|
||||||
let result = element1.diff();
|
let result = element1.diff();
|
||||||
|
|
||||||
assert_eq!(json!(result.to_c_array()), expected);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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=="
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue