pub struct RingCryptoProvider;Expand description
Native crypto provider powered by ring (Ed25519) and p256 (ECDSA P-256).
Offloads CPU-bound operations to Tokio’s blocking pool via
spawn_blocking to prevent async reactor starvation under load.
Usage:
use auths_crypto::{CryptoProvider, RingCryptoProvider};
let provider = RingCryptoProvider;
provider.verify_ed25519(&pubkey, &msg, &sig).await.unwrap();Implementations§
Source§impl RingCryptoProvider
impl RingCryptoProvider
Sourcepub fn p256_generate() -> Result<(SecureSeed, Vec<u8>), CryptoError>
pub fn p256_generate() -> Result<(SecureSeed, Vec<u8>), CryptoError>
Generate a P-256 keypair. Returns (seed, compressed_public_key).
Sourcepub fn p256_sign(
seed: &[u8; 32],
message: &[u8],
) -> Result<Vec<u8>, CryptoError>
pub fn p256_sign( seed: &[u8; 32], message: &[u8], ) -> Result<Vec<u8>, CryptoError>
Sign with P-256. Returns 64-byte raw r||s.
Sourcepub fn ed25519_verify(
pubkey: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), CryptoError>
pub fn ed25519_verify( pubkey: &[u8], message: &[u8], signature: &[u8], ) -> Result<(), CryptoError>
Verify an Ed25519 signature synchronously. Pubkey must be 32 raw bytes.
Sourcepub fn ed25519_sign(
seed: &[u8; 32],
message: &[u8],
) -> Result<Vec<u8>, CryptoError>
pub fn ed25519_sign( seed: &[u8; 32], message: &[u8], ) -> Result<Vec<u8>, CryptoError>
Sign with Ed25519 synchronously. Returns 64-byte raw signature.
Exists so key_ops::sign (the sync curve-agnostic dispatcher) can route
through a single cfg-swappable provider entry point without taking the
spawn-blocking cost the trait path pays. When FIPS/CNSA swap in, this
inherent method is the one line that changes.
Sourcepub fn ed25519_public_key(seed: &[u8; 32]) -> Result<[u8; 32], CryptoError>
pub fn ed25519_public_key(seed: &[u8; 32]) -> Result<[u8; 32], CryptoError>
Derive 32-byte Ed25519 public key from a raw seed, synchronously.
Sourcepub fn p256_verify(
pubkey: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), CryptoError>
pub fn p256_verify( pubkey: &[u8], message: &[u8], signature: &[u8], ) -> Result<(), CryptoError>
Verify a P-256 signature. Accepts 33-byte compressed or 65-byte uncompressed pubkey.
Sourcepub fn p256_public_key_from_seed(
seed: &[u8; 32],
) -> Result<Vec<u8>, CryptoError>
pub fn p256_public_key_from_seed( seed: &[u8; 32], ) -> Result<Vec<u8>, CryptoError>
Derive compressed public key from P-256 seed.
Trait Implementations§
Source§impl CryptoProvider for RingCryptoProvider
impl CryptoProvider for RingCryptoProvider
Source§fn verify_p256<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
pubkey: &'life1 [u8],
message: &'life2 [u8],
signature: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<(), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn verify_p256<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
pubkey: &'life1 [u8],
message: &'life2 [u8],
signature: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<(), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Source§fn verify_ed25519<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
pubkey: &'life1 [u8],
message: &'life2 [u8],
signature: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<(), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn verify_ed25519<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
pubkey: &'life1 [u8],
message: &'life2 [u8],
signature: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<(), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Source§fn sign_ed25519<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
seed: &'life1 SecureSeed,
message: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn sign_ed25519<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
seed: &'life1 SecureSeed,
message: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Source§fn generate_ed25519_keypair<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<(SecureSeed, [u8; 32]), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn generate_ed25519_keypair<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<(SecureSeed, [u8; 32]), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn ed25519_public_key_from_seed<'life0, 'life1, 'async_trait>(
&'life0 self,
seed: &'life1 SecureSeed,
) -> Pin<Box<dyn Future<Output = Result<[u8; 32], CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn ed25519_public_key_from_seed<'life0, 'life1, 'async_trait>(
&'life0 self,
seed: &'life1 SecureSeed,
) -> Pin<Box<dyn Future<Output = Result<[u8; 32], CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn sign_p256<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
seed: &'life1 SecureSeed,
message: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn sign_p256<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
seed: &'life1 SecureSeed,
message: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Source§fn generate_p256_keypair<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<(SecureSeed, Vec<u8>), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn generate_p256_keypair<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<(SecureSeed, Vec<u8>), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn p256_public_key_from_seed<'life0, 'life1, 'async_trait>(
&'life0 self,
seed: &'life1 SecureSeed,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn p256_public_key_from_seed<'life0, 'life1, 'async_trait>(
&'life0 self,
seed: &'life1 SecureSeed,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn aead_encrypt<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
key: &'life1 [u8; 32],
nonce: &'life2 [u8; 12],
aad: &'life3 [u8],
plaintext: &'life4 [u8],
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
fn aead_encrypt<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
key: &'life1 [u8; 32],
nonce: &'life2 [u8; 12],
aad: &'life3 [u8],
plaintext: &'life4 [u8],
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
plaintext under a 256-bit symmetric key with a 96-bit
nonce and Additional Authenticated Data (AAD). Output is
ciphertext || tag (tag is 16 bytes for both ChaCha20-Poly1305 and
AES-256-GCM). Read moreSource§fn aead_decrypt<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
key: &'life1 [u8; 32],
nonce: &'life2 [u8; 12],
aad: &'life3 [u8],
ciphertext: &'life4 [u8],
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
fn aead_decrypt<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
key: &'life1 [u8; 32],
nonce: &'life2 [u8; 12],
aad: &'life3 [u8],
ciphertext: &'life4 [u8],
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
ciphertext (ct || tag) under a 256-bit symmetric key,
96-bit nonce, and matching AAD. Returns the plaintext on success;
InvalidSignature on tag mismatch. Read moreSource§fn hkdf_sha256_expand<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
ikm: &'life1 [u8],
salt: &'life2 [u8],
info: &'life3 [u8],
out_len: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn hkdf_sha256_expand<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
ikm: &'life1 [u8],
salt: &'life2 [u8],
info: &'life3 [u8],
out_len: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Source§fn hkdf_sha384_expand<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
ikm: &'life1 [u8],
salt: &'life2 [u8],
info: &'life3 [u8],
out_len: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn hkdf_sha384_expand<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
ikm: &'life1 [u8],
salt: &'life2 [u8],
info: &'life3 [u8],
out_len: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
hkdf_sha256_expand] but with SHA-384 as the underlying hash. CNSA 2.0
requires SHA-384 for NSS workloads; default builds may return
CryptoError::UnsupportedTarget if SHA-384 is not available. Read moreSource§fn hmac_sha256_compute<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
msg: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = Result<[u8; 32], CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn hmac_sha256_compute<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
msg: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = Result<[u8; 32], CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Source§fn hmac_sha256_verify<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
msg: &'life2 [u8],
tag: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<(), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn hmac_sha256_verify<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
msg: &'life2 [u8],
tag: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<(), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Source§fn hmac_sha384_compute<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
msg: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = Result<[u8; 48], CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn hmac_sha384_compute<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
msg: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = Result<[u8; 48], CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
msg under key. Returns a 48-byte tag.
CNSA counterpart of [hmac_sha256_compute].Source§fn hmac_sha384_verify<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
msg: &'life2 [u8],
tag: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<(), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn hmac_sha384_verify<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
msg: &'life2 [u8],
tag: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<(), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
tag over msg under key, constant-time.
CNSA counterpart of [hmac_sha256_verify].Source§fn sign_typed<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
seed: &'life1 TypedSeed,
message: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn sign_typed<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
seed: &'life1 TypedSeed,
message: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
seed.curve(); the caller never sees a curve-specific method. Read moreSource§fn verify_typed<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
curve: CurveType,
pubkey: &'life1 [u8],
message: &'life2 [u8],
signature: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<(), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn verify_typed<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
curve: CurveType,
pubkey: &'life1 [u8],
message: &'life2 [u8],
signature: &'life3 [u8],
) -> Pin<Box<dyn Future<Output = Result<(), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Source§fn generate_typed_keypair<'life0, 'async_trait>(
&'life0 self,
curve: CurveType,
) -> Pin<Box<dyn Future<Output = Result<(TypedSeed, Vec<u8>), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn generate_typed_keypair<'life0, 'async_trait>(
&'life0 self,
curve: CurveType,
) -> Pin<Box<dyn Future<Output = Result<(TypedSeed, Vec<u8>), CryptoError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
crate::key_ops::TypedSeed plus raw public-key bytes. Read more