Skip to content

Commit 2da2138

Browse files
authored
feat(crypto): CRP-2670 store registry version in threshold sig data store (dfinity#3619)
Stores the registry version in the threshold sig data store whenever an NI-DKG transcript is loaded. This will later be needed for implementing the VetKdProtocol.
1 parent fba9bf4 commit 2da2138

File tree

4 files changed

+67
-18
lines changed

4 files changed

+67
-18
lines changed

rs/crypto/src/sign/threshold_sig/ni_dkg/transcript.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ mod loading {
240240
lockable_threshold_sig_data_store,
241241
&csp_transcript,
242242
&transcript.dkg_id,
243+
transcript.registry_version,
243244
&transcript.committee,
244245
);
245246
let epoch = epoch(transcript.registry_version);
@@ -321,6 +322,7 @@ mod loading {
321322
lockable_threshold_sig_data_store: &LockableThresholdSigDataStore,
322323
csp_transcript: &CspNiDkgTranscript,
323324
dkg_id: &NiDkgId,
325+
registry_version: RegistryVersion,
324326
committee: &NiDkgReceivers,
325327
) {
326328
lockable_threshold_sig_data_store
@@ -329,6 +331,7 @@ mod loading {
329331
dkg_id,
330332
CspPublicCoefficients::from(csp_transcript),
331333
indices(committee),
334+
registry_version,
332335
);
333336
}
334337

rs/crypto/src/sign/threshold_sig/store.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ pub trait ThresholdSigDataStore {
2626
dkg_id: &NiDkgId,
2727
public_coefficients: CspPublicCoefficients,
2828
indices: BTreeMap<NodeId, NodeIndex>,
29+
registry_version: RegistryVersion,
2930
);
3031

3132
/// Inserts an individual public key for a given `dkg_id` and a given
@@ -56,6 +57,7 @@ pub trait ThresholdSigDataStore {
5657
pub struct TranscriptData {
5758
public_coeffs: CspPublicCoefficients,
5859
indices: BTreeMap<NodeId, NodeIndex>,
60+
registry_version: RegistryVersion,
5961
}
6062

6163
impl TranscriptData {
@@ -68,6 +70,14 @@ impl TranscriptData {
6870
pub fn index(&self, node_id: NodeId) -> Option<&NodeIndex> {
6971
self.indices.get(&node_id)
7072
}
73+
74+
/// Returns a reference to the registry version.
75+
/////////////////////////////////////////
76+
// TODO(CRP-2599): remove allow(unused) once this method is used
77+
#[allow(unused)]
78+
pub fn registry_version(&self) -> RegistryVersion {
79+
self.registry_version
80+
}
7181
}
7282

7383
/// Threshold signature data store that limits the number of DKG IDs
@@ -215,11 +225,13 @@ impl ThresholdSigDataStore for ThresholdSigDataStoreImpl {
215225
dkg_id: &NiDkgId,
216226
public_coefficients: CspPublicCoefficients,
217227
indices: BTreeMap<NodeId, NodeIndex>,
228+
registry_version: RegistryVersion,
218229
) {
219230
let data = self.entry_for(dkg_id);
220231
data.transcript_data = Some(TranscriptData {
221232
public_coeffs: public_coefficients,
222233
indices,
234+
registry_version,
223235
});
224236

225237
self.purge_entry_for_oldest_dkg_id_if_necessary(&dkg_id.dkg_tag);

rs/crypto/src/sign/threshold_sig/store/tests.rs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use ic_management_canister_types::{VetKdCurve, VetKdKeyId};
66
use ic_types::crypto::threshold_sig::ni_dkg::{NiDkgId, NiDkgTargetId, NiDkgTargetSubnet};
77
use ic_types::Height;
88
use ic_types_test_utils::ids::{node_test_id, SUBNET_1};
9+
use sign::tests::{REG_V1, REG_V2};
910
use strum::{EnumCount, IntoEnumIterator};
1011

1112
const NODE_1: u64 = 1;
@@ -42,7 +43,7 @@ fn should_contain_transcript_data_after_insertion_with_nidkg_id() {
4243

4344
let dkg_id = ni_dkg_id_with_tag(tag.clone(), 42);
4445

45-
store.insert_transcript_data(&dkg_id, public_coeffs.clone(), indices);
46+
store.insert_transcript_data(&dkg_id, public_coeffs.clone(), indices, REG_V1);
4647

4748
let transcript_data = store.transcript_data(&dkg_id).unwrap();
4849
assert_eq!(transcript_data.public_coefficients(), &public_coeffs);
@@ -54,6 +55,7 @@ fn should_contain_transcript_data_after_insertion_with_nidkg_id() {
5455
transcript_data.index(node_test_id(NODE_2)),
5556
Some(&NODE_2_INDEX)
5657
);
58+
assert_eq!(transcript_data.registry_version(), REG_V1);
5759
}
5860
}
5961

@@ -127,8 +129,8 @@ fn should_overwrite_existing_public_coefficients() {
127129
assert_ne!(public_coeffs_1, public_coeffs_2);
128130
let ni_dkg_id = ni_dkg_id_with_tag(tag.clone(), 1);
129131

130-
store.insert_transcript_data(&ni_dkg_id, public_coeffs_1, BTreeMap::new());
131-
store.insert_transcript_data(&ni_dkg_id, public_coeffs_2.clone(), BTreeMap::new());
132+
store.insert_transcript_data(&ni_dkg_id, public_coeffs_1, BTreeMap::new(), REG_V1);
133+
store.insert_transcript_data(&ni_dkg_id, public_coeffs_2.clone(), BTreeMap::new(), REG_V1);
132134

133135
let transcript_data = store.transcript_data(&ni_dkg_id).unwrap();
134136
assert_eq!(transcript_data.public_coefficients(), &public_coeffs_2);
@@ -144,8 +146,8 @@ fn should_overwrite_existing_indices() {
144146
let public_coeffs = public_coeffs();
145147
let ni_dkg_id = ni_dkg_id_with_tag(tag.clone(), 1);
146148

147-
store.insert_transcript_data(&ni_dkg_id, public_coeffs.clone(), indices_1);
148-
store.insert_transcript_data(&ni_dkg_id, public_coeffs, indices_2);
149+
store.insert_transcript_data(&ni_dkg_id, public_coeffs.clone(), indices_1, REG_V1);
150+
store.insert_transcript_data(&ni_dkg_id, public_coeffs, indices_2, REG_V1);
149151

150152
let transcript_data = store.transcript_data(&ni_dkg_id).unwrap();
151153
assert_eq!(transcript_data.index(node_test_id(NODE_1)), None);
@@ -156,6 +158,22 @@ fn should_overwrite_existing_indices() {
156158
}
157159
}
158160

161+
#[test]
162+
fn should_overwrite_existing_registry_version() {
163+
for tag in all_tags() {
164+
let mut store = ThresholdSigDataStoreImpl::new();
165+
let (reg_v1, reg_v2) = (REG_V1, REG_V2);
166+
assert_ne!(reg_v1, reg_v2);
167+
let ni_dkg_id = ni_dkg_id_with_tag(tag.clone(), 1);
168+
169+
store.insert_transcript_data(&ni_dkg_id, public_coeffs(), BTreeMap::new(), reg_v1);
170+
store.insert_transcript_data(&ni_dkg_id, public_coeffs(), BTreeMap::new(), reg_v2);
171+
172+
let transcript_data = store.transcript_data(&ni_dkg_id).unwrap();
173+
assert_eq!(transcript_data.registry_version(), reg_v2);
174+
}
175+
}
176+
159177
#[test]
160178
fn should_overwrite_existing_individual_public_keys() {
161179
for tag in all_tags() {
@@ -176,7 +194,7 @@ fn should_overwrite_existing_individual_public_keys() {
176194
}
177195

178196
#[test]
179-
fn should_not_purge_data_on_inserting_coeffs_and_indices_if_capacity_not_exceeded() {
197+
fn should_not_purge_data_on_inserting_transcript_data_if_capacity_not_exceeded() {
180198
for tag in all_tags() {
181199
let mut store = ThresholdSigDataStoreImpl::new();
182200

@@ -185,6 +203,7 @@ fn should_not_purge_data_on_inserting_coeffs_and_indices_if_capacity_not_exceede
185203
&ni_dkg_id_with_tag(tag.clone(), i),
186204
public_coeffs(),
187205
BTreeMap::new(),
206+
REG_V1,
188207
);
189208
}
190209

@@ -216,16 +235,18 @@ fn should_not_purge_data_on_inserting_pubkeys_if_capacity_not_exceeded() {
216235
}
217236

218237
#[test]
219-
fn should_purge_data_on_inserting_coeffs_and_indices_if_capacity_exceeded() {
238+
fn should_purge_data_on_inserting_transcript_data_if_capacity_exceeded() {
220239
for tag in all_tags() {
221240
let mut store = ThresholdSigDataStoreImpl::new();
222241
let pub_coeffs = public_coeffs();
242+
let registry_version = REG_V1;
223243

224244
for i in 1..=ThresholdSigDataStoreImpl::CAPACITY_PER_TAG_OR_KEY + 1 {
225245
store.insert_transcript_data(
226246
&ni_dkg_id_with_tag(tag.clone(), i),
227247
pub_coeffs.clone(),
228248
BTreeMap::new(),
249+
registry_version,
229250
);
230251
}
231252

@@ -246,16 +267,18 @@ fn should_purge_data_on_inserting_coeffs_and_indices_if_capacity_exceeded() {
246267
}
247268

248269
#[test]
249-
fn should_purge_data_in_insertion_order_on_inserting_coeffs_and_indices_if_capacity_exceeded() {
270+
fn should_purge_data_in_insertion_order_on_inserting_transcript_data_if_capacity_exceeded() {
250271
for tag in all_tags() {
251272
let mut store = ThresholdSigDataStoreImpl::new();
252273
let pub_coeffs = public_coeffs();
274+
let registry_version = REG_V1;
253275

254276
for i in (1..=ThresholdSigDataStoreImpl::CAPACITY_PER_TAG_OR_KEY + 1).rev() {
255277
store.insert_transcript_data(
256278
&ni_dkg_id_with_tag(tag.clone(), i),
257279
pub_coeffs.clone(),
258280
BTreeMap::new(),
281+
registry_version,
259282
);
260283
}
261284

@@ -284,17 +307,20 @@ fn should_not_purge_all_transcripts_of_certain_threshold_if_capacity_exceeded(
284307
) {
285308
let mut store = ThresholdSigDataStoreImpl::new();
286309
let pub_coeffs = public_coeffs();
310+
let registry_version = REG_V1;
287311

288312
store.insert_transcript_data(
289313
&ni_dkg_id_with_tag(single_transcript_threshold.clone(), 1),
290314
pub_coeffs.clone(),
291315
BTreeMap::new(),
316+
registry_version,
292317
);
293318
for i in 0..ThresholdSigDataStoreImpl::CAPACITY_PER_TAG_OR_KEY + 1 {
294319
store.insert_transcript_data(
295320
&ni_dkg_id_with_tag(other_transcripts_threshold.clone(), i),
296321
pub_coeffs.clone(),
297322
BTreeMap::new(),
323+
registry_version,
298324
);
299325
}
300326

@@ -409,13 +435,15 @@ fn should_purge_data_in_insertion_order_on_inserting_pubkeys_if_max_size_exceede
409435
fn should_store_up_to_capacity_per_tag_for_all_tags() {
410436
let mut store = ThresholdSigDataStoreImpl::new();
411437
let pub_coeffs = public_coeffs();
438+
let registry_version = REG_V1;
412439

413440
for i in 0..ThresholdSigDataStoreImpl::CAPACITY_PER_TAG_OR_KEY {
414441
for tag in all_tags() {
415442
store.insert_transcript_data(
416443
&ni_dkg_id_with_tag(tag.clone(), i),
417444
pub_coeffs.clone(),
418445
BTreeMap::new(),
446+
registry_version,
419447
);
420448
}
421449
}
@@ -430,6 +458,7 @@ fn should_store_up_to_capacity_per_tag_for_all_tags() {
430458
&ni_dkg_id_with_tag(tag, ThresholdSigDataStoreImpl::CAPACITY_PER_TAG_OR_KEY),
431459
pub_coeffs.clone(),
432460
BTreeMap::new(),
461+
registry_version,
433462
);
434463
}
435464

rs/crypto/src/sign/threshold_sig/tests.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use ic_types::crypto::{CombinedThresholdSig, SignableMock, ThresholdSigShare};
2222
use ic_types::Height;
2323
use ic_types::SubnetId;
2424
use ic_types_test_utils::ids::{NODE_1, SUBNET_1};
25+
use sign::tests::REG_V1;
2526

2627
pub const NODE_ID: NodeId = NODE_1;
2728

@@ -344,7 +345,7 @@ mod verify_threshold_sig_share {
344345
fn should_return_ok_if_sig_verification_ok_and_public_key_not_in_store() {
345346
let (sig_share, message, csp_public_key) = (sig_share(), signable_mock(), csp_public_key());
346347
let threshold_sig_data_store =
347-
threshold_sig_data_store_with_non_empty_coeffs_and_indices_for_dkg_id(&NI_DKG_ID_1);
348+
threshold_sig_data_store_with_non_empty_transcript_data_for_dkg_id(&NI_DKG_ID_1);
348349
let mut csp = MockAllCryptoServiceProvider::new();
349350
csp.expect_threshold_individual_public_key()
350351
.times(1)
@@ -391,7 +392,7 @@ mod verify_threshold_sig_share {
391392
let verification_error = sig_verification_error();
392393
let (sig_share, message, csp_public_key) = (sig_share(), signable_mock(), csp_public_key());
393394
let threshold_sig_data_store =
394-
threshold_sig_data_store_with_non_empty_coeffs_and_indices_for_dkg_id(&NI_DKG_ID_1);
395+
threshold_sig_data_store_with_non_empty_transcript_data_for_dkg_id(&NI_DKG_ID_1);
395396
let mut csp = MockAllCryptoServiceProvider::new();
396397
csp.expect_threshold_individual_public_key()
397398
.times(1)
@@ -417,7 +418,7 @@ mod verify_threshold_sig_share {
417418
fn should_have_correct_public_key_in_store_after_sig_verification_if_not_in_store_before() {
418419
let (sig_share, message, csp_public_key) = (sig_share(), signable_mock(), csp_public_key());
419420
let threshold_sig_data_store =
420-
threshold_sig_data_store_with_non_empty_coeffs_and_indices_for_dkg_id(&NI_DKG_ID_1);
421+
threshold_sig_data_store_with_non_empty_transcript_data_for_dkg_id(&NI_DKG_ID_1);
421422
let mut csp = MockAllCryptoServiceProvider::new();
422423
csp.expect_threshold_individual_public_key()
423424
.times(1)
@@ -521,7 +522,7 @@ mod verify_threshold_sig_share {
521522
fn should_fail_with_malformed_signature_if_signature_has_invalid_length() {
522523
let (sig_share, message) = (invalid_threshold_sig_share(), signable_mock());
523524
let threshold_sig_data_store =
524-
threshold_sig_data_store_with_non_empty_coeffs_and_indices_for_dkg_id(&NI_DKG_ID_1);
525+
threshold_sig_data_store_with_non_empty_transcript_data_for_dkg_id(&NI_DKG_ID_1);
525526
let mut csp = MockAllCryptoServiceProvider::new();
526527
csp.expect_threshold_individual_public_key().times(0);
527528
csp.expect_threshold_verify_individual_signature().times(0);
@@ -1598,17 +1599,20 @@ fn threshold_sig_data_store_with(
15981599
let store = LockableThresholdSigDataStore::new();
15991600
store
16001601
.write()
1601-
.insert_transcript_data(dkg_id, public_coeffs, indices);
1602+
.insert_transcript_data(dkg_id, public_coeffs, indices, REG_V1);
16021603
store
16031604
}
16041605

1605-
fn threshold_sig_data_store_with_non_empty_coeffs_and_indices_for_dkg_id(
1606+
fn threshold_sig_data_store_with_non_empty_transcript_data_for_dkg_id(
16061607
ni_dkg_id: &NiDkgId,
16071608
) -> LockableThresholdSigDataStore {
16081609
let store = LockableThresholdSigDataStore::new();
1609-
store
1610-
.write()
1611-
.insert_transcript_data(ni_dkg_id, pub_coeffs(), indices(vec![(NODE_ID, 1)]));
1610+
store.write().insert_transcript_data(
1611+
ni_dkg_id,
1612+
pub_coeffs(),
1613+
indices(vec![(NODE_ID, 1)]),
1614+
REG_V1,
1615+
);
16121616
store
16131617
}
16141618

@@ -1621,6 +1625,7 @@ fn threshold_sig_data_store_with_coeffs(
16211625
dkg_id,
16221626
csp_public_coefficients,
16231627
BTreeMap::new(),
1628+
REG_V1,
16241629
);
16251630
threshold_sig_data_store
16261631
}
@@ -1633,7 +1638,7 @@ fn threshold_sig_data_store_with_coeffs_and_pubkey(
16331638
let threshold_sig_data_store = LockableThresholdSigDataStore::new();
16341639
{
16351640
let mut locked_store = threshold_sig_data_store.write();
1636-
locked_store.insert_transcript_data(dkg_id, pub_coeffs(), BTreeMap::new());
1641+
locked_store.insert_transcript_data(dkg_id, pub_coeffs(), BTreeMap::new(), REG_V1);
16371642
locked_store.insert_individual_public_key(dkg_id, node_id, public_key);
16381643
}
16391644
threshold_sig_data_store

0 commit comments

Comments
 (0)