mirror of
https://github.com/saymrwulf/risc0-curve25519-dalek-source.git
synced 2026-09-05 20:10:35 +00:00
Add target u32/u64 backend override (#454)
As suggested in #453 it is sometimes feasible to select the backend bits via an override. This change provides `cfg(curve25519_dalek_bits)` to override the bits used in serial or fiat target backend.
This commit is contained in:
parent
29466f1b45
commit
2190332b67
7 changed files with 49 additions and 23 deletions
7
.github/workflows/rust.yml
vendored
7
.github/workflows/rust.yml
vendored
|
|
@ -115,4 +115,9 @@ jobs:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
# This filter selects no benchmarks, so we don't run any, only build them.
|
# This filter selects no benchmarks, so we don't run any, only build them.
|
||||||
- run: cargo bench "nonexistentbenchmark"
|
- name: Build u32 bench
|
||||||
|
run: env RUSTFLAGS="--cfg curve25519_dalek_bits=\"32\"" cargo bench "nonexistentbenchmark"
|
||||||
|
- name: Build u64 bench
|
||||||
|
run: env RUSTFLAGS="--cfg curve25519_dalek_bits=\"64\"" cargo bench "nonexistentbenchmark"
|
||||||
|
- name: Build default (host native) bench
|
||||||
|
run: cargo bench "nonexistentbenchmark"
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ major series.
|
||||||
|
|
||||||
## 4.x series
|
## 4.x series
|
||||||
|
|
||||||
|
* Add target u32/u64 backend overrides
|
||||||
* Migrate documentation to docs.rs hosted
|
* Migrate documentation to docs.rs hosted
|
||||||
* Fix backend documentation generation
|
* Fix backend documentation generation
|
||||||
* Deprecate `EdwardsPoint::hash_from_bytes` and rename it `EdwardsPoint::nonspect_map_to_curve`
|
* Deprecate `EdwardsPoint::hash_from_bytes` and rename it `EdwardsPoint::nonspect_map_to_curve`
|
||||||
|
|
|
||||||
15
build.rs
Normal file
15
build.rs
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
//! This selects the curve25519_dalek_bits either by default from target_pointer_width or explicitly set
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
#[cfg(any(
|
||||||
|
all(not(target_pointer_width = "64"), not(curve25519_dalek_bits = "64")),
|
||||||
|
curve25519_dalek_bits = "32"
|
||||||
|
))]
|
||||||
|
println!("cargo:rustc-cfg=curve25519_dalek_bits=\"32\"");
|
||||||
|
|
||||||
|
#[cfg(any(
|
||||||
|
all(target_pointer_width = "64", not(curve25519_dalek_bits = "32")),
|
||||||
|
curve25519_dalek_bits = "64"
|
||||||
|
))]
|
||||||
|
println!("cargo:rustc-cfg=curve25519_dalek_bits=\"64\"");
|
||||||
|
}
|
||||||
|
|
@ -21,18 +21,23 @@
|
||||||
use cfg_if::cfg_if;
|
use cfg_if::cfg_if;
|
||||||
|
|
||||||
cfg_if! {
|
cfg_if! {
|
||||||
|
|
||||||
if #[cfg(feature = "fiat_backend")] {
|
if #[cfg(feature = "fiat_backend")] {
|
||||||
#[cfg(not(target_pointer_width = "64"))]
|
|
||||||
|
#[cfg(curve25519_dalek_bits = "32")]
|
||||||
pub mod fiat_u32;
|
pub mod fiat_u32;
|
||||||
|
|
||||||
#[cfg(target_pointer_width = "64")]
|
#[cfg(curve25519_dalek_bits = "64")]
|
||||||
pub mod fiat_u64;
|
pub mod fiat_u64;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
#[cfg(not(target_pointer_width = "64"))]
|
|
||||||
|
#[cfg(curve25519_dalek_bits = "32")]
|
||||||
pub mod u32;
|
pub mod u32;
|
||||||
|
|
||||||
#[cfg(target_pointer_width = "64")]
|
#[cfg(curve25519_dalek_bits = "64")]
|
||||||
pub mod u64;
|
pub mod u64;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,14 +38,14 @@ use crate::scalar::Scalar;
|
||||||
|
|
||||||
cfg_if! {
|
cfg_if! {
|
||||||
if #[cfg(feature = "fiat_backend")] {
|
if #[cfg(feature = "fiat_backend")] {
|
||||||
#[cfg(not(target_pointer_width = "64"))]
|
#[cfg(curve25519_dalek_bits = "32")]
|
||||||
pub use crate::backend::serial::fiat_u32::constants::*;
|
pub use crate::backend::serial::fiat_u32::constants::*;
|
||||||
#[cfg(target_pointer_width = "64")]
|
#[cfg(curve25519_dalek_bits = "64")]
|
||||||
pub use crate::backend::serial::fiat_u64::constants::*;
|
pub use crate::backend::serial::fiat_u64::constants::*;
|
||||||
} else {
|
} else {
|
||||||
#[cfg(not(target_pointer_width = "64"))]
|
#[cfg(curve25519_dalek_bits = "32")]
|
||||||
pub use crate::backend::serial::u32::constants::*;
|
pub use crate::backend::serial::u32::constants::*;
|
||||||
#[cfg(target_pointer_width = "64")]
|
#[cfg(curve25519_dalek_bits = "64")]
|
||||||
pub use crate::backend::serial::u64::constants::*;
|
pub use crate::backend::serial::u64::constants::*;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -149,7 +149,7 @@ mod test {
|
||||||
|
|
||||||
/// Test that d = -121665/121666
|
/// Test that d = -121665/121666
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(all(not(target_pointer_width = "64"), not(feature = "fiat_backend")))]
|
#[cfg(all(curve25519_dalek_bits = "32", not(feature = "fiat_backend")))]
|
||||||
fn test_d_vs_ratio() {
|
fn test_d_vs_ratio() {
|
||||||
use crate::backend::serial::u32::field::FieldElement2625;
|
use crate::backend::serial::u32::field::FieldElement2625;
|
||||||
let a = -&FieldElement2625([121665, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
let a = -&FieldElement2625([121665, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||||
|
|
@ -162,7 +162,7 @@ mod test {
|
||||||
|
|
||||||
/// Test that d = -121665/121666
|
/// Test that d = -121665/121666
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(all(target_pointer_width = "64", not(feature = "fiat_backend")))]
|
#[cfg(all(curve25519_dalek_bits = "64", not(feature = "fiat_backend")))]
|
||||||
fn test_d_vs_ratio() {
|
fn test_d_vs_ratio() {
|
||||||
use crate::backend::serial::u64::field::FieldElement51;
|
use crate::backend::serial::u64::field::FieldElement51;
|
||||||
let a = -&FieldElement51([121665, 0, 0, 0, 0]);
|
let a = -&FieldElement51([121665, 0, 0, 0, 0]);
|
||||||
|
|
|
||||||
10
src/field.rs
10
src/field.rs
|
|
@ -37,9 +37,9 @@ use crate::constants;
|
||||||
|
|
||||||
cfg_if! {
|
cfg_if! {
|
||||||
if #[cfg(feature = "fiat_backend")] {
|
if #[cfg(feature = "fiat_backend")] {
|
||||||
#[cfg(not(target_pointer_width = "64"))]
|
#[cfg(curve25519_dalek_bits = "32")]
|
||||||
pub use backend::serial::fiat_u32::field::*;
|
pub use backend::serial::fiat_u32::field::*;
|
||||||
#[cfg(target_pointer_width = "64")]
|
#[cfg(curve25519_dalek_bits = "64")]
|
||||||
pub use backend::serial::fiat_u64::field::*;
|
pub use backend::serial::fiat_u64::field::*;
|
||||||
|
|
||||||
/// A `FieldElement` represents an element of the field
|
/// A `FieldElement` represents an element of the field
|
||||||
|
|
@ -49,7 +49,7 @@ cfg_if! {
|
||||||
/// implementations.
|
/// implementations.
|
||||||
///
|
///
|
||||||
/// Using formally-verified field arithmetic from fiat-crypto.
|
/// Using formally-verified field arithmetic from fiat-crypto.
|
||||||
#[cfg(not(target_pointer_width = "64"))]
|
#[cfg(curve25519_dalek_bits = "32")]
|
||||||
pub type FieldElement = backend::serial::fiat_u32::field::FieldElement2625;
|
pub type FieldElement = backend::serial::fiat_u32::field::FieldElement2625;
|
||||||
|
|
||||||
/// A `FieldElement` represents an element of the field
|
/// A `FieldElement` represents an element of the field
|
||||||
|
|
@ -59,9 +59,9 @@ cfg_if! {
|
||||||
/// implementations.
|
/// implementations.
|
||||||
///
|
///
|
||||||
/// Using formally-verified field arithmetic from fiat-crypto.
|
/// Using formally-verified field arithmetic from fiat-crypto.
|
||||||
#[cfg(target_pointer_width = "64")]
|
#[cfg(curve25519_dalek_bits = "64")]
|
||||||
pub type FieldElement = backend::serial::fiat_u64::field::FieldElement51;
|
pub type FieldElement = backend::serial::fiat_u64::field::FieldElement51;
|
||||||
} else if #[cfg(target_pointer_width = "64")] {
|
} else if #[cfg(curve25519_dalek_bits = "64")] {
|
||||||
pub use crate::backend::serial::u64::field::*;
|
pub use crate::backend::serial::u64::field::*;
|
||||||
|
|
||||||
/// A `FieldElement` represents an element of the field
|
/// A `FieldElement` represents an element of the field
|
||||||
|
|
|
||||||
|
|
@ -172,10 +172,10 @@ cfg_if! {
|
||||||
///
|
///
|
||||||
/// This is a type alias for one of the scalar types in the `backend`
|
/// This is a type alias for one of the scalar types in the `backend`
|
||||||
/// module.
|
/// module.
|
||||||
#[cfg(not(target_pointer_width = "64"))]
|
#[cfg(curve25519_dalek_bits = "32")]
|
||||||
#[cfg_attr(
|
#[cfg_attr(
|
||||||
docsrs,
|
docsrs,
|
||||||
doc(cfg(all(feature = "fiat_backend", not(target_pointer_width = "64"))))
|
doc(cfg(all(feature = "fiat_backend", curve25519_dalek_bits = "32")))
|
||||||
)]
|
)]
|
||||||
type UnpackedScalar = backend::serial::fiat_u32::scalar::Scalar29;
|
type UnpackedScalar = backend::serial::fiat_u32::scalar::Scalar29;
|
||||||
|
|
||||||
|
|
@ -183,25 +183,25 @@ cfg_if! {
|
||||||
///
|
///
|
||||||
/// This is a type alias for one of the scalar types in the `backend`
|
/// This is a type alias for one of the scalar types in the `backend`
|
||||||
/// module.
|
/// module.
|
||||||
#[cfg(target_pointer_width = "64")]
|
#[cfg(curve25519_dalek_bits = "64")]
|
||||||
#[cfg_attr(
|
#[cfg_attr(
|
||||||
docsrs,
|
docsrs,
|
||||||
doc(cfg(all(feature = "fiat_backend", target_pointer_width = "64")))
|
doc(cfg(all(feature = "fiat_backend", curve25519_dalek_bits = "64")))
|
||||||
)]
|
)]
|
||||||
type UnpackedScalar = backend::serial::fiat_u64::scalar::Scalar52;
|
type UnpackedScalar = backend::serial::fiat_u64::scalar::Scalar52;
|
||||||
} else if #[cfg(target_pointer_width = "64")] {
|
} else if #[cfg(curve25519_dalek_bits = "64")] {
|
||||||
/// An `UnpackedScalar` represents an element of the field GF(l), optimized for speed.
|
/// An `UnpackedScalar` represents an element of the field GF(l), optimized for speed.
|
||||||
///
|
///
|
||||||
/// This is a type alias for one of the scalar types in the `backend`
|
/// This is a type alias for one of the scalar types in the `backend`
|
||||||
/// module.
|
/// module.
|
||||||
#[cfg_attr(docsrs, doc(cfg(target_pointer_width = "64")))]
|
#[cfg_attr(docsrs, doc(cfg(curve25519_dalek_bits = "64")))]
|
||||||
type UnpackedScalar = backend::serial::u64::scalar::Scalar52;
|
type UnpackedScalar = backend::serial::u64::scalar::Scalar52;
|
||||||
} else {
|
} else {
|
||||||
/// An `UnpackedScalar` represents an element of the field GF(l), optimized for speed.
|
/// An `UnpackedScalar` represents an element of the field GF(l), optimized for speed.
|
||||||
///
|
///
|
||||||
/// This is a type alias for one of the scalar types in the `backend`
|
/// This is a type alias for one of the scalar types in the `backend`
|
||||||
/// module.
|
/// module.
|
||||||
#[cfg_attr(docsrs, doc(cfg(not(target_pointer_width = "64"))))]
|
#[cfg_attr(docsrs, doc(cfg(curve25519_dalek_bits = "64")))]
|
||||||
type UnpackedScalar = backend::serial::u32::scalar::Scalar29;
|
type UnpackedScalar = backend::serial::u32::scalar::Scalar29;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue