diff options
Diffstat (limited to 'spake2')
-rw-r--r-- | spake2/Cargo.toml | 13 | ||||
-rw-r--r-- | spake2/src/lib.rs | 56 |
2 files changed, 55 insertions, 14 deletions
diff --git a/spake2/Cargo.toml b/spake2/Cargo.toml index 0558737..5547cfa 100644 --- a/spake2/Cargo.toml +++ b/spake2/Cargo.toml @@ -16,9 +16,9 @@ rust-version = "1.56" [dependencies] curve25519-dalek = { version = "3", default-features = false, features = ["u64_backend"] } -rand_core = { version = "0.5", default-features = false, features = ["getrandom"] } -sha2 = "0.10" -hkdf = "0.12" +rand_core = { version = "0.5", default-features = false } +sha2 = { version = "0.10", default-features = false } +hkdf = { version = "0.12", default-features = false } [dev-dependencies] bencher = "0.1" @@ -26,9 +26,14 @@ hex = "0.4" num-bigint = "0.4" [features] -default = [] +default = ["getrandom"] +getrandom = ["rand_core/getrandom"] std = [] +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + [[bench]] name = "spake2" harness = false diff --git a/spake2/src/lib.rs b/spake2/src/lib.rs index 61f7973..8a8654a 100644 --- a/spake2/src/lib.rs +++ b/spake2/src/lib.rs @@ -1,6 +1,10 @@ #![no_std] -#![doc(html_logo_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo_small.png")] +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] +#![doc( + html_logo_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg", + html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg" +)] #![forbid(unsafe_code)] #![warn(rust_2018_idioms, unused_qualifications)] @@ -234,9 +238,12 @@ use curve25519_dalek::{ scalar::Scalar as c2_Scalar, }; use hkdf::Hkdf; -use rand_core::{CryptoRng, OsRng, RngCore}; +use rand_core::{CryptoRng, RngCore}; use sha2::{Digest, Sha256}; +#[cfg(feature = "getrandom")] +use rand_core::OsRng; + /* "newtype pattern": it's a Vec<u8>, but only used for a specific argument * type, to distinguish between ones that are meant as passwords, and ones * that are meant as identity strings */ @@ -641,21 +648,50 @@ impl<G: Group> SPAKE2<G> { ) } + #[cfg(feature = "getrandom")] + #[cfg_attr(docsrs, doc(cfg(feature = "getrandom")))] pub fn start_a(password: &Password, id_a: &Identity, id_b: &Identity) -> (SPAKE2<G>, Vec<u8>) { - let mut cspring = OsRng; - let xy_scalar: G::Scalar = G::random_scalar(&mut cspring); - Self::start_a_internal(password, id_a, id_b, xy_scalar) + Self::start_a_with_rng(password, id_a, id_b, OsRng) } + #[cfg(feature = "getrandom")] + #[cfg_attr(docsrs, doc(cfg(feature = "getrandom")))] pub fn start_b(password: &Password, id_a: &Identity, id_b: &Identity) -> (SPAKE2<G>, Vec<u8>) { - let mut cspring = OsRng; - let xy_scalar: G::Scalar = G::random_scalar(&mut cspring); - Self::start_b_internal(password, id_a, id_b, xy_scalar) + Self::start_b_with_rng(password, id_a, id_b, OsRng) } + #[cfg(feature = "getrandom")] + #[cfg_attr(docsrs, doc(cfg(feature = "getrandom")))] pub fn start_symmetric(password: &Password, id_s: &Identity) -> (SPAKE2<G>, Vec<u8>) { - let mut cspring = OsRng; - let xy_scalar: G::Scalar = G::random_scalar(&mut cspring); + Self::start_symmetric_with_rng(password, id_s, OsRng) + } + + pub fn start_a_with_rng( + password: &Password, + id_a: &Identity, + id_b: &Identity, + mut csprng: impl CryptoRng + RngCore, + ) -> (SPAKE2<G>, Vec<u8>) { + let xy_scalar: G::Scalar = G::random_scalar(&mut csprng); + Self::start_a_internal(password, id_a, id_b, xy_scalar) + } + + pub fn start_b_with_rng( + password: &Password, + id_a: &Identity, + id_b: &Identity, + mut csprng: impl CryptoRng + RngCore, + ) -> (SPAKE2<G>, Vec<u8>) { + let xy_scalar: G::Scalar = G::random_scalar(&mut csprng); + Self::start_b_internal(password, id_a, id_b, xy_scalar) + } + + pub fn start_symmetric_with_rng( + password: &Password, + id_s: &Identity, + mut csprng: impl CryptoRng + RngCore, + ) -> (SPAKE2<G>, Vec<u8>) { + let xy_scalar: G::Scalar = G::random_scalar(&mut csprng); Self::start_symmetric_internal(password, id_s, xy_scalar) } |