diff options
author | Jake McGinty <me@jake.su> | 2018-04-24 23:40:09 -0700 |
---|---|---|
committer | Jake McGinty <me@jake.su> | 2018-04-24 23:40:09 -0700 |
commit | 93b57bc36f2bdd5095993fb34eb13ebc52a51ae6 (patch) | |
tree | 04ac71c3fd97e65c950da510cc0385a2ae95c8b4 /src | |
parent | global: fix up clippies (diff) | |
download | wireguard-rs-93b57bc36f2bdd5095993fb34eb13ebc52a51ae6.tar.xz wireguard-rs-93b57bc36f2bdd5095993fb34eb13ebc52a51ae6.zip |
config: allow private keys to be unset
Diffstat (limited to 'src')
-rw-r--r-- | src/interface/config.rs | 22 | ||||
-rw-r--r-- | src/interface/peer_server.rs | 20 |
2 files changed, 30 insertions, 12 deletions
diff --git a/src/interface/config.rs b/src/interface/config.rs index 6d16a84..488b5bb 100644 --- a/src/interface/config.rs +++ b/src/interface/config.rs @@ -223,14 +223,20 @@ impl ConfigurationService { pub fn handle_update(state: &mut State, event: &UpdateEvent) -> Result<(), Error> { match *event { UpdateEvent::PrivateKey(private_key) => { - let pub_key = x25519::generate_public(&private_key); - state.interface_info.private_key = Some(private_key); - state.interface_info.pub_key = Some(*pub_key.as_bytes()); - debug!("set new private key (pub: {}).", base64::encode(pub_key.as_bytes())); - - if let Some(peer_ref) = state.pubkey_map.remove(&*pub_key.as_bytes()) { - Self::clear_peer_refs(state, &peer_ref.borrow()); - debug!("removed self from peers"); + if private_key == [0u8; 32] { + state.interface_info.private_key = None; + state.interface_info.pub_key = None; + debug!("unset private key"); + } else { + let pub_key = x25519::generate_public(&private_key); + state.interface_info.private_key = Some(private_key); + state.interface_info.pub_key = Some(*pub_key.as_bytes()); + debug!("set new private key (pub: {}).", base64::encode(pub_key.as_bytes())); + + if let Some(peer_ref) = state.pubkey_map.remove(&*pub_key.as_bytes()) { + Self::clear_peer_refs(state, &peer_ref.borrow()); + debug!("removed self from peers"); + } } }, UpdateEvent::ListenPort(port) => { diff --git a/src/interface/peer_server.rs b/src/interface/peer_server.rs index a115023..4de6eec 100644 --- a/src/interface/peer_server.rs +++ b/src/interface/peer_server.rs @@ -59,6 +59,13 @@ impl PeerServer { pub fn rebind(&mut self) -> Result<(), Error> { let interface = &self.shared_state.borrow().interface_info; + + if interface.private_key.is_none() { + self.udp = None; + self.port = None; + return Ok(()); + } + let port = interface.listen_port.unwrap_or(0); let fwmark = interface.fwmark.unwrap_or(0); @@ -412,10 +419,15 @@ impl Future for PeerServer { Ok(Async::Ready(Some(event))) => { match event { PrivateKey(_) => { - let pub_key = &self.shared_state.borrow().interface_info.pub_key.unwrap(); - self.cookie = cookie::Validator::new(pub_key); - if self.udp.is_none() { - self.rebind().unwrap(); + let pub_key = self.shared_state.borrow().interface_info.pub_key; + if let Some(ref pub_key) = pub_key { + self.cookie = cookie::Validator::new(pub_key); + if self.udp.is_none() { + self.rebind().unwrap(); + } + } else { + self.udp = None; + self.port = None; } }, ListenPort(_) => self.rebind().unwrap(), |