Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
d1b362e
begin implementation of signature trait
wysiwys Jul 17, 2025
7071732
start implementing signature trait in ed25519
wysiwys Jul 17, 2025
c217ba7
begin implementing `secrets::Signature` trait
wysiwys Jul 17, 2025
108cbc8
blanket impl secrets trait from owned trait
wysiwys Jul 23, 2025
05fe7b3
config for signature traits
wysiwys Jul 23, 2025
9fcf035
keep original visibility
wysiwys Jul 24, 2025
67209db
config as generic type
wysiwys Jul 24, 2025
d12a600
begin implementing for rsa
wysiwys Jul 24, 2025
6c642cd
implement auxiliary data for sign and verify
wysiwys Jul 24, 2025
b71cc61
take public key as input
wysiwys Jul 24, 2025
63f0580
allow destructured parameter names
wysiwys Jul 24, 2025
35356d2
implement for all sha2 variants and structure modules
wysiwys Jul 24, 2025
8fdd726
adapt test
wysiwys Jul 24, 2025
4bad367
separate traits for auxiliary info
wysiwys Jul 24, 2025
5e8a1fb
split out traits and use aliases
wysiwys Jul 24, 2025
cdc800c
formatting
wysiwys Jul 24, 2025
05381db
split slice macro into two macros
wysiwys Jul 24, 2025
fd94741
use correct error type
wysiwys Jul 24, 2025
31f50e0
feature flags
wysiwys Jul 24, 2025
15b04e2
use existing sha2 type
wysiwys Jul 24, 2025
af370bf
rename traits
wysiwys Jul 24, 2025
09fce1e
include context
wysiwys Jul 24, 2025
1d19b7c
add missing NoAux trait
wysiwys Jul 24, 2025
5b2c4f3
directly reference error type from `owned`
wysiwys Jul 24, 2025
6b6888a
add comment about randomness
wysiwys Jul 24, 2025
70a3f2c
formatting
wysiwys Aug 11, 2025
c933907
implement error conversions
wysiwys Aug 11, 2025
326b7be
consistent types
wysiwys Aug 11, 2025
5173d9f
extract traits
wysiwys Aug 11, 2025
a0b98eb
exclude signature trait implementation
wysiwys Aug 11, 2025
f7943ec
keep struct fields private
wysiwys Aug 11, 2025
6dcbc71
fix build warning
wysiwys Aug 11, 2025
550454a
finish rsa test
wysiwys Aug 11, 2025
e8f46bd
simplify error handling to return `LibraryError`
wysiwys Aug 12, 2025
2e8555b
call underlying functions directly
wysiwys Aug 12, 2025
5066665
inline `sign()` and `verify()`
wysiwys Aug 12, 2025
bcfcd80
add doc comments to errors
wysiwys Aug 12, 2025
3b2f996
implement `core::fmt::Display` for errors
wysiwys Aug 12, 2025
8b412cb
feature-gated `core::error::Error` implementation
wysiwys Aug 12, 2025
23b49bd
use constants for lengths
wysiwys Aug 12, 2025
42f2cde
use `()` instead of `&()` as placeholder
wysiwys Aug 12, 2025
d831972
pub use `SignError` only
wysiwys Aug 12, 2025
fb97b15
add doc comments
wysiwys Aug 12, 2025
66b211d
consistent argument names
wysiwys Aug 12, 2025
2acb941
reorganize rsa trait implementation
wysiwys Aug 12, 2025
528ab46
formatting
wysiwys Aug 12, 2025
088b69d
improve top-level doc comment and module naming
wysiwys Aug 12, 2025
a19711a
doc comments for `libcrux-ml-dsa`
wysiwys Aug 12, 2025
bb18d95
reorganize module
wysiwys Aug 12, 2025
a39aa22
improve doc comments
wysiwys Aug 12, 2025
0b4f4b3
reorganize trait implementation module
wysiwys Aug 12, 2025
e81f5e4
add doc comments and improve generic type name
wysiwys Aug 12, 2025
951818b
use `signing_key` and `verification_key` terms
wysiwys Aug 12, 2025
ca63e9e
improve generic type name
wysiwys Aug 12, 2025
0fe954c
add valid parameter structs to doc comment
wysiwys Aug 12, 2025
3d1ee8f
rename parameter
wysiwys Aug 12, 2025
9065e77
more precise error variant
wysiwys Aug 12, 2025
32dc6d1
remove TODOs about phrasing
wysiwys Aug 12, 2025
77fbdba
remove unneeded TODO for error conversion
wysiwys Aug 12, 2025
615920f
document `SignAux` and `VerifyAux` types
wysiwys Aug 12, 2025
4240c95
remove TODO
wysiwys Aug 12, 2025
81da552
remove unused lifetime
wysiwys Aug 13, 2025
e0ac944
move auxiliary types to associated types and comment out NoAux traits
wysiwys Aug 13, 2025
aa3621f
move associated types above doc comments
wysiwys Aug 13, 2025
e0195d4
use associated type for signing key
wysiwys Aug 13, 2025
2f7909e
use struct for RSA signing key in trait implementation
wysiwys Aug 13, 2025
7fa3fe7
blanket impl `secrets::Sign` trait for U8 array refs only
wysiwys Aug 14, 2025
00e7030
implement secrets trait for RSA
wysiwys Aug 14, 2025
1769370
doc comments
wysiwys Aug 14, 2025
e265945
remove unused NoAux traits
wysiwys Aug 14, 2025
1210b9f
remove unneeded TODO
wysiwys Aug 18, 2025
16f441c
add generic test
wysiwys Aug 18, 2025
5af82aa
add verification_key as argument and rename test
wysiwys Aug 18, 2025
1d9e173
pub use `arrayref::Verify` in owned and secrets traits modules
wysiwys Aug 18, 2025
a433c5d
add test for each trait
wysiwys Aug 18, 2025
02132d3
formatting
wysiwys Aug 18, 2025
b1e7fc9
reexport error types
wysiwys Aug 18, 2025
262e451
implement `owned` trait for clarity
wysiwys Aug 18, 2025
89ed799
update comment
wysiwys Aug 18, 2025
5cfd1fa
declassify implementation
wysiwys Aug 18, 2025
261f32e
remove outdated comment
wysiwys Aug 18, 2025
177c8c2
make rsa types generic over `u8`/`U8` and reorganize trait implementa…
wysiwys Aug 18, 2025
5caff1f
move `Declassify` implementation to `impl_hacl.rs`
wysiwys Aug 18, 2025
90c9fda
use type aliases and move generic key types to separate module
wysiwys Aug 18, 2025
56dd87b
update tests
wysiwys Aug 18, 2025
4ee67dc
ensure consistent struct layout
wysiwys Aug 18, 2025
bdd34d2
ensure struct layout is same as underlying array
wysiwys Aug 18, 2025
bc6c70b
directly link to modules
wysiwys Aug 18, 2025
8307322
consistent doc comments and links
wysiwys Aug 18, 2025
a0b34d2
move libcrux_secrets trait implementations to `generic_keys` module
wysiwys Aug 18, 2025
2798f56
formatting
wysiwys Aug 19, 2025
31aec24
remove Signature trait implementation
wysiwys Aug 25, 2025
c1d7f67
use secrets in all traits, and remove dedicated secrets trait
wysiwys Aug 25, 2025
61cb13c
update trait implementations
wysiwys Aug 25, 2025
60958f4
remove `context` from traits API
wysiwys Aug 25, 2025
27cc66a
update comments
wysiwys Aug 25, 2025
ff2a996
use array signing key type
wysiwys Aug 25, 2025
1fca205
allow longer signature buffers and return number of bytes written
wysiwys Aug 25, 2025
095164c
fix typo
wysiwys Aug 25, 2025
49b628e
restore original rsa implementation
wysiwys Aug 25, 2025
28ff2ab
combine traits
wysiwys Aug 26, 2025
384401f
add context
wysiwys Aug 26, 2025
6d7ebf6
begin implementing keygen
wysiwys Aug 26, 2025
a870aca
replace `std::marker::PhantomData` with `core::marker::PhantomData`
wysiwys Aug 26, 2025
7a69374
improve doc comments and arguments
wysiwys Aug 26, 2025
5cbd348
exclude signers for eurydice
wysiwys Aug 26, 2025
2f5c4ed
implement `Sign` trait on standalone struct
wysiwys Aug 26, 2025
2694838
remove generic `Signer` struct
wysiwys Aug 26, 2025
2a529f3
update feature name
wysiwys Sep 29, 2025
1ae6d54
use literal for context in `impl_context` macro
wysiwys Oct 1, 2025
6982e57
formatting
wysiwys Oct 1, 2025
68a9eb4
add key-centric API
wysiwys Oct 1, 2025
57fd42f
add `libcrux-signature` crate
wysiwys Oct 1, 2025
f5e9a15
remove VerifyAux from traits
wysiwys Oct 1, 2025
2dac988
update doctests
wysiwys Oct 1, 2025
197f2d8
move `SignAux` type to `SignTypes`
wysiwys Oct 1, 2025
8edd064
update generic test
wysiwys Oct 1, 2025
3089f62
update secrets types
wysiwys Oct 1, 2025
b6d36fb
Add a whole lot of documentation and make secret independence checkin…
keks Oct 2, 2025
1c65231
clean up errors, constrain context
keks Oct 2, 2025
e903a0c
hax: don't extract ml-dsa trait implementations
keks Oct 2, 2025
e736c85
Update libcrux-ml-dsa/Cargo.toml
wysiwys Oct 6, 2025
e4bbf46
don't use DeclassifyRefMut in keygen
wysiwys Oct 6, 2025
4df177d
fix lints
wysiwys Oct 6, 2025
21f0a64
formatting
wysiwys Oct 6, 2025
7370be0
use imports to simplify error matching
wysiwys Oct 6, 2025
8b06bfc
move error conversions to separate `From` implementations
wysiwys Oct 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ members = [
"crates/primitives/digest",
"crates/testing/kats",
"hacl-rs",
"crates/primitives/signature",
]

