Merge branch 'main' into dev
This commit is contained in:
commit
60d73968fb
2 changed files with 39 additions and 20 deletions
|
|
@ -105,7 +105,7 @@ pub fn task_deploy(testcase: &Testcase) -> Result<Value> {
|
||||||
}
|
}
|
||||||
"gfdiv" => {
|
"gfdiv" => {
|
||||||
let result = gfdiv(args)?;
|
let result = gfdiv(args)?;
|
||||||
let out = BASE64_STANDARD.encode(result);
|
let out = result.to_b64();
|
||||||
let json = json!({"q" : out});
|
let json = json!({"q" : out});
|
||||||
|
|
||||||
Ok(json)
|
Ok(json)
|
||||||
|
|
|
||||||
|
|
@ -28,18 +28,24 @@ impl FieldElement {
|
||||||
|
|
||||||
pub fn rand() -> Self {
|
pub fn rand() -> Self {
|
||||||
let rand_field: [u8; 16] = rand::random();
|
let rand_field: [u8; 16] = rand::random();
|
||||||
FieldElement::new(rand_field.to_vec())
|
FieldElement::new_no_convert(rand_field.to_vec())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn zero() -> Self {
|
pub fn zero() -> Self {
|
||||||
FieldElement::new(vec![0])
|
FieldElement::new_no_convert(vec![0; 16])
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn one() -> Self {
|
pub fn one() -> Self {
|
||||||
FieldElement::new(vec![0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
FieldElement::new_no_convert(vec![0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const fn new(field_element: Vec<u8>) -> Self {
|
pub fn new(field_element: Vec<u8>) -> Self {
|
||||||
|
Self {
|
||||||
|
field_element: reverse_bits_in_bytevec(field_element),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_no_convert(field_element: Vec<u8>) -> Self {
|
||||||
Self { field_element }
|
Self { field_element }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -48,7 +54,7 @@ impl FieldElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_b64(&self) -> String {
|
pub fn to_b64(&self) -> String {
|
||||||
BASE64_STANDARD.encode(&self.field_element)
|
BASE64_STANDARD.encode(reverse_bits_in_bytevec(self.field_element.to_owned()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn pow(mut self, mut exponent: u128) -> FieldElement {
|
pub fn pow(mut self, mut exponent: u128) -> FieldElement {
|
||||||
|
|
@ -94,20 +100,20 @@ impl FieldElement {
|
||||||
const INVERSER_START: u128 = 0xfffffffffffffffffffffffffffffffe;
|
const INVERSER_START: u128 = 0xfffffffffffffffffffffffffffffffe;
|
||||||
|
|
||||||
let mut inverser = INVERSER_START;
|
let mut inverser = INVERSER_START;
|
||||||
let mut inverse: Vec<u8> = vec![0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
let mut inverse: Vec<u8> = vec![0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
//eprintln!("Inverse start {:02X?}", inverse);
|
//eprintln!("Inverse start {:02X?}", inverse);
|
||||||
|
|
||||||
while inverser > 0 {
|
while inverser > 0 {
|
||||||
//eprintln!("{:02X}", inverser);
|
//eprintln!("{:02X}", inverser);
|
||||||
if inverser & 1 == 1 {
|
if inverser & 1 == 1 {
|
||||||
inverse = gfmul(&self.field_element, &inverse, "gcm").unwrap();
|
inverse = gfmul(&self.field_element, &inverse, "xex").unwrap();
|
||||||
}
|
}
|
||||||
inverser >>= 1;
|
inverser >>= 1;
|
||||||
self.field_element = gfmul(&self.field_element, &self.field_element, "gcm")
|
self.field_element = gfmul(&self.field_element, &self.field_element, "xex")
|
||||||
.expect("Error in sqrmul sqr");
|
.expect("Error in sqrmul sqr");
|
||||||
}
|
}
|
||||||
//eprintln!("Inverse rhs {:?}", inverse);
|
//eprintln!("Inverse rhs {:?}", inverse);
|
||||||
FieldElement::new(inverse)
|
FieldElement::new_no_convert(inverse)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_zero(&self) -> bool {
|
pub fn is_zero(&self) -> bool {
|
||||||
|
|
@ -115,7 +121,7 @@ impl FieldElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn reverse_bits(&self) -> Self {
|
pub fn reverse_bits(&self) -> Self {
|
||||||
FieldElement::new(reverse_bits_in_bytevec(self.field_element.clone()))
|
FieldElement::new_no_convert(reverse_bits_in_bytevec(self.field_element.clone()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -123,8 +129,8 @@ impl Mul for FieldElement {
|
||||||
type Output = Self;
|
type Output = Self;
|
||||||
|
|
||||||
fn mul(self, rhs: Self) -> Self::Output {
|
fn mul(self, rhs: Self) -> Self::Output {
|
||||||
FieldElement::new(
|
FieldElement::new_no_convert(
|
||||||
gfmul(&self.field_element, &rhs.field_element, "gcm")
|
gfmul(&self.field_element, &rhs.field_element, "xex")
|
||||||
.expect("Error during multiplication"),
|
.expect("Error during multiplication"),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -134,8 +140,8 @@ impl Mul for &FieldElement {
|
||||||
type Output = FieldElement;
|
type Output = FieldElement;
|
||||||
|
|
||||||
fn mul(self, rhs: &FieldElement) -> FieldElement {
|
fn mul(self, rhs: &FieldElement) -> FieldElement {
|
||||||
FieldElement::new(
|
FieldElement::new_no_convert(
|
||||||
gfmul(&self.field_element, &rhs.field_element, "gcm")
|
gfmul(&self.field_element, &rhs.field_element, "xex")
|
||||||
.expect("Error during multiplication"),
|
.expect("Error during multiplication"),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -144,7 +150,7 @@ impl Mul for &FieldElement {
|
||||||
impl Add for FieldElement {
|
impl Add for FieldElement {
|
||||||
type Output = Self;
|
type Output = Self;
|
||||||
fn add(self, rhs: Self) -> Self::Output {
|
fn add(self, rhs: Self) -> Self::Output {
|
||||||
FieldElement::new(
|
FieldElement::new_no_convert(
|
||||||
xor_bytes(&self.field_element, rhs.field_element).expect("Error in poly add"),
|
xor_bytes(&self.field_element, rhs.field_element).expect("Error in poly add"),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -153,7 +159,7 @@ impl Add for FieldElement {
|
||||||
impl Add for &FieldElement {
|
impl Add for &FieldElement {
|
||||||
type Output = FieldElement;
|
type Output = FieldElement;
|
||||||
fn add(self, rhs: Self) -> Self::Output {
|
fn add(self, rhs: Self) -> Self::Output {
|
||||||
FieldElement::new(
|
FieldElement::new_no_convert(
|
||||||
xor_bytes(&self.field_element, rhs.field_element.clone()).expect("Error in poly add"),
|
xor_bytes(&self.field_element, rhs.field_element.clone()).expect("Error in poly add"),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -182,7 +188,7 @@ impl BitXor for FieldElement {
|
||||||
.zip(rhs.field_element.iter())
|
.zip(rhs.field_element.iter())
|
||||||
.map(|(&x1, &x2)| x1 ^ x2)
|
.map(|(&x1, &x2)| x1 ^ x2)
|
||||||
.collect();
|
.collect();
|
||||||
FieldElement::new(result)
|
FieldElement::new_no_convert(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -447,7 +453,7 @@ mod tests {
|
||||||
FieldElement::new(BASE64_STANDARD.decode("KryptoanalyseAAAAAAAAA==").unwrap());
|
FieldElement::new(BASE64_STANDARD.decode("KryptoanalyseAAAAAAAAA==").unwrap());
|
||||||
let sum = element2 + element1;
|
let sum = element2 + element1;
|
||||||
|
|
||||||
assert_eq!(BASE64_STANDARD.encode(sum), "H1d3GuyA9/0OxeYouUpAAA==");
|
assert_eq!(sum.to_b64(), "H1d3GuyA9/0OxeYouUpAAA==");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -458,6 +464,19 @@ mod tests {
|
||||||
FieldElement::new(BASE64_STANDARD.decode("DHBWMannheimAAAAAAAAAA==").unwrap());
|
FieldElement::new(BASE64_STANDARD.decode("DHBWMannheimAAAAAAAAAA==").unwrap());
|
||||||
let sum = element2 + element1;
|
let sum = element2 + element1;
|
||||||
|
|
||||||
assert_eq!(BASE64_STANDARD.encode(sum), "OZuIncPAGEp4tYouDownAA==");
|
assert_eq!(sum.to_b64(), "OZuIncPAGEp4tYouDownAA==");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_field_div_01() {
|
||||||
|
let element1 =
|
||||||
|
FieldElement::new(BASE64_STANDARD.decode("JAAAAAAAAAAAAAAAAAAAAA==").unwrap());
|
||||||
|
|
||||||
|
let element2 =
|
||||||
|
FieldElement::new(BASE64_STANDARD.decode("wAAAAAAAAAAAAAAAAAAAAA==").unwrap());
|
||||||
|
|
||||||
|
let result = element1 / element2;
|
||||||
|
|
||||||
|
assert_eq!(result.to_b64(), "OAAAAAAAAAAAAAAAAAAAAA==");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue