SecretStore: encrypt messages using private key from key store (#6146)
* do not cache ACL storage contract * when error comes before initialization * initial KeyServerSet commit * update_nodes_set in maintain * do not connect to self * fixed connection establishing * removed println * improved KeyServerSet tracing * moved parsing to KeyServerSet * re-read only when blockchain is changed * do not try to connect if not a part of cluster * improved logging * fixed tests * NodeKeyPAir trait * fixed parity to use new trait * continue integrating with parity * updated parity for NodeKeyPair * completed KeyStoreNodeKeyPair * removed comment * removed dependency && style
This commit is contained in:
committed by
Arkadiy Paronyan
parent
d209100a60
commit
33ba5b63f3
@@ -14,7 +14,8 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use ethkey::{KeyPair, sign, Address, Signature, Message, Public};
|
||||
use ethkey::{KeyPair, sign, Address, Signature, Message, Public, Secret};
|
||||
use crypto::ecdh::agree;
|
||||
use {json, Error, crypto};
|
||||
use account::Version;
|
||||
use super::crypto::Crypto;
|
||||
@@ -135,6 +136,12 @@ impl SafeAccount {
|
||||
crypto::ecies::decrypt(&secret, shared_mac, message).map_err(From::from)
|
||||
}
|
||||
|
||||
/// Agree on shared key.
|
||||
pub fn agree(&self, password: &str, other: &Public) -> Result<Secret, Error> {
|
||||
let secret = self.crypto.secret(password)?;
|
||||
agree(&secret, other).map_err(From::from)
|
||||
}
|
||||
|
||||
/// Derive public key.
|
||||
pub fn public(&self, password: &str) -> Result<Public, Error> {
|
||||
let secret = self.crypto.secret(password)?;
|
||||
|
||||
@@ -97,6 +97,10 @@ impl SimpleSecretStore for EthStore {
|
||||
self.store.sign_derived(account_ref, password, derivation, message)
|
||||
}
|
||||
|
||||
fn agree(&self, account: &StoreAccountRef, password: &str, other: &Public) -> Result<Secret, Error> {
|
||||
self.store.agree(account, password, other)
|
||||
}
|
||||
|
||||
fn decrypt(&self, account: &StoreAccountRef, password: &str, shared_mac: &[u8], message: &[u8]) -> Result<Vec<u8>, Error> {
|
||||
let account = self.get(account)?;
|
||||
account.decrypt(password, shared_mac, message)
|
||||
@@ -495,18 +499,26 @@ impl SimpleSecretStore for EthMultiStore {
|
||||
|
||||
fn sign(&self, account: &StoreAccountRef, password: &str, message: &Message) -> Result<Signature, Error> {
|
||||
let accounts = self.get_matching(account, password)?;
|
||||
for account in accounts {
|
||||
return account.sign(password, message);
|
||||
match accounts.first() {
|
||||
Some(ref account) => account.sign(password, message),
|
||||
None => Err(Error::InvalidPassword),
|
||||
}
|
||||
Err(Error::InvalidPassword)
|
||||
}
|
||||
|
||||
fn decrypt(&self, account: &StoreAccountRef, password: &str, shared_mac: &[u8], message: &[u8]) -> Result<Vec<u8>, Error> {
|
||||
let accounts = self.get_matching(account, password)?;
|
||||
for account in accounts {
|
||||
return account.decrypt(password, shared_mac, message);
|
||||
match accounts.first() {
|
||||
Some(ref account) => account.decrypt(password, shared_mac, message),
|
||||
None => Err(Error::InvalidPassword),
|
||||
}
|
||||
}
|
||||
|
||||
fn agree(&self, account: &StoreAccountRef, password: &str, other: &Public) -> Result<Secret, Error> {
|
||||
let accounts = self.get_matching(account, password)?;
|
||||
match accounts.first() {
|
||||
Some(ref account) => account.agree(password, other),
|
||||
None => Err(Error::InvalidPassword),
|
||||
}
|
||||
Err(Error::InvalidPassword)
|
||||
}
|
||||
|
||||
fn create_vault(&self, name: &str, password: &str) -> Result<(), Error> {
|
||||
|
||||
@@ -60,6 +60,8 @@ pub trait SimpleSecretStore: Send + Sync {
|
||||
fn sign_derived(&self, account_ref: &StoreAccountRef, password: &str, derivation: Derivation, message: &Message) -> Result<Signature, Error>;
|
||||
/// Decrypt a messages with given account.
|
||||
fn decrypt(&self, account: &StoreAccountRef, password: &str, shared_mac: &[u8], message: &[u8]) -> Result<Vec<u8>, Error>;
|
||||
/// Agree on shared key.
|
||||
fn agree(&self, account: &StoreAccountRef, password: &str, other: &Public) -> Result<Secret, Error>;
|
||||
|
||||
/// Returns all accounts in this secret store.
|
||||
fn accounts(&self) -> Result<Vec<StoreAccountRef>, Error>;
|
||||
|
||||
Reference in New Issue
Block a user