[workspace.package]
Expand Down
36 changes: 36 additions & 0 deletions crates/primitives/signature/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
[package]
authors.workspace = true
edition.workspace = true
homepage.workspace = true
license.workspace = true
name = "libcrux-signature"
readme.workspace = true
repository.workspace = true
version.workspace = true

[dependencies]
libcrux-ecdsa = { version = "0.0.3", path = "../../../ecdsa", optional = true }
libcrux-ed25519 = { version = "0.0.3", path = "../../../ed25519", optional = true }
libcrux-ml-dsa = { version = "0.0.3", path = "../../../libcrux-ml-dsa", optional = true }
libcrux-traits = { version = "0.0.3", path = "../../../traits", optional = true }
libcrux-secrets = { version = "0.0.3", path = "../../../secrets", optional = true }

[features]
default = ["ed25519", "ecdsa", "mldsa"]

check-secret-independence = [
"libcrux-secrets/check-secret-independence",
"libcrux-traits/check-secret-independence",
"libcrux-ml-dsa/expose-secret-independence",
"libcrux-ed25519/check-secret-independence",
"libcrux-ecdsa/check-secret-independence",
]

ecdsa = ["dep:libcrux-ecdsa", "any"]
ed25519 = ["dep:libcrux-ed25519", "any"]
mldsa = ["dep:libcrux-ml-dsa", "any"]

any = ["dep:libcrux-traits", "dep:libcrux-secrets"]

[dev-dependencies]
rand = "0.9"
98 changes: 98 additions & 0 deletions crates/primitives/signature/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
#[cfg(any(feature = "ecdsa", feature = "ed25519", feature = "mldsa"))]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A lib comment up here would be nice with a little info and an example on how to use this.

pub use libcrux_traits::signature::{
key_centric_owned::{KeyPair, SigningKey, VerificationKey},
key_centric_refs::{SigningKeyRef, VerificationKeyRef},
owned::Sign,
};

#[cfg(feature = "ecdsa")]
pub mod ecdsa {
pub mod p256 {
//! ```rust
//! use libcrux_signature::ecdsa::p256::{P256Signer as P256, Sha2_512, Nonce};
//! use libcrux_signature::{Sign, KeyPair, SigningKey, VerificationKey};
//!
//! // generate a new nonce
//! use rand::TryRngCore;
//! let mut rng = rand::rngs::OsRng;
//! let nonce = Nonce::random(&mut rng.unwrap_mut()).unwrap();
//!
//! // generate a new signature keypair from random bytes
//! let KeyPair { signing_key, verification_key } =
//! P256::<Sha2_512>::generate_key_pair(&mut rng.unwrap_mut()).unwrap();
//!
//! // sign
//! let signature = signing_key.sign(b"payload", &nonce).unwrap();
//!
//! // verify
//! verification_key.verify(b"payload", &signature).unwrap();
//! ```
pub use libcrux_ecdsa::signers::p256::{
Nonce, Sha2_256, Sha2_384, Sha2_512, Signer as P256Signer,
};
}
}

#[cfg(feature = "ed25519")]
pub mod ed25519 {
//! ```rust
//! use libcrux_signature::ed25519::Ed25519;
//! use libcrux_signature::{Sign, KeyPair, SigningKey, VerificationKey};
//!
//! use rand::TryRngCore;
//! let mut rng = rand::rngs::OsRng;
//! // generate a new signature keypair from random bytes
//! let KeyPair { signing_key, verification_key }
//! = Ed25519::generate_key_pair(&mut rng.unwrap_mut()).unwrap();
//!
//! // sign
//! let signature = signing_key.sign(b"payload", ()).unwrap();
//!
//! // verify
//! verification_key.verify(b"payload", &signature).unwrap();
//! ```
pub use libcrux_ed25519::signers::Signer as Ed25519;
}

#[cfg(feature = "mldsa")]
pub mod mldsa {
//! ```rust
//! use libcrux_signature::mldsa::{Context, MlDsa44, impl_context};
//! use libcrux_signature::{Sign, KeyPair, SigningKey, VerificationKey};
//!
//! // set application context
//! impl_context!(AppContext, b"context");

//! use rand::TryRngCore;
//! let mut rng = rand::rngs::OsRng;
//!
//! // generate a new signature keypair from random bytes
//! let KeyPair { signing_key, verification_key }
//! = MlDsa44::<AppContext>::generate_key_pair(&mut rng.unwrap_mut()).unwrap();
//!
//! // sign
//! let signature = signing_key.sign(b"payload", [2; 32]).unwrap();
//!
//! // verify
//! verification_key.verify(b"payload", &signature).unwrap();
//! ```
//!
//! ```rust
//! use libcrux_signature::mldsa::{Context, MlDsa44, impl_context};
//! use libcrux_signature::SigningKeyRef;
//!
//! // set application context
//! impl_context!(AppContext, b"context");
//!
//! // signing key from bytes
//! let signing_key = SigningKeyRef::<MlDsa44<AppContext>>::from_bytes(&[1; 2560]).unwrap();
//!
//! // sign with randomness
//! signing_key.sign(b"payload", [2; 32]).unwrap();
//!
//! ```
pub use libcrux_ml_dsa::signers::{
impl_context, Context, MlDsa44Signer as MlDsa44, MlDsa65Signer as MlDsa65,
MlDsa87Signer as MlDsa87,
};
}
14 changes: 10 additions & 4 deletions ecdsa/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,28 +1,34 @@
[package]
name = "libcrux-ecdsa"
description = "Formally verified ECDSA signature library"
name = "libcrux-ecdsa"
readme = "Readme.md"
version = "0.0.3"

authors.workspace = true
license.workspace = true
homepage.workspace = true
edition.workspace = true
homepage.workspace = true
license.workspace = true
repository.workspace = true

[dependencies]
libcrux-p256 = { version = "=0.0.3", path = "../p256", features = [
"expose-hacl",
] }
libcrux-sha2 = { version = "=0.0.3", path = "../sha2" }
libcrux-secrets = { version = "=0.0.3", path = "../secrets" }
libcrux-traits = { version = "=0.0.3", path = "../traits" }
rand = { version = "0.9", optional = true, default-features = false }

