aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJake McGinty <me@jake.su>2018-04-24 23:40:09 -0700
committerJake McGinty <me@jake.su>2018-04-24 23:40:09 -0700
commit93b57bc36f2bdd5095993fb34eb13ebc52a51ae6 (patch)
tree04ac71c3fd97e65c950da510cc0385a2ae95c8b4 /src
parentglobal: fix up clippies (diff)
downloadwireguard-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.rs22
-rw-r--r--src/interface/peer_server.rs20
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(),