Skip to content

Commit f440ffc

Browse files
committed
Centralize dependency on Rng instance
Use tink_core::subtle::random::rng() to return an instance of the tink_core::subtle::random::Generator trait, which is just a combination of rand::RngCore and rand::CryptoRng. Use this rng() instance throughout the code. Drop a couple of direct dependencies on rand which were not needed.
1 parent 95606bd commit f440ffc

File tree

11 files changed

+41
-24
lines changed

11 files changed

+41
-24
lines changed

Cargo.lock

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

aead/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ aes-gcm = "^0.9.2"
1919
aes-gcm-siv = "^0.10"
2020
chacha20poly1305 = "^0.9"
2121
generic-array = "^0.14.4"
22-
rand = "^0.7"
2322
tink-core = "^0.2"
2423
tink-mac = "^0.2"
2524
tink-proto = "^0.2"

core/src/keyset/manager.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ impl Manager {
209209

210210
/// Generate a key id that has not been used by any key in the [`Keyset`](tink_proto::Keyset).
211211
fn new_key_id(&self) -> KeyId {
212-
let mut rng = rand::thread_rng();
212+
let mut rng = crate::subtle::random::rng();
213213

214214
loop {
215215
let ret = rng.gen::<u32>();

core/src/subtle/random.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,32 @@
1616

1717
//! Utilities for random data.
1818
19-
use rand::{thread_rng, Rng};
19+
/// Re-export the particular version of the `rand` crate whose types appear in the API.
20+
pub use rand;
21+
22+
use rand::Rng;
23+
24+
/// Trait that encapsulates the required traits that a random number generator instance must
25+
/// implement.
26+
pub trait Generator: rand::RngCore + rand::CryptoRng {}
27+
28+
/// Blanket implementation: any type that is a [`rand::CryptoRng`] is automatically
29+
/// suitable as a Tink [`Generator`].
30+
impl<T> Generator for T where T: rand::RngCore + rand::CryptoRng {}
31+
32+
/// Return a random number generator suitable for cryptographic operation.
33+
pub fn rng() -> Box<dyn Generator> {
34+
Box::new(rand::thread_rng())
35+
}
2036

2137
/// Return a vector of the given `size` filled with random bytes.
2238
pub fn get_random_bytes(size: usize) -> Vec<u8> {
2339
let mut data = vec![0u8; size];
24-
thread_rng().fill(&mut data[..]);
40+
rng().fill(&mut data[..]);
2541
data
2642
}
2743

2844
/// Randomly generate an unsigned 32-bit integer.
2945
pub fn get_random_uint32() -> u32 {
30-
thread_rng().gen()
46+
rng().gen()
3147
}

signature/src/ed25519_signer_key_manager.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl tink_core::registry::KeyManager for Ed25519SignerKeyManager {
4747
}
4848

4949
fn new_key(&self, _serialized_key_format: &[u8]) -> Result<Vec<u8>, TinkError> {
50-
let mut csprng = rand::rngs::OsRng {};
50+
let mut csprng = tink_core::subtle::random::rng();
5151
let keypair = ed25519_dalek::Keypair::generate(&mut csprng);
5252

5353
let public_proto = tink_proto::Ed25519PublicKey {

streaming/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ categories = ["cryptography"]
1515
aes = { version = "^0.7.4", features = ["ctr"] }
1616
# Need the `std` feature for Error type conversion
1717
aes-gcm = { version = "^0.9.2", features = ["std"] }
18-
rand = "^0.7"
1918
tink-core = "^0.2"
2019
tink-mac = "^0.2"
2120
tink-proto = "^0.2"

tests/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ pub fn get_ecdsa_params(
394394
/// Create an [`Ed25519PrivateKey`](tink_proto::Ed25519PrivateKey) with randomly generated key
395395
/// material.
396396
pub fn new_ed25519_private_key() -> tink_proto::Ed25519PrivateKey {
397-
let mut csprng = rand::thread_rng();
397+
let mut csprng = tink_core::subtle::random::rng();
398398
let keypair = ed25519_dalek::Keypair::generate(&mut csprng);
399399

400400
let public_proto = tink_proto::Ed25519PublicKey {

tests/tests/aead/subtle/chacha20poly1305_test.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
////////////////////////////////////////////////////////////////////////////////
1616

1717
use super::{chacha20poly1305_vectors::*, wycheproof::*};
18-
use rand::{thread_rng, Rng};
1918
use std::collections::HashSet;
2019
use tink_aead::subtle;
21-
use tink_core::{subtle::random::get_random_bytes, Aead};
20+
use tink_core::{
21+
subtle::random::{get_random_bytes, rand::Rng},
22+
Aead,
23+
};
2224
use tink_tests::WycheproofResult;
2325

2426
#[test]
@@ -172,7 +174,7 @@ fn test_cha_cha20_poly1305_modify_ciphertext() {
172174
.unwrap_or_else(|e| panic!("#{}: encrypt failed: {:?}", i, e));
173175

174176
if !aad.is_empty() {
175-
let alter_aad_idx = thread_rng().gen_range(0, aad.len());
177+
let alter_aad_idx = tink_core::subtle::random::rng().gen_range(0, aad.len());
176178
aad[alter_aad_idx] ^= 0x80;
177179
assert!(
178180
ca.decrypt(&ct, &aad).is_err(),
@@ -182,7 +184,7 @@ fn test_cha_cha20_poly1305_modify_ciphertext() {
182184
aad[alter_aad_idx] ^= 0x80;
183185
}
184186

185-
let alter_ct_idx = thread_rng().gen_range(0, ct.len());
187+
let alter_ct_idx = tink_core::subtle::random::rng().gen_range(0, ct.len());
186188
ct[alter_ct_idx] ^= 0x80;
187189
assert!(
188190
ca.decrypt(&ct, &aad).is_err(),

tests/tests/aead/subtle/xchacha20poly1305_test.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
////////////////////////////////////////////////////////////////////////////////
1616

1717
use super::{wycheproof::*, xchacha20poly1305_vectors::*};
18-
use rand::{thread_rng, Rng};
1918
use std::collections::HashSet;
2019
use tink_aead::subtle;
21-
use tink_core::{subtle::random::get_random_bytes, Aead};
20+
use tink_core::{
21+
subtle::random::{get_random_bytes, rand::Rng},
22+
Aead,
23+
};
2224
use tink_tests::WycheproofResult;
2325

2426
#[test]
@@ -173,7 +175,7 @@ fn test_x_cha_cha20_poly1305_modify_ciphertext() {
173175
.unwrap_or_else(|e| panic!("#{}: encrypt failed: {:?}", i, e));
174176

175177
if !aad.is_empty() {
176-
let alter_aad_idx = thread_rng().gen_range(0, aad.len());
178+
let alter_aad_idx = tink_core::subtle::random::rng().gen_range(0, aad.len());
177179
aad[alter_aad_idx] ^= 0x80;
178180
assert!(
179181
ca.decrypt(&ct, &aad).is_err(),
@@ -183,7 +185,7 @@ fn test_x_cha_cha20_poly1305_modify_ciphertext() {
183185
aad[alter_aad_idx] ^= 0x80;
184186
}
185187

186-
let alter_ct_idx = thread_rng().gen_range(0, ct.len());
188+
let alter_ct_idx = tink_core::subtle::random::rng().gen_range(0, ct.len());
187189
ct[alter_ct_idx] ^= 0x80;
188190
assert!(
189191
ca.decrypt(&ct, &aad).is_err(),

tests/tests/signature/subtle/ed25519_signer_verifier_test.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use tink_tests::WycheproofResult;
2323
#[test]
2424
fn test_ed25519_deterministic() {
2525
let data = get_random_bytes(20);
26-
let mut csprng = rand::thread_rng();
26+
let mut csprng = tink_core::subtle::random::rng();
2727
let keypair = Keypair::generate(&mut csprng);
2828

2929
// Use the private key and public key directly to create new instances
@@ -46,7 +46,7 @@ fn test_ed25519_deterministic() {
4646
#[test]
4747
fn test_ed25519_verify_modified_signature() {
4848
let data = get_random_bytes(20);
49-
let mut csprng = rand::thread_rng();
49+
let mut csprng = tink_core::subtle::random::rng();
5050
let keypair = Keypair::generate(&mut csprng);
5151

5252
// Use the private key and public key directly to create new instances
@@ -73,7 +73,7 @@ fn test_ed25519_verify_modified_signature() {
7373
#[test]
7474
fn test_ed25519_verify_truncated_signature() {
7575
let data = get_random_bytes(20);
76-
let mut csprng = rand::thread_rng();
76+
let mut csprng = tink_core::subtle::random::rng();
7777
let keypair = Keypair::generate(&mut csprng);
7878

7979
// Use the private key and public key directly to create new instances
@@ -89,7 +89,7 @@ fn test_ed25519_verify_truncated_signature() {
8989
#[test]
9090
fn test_ed25519_verify_modified_message() {
9191
let mut data = get_random_bytes(20);
92-
let mut csprng = rand::thread_rng();
92+
let mut csprng = tink_core::subtle::random::rng();
9393
let keypair = Keypair::generate(&mut csprng);
9494

9595
// Use the private key and public key directly to create new instances
@@ -114,7 +114,7 @@ fn test_ed25519_verify_modified_message() {
114114
}
115115
#[test]
116116
fn test_ed25519_sign_verify() {
117-
let mut csprng = rand::thread_rng();
117+
let mut csprng = tink_core::subtle::random::rng();
118118
let keypair = Keypair::generate(&mut csprng);
119119
let seed = keypair.secret.as_bytes().to_vec();
120120

tests/tests/streaming/integration_test.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ impl std::io::Read for PartialReader {
174174
// when more data is available. This is valid for Rust's `std::io::Read`, but
175175
// would not be valid for an `io::Writer` in Go.
176176
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
177-
if rand::thread_rng().gen_range(0, 3) == 0 {
177+
let mut csprng = tink_core::subtle::random::rng();
178+
if csprng.gen_range(0, 3) == 0 {
178179
// Randomly pretend to have been interrupted.
179180
return Err(std::io::Error::new(
180181
std::io::ErrorKind::Interrupted,

0 commit comments

Comments
 (0)