aboutsummaryrefslogtreecommitdiff
path: root/spake2
diff options
context:
space:
mode:
Diffstat (limited to 'spake2')
-rw-r--r--spake2/Cargo.toml13
-rw-r--r--spake2/src/lib.rs56
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)
}