Remove ethcrypto::{en,de}crypt_single_message
. (#8126)
Both functions are no longer in use within the parity code base.
This commit is contained in:
parent
6f5bd845ad
commit
c737056000
@ -205,7 +205,7 @@ pub mod ecies {
|
|||||||
use rcrypto::mac::Mac;
|
use rcrypto::mac::Mac;
|
||||||
use ethereum_types::H128;
|
use ethereum_types::H128;
|
||||||
use ethkey::{Random, Generator, Public, Secret};
|
use ethkey::{Random, Generator, Public, Secret};
|
||||||
use {Error, ecdh, aes, Keccak256};
|
use {Error, ecdh, aes};
|
||||||
|
|
||||||
/// Encrypt a message with a public key, writing an HMAC covering both
|
/// Encrypt a message with a public key, writing an HMAC covering both
|
||||||
/// the plaintext and authenticated data.
|
/// the plaintext and authenticated data.
|
||||||
@ -247,33 +247,6 @@ pub mod ecies {
|
|||||||
Ok(msg)
|
Ok(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Encrypt a message with a public key and no HMAC
|
|
||||||
pub fn encrypt_single_message(public: &Public, plain: &[u8]) -> Result<Vec<u8>, Error> {
|
|
||||||
let r = Random.generate()
|
|
||||||
.expect("context known to have key-generation capabilities");
|
|
||||||
|
|
||||||
let z = ecdh::agree(r.secret(), public)?;
|
|
||||||
let mut key = [0u8; 32];
|
|
||||||
let mut mkey = [0u8; 32];
|
|
||||||
kdf(&z, &[0u8; 0], &mut key);
|
|
||||||
let mut hasher = Sha256::new();
|
|
||||||
let mkey_material = &key[16..32];
|
|
||||||
hasher.input(mkey_material);
|
|
||||||
hasher.result(&mut mkey);
|
|
||||||
let ekey = &key[0..16];
|
|
||||||
|
|
||||||
let mut msgd = vec![0u8; 64 + plain.len()];
|
|
||||||
{
|
|
||||||
r.public().copy_to(&mut msgd[0..64]);
|
|
||||||
let iv = H128::from_slice(&z.keccak256()[0..16]);
|
|
||||||
{
|
|
||||||
let cipher = &mut msgd[64..(64 + plain.len())];
|
|
||||||
aes::encrypt(ekey, &iv, plain, cipher);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(msgd)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Decrypt a message with a secret key, checking HMAC for ciphertext
|
/// Decrypt a message with a secret key, checking HMAC for ciphertext
|
||||||
/// and authenticated data validity.
|
/// and authenticated data validity.
|
||||||
pub fn decrypt(secret: &Secret, auth_data: &[u8], encrypted: &[u8]) -> Result<Vec<u8>, Error> {
|
pub fn decrypt(secret: &Secret, auth_data: &[u8], encrypted: &[u8]) -> Result<Vec<u8>, Error> {
|
||||||
@ -317,33 +290,6 @@ pub mod ecies {
|
|||||||
Ok(msg)
|
Ok(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Decrypt single message with a secret key and no HMAC.
|
|
||||||
pub fn decrypt_single_message(secret: &Secret, encrypted: &[u8]) -> Result<Vec<u8>, Error> {
|
|
||||||
let meta_len = 64;
|
|
||||||
if encrypted.len() < meta_len {
|
|
||||||
return Err(Error::InvalidMessage); //invalid message: publickey
|
|
||||||
}
|
|
||||||
|
|
||||||
let e = encrypted;
|
|
||||||
let p = Public::from_slice(&e[0..64]);
|
|
||||||
let z = ecdh::agree(secret, &p)?;
|
|
||||||
let mut key = [0u8; 32];
|
|
||||||
kdf(&z, &[0u8; 0], &mut key);
|
|
||||||
let ekey = &key[0..16];
|
|
||||||
let mkey_material = &key[16..32];
|
|
||||||
let mut hasher = Sha256::new();
|
|
||||||
let mut mkey = [0u8; 32];
|
|
||||||
hasher.input(mkey_material);
|
|
||||||
hasher.result(&mut mkey);
|
|
||||||
|
|
||||||
let clen = encrypted.len() - meta_len;
|
|
||||||
let cipher = &e[64..(64+clen)];
|
|
||||||
let mut msg = vec![0u8; clen];
|
|
||||||
let iv = H128::from_slice(&z.keccak256()[0..16]);
|
|
||||||
aes::decrypt(ekey, &iv, cipher, &mut msg[..]);
|
|
||||||
Ok(msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn kdf(secret: &Secret, s1: &[u8], dest: &mut [u8]) {
|
fn kdf(secret: &Secret, s1: &[u8], dest: &mut [u8]) {
|
||||||
let mut hasher = Sha256::new();
|
let mut hasher = Sha256::new();
|
||||||
// SEC/ISO/Shoup specify counter size SHOULD be equivalent
|
// SEC/ISO/Shoup specify counter size SHOULD be equivalent
|
||||||
@ -384,15 +330,5 @@ mod tests {
|
|||||||
let decrypted = ecies::decrypt(kp.secret(), shared, &encrypted).unwrap();
|
let decrypted = ecies::decrypt(kp.secret(), shared, &encrypted).unwrap();
|
||||||
assert_eq!(decrypted[..message.len()], message[..]);
|
assert_eq!(decrypted[..message.len()], message[..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn ecies_shared_single() {
|
|
||||||
let kp = Random.generate().unwrap();
|
|
||||||
let message = b"So many books, so little time";
|
|
||||||
let encrypted = ecies::encrypt_single_message(kp.public(), message).unwrap();
|
|
||||||
assert!(encrypted[..] != message[..]);
|
|
||||||
let decrypted = ecies::decrypt_single_message(kp.secret(), &encrypted).unwrap();
|
|
||||||
assert_eq!(decrypted[..message.len()], message[..]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user