[features]
default = ["rand", "std"]
rand = ["dep:rand"]
std = ["rand?/std"]
check-secret-independence = [
"libcrux-secrets/check-secret-independence",
"libcrux-traits/check-secret-independence",
]

[dev-dependencies]
rand_core = { version = "0.9" , features = ["os_rng"] }
rand_core = { version = "0.9", features = ["os_rng"] }
serde = { version = "1.0.217", features = ["derive"] }
serde_json = "1.0.138"
166 changes: 166 additions & 0 deletions ecdsa/src/impl_signature_trait.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
pub mod signers {
//! [`libcrux_traits::signature`] APIs.

use libcrux_secrets::{DeclassifyRef, U8};
use libcrux_traits::signature::arrayref;

const SIGNING_KEY_LEN: usize = 32;
const VERIFICATION_KEY_LEN: usize = 64;
const SIG_LEN: usize = 64;
const RAND_KEYGEN_LEN: usize = 32;

macro_rules! impl_signature_traits {
(
$alias:ident,
$name:ty,
$sign_fn:ident,
$verify_fn:ident
) => {
#[doc = concat!(
"ECDSA P256 signer specialized for ",
stringify!($name),
" hash algorithm.\n\n",
"This type alias provides a convenient way to access ECDSA signing and verification\n",
"operations using the ",
stringify!($name),
" hash function. It implements all signature traits from\n",
"`libcrux_traits::signature` including arrayref, owned, slice, and key-centric APIs.\n\n",
"# Hash Algorithm\n",
"Uses ",
stringify!($name),
" for message hashing before signing.\n\n",
"# Key Sizes\n",
"- Signing keys: 32 bytes\n",
"- Verification keys: 64 bytes\n",
"- Signatures: 64 bytes"
)]
pub type $alias = Signer<$name>;

/// The [`arrayref`](libcrux_traits::signature::arrayref) version of the Sign trait.
impl arrayref::Sign<SIGNING_KEY_LEN, VERIFICATION_KEY_LEN, SIG_LEN, RAND_KEYGEN_LEN> for Signer<$name> {
/// Sign a payload using a provided signing key and `nonce`.
#[inline(always)]
fn sign(
payload: &[u8],
signing_key: &[U8; SIGNING_KEY_LEN],
signature: &mut [u8; SIG_LEN],
nonce: &Nonce,
) -> Result<(), arrayref::SignError> {
let result = libcrux_p256::$sign_fn(
signature,
payload.len().try_into().map_err(|_| arrayref::SignError::InvalidArgument)?,
payload,
signing_key.declassify_ref(),
&nonce.0,
);
if !result {
return Err(arrayref::SignError::LibraryError);
}
Ok(())
}

/// Verify a signature using a provided verification key.
#[inline(always)]
fn verify(
payload: &[u8],
verification_key: &[u8; VERIFICATION_KEY_LEN],
signature: &[u8; SIG_LEN],
) -> Result<(), arrayref::VerifyError> {
let result = libcrux_p256::$verify_fn(
payload.len().try_into().map_err(|_| arrayref::VerifyError::InvalidPayloadLength)?,
payload,
verification_key,
<&[u8; 32]>::try_from(&signature[0..32]).unwrap(),
<&[u8; 32]>::try_from(&signature[32..]).unwrap(),
);
if !result {
return Err(arrayref::VerifyError::LibraryError);
}
Ok(())
}

fn keygen_derand(
signing_key: &mut [U8; SIGNING_KEY_LEN],
verification_key: &mut [u8; VERIFICATION_KEY_LEN],
randomness: &[U8; RAND_KEYGEN_LEN],
) -> Result<(), arrayref::KeyGenError> {
use libcrux_traits::ecdh::arrayref::*;

libcrux_p256::P256::secret_to_public(verification_key, &randomness).map_err(|err| match err {
libcrux_traits::ecdh::arrayref::SecretToPublicError::InvalidSecret => arrayref::KeyGenError::InvalidRandomness,
libcrux_traits::ecdh::arrayref::SecretToPublicError::Unknown => arrayref::KeyGenError::LibraryError,

})?;
*signing_key = *randomness;
Ok(())

}
}

libcrux_traits::impl_signature_slice_trait!(
Signer<$name> => SIGNING_KEY_LEN, VERIFICATION_KEY_LEN, SIG_LEN, RAND_KEYGEN_LEN, &Nonce, nonce);

// key centric APIs
libcrux_traits::signature::key_centric_owned::impl_sign_types!(
Signer<$name>,
SIGNING_KEY_LEN,
VERIFICATION_KEY_LEN,
SIG_LEN,
RAND_KEYGEN_LEN,
&'a Nonce
);
};
}

