2020-06-14 23:25:31 -07:00
|
|
|
// Copyright (c) Facebook, Inc. and its affiliates.
|
|
|
|
|
//
|
|
|
|
|
// This source code is licensed under the MIT license found in the
|
|
|
|
|
// LICENSE file in the root directory of this source tree.
|
2020-06-11 14:46:46 -07:00
|
|
|
|
2020-06-14 23:25:31 -07:00
|
|
|
//! Defines the CipherSuite trait to specify the underlying primitives for OPAQUE
|
|
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
|
errors::InternalPakeError,
|
2020-07-27 15:25:04 -07:00
|
|
|
hash::Hash,
|
2020-07-13 15:23:29 -07:00
|
|
|
key_exchange::traits::KeyExchange,
|
2020-06-14 23:25:31 -07:00
|
|
|
keypair::{Key, KeyPair},
|
2020-07-03 18:28:35 -04:00
|
|
|
map_to_curve::GroupWithMapToCurve,
|
2020-06-14 23:25:31 -07:00
|
|
|
slow_hash::SlowHash,
|
|
|
|
|
};
|
2020-07-03 18:28:35 -04:00
|
|
|
|
2020-06-14 23:25:31 -07:00
|
|
|
use rand_core::{CryptoRng, RngCore};
|
|
|
|
|
|
|
|
|
|
/// Configures the underlying primitives used in OPAQUE
|
2020-07-13 15:23:29 -07:00
|
|
|
/// * `Group`: a finite cyclic group along with a point representation, along
|
|
|
|
|
/// with an extension trait PasswordToCurve that allows some customization on
|
|
|
|
|
/// how to hash a password to a curve point. See `group::Group` and
|
|
|
|
|
/// `map_to_curve::GroupWithMapToCurve`.
|
|
|
|
|
/// * `KeyFormat`: a keypair type composed of public and private components
|
|
|
|
|
/// * `KeyExchange`: The key exchange protocol to use in the login step
|
2020-07-27 15:25:04 -07:00
|
|
|
/// * `Hash`: The main hashing function to use
|
|
|
|
|
/// * `SlowHash`: A slow hashing function, typically used for password hashing
|
2020-06-11 14:46:46 -07:00
|
|
|
pub trait CipherSuite {
|
2020-07-06 15:40:35 -04:00
|
|
|
/// A finite cyclic group along with a point representation along with
|
|
|
|
|
/// an extension trait PasswordToCurve that allows some customization on
|
|
|
|
|
/// how to hash a password to a curve point. See `group::Group` and
|
|
|
|
|
/// `map_to_curve::GroupWithMapToCurve`.
|
2020-07-03 18:28:35 -04:00
|
|
|
type Group: GroupWithMapToCurve;
|
2020-07-06 15:40:35 -04:00
|
|
|
/// A keypair type composed of public and private components
|
2020-06-14 23:25:31 -07:00
|
|
|
type KeyFormat: KeyPair<Repr = Key> + PartialEq;
|
2020-07-13 15:23:29 -07:00
|
|
|
/// A key exchange protocol
|
2020-09-19 19:16:35 -04:00
|
|
|
type KeyExchange: KeyExchange<Self::Hash, Self::KeyFormat>;
|
2020-07-27 15:25:04 -07:00
|
|
|
/// The main hash function use (for HKDF computations and hashing transcripts)
|
|
|
|
|
type Hash: Hash;
|
2020-07-06 15:40:35 -04:00
|
|
|
/// A slow hashing function, typically used for password hashing
|
2020-07-27 15:25:04 -07:00
|
|
|
type SlowHash: SlowHash<Self::Hash>;
|
2020-06-14 23:25:31 -07:00
|
|
|
/// Generating a random key pair given a cryptographic rng
|
|
|
|
|
fn generate_random_keypair<R: RngCore + CryptoRng>(
|
|
|
|
|
rng: &mut R,
|
|
|
|
|
) -> Result<Self::KeyFormat, InternalPakeError> {
|
|
|
|
|
Self::KeyFormat::generate_random(rng)
|
|
|
|
|
}
|
2020-06-11 14:46:46 -07:00
|
|
|
}
|