fixing issues and moving
This commit is contained in:
parent
31762095b7
commit
017a1adb24
@ -20,59 +20,39 @@ use util::*;
|
|||||||
use header::BlockNumber;
|
use header::BlockNumber;
|
||||||
use basic_types::LogBloom;
|
use basic_types::LogBloom;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
|
||||||
/// Error indicating an expected value was not found.
|
|
||||||
pub struct Mismatch<T: fmt::Debug> {
|
|
||||||
/// Value expected.
|
|
||||||
pub expected: T,
|
|
||||||
/// Value found.
|
|
||||||
pub found: T,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
|
||||||
/// Error indicating value found is outside of a valid range.
|
|
||||||
pub struct OutOfBounds<T: fmt::Debug> {
|
|
||||||
/// Minimum allowed value.
|
|
||||||
pub min: Option<T>,
|
|
||||||
/// Maximum allowed value.
|
|
||||||
pub max: Option<T>,
|
|
||||||
/// Value found.
|
|
||||||
pub found: T,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Result of executing the transaction.
|
/// Result of executing the transaction.
|
||||||
#[derive(PartialEq, Debug)]
|
#[derive(PartialEq, Debug)]
|
||||||
pub enum ExecutionError {
|
pub enum ExecutionError {
|
||||||
/// Returned when there gas paid for transaction execution is
|
/// Returned when there gas paid for transaction execution is
|
||||||
/// lower than base gas required.
|
/// lower than base gas required.
|
||||||
NotEnoughBaseGas {
|
NotEnoughBaseGas {
|
||||||
/// Absolute minimum gas required.
|
/// Absolute minimum gas required.
|
||||||
required: U256,
|
required: U256,
|
||||||
/// Gas provided.
|
/// Gas provided.
|
||||||
got: U256
|
got: U256
|
||||||
},
|
},
|
||||||
/// Returned when block (gas_used + gas) > gas_limit.
|
/// Returned when block (gas_used + gas) > gas_limit.
|
||||||
///
|
///
|
||||||
/// If gas =< gas_limit, upstream may try to execute the transaction
|
/// If gas =< gas_limit, upstream may try to execute the transaction
|
||||||
/// in next block.
|
/// in next block.
|
||||||
BlockGasLimitReached {
|
BlockGasLimitReached {
|
||||||
/// Gas limit of block for transaction.
|
/// Gas limit of block for transaction.
|
||||||
gas_limit: U256,
|
gas_limit: U256,
|
||||||
/// Gas used in block prior to transaction.
|
/// Gas used in block prior to transaction.
|
||||||
gas_used: U256,
|
gas_used: U256,
|
||||||
/// Amount of gas in block.
|
/// Amount of gas in block.
|
||||||
gas: U256
|
gas: U256
|
||||||
},
|
},
|
||||||
/// Returned when transaction nonce does not match state nonce.
|
/// Returned when transaction nonce does not match state nonce.
|
||||||
InvalidNonce {
|
InvalidNonce {
|
||||||
/// Nonce expected.
|
/// Nonce expected.
|
||||||
expected: U256,
|
expected: U256,
|
||||||
/// Nonce found.
|
/// Nonce found.
|
||||||
got: U256
|
got: U256
|
||||||
},
|
},
|
||||||
/// Returned when cost of transaction (value + gas_price * gas) exceeds
|
/// Returned when cost of transaction (value + gas_price * gas) exceeds
|
||||||
/// current sender balance.
|
/// current sender balance.
|
||||||
NotEnoughCash {
|
NotEnoughCash {
|
||||||
/// Minimum required balance.
|
/// Minimum required balance.
|
||||||
required: U512,
|
required: U512,
|
||||||
/// Actual balance.
|
/// Actual balance.
|
||||||
|
@ -108,7 +108,6 @@ pub mod spec;
|
|||||||
pub mod transaction;
|
pub mod transaction;
|
||||||
pub mod views;
|
pub mod views;
|
||||||
pub mod receipt;
|
pub mod receipt;
|
||||||
pub mod keys_directory;
|
|
||||||
|
|
||||||
mod common;
|
mod common;
|
||||||
mod basic_types;
|
mod basic_types;
|
||||||
|
@ -46,15 +46,6 @@ impl RandomTempPath {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_dir() -> RandomTempPath {
|
|
||||||
let mut dir = env::temp_dir();
|
|
||||||
dir.push(H32::random().hex());
|
|
||||||
fs::create_dir_all(dir.as_path()).unwrap();
|
|
||||||
RandomTempPath {
|
|
||||||
path: dir.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn as_path(&self) -> &PathBuf {
|
pub fn as_path(&self) -> &PathBuf {
|
||||||
&self.path
|
&self.path
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ use rustc_serialize::hex::FromHexError;
|
|||||||
use network::NetworkError;
|
use network::NetworkError;
|
||||||
use rlp::DecoderError;
|
use rlp::DecoderError;
|
||||||
use io;
|
use io;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
/// Error in database subsystem.
|
/// Error in database subsystem.
|
||||||
@ -55,6 +56,27 @@ pub enum UtilError {
|
|||||||
BadSize,
|
BadSize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
/// Error indicating an expected value was not found.
|
||||||
|
pub struct Mismatch<T: fmt::Debug> {
|
||||||
|
/// Value expected.
|
||||||
|
pub expected: T,
|
||||||
|
/// Value found.
|
||||||
|
pub found: T,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
/// Error indicating value found is outside of a valid range.
|
||||||
|
pub struct OutOfBounds<T: fmt::Debug> {
|
||||||
|
/// Minimum allowed value.
|
||||||
|
pub min: Option<T>,
|
||||||
|
/// Maximum allowed value.
|
||||||
|
pub max: Option<T>,
|
||||||
|
/// Value found.
|
||||||
|
pub found: T,
|
||||||
|
}
|
||||||
|
|
||||||
impl From<FromHexError> for UtilError {
|
impl From<FromHexError> for UtilError {
|
||||||
fn from(err: FromHexError) -> UtilError {
|
fn from(err: FromHexError) -> UtilError {
|
||||||
UtilError::FromHex(err)
|
UtilError::FromHex(err)
|
||||||
|
@ -43,12 +43,11 @@ pub enum Pbkdf2CryptoFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
#[allow(non_snake_case)]
|
|
||||||
/// Kdf of type `Pbkdf2`
|
/// Kdf of type `Pbkdf2`
|
||||||
/// https://en.wikipedia.org/wiki/PBKDF2
|
/// https://en.wikipedia.org/wiki/PBKDF2
|
||||||
pub struct KdfPbkdf2Params {
|
pub struct KdfPbkdf2Params {
|
||||||
/// desired length of the derived key, in octets
|
/// desired length of the derived key, in octets
|
||||||
pub dkLen: u32,
|
pub dk_len: u32,
|
||||||
/// cryptographic salt
|
/// cryptographic salt
|
||||||
pub salt: H256,
|
pub salt: H256,
|
||||||
/// number of iterations for derived key
|
/// number of iterations for derived key
|
||||||
@ -80,14 +79,14 @@ impl KdfPbkdf2Params {
|
|||||||
Some(unexpected_prf) => { return Err(Pbkdf2ParseError::InvalidPrf(Mismatch { expected: "hmac-sha256".to_owned(), found: unexpected_prf.to_owned() })); },
|
Some(unexpected_prf) => { return Err(Pbkdf2ParseError::InvalidPrf(Mismatch { expected: "hmac-sha256".to_owned(), found: unexpected_prf.to_owned() })); },
|
||||||
None => { return Err(Pbkdf2ParseError::InvalidParameter("prf")); },
|
None => { return Err(Pbkdf2ParseError::InvalidParameter("prf")); },
|
||||||
},
|
},
|
||||||
dkLen: try!(try!(json.get("dklen").ok_or(Pbkdf2ParseError::MissingParameter("dklen"))).as_u64().ok_or(Pbkdf2ParseError::InvalidParameter("dkLen"))) as u32,
|
dk_len: try!(try!(json.get("dklen").ok_or(Pbkdf2ParseError::MissingParameter("dklen"))).as_u64().ok_or(Pbkdf2ParseError::InvalidParameter("dkLen"))) as u32,
|
||||||
c: try!(try!(json.get("c").ok_or(Pbkdf2ParseError::MissingParameter("c"))).as_u64().ok_or(Pbkdf2ParseError::InvalidParameter("c"))) as u32,
|
c: try!(try!(json.get("c").ok_or(Pbkdf2ParseError::MissingParameter("c"))).as_u64().ok_or(Pbkdf2ParseError::InvalidParameter("c"))) as u32,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_json(&self) -> Json {
|
fn to_json(&self) -> Json {
|
||||||
let mut map = BTreeMap::new();
|
let mut map = BTreeMap::new();
|
||||||
map.insert("dklen".to_owned(), json_from_u32(self.dkLen));
|
map.insert("dklen".to_owned(), json_from_u32(self.dk_len));
|
||||||
map.insert("salt".to_owned(), Json::String(format!("{:?}", self.salt)));
|
map.insert("salt".to_owned(), Json::String(format!("{:?}", self.salt)));
|
||||||
map.insert("prf".to_owned(), Json::String("hmac-sha256".to_owned()));
|
map.insert("prf".to_owned(), Json::String("hmac-sha256".to_owned()));
|
||||||
map.insert("c".to_owned(), json_from_u32(self.c));
|
map.insert("c".to_owned(), json_from_u32(self.c));
|
||||||
@ -96,12 +95,11 @@ impl KdfPbkdf2Params {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
#[allow(non_snake_case)]
|
|
||||||
/// Kdf of type `Scrypt`.
|
/// Kdf of type `Scrypt`.
|
||||||
/// https://en.wikipedia.org/wiki/Scrypt
|
/// https://en.wikipedia.org/wiki/Scrypt
|
||||||
pub struct KdfScryptParams {
|
pub struct KdfScryptParams {
|
||||||
/// Desired length of the derived key, in octets.
|
/// Desired length of the derived key, in octets.
|
||||||
pub dkLen: u32,
|
pub dk_len: u32,
|
||||||
/// Parallelization parameter.
|
/// Parallelization parameter.
|
||||||
pub p: u32,
|
pub p: u32,
|
||||||
/// CPU/memory cost parameter.
|
/// CPU/memory cost parameter.
|
||||||
@ -131,7 +129,7 @@ impl KdfScryptParams {
|
|||||||
Err(from_hex_error) => { return Err(ScryptParseError::InvalidSaltFormat(from_hex_error)); },
|
Err(from_hex_error) => { return Err(ScryptParseError::InvalidSaltFormat(from_hex_error)); },
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
dkLen: try!(try!(json.get("dklen").ok_or(ScryptParseError::MissingParameter("dklen"))).as_u64().ok_or(ScryptParseError::InvalidParameter("dkLen"))) as u32,
|
dk_len: try!(try!(json.get("dklen").ok_or(ScryptParseError::MissingParameter("dklen"))).as_u64().ok_or(ScryptParseError::InvalidParameter("dkLen"))) as u32,
|
||||||
p: try!(try!(json.get("p").ok_or(ScryptParseError::MissingParameter("p"))).as_u64().ok_or(ScryptParseError::InvalidParameter("p"))) as u32,
|
p: try!(try!(json.get("p").ok_or(ScryptParseError::MissingParameter("p"))).as_u64().ok_or(ScryptParseError::InvalidParameter("p"))) as u32,
|
||||||
n: try!(try!(json.get("n").ok_or(ScryptParseError::MissingParameter("n"))).as_u64().ok_or(ScryptParseError::InvalidParameter("n"))) as u32,
|
n: try!(try!(json.get("n").ok_or(ScryptParseError::MissingParameter("n"))).as_u64().ok_or(ScryptParseError::InvalidParameter("n"))) as u32,
|
||||||
r: try!(try!(json.get("r").ok_or(ScryptParseError::MissingParameter("r"))).as_u64().ok_or(ScryptParseError::InvalidParameter("r"))) as u32,
|
r: try!(try!(json.get("r").ok_or(ScryptParseError::MissingParameter("r"))).as_u64().ok_or(ScryptParseError::InvalidParameter("r"))) as u32,
|
||||||
@ -140,7 +138,7 @@ impl KdfScryptParams {
|
|||||||
|
|
||||||
fn to_json(&self) -> Json {
|
fn to_json(&self) -> Json {
|
||||||
let mut map = BTreeMap::new();
|
let mut map = BTreeMap::new();
|
||||||
map.insert("dklen".to_owned(), json_from_u32(self.dkLen));
|
map.insert("dklen".to_owned(), json_from_u32(self.dk_len));
|
||||||
map.insert("salt".to_owned(), Json::String(format!("{:?}", self.salt)));
|
map.insert("salt".to_owned(), Json::String(format!("{:?}", self.salt)));
|
||||||
map.insert("p".to_owned(), json_from_u32(self.p));
|
map.insert("p".to_owned(), json_from_u32(self.p));
|
||||||
map.insert("n".to_owned(), json_from_u32(self.n));
|
map.insert("n".to_owned(), json_from_u32(self.n));
|
||||||
@ -267,7 +265,7 @@ impl KeyFileCrypto {
|
|||||||
cipher_type: CryptoCipherType::Aes128Ctr(iv),
|
cipher_type: CryptoCipherType::Aes128Ctr(iv),
|
||||||
cipher_text: cipher_text,
|
cipher_text: cipher_text,
|
||||||
kdf: KeyFileKdf::Pbkdf2(KdfPbkdf2Params {
|
kdf: KeyFileKdf::Pbkdf2(KdfPbkdf2Params {
|
||||||
dkLen: dk_len,
|
dk_len: dk_len,
|
||||||
salt: salt,
|
salt: salt,
|
||||||
c: c,
|
c: c,
|
||||||
prf: Pbkdf2CryptoFunction::HMacSha256
|
prf: Pbkdf2CryptoFunction::HMacSha256
|
||||||
@ -417,10 +415,10 @@ impl KeyFileContent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum KeyLoadError {
|
enum KeyFileLoadError {
|
||||||
FileTooLarge(OutOfBounds<u64>),
|
TooLarge(OutOfBounds<u64>),
|
||||||
FileParseError(KeyFileParseError),
|
ParseError(KeyFileParseError),
|
||||||
FileReadError(::std::io::Error),
|
ReadError(::std::io::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents directory for saving/loading key files.
|
/// Represents directory for saving/loading key files.
|
||||||
@ -510,32 +508,32 @@ impl KeyDirectory {
|
|||||||
path
|
path
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_key(path: &PathBuf) -> Result<KeyFileContent, KeyLoadError> {
|
fn load_key(path: &PathBuf) -> Result<KeyFileContent, KeyFileLoadError> {
|
||||||
match fs::File::open(path.clone()) {
|
match fs::File::open(path.clone()) {
|
||||||
Ok(mut open_file) => {
|
Ok(mut open_file) => {
|
||||||
match open_file.metadata() {
|
match open_file.metadata() {
|
||||||
Ok(metadata) =>
|
Ok(metadata) =>
|
||||||
if metadata.len() > MAX_KEY_FILE_LEN { Err(KeyLoadError::FileTooLarge(OutOfBounds { min: Some(2), max: Some(MAX_KEY_FILE_LEN), found: metadata.len() })) }
|
if metadata.len() > MAX_KEY_FILE_LEN { Err(KeyFileLoadError::TooLarge(OutOfBounds { min: Some(2), max: Some(MAX_KEY_FILE_LEN), found: metadata.len() })) }
|
||||||
else { KeyDirectory::load_from_file(&mut open_file) },
|
else { KeyDirectory::load_from_file(&mut open_file) },
|
||||||
Err(read_error) => Err(KeyLoadError::FileReadError(read_error))
|
Err(read_error) => Err(KeyFileLoadError::ReadError(read_error))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Err(read_error) => Err(KeyLoadError::FileReadError(read_error))
|
Err(read_error) => Err(KeyFileLoadError::ReadError(read_error))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_from_file(file: &mut fs::File) -> Result<KeyFileContent, KeyLoadError> {
|
fn load_from_file(file: &mut fs::File) -> Result<KeyFileContent, KeyFileLoadError> {
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
match file.read_to_string(&mut buf) {
|
match file.read_to_string(&mut buf) {
|
||||||
Ok(_) => {},
|
Ok(_) => {},
|
||||||
Err(read_error) => { return Err(KeyLoadError::FileReadError(read_error)); }
|
Err(read_error) => { return Err(KeyFileLoadError::ReadError(read_error)); }
|
||||||
}
|
}
|
||||||
match Json::from_str(&buf) {
|
match Json::from_str(&buf) {
|
||||||
Ok(json) => match KeyFileContent::from_json(&json) {
|
Ok(json) => match KeyFileContent::from_json(&json) {
|
||||||
Ok(key_file_content) => Ok(key_file_content),
|
Ok(key_file_content) => Ok(key_file_content),
|
||||||
Err(parse_error) => Err(KeyLoadError::FileParseError(parse_error))
|
Err(parse_error) => Err(KeyFileLoadError::ParseError(parse_error))
|
||||||
},
|
},
|
||||||
Err(_) => Err(KeyLoadError::FileParseError(KeyFileParseError::InvalidJson))
|
Err(_) => Err(KeyFileLoadError::ParseError(KeyFileParseError::InvalidJson))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1074,7 +1072,7 @@ mod specs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn csn_store_10_keys() {
|
fn can_store_10_keys() {
|
||||||
let temp_path = RandomTempPath::create_dir();
|
let temp_path = RandomTempPath::create_dir();
|
||||||
let mut directory = KeyDirectory::new(&temp_path.as_path());
|
let mut directory = KeyDirectory::new(&temp_path.as_path());
|
||||||
|
|
19
util/src/keys/mod.rs
Normal file
19
util/src/keys/mod.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Copyright 2015, 2016 Ethcore (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/>.
|
||||||
|
|
||||||
|
//! Key management module
|
||||||
|
|
||||||
|
pub mod directory;
|
@ -141,6 +141,7 @@ pub mod io;
|
|||||||
pub mod network;
|
pub mod network;
|
||||||
pub mod log;
|
pub mod log;
|
||||||
pub mod panics;
|
pub mod panics;
|
||||||
|
pub mod keys;
|
||||||
|
|
||||||
pub use common::*;
|
pub use common::*;
|
||||||
pub use misc::*;
|
pub use misc::*;
|
||||||
@ -161,3 +162,6 @@ pub use semantic_version::*;
|
|||||||
pub use network::*;
|
pub use network::*;
|
||||||
pub use io::*;
|
pub use io::*;
|
||||||
pub use log::*;
|
pub use log::*;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests;
|
||||||
|
31
util/src/tests/helpers.rs
Normal file
31
util/src/tests/helpers.rs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
use common::*;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::fs::{remove_dir_all};
|
||||||
|
use std::env;
|
||||||
|
|
||||||
|
pub struct RandomTempPath {
|
||||||
|
path: PathBuf
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RandomTempPath {
|
||||||
|
pub fn create_dir() -> RandomTempPath {
|
||||||
|
let mut dir = env::temp_dir();
|
||||||
|
dir.push(H32::random().hex());
|
||||||
|
fs::create_dir_all(dir.as_path()).unwrap();
|
||||||
|
RandomTempPath {
|
||||||
|
path: dir.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_path(&self) -> &PathBuf {
|
||||||
|
&self.path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for RandomTempPath {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
if let Err(e) = remove_dir_all(self.as_path()) {
|
||||||
|
panic!("failed to remove temp directory, probably something failed to destroyed ({})", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1
util/src/tests/mod.rs
Normal file
1
util/src/tests/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod helpers;
|
Loading…
Reference in New Issue
Block a user