Skip to content

Commit eb3be45

Browse files
committed
Merge branch 'alex/crp-2023' into 'master'
chore(crypto): CRP-2023 implement instantiation of TempCryptoComponent with a custom vault RNG Implement instantiation of TempCryptoComponent with a custom vault RNG to allow for reproducible tests that require a (Temp)CryptoComponent. See merge request dfinity-lab/public/ic!12487
2 parents fd1001d + 8159fd6 commit eb3be45

File tree

9 files changed

+392
-112
lines changed

9 files changed

+392
-112
lines changed

Cargo.lock

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

rs/crypto/internal/crypto_service_provider/src/builder/mod.rs

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,73 @@
11
use super::*;
22

33
pub struct CspBuilder<V> {
4-
vault: Box<dyn FnOnce() -> V>,
4+
vault: Box<dyn FnOnce() -> Arc<V>>,
55
logger: ReplicaLogger,
66
metrics: Arc<CryptoMetrics>,
77
}
88

99
impl<V: CspVault + 'static> CspBuilder<V> {
10-
pub fn with_vault<W: CspVault + 'static>(self, vault: W) -> CspBuilder<W> {
10+
pub fn with_vault<I, W>(self, vault: I) -> CspBuilder<W>
11+
where
12+
I: VaultIntoArc<Item = W> + 'static,
13+
W: CspVault + 'static,
14+
{
1115
CspBuilder {
12-
vault: Box::new(|| vault),
16+
vault: Box::new(|| vault.into_arc()),
1317
logger: self.logger,
1418
metrics: self.metrics,
1519
}
1620
}
1721

1822
pub fn build(self) -> Csp {
1923
Csp {
20-
csp_vault: Arc::new((self.vault)()),
24+
csp_vault: (self.vault)(),
2125
logger: self.logger,
2226
metrics: self.metrics,
2327
}
2428
}
2529
}
2630

2731
impl Csp {
28-
pub fn builder<V: CspVault + 'static>(
29-
vault: V,
32+
pub fn builder<I, V>(
33+
vault: I,
3034
logger: ReplicaLogger,
3135
metrics: Arc<CryptoMetrics>,
32-
) -> CspBuilder<V> {
36+
) -> CspBuilder<V>
37+
where
38+
I: VaultIntoArc<Item = V> + 'static,
39+
V: CspVault + 'static,
40+
{
3341
CspBuilder {
34-
vault: Box::new(|| vault),
42+
vault: Box::new(|| vault.into_arc()),
3543
logger,
3644
metrics,
3745
}
3846
}
3947
}
4048

49+
pub trait VaultIntoArc {
50+
type Item;
51+
52+
fn into_arc(self) -> Arc<Self::Item>;
53+
}
54+
55+
impl<V: CspVault> VaultIntoArc for Arc<V> {
56+
type Item = V;
57+
58+
fn into_arc(self) -> Arc<Self::Item> {
59+
self
60+
}
61+
}
62+
63+
impl<V: CspVault> VaultIntoArc for V {
64+
type Item = V;
65+
66+
fn into_arc(self) -> Arc<Self::Item> {
67+
Arc::new(self)
68+
}
69+
}
70+
4171
#[cfg(test)]
4272
mod test_utils {
4373
use super::*;
@@ -55,7 +85,7 @@ mod test_utils {
5585
>,
5686
> {
5787
CspBuilder {
58-
vault: Box::new(|| LocalCspVault::builder_for_test().build()),
88+
vault: Box::new(|| LocalCspVault::builder_for_test().build_into_arc()),
5989
logger: no_op_logger(),
6090
metrics: Arc::new(CryptoMetrics::none()),
6191
}

rs/crypto/internal/crypto_service_provider/src/vault/local_csp_vault/builder/mod.rs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,38 @@ impl ProdLocalCspVault {
3030
logger,
3131
}
3232
}
33+
34+
pub fn builder_in_dir(
35+
key_store_dir: &Path,
36+
metrics: Arc<CryptoMetrics>,
37+
logger: ReplicaLogger,
38+
) -> LocalCspVaultBuilder<OsRng, ProtoSecretKeyStore, ProtoSecretKeyStore, ProtoPublicKeyStore>
39+
{
40+
const SKS_DATA_FILENAME: &str = "sks_data.pb";
41+
const PUBLIC_KEY_STORE_DATA_FILENAME: &str = "public_keys.pb";
42+
const CANISTER_SKS_DATA_FILENAME: &str = "canister_sks_data.pb";
43+
44+
let node_secret_key_store =
45+
ProtoSecretKeyStore::open(key_store_dir, SKS_DATA_FILENAME, Some(new_logger!(logger)));
46+
let canister_secret_key_store = ProtoSecretKeyStore::open(
47+
key_store_dir,
48+
CANISTER_SKS_DATA_FILENAME,
49+
Some(new_logger!(logger)),
50+
);
51+
let public_key_store = ProtoPublicKeyStore::open(
52+
key_store_dir,
53+
PUBLIC_KEY_STORE_DATA_FILENAME,
54+
new_logger!(logger),
55+
);
56+
57+
Self::builder(
58+
node_secret_key_store,
59+
canister_secret_key_store,
60+
public_key_store,
61+
metrics,
62+
logger,
63+
)
64+
}
3365
}
3466

3567
impl<R, S, C, P> LocalCspVaultBuilder<R, S, C, P>
@@ -129,15 +161,7 @@ where
129161
logger: self.logger,
130162
}
131163
}
132-
}
133164

