Skip to content

Commit

Permalink
fix lib25519 build
Browse files Browse the repository at this point in the history
  • Loading branch information
franziskuskiefer committed Mar 13, 2024
1 parent c247a4e commit a98e242
Show file tree
Hide file tree
Showing 7 changed files with 171 additions and 111 deletions.
2 changes: 1 addition & 1 deletion benchmarks/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ curve25519-dalek = "4.1.2"

# We always link this on linux, even if it may not be built.
# We check that in the build instead.
[target.'cfg(all(target_arch = "x86_64", target_os = "linux"))'.dev-dependencies]
[target.'cfg(all(target_arch = "x86_64", target_os = "linux", crypto_lib25519))'.dev-dependencies]
lib25519 = { path = "../sys/lib25519" }

[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies]
Expand Down
14 changes: 14 additions & 0 deletions benchmarks/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Libcrux Benchmarks

This crate is used to benchmark libcrux and compare it to 3rd party implementations.

## lib25519
Comparing with lib25519 only works on Linux.
To enable it first build the sys crate

```bash
cd ../sys/lib25519
./build-native.sh

RUSTFLAGS="--cfg crypto_lib25519" cargo criterion --bench x25519
```
216 changes: 108 additions & 108 deletions benchmarks/benches/x25519.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,114 +9,114 @@ fn derive(c: &mut Criterion) {
// Comparing libcrux performance for different payload sizes and other implementations.
let mut group = c.benchmark_group("x25519/derive");

// group.bench_function("libcrux", |b| {
// b.iter_batched(
// || {
// let sk1 = randombytes(32);
// let pk1 = ecdh::secret_to_public(ecdh::Algorithm::X25519, &sk1).unwrap();
// let sk2 = randombytes(32);
// (pk1, sk2)
// },
// |(pk1, sk2)| {
// let _zz = ecdh::derive(ecdh::Algorithm::X25519, &pk1, &sk2).unwrap();
// },
// BatchSize::SmallInput,
// )
// });

// group.bench_function("Ring", |b| {
// use ring::{agreement, rand::SystemRandom};

// b.iter_batched(
// || {
// let rng = SystemRandom::new();
// let sk1 =
// agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng).unwrap();
// let pk1 = sk1.compute_public_key().unwrap();
// let sk2 =
// agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng).unwrap();

// (pk1, sk2)
// },
// |(pk1, sk2)| {
// let _zz: Result<Vec<u8>, ring::error::Unspecified> = agreement::agree_ephemeral(
// sk2,
// &agreement::UnparsedPublicKey::new(&agreement::X25519, pk1),
// |k| Ok(k.to_vec()),
// )
// .unwrap();
// },
// BatchSize::SmallInput,
// )
// });

// #[cfg(all(not(windows), not(target_arch = "wasm32"), not(target_arch = "x86")))]
// group.bench_function("OpenSSL", |b| {
// use openssl::derive::Deriver;
// use openssl::pkey::{Id, PKey};
// use openssl::pkey_ctx::PkeyCtx;

// b.iter_batched(
// || {
// let mut ctx = PkeyCtx::new_id(Id::X25519).unwrap();
// ctx.keygen_init().unwrap();
// let sk1 = ctx.keygen().unwrap();
// let pk1 = sk1.raw_public_key().unwrap();

// ctx.keygen_init().unwrap();
// let sk2 = ctx.keygen().unwrap();
// let pk1 = PKey::public_key_from_raw_bytes(&pk1, Id::X25519).unwrap();
// (pk1, sk2)
// },
// |(pk1, sk2)| {
// let mut deriver = Deriver::new(&sk2).unwrap();
// deriver.set_peer(&pk1).unwrap();
// let _zz = deriver.derive_to_vec().unwrap();
// },
// BatchSize::SmallInput,
// )
// });

// group.bench_function("Dalek", |b| {
// use rand_core::OsRng;
// use x25519_dalek::{EphemeralSecret, PublicKey};

// b.iter_batched(
// || {
// let sk1 = EphemeralSecret::random_from_rng(OsRng);
// let pk1 = PublicKey::from(&sk1);
// let sk2 = EphemeralSecret::random_from_rng(OsRng);
// (pk1, sk2)
// },
// |(pk1, sk2)| {
// let _zz = sk2.diffie_hellman(&pk1);
// },
// BatchSize::SmallInput,
// )
// });

// group.bench_function("Dalek Ristretto", |b| {
// use curve25519_dalek::ristretto::RistrettoPoint;
// use curve25519_dalek::scalar::Scalar;
// use rand_core::OsRng;

// b.iter_batched(
// || {
// let mut sk1_b = [0u8; 32];
// OsRng.fill_bytes(&mut sk1_b);
// let sk1 = Scalar::from_bytes_mod_order(sk1_b);
// let pk1 = RistrettoPoint::mul_base(&sk1);
// let mut sk2_b = [0u8; 32];
// OsRng.fill_bytes(&mut sk2_b);
// let sk2 = Scalar::from_bytes_mod_order(sk2_b);
// (pk1, sk2)
// },
// |(pk1, sk2)| {
// let _zz = pk1 * sk2;
// },
// BatchSize::SmallInput,
// )
// });
group.bench_function("libcrux", |b| {
b.iter_batched(
|| {
let sk1 = randombytes(32);
let pk1 = ecdh::secret_to_public(ecdh::Algorithm::X25519, &sk1).unwrap();
let sk2 = randombytes(32);
(pk1, sk2)
},
|(pk1, sk2)| {
let _zz = ecdh::derive(ecdh::Algorithm::X25519, &pk1, &sk2).unwrap();
},
BatchSize::SmallInput,
)
});

group.bench_function("Ring", |b| {
use ring::{agreement, rand::SystemRandom};

b.iter_batched(
|| {
let rng = SystemRandom::new();
let sk1 =
agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng).unwrap();
let pk1 = sk1.compute_public_key().unwrap();
let sk2 =
agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng).unwrap();

(pk1, sk2)
},
|(pk1, sk2)| {
let _zz: Result<Vec<u8>, ring::error::Unspecified> = agreement::agree_ephemeral(
sk2,
&agreement::UnparsedPublicKey::new(&agreement::X25519, pk1),
|k| Ok(k.to_vec()),
)
.unwrap();
},
BatchSize::SmallInput,
)
});

