2020-07-22 11:58:00 -04: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.
|
|
|
|
|
|
|
|
|
|
//! Defines the GroupWithMapToCurve trait to specify how to map a password to a
|
|
|
|
|
//! curve point
|
|
|
|
|
|
2020-07-03 18:28:35 -04:00
|
|
|
use crate::group::Group;
|
|
|
|
|
use curve25519_dalek::{edwards::EdwardsPoint, ristretto::RistrettoPoint};
|
|
|
|
|
|
|
|
|
|
use generic_array::GenericArray;
|
|
|
|
|
use hkdf::Hkdf;
|
|
|
|
|
|
2020-07-22 11:58:00 -04:00
|
|
|
/// A subtrait of Group specifying how to has a password into a point
|
2020-07-03 18:28:35 -04:00
|
|
|
pub trait GroupWithMapToCurve: Group {
|
2020-07-22 11:58:00 -04:00
|
|
|
/// transforms a password and optional pepper into a curve point
|
2020-07-03 18:28:35 -04:00
|
|
|
fn map_to_curve(password: &[u8], pepper: Option<&[u8]>) -> Self;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl GroupWithMapToCurve for RistrettoPoint {
|
|
|
|
|
fn map_to_curve(password: &[u8], pepper: Option<&[u8]>) -> Self {
|
|
|
|
|
let (hashed_input, _) = Hkdf::<sha2::Sha512>::extract(pepper, password);
|
|
|
|
|
<Self as Group>::hash_to_curve(GenericArray::from_slice(&hashed_input))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl GroupWithMapToCurve for EdwardsPoint {
|
|
|
|
|
fn map_to_curve(password: &[u8], pepper: Option<&[u8]>) -> Self {
|
|
|
|
|
let (hashed_input, _) = Hkdf::<sha2::Sha256>::extract(pepper, password);
|
|
|
|
|
<Self as Group>::hash_to_curve(GenericArray::from_slice(&hashed_input))
|
|
|
|
|
}
|
|
|
|
|
}
|