// Copyright 2015-2017 Parity Technologies (UK) Ltd. // This file is part of Parity. // Parity is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Parity is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Parity. If not, see . use std::collections::{BTreeSet, BTreeMap}; use ethkey::{Public, Secret, Signature}; use key_server_cluster::{NodeId, SessionId}; #[derive(Clone, Debug)] /// All possible messages that can be sent during DKG. pub enum Message { /// Initialize new DKG session. InitializeSession(InitializeSession), /// Confirm DKG session initialization. ConfirmInitialization(ConfirmInitialization), /// Broadcast data, calculated during session initialization phase. CompleteInitialization(CompleteInitialization), /// Generated keys are sent to every node. KeysDissemination(KeysDissemination), /// Complaint against another node is broadcasted. Complaint(Complaint), /// Complaint response is broadcasted. ComplaintResponse(ComplaintResponse), /// Broadcast self public key portion. PublicKeyShare(PublicKeyShare), /// Initialize decryption session. InitializeDecryptionSession(InitializeDecryptionSession), /// Confirm/reject decryption session initialization. ConfirmDecryptionInitialization(ConfirmDecryptionInitialization), /// Request partial decryption from node. RequestPartialDecryption(RequestPartialDecryption), /// Partial decryption is completed PartialDecryption(PartialDecryption), } #[derive(Clone, Debug)] /// Initialize new DKG session. pub struct InitializeSession { /// Session Id. pub session: SessionId, /// Derived generation point. Starting from originator, every node must multiply this /// point by random scalar (unknown by other nodes). At the end of initialization /// `point` will be some (k1 * k2 * ... * kn) * G = `point` where `(k1 * k2 * ... * kn)` /// is unknown for every node. pub derived_point: Public, } #[derive(Clone, Debug)] /// Confirm DKG session initialization. pub struct ConfirmInitialization { /// Session Id. pub session: SessionId, /// Derived generation point. pub derived_point: Public, } #[derive(Clone, Debug)] /// Broadcast generated point to every other node. pub struct CompleteInitialization { /// Session Id. pub session: SessionId, /// All session participants along with their identification numbers. pub nodes: BTreeMap, /// Decryption threshold. During decryption threshold-of-route.len() nodes must came to /// consensus to successfully decrypt message. pub threshold: usize, /// Derived generation point. pub derived_point: Public, } #[derive(Clone, Debug)] /// Generated keys are sent to every node. pub struct KeysDissemination { /// Session Id. pub session: SessionId, /// Secret 1. pub secret1: Secret, /// Secret 2. pub secret2: Secret, /// Public values. pub publics: Vec, } #[derive(Clone, Debug)] /// Complaint against node is broadcasted. pub struct Complaint { /// Session Id. pub session: SessionId, /// Public values. pub against: NodeId, } #[derive(Clone, Debug)] /// Node is responding to complaint. pub struct ComplaintResponse { /// Session Id. pub session: SessionId, /// Secret 1. pub secret1: Secret, /// Secret 2. pub secret2: Secret, } #[derive(Clone, Debug)] /// Node is sharing its public key share. pub struct PublicKeyShare { /// Session Id. pub session: SessionId, /// Public key share. pub public_share: Public, } #[derive(Clone, Debug)] /// Node is requested to decrypt data, encrypted in given session. pub struct InitializeDecryptionSession { /// Encryption session Id. pub session: SessionId, /// Decryption session Id. pub sub_session: Secret, /// Requestor signature. pub requestor_signature: Signature, } #[derive(Clone, Debug)] /// Node is responding to decryption request. pub struct ConfirmDecryptionInitialization { /// Encryption session Id. pub session: SessionId, /// Decryption session Id. pub sub_session: Secret, /// Is node confirmed to make a decryption?. pub is_confirmed: bool, } #[derive(Clone, Debug)] /// Node is requested to do a partial decryption. pub struct RequestPartialDecryption { /// Encryption session Id. pub session: SessionId, /// Decryption session Id. pub sub_session: Secret, /// Nodes that are agreed to do a decryption. pub nodes: BTreeSet, } #[derive(Clone, Debug)] /// Node has partially decrypted the secret. pub struct PartialDecryption { /// Encryption session Id. pub session: SessionId, /// Decryption session Id. pub sub_session: Secret, /// Partially decrypted secret. pub shadow_point: Public, }