mirror of
https://github.com/saymrwulf/curve25519-dalek-source.git
synced 2026-09-07 20:50:39 +00:00
Fix AVX2 and AVX-512 builds (#419)
Build was broken by 5758b8c.
This adds a regression test to CI so it doesn't happen again
This commit is contained in:
parent
3a94bf8a8e
commit
8fa201639a
14 changed files with 69 additions and 63 deletions
12
.github/workflows/rust.yml
vendored
12
.github/workflows/rust.yml
vendored
|
|
@ -26,13 +26,19 @@ jobs:
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
- run: cargo test --no-default-features --features "std u64_backend"
|
- run: cargo test --no-default-features --features "std u64_backend"
|
||||||
|
|
||||||
test-simd:
|
build-simd:
|
||||||
name: Test simd backend (nightly)
|
name: Build simd backend (nightly)
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: dtolnay/rust-toolchain@nightly
|
- uses: dtolnay/rust-toolchain@nightly
|
||||||
- run: cargo test --no-default-features --features "std simd_backend"
|
# Build with AVX2 features, then with AVX512 features
|
||||||
|
- env:
|
||||||
|
RUSTFLAGS: "-C target_feature=+avx2"
|
||||||
|
run: cargo build --no-default-features --features "std simd_backend"
|
||||||
|
- env:
|
||||||
|
RUSTFLAGS: "-C target_feature=+avx512ifma"
|
||||||
|
run: cargo build --no-default-features --features "std simd_backend"
|
||||||
|
|
||||||
test-defaults-serde:
|
test-defaults-serde:
|
||||||
name: Test default feature selection and serde
|
name: Test default feature selection and serde
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,9 @@
|
||||||
|
|
||||||
use packed_simd::u32x8;
|
use packed_simd::u32x8;
|
||||||
|
|
||||||
use backend::vector::avx2::edwards::{CachedPoint, ExtendedPoint};
|
use crate::backend::vector::avx2::edwards::{CachedPoint, ExtendedPoint};
|
||||||
use backend::vector::avx2::field::FieldElement2625x4;
|
use crate::backend::vector::avx2::field::FieldElement2625x4;
|
||||||
use window::NafLookupTable8;
|
use crate::window::NafLookupTable8;
|
||||||
|
|
||||||
/// The identity element as an `ExtendedPoint`.
|
/// The identity element as an `ExtendedPoint`.
|
||||||
pub(crate) static EXTENDEDPOINT_IDENTITY: ExtendedPoint = ExtendedPoint(FieldElement2625x4([
|
pub(crate) static EXTENDEDPOINT_IDENTITY: ExtendedPoint = ExtendedPoint(FieldElement2625x4([
|
||||||
|
|
|
||||||
|
|
@ -41,10 +41,10 @@ use core::ops::{Add, Neg, Sub};
|
||||||
use subtle::Choice;
|
use subtle::Choice;
|
||||||
use subtle::ConditionallySelectable;
|
use subtle::ConditionallySelectable;
|
||||||
|
|
||||||
use edwards;
|
use crate::edwards;
|
||||||
use window::{LookupTable, NafLookupTable5, NafLookupTable8};
|
use crate::window::{LookupTable, NafLookupTable5, NafLookupTable8};
|
||||||
|
|
||||||
use traits::Identity;
|
use crate::traits::Identity;
|
||||||
|
|
||||||
use super::constants;
|
use super::constants;
|
||||||
use super::field::{FieldElement2625x4, Lanes, Shuffle};
|
use super::field::{FieldElement2625x4, Lanes, Shuffle};
|
||||||
|
|
@ -330,7 +330,7 @@ mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
fn serial_add(P: edwards::EdwardsPoint, Q: edwards::EdwardsPoint) -> edwards::EdwardsPoint {
|
fn serial_add(P: edwards::EdwardsPoint, Q: edwards::EdwardsPoint) -> edwards::EdwardsPoint {
|
||||||
use backend::serial::u64::field::FieldElement51;
|
use crate::backend::serial::u64::field::FieldElement51;
|
||||||
|
|
||||||
let (X1, Y1, Z1, T1) = (P.X, P.Y, P.Z, P.T);
|
let (X1, Y1, Z1, T1) = (P.X, P.Y, P.Z, P.T);
|
||||||
let (X2, Y2, Z2, T2) = (Q.X, Q.Y, Q.Z, Q.T);
|
let (X2, Y2, Z2, T2) = (Q.X, Q.Y, Q.Z, Q.T);
|
||||||
|
|
@ -420,8 +420,8 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn vector_addition_vs_serial_addition_vs_edwards_extendedpoint() {
|
fn vector_addition_vs_serial_addition_vs_edwards_extendedpoint() {
|
||||||
use constants;
|
use crate::constants;
|
||||||
use scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
|
|
||||||
println!("Testing id +- id");
|
println!("Testing id +- id");
|
||||||
let P = edwards::EdwardsPoint::identity();
|
let P = edwards::EdwardsPoint::identity();
|
||||||
|
|
@ -507,8 +507,8 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn vector_doubling_vs_serial_doubling_vs_edwards_extendedpoint() {
|
fn vector_doubling_vs_serial_doubling_vs_edwards_extendedpoint() {
|
||||||
use constants;
|
use crate::constants;
|
||||||
use scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
|
|
||||||
println!("Testing [2]id");
|
println!("Testing [2]id");
|
||||||
let P = edwards::EdwardsPoint::identity();
|
let P = edwards::EdwardsPoint::identity();
|
||||||
|
|
@ -525,8 +525,8 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn basepoint_odd_lookup_table_verify() {
|
fn basepoint_odd_lookup_table_verify() {
|
||||||
use constants;
|
use crate::constants;
|
||||||
use backend::vector::avx2::constants::{BASEPOINT_ODD_LOOKUP_TABLE};
|
use crate::backend::vector::avx2::constants::{BASEPOINT_ODD_LOOKUP_TABLE};
|
||||||
|
|
||||||
let basepoint_odd_table = NafLookupTable8::<CachedPoint>::from(&constants::ED25519_BASEPOINT_POINT);
|
let basepoint_odd_table = NafLookupTable8::<CachedPoint>::from(&constants::ED25519_BASEPOINT_POINT);
|
||||||
println!("basepoint_odd_lookup_table = {:?}", basepoint_odd_table);
|
println!("basepoint_odd_lookup_table = {:?}", basepoint_odd_table);
|
||||||
|
|
|
||||||
|
|
@ -43,8 +43,10 @@ const D_LANES64: u8 = 0b11_00_00_00;
|
||||||
use core::ops::{Add, Mul, Neg};
|
use core::ops::{Add, Mul, Neg};
|
||||||
use packed_simd::{i32x8, u32x8, u64x4, IntoBits};
|
use packed_simd::{i32x8, u32x8, u64x4, IntoBits};
|
||||||
|
|
||||||
use backend::vector::avx2::constants::{P_TIMES_16_HI, P_TIMES_16_LO, P_TIMES_2_HI, P_TIMES_2_LO};
|
use crate::backend::vector::avx2::constants::{
|
||||||
use backend::serial::u64::field::FieldElement51;
|
P_TIMES_16_HI, P_TIMES_16_LO, P_TIMES_2_HI, P_TIMES_2_LO,
|
||||||
|
};
|
||||||
|
use crate::backend::serial::u64::field::FieldElement51;
|
||||||
|
|
||||||
/// Unpack 32-bit lanes into 64-bit lanes:
|
/// Unpack 32-bit lanes into 64-bit lanes:
|
||||||
/// ```ascii,no_run
|
/// ```ascii,no_run
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
use packed_simd::u64x4;
|
use packed_simd::u64x4;
|
||||||
|
|
||||||
use window::NafLookupTable8;
|
use crate::window::NafLookupTable8;
|
||||||
|
|
||||||
use super::edwards::{CachedPoint, ExtendedPoint};
|
use super::edwards::{CachedPoint, ExtendedPoint};
|
||||||
use super::field::{F51x4Reduced, F51x4Unreduced};
|
use super::field::{F51x4Reduced, F51x4Unreduced};
|
||||||
|
|
|
||||||
|
|
@ -9,15 +9,15 @@
|
||||||
|
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
|
|
||||||
use traits::Identity;
|
use crate::traits::Identity;
|
||||||
|
|
||||||
use std::ops::{Add, Neg, Sub};
|
use std::ops::{Add, Neg, Sub};
|
||||||
|
|
||||||
use subtle::Choice;
|
use subtle::Choice;
|
||||||
use subtle::ConditionallySelectable;
|
use subtle::ConditionallySelectable;
|
||||||
|
|
||||||
use edwards;
|
use crate::edwards;
|
||||||
use window::{LookupTable, NafLookupTable5, NafLookupTable8};
|
use crate::window::{LookupTable, NafLookupTable5, NafLookupTable8};
|
||||||
|
|
||||||
use super::constants;
|
use super::constants;
|
||||||
use super::field::{F51x4Reduced, F51x4Unreduced, Lanes, Shuffle};
|
use super::field::{F51x4Reduced, F51x4Unreduced, Lanes, Shuffle};
|
||||||
|
|
@ -258,8 +258,8 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn vector_addition_vs_serial_addition_vs_edwards_extendedpoint() {
|
fn vector_addition_vs_serial_addition_vs_edwards_extendedpoint() {
|
||||||
use constants;
|
use crate::constants;
|
||||||
use scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
|
|
||||||
println!("Testing id +- id");
|
println!("Testing id +- id");
|
||||||
let P = edwards::EdwardsPoint::identity();
|
let P = edwards::EdwardsPoint::identity();
|
||||||
|
|
@ -297,8 +297,8 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn vector_doubling_vs_serial_doubling_vs_edwards_extendedpoint() {
|
fn vector_doubling_vs_serial_doubling_vs_edwards_extendedpoint() {
|
||||||
use constants;
|
use crate::constants;
|
||||||
use scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
|
|
||||||
println!("Testing [2]id");
|
println!("Testing [2]id");
|
||||||
let P = edwards::EdwardsPoint::identity();
|
let P = edwards::EdwardsPoint::identity();
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
use core::ops::{Add, Mul, Neg};
|
use core::ops::{Add, Mul, Neg};
|
||||||
use packed_simd::{u64x4, IntoBits};
|
use packed_simd::{u64x4, IntoBits};
|
||||||
|
|
||||||
use backend::serial::u64::field::FieldElement51;
|
use crate::backend::serial::u64::field::FieldElement51;
|
||||||
|
|
||||||
/// A wrapper around `vpmadd52luq` that works on `u64x4`.
|
/// A wrapper around `vpmadd52luq` that works on `u64x4`.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,13 @@
|
||||||
|
|
||||||
use core::borrow::Borrow;
|
use core::borrow::Borrow;
|
||||||
|
|
||||||
use backend::vector::{CachedPoint, ExtendedPoint};
|
use crate::backend::vector::{CachedPoint, ExtendedPoint};
|
||||||
use edwards::EdwardsPoint;
|
use crate::edwards::EdwardsPoint;
|
||||||
use scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
use traits::{Identity, VartimeMultiscalarMul};
|
use crate::traits::{Identity, VartimeMultiscalarMul};
|
||||||
|
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
use prelude::*;
|
use crate::prelude::*;
|
||||||
|
|
||||||
/// Implements a version of Pippenger's algorithm.
|
/// Implements a version of Pippenger's algorithm.
|
||||||
///
|
///
|
||||||
|
|
@ -50,9 +50,7 @@ impl VartimeMultiscalarMul for Pippenger {
|
||||||
|
|
||||||
// Collect optimized scalars and points in a buffer for repeated access
|
// Collect optimized scalars and points in a buffer for repeated access
|
||||||
// (scanning the whole collection per each digit position).
|
// (scanning the whole collection per each digit position).
|
||||||
let scalars = scalars
|
let scalars = scalars.into_iter().map(|s| s.borrow().to_radix_2w(w));
|
||||||
.into_iter()
|
|
||||||
.map(|s| s.borrow().to_radix_2w(w));
|
|
||||||
|
|
||||||
let points = points
|
let points = points
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
|
@ -127,8 +125,8 @@ impl VartimeMultiscalarMul for Pippenger {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use constants;
|
use crate::constants;
|
||||||
use scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_vartime_pippenger() {
|
fn test_vartime_pippenger() {
|
||||||
|
|
|
||||||
|
|
@ -13,15 +13,15 @@
|
||||||
|
|
||||||
use core::borrow::Borrow;
|
use core::borrow::Borrow;
|
||||||
|
|
||||||
use backend::vector::{CachedPoint, ExtendedPoint};
|
use crate::backend::vector::{CachedPoint, ExtendedPoint};
|
||||||
use edwards::EdwardsPoint;
|
use crate::edwards::EdwardsPoint;
|
||||||
use scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
use traits::Identity;
|
use crate::traits::Identity;
|
||||||
use traits::VartimePrecomputedMultiscalarMul;
|
use crate::traits::VartimePrecomputedMultiscalarMul;
|
||||||
use window::{NafLookupTable5, NafLookupTable8};
|
use crate::window::{NafLookupTable5, NafLookupTable8};
|
||||||
|
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
use prelude::*;
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
|
||||||
pub struct VartimePrecomputedStraus {
|
pub struct VartimePrecomputedStraus {
|
||||||
|
|
|
||||||
|
|
@ -15,14 +15,14 @@ use core::borrow::Borrow;
|
||||||
|
|
||||||
use zeroize::Zeroizing;
|
use zeroize::Zeroizing;
|
||||||
|
|
||||||
use backend::vector::{CachedPoint, ExtendedPoint};
|
use crate::backend::vector::{CachedPoint, ExtendedPoint};
|
||||||
use edwards::EdwardsPoint;
|
use crate::edwards::EdwardsPoint;
|
||||||
use scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
use window::{LookupTable, NafLookupTable5};
|
use crate::window::{LookupTable, NafLookupTable5};
|
||||||
use traits::{Identity, MultiscalarMul, VartimeMultiscalarMul};
|
use crate::traits::{Identity, MultiscalarMul, VartimeMultiscalarMul};
|
||||||
|
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
use prelude::*;
|
use crate::prelude::*;
|
||||||
|
|
||||||
/// Multiscalar multiplication using interleaved window / Straus'
|
/// Multiscalar multiplication using interleaved window / Straus'
|
||||||
/// method. See the `Straus` struct in the serial backend for more
|
/// method. See the `Straus` struct in the serial backend for more
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
|
|
||||||
use backend::vector::{CachedPoint, ExtendedPoint};
|
use crate::backend::vector::{CachedPoint, ExtendedPoint};
|
||||||
use edwards::EdwardsPoint;
|
use crate::edwards::EdwardsPoint;
|
||||||
use scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
use traits::Identity;
|
use crate::traits::Identity;
|
||||||
use window::LookupTable;
|
use crate::window::LookupTable;
|
||||||
|
|
||||||
/// Perform constant-time, variable-base scalar multiplication.
|
/// Perform constant-time, variable-base scalar multiplication.
|
||||||
pub fn mul(point: &EdwardsPoint, scalar: &Scalar) -> EdwardsPoint {
|
pub fn mul(point: &EdwardsPoint, scalar: &Scalar) -> EdwardsPoint {
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,12 @@
|
||||||
|
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
|
|
||||||
use backend::vector::BASEPOINT_ODD_LOOKUP_TABLE;
|
use crate::backend::vector::BASEPOINT_ODD_LOOKUP_TABLE;
|
||||||
use backend::vector::{CachedPoint, ExtendedPoint};
|
use crate::backend::vector::{CachedPoint, ExtendedPoint};
|
||||||
use edwards::EdwardsPoint;
|
use crate::edwards::EdwardsPoint;
|
||||||
use scalar::Scalar;
|
use crate::scalar::Scalar;
|
||||||
use traits::Identity;
|
use crate::traits::Identity;
|
||||||
use window::NafLookupTable5;
|
use crate::window::NafLookupTable5;
|
||||||
|
|
||||||
/// Compute \\(aA + bB\\) in variable time, where \\(B\\) is the Ed25519 basepoint.
|
/// Compute \\(aA + bB\\) in variable time, where \\(B\\) is the Ed25519 basepoint.
|
||||||
pub fn mul(a: &Scalar, A: &EdwardsPoint, b: &Scalar) -> EdwardsPoint {
|
pub fn mul(a: &Scalar, A: &EdwardsPoint, b: &Scalar) -> EdwardsPoint {
|
||||||
|
|
|
||||||
|
|
@ -148,7 +148,7 @@ use crate::backend::serial::scalar_mul;
|
||||||
feature = "simd_backend",
|
feature = "simd_backend",
|
||||||
any(target_feature = "avx2", target_feature = "avx512ifma")
|
any(target_feature = "avx2", target_feature = "avx512ifma")
|
||||||
))]
|
))]
|
||||||
use backend::vector::scalar_mul;
|
use crate::backend::vector::scalar_mul;
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// Compressed points
|
// Compressed points
|
||||||
|
|
|
||||||
|
|
@ -202,7 +202,7 @@ use crate::backend::serial::scalar_mul;
|
||||||
feature = "simd_backend",
|
feature = "simd_backend",
|
||||||
any(target_feature = "avx2", target_feature = "avx512ifma")
|
any(target_feature = "avx2", target_feature = "avx512ifma")
|
||||||
))]
|
))]
|
||||||
use backend::vector::scalar_mul;
|
use crate::backend::vector::scalar_mul;
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// Compressed points
|
// Compressed points
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue