rustls_graviola/lib.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
//! <h1 align="center">Graviola</h1>
//! <img width="40%" align="right" src="https://raw.githubusercontent.com/ctz/graviola/main/admin/picture.png">
//!
//! This crate provides an integration between [rustls](https://github.com/rustls/rustls) and [Graviola](https://github.com/ctz/graviola/).
//!
//! Use it like:
//!
//! ```rust
//! rustls_graviola::default_provider()
//! .install_default()
//! .unwrap();
//! ```
//!
//! And then use rustls as normal.
use rustls::crypto::CryptoProvider;
mod aead;
mod hash;
mod hmac;
mod sign;
mod verify;
/// Supported key exchange algorithms.
pub mod kx;
/// Supported cipher suites.
pub mod suites;
/// This is a rustls [`CryptoProvider`] using cryptography from Graviola.
///
/// This provides the same algorithms as the rustls *ring*-based
/// provider, which are interoperable and safe defaults for modern TLS.
pub fn default_provider() -> CryptoProvider {
CryptoProvider {
cipher_suites: suites::ALL_CIPHER_SUITES.to_vec(),
kx_groups: kx::ALL_KX_GROUPS.to_vec(),
signature_verification_algorithms: verify::ALGORITHMS,
secure_random: &RngProvider,
key_provider: &sign::Provider,
}
}
#[derive(Debug)]
struct RngProvider;
impl rustls::crypto::SecureRandom for RngProvider {
fn fill(&self, bytes: &mut [u8]) -> Result<(), rustls::crypto::GetRandomFailed> {
use graviola::rng::{RandomSource, SystemRandom};
SystemRandom
.fill(bytes)
.map_err(|_| rustls::crypto::GetRandomFailed)
}
}