Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

spake2: getrandom feature #88

Merged
merged 1 commit into from
Jan 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/spake2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ jobs:
- 1.56.0 # MSRV
- stable
target:
- thumbv7em-none-eabi
- wasm32-unknown-unknown
steps:
- uses: actions/checkout@v1
Expand All @@ -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
Expand All @@ -51,3 +52,4 @@ jobs:
override: true
profile: minimal
- run: cargo test --release
- run: cargo test --release --all-features
13 changes: 9 additions & 4 deletions spake2/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,24 @@ 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"
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
56 changes: 46 additions & 10 deletions spake2/src/lib.rs
Original file line number Diff line number Diff line change
@@ -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)]

Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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)
}

Expand Down