summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-07-06 16:30:39 +0200
committerDavid Lönnhager <david.l@mullvad.net>2021-07-09 12:50:53 +0200
commitbaeecd17503b7d3fbd3717698e6a6b2a187fde0f (patch)
tree54a0cf6e21df7764e68540e3983ff7a32a960935
parent94da0b212fc0af4a451d1bcff46d2970f0b190d7 (diff)
downloadmullvadvpn-baeecd17503b7d3fbd3717698e6a6b2a187fde0f.tar.xz
mullvadvpn-baeecd17503b7d3fbd3717698e6a6b2a187fde0f.zip
Add from_base64 method to PublicKey type
-rw-r--r--talpid-types/src/net/wireguard.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/talpid-types/src/net/wireguard.rs b/talpid-types/src/net/wireguard.rs
index 1c92052762..c5bde3547e 100644
--- a/talpid-types/src/net/wireguard.rs
+++ b/talpid-types/src/net/wireguard.rs
@@ -160,6 +160,10 @@ impl<'de> Deserialize<'de> for PrivateKey {
#[derive(Clone)]
pub struct PublicKey(x25519_dalek::PublicKey);
+/// Error returned if a base64 string represents an invalid key
+#[derive(Debug)]
+pub struct InvalidKeyError(());
+
impl PublicKey {
/// Get the public key as bytes
pub fn as_bytes(&self) -> &[u8; 32] {
@@ -169,6 +173,16 @@ impl PublicKey {
pub fn to_base64(&self) -> String {
base64::encode(self.as_bytes())
}
+
+ pub fn from_base64(key: &str) -> Result<Self, InvalidKeyError> {
+ let bytes = base64::decode(key).map_err(|_| InvalidKeyError(()))?;
+ if bytes.len() != 32 {
+ return Err(InvalidKeyError(()));
+ }
+ let mut key = [0u8; 32];
+ key.copy_from_slice(&bytes);
+ Ok(From::from(key))
+ }
}