curve25519-dalek 0.14.4

A low-level cryptographic library for point, group, field, and scalar operations on a curve isomorphic to the twisted Edwards curve defined by -x²+y² = 1 - 121665/121666 x²y² over GF(2²⁵⁵ - 19).
Documentation
#![cfg_attr(feature = "nightly", feature(i128_type))]
#![cfg_attr(feature = "nightly", feature(cfg_target_feature))]
#![allow(unused_variables)]
#![allow(non_snake_case)]
#![allow(dead_code)]

extern crate core;
extern crate subtle;
extern crate rand;
extern crate digest;
extern crate generic_array;
extern crate clear_on_drop;

use std::env;
use std::fs::File;
use std::io::Write;
use std::path::Path;

// Replicate lib.rs in the build.rs, since we're effectively building the whole crate twice.
//
// This should be fixed up by refactoring our code to seperate the "minimal" parts from the rest.
//
// For instance, this shouldn't exist here at all, but it does.
#[cfg(feature = "serde")]
extern crate serde;
#[cfg(feature = "yolocrypto")]
extern crate stdsimd;

// Macros come first!
#[path="src/macros.rs"]
#[macro_use]
mod macros;

// Public modules

#[path="src/scalar.rs"]
mod scalar;
#[path="src/montgomery.rs"]
mod montgomery;
#[path="src/edwards.rs"]
mod edwards;
#[path="src/ristretto.rs"]
mod ristretto;
#[path="src/constants.rs"]
mod constants;
#[path="src/traits.rs"]
mod traits;

// Internal modules

#[path="src/field.rs"]
mod field;
#[path="src/curve_models/mod.rs"]
mod curve_models;
#[path="src/backend/mod.rs"]
mod backend;

use edwards::EdwardsBasepointTable;

fn main() {
    // Enable the "precomputed_tables" feature in the main build stage
    println!("cargo:rustc-cfg=feature=\"precomputed_tables\"\n");

    let out_dir = env::var("OUT_DIR").unwrap();
    let dest_path = Path::new(&out_dir).join("basepoint_table.rs");
    let mut f = File::create(&dest_path).unwrap();

    // Generate a table of precomputed multiples of the basepoint
    let table = EdwardsBasepointTable::create(&constants::ED25519_BASEPOINT_POINT);

    f.write_all(format!("\n
#[cfg(feature=\"radix_51\")]
use backend::u64::field::FieldElement64;

#[cfg(not(feature=\"radix_51\"))]
use backend::u32::field::FieldElement32;

use edwards::EdwardsBasepointTable;

use curve_models::window::LookupTable;
use curve_models::AffineNielsPoint;

/// Table containing precomputed multiples of the basepoint `B = (x,4/5)`.
///
/// The table is defined so `constants::base[i][j-1] = j*(16^2i)*B`,
/// for `0 ≤ i < 32`, `1 ≤ j < 9`.
pub const ED25519_BASEPOINT_TABLE: EdwardsBasepointTable = {:?};
    \n\n", &table).as_bytes()).unwrap();

    // Now generate AFFINE_ODD_MULTIPLES_OF_BASEPOINT
    let B = &constants::ED25519_BASEPOINT_POINT;
    let B2 = B.double();
    let mut odd_multiples = [B.to_affine_niels(); 8];
    for i in 0..7 {
        odd_multiples[i+1] = (&B2 + &odd_multiples[i]).to_extended().to_affine_niels();
    }

    f.write_all(format!("\n
/// Odd multiples of the basepoint `[B, 3B, 5B, 7B, 9B, 11B, 13B, 15B]`.
pub(crate) const AFFINE_ODD_MULTIPLES_OF_BASEPOINT: [AffineNielsPoint; 8] = {:?};
    \n\n", &odd_multiples).as_bytes()).unwrap();
}