Skip to content

Commit 6c9562d

Browse files
authored
ssh-key: fix getrandom feature (#539)
It was temporarily disabled in #417 to simplify the `rand_core` v0.10 upgrade.
1 parent 1f9e122 commit 6c9562d

6 files changed

Lines changed: 45 additions & 41 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ssh-key/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ sha1 = { version = "0.11", optional = true, default-features = false, features =
5454
[dev-dependencies]
5555
hex-literal = "1"
5656
chacha20 = { version = "0.10", features = ["rng"] }
57+
getrandom = { version = "0.4", features = ["sys_rng"] }
5758

5859
[features]
5960
default = ["ecdsa", "rand_core", "std"]
@@ -71,10 +72,12 @@ encryption = [
7172
"cipher/chacha20poly1305",
7273
"rand_core"
7374
]
75+
getrandom = ["cipher/getrandom", "rand_core"]
7476
p256 = ["dep:p256", "ecdsa"]
7577
p384 = ["dep:p384", "ecdsa"]
7678
p521 = ["dep:p521", "ecdsa"]
7779
ppk = ["dep:hex", "alloc", "cipher/aes", "dep:hmac", "dep:argon2", "dep:sha1"]
80+
rand_core = ["dep:rand_core", "cipher/rand_core"]
7881
rsa = ["dep:rsa", "alloc", "encoding/bigint", "rand_core"]
7982
sha1 = ["dep:sha1"]
8083
tdes = ["cipher/tdes", "encryption"]

ssh-key/src/certificate/builder.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,17 @@ use crate::{Error, PrivateKey};
4040
doc = " ```ignore"
4141
)]
4242
/// # fn main() -> Result<(), ssh_key::Error> {
43-
/// use ssh_key::{Algorithm, PrivateKey, certificate, rand_core::{TryRngCore, OsRng}};
43+
/// use ssh_key::{Algorithm, PrivateKey, certificate, getrandom::SysRng, rand_core::UnwrapErr};
4444
/// use std::time::{SystemTime, UNIX_EPOCH};
4545
///
4646
/// // Generate the certificate authority's private key
47-
/// let ca_key = PrivateKey::random(&mut OsRng.unwrap_err(), Algorithm::Ed25519)?;
47+
/// let mut rng = UnwrapErr(SysRng);
48+
/// let ca_key = PrivateKey::random(&mut rng, Algorithm::Ed25519)?;
4849
///
4950
/// // Generate a "subject" key to be signed by the certificate authority.
5051
/// // Normally a user or host would do this locally and give the certificate
5152
/// // authority the public key.
52-
/// let subject_private_key = PrivateKey::random(&mut OsRng.unwrap_err(), Algorithm::Ed25519)?;
53+
/// let subject_private_key = PrivateKey::random(&mut rng, Algorithm::Ed25519)?;
5354
/// let subject_public_key = subject_private_key.public_key();
5455
///
5556
/// // Create certificate validity window
@@ -58,7 +59,7 @@ use crate::{Error, PrivateKey};
5859
///
5960
/// // Initialize certificate builder
6061
/// let mut cert_builder = certificate::Builder::new_with_random_nonce(
61-
/// &mut OsRng.unwrap_err(),
62+
/// &mut rng,
6263
/// subject_public_key,
6364
/// valid_after,
6465
/// valid_before,

ssh-key/src/lib.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/6ee8e381/logo.svg",
66
html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/6ee8e381/logo.svg"
77
)]
8-
#![allow(unexpected_cfgs, reason = "TODO fix getrandom feature")]
98

109
//! ## Usage
1110
//!
@@ -160,6 +159,14 @@ pub use cipher::{self, Cipher};
160159
pub use encoding::{self, pem::LineEnding};
161160
pub use sha2;
162161

