Update ring crates, update ring AEAD functionality to new ring API (#341)

This commit is contained in:
Yeastplume 2020-02-24 12:03:09 +00:00 committed by GitHub
parent 1ced8990b9
commit 9213559548
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 796 additions and 253 deletions

978
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -20,7 +20,7 @@ serde_derive = "1"
serde_json = "1"
easy-jsonrpc-mw = "0.5.3"
chrono = { version = "0.4.4", features = ["serde"] }
ring = "0.13"
ring = "0.16"
base64 = "0.9"
ed25519-dalek = "1.0.0-pre.1"

View file

@ -21,7 +21,7 @@ serde_derive = "1"
serde_json = "1"
log = "0.4"
prettytable-rs = "0.7"
ring = "0.13"
ring = "0.16"
term = "0.5"
tokio = "= 0.1.11"
tokio-core = "0.1"

View file

@ -20,7 +20,7 @@ serde = "1"
serde_derive = "1"
serde_json = "1"
log = "0.4"
ring = "0.13"
ring = "0.16"
tokio = "= 0.1.11"
tokio-core = "0.1"
tokio-retry = "0.1"
@ -31,8 +31,8 @@ jsonrpc-client-http = "0.5.0"
#http client (copied from grin)
http = "0.1.5"
hyper-rustls = "0.14"
hyper-timeout = "0.2"
hyper-rustls = "0.19"
hyper-timeout = "0.3"
#Socks/Tor
byteorder = "1"

View file

@ -12,6 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use core::num::NonZeroU32;
use std::fs::{self, File};
use std::io::{Read, Write};
use std::path::Path;
@ -22,7 +23,7 @@ use rand::{thread_rng, Rng};
use serde_json;
use ring::aead;
use ring::{digest, pbkdf2};
use ring::pbkdf2;
use crate::keychain::{mnemonic, Keychain};
use crate::util;
@ -229,6 +230,23 @@ pub struct EncryptedWalletSeed {
pub nonce: String,
}
struct RandomNonce;
impl aead::NonceSequence for RandomNonce {
fn advance(&mut self) -> Result<aead::Nonce, ring::error::Unspecified> {
let nonce: [u8; 12] = thread_rng().gen();
Ok(aead::Nonce::assume_unique_for_key(nonce))
}
}
struct OpeningNonce([u8; 12]);
impl aead::NonceSequence for OpeningNonce {
fn advance(&mut self) -> Result<aead::Nonce, ring::error::Unspecified> {
Ok(aead::Nonce::assume_unique_for_key(self.0))
}
}
impl EncryptedWalletSeed {
/// Create a new encrypted seed from the given seed + password
pub fn from_seed(
@ -238,18 +256,26 @@ impl EncryptedWalletSeed {
let salt: [u8; 8] = thread_rng().gen();
let nonce: [u8; 12] = thread_rng().gen();
let password = password.as_bytes();
let mut key = [0; 32];
pbkdf2::derive(&digest::SHA512, 100, &salt, password, &mut key);
let mut key = [0; 64];
pbkdf2::derive(
ring::pbkdf2::PBKDF2_HMAC_SHA512,
NonZeroU32::new_unchecked(100),
&salt,
password,
&mut key,
);
let content = seed.0.to_vec();
let mut enc_bytes = content;
let suffix_len = aead::CHACHA20_POLY1305.tag_len();
for _ in 0..suffix_len {
enc_bytes.push(0);
}
let sealing_key =
aead::SealingKey::new(&aead::CHACHA20_POLY1305, &key).context(ErrorKind::Encryption)?;
aead::seal_in_place(&sealing_key, &nonce, &[], &mut enc_bytes, suffix_len)
.context(ErrorKind::Encryption)?;
let unbound_key = aead::UnboundKey::new(&aead::CHACHA20_POLY1305, &key).unwrap();
let sealing_key: aead::SealingKey<RandomNonce> =
aead::BoundKey::new(unbound_key, RandomNonce);
let aad = aead::Aad::empty();
sealing_key.seal_in_place_append_tag(aad, &mut enc_bytes);
Ok(EncryptedWalletSeed {
encrypted_seed: util::to_hex(enc_bytes.to_vec()),
salt: util::to_hex(salt.to_vec()),
@ -273,14 +299,23 @@ impl EncryptedWalletSeed {
};
let password = password.as_bytes();
let mut key = [0; 32];
pbkdf2::derive(&digest::SHA512, 100, &salt, password, &mut key);
pbkdf2::derive(
ring::pbkdf2::PBKDF2_HMAC_SHA512,
NonZeroU32::new_unchecked(100),
&salt,
password,
&mut key,
);
let opening_key =
aead::OpeningKey::new(&aead::CHACHA20_POLY1305, &key).context(ErrorKind::Encryption)?;
let decrypted_data = aead::open_in_place(&opening_key, &nonce, &[], 0, &mut encrypted_seed)
.context(ErrorKind::Encryption)?;
let mut n = [0u8; 12];
n.copy_from_slice(&nonce[0..12]);
let nonce = OpeningNonce(n);
let unbound_key = aead::UnboundKey::new(&aead::CHACHA20_POLY1305, &key).unwrap();
let opening_key: aead::OpeningKey<OpeningNonce> = aead::BoundKey::new(unbound_key, nonce);
let aad = aead::Aad::empty();
opening_key.open_in_place(aad, &mut encrypted_seed);
Ok(WalletSeed::from_bytes(&decrypted_data))
Ok(WalletSeed::from_bytes(&encrypted_seed))
}
}