aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Arcieri <bascule@gmail.com>2022-01-22 15:26:31 -0700
committerGitHub <noreply@github.com>2022-01-22 15:26:31 -0700
commit17292b56f52ceab154cb75239f690130df87e8a6 (patch)
tree8b118fdfe1d1c53eeb3aa32d02340ab7311f10ce
parente02188cfaed91927083cbecac9f878a6d8d71958 (diff)
downloadPAKEs-17292b56f52ceab154cb75239f690130df87e8a6.tar.xz
spake2: getrandom feature (#88)
Makes `getrandom` an optional on-by-default feature Adds CI for `thumbv7em-none-eabi` targets
-rw-r--r--.github/workflows/spake2.yml4
-rw-r--r--spake2/Cargo.toml13
-rw-r--r--spake2/src/lib.rs56
3 files changed, 58 insertions, 15 deletions
diff --git a/.github/workflows/spake2.yml b/.github/workflows/spake2.yml
index 6aaf076..34968fd 100644
--- a/.github/workflows/spake2.yml
+++ b/.github/workflows/spake2.yml
@@ -25,6 +25,7 @@ jobs:
- 1.56.0 # MSRV
- stable
target:
+ - thumbv7em-none-eabi
- wasm32-unknown-unknown
steps:
- uses: actions/checkout@v1
@@ -34,7 +35,7 @@ jobs:
toolchain: ${{ matrix.rust }}
target: ${{ matrix.target }}
override: true
- - run: cargo build --target ${{ matrix.target }} --release
+ - run: cargo build --target ${{ matrix.target }} --release --no-default-features
test:
runs-on: ubuntu-latest
@@ -51,3 +52,4 @@ jobs:
override: true
profile: minimal
- run: cargo test --release
+ - run: cargo test --release --all-features
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)
}