#[cfg(all(not(windows), not(target_arch = "wasm32"), not(target_arch = "x86")))]
group.bench_function("OpenSSL", |b| {
use openssl::derive::Deriver;
use openssl::pkey::{Id, PKey};
use openssl::pkey_ctx::PkeyCtx;

b.iter_batched(
|| {
let mut ctx = PkeyCtx::new_id(Id::X25519).unwrap();
ctx.keygen_init().unwrap();
let sk1 = ctx.keygen().unwrap();
let pk1 = sk1.raw_public_key().unwrap();

ctx.keygen_init().unwrap();
let sk2 = ctx.keygen().unwrap();
let pk1 = PKey::public_key_from_raw_bytes(&pk1, Id::X25519).unwrap();
(pk1, sk2)
},
|(pk1, sk2)| {
let mut deriver = Deriver::new(&sk2).unwrap();
deriver.set_peer(&pk1).unwrap();
let _zz = deriver.derive_to_vec().unwrap();
},
BatchSize::SmallInput,
)
});

group.bench_function("Dalek", |b| {
use rand_core::OsRng;
use x25519_dalek::{EphemeralSecret, PublicKey};

b.iter_batched(
|| {
let sk1 = EphemeralSecret::random_from_rng(OsRng);
let pk1 = PublicKey::from(&sk1);
let sk2 = EphemeralSecret::random_from_rng(OsRng);
(pk1, sk2)
},
|(pk1, sk2)| {
let _zz = sk2.diffie_hellman(&pk1);
},
BatchSize::SmallInput,
)
});

