e16f6fb9d9
* SecretStore: first key versions flush * SecretStore: key versions in encryption session * SecretStore: flush key versions negotiation session * SecretStore: connected key version negotiation session to cluster * SecretStore: cluster sessions container refactoring * SecretStore: flush * SecretStore: flush key versions * SecretStore: flush * SecretStore: delegation proto * SecretStore: decryption_session_is_delegated_when_node_does_not_have_key_share * SecretStore: fixed version in decryption session * SecretStore: signing_session_is_delegated_when_node_does_not_have_key_share * SecretStore: started restoring admin sessions * SecretStore: restoring admin sessions * SecretStore: removed obsolete ShareRemove && ShareMove sessions * SecretStore: ShareAdd math tests only require old_t+1 nodes * SecretStore: ShareAdd revamp using new math backend * SecretStore: do not include isolated nodes into consensus_group * SecretStore: ServersSetChange + ShareAdd revamp * removed debug printlns * SecretStore: key version negotiation tests * SecretStore: removed debug/merge artifacts * SecretStore: fixed master node selection * SecretStore: cleanup + tests + fixes * SecretStore: uncommented tests * SecretStore: cleaning up * SecretStore: cleaning up + tests * SecretStore: cleaning up * SecretStore: cleaning up && tests * SecretStore: fixing TODOs * SecretStore: fixing TODOs + cleanup * SecretStore: fixing TODOs * SecretStore: nodes_add_to_the_node_with_obsolete_version * SecretStore: nodes_add_fails_when_not_enough_share_owners_are_connected * SecretStore: tests * SecretStore: signing && delegation tests * SecretStore: signing && decryption tests when some nodes are isolated * SecretStore: sessions_are_removed_when_initialization_fails * SecretStore: ceaning up * SecretStore: removed obsolete comments * SecretStore: signing_session_completes_if_node_does_not_have_a_share * SecretStore: initial ServersSetChange API * SecretStore: added secretstore_signServersSet RPC * SecretStore: ChangeServersSet parse tests * SecretStore: fixes after manual ServersSetChange tests * lost file * fixed network ports overlap in tests * lost files
97 lines
5.4 KiB
Rust
97 lines
5.4 KiB
Rust
// 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 <http://www.gnu.org/licenses/>.
|
|
|
|
use std::collections::BTreeSet;
|
|
use ethkey::{KeyPair, Signature, Error as EthKeyError};
|
|
use bigint::hash::H256;
|
|
use types::all::{Error, Public, ServerKeyId, MessageHash, EncryptedMessageSignature, RequestSignature, EncryptedDocumentKey,
|
|
EncryptedDocumentKeyShadow, NodeId};
|
|
|
|
/// Node key pair.
|
|
pub trait NodeKeyPair: Send + Sync {
|
|
/// Public portion of key.
|
|
fn public(&self) -> &Public;
|
|
/// Sign data with node key.
|
|
fn sign(&self, data: &H256) -> Result<Signature, EthKeyError>;
|
|
/// Compute shared key to encrypt channel between two nodes.
|
|
fn compute_shared_key(&self, peer_public: &Public) -> Result<KeyPair, EthKeyError>;
|
|
}
|
|
|
|
/// Server key (SK) generator.
|
|
pub trait ServerKeyGenerator {
|
|
/// Generate new SK.
|
|
/// `key_id` is the caller-provided identifier of generated SK.
|
|
/// `signature` is `key_id`, signed with caller public key.
|
|
/// `threshold + 1` is the minimal number of nodes, required to restore private key.
|
|
/// Result is a public portion of SK.
|
|
fn generate_key(&self, key_id: &ServerKeyId, signature: &RequestSignature, threshold: usize) -> Result<Public, Error>;
|
|
}
|
|
|
|
/// Document key (DK) server.
|
|
pub trait DocumentKeyServer: ServerKeyGenerator {
|
|
/// Store externally generated DK.
|
|
/// `key_id` is identifier of previously generated SK.
|
|
/// `signature` is key_id, signed with caller public key. Caller must be the same as in the `generate_key` call.
|
|
/// `common_point` is a result of `k * T` expression, where `T` is generation point and `k` is random scalar in EC field.
|
|
/// `encrypted_document_key` is a result of `M + k * y` expression, where `M` is unencrypted document key (point on EC),
|
|
/// `k` is the same scalar used in `common_point` calculation and `y` is previously generated public part of SK.
|
|
fn store_document_key(&self, key_id: &ServerKeyId, signature: &RequestSignature, common_point: Public, encrypted_document_key: Public) -> Result<(), Error>;
|
|
/// Generate and store both SK and DK. This is a shortcut for consequent calls of `generate_key` and `store_document_key`.
|
|
/// The only difference is that DK is generated by DocumentKeyServer (which might be considered unsafe).
|
|
/// `key_id` is the caller-provided identifier of generated SK.
|
|
/// `signature` is `key_id`, signed with caller public key.
|
|
/// `threshold + 1` is the minimal number of nodes, required to restore private key.
|
|
/// Result is a DK, encrypted with caller public key.
|
|
fn generate_document_key(&self, key_id: &ServerKeyId, signature: &RequestSignature, threshold: usize) -> Result<EncryptedDocumentKey, Error>;
|
|
/// Restore previously stored DK.
|
|
/// DK is decrypted on the key server (which might be considered unsafe), and then encrypted with caller public key.
|
|
/// `key_id` is identifier of previously generated SK.
|
|
/// `signature` is key_id, signed with caller public key. Caller must be on ACL for this function to succeed.
|
|
/// Result is a DK, encrypted with caller public key.
|
|
fn restore_document_key(&self, key_id: &ServerKeyId, signature: &RequestSignature) -> Result<EncryptedDocumentKey, Error>;
|
|
/// Restore previously stored DK.
|
|
/// To decrypt DK on client:
|
|
/// 1) use requestor secret key to decrypt secret coefficients from result.decrypt_shadows
|
|
/// 2) calculate decrypt_shadows_sum = sum of all secrets from (1)
|
|
/// 3) calculate decrypt_shadow_point: decrypt_shadows_sum * result.common_point
|
|
/// 4) calculate decrypted_secret: result.decrypted_secret + decrypt_shadow_point
|
|
/// Result is a DK shadow.
|
|
fn restore_document_key_shadow(&self, key_id: &ServerKeyId, signature: &RequestSignature) -> Result<EncryptedDocumentKeyShadow, Error>;
|
|
}
|
|
|
|
/// Message signer.
|
|
pub trait MessageSigner: ServerKeyGenerator {
|
|
/// Sign message with previously generated SK.
|
|
/// `key_id` is the caller-provided identifier of generated SK.
|
|
/// `signature` is `key_id`, signed with caller public key.
|
|
/// `message` is the message to be signed.
|
|
/// Result is a signed message, encrypted with caller public key.
|
|
fn sign_message(&self, key_id: &ServerKeyId, signature: &RequestSignature, message: MessageHash) -> Result<EncryptedMessageSignature, Error>;
|
|
}
|
|
|
|
/// Administrative sessions server.
|
|
pub trait AdminSessionsServer {
|
|
/// Change servers set so that nodes in new_servers_set became owners of shares for all keys.
|
|
/// And old nodes (i.e. cluste nodes except new_servers_set) have clear databases.
|
|
/// WARNING: newly generated keys will be distributed among all cluster nodes. So this session
|
|
/// must be followed with cluster nodes change (either via contract, or config files).
|
|
fn change_servers_set(&self, old_set_signature: RequestSignature, new_set_signature: RequestSignature, new_servers_set: BTreeSet<NodeId>) -> Result<(), Error>;
|
|
}
|
|
|
|
/// Key server.
|
|
pub trait KeyServer: AdminSessionsServer + DocumentKeyServer + MessageSigner + Send + Sync {
|
|
}
|