162+
#[cfg(feature = "std")]
163+
pub use crate::dot_ssh::DotSsh;
164+
#[cfg(feature = "getrandom")]
165+
pub use cipher::cipher::common::getrandom;
166+
#[cfg(feature = "rand_core")]
167+
pub use rand_core;
168+
#[cfg(feature = "ecdsa")]
169+
pub use sec1;
163170
#[cfg(feature = "alloc")]
164171
pub use {
165172
crate::{
@@ -172,12 +179,3 @@ pub use {
172179
},
173180
encoding::Mpint,
174181
};
175-
176-
#[cfg(feature = "ecdsa")]
177-
pub use sec1;
178-
179-
#[cfg(feature = "rand_core")]
180-
pub use rand_core;
181-
182-
#[cfg(feature = "std")]
183-
pub use crate::dot_ssh::DotSsh;

ssh-key/src/private.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,16 @@
5555
doc = " ```ignore"
5656
)]
5757
//! # fn main() -> Result<(), ssh_key::Error> {
58-
//! use ssh_key::{Algorithm, PrivateKey, rand_core::{OsRng, TryRngCore}};
58+
//! use ssh_key::{Algorithm, PrivateKey, getrandom::SysRng, rand_core::UnwrapErr};
5959
//!
6060
//! // Generate a random key
61-
//! let unencrypted_key = PrivateKey::random(&mut OsRng.unwrap_err(), Algorithm::Ed25519)?;
61+
//! let mut rng = UnwrapErr(SysRng);
62+
//! let unencrypted_key = PrivateKey::random(&mut rng, Algorithm::Ed25519)?;
6263
//!
6364
//! // WARNING: don't hardcode passwords, and this one's bad anyway
6465
//! let password = "hunter42";
6566
//!
66-
//! let encrypted_key = unencrypted_key.encrypt(&mut OsRng, password)?;
67+
//! let encrypted_key = unencrypted_key.encrypt(&mut SysRng, password)?;
6768
//! assert!(encrypted_key.is_encrypted());
6869
//! # Ok(())
6970
//! # }
@@ -84,9 +85,10 @@
8485
doc = " ```ignore"
8586
)]
8687
//! # fn main() -> Result<(), ssh_key::Error> {
87-
//! use ssh_key::{Algorithm, PrivateKey, rand_core::{OsRng, TryRngCore}};
88+
//! use ssh_key::{Algorithm, PrivateKey, getrandom::SysRng, rand_core::UnwrapErr};
8889
//!
89-
//! let private_key = PrivateKey::random(&mut OsRng.unwrap_err(), Algorithm::Ed25519)?;
90+
//! let mut rng = UnwrapErr(SysRng);
91+
//! let private_key = PrivateKey::random(&mut rng, Algorithm::Ed25519)?;
9092
//! # Ok(())
9193
//! # }
9294
//! ```

ssh-key/tests/encrypted_private_key.rs

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
//! Encrypted SSH private key tests.
22
33
#![cfg(feature = "alloc")]
4-
// TODO(tarcieri): fix `getrandom` feature
5-
#![allow(unexpected_cfgs)]
64

