Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

SecretStore: versioned keys #6910

Merged
merged 43 commits into from
Nov 2, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
81b97c1
SecretStore: first key versions flush
svyatonik Oct 10, 2017
cb3af63
SecretStore: key versions in encryption session
svyatonik Oct 10, 2017
dedf03b
SecretStore: flush key versions negotiation session
svyatonik Oct 11, 2017
a748a0b
SecretStore: connected key version negotiation session to cluster
svyatonik Oct 11, 2017
402a8e0
SecretStore: cluster sessions container refactoring
svyatonik Oct 12, 2017
b03a43a
SecretStore: flush
svyatonik Oct 13, 2017
3f443f0
SecretStore: flush key versions
svyatonik Oct 16, 2017
187e1fd
SecretStore: flush
svyatonik Oct 16, 2017
782080a
SecretStore: delegation proto
svyatonik Oct 16, 2017
5c448b2
Merge branch 'master' into secretstore_key_version
svyatonik Oct 16, 2017
45c7637
SecretStore: decryption_session_is_delegated_when_node_does_not_have_…
svyatonik Oct 17, 2017
d7a4b03
SecretStore: fixed version in decryption session
svyatonik Oct 17, 2017
0f61db3
SecretStore: signing_session_is_delegated_when_node_does_not_have_key…
svyatonik Oct 17, 2017
7a98951
SecretStore: started restoring admin sessions
svyatonik Oct 18, 2017
9036b17
SecretStore: restoring admin sessions
svyatonik Oct 19, 2017
18cbea8
SecretStore: removed obsolete ShareRemove && ShareMove sessions
svyatonik Oct 19, 2017
4f535f4
SecretStore: ShareAdd math tests only require old_t+1 nodes
svyatonik Oct 23, 2017
117cbb6
SecretStore: ShareAdd revamp using new math backend
svyatonik Oct 24, 2017
6a5144a
SecretStore: do not include isolated nodes into consensus_group
svyatonik Oct 24, 2017
873b185
SecretStore: ServersSetChange + ShareAdd revamp
svyatonik Oct 24, 2017
f1f6fa4
removed debug printlns
svyatonik Oct 24, 2017
cb403b9
SecretStore: key version negotiation tests
svyatonik Oct 24, 2017
9ad693c
SecretStore: removed debug/merge artifacts
svyatonik Oct 24, 2017
4d2b29a
SecretStore: fixed master node selection
svyatonik Oct 24, 2017
c35b9bd
SecretStore: cleanup + tests + fixes
svyatonik Oct 25, 2017
1093393
SecretStore: uncommented tests
svyatonik Oct 25, 2017
232b3d0
SecretStore: cleaning up
svyatonik Oct 25, 2017
9972832
SecretStore: cleaning up + tests
svyatonik Oct 25, 2017
e74774c
SecretStore: cleaning up
svyatonik Oct 25, 2017
07f1bf3
SecretStore: cleaning up && tests
svyatonik Oct 25, 2017
1a6a6f5
SecretStore: fixing TODOs
svyatonik Oct 25, 2017
0c52239
SecretStore: fixing TODOs + cleanup
svyatonik Oct 25, 2017
5328d5e
SecretStore: fixing TODOs
svyatonik Oct 25, 2017
646bb7b
SecretStore: nodes_add_to_the_node_with_obsolete_version
svyatonik Oct 26, 2017
811e01c
SecretStore: nodes_add_fails_when_not_enough_share_owners_are_connected
svyatonik Oct 26, 2017
cd3cdf5
SecretStore: tests
svyatonik Oct 26, 2017
705e4a1
SecretStore: signing && delegation tests
svyatonik Oct 26, 2017
f5a13f1
SecretStore: signing && decryption tests when some nodes are isolated
svyatonik Oct 26, 2017
580ab02
SecretStore: sessions_are_removed_when_initialization_fails
svyatonik Oct 26, 2017
aed908a
SecretStore: ceaning up
svyatonik Oct 26, 2017
56de751
Merge branch 'master' into secretstore_key_version
svyatonik Oct 26, 2017
e76ea31
SecretStore: removed obsolete comments
svyatonik Oct 26, 2017
eb55573
SecretStore: signing_session_completes_if_node_does_not_have_a_share
svyatonik Oct 27, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
54 changes: 51 additions & 3 deletions secret_store/src/key_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ impl DocumentKeyServer for KeyServerImpl {
.map_err(|_| Error::BadSignature)?;

// decrypt document key
let decryption_session = self.data.lock().cluster.new_decryption_session(key_id.clone(), signature.clone(), false)?;
let decryption_session = self.data.lock().cluster.new_decryption_session(key_id.clone(), signature.clone(), None, false)?;
let document_key = decryption_session.wait()?.decrypted_secret;

// encrypt document key with requestor public key
Expand All @@ -116,7 +116,7 @@ impl DocumentKeyServer for KeyServerImpl {
}

fn restore_document_key_shadow(&self, key_id: &ServerKeyId, signature: &RequestSignature) -> Result<EncryptedDocumentKeyShadow, Error> {
let decryption_session = self.data.lock().cluster.new_decryption_session(key_id.clone(), signature.clone(), true)?;
let decryption_session = self.data.lock().cluster.new_decryption_session(key_id.clone(), signature.clone(), None, true)?;
decryption_session.wait().map_err(Into::into)
}
}
Expand All @@ -128,7 +128,7 @@ impl MessageSigner for KeyServerImpl {
.map_err(|_| Error::BadSignature)?;

// sign message
let signing_session = self.data.lock().cluster.new_signing_session(key_id.clone(), signature.clone(), message)?;
let signing_session = self.data.lock().cluster.new_signing_session(key_id.clone(), signature.clone(), None, message)?;
let message_signature = signing_session.wait()?;

// compose two message signature components into single one
Expand Down Expand Up @@ -396,4 +396,52 @@ pub mod tests {
assert_eq!(math::verify_signature(&server_public, &(signature_c, signature_s), &message_hash), Ok(true));
}
}