/// [`libcrux_traits::signature`] APIs for p256.
pub mod p256 {
use super::*;

pub use crate::p256::Nonce;

/// Generic ECDSA P256 signer parameterized by hash algorithm.
///
/// This struct provides the foundation for ECDSA signing and verification operations
/// using the P256 elliptic curve. It is parameterized by a hash algorithm type `Hash`
/// to support different hash functions while maintaining type safety.
///
/// # Type Parameter
/// - `Hash`: The hash algorithm type (e.g., `Sha2_256`, `Sha2_384`, `Sha2_512`)
///
/// # Usage
/// This struct is typically not used directly. Instead, use the specialized type aliases:
/// - [`Sha2_256Signer`] for SHA-256 hashing
/// - [`Sha2_384Signer`] for SHA-384 hashing
/// - [`Sha2_512Signer`] for SHA-512 hashing
///
/// # Security
/// - Requires a cryptographically secure nonce for each signing operation
/// - The same nonce must never be reused with the same key and different messages
/// - Verification is deterministic and does not require additional randomness
pub struct Signer<Hash> {
_marker: core::marker::PhantomData<Hash>,
}
pub use libcrux_sha2::{Sha256 as Sha2_256, Sha384 as Sha2_384, Sha512 as Sha2_512};

impl_signature_traits!(
Sha2_256Signer,
Sha2_256,
ecdsa_sign_p256_sha2,
ecdsa_verif_p256_sha2
);

impl_signature_traits!(
Sha2_384Signer,
Sha2_384,
ecdsa_sign_p256_sha384,
ecdsa_verif_p256_sha384
);

impl_signature_traits!(
Sha2_512Signer,
Sha2_512,
ecdsa_sign_p256_sha512,
ecdsa_verif_p256_sha512
);
}
}
6 changes: 6 additions & 0 deletions ecdsa/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,9 @@ pub type DigestAlgorithm = libcrux_sha2::Algorithm;
/// The number of iteration for rejection sampling.
#[cfg(feature = "rand")]
pub(crate) const RAND_LIMIT: usize = 100;

mod impl_signature_trait;
pub use impl_signature_trait::*;

pub use libcrux_traits::signature::key_centric_owned::{KeyPair, SigningKey, VerificationKey};
pub use libcrux_traits::signature::key_centric_refs::{SigningKeyRef, VerificationKeyRef};
2 changes: 1 addition & 1 deletion ecdsa/src/p256.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ pub struct Signature {
}

/// An ECDSA P-256 nonce
pub struct Nonce([u8; 32]);
pub struct Nonce(pub(super) [u8; 32]);

/// An ECDSA P-256 private key
pub struct PrivateKey([u8; 32]);
Expand Down
7 changes: 7 additions & 0 deletions ed25519/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ libcrux-sha2 = { version = "=0.0.3", path = "../sha2", features = [
"expose-hacl",
] }
libcrux-macros = { version = "=0.0.3", path = "../macros" }
libcrux-traits = { version = "=0.0.3", path = "../traits" }
libcrux-secrets = { version = "=0.0.3", path = "../secrets" }

rand_core = { version = "0.9", optional = true }
tls_codec = { version = "0.4.2", features = ["derive"], optional = true }

Expand All @@ -26,3 +29,7 @@ wycheproof = "0.6.0"
[features]
rand = ["dep:rand_core"]
codec = ["tls_codec/std"]
check-secret-independence = [
"libcrux-traits/check-secret-independence",
"libcrux-secrets/check-secret-independence",
]
Loading
Loading