134-
impl<R, S, C, P> LocalCspVaultBuilder<R, S, C, P>
135-
where
136-
R: Rng + CryptoRng + Send + Sync + 'static,
137-
S: SecretKeyStore + 'static,
138-
C: SecretKeyStore + 'static,
139-
P: PublicKeyStore + 'static,
140-
{
141165
pub fn build_into_arc(self) -> Arc<LocalCspVault<R, S, C, P>> {
142166
Arc::new(self.build())
143167
}

rs/crypto/internal/crypto_service_provider/src/vault/local_csp_vault/mod.rs

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -121,29 +121,7 @@ impl ProdLocalCspVault {
121121
metrics: Arc<CryptoMetrics>,
122122
logger: ReplicaLogger,
123123
) -> Self {
124-
const SKS_DATA_FILENAME: &str = "sks_data.pb";
125-
const PUBLIC_KEY_STORE_DATA_FILENAME: &str = "public_keys.pb";
126-
const CANISTER_SKS_DATA_FILENAME: &str = "canister_sks_data.pb";
127-
128-
let node_secret_key_store =
129-
ProtoSecretKeyStore::open(key_store_dir, SKS_DATA_FILENAME, Some(new_logger!(logger)));
130-
let canister_secret_key_store = ProtoSecretKeyStore::open(
131-
key_store_dir,
132-
CANISTER_SKS_DATA_FILENAME,
133-
Some(new_logger!(logger)),
134-
);
135-
let public_key_store = ProtoPublicKeyStore::open(
136-
key_store_dir,
137-
PUBLIC_KEY_STORE_DATA_FILENAME,
138-
new_logger!(logger),
139-
);
140-
Self::new(
141-
node_secret_key_store,
142-
canister_secret_key_store,
143-
public_key_store,
144-
metrics,
145-
logger,
146-
)
124+
ProdLocalCspVault::builder_in_dir(key_store_dir, metrics, logger).build()
147125
}
148126
}
149127

rs/crypto/temp_crypto/BUILD.bazel

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ DEPENDENCIES = [
2121
"//rs/registry/proto_data_provider",
2222
"//rs/types/base_types",
2323
"//rs/types/types",
24+
"@crate_index//:rand_0_8_4",
2425
"@crate_index//:tempfile",
2526
"@crate_index//:tokio",
2627
]
@@ -31,7 +32,10 @@ MACRO_DEPENDENCIES = [
3132

3233
DEV_DEPENDENCIES = [
3334
"//rs/crypto/test_utils",
35+
"//rs/crypto/test_utils/reproducible_rng",
36+
"//rs/test_utilities",
3437
"//rs/types/types_test_utils",
38+
"@crate_index//:assert_matches",
3539
]
3640

3741
MACRO_DEV_DEPENDENCIES = []

rs/crypto/temp_crypto/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,13 @@ ic-registry-client-fake = { path = "../../registry/fake" }
2323
ic-registry-keys = { path = "../../registry/keys" }
2424
ic-registry-proto-data-provider = { path = "../../registry/proto_data_provider" }
2525
ic-types = { path = "../../types/types" }
26+
rand = "0.8"
2627
tempfile = "3.1.0"
2728
tokio = { version = "1.15.0", features = ["full"] }
2829

2930
[dev-dependencies]
31+
assert_matches = "1.5.0"
3032
ic-crypto-test-utils = { path = "../test_utils" }
33+
ic-crypto-test-utils-reproducible-rng = { path = "../test_utils/reproducible_rng" }
34+
ic-test-utilities = { path = "../../test_utilities" }
3135
ic-types-test-utils = { path = "../../types/types_test_utils" }

0 commit comments

Comments
 (0)