Skip to content

Commit

Permalink
test: introduce failing test for ecdh keygen
Browse files Browse the repository at this point in the history
  • Loading branch information
dignifiedquire committed Apr 2, 2020
1 parent 921a370 commit b7d5ee4
Showing 1 changed file with 31 additions and 9 deletions.
40 changes: 31 additions & 9 deletions src/composed/key/builder.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::time::Duration;

use chrono::{self, SubsecRound};
use rand::thread_rng;
use rand::{thread_rng, CryptoRng, Rng};
use smallvec::SmallVec;

use crate::composed::{KeyDetails, SecretKey, SecretSubkey};
Expand Down Expand Up @@ -134,8 +134,13 @@ impl SecretKeyParamsBuilder {

impl SecretKeyParams {
pub fn generate(self) -> Result<SecretKey> {
let mut rng = thread_rng();
self.generate_with_rng(&mut rng)
}

pub fn generate_with_rng<R: Rng + CryptoRng>(self, rng: &mut R) -> Result<SecretKey> {
let passphrase = self.passphrase;
let (public_params, secret_params) = self.key_type.generate(passphrase)?;
let (public_params, secret_params) = self.key_type.generate_with_rng(rng, passphrase)?;
let primary_key = packet::SecretKey {
details: packet::PublicKey {
packet_version: self.packet_version,
Expand Down Expand Up @@ -225,17 +230,24 @@ impl KeyType {
passphrase: Option<String>,
) -> Result<(PublicParams, types::SecretParams)> {
let mut rng = thread_rng();
self.generate_with_rng(&mut rng, passphrase)
}

pub fn generate_with_rng<R: Rng + CryptoRng>(
self,
rng: &mut R,
passphrase: Option<String>,
) -> Result<(PublicParams, types::SecretParams)> {
let (pub_params, plain) = match self {
KeyType::Rsa(bit_size) => rsa::generate_key(&mut rng, bit_size as usize)?,
KeyType::ECDH => ecdh::generate_key(&mut rng),
KeyType::EdDSA => eddsa::generate_key(&mut rng),
KeyType::Rsa(bit_size) => rsa::generate_key(rng, bit_size as usize)?,
KeyType::ECDH => ecdh::generate_key(rng),
KeyType::EdDSA => eddsa::generate_key(rng),
};

let secret = match passphrase {
Some(passphrase) => {
// TODO: make configurable
let s2k = types::StringToKey::new_default(&mut rng);
let s2k = types::StringToKey::new_default(rng);
let alg = SymmetricKeyAlgorithm::AES256;
// encrypted, sha1 checksum
let id = 254;
Expand All @@ -244,7 +256,7 @@ impl KeyType {
let version = types::KeyVersion::default();

types::SecretParams::Encrypted(plain.encrypt(
&mut rng,
rng,
&passphrase,
alg,
s2k,
Expand All @@ -266,6 +278,9 @@ mod tests {
use crate::composed::{Deserializable, SignedPublicKey, SignedSecretKey};
use crate::types::SecretKeyTrait;

use rand::SeedableRng;
use rand_chacha::ChaCha8Rng;

#[test]
#[ignore] // slow in debug mode
fn test_key_gen_rsa_2048() {
Expand Down Expand Up @@ -378,7 +393,14 @@ mod tests {
}

#[test]
fn test_key_gen_x25519() {
fn key_gen_x25519() {
let rng = &mut ChaCha8Rng::seed_from_u64(0);
for _ in 0..1_000_000 {
gen_x25519(rng);
}
}

fn gen_x25519<R: Rng + CryptoRng>(rng: &mut R) {
use pretty_env_logger;
let _ = pretty_env_logger::try_init();

Expand Down Expand Up @@ -416,7 +438,7 @@ mod tests {
.unwrap();

let key = key_params
.generate()
.generate_with_rng(rng)
.expect("failed to generate secret key");

let signed_key = key.sign(|| "".into()).expect("failed to sign key");
Expand Down

0 comments on commit b7d5ee4

Please sign in to comment.