[−][src]Module zerocaf::edwards
Edwards Point operations and their implementations are shown with the corresponding definitions. Encoding/decoding process implementations are shown, as is support for all kind of interactions which apply each of the processes.
Examples
use zerocaf::edwards::*; use zerocaf::traits::ops::*; use zerocaf::traits::Identity; use zerocaf::field::FieldElement; use zerocaf::scalar::Scalar; use subtle::Choice; use core::ops::{Add, Sub, Mul}; use rand::rngs::OsRng; // You can work in different point coordinates, such as: // Affine, Projective or Extended. // // It's highly recommended to work using the Extended cooridnates, // for defined curves such as as the one in Zerocaf, // as they they allow for the fastest known arithmetic operations. // Additionally, they formats can be directly compressed from just // a singular coordinate. // In order to produce a point over the Sonny curve, // you can do the following: // From the y-coordinate of a point: let y = FieldElement([2369245568431362, 2665603790611352, 3317390952748653, 1908583331312524, 8011773354506]); // The `Choice` specifies the symbol that we want to get as a result // for the `x-coordinate`. let ex_point = EdwardsPoint::new_from_y_coord(&y, Choice::from(0u8)).unwrap(); let rngp = EdwardsPoint::from(ProjectivePoint::identity()); // The same examples work for the ProjectivePoint struct. // You can perform the following operations with an EdwardsPoint // or a ProjectivePoint: // Point addition: let p1 = &ex_point + &rngp; // Point subtraction (which is a point negation and a sum): let p2 = &ex_point - &rngp; // Point doubling: let p3 = &ex_point.double(); // Scalar mul: let p4 = double_and_add(&ex_point, &Scalar::from(8u8)); // You can also multiply by the cofactor directly: assert!(p4 == mul_by_cofactor(&ex_point)); // In order to send points for saving space, you can use // compressed points, whih are repressented as: `CompressedEwdardsY`. // The only means of obtaining a `CompressedEdwardsY` is: // By compressing an `EdwardsPoint`: let cp_point = rngp.compress(); // Note that you can get your EdwardsPoint back just by doing: let decompr_point = &cp_point.decompress().unwrap(); // You can also get a compressed point by copying it from a // slice of bytes (as if it came from a socket or similar situations). let cpedw = CompressedEdwardsY::from_slice(&cp_point.to_bytes());
Structs
AffinePoint | An |
CompressedEdwardsY | The first 255 bits of a |
EdwardsPoint | An |
ProjectivePoint | A |
Functions
binary_naf_mul | |
double_and_add | Implementation of the standard algorithm of |
ltr_bin_mul | |
mul_by_cofactor | Multiply by the cofactor: return (8 P). |
mul_by_pow_2 | Compute ([2^k] * P (mod l)). |
window_naf_mul |