From 0809a8f313af8c84716d9fa50c714f3dba3ad27d Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Mon, 26 Jul 2021 23:09:45 -0400 Subject: [PATCH] Rusty stuff and a README for AES-GMAC-SIV. --- aes-gmac-siv/AES-GMAC-SIV.png | Bin 0 -> 153238 bytes aes-gmac-siv/README.md | 111 ++++++++++++++ aes-gmac-siv/src/impl_gcrypt.rs | 13 +- aes-gmac-siv/src/impl_macos.rs | 16 +- aes-gmac-siv/src/lib.rs | 9 +- network-hypervisor/Cargo.lock | 7 + network-hypervisor/Cargo.toml | 1 + network-hypervisor/src/vl1/buffer.rs | 61 +++++++- network-hypervisor/src/vl1/endpoint.rs | 160 +++++++++++++++++++ network-hypervisor/src/vl1/inetaddress.rs | 169 ++++++++++++++++----- network-hypervisor/src/{vl2 => vl1}/mac.rs | 0 network-hypervisor/src/vl1/mod.rs | 14 +- network-hypervisor/src/vl1/packet.rs | 12 +- network-hypervisor/src/vl2/mod.rs | 3 - 14 files changed, 510 insertions(+), 66 deletions(-) create mode 100755 aes-gmac-siv/AES-GMAC-SIV.png create mode 100644 aes-gmac-siv/README.md create mode 100644 network-hypervisor/src/vl1/endpoint.rs rename network-hypervisor/src/{vl2 => vl1}/mac.rs (100%) diff --git a/aes-gmac-siv/AES-GMAC-SIV.png b/aes-gmac-siv/AES-GMAC-SIV.png new file mode 100755 index 0000000000000000000000000000000000000000..c545b20b16efa28e509a58412669ae3151455c37 GIT binary patch literal 153238 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
  • Q$nfynh>NX|JbNI8Mnoerurd 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 literal 0 HcmV?d00001 diff --git a/aes-gmac-siv/README.md b/aes-gmac-siv/README.md new file mode 100644 index 000000000..061b0145d --- /dev/null +++ b/aes-gmac-siv/README.md @@ -0,0 +1,111 @@ +AES-GMAC-SIV +====== + +Rust implementation for ZeroTier 2.0. + +*WARNING: while this construction has been subjected to peer review, this code has not (yet!). Use at your own risk.* + +## Introduction + +AES-GMAC-SIV is a "synthetic IV" (SIV) cipher construction implemented using only FIPS140 and NIST accepted cryptographic building blocks: AES-ECB (single block), AES-CTR, and GMAC (the MAC part of GCM, which can also be used separately). + +AES-GMAC-SIV is almost identical to [AES-GCM-SIV](https://en.wikipedia.org/wiki/AES-GCM-SIV), but that mode uses a non-standard MAC called POLYVAL in place of GMAC. POLYVAL is basically little-endian GMAC but the fact that it is not standard GMAC means it's not found in most cryptographic libraries and is not approved by FIPS140 and many other sets of compliance guidelines. + +## Why SIV? Why not just GCM? + +Stream ciphers like AES-CTR, ChaCha20, and others require a number called an initialization vector (IV) for each use. The IV is sometimes called a nonce, or *number used once*, because using the same value for different messages with the same key is a major no-no. + +Repeating an IV/nonce with the same key allows both messages to be decrypted. This is because XOR, which is used to apply the stream cipher's pseudorandom bits as a one time pad, is commutative. Repeating a nonce can in some cases also allow an attacker to attack the MAC (e.g. GMAC or Poly1305) and forge messages that will appear valid. In many systems compromising the MAC is more serious than compromising encryption for a few messages. + +SIV modes provide strong protection against IV reuse by generating a *synthetic IV* from the plaintext. This means that two different plaintexts will almost certainly perform encryption using different IVs even if the input IV is duplicated. + +With SIV a duplicate IV has no effect at all except in the case where the same IV is used to encrypt the same message twice. In this case the encrypted messages would also be identical, revealing that a duplicate was sent, but because both the IV and message are the same this would not compromise security like IV reuse does in standard modes. + +SIV modes could be used with no external IV at all without compromising plaintext secrecy, but this is not recommended since it would leak message duplication. An external IV is supplied in this and other common SIV constructions to avoid this, since it causes duplicate messages to result in entirely different ciphertexts. + +We recommend treating AES-GMAC-SIV (and other SIV modes) as if they were normal stream ciphers and endeavoring to make the IV unique as those would require. + +SIV modes might seem like paranoia, but accidental IV reuse is easier than you might think. Here's a few scenarios where it might happen: + + * Embedded devices that initialize PRNGs from deterministic sources. + * Forgetting to use atomics or a mutex to synchronize an IV counter variable in multithreaded code. + * Concurrent use of a non-thread-safe random number generator. + * Multiple dependencies in a project initializing or using a random source from a common shared library that uses static state. + * Live cloning of virtual machines or application state, resulting in two clones with identical random number generator states. + * Memory errors or other bugs that break IV generation. If these can be triggered remotely, this could be an attack vector. + * Time changes if the clock is used as an input to generate the IV. + +... and so on. "Sudden death" on IV re-use is a foot-gun that's worth removing. + +## AES-GMAC-SIV construction + +![AES-GMAC-SIV block diagram](AES-GMAC-SIV.png) + +Initialization parameters: + + 1. K0, an AES key used to initialize AES-GMAC. + 2. K1, a second (and different) AES key used to initialize AES-ECB and AES-CTR. + +Per-message parameters: + + 1. A per-message unique 64-bit IV (can be a counter or random). + 2. Optional additional associated data (AAD) to authenticate but not encrypt. + 3. A plaintext message to encrypt. + +Encryption steps: + + 1. Pad 64-bit IV to 96 bits and reset GMAC for next message. + 2. Feed AAD (if any) into GMAC. + 3. Pad AAD length to a multiple of 16 by feeding zeroes into GMAC. + 4. Feed plaintext into GMAC to compute final MAC. + 5. XOR lower 64 bits and higher 64 bits of GMAC tag. + 6. Concatenate IV and 64-bit shortened tag to form a 128-bit block. + 7. AES-ECB encrypt this IV+tag to yield message tag and AES-CTR IV. + 8. Clear bit 31 (from the right) in the tag and use this to initialize AES-CTR. Bit 31 is cleared so AES-CTR implementations that use a 32-bit counter will not overflow for messages less than 2^31 bytes in length. + 9. Encrypt plaintext with AES-CTR. + +The message tag is the 128-bit encrypted block from step 7 before bit 31 is cleared. Only this 128-bit tag needs to be sent with the message. The IV supplied for encryption should not be sent, as it's obtained by decrypting the tag. + +Decryption steps: + + 1. Initialize AES-CTR with the tag (with bit 31 cleared as in step 8 above). + 2. Decrypt ciphertext with AES-CTR. + 3. AES-ECB *decrypt* 128-bit tag to yield original IV and 64-bit shortened GMAC tag. + 4. Initialize GMAC as in encryption step 1. + 5. Feed AAD into GMAC (if any). + 6. Zero-pad AAD to a multiple of 16 as in encryption. + 7. Feed *decrypted plaintext* into GMAC. + 8. Generate GMAC tag, XOR least and most significant 64 bits, and check MAC. Discard packet if these do not match. + +Note that while MAC comparison is only 64 bits, this MAC is concealed within an encrypted block that mixes its bits with the IV. This helps prevent an attacker from directly attacking GMAC or attempting to exploit an oracle. An attacker could only detect a 64-bit MAC collision if the IV was also duplicated, which is another reason to supply unique IVs. + +## Performance + +Performance is very close to AES-GCM on a given platform. It's very slightly slower because encryption requires two passes, but for short messages the second pass will operate on data already in the CPU's L0 cache which minimizes the actual overhead. + +You can run tests with `cargo test -- --nocapture` and see encrypt and decrypt performance. Here's some single core benchmarks: + + * AMD Threadripper 2990WX: **2055.60 MiB/sec**, decrypt **2050.09 MiB/sec**. + * M1 Mac Mini (2021): encrypt **4690.89 MiB/sec**, decrypt **4977.39 MiB/sec**. + +Since this uses AES it will be much slower on systems that don't have AES hardware extensions. On the flip side it's extremely fast on systems that do, and also more energy efficient than ARX-type ciphers that slam the ALU to achieve high performance. + +## Cryptanalysis + +[Trail of Bits](https://www.trailofbits.com) analyzed AES-GMAC-SIV as part of their [design analysis of ZeroTier 2.0](https://github.com/trailofbits/publications/blob/master/reviews/ZeroTierProtocol.pdf) and concluded that its security is equivalent to the original AES-SIV and AES-GCM-SIV constructions. + +The algorithms on which this is built, namely AES, AES-CTR, and GMAC, are well known and standard. + +## FIPS-140 Compliance + +AES-ECB, AES-CTR, and GMAC are all algorithms allowed by FIPS-140. For FIPS purposes AES-GMAC-SIV would be described as AES-CTR with GMAC authentication. Since this is built out of compliant components, a standard FIPS-certified cryptographic library could be used. + +## Dependencies + +This is implemented using the [libgcrypt](https://github.com/gpg/libgcrypt) library (via Rust bindings) on Linux, BSD, and Windows, and built-in CommonCrypto libraries on MacOS and iOS. CommonCrypto was used on Mac because libgcrypt has issues on the ARM64 platform with Apple's clang. + +## License + +This Rust implementation of AES-GMAC-SIV is released under the BSD 2-clause license. + +(c) 2021 ZeroTier, Inc. diff --git a/aes-gmac-siv/src/impl_gcrypt.rs b/aes-gmac-siv/src/impl_gcrypt.rs index e57a05938..ab5fadac7 100644 --- a/aes-gmac-siv/src/impl_gcrypt.rs +++ b/aes-gmac-siv/src/impl_gcrypt.rs @@ -16,10 +16,13 @@ impl AesGmacSiv { /// Create a new keyed instance of AES-GMAC-SIV /// The key may be of size 16, 24, or 32 bytes (128, 192, or 256 bits). Any other size will panic. #[inline(always)] - pub fn new(key: &[u8]) -> Self { - if key.len() != 32 && key.len() != 24 && key.len() != 16 { + pub fn new(k0: &[u8], k1: &[u8]) -> Self { + if k0.len() != 32 && k0.len() != 24 && k0.len() != 16 { panic!("AES supports 128, 192, or 256 bits keys"); } + if k1.len() != k0.len() { + panic!("k0 and k1 must be of the same size"); + } let mut c = AesGmacSiv { tag: [0_u8; 16], tmp: [0_u8; 16], @@ -27,9 +30,9 @@ impl AesGmacSiv { ecb: gcrypt::cipher::Cipher::new(gcrypt::cipher::Algorithm::Aes, gcrypt::cipher::Mode::Ecb).unwrap(), gmac: gcrypt::mac::Mac::new(gcrypt::mac::Algorithm::GmacAes).unwrap(), }; - c.ctr.set_key(key).expect("AES-CTR init failed"); - c.ecb.set_key(key).expect("AES-ECB init failed"); - c.gmac.set_key(key).expect("AES-GMAC init failed"); + c.ctr.set_key(k1).expect("AES-CTR init failed"); + c.ecb.set_key(k1).expect("AES-ECB init failed"); + c.gmac.set_key(k0).expect("AES-GMAC init failed"); c } diff --git a/aes-gmac-siv/src/impl_macos.rs b/aes-gmac-siv/src/impl_macos.rs index 8ac9e437b..5f9d89acd 100644 --- a/aes-gmac-siv/src/impl_macos.rs +++ b/aes-gmac-siv/src/impl_macos.rs @@ -61,11 +61,15 @@ impl Drop for AesGmacSiv { impl AesGmacSiv { /// Create a new keyed instance of AES-GMAC-SIV /// The key may be of size 16, 24, or 32 bytes (128, 192, or 256 bits). Any other size will panic. + /// Two keys are required: one for GMAC and one for AES-CTR. #[inline(always)] - pub fn new(key: &[u8]) -> Self { - if key.len() != 32 && key.len() != 24 && key.len() != 16 { + pub fn new(k0: &[u8], k1: &[u8]) -> Self { + if k0.len() != 32 && k0.len() != 24 && k0.len() != 16 { panic!("AES supports 128, 192, or 256 bits keys"); } + if k1.len() != k0.len() { + panic!("k0 and k1 must be of the same size"); + } let mut c: AesGmacSiv = AesGmacSiv { tag: [0_u8; 16], tmp: [0_u8; 16], @@ -75,19 +79,19 @@ impl AesGmacSiv { gmac: null_mut(), }; unsafe { - let result = CCCryptorCreateWithMode(kCCEncrypt, kCCModeCTR, kCCAlgorithmAES, 0, crate::ZEROES.as_ptr().cast(), key.as_ptr().cast(), key.len(), null(), 0, 0, 0, &mut c.ctr); + let result = CCCryptorCreateWithMode(kCCEncrypt, kCCModeCTR, kCCAlgorithmAES, 0, crate::ZEROES.as_ptr().cast(), k1.as_ptr().cast(), k1.len(), null(), 0, 0, 0, &mut c.ctr); if result != 0 { panic!("CCCryptorCreateWithMode for CTR mode returned {}", result); } - let result = CCCryptorCreateWithMode(kCCEncrypt, kCCModeECB, kCCAlgorithmAES, 0, crate::ZEROES.as_ptr().cast(), key.as_ptr().cast(), key.len(), null(), 0, 0, kCCOptionECBMode, &mut c.ecb_enc); + let result = CCCryptorCreateWithMode(kCCEncrypt, kCCModeECB, kCCAlgorithmAES, 0, crate::ZEROES.as_ptr().cast(), k1.as_ptr().cast(), k1.len(), null(), 0, 0, kCCOptionECBMode, &mut c.ecb_enc); if result != 0 { panic!("CCCryptorCreateWithMode for ECB encrypt mode returned {}", result); } - let result = CCCryptorCreateWithMode(kCCDecrypt, kCCModeECB, kCCAlgorithmAES, 0, crate::ZEROES.as_ptr().cast(), key.as_ptr().cast(), key.len(), null(), 0, 0, kCCOptionECBMode, &mut c.ecb_dec); + let result = CCCryptorCreateWithMode(kCCDecrypt, kCCModeECB, kCCAlgorithmAES, 0, crate::ZEROES.as_ptr().cast(), k1.as_ptr().cast(), k1.len(), null(), 0, 0, kCCOptionECBMode, &mut c.ecb_dec); if result != 0 { panic!("CCCryptorCreateWithMode for ECB decrypt mode returned {}", result); } - let result = CCCryptorCreateWithMode(kCCEncrypt, kCCModeGCM, kCCAlgorithmAES, 0, crate::ZEROES.as_ptr().cast(), key.as_ptr().cast(), key.len(), null(), 0, 0, 0, &mut c.gmac); + let result = CCCryptorCreateWithMode(kCCEncrypt, kCCModeGCM, kCCAlgorithmAES, 0, crate::ZEROES.as_ptr().cast(), k0.as_ptr().cast(), k0.len(), null(), 0, 0, 0, &mut c.gmac); if result != 0 { panic!("CCCryptorCreateWithMode for GCM (GMAC) mode returned {}", result); } diff --git a/aes-gmac-siv/src/lib.rs b/aes-gmac-siv/src/lib.rs index 60fd52cdf..8ba8500ea 100644 --- a/aes-gmac-siv/src/lib.rs +++ b/aes-gmac-siv/src/lib.rs @@ -26,7 +26,8 @@ mod tests { #[test] fn encrypt_decrypt() { - let aes_key: [u8; 32] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]; + let aes_key_0: [u8; 32] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]; + let aes_key_1: [u8; 32] = [2,3,4,5,6,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]; let iv: [u8; 8] = [0,1,2,3,4,5,6,7]; let mut buf = [0_u8; 12345]; @@ -34,7 +35,7 @@ mod tests { buf[i] = i as u8; } - let mut c = AesGmacSiv::new(&aes_key); + let mut c = AesGmacSiv::new(&aes_key_0, &aes_key_1); for _ in 0..256 { c.reset(); @@ -45,8 +46,8 @@ mod tests { let tag = c.encrypt_second_pass_finish().clone(); let sha = sha2::Sha384::digest(&buf).to_vec(); let sha = to_hex(sha.as_slice()); - if sha != "f455fa8a1a6badaeccdefe573a10d5d79eb7f4009b84dff3d37f9f1e95ee2b0ba6149737c0701d5ef75f58f793174d3d" { - panic!("encrypt result hash check failed!"); + if sha != "b5c0997f5a0e31748dfd3a22baa4bf257b1ebf2c2ecb78a68360fa5a5f0763aa5b8fde8be502255c82d937d8adba11eb" { + panic!("encrypt result hash check failed! {}", sha); } //println!("Encrypt OK, tag: {}, hash: {}", to_hex(&tag), sha); diff --git a/network-hypervisor/Cargo.lock b/network-hypervisor/Cargo.lock index 84d558c66..cf7c0d82e 100644 --- a/network-hypervisor/Cargo.lock +++ b/network-hypervisor/Cargo.lock @@ -339,6 +339,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +[[package]] +name = "urlencoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b90931029ab9b034b300b797048cf23723400aa757e8a2bfb9d748102f9821" + [[package]] name = "version_check" version = "0.9.3" @@ -424,6 +430,7 @@ dependencies = [ "gcrypt", "libc", "rand_core", + "urlencoding", "winapi", "x25519-dalek", ] diff --git a/network-hypervisor/Cargo.toml b/network-hypervisor/Cargo.toml index a6fbe4c06..eaef07b91 100644 --- a/network-hypervisor/Cargo.toml +++ b/network-hypervisor/Cargo.toml @@ -21,6 +21,7 @@ x25519-dalek = "^1" ed25519-dalek = "^1" gcrypt = "^0" base64 = "^0" +urlencoding = "^2" [target."cfg(not(windows))".dependencies] libc = "^0" diff --git a/network-hypervisor/src/vl1/buffer.rs b/network-hypervisor/src/vl1/buffer.rs index 87d9e7b3f..7dd08ea62 100644 --- a/network-hypervisor/src/vl1/buffer.rs +++ b/network-hypervisor/src/vl1/buffer.rs @@ -1,6 +1,7 @@ -use std::mem::{size_of, MaybeUninit}; +use std::mem::{size_of, MaybeUninit, transmute}; use std::marker::PhantomData; use std::io::Write; +use std::hash::{Hash, Hasher}; const OVERFLOW_ERR_MSG: &'static str = "overflow"; @@ -18,8 +19,10 @@ unsafe impl RawObject for NoHeader {} /// /// This also supports a generic header that must be a RawObject and will always be /// placed at the beginning of the buffer. When you construct or clear() a buffer -/// space will be maintained for the header. Use NoHeader if you don't want a header. -#[derive(Clone)] +/// space will be maintained for the header by setting the buffer's size to the +/// header size. The header must have a size less than or equal to L. Use NoHeader +/// if you don't want a header. +#[derive(Clone, PartialEq, Eq)] pub struct Buffer(usize, [u8; L], PhantomData); unsafe impl RawObject for Buffer {} @@ -27,6 +30,7 @@ unsafe impl RawObject for Buffer {} impl Default for Buffer { #[inline(always)] fn default() -> Self { + assert!(size_of::() <= L); Buffer(size_of::(), [0_u8; L], PhantomData::default()) } } @@ -34,9 +38,18 @@ impl Default for Buffer { impl Buffer { #[inline(always)] pub fn new() -> Self { + assert!(size_of::() <= L); Self::default() } + /// Change the header "personality" of this buffer. + /// Note that the new buffer must be of the same size and both the old and + /// new headers must be RawObjects with size less than or equal to this size. + pub fn change_header_type(self) -> Buffer { + assert!(size_of::() <= L); + unsafe { transmute(self) } + } + /// Create a buffer that contains a copy of a slice. /// If the slice is larger than the maximum size L of the buffer, only the first L bytes /// are copied and the rest is ignored. @@ -58,6 +71,12 @@ impl Buffer { &self.1[0..self.0] } + /// Get a slice containing the entire buffer in raw form including the header. + #[inline(always)] + pub fn as_bytes_mut(&mut self) -> &mut [u8] { + &mut self.1[0..self.0] + } + /// Erase contents and reset size to the size of the header. #[inline(always)] pub fn clear(&mut self) { @@ -339,6 +358,42 @@ impl Write for Buffer { } } +impl AsRef<[u8]> for Buffer { + #[inline(always)] + fn as_ref(&self) -> &[u8] { + self.as_bytes() + } +} + +impl AsMut<[u8]> for Buffer { + #[inline(always)] + fn as_mut(&mut self) -> &mut [u8] { + self.as_bytes_mut() + } +} + +impl AsRef for Buffer { + #[inline(always)] + fn as_ref(&self) -> &H { + self.header() + } +} + +impl AsMut for Buffer { + #[inline(always)] + fn as_mut(&mut self) -> &mut H { + self.header_mut() + } +} + +impl Hash for Buffer { + #[inline(always)] + fn hash(&self, state: &mut H) { + state.write_u32(self.0 as u32); + state.write(&self.1[0..self.0]); + } +} + #[cfg(test)] mod tests { use std::mem::size_of; diff --git a/network-hypervisor/src/vl1/endpoint.rs b/network-hypervisor/src/vl1/endpoint.rs new file mode 100644 index 000000000..e5f50ca0c --- /dev/null +++ b/network-hypervisor/src/vl1/endpoint.rs @@ -0,0 +1,160 @@ +use crate::vl1::{Address, MAC}; +use crate::vl1::inetaddress::InetAddress; +use crate::vl1::buffer::{RawObject, Buffer}; + +#[repr(u8)] +pub enum Type { + Nil = 0, + ZeroTier = 1, + Ethernet = 2, + WifiDirect = 3, + Bluetooth = 4, + Ip = 5, + IpUdp = 6, + IpTcp = 7, + Http = 8, + WebRTC = 9, +} + +#[derive(Clone, PartialEq, Eq)] +pub enum Endpoint { + Nil, + ZeroTier(Address), + Ethernet(MAC), + WifiDirect(MAC), + Bluetooth(MAC), + Ip(InetAddress), + IpUdp(InetAddress), + IpTcp(InetAddress), + Http(String), + WebRTC(String), +} + +impl Default for Endpoint { + #[inline(always)] + fn default() -> Endpoint { + Endpoint::Nil + } +} + +impl Endpoint { + pub fn ep_type(&self) -> Type { + match self { + Endpoint::Nil => Type::Nil, + Endpoint::ZeroTier(_) => Type::ZeroTier, + Endpoint::Ethernet(_) => Type::Ethernet, + Endpoint::WifiDirect(_) => Type::WifiDirect, + Endpoint::Bluetooth(_) => Type::Bluetooth, + Endpoint::Ip(_) => Type::Ip, + Endpoint::IpUdp(_) => Type::IpUdp, + Endpoint::IpTcp(_) => Type::IpTcp, + Endpoint::Http(_) => Type::Http, + Endpoint::WebRTC(_) => Type::WebRTC, + } + } + + #[inline(always)] + pub fn ip(&self) -> Option<(&InetAddress, Type)> { + match self { + Endpoint::Ip(ip) => Some((&ip, Type::Ip)), + Endpoint::IpUdp(ip) => Some((&ip, Type::IpUdp)), + Endpoint::IpTcp(ip) => Some((&ip, Type::IpTcp)), + _ => None + } + } + + pub fn marshal(&self, buf: &mut Buffer) -> std::io::Result<()> { + match self { + Endpoint::Nil => { + buf.append_u8(Type::Nil as u8) + } + Endpoint::ZeroTier(a) => { + buf.append_u8(16 + (Type::ZeroTier as u8))?; + buf.append_bytes_fixed(&a.to_bytes()) + } + Endpoint::Ethernet(m) => { + buf.append_u8(16 + (Type::Ethernet as u8))?; + buf.append_bytes_fixed(&m.to_bytes()) + } + Endpoint::WifiDirect(m) => { + buf.append_u8(16 + (Type::WifiDirect as u8))?; + buf.append_bytes_fixed(&m.to_bytes()) + } + Endpoint::Bluetooth(m) => { + buf.append_u8(16 + (Type::Bluetooth as u8))?; + buf.append_bytes_fixed(&m.to_bytes()) + } + Endpoint::Ip(ip) => { + buf.append_u8(16 + (Type::Ip as u8))?; + ip.marshal(buf) + } + Endpoint::IpUdp(ip) => { + ip.marshal(buf) + } + Endpoint::IpTcp(ip) => { + buf.append_u8(16 + (Type::IpTcp as u8))?; + ip.marshal(buf) + } + Endpoint::Http(url) => { + buf.append_u8(16 + (Type::Http as u8))?; + let b = url.as_bytes(); + buf.append_u16(b.len() as u16)?; + buf.append_bytes(b) + } + Endpoint::WebRTC(offer) => { + buf.append_u8(16 + (Type::WebRTC as u8))?; + let b = offer.as_bytes(); + buf.append_u16(b.len() as u16)?; + buf.append_bytes(b) + } + } + } + + pub fn unmarshal(buf: &Buffer, cursor: &mut usize) -> std::io::Result { + let type_byte = buf.get_u8(cursor)?; + if type_byte < 16 { + let ip = InetAddress::unmarshal(buf, cursor)?; + if ip.is_nil() { + Ok(Endpoint::Nil) + } else { + Ok(Endpoint::IpUdp(ip)) + } + } else { + match (type_byte - 16) as Type { + Type::Nil => Ok(Endpoint::Nil), + Type::ZeroTier => Ok(Endpoint::ZeroTier(Address::from(buf.get_bytes_fixed(cursor)?))), + Type::Ethernet => Ok(Endpoint::Ethernet(MAC::from(buf.get_bytes_fixed(cursor)?))), + Type::WifiDirect => Ok(Endpoint::WifiDirect(MAC::from(buf.get_bytes_fixed(cursor)?))), + Type::Bluetooth => Ok(Endpoint::Bluetooth(MAC::from(buf.get_bytes_fixed(cursor)?))), + Type::Ip => Ok(Endpoint::Ip(InetAddress::unmarshal(buf, cursor)?)), + Type::IpUdp => Ok(Endpoint::IpUdp(InetAddress::unmarshal(buf, cursor)?)), + Type::IpTcp => Ok(Endpoint::IpTcp(InetAddress::unmarshal(buf, cursor)?)), + Type::Http => { + let l = buf.get_u16(cursor)?; + Ok(Endpoint::Http(String::from_utf8_lossy(buf.get_bytes(l as usize, cursor)?).to_string())) + } + Type::WebRTC => { + let l = buf.get_u16(cursor)?; + Ok(Endpoint::WebRTC(String::from_utf8_lossy(buf.get_bytes(l as usize, cursor)?).to_string())) + } + } + } + } +} + +impl ToString for Endpoint { + fn to_string(&self) -> String { + match self { + Endpoint::Nil => format!("nil"), + Endpoint::ZeroTier(a) => format!("zt:{}", a.to_string()), + Endpoint::Ethernet(m) => format!("eth:{}", m.to_string()), + Endpoint::WifiDirect(m) => format!("wifid:{}", m.to_string()), + Endpoint::Bluetooth(m) => format!("bt:{}", m.to_string()), + Endpoint::Ip(ip) => format!("ip:{}", ip.to_ip_string()), + Endpoint::IpUdp(ip) => format!("udp:{}", ip.to_string()), + Endpoint::IpTcp(ip) => format!("tcp:{}", ip.to_string()), + Endpoint::Http(url) => url, + Endpoint::WebRTC(offer) => format!("webrtc:offer:{}", urlencoding::encode(offer.as_str())), + } + } +} diff --git a/network-hypervisor/src/vl1/inetaddress.rs b/network-hypervisor/src/vl1/inetaddress.rs index 7cfa28093..db7d702f4 100644 --- a/network-hypervisor/src/vl1/inetaddress.rs +++ b/network-hypervisor/src/vl1/inetaddress.rs @@ -1,4 +1,4 @@ -use std::mem::{zeroed, size_of}; +use std::mem::{zeroed, size_of, MaybeUninit}; use std::ptr::{write_bytes, copy_nonoverlapping, null}; use std::str::FromStr; use std::cmp::Ordering; @@ -10,6 +10,7 @@ use crate::util::equal_bytes; #[cfg(windows)] use winapi::um::winsock2 as winsock2; +use crate::vl1::buffer::{RawObject, Buffer}; #[allow(non_camel_case_types)] #[cfg(not(windows))] @@ -23,6 +24,10 @@ type sockaddr_in = libc::sockaddr_in; #[cfg(not(windows))] type sockaddr_in6 = libc::sockaddr_in6; +#[allow(non_camel_case_types)] +#[cfg(not(windows))] +type sockaddr_storage = libc::sockaddr_storage; + #[allow(non_camel_case_types)] #[cfg(not(windows))] type in6_addr = libc::in6_addr; @@ -44,7 +49,7 @@ pub enum IpScope { Global = 4, LinkLocal = 5, Shared = 6, - Private = 7 + Private = 7, } /// An IPv4 or IPv6 socket address that directly encapsulates C sockaddr types. @@ -54,7 +59,19 @@ pub enum IpScope { pub union InetAddress { sa: sockaddr, sin: sockaddr_in, - sin6: sockaddr_in6 + sin6: sockaddr_in6, + ss: sockaddr_storage, // some external code may expect the struct to be this full length +} + +impl Clone for InetAddress { + #[inline(always)] + fn clone(&self) -> Self { + unsafe { + let mut c = MaybeUninit::::uninit().assume_init(); + copy_nonoverlapping((self as *const Self).cast::(), (&mut c as *mut Self).cast::(), size_of::()); + c + } + } } impl Default for InetAddress { @@ -71,6 +88,17 @@ impl InetAddress { unsafe { zeroed() } } + /// Construct from IP and port. + /// If the IP is not either 4 or 16 bytes in length, a nil/0 InetAddress is returned. + #[inline(always)] + pub fn from_ip_port(ip: &[u8], port: u16) -> InetAddress { + unsafe { + let mut c = MaybeUninit::::uninit().assume_init(); + c.set(ip, port); + c + } + } + /// Zero the contents of this InetAddress. #[inline(always)] pub fn zero(&mut self) { @@ -129,6 +157,12 @@ impl InetAddress { unsafe { self.sa.sa_family as u8 == AF_INET6 } } + /// Get the address family of this InetAddress: AF_INET, AF_INET6, or 0 if nil. + #[inline(always)] + pub fn family(&self) -> u8 { + unsafe { self.sa.sa_family } + } + /// Get a pointer to the C "sockaddr" structure and the size of the returned structure in bytes. /// This is useful for interacting with C-level socket APIs. If this is a nil InetAddress this /// returns a null pointer and 0 for the size. @@ -221,42 +255,42 @@ impl InetAddress { } else { IpScope::Global } - }, + } 0xa9 => { if (ip & 0xffff0000) == 0xa9fe0000 { // 169.254.0.0/16 IpScope::LinkLocal } else { IpScope::Global } - }, + } 0xac => { if (ip & 0xfff00000) == 0xac100000 { // 172.16.0.0/12 IpScope::Private } else { IpScope::Global } - }, + } 0xc0 => { if (ip & 0xffff0000) == 0xc0a80000 || (ip & 0xffffff00) == 0xc0000200 { // 192.168.0.0/16 and 192.0.2.0/24 IpScope::Private } else { IpScope::Global } - }, + } 0xc6 => { if (ip & 0xfffe0000) == 0xc6120000 || (ip & 0xffffff00) == 0xc6336400 { // 198.18.0.0/15 and 198.51.100.0/24 IpScope::Private } else { IpScope::Global } - }, + } 0xcb => { if (ip & 0xffffff00) == 0xcb007100 { // 203.0.113.0/24 IpScope::Private } else { IpScope::Global } - }, + } _ => { if [ 0x06_u8, // 6.0.0.0/8 (US Army) @@ -281,7 +315,7 @@ impl InetAddress { } } } - }, + } AF_INET6 => { let ip = &*(&(self.sin6.sin6_addr) as *const in6_addr).cast::<[u8; 16]>(); if (ip[0] & 0xf0) == 0xf0 { @@ -293,11 +327,11 @@ impl InetAddress { while ip[k] == 0 && k < 15 { k += 1; } - if k == 15 && ip[15] == 0x01 { - return IpScope::Loopback; // fe80::1/128 + return if k == 15 && ip[15] == 0x01 { + IpScope::Loopback // fe80::1/128 } else { - return IpScope::LinkLocal; // fe80::/10 - } + IpScope::LinkLocal // fe80::/10 + }; } if (ip[0] & 0xfe) == 0xfc { return IpScope::Private; // fc00::/7 @@ -315,7 +349,7 @@ impl InetAddress { } } IpScope::Global - }, + } _ => IpScope::None } } @@ -326,37 +360,77 @@ impl InetAddress { unsafe { match self.sa.sa_family as u8 { AF_INET => { - let ip = self.sin.sin_addr.s_addr as u32; - format!("{}.{}.{}.{}", (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff) - }, + let ip = &*(&self.sin.sin_addr.s_addr as *const u32).cast::<[u8; 4]>(); + format!("{}.{}.{}.{}", ip[0], ip[1], ip[2], ip[3]) + } AF_INET6 => { Ipv6Addr::from(*(&(self.sin6.sin6_addr) as *const in6_addr).cast::<[u8; 16]>()).to_string() - }, + } _ => { String::from("(null)") } } } } + + pub fn marshal(&self, buf: &mut Buffer) -> std::io::Result<()> { + unsafe { + match self.sa.sa_family as u8 { + AF_INET => { + buf.append_and_init_bytes_fixed(|b: &mut [u8; 7]| { + b[0] = 4; + copy_nonoverlapping((&self.sin.sin_addr.s_addr as *const u32).cast::(), b.as_mut_ptr().offset(1), 4); + b[5] = *(&self.sin.sin_port as *const u16).cast::(); + b[6] = *(&self.sin.sin_port as *const u16).cast::().offset(1); + }) + } + AF_INET6 => { + buf.append_and_init_bytes_fixed(|b: &mut [u8; 19]| { + b[0] = 6; + copy_nonoverlapping((&(self.sin6.sin6_addr) as *const in6_addr).cast::(), b.as_mut_ptr().offset(1), 16); + b[17] = *(&self.sin6.sin6_port as *const u16).cast::(); + b[18] = *(&self.sin6.sin6_port as *const u16).cast::().offset(1); + }) + } + _ => { + buf.append_u8(0) + } + } + } + } + + pub fn unmarshal(buf: &Buffer, cursor: &mut usize) -> std::io::Result { + match buf.get_u8(cursor)? { + 4 => { + let b: &[u8; 6] = buf.get_bytes_fixed(cursor)?; + Ok(InetAddress::from_ip_port(&b[0..4], crate::util::integer_load_be_u16(&b[4..6]))) + } + 6 => { + let b: &[u8; 18] = buf.get_bytes_fixed(cursor)?; + Ok(InetAddress::from_ip_port(&b[0..16], crate::util::integer_load_be_u16(&b[16..18]))) + } + _ => Ok(InetAddress::new()) + } + } } impl ToString for InetAddress { fn to_string(&self) -> String { - let mut s = self.to_ip_string(); unsafe { + let mut s = self.to_ip_string(); match self.sa.sa_family as u8 { AF_INET => { s.push('/'); s.push_str(u16::from_be(self.sin.sin_port as u16).to_string().as_str()) - }, + } AF_INET6 => { s.push('/'); s.push_str(u16::from_be(self.sin6.sin6_port as u16).to_string().as_str()) - }, + } _ => {} } + s } - s } } @@ -369,7 +443,11 @@ impl FromStr for InetAddress { (s, 0) }, |pos| { let ss = s.split_at(pos); - (ss.0, u16::from_str_radix(ss.1, 10).unwrap_or(0).to_be()) + let mut port_str = ss.1; + if port_str.starts_with('/') { + port_str = &port_str[1..]; + } + (ss.0, u16::from_str_radix(port_str, 10).unwrap_or(0).to_be()) }); IpAddr::from_str(ip_str).map_or_else(|_| Err(InvalidFormatError), |ip| { unsafe { @@ -378,7 +456,7 @@ impl FromStr for InetAddress { addr.sin.sin_family = AF_INET.into(); addr.sin.sin_port = port.into(); copy_nonoverlapping(v4.octets().as_ptr(), (&mut (addr.sin.sin_addr.s_addr) as *mut u32).cast(), 4); - }, + } IpAddr::V6(v6) => { addr.sin6.sin6_family = AF_INET6.into(); addr.sin6.sin6_port = port.into(); @@ -396,14 +474,14 @@ impl PartialEq for InetAddress { unsafe { if self.sa.sa_family == other.sa.sa_family { match self.sa.sa_family as u8 { - AF_INET => { self.sin.sin_port == other.sin.sin_port && self.sin.sin_addr.s_addr == other.sin.sin_addr.s_addr }, + AF_INET => { self.sin.sin_port == other.sin.sin_port && self.sin.sin_addr.s_addr == other.sin.sin_addr.s_addr } AF_INET6 => { if self.sin6.sin6_port == other.sin6.sin6_port { equal_bytes((&(self.sin6.sin6_addr) as *const in6_addr).cast(), (&(other.sin6.sin6_addr) as *const in6_addr).cast(), 16) } else { false } - }, + } _ => true } } else { @@ -433,7 +511,7 @@ impl Ord for InetAddress { } else { u16::from_be(self.sin.sin_port as u16).cmp(&u16::from_be(other.sin.sin_port as u16)) } - }, + } AF_INET6 => { if self.sin6.sin6_port == other.sin6.sin6_port { let a = &*(&(self.sin6.sin6_addr) as *const in6_addr).cast::<[u8; 16]>(); @@ -442,7 +520,7 @@ impl Ord for InetAddress { } else { u16::from_be(self.sin6.sin6_port as u16).cmp(&u16::from_be(other.sin6.sin6_port as u16)) } - }, + } _ => { Ordering::Equal } @@ -464,11 +542,11 @@ impl Hash for InetAddress { AF_INET => { state.write_u16(self.sin.sin_port as u16); state.write_u32(self.sin.sin_addr.s_addr as u32); - }, + } AF_INET6 => { state.write_u16(self.sin6.sin6_port as u16); state.write(&*(&(self.sin6.sin6_addr) as *const in6_addr).cast::<[u8; 16]>()); - }, + } _ => {} } } @@ -477,19 +555,38 @@ impl Hash for InetAddress { #[cfg(test)] mod tests { + use std::str::FromStr; use crate::vl1::inetaddress::InetAddress; #[test] - fn struct_layout() { - let mut tmp = InetAddress::new(); + fn layout() { unsafe { - tmp.sa.sa_family = 0xf7; - if tmp.sin.sin_family != 0xf7 { + // Make sure union is laid out such that all the sockaddr structures overlap. + let mut tmp = InetAddress::new(); + tmp.sa.sa_family = 0xab; + if tmp.sin.sin_family != 0xab { panic!("sin_family misaligned in union"); } - if tmp.sin6.sin6_family != 0xf7 { + if tmp.sin6.sin6_family != 0xab { panic!("sin6_family misaligned in union"); } + if tmp.ss.ss_family != 0xab { + panic!("ss_family misaligned in union"); + } } } + + #[test] + fn ipv6_string() { + let ip = InetAddress::from_str("2603:6010:6e00:1118:d92a:ab88:4dfb:670a/1234").unwrap(); + assert_eq!("2603:6010:6e00:1118:d92a:ab88:4dfb:670a/1234", ip.to_string()); + let ip = InetAddress::from_str("fd80::1/1234").unwrap(); + assert_eq!("fd80::1/1234", ip.to_string()); + } + + #[test] + fn ipv4_string() { + let ip = InetAddress::from_str("1.2.3.4/1234").unwrap(); + assert_eq!("1.2.3.4/1234", ip.to_string()); + } } diff --git a/network-hypervisor/src/vl2/mac.rs b/network-hypervisor/src/vl1/mac.rs similarity index 100% rename from network-hypervisor/src/vl2/mac.rs rename to network-hypervisor/src/vl1/mac.rs diff --git a/network-hypervisor/src/vl1/mod.rs b/network-hypervisor/src/vl1/mod.rs index 319f8d319..d1e05935b 100644 --- a/network-hypervisor/src/vl1/mod.rs +++ b/network-hypervisor/src/vl1/mod.rs @@ -1,9 +1,15 @@ -pub mod protocol; -pub mod packet; -pub mod buffer; -pub mod node; +pub(crate) mod protocol; +pub(crate) mod packet; +pub(crate) mod buffer; pub mod identity; pub mod inetaddress; +pub mod endpoint; +pub(crate) mod node; mod address; +mod mac; + pub use address::Address; +pub use mac::MAC; +pub use identity::Identity; +pub use endpoint::Endpoint; diff --git a/network-hypervisor/src/vl1/packet.rs b/network-hypervisor/src/vl1/packet.rs index 917683999..d20e74e7d 100644 --- a/network-hypervisor/src/vl1/packet.rs +++ b/network-hypervisor/src/vl1/packet.rs @@ -1,9 +1,11 @@ -use crate::vl1::buffer::{Buffer, RawObject}; use crate::vl1::protocol::{HEADER_FLAGS_FIELD_MASK_CIPHER, HEADER_FLAGS_FIELD_MASK_HOPS, HEADER_FLAG_FRAGMENTED}; use std::ops::Not; type PacketID = u64; +/// A packet buffer, but with no header "personality." +pub type Buffer = crate::vl1::buffer::Buffer; + #[derive(Clone)] #[repr(packed)] pub struct Header { @@ -14,7 +16,7 @@ pub struct Header { pub message_auth: [u8; 8], } -unsafe impl RawObject for Header {} +unsafe impl crate::vl1::buffer::RawObject for Header {} impl Header { /// Get this packet's ID as a u64. @@ -51,7 +53,7 @@ impl Header { } } -pub type Packet = Buffer; +pub type Packet = crate::vl1::buffer::Buffer; #[derive(Clone)] #[repr(packed)] @@ -63,7 +65,7 @@ pub struct FragmentHeader { pub hops: u8, } -unsafe impl RawObject for FragmentHeader {} +unsafe impl crate::vl1::buffer::RawObject for FragmentHeader {} impl FragmentHeader { #[inline(always)] @@ -82,7 +84,7 @@ impl FragmentHeader { } } -pub type Fragment = Buffer; +pub type Fragment = crate::vl1::buffer::Buffer; #[cfg(test)] mod tests { diff --git a/network-hypervisor/src/vl2/mod.rs b/network-hypervisor/src/vl2/mod.rs index 9ac77518a..e69de29bb 100644 --- a/network-hypervisor/src/vl2/mod.rs +++ b/network-hypervisor/src/vl2/mod.rs @@ -1,3 +0,0 @@ -mod mac; - -pub use mac::MAC;