Skip to content

Commit a97f796

Browse files
committed
chore(schnorr): CON-1282 Add optional MasterPublicKeyId to EcdsaReshareRequest
1 parent d6d1edc commit a97f796

File tree

6 files changed

+59
-4
lines changed

6 files changed

+59
-4
lines changed

rs/consensus/src/ecdsa/payload_builder/resharing.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ pub(super) fn make_reshare_dealings_response(
6666
if request
6767
== &(ecdsa::EcdsaReshareRequest {
6868
key_id: context.key_id.clone(),
69+
master_key_id: None,
6970
receiving_node_ids: context.nodes.iter().copied().collect(),
7071
registry_version: context.registry_version,
7172
})
@@ -170,6 +171,7 @@ pub(super) fn get_reshare_requests(
170171
.values()
171172
.map(|context| ecdsa::EcdsaReshareRequest {
172173
key_id: context.key_id.clone(),
174+
master_key_id: None,
173175
receiving_node_ids: context.nodes.iter().copied().collect(),
174176
registry_version: context.registry_version,
175177
})
@@ -191,6 +193,7 @@ pub mod test_utils {
191193
) -> ecdsa::EcdsaReshareRequest {
192194
ecdsa::EcdsaReshareRequest {
193195
key_id,
196+
master_key_id: None,
194197
receiving_node_ids: (0..num_nodes).map(node_test_id).collect::<Vec<_>>(),
195198
registry_version: RegistryVersion::from(registry_version),
196199
}
@@ -249,6 +252,7 @@ mod tests {
249252
|i: u64| EcdsaKeyId::from_str(&format!("Secp256k1:some_key_{i}")).unwrap();
250253
let make_reshare_request = |i| EcdsaReshareRequest {
251254
key_id: make_key_id(i),
255+
master_key_id: None,
252256
receiving_node_ids: vec![node_test_id(i)],
253257
registry_version: RegistryVersion::from(i),
254258
};

rs/consensus/src/ecdsa/test_utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1492,6 +1492,7 @@ pub(crate) fn fake_ecdsa_key_id() -> EcdsaKeyId {
14921492
pub(crate) fn create_reshare_request(num_nodes: u64, registry_version: u64) -> EcdsaReshareRequest {
14931493
EcdsaReshareRequest {
14941494
key_id: fake_ecdsa_key_id(),
1495+
master_key_id: None,
14951496
receiving_node_ids: (0..num_nodes).map(node_test_id).collect::<Vec<_>>(),
14961497
registry_version: RegistryVersion::from(registry_version),
14971498
}

rs/protobuf/def/types/v1/ecdsa.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ message EcdsaReshareRequest {
190190
repeated types.v1.NodeId receiving_node_ids = 2;
191191
uint64 registry_version = 3;
192192
registry.crypto.v1.EcdsaKeyId key_id = 4;
193+
registry.crypto.v1.MasterPublicKeyId master_key_id = 5;
193194
}
194195

195196
enum KeyTranscriptCreationState {

rs/protobuf/src/gen/types/types.v1.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,9 @@ pub struct EcdsaReshareRequest {
679679
pub registry_version: u64,
680680
#[prost(message, optional, tag = "4")]
681681
pub key_id: ::core::option::Option<super::super::registry::crypto::v1::EcdsaKeyId>,
682+
#[prost(message, optional, tag = "5")]
683+
pub master_key_id:
684+
::core::option::Option<super::super::registry::crypto::v1::MasterPublicKeyId>,
682685
}
683686
#[derive(serde::Serialize, serde::Deserialize)]
684687
#[allow(clippy::derive_partial_eq_without_eq)]

rs/types/types/src/consensus/ecdsa.rs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use crate::{
2828
use ic_crypto_sha2::Sha256;
2929
#[cfg(test)]
3030
use ic_exhaustive_derive::ExhaustiveSet;
31-
use ic_management_canister_types::EcdsaKeyId;
31+
use ic_management_canister_types::{EcdsaKeyId, MasterPublicKeyId};
3232
use ic_protobuf::{
3333
proxy::{try_from_option_field, ProxyDecodeError},
3434
registry::{crypto::v1 as crypto_pb, subnet::v1 as subnet_pb},
@@ -40,7 +40,7 @@ use std::{
4040
collections::{BTreeMap, BTreeSet},
4141
convert::{TryFrom, TryInto},
4242
fmt::{self, Display, Formatter},
43-
hash::Hash,
43+
hash::{Hash, Hasher},
4444
time::Duration,
4545
};
4646
use strum_macros::EnumIter;
@@ -623,14 +623,31 @@ impl TryFrom<&pb::KeyTranscriptCreation> for KeyTranscriptCreation {
623623
}
624624

625625
/// Internal format of the resharing request from execution.
626-
#[derive(Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize, Hash)]
627-
#[cfg_attr(test, derive(ExhaustiveSet))]
626+
#[derive(Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize)]
628627
pub struct EcdsaReshareRequest {
629628
pub key_id: EcdsaKeyId,
629+
pub master_key_id: Option<MasterPublicKeyId>,
630630
pub receiving_node_ids: Vec<NodeId>,
631631
pub registry_version: RegistryVersion,
632632
}
633633

634+
impl Hash for EcdsaReshareRequest {
635+
fn hash<H: Hasher>(&self, state: &mut H) {
636+
let EcdsaReshareRequest {
637+
key_id,
638+
master_key_id,
639+
receiving_node_ids,
640+
registry_version,
641+
} = self;
642+
key_id.hash(state);
643+
if let Some(master_key_id) = master_key_id {
644+
master_key_id.hash(state);
645+
}
646+
receiving_node_ids.hash(state);
647+
registry_version.hash(state);
648+
}
649+
}
650+
634651
impl From<&EcdsaReshareRequest> for pb::EcdsaReshareRequest {
635652
fn from(request: &EcdsaReshareRequest) -> Self {
636653
let mut receiving_node_ids = Vec::new();
@@ -639,6 +656,7 @@ impl From<&EcdsaReshareRequest> for pb::EcdsaReshareRequest {
639656
}
640657
Self {
641658
key_id: Some((&request.key_id).into()),
659+
master_key_id: request.master_key_id.clone().map(|key_id| key_id.into()),
642660
receiving_node_ids,
643661
registry_version: request.registry_version.get(),
644662
}
@@ -655,8 +673,14 @@ impl TryFrom<&pb::EcdsaReshareRequest> for EcdsaReshareRequest {
655673
.collect::<Result<Vec<_>, ProxyDecodeError>>()?;
656674

657675
let key_id = try_from_option_field(request.key_id.clone(), "EcdsaReshareRequest::key_id")?;
676+
let master_key_id = request
677+
.master_key_id
678+
.clone()
679+
.map(|key_id| key_id.try_into())
680+
.transpose()?;
658681
Ok(Self {
659682
key_id,
683+
master_key_id,
660684
receiving_node_ids,
661685
registry_version: RegistryVersion::new(request.registry_version),
662686
})

rs/types/types/src/exhaustive.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,28 @@ impl ExhaustiveSet for PreSignatureQuadrupleRef {
721721
}
722722
}
723723

724+
#[derive(Clone)]
725+
#[cfg_attr(test, derive(ExhaustiveSet))]
726+
pub struct DerivedEcdsaReshareRequest {
727+
pub key_id: EcdsaKeyId,
728+
pub receiving_node_ids: Vec<NodeId>,
729+
pub registry_version: RegistryVersion,
730+
}
731+
732+
impl ExhaustiveSet for EcdsaReshareRequest {
733+
fn exhaustive_set<R: RngCore + CryptoRng>(rng: &mut R) -> Vec<Self> {
734+
DerivedEcdsaReshareRequest::exhaustive_set(rng)
735+
.into_iter()
736+
.map(|r| EcdsaReshareRequest {
737+
key_id: r.key_id,
738+
master_key_id: None,
739+
receiving_node_ids: r.receiving_node_ids,
740+
registry_version: r.registry_version,
741+
})
742+
.collect()
743+
}
744+
}
745+
724746
impl ExhaustiveSet for ConsensusResponse {
725747
fn exhaustive_set<R: RngCore + CryptoRng>(rng: &mut R) -> Vec<Self> {
726748
Response::exhaustive_set(rng)

0 commit comments

Comments
 (0)