#[test]
fn decryption_session_is_delegated_when_node_does_not_have_key_share() {
//::logger::init_log();
let key_servers = make_key_servers(6110, 3);

// generate document key
let threshold = 0;
let document = Random.generate().unwrap().secret().clone();
let secret = Random.generate().unwrap().secret().clone();
let signature = ethkey::sign(&secret, &document).unwrap();
let generated_key = key_servers[0].generate_document_key(&document, &signature, threshold).unwrap();
let generated_key = ethcrypto::ecies::decrypt(&secret, &ethcrypto::DEFAULT_MAC, &generated_key).unwrap();

// remove key from node0
key_servers[0].cluster().key_storage().remove(&document).unwrap();

// now let's try to retrieve key back by requesting it from node0, so that session must be delegated
let retrieved_key = key_servers[0].restore_document_key(&document, &signature).unwrap();
let retrieved_key = ethcrypto::ecies::decrypt(&secret, &ethcrypto::DEFAULT_MAC, &retrieved_key).unwrap();
assert_eq!(retrieved_key, generated_key);
}

#[test]
fn signing_session_is_delegated_when_node_does_not_have_key_share() {
//::logger::init_log();
let key_servers = make_key_servers(6114, 3);
let threshold = 1;

// generate server key
let server_key_id = Random.generate().unwrap().secret().clone();
let requestor_secret = Random.generate().unwrap().secret().clone();
let signature = ethkey::sign(&requestor_secret, &server_key_id).unwrap();
let server_public = key_servers[0].generate_key(&server_key_id, &signature, threshold).unwrap();

// remove key from node0
key_servers[0].cluster().key_storage().remove(&server_key_id).unwrap();

// sign message
let message_hash = H256::from(42);
let combined_signature = key_servers[0].sign_message(&server_key_id, &signature, message_hash.clone()).unwrap();
let combined_signature = ethcrypto::ecies::decrypt(&requestor_secret, &ethcrypto::DEFAULT_MAC, &combined_signature).unwrap();
let signature_c = Secret::from_slice(&combined_signature[..32]);
let signature_s = Secret::from_slice(&combined_signature[32..]);

// check signature
assert_eq!(math::verify_signature(&server_public, &(signature_c, signature_s), &message_hash), Ok(true));
}
}