Files
opaque-vx/src/slow_hash.rs
T

44 lines
1.3 KiB
Rust
Raw Normal View History

2020-06-08 21:02:01 -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.
//! Trait specifying a slow hashing function
2020-06-08 21:02:01 -07:00
use crate::errors::InternalPakeError;
2020-07-27 15:25:04 -07:00
use crate::hash::Hash;
use digest::Digest;
use generic_array::GenericArray;
2020-06-08 21:02:01 -07:00
/// Used for the slow hashing function in OPAQUE
2020-07-27 15:25:04 -07:00
pub trait SlowHash<D: Hash> {
/// Computes the slow hashing function
2020-07-27 15:25:04 -07:00
fn hash(
input: GenericArray<u8, <D as Digest>::OutputSize>,
) -> Result<Vec<u8>, InternalPakeError>;
2020-06-08 21:02:01 -07:00
}
/// A no-op hash which simply returns its input
2020-06-08 21:02:01 -07:00
pub struct NoOpHash;
2020-07-27 15:25:04 -07:00
impl<D: Hash> SlowHash<D> for NoOpHash {
fn hash(
input: GenericArray<u8, <D as Digest>::OutputSize>,
) -> Result<Vec<u8>, InternalPakeError> {
2020-06-08 21:02:01 -07:00
Ok(input.to_vec())
}
}
2020-06-11 14:56:34 -07:00
#[cfg(feature = "slow-hash")]
2020-07-27 15:25:04 -07:00
impl<D: Hash> SlowHash<D> for scrypt::ScryptParams {
fn hash(
input: GenericArray<u8, <D as Digest>::OutputSize>,
) -> Result<Vec<u8>, InternalPakeError> {
2020-06-11 14:56:34 -07:00
let params = scrypt::ScryptParams::new(15, 8, 1).unwrap();
2020-07-27 15:25:04 -07:00
let mut output = [0u8; <D as Digest>::OutputSize::to_usize()];
2020-06-11 14:56:34 -07:00
scrypt::scrypt(&input, &[], &params, &mut output)
.map_err(|_| InternalPakeError::SlowHashError)?;
2020-06-08 21:02:01 -07:00
Ok(output.to_vec())
}
}