added convesion from and to hex [CI SKIP]

This commit is contained in:
shimunn 2019-04-03 13:51:49 +02:00
parent 5976ddecdf
commit e3815e3198

View File

@ -1,4 +1,5 @@
use base64::{decode, encode}; use base64::{decode, encode};
use hex;
use std::error::Error; use std::error::Error;
use std::fmt; use std::fmt;
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
@ -21,6 +22,31 @@ impl fmt::Display for ECCKey {
} }
} }
pub trait HexBackend {
fn from_bytes(bytes: Vec<u8>) -> Self;
fn bytes(&self) -> &Vec<u8>;
fn from_hex<I: AsRef<str>>(key: I) -> io::Result<Self>
where
Self: Sized,
{
Ok(Self::from_bytes(hex::decode(key.as_ref()).map_err(
|_| io::Error::new(io::ErrorKind::InvalidData, "Failed to decode hexstring"),
)?))
}
fn as_hex(&self) -> io::Result<String> {
Ok(hex::encode(&self.bytes()))
}
}
impl<T: Base64Backed> HexBackend for T {
fn from_bytes(bytes: Vec<u8>) -> Self {
<Self as Base64Backed>::from_bytes(bytes)
}
fn bytes(&self) -> &Vec<u8> {
<Self as Base64Backed>::bytes(self)
}
}
pub trait Base64Backed { pub trait Base64Backed {
fn from_bytes(bytes: Vec<u8>) -> Self; fn from_bytes(bytes: Vec<u8>) -> Self;
fn bytes(&self) -> &Vec<u8>; fn bytes(&self) -> &Vec<u8>;
@ -34,7 +60,7 @@ pub trait Base64Backed {
return Err(io::Error::new( return Err(io::Error::new(
io::ErrorKind::InvalidData, io::ErrorKind::InvalidData,
"Failed to decode base64", "Failed to decode base64",
)) ));
} }
}; /*.map_err(|err| { }; /*.map_err(|err| {
@ -203,3 +229,15 @@ pub trait WireguardController {
fn update_peer(&mut self, peer: &Peer) -> io::Result<()>; fn update_peer(&mut self, peer: &Peer) -> io::Result<()>;
} }
#[cfg(test)]
mod test {
use super::*;
#[test]
fn key_encoding() {
let key_encoded = "08df3bebd54217eb769d607f8673e1c3c53bb55d6ac689348a9227c8c4dd8857";
let key = ECCKey::from_hex(key_encoded).unwrap();
assert_eq!(&key.as_hex().unwrap(), key_encoded);
}
}