wgctrl-rs(userspace): remove subtle as dependency

pull/151/head
Jake McGinty 2021-09-13 02:15:47 +09:00
parent c652a8f799
commit b3d2d7f2eb
6 changed files with 12 additions and 26 deletions

1
Cargo.lock generated
View File

@ -1367,7 +1367,6 @@ dependencies = [
"hex", "hex",
"libc", "libc",
"rand_core", "rand_core",
"subtle",
"wgctrl-sys", "wgctrl-sys",
] ]

View File

@ -615,7 +615,7 @@ fn get_session(
.ok_or(ServerError::Unauthorized)?; .ok_or(ServerError::Unauthorized)?;
let pubkey = pubkey.to_str().map_err(|_| ServerError::Unauthorized)?; let pubkey = pubkey.to_str().map_err(|_| ServerError::Unauthorized)?;
let pubkey = Key::from_base64(pubkey).map_err(|_| ServerError::Unauthorized)?; let pubkey = Key::from_base64(pubkey).map_err(|_| ServerError::Unauthorized)?;
if pubkey.ct_eq(&context.public_key).into() { if pubkey.as_bytes().ct_eq(&context.public_key.as_bytes()).into() {
let peer = DatabasePeer::get_from_ip(&context.db.lock(), addr).map_err(|e| match e { let peer = DatabasePeer::get_from_ip(&context.db.lock(), addr).map_err(|e| match e {
rusqlite::Error::QueryReturnedNoRows => ServerError::Unauthorized, rusqlite::Error::QueryReturnedNoRows => ServerError::Unauthorized,
e => ServerError::Database(e), e => ServerError::Database(e),

View File

@ -19,5 +19,4 @@ wgctrl-sys = { path = "../wgctrl-sys" }
[target.'cfg(not(target_os = "linux"))'.dependencies] [target.'cfg(not(target_os = "linux"))'.dependencies]
rand_core = "0.6" rand_core = "0.6"
subtle = "2"
curve25519-dalek = "4.0.0-pre.1" curve25519-dalek = "4.0.0-pre.1"

View File

@ -468,9 +468,8 @@ impl Key {
Self(wgctrl_sys::wg_key::default()) Self(wgctrl_sys::wg_key::default())
} }
/// Checks if this key is all-zero. pub fn as_bytes(&self) -> &[u8] {
pub fn is_zero(&self) -> bool { &self.0
unsafe { wgctrl_sys::wg_key_is_zero(&self.0 as *const u8 as *mut u8) }
} }
/// Converts the key to a standardized base64 representation, as used by the `wg` utility and `wg-quick`. /// Converts the key to a standardized base64 representation, as used by the `wg` utility and `wg-quick`.

View File

@ -1,6 +1,3 @@
use curve25519_dalek::scalar::Scalar;
use subtle::ConstantTimeEq;
use crate::{Backend, Device, DeviceUpdate, InterfaceName, PeerConfig, PeerInfo, PeerStats}; use crate::{Backend, Device, DeviceUpdate, InterfaceName, PeerConfig, PeerInfo, PeerStats};
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
@ -395,12 +392,6 @@ pub fn apply(builder: &DeviceUpdate, iface: &InterfaceName) -> io::Result<()> {
#[derive(PartialEq, Eq, Clone)] #[derive(PartialEq, Eq, Clone)]
pub struct Key([u8; 32]); pub struct Key([u8; 32]);
impl ConstantTimeEq for Key {
fn ct_eq(&self, other: &Self) -> subtle::Choice {
self.0.ct_eq(&other.0).into()
}
}
#[cfg(not(target_os = "linux"))] #[cfg(not(target_os = "linux"))]
impl Key { impl Key {
/// Generates and returns a new private key. /// Generates and returns a new private key.
@ -428,6 +419,8 @@ impl Key {
/// Generates a public key for this private key. /// Generates a public key for this private key.
pub fn generate_public(&self) -> Self { pub fn generate_public(&self) -> Self {
use curve25519_dalek::scalar::Scalar;
use curve25519_dalek::constants::ED25519_BASEPOINT_TABLE; use curve25519_dalek::constants::ED25519_BASEPOINT_TABLE;
// https://github.com/dalek-cryptography/x25519-dalek/blob/1c39ff92e0dfc0b24aa02d694f26f3b9539322a5/src/x25519.rs#L150 // https://github.com/dalek-cryptography/x25519-dalek/blob/1c39ff92e0dfc0b24aa02d694f26f3b9539322a5/src/x25519.rs#L150
@ -441,9 +434,8 @@ impl Key {
Self([0u8; 32]) Self([0u8; 32])
} }
/// Checks if this key is all-zero. pub fn as_bytes(&self) -> &[u8] {
pub fn is_zero(&self) -> bool { &self.0
self.ct_eq(&Self::zero()).into()
} }
/// Converts the key to a standardized base64 representation, as used by the `wg` utility and `wg-quick`. /// Converts the key to a standardized base64 representation, as used by the `wg` utility and `wg-quick`.
@ -496,22 +488,22 @@ mod test {
#[test] #[test]
fn test_rng_sanity_private() { fn test_rng_sanity_private() {
let first = Key::generate_private(); let first = Key::generate_private();
assert!(!first.is_zero()); assert!(first.as_bytes() != &[0u8; 32]);
for _ in 0..100_000 { for _ in 0..100_000 {
let key = Key::generate_private(); let key = Key::generate_private();
assert!(first != key); assert!(first != key);
assert!(!key.is_zero()); assert!(key.as_bytes() != &[0u8; 32]);
} }
} }
#[test] #[test]
fn test_rng_sanity_preshared() { fn test_rng_sanity_preshared() {
let first = Key::generate_preshared(); let first = Key::generate_preshared();
assert!(!first.is_zero()); assert!(first.as_bytes() != &[0u8; 32]);
for _ in 0..100_000 { for _ in 0..100_000 {
let key = Key::generate_preshared(); let key = Key::generate_preshared();
assert!(first != key); assert!(first != key);
assert!(!key.is_zero()); assert!(key.as_bytes() != &[0u8; 32]);
} }
} }
} }

View File

@ -73,11 +73,8 @@ mod tests {
fn test_key_zero() { fn test_key_zero() {
use crate::key::Key; use crate::key::Key;
let key = Key::zero();
assert!(key.is_zero());
let key = Key::generate_preshared(); let key = Key::generate_preshared();
assert!(!key.is_zero()); assert_ne!(key.as_bytes(), &[0u8; 32]);
} }
#[test] #[test]