75
use hex_literal::hex;
86
use ssh_key::{Algorithm, Cipher, Kdf, KdfAlg, PrivateKey};
@@ -297,11 +295,12 @@ fn encode_openssh_aes256_gcm() {
297295
#[cfg(all(feature = "encryption", feature = "getrandom"))]
298296
#[test]
299297
fn encrypt_openssh_aes128_cbc() {
300-
use rand_core::{OsRng, TryRngCore};
298+
use getrandom::{SysRng, rand_core::UnwrapErr};
301299

300+
let mut rng = UnwrapErr(SysRng);
302301
let key_dec = PrivateKey::from_openssh(OPENSSH_ED25519_EXAMPLE).unwrap();
303302
let key_enc = key_dec
304-
.encrypt_with_cipher(&mut OsRng.unwrap_err(), Cipher::Aes128Cbc, PASSWORD)
303+
.encrypt_with_cipher(&mut rng, Cipher::Aes128Cbc, PASSWORD)
305304
.unwrap();
306305

307306
// Ensure encrypted key round trips through encoder/decoder
@@ -317,11 +316,11 @@ fn encrypt_openssh_aes128_cbc() {
317316
#[cfg(all(feature = "encryption", feature = "getrandom"))]
318317
#[test]
319318
fn encrypt_openssh_aes192_cbc() {
320-
use rand_core::OsRng;
319+
use getrandom::SysRng;
321320

322321
let key_dec = PrivateKey::from_openssh(OPENSSH_ED25519_EXAMPLE).unwrap();
323322
let key_enc = key_dec
324-
.encrypt_with_cipher(&mut OsRng, Cipher::Aes192Cbc, PASSWORD)
323+
.encrypt_with_cipher(&mut SysRng, Cipher::Aes192Cbc, PASSWORD)
325324
.unwrap();
326325

327326
// Ensure encrypted key round trips through encoder/decoder
@@ -337,11 +336,11 @@ fn encrypt_openssh_aes192_cbc() {
337336
#[cfg(all(feature = "encryption", feature = "getrandom"))]
338337
#[test]
339338
fn encrypt_openssh_aes256_cbc() {
340-
use rand_core::OsRng;
339+
use getrandom::SysRng;
341340

342341
let key_dec = PrivateKey::from_openssh(OPENSSH_ED25519_EXAMPLE).unwrap();
343342
let key_enc = key_dec
344-
.encrypt_with_cipher(&mut OsRng, Cipher::Aes256Cbc, PASSWORD)
343+
.encrypt_with_cipher(&mut SysRng, Cipher::Aes256Cbc, PASSWORD)
345344
.unwrap();
346345

347346
// Ensure encrypted key round trips through encoder/decoder
@@ -357,11 +356,11 @@ fn encrypt_openssh_aes256_cbc() {
357356
#[cfg(all(feature = "encryption", feature = "getrandom"))]
358357
#[test]
359358
fn encrypt_openssh_aes128_ctr() {
360-
use rand_core::OsRng;
359+
use getrandom::SysRng;
361360

362361
let key_dec = PrivateKey::from_openssh(OPENSSH_ED25519_EXAMPLE).unwrap();
363362
let key_enc = key_dec
364-
.encrypt_with_cipher(&mut OsRng, Cipher::Aes128Ctr, PASSWORD)
363+
.encrypt_with_cipher(&mut SysRng, Cipher::Aes128Ctr, PASSWORD)
365364
.unwrap();
366365

367366
// Ensure encrypted key round trips through encoder/decoder
@@ -377,11 +376,11 @@ fn encrypt_openssh_aes128_ctr() {
377376
#[cfg(all(feature = "encryption", feature = "getrandom"))]
378377
#[test]
379378
fn encrypt_openssh_aes192_ctr() {
380-
use rand_core::OsRng;
379+
use getrandom::SysRng;
381380

382381
let key_dec = PrivateKey::from_openssh(OPENSSH_ED25519_EXAMPLE).unwrap();
383382
let key_enc = key_dec
384-
.encrypt_with_cipher(&mut OsRng, Cipher::Aes192Ctr, PASSWORD)
383+
.encrypt_with_cipher(&mut SysRng, Cipher::Aes192Ctr, PASSWORD)
385384
.unwrap();
386385

387386
// Ensure encrypted key round trips through encoder/decoder
@@ -397,10 +396,10 @@ fn encrypt_openssh_aes192_ctr() {
397396
#[cfg(all(feature = "encryption", feature = "getrandom"))]
398397
#[test]
399398
fn encrypt_openssh_aes256_ctr() {
400-
use rand_core::OsRng;
399+
use getrandom::SysRng;
401400

402401
let key_dec = PrivateKey::from_openssh(OPENSSH_ED25519_EXAMPLE).unwrap();
403-
let key_enc = key_dec.encrypt(&mut OsRng, PASSWORD).unwrap();
402+
let key_enc = key_dec.encrypt(&mut SysRng, PASSWORD).unwrap();
404403

405404
// Ensure encrypted key round trips through encoder/decoder
406405
let key_enc_str = key_enc.to_openssh(Default::default()).unwrap();
@@ -415,12 +414,12 @@ fn encrypt_openssh_aes256_ctr() {
415414
#[cfg(all(feature = "encryption", feature = "getrandom"))]
416415
#[test]
417416
fn encrypt_openssh_aes128_gcm() {
418-
use rand_core::OsRng;
417+
use getrandom::SysRng;
419418

420419
let key_dec = PrivateKey::from_openssh(OPENSSH_ED25519_EXAMPLE).unwrap();
421420

422421
let key_enc = key_dec
423-
.encrypt_with_cipher(&mut OsRng, Cipher::Aes128Gcm, PASSWORD)
422+
.encrypt_with_cipher(&mut SysRng, Cipher::Aes128Gcm, PASSWORD)
424423
.unwrap();
425424

426425
// Ensure encrypted key round trips through encoder/decoder
@@ -436,12 +435,12 @@ fn encrypt_openssh_aes128_gcm() {
436435
#[cfg(all(feature = "encryption", feature = "getrandom"))]
437436
#[test]
438437
fn encrypt_openssh_aes256_gcm() {
439-
use rand_core::OsRng;
438+
use getrandom::SysRng;
440439

441440
let key_dec = PrivateKey::from_openssh(OPENSSH_ED25519_EXAMPLE).unwrap();
442441

443442
let key_enc = key_dec
444-
.encrypt_with_cipher(&mut OsRng, Cipher::Aes256Gcm, PASSWORD)
443+
.encrypt_with_cipher(&mut SysRng, Cipher::Aes256Gcm, PASSWORD)
445444
.unwrap();
446445

447446
// Ensure encrypted key round trips through encoder/decoder
@@ -457,12 +456,12 @@ fn encrypt_openssh_aes256_gcm() {
457456
#[cfg(all(feature = "encryption", feature = "getrandom"))]
458457
#[test]
459458
fn encrypt_openssh_chacha20_poly1305() {
460-
use rand_core::OsRng;
459+
use getrandom::SysRng;
461460

462461
let key_dec = PrivateKey::from_openssh(OPENSSH_ED25519_EXAMPLE).unwrap();
463462

464463
let key_enc = key_dec
465-
.encrypt_with_cipher(&mut OsRng, Cipher::ChaCha20Poly1305, PASSWORD)
464+
.encrypt_with_cipher(&mut SysRng, Cipher::ChaCha20Poly1305, PASSWORD)
466465
.unwrap();
467466

468467
// Ensure encrypted key round trips through encoder/decoder
@@ -478,12 +477,12 @@ fn encrypt_openssh_chacha20_poly1305() {
478477
#[cfg(all(feature = "tdes", feature = "getrandom"))]
479478
#[test]
480479
fn encrypt_openssh_3des() {
481-
use rand_core::OsRng;
480+
use getrandom::SysRng;
482481

483482
let key_dec = PrivateKey::from_openssh(OPENSSH_ED25519_EXAMPLE).unwrap();
484483

485484
let key_enc = key_dec
486-
.encrypt_with_cipher(&mut OsRng, Cipher::TdesCbc, PASSWORD)
485+
.encrypt_with_cipher(&mut SysRng, Cipher::TdesCbc, PASSWORD)
487486
.unwrap();
488487

489488
// Ensure encrypted key round trips through encoder/decoder

0 commit comments

Comments
 (0)