group.bench_function("Dalek Ristretto", |b| {
use curve25519_dalek::ristretto::RistrettoPoint;
use curve25519_dalek::scalar::Scalar;
use rand_core::OsRng;

b.iter_batched(
|| {
let mut sk1_b = [0u8; 32];
OsRng.fill_bytes(&mut sk1_b);
let sk1 = Scalar::from_bytes_mod_order(sk1_b);
let pk1 = RistrettoPoint::mul_base(&sk1);
let mut sk2_b = [0u8; 32];
OsRng.fill_bytes(&mut sk2_b);
let sk2 = Scalar::from_bytes_mod_order(sk2_b);
(pk1, sk2)
},
|(pk1, sk2)| {
let _zz = pk1 * sk2;
},
BatchSize::SmallInput,
)
});

#[cfg(all(target_arch = "x86_64", target_os = "linux", crypto_lib25519))]
group.bench_function("lib25519", |b| {
Expand Down
4 changes: 3 additions & 1 deletion benchmarks/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ use std::{env, path::Path};

fn main() {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let lib_path = format!("{manifest_dir}/../sys/lib25519/lib");

if Path::new(&format!("{manifest_dir}/../sys/lib25519/lib/lib25519.so")).exists() {
if Path::new(&format!("{lib_path}/lib25519.so")).exists() {
// Only build benchmarks against lib25519 when the C library is somewhere
// in the path.
println!("cargo:rustc-link-search={lib_path}");
println!("cargo:rustc-cfg=crypto_lib25519");
}
}
42 changes: 42 additions & 0 deletions sys/lib25519/build-native.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/usr/bin/env bash

set -e

cwd=$(cd $(dirname $0); pwd -P)

export LD_LIBRARY_PATH="$cwd/lib"
export LIBRARY_PATH="$cwd/lib"
export CPATH="$cwd/include"
export PATH="$cwd/bin:$PATH"

wget -m https://cpucycles.cr.yp.to/libcpucycles-latest-version.txt
version=$(cat cpucycles.cr.yp.to/libcpucycles-latest-version.txt)
wget -m https://cpucycles.cr.yp.to/libcpucycles-$version.tar.gz
tar -xzf cpucycles.cr.yp.to/libcpucycles-$version.tar.gz
cd libcpucycles-$version

./configure --prefix=$cwd && make -j8 install

cd -

wget -m https://randombytes.cr.yp.to/librandombytes-latest-version.txt
version=$(cat randombytes.cr.yp.to/librandombytes-latest-version.txt)
wget -m https://randombytes.cr.yp.to/librandombytes-$version.tar.gz
tar -xzf randombytes.cr.yp.to/librandombytes-$version.tar.gz
cd librandombytes-$version

./configure --prefix=$cwd && make -j8 install

cd -

wget -m https://lib25519.cr.yp.to/lib25519-latest-version.txt
version=$(cat lib25519.cr.yp.to/lib25519-latest-version.txt)
wget -m https://lib25519.cr.yp.to/lib25519-$version.tar.gz
tar -xzf lib25519.cr.yp.to/lib25519-$version.tar.gz
cd lib25519-$version

./configure --prefix=$cwd && make -j8 install

cd -

rm -rf lib25519* randombytes* cpucycles* librandombytes* libcpucycles*
2 changes: 2 additions & 0 deletions sys/lib25519/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,7 @@ use std::env;
fn main() {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
println!("cargo:rustc-link-search={manifest_dir}/lib");
println!("cargo:rustc-link-lib=cpucycles");
println!("cargo:rustc-link-lib=randombytes");
println!("cargo:rustc-link-lib=25519");
}
2 changes: 1 addition & 1 deletion sys/pqclean/src/bindings.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* automatically generated by rust-bindgen 0.69.2 */
/* automatically generated by rust-bindgen 0.69.4 */

pub const SHAKE128_RATE: u32 = 168;
pub const SHAKE256_RATE: u32 = 136;
Expand Down

0 comments on commit a98e242

Please sign in to comment.