Send RLPx auth in EIP-8 format (#287)
This commit is contained in:
parent
7c9eed8d65
commit
ba011eba15
@ -20,14 +20,13 @@ use ethkey::{
|
||||
crypto::{ecdh, ecies},
|
||||
recover, sign, Generator, KeyPair, Public, Random, Secret,
|
||||
};
|
||||
use hash::write_keccak;
|
||||
use host::HostInfo;
|
||||
use io::{IoContext, StreamToken};
|
||||
use mio::tcp::*;
|
||||
use network::{Error, ErrorKind};
|
||||
use node_table::NodeId;
|
||||
use parity_bytes::Bytes;
|
||||
use rand::random;
|
||||
use rand::{random, Rng};
|
||||
use rlp::{Rlp, RlpStream};
|
||||
use std::time::Duration;
|
||||
|
||||
@ -314,25 +313,23 @@ impl Handshake {
|
||||
Message: Send + Clone + Sync + 'static,
|
||||
{
|
||||
trace!(target: "network", "Sending handshake auth to {:?}", self.connection.remote_addr_str());
|
||||
let mut data = [0u8; /*Signature::SIZE*/ 65 + /*H256::SIZE*/ 32 + /*Public::SIZE*/ 64 + /*H256::SIZE*/ 32 + 1]; //TODO: use associated constants
|
||||
let len = data.len();
|
||||
{
|
||||
data[len - 1] = 0x0;
|
||||
let (sig, rest) = data.split_at_mut(65);
|
||||
let (hepubk, rest) = rest.split_at_mut(32);
|
||||
let (pubk, rest) = rest.split_at_mut(64);
|
||||
let (nonce, _) = rest.split_at_mut(32);
|
||||
|
||||
// E(remote-pubk, S(ecdhe-random, ecdh-shared-secret^nonce) || H(ecdhe-random-pubk) || pubk || nonce || 0x0)
|
||||
let shared = *ecdh::agree(secret, &self.id)?;
|
||||
sig.copy_from_slice(&*sign(self.ecdhe.secret(), &(shared ^ self.nonce))?);
|
||||
write_keccak(self.ecdhe.public(), hepubk);
|
||||
pubk.copy_from_slice(public);
|
||||
nonce.copy_from_slice(&self.nonce);
|
||||
}
|
||||
let message = ecies::encrypt(&self.id, &[], &data)?;
|
||||
self.auth_cipher = message.clone();
|
||||
self.connection.send(io, message);
|
||||
let mut rlp = RlpStream::new_list(4);
|
||||
let shared = *ecdh::agree(secret, &self.id)?;
|
||||
rlp.append(&sign(self.ecdhe.secret(), &(shared ^ self.nonce))?.to_vec());
|
||||
rlp.append(public);
|
||||
rlp.append(&self.nonce);
|
||||
rlp.append(&PROTOCOL_VERSION);
|
||||
let mut encoded = rlp.out();
|
||||
encoded.resize(
|
||||
encoded.len() + rand::thread_rng().gen_range::<usize>(100, 301),
|
||||
0,
|
||||
);
|
||||
let len = (encoded.len() + ECIES_OVERHEAD) as u16;
|
||||
let prefix = len.to_be_bytes();
|
||||
let message = ecies::encrypt(&self.id, &prefix, &encoded)?;
|
||||
self.auth_cipher.extend_from_slice(&prefix);
|
||||
self.auth_cipher.extend_from_slice(&message);
|
||||
self.connection.send(io, self.auth_cipher.clone());
|
||||
self.connection.expect(V4_ACK_PACKET_SIZE);
|
||||
self.state = HandshakeState::ReadingAck;
|
||||
Ok(())
|
||||
|
Loading…
Reference in New Issue
Block a user