From 93f62952e6b4af75a04cf188dc7dc39ea6699a9f Mon Sep 17 00:00:00 2001 From: mamoniot Date: Sat, 25 Feb 2023 20:29:56 -0500 Subject: [PATCH] marked modified files with license notice --- crypto/src/aes_gmac_siv/AES-GMAC-SIV.png | Bin 153238 -> 0 bytes crypto/src/aes_gmac_siv/README.md | 102 ---- crypto/src/aes_gmac_siv/impl_macos.rs | 472 ------------------- crypto/src/aes_gmac_siv/impl_openssl.rs | 298 ------------ crypto/src/aes_gmac_siv/mod.rs | 572 ----------------------- crypto/src/lib.rs | 2 +- openssl-zt/src/aes.rs | 1 + openssl-zt/src/aes_gmac_siv.rs | 1 + openssl-zt/src/p384.rs | 1 - openssl-zt/src/rand.rs | 56 --- openssl-zt/src/random.rs | 1 - 11 files changed, 3 insertions(+), 1503 deletions(-) delete mode 100755 crypto/src/aes_gmac_siv/AES-GMAC-SIV.png delete mode 100644 crypto/src/aes_gmac_siv/README.md delete mode 100644 crypto/src/aes_gmac_siv/impl_macos.rs delete mode 100644 crypto/src/aes_gmac_siv/impl_openssl.rs delete mode 100644 crypto/src/aes_gmac_siv/mod.rs delete mode 100644 openssl-zt/src/rand.rs diff --git a/crypto/src/aes_gmac_siv/AES-GMAC-SIV.png b/crypto/src/aes_gmac_siv/AES-GMAC-SIV.png deleted file mode 100755 index c545b20b16efa28e509a58412669ae3151455c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153238 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
  • Q$nfynh>NX|JbNI8Mnoerurd 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 diff --git a/crypto/src/aes_gmac_siv/README.md b/crypto/src/aes_gmac_siv/README.md deleted file mode 100644 index 18ea7066e..000000000 --- a/crypto/src/aes_gmac_siv/README.md +++ /dev/null @@ -1,102 +0,0 @@ -AES-GMAC-SIV -====== - -**DEPRECATION NOTICE: this mode has been deprecated in ZeroTier V2 via its secure session protocol. It is still included for use with older nodes but the V2 session protocol removes the advantage of a SIV mode and allows us to use more standard and faster simple AEAD modes like GCM.** - -This is a Rust implementation of AES-GMAC-SIV, a FIPS-compliant SIV AEAD construction for AES-256. An interface to simple AES-CTR mode is also included. - -It's implemented in terms of OpenSSL (libcrypto), macOS/iOS CryptoCore, or (soon) WinCrypt, with the latter two automatically selected at compile time on those platforms. - -## Introduction - -AES-GMAC-SIV is a "synthetic IV" (SIV) cipher construction implemented using only FIPS and NIST approved cryptographic building blocks: AES and GMAC (the MAC component of GCM). It can for FIPS purposes be described as "AES-CTR authenticated with GMAC" both of which are permitted algorithms. It was created because while similar to [AES-GCM-SIV](https://en.wikipedia.org/wiki/AES-GCM-SIV) that mode uses a non-standard MAC called POLYVAL in place of GMAC. POLYVAL is just GMAC in little-endian, but the fact that it is not standard GMAC means it's not found in most cryptographic libraries and is not approved by FIPS and most other cryptographic standards. - -## About SIV Modes - -Stream ciphers like AES-CTR, ChaCha20, and others require a number called an initialization vector (IV) for each use. These and most other stream ciphers work by XORing a key stream with plaintext, so if an IV is used more than once security is compromised. Since XOR is commutative, if two different messages are encrypted with the same key stream a simple XOR can reveal that key stream and decrypt both messages. This is a common pitfall with any XOR based symmetric cipher construction. - -Repeating the IV is dangerous with many MAC (message authentication) functions as well. [It's particularly dangerous in AES-GCM](https://crypto.stackexchange.com/questions/26790/how-bad-it-is-using-the-same-iv-twice-with-aes-gcm), where one nonce reuse with GMAC (the MAC function in AES-GCM) could allow an attacker to forge messages. - -SIV stands for *synthetic IV*. SIV modes work by applying a MAC function to the plaintext first, then using the resulting authentication code plus an IV to initialize a stream cipher. This provides much stronger protection against IV reuse by making the actual IV dependent on the plaintext. Changes to the plaintext will therefore change the IV even if the one supplied to the function is duplicated. - -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: - - * Backing up and restoring counter or random seed files. - * Live cloning of virtual machines or application state, resulting in two clones with identical counters or random number generator states. - * Forgetting to use atomics or a mutex to synchronize an IV counter or a non-thread-safe random number generator. - * Hardware differences in concurrent memory access behavior causing synchronization issues when code is ported to new architectures. - * Embedded devices that lack a good source of randomness or have poorly implemented random initialization. - * Memory errors that corrupt an IV counter variable, especially if they can be triggered remotely. - * Time changes or attacks against NTP if a clock is used as an input in initializing a counter or random source. - * Rapid restarts of a service where clock is used as an input in IV initialization. - -... and so on. "Sudden death" on IV re-use is a foot-gun that's worth removing. - -## AES-GMAC-SIV - -![AES-GMAC-SIV block diagram](AES-GMAC-SIV.png) - -*Inputs are green, outputs are blue. Grey indicates simple non-cryptographic operations. Red indicates cryptographic steps.* - -Two initialization keys, which can be derived from a single key using a key derivation function or hashing with a 512-bit hash function and using the first and second 256 bits: - - 1. K0, a 256-bit AES key used to initialize AES-GMAC. - 2. K1, a second (and different) 256-bit 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, though a non-overlapping counter is preferred). - 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 with zeroes and use it to initialize GMAC. - 2. Feed AAD (if any) into GMAC prior to plaintext. - 3. Pad AAD length to a multiple of 16 by feeding zeroes into GMAC to ensure unique encoding. - 4. Feed plaintext into GMAC to compute final MAC. - 5. XOR lower 64 bits and higher 64 bits of 128-bit GMAC tag to yield a 64-bit tag. - 6. Concatenate original 64-bit input IV and 64-bit shortened tag to form a 128-bit block. - 7. AES-ECB encrypt this IV+tag, yielding an opaque 128-bit message tag and AES-CTR IV. (ECB is secure if only one block is encrypted.) - 8. Clear bit 31 (from the right) in the tag and use this to initialize AES-CTR with the first 96 bits being the AES-CTR IV and the remaining 31 bits being the AES-CTR "index" or counter. This provides what amounts to a 127-bit AES-CTR IV. The most significant bit of the counter is cleared so that poor quality AES-CTR implementations that only use a 32-bit wrapping counter will not wrap at message sizes up to 2^31 bytes. Wrapping technically wouldn't hurt anything unless the implementation generates a fault on wrap, but avoid this in case some cryptographic accelerator somewhere does so. - 9. Encrypt plaintext with AES-CTR and send this along with the encrypted IV+tag from step 7 (without CTR counter bit 31 cleared). The per-message unique 64-bit IV supplied by the caller at encryption **should not** be sent as it is recovered during decryption by decrypting the IV+tag blob. Sending it wastes space and reveals slightly more state information to an attacker, since without the input IV an attacker doesn't know if it has in fact been duplicated. - -Decryption steps: - -*Decryption reverses encryption steps 8, 9, 7, 1, 2, 3, 4, and 5, then authenticates.* - - 1. Initialize AES-CTR IV with the tag after clearning bit 31 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 using first 64 bits of the *decrypted* message tag and zero pad to 96 bits (as in encryption step 1). - 5. Feed AAD into GMAC (if any) (as in encryption step 2). - 6. Zero-pad AAD to a multiple of 16 (as in encryption step 3). - 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. - -## 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 --release -- --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** (per core). - * Apple M1 Mac Mini (2021): encrypt **4868.89 MiB/sec**, decrypt **5059.39 MiB/sec** (per performance core). - -In general this construction performs better than ChaChaPoly or other ARX ciphers on processors that have AES hardware acceleration and considerably worse on processors that lack it. Performance on systems without hardware acceleration is generally still good enough for most applications. - -## Security - -[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 Compliance - -AES-CTR, AES-ECB, 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 entirely standard building blocks, a FIPS certified cryptographic library can be used to implement it. - -## License - -This Rust implementation of AES-GMAC-SIV is released under the BSD 2-clause license. - -(c) 2021-2022 ZeroTier, Inc. diff --git a/crypto/src/aes_gmac_siv/impl_macos.rs b/crypto/src/aes_gmac_siv/impl_macos.rs deleted file mode 100644 index d86619624..000000000 --- a/crypto/src/aes_gmac_siv/impl_macos.rs +++ /dev/null @@ -1,472 +0,0 @@ -// (c) 2020-2022 ZeroTier, Inc. -- currently propritery pending actual release and licensing. See LICENSE.md. - -// AES-GMAC-SIV implemented using MacOS/iOS CommonCrypto (MacOS 10.13 or newer required). - -use std::os::raw::{c_int, c_void}; -use std::ptr::{null, null_mut}; - -#[allow(non_upper_case_globals)] -const kCCModeECB: i32 = 1; -#[allow(non_upper_case_globals)] -const kCCModeCTR: i32 = 4; -#[allow(non_upper_case_globals)] -const kCCModeGCM: i32 = 11; -#[allow(non_upper_case_globals)] -const kCCEncrypt: i32 = 0; -#[allow(non_upper_case_globals)] -const kCCDecrypt: i32 = 1; -#[allow(non_upper_case_globals)] -const kCCAlgorithmAES: i32 = 0; -#[allow(non_upper_case_globals)] -const kCCOptionECBMode: i32 = 2; - -extern "C" { - fn CCCryptorCreateWithMode( - op: i32, - mode: i32, - alg: i32, - padding: i32, - iv: *const c_void, - key: *const c_void, - key_len: usize, - tweak: *const c_void, - tweak_len: usize, - num_rounds: c_int, - options: i32, - cryyptor_ref: *mut *mut c_void, - ) -> i32; - fn CCCryptorUpdate( - cryptor_ref: *mut c_void, - data_in: *const c_void, - data_in_len: usize, - data_out: *mut c_void, - data_out_len: usize, - data_out_written: *mut usize, - ) -> i32; - fn CCCryptorReset(cryptor_ref: *mut c_void, iv: *const c_void) -> i32; - fn CCCryptorRelease(cryptor_ref: *mut c_void) -> i32; - fn CCCryptorGCMSetIV(cryptor_ref: *mut c_void, iv: *const c_void, iv_len: usize) -> i32; - fn CCCryptorGCMAddAAD(cryptor_ref: *mut c_void, aad: *const c_void, len: usize) -> i32; - fn CCCryptorGCMFinalize(cryptor_ref: *mut c_void, tag: *mut c_void, tag_len: usize) -> i32; - fn CCCryptorGCMReset(cryptor_ref: *mut c_void) -> i32; -} - -pub struct AesCtr(*mut c_void); - -impl Drop for AesCtr { - fn drop(&mut self) { - if !self.0.is_null() { - unsafe { - CCCryptorRelease(self.0); - } - } - } -} - -impl AesCtr { - /// Construct a new AES-CTR cipher. - /// Key must be 16, 24, or 32 bytes in length or a panic will occur. - pub fn new(k: &[u8]) -> Self { - if k.len() != 32 && k.len() != 24 && k.len() != 16 { - panic!("AES supports 128, 192, or 256 bits keys"); - } - unsafe { - let mut ptr: *mut c_void = null_mut(); - let result = CCCryptorCreateWithMode( - kCCEncrypt, - kCCModeCTR, - kCCAlgorithmAES, - 0, - crate::ZEROES.as_ptr().cast(), - k.as_ptr().cast(), - k.len(), - null(), - 0, - 0, - 0, - &mut ptr, - ); - if result != 0 { - panic!("CCCryptorCreateWithMode for CTR mode returned {}", result); - } - AesCtr(ptr) - } - } - - /// Initialize AES-CTR for encryption or decryption with the given IV. - /// If it's already been used, this also resets the cipher. There is no separate reset. - pub fn init(&mut self, iv: &[u8]) { - unsafe { - if iv.len() == 16 { - if CCCryptorReset(self.0, iv.as_ptr().cast()) != 0 { - panic!("CCCryptorReset for CTR mode failed (old MacOS bug)"); - } - } else if iv.len() < 16 { - let mut iv2 = [0_u8; 16]; - iv2[0..iv.len()].copy_from_slice(iv); - if CCCryptorReset(self.0, iv2.as_ptr().cast()) != 0 { - panic!("CCCryptorReset for CTR mode failed (old MacOS bug)"); - } - } else { - panic!("CTR IV must be less than or equal to 16 bytes in length"); - } - } - } - - /// Encrypt or decrypt (same operation with CTR mode) - #[inline(always)] - pub fn crypt(&mut self, input: &[u8], output: &mut [u8]) { - unsafe { - assert!(output.len() >= input.len()); - let mut data_out_written: usize = 0; - CCCryptorUpdate( - self.0, - input.as_ptr().cast(), - input.len(), - output.as_mut_ptr().cast(), - output.len(), - &mut data_out_written, - ); - } - } - - /// Encrypt or decrypt in place (same operation with CTR mode) - #[inline(always)] - pub fn crypt_in_place(&mut self, data: &mut [u8]) { - unsafe { - let mut data_out_written: usize = 0; - CCCryptorUpdate( - self.0, - data.as_ptr().cast(), - data.len(), - data.as_mut_ptr().cast(), - data.len(), - &mut data_out_written, - ); - } - } -} - -unsafe impl Send for AesCtr {} - -#[repr(align(8))] -pub struct AesGmacSiv { - tag: [u8; 16], - tmp: [u8; 16], - ctr: *mut c_void, - ecb_enc: *mut c_void, - ecb_dec: *mut c_void, - gmac: *mut c_void, -} - -impl Drop for AesGmacSiv { - fn drop(&mut self) { - unsafe { - if !self.ctr.is_null() { - CCCryptorRelease(self.ctr); - } - if !self.ecb_enc.is_null() { - CCCryptorRelease(self.ecb_enc); - } - if !self.ecb_dec.is_null() { - CCCryptorRelease(self.ecb_dec); - } - if !self.gmac.is_null() { - CCCryptorRelease(self.gmac); - } - } - } -} - -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. - 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], - ctr: null_mut(), - ecb_enc: null_mut(), - ecb_dec: null_mut(), - gmac: null_mut(), - }; - unsafe { - 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(), - 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(), - 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(), - k0.as_ptr().cast(), - k0.len(), - null(), - 0, - 0, - 0, - &mut c.gmac, - ); - if result != 0 { - panic!("CCCryptorCreateWithMode for GCM (GMAC) mode returned {}", result); - } - } - c - } - - /// Reset to prepare for another encrypt or decrypt operation. - #[inline(always)] - pub fn reset(&mut self) { - unsafe { - CCCryptorGCMReset(self.gmac); - } - } - - /// Initialize for encryption. - #[inline(always)] - pub fn encrypt_init(&mut self, iv: &[u8]) { - self.tag[0..8].copy_from_slice(iv); - self.tag[8..12].fill(0); - unsafe { - CCCryptorGCMSetIV(self.gmac, self.tag.as_ptr().cast(), 12); - } - } - - /// Set additional authenticated data (data to be authenticated but not encrypted). - /// This can currently only be called once. Multiple calls will result in corrupt data. - #[inline(always)] - pub fn encrypt_set_aad(&mut self, data: &[u8]) { - unsafe { - CCCryptorGCMAddAAD(self.gmac, data.as_ptr().cast(), data.len()); - } - let pad = data.len() & 0xf; - if pad != 0 { - unsafe { - CCCryptorGCMAddAAD(self.gmac, crate::ZEROES.as_ptr().cast(), 16 - pad); - } - } - } - - /// Feed plaintext in for the first encryption pass. - /// This may be called more than once. - #[inline(always)] - pub fn encrypt_first_pass(&mut self, plaintext: &[u8]) { - unsafe { - CCCryptorGCMAddAAD(self.gmac, plaintext.as_ptr().cast(), plaintext.len()); - } - } - - /// Finish first pass and begin second pass. - #[inline(always)] - pub fn encrypt_first_pass_finish(&mut self) { - unsafe { - CCCryptorGCMFinalize(self.gmac, self.tmp.as_mut_ptr().cast(), 16); - let tmp = self.tmp.as_mut_ptr().cast::(); - *self.tag.as_mut_ptr().cast::().offset(1) = *tmp ^ *tmp.offset(1); - let mut data_out_written: usize = 0; - CCCryptorUpdate( - self.ecb_enc, - self.tag.as_ptr().cast(), - 16, - self.tag.as_mut_ptr().cast(), - 16, - &mut data_out_written, - ); - } - self.tmp.copy_from_slice(&self.tag); - self.tmp[12] &= 0x7f; - unsafe { - if CCCryptorReset(self.ctr, self.tmp.as_ptr().cast()) != 0 { - panic!("CCCryptorReset for CTR mode failed (old MacOS bug)"); - } - } - } - - /// Feed plaintext for second pass and write ciphertext to supplied buffer. - /// This may be called more than once. - #[inline(always)] - pub fn encrypt_second_pass(&mut self, plaintext: &[u8], ciphertext: &mut [u8]) { - unsafe { - assert!(ciphertext.len() >= plaintext.len()); - let mut data_out_written: usize = 0; - CCCryptorUpdate( - self.ctr, - plaintext.as_ptr().cast(), - plaintext.len(), - ciphertext.as_mut_ptr().cast(), - ciphertext.len(), - &mut data_out_written, - ); - } - } - - /// Encrypt plaintext in place. - /// This may be called more than once. - #[inline(always)] - pub fn encrypt_second_pass_in_place(&mut self, plaintext_to_ciphertext: &mut [u8]) { - unsafe { - let mut data_out_written: usize = 0; - CCCryptorUpdate( - self.ctr, - plaintext_to_ciphertext.as_ptr().cast(), - plaintext_to_ciphertext.len(), - plaintext_to_ciphertext.as_mut_ptr().cast(), - plaintext_to_ciphertext.len(), - &mut data_out_written, - ); - } - } - - /// Finish second pass and return a reference to the tag for this message. - /// The tag returned remains valid until reset() is called. - #[inline(always)] - pub fn encrypt_second_pass_finish(&mut self) -> &[u8; 16] { - return &self.tag; - } - - #[inline(always)] - fn decrypt_init_internal(&mut self) { - self.tmp[12] &= 0x7f; - unsafe { - if CCCryptorReset(self.ctr, self.tmp.as_ptr().cast()) != 0 { - panic!("CCCryptorReset for CTR mode failed (old MacOS bug)"); - } - let mut data_out_written = 0; - CCCryptorUpdate( - self.ecb_dec, - self.tag.as_ptr().cast(), - 16, - self.tag.as_mut_ptr().cast(), - 16, - &mut data_out_written, - ); - let tmp = self.tmp.as_mut_ptr().cast::(); - *tmp = *self.tag.as_mut_ptr().cast::(); - *tmp.add(1) = 0; - CCCryptorGCMSetIV(self.gmac, self.tmp.as_ptr().cast(), 12); - } - } - - /// Initialize this cipher for decryption. - /// The supplied tag must be 16 bytes in length. Any other length will panic. - #[inline(always)] - pub fn decrypt_init(&mut self, tag: &[u8]) { - self.tmp.copy_from_slice(tag); - self.tag.copy_from_slice(tag); - self.decrypt_init_internal(); - } - - /// Set additional authenticated data to be checked. - #[inline(always)] - pub fn decrypt_set_aad(&mut self, data: &[u8]) { - self.encrypt_set_aad(data); - } - - /// Decrypt ciphertext and write to plaintext. - /// This may be called more than once. - #[inline(always)] - pub fn decrypt(&mut self, ciphertext: &[u8], plaintext: &mut [u8]) { - unsafe { - let mut data_out_written = 0; - CCCryptorUpdate( - self.ctr, - ciphertext.as_ptr().cast(), - ciphertext.len(), - plaintext.as_mut_ptr().cast(), - plaintext.len(), - &mut data_out_written, - ); - CCCryptorGCMAddAAD(self.gmac, plaintext.as_ptr().cast(), plaintext.len()); - } - } - - /// Decrypt ciphertext in place. - /// This may be called more than once. - #[inline(always)] - pub fn decrypt_in_place(&mut self, ciphertext_to_plaintext: &mut [u8]) { - unsafe { - let mut data_out_written = 0; - CCCryptorUpdate( - self.ctr, - ciphertext_to_plaintext.as_ptr().cast(), - ciphertext_to_plaintext.len(), - ciphertext_to_plaintext.as_mut_ptr().cast(), - ciphertext_to_plaintext.len(), - &mut data_out_written, - ); - CCCryptorGCMAddAAD(self.gmac, ciphertext_to_plaintext.as_ptr().cast(), ciphertext_to_plaintext.len()); - } - } - - /// Finish decryption and returns the decrypted tag if the message appears valid. - #[inline(always)] - pub fn decrypt_finish(&mut self) -> Option<&[u8; 16]> { - unsafe { - CCCryptorGCMFinalize(self.gmac, self.tmp.as_mut_ptr().cast(), 16); - let tmp = self.tmp.as_mut_ptr().cast::(); - if *self.tag.as_mut_ptr().cast::().offset(1) == *tmp ^ *tmp.offset(1) { - Some(&self.tag) - } else { - None - } - } - } -} - -unsafe impl Send for AesGmacSiv {} diff --git a/crypto/src/aes_gmac_siv/impl_openssl.rs b/crypto/src/aes_gmac_siv/impl_openssl.rs deleted file mode 100644 index edd856fd9..000000000 --- a/crypto/src/aes_gmac_siv/impl_openssl.rs +++ /dev/null @@ -1,298 +0,0 @@ -// (c) 2020-2022 ZeroTier, Inc. -- currently propritery pending actual release and licensing. See LICENSE.md. - -// AES-GMAC-SIV implemented using OpenSSL. - -use openssl::symm::{Cipher, Crypter, Mode}; - -#[inline(always)] -fn aes_ctr_by_key_size(ks: usize) -> Cipher { - match ks { - 16 => Cipher::aes_128_ctr(), - 24 => Cipher::aes_192_ctr(), - 32 => Cipher::aes_256_ctr(), - _ => { - panic!("AES supports 128, 192, or 256 bits keys"); - } - } -} - -#[inline(always)] -fn aes_gcm_by_key_size(ks: usize) -> Cipher { - match ks { - 16 => Cipher::aes_128_gcm(), - 24 => Cipher::aes_192_gcm(), - 32 => Cipher::aes_256_gcm(), - _ => { - panic!("AES supports 128, 192, or 256 bits keys"); - } - } -} - -#[inline(always)] -fn aes_ecb_by_key_size(ks: usize) -> Cipher { - match ks { - 16 => Cipher::aes_128_ecb(), - 24 => Cipher::aes_192_ecb(), - 32 => Cipher::aes_256_ecb(), - _ => { - panic!("AES supports 128, 192, or 256 bits keys"); - } - } -} - -pub struct AesCtr(Vec, Option); - -impl AesCtr { - /// Construct a new AES-CTR cipher. - /// Key must be 16, 24, or 32 bytes in length or a panic will occur. - pub fn new(k: &[u8]) -> Self { - if k.len() != 32 && k.len() != 24 && k.len() != 16 { - panic!("AES supports 128, 192, or 256 bits keys"); - } - AesCtr(k.to_vec(), None) - } - - /// Initialize AES-CTR for encryption or decryption with the given IV. - /// If it's already been used, this also resets the cipher. There is no separate reset. - #[inline(always)] - pub fn init(&mut self, iv: &[u8]) { - let _ = self - .1 - .replace(Crypter::new(aes_ctr_by_key_size(self.0.len()), Mode::Encrypt, self.0.as_slice(), Some(iv)).unwrap()); - } - - /// Encrypt or decrypt (same operation with CTR mode) - #[inline(always)] - pub fn crypt(&mut self, input: &[u8], output: &mut [u8]) { - let _ = self.1.as_mut().unwrap().update(input, output); - } - - /// Encrypt or decrypt in place (same operation with CTR mode) - #[inline(always)] - pub fn crypt_in_place(&mut self, data: &mut [u8]) { - let _ = self - .1 - .as_mut() - .unwrap() - .update(unsafe { &*std::slice::from_raw_parts(data.as_ptr(), data.len()) }, data); - } -} - -unsafe impl Send for AesCtr {} - -/// AES-GMAC-SIV encryptor/decryptor. -pub struct AesGmacSiv { - tag: [u8; 16], - tmp: [u8; 16], - k0: Vec, - k1: Vec, - ctr: Option, - gmac: Option, -} - -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. - 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"); - } - AesGmacSiv { - tag: [0_u8; 16], - tmp: [0_u8; 16], - k0: k0.to_vec(), - k1: k1.to_vec(), - ctr: None, - gmac: None, - } - } - - /// Reset to prepare for another encrypt or decrypt operation. - #[inline(always)] - pub fn reset(&mut self) { - let _ = self.ctr.take(); - let _ = self.gmac.take(); - } - - /// Initialize for encryption. - #[inline(always)] - pub fn encrypt_init(&mut self, iv: &[u8]) { - self.tag[0..8].copy_from_slice(iv); - self.tag[8..12].fill(0); - let _ = self.gmac.replace( - Crypter::new( - aes_gcm_by_key_size(self.k0.len()), - Mode::Encrypt, - self.k0.as_slice(), - Some(&self.tag[0..12]), - ) - .unwrap(), - ); - } - - /// Set additional authenticated data (data to be authenticated but not encrypted). - /// This can currently only be called once. Multiple calls will result in corrupt data. - #[inline(always)] - pub fn encrypt_set_aad(&mut self, data: &[u8]) { - let gmac = self.gmac.as_mut().unwrap(); - let _ = gmac.aad_update(data); - let mut pad = data.len() & 0xf; - if pad != 0 { - pad = 16 - pad; - let _ = gmac.aad_update(&crate::ZEROES[0..pad]); - } - } - - /// Feed plaintext in for the first encryption pass. - /// This may be called more than once. - #[inline(always)] - pub fn encrypt_first_pass(&mut self, plaintext: &[u8]) { - let _ = self.gmac.as_mut().unwrap().aad_update(plaintext); - } - - /// Finish first pass and begin second pass. - #[inline(always)] - pub fn encrypt_first_pass_finish(&mut self) { - let gmac = self.gmac.as_mut().unwrap(); - let _ = gmac.finalize(&mut self.tmp); - let _ = gmac.get_tag(&mut self.tmp); - self.tag[8] = self.tmp[0] ^ self.tmp[8]; - self.tag[9] = self.tmp[1] ^ self.tmp[9]; - self.tag[10] = self.tmp[2] ^ self.tmp[10]; - self.tag[11] = self.tmp[3] ^ self.tmp[11]; - self.tag[12] = self.tmp[4] ^ self.tmp[12]; - self.tag[13] = self.tmp[5] ^ self.tmp[13]; - self.tag[14] = self.tmp[6] ^ self.tmp[14]; - self.tag[15] = self.tmp[7] ^ self.tmp[15]; - - let mut tag_tmp = [0_u8; 32]; - let mut ecb = Crypter::new(aes_ecb_by_key_size(self.k1.len()), Mode::Encrypt, self.k1.as_slice(), None).unwrap(); - ecb.pad(false); - if ecb.update(&self.tag, &mut tag_tmp).unwrap() != 16 { - assert_eq!(ecb.finalize(&mut tag_tmp).unwrap(), 16); - } - self.tag.copy_from_slice(&tag_tmp[0..16]); - self.tmp.copy_from_slice(&tag_tmp[0..16]); - - self.tmp[12] &= 0x7f; - let _ = self.ctr.replace( - Crypter::new( - aes_ctr_by_key_size(self.k1.len()), - Mode::Encrypt, - self.k1.as_slice(), - Some(&self.tmp), - ) - .unwrap(), - ); - } - - /// Feed plaintext for second pass and write ciphertext to supplied buffer. - /// This may be called more than once. - #[inline(always)] - pub fn encrypt_second_pass(&mut self, plaintext: &[u8], ciphertext: &mut [u8]) { - let _ = self.ctr.as_mut().unwrap().update(plaintext, ciphertext); - } - - /// Encrypt plaintext in place. - /// This may be called more than once. - #[inline(always)] - pub fn encrypt_second_pass_in_place(&mut self, plaintext_to_ciphertext: &mut [u8]) { - let _ = self.ctr.as_mut().unwrap().update( - unsafe { std::slice::from_raw_parts(plaintext_to_ciphertext.as_ptr(), plaintext_to_ciphertext.len()) }, - plaintext_to_ciphertext, - ); - } - - /// Finish second pass and return a reference to the tag for this message. - /// The tag returned remains valid until reset() is called. - #[inline(always)] - pub fn encrypt_second_pass_finish(&mut self) -> &[u8; 16] { - return &self.tag; - } - - /// Initialize this cipher for decryption. - /// The supplied tag must be 16 bytes in length. Any other length will panic. - #[inline(always)] - pub fn decrypt_init(&mut self, tag: &[u8]) { - self.tmp.copy_from_slice(tag); - self.tmp[12] &= 0x7f; - let _ = self.ctr.replace( - Crypter::new( - aes_ctr_by_key_size(self.k1.len()), - Mode::Decrypt, - self.k1.as_slice(), - Some(&self.tmp), - ) - .unwrap(), - ); - - let mut tag_tmp = [0_u8; 32]; - let mut ecb = Crypter::new(aes_ecb_by_key_size(self.k1.len()), Mode::Decrypt, self.k1.as_slice(), None).unwrap(); - ecb.pad(false); - if ecb.update(tag, &mut tag_tmp).unwrap() != 16 { - assert_eq!(ecb.finalize(&mut tag_tmp).unwrap(), 16); - } - self.tag.copy_from_slice(&tag_tmp[0..16]); - tag_tmp[8..12].fill(0); - let _ = self.gmac.replace( - Crypter::new( - aes_gcm_by_key_size(self.k0.len()), - Mode::Encrypt, - self.k0.as_slice(), - Some(&tag_tmp[0..12]), - ) - .unwrap(), - ); - } - - /// Set additional authenticated data to be checked. - #[inline(always)] - pub fn decrypt_set_aad(&mut self, data: &[u8]) { - self.encrypt_set_aad(data); - } - - /// Decrypt ciphertext and write to plaintext. - /// This may be called more than once. - #[inline(always)] - pub fn decrypt(&mut self, ciphertext: &[u8], plaintext: &mut [u8]) { - let _ = self.ctr.as_mut().unwrap().update(ciphertext, plaintext); - let _ = self.gmac.as_mut().unwrap().aad_update(plaintext); - } - - /// Decrypt ciphertext in place. - /// This may be called more than once. - #[inline(always)] - pub fn decrypt_in_place(&mut self, ciphertext_to_plaintext: &mut [u8]) { - self.decrypt( - unsafe { std::slice::from_raw_parts(ciphertext_to_plaintext.as_ptr(), ciphertext_to_plaintext.len()) }, - ciphertext_to_plaintext, - ); - } - - /// Finish decryption and return true if authentication appears valid. - /// If this returns false the message should be dropped. - #[inline(always)] - pub fn decrypt_finish(&mut self) -> Option<&[u8; 16]> { - let gmac = self.gmac.as_mut().unwrap(); - let _ = gmac.finalize(&mut self.tmp); - let _ = gmac.get_tag(&mut self.tmp); - if (self.tag[8] == self.tmp[0] ^ self.tmp[8]) - && (self.tag[9] == self.tmp[1] ^ self.tmp[9]) - && (self.tag[10] == self.tmp[2] ^ self.tmp[10]) - && (self.tag[11] == self.tmp[3] ^ self.tmp[11]) - && (self.tag[12] == self.tmp[4] ^ self.tmp[12]) - && (self.tag[13] == self.tmp[5] ^ self.tmp[13]) - && (self.tag[14] == self.tmp[6] ^ self.tmp[14]) - && (self.tag[15] == self.tmp[7] ^ self.tmp[15]) - { - Some(&self.tag) - } else { - None - } - } -} - -unsafe impl Send for AesGmacSiv {} diff --git a/crypto/src/aes_gmac_siv/mod.rs b/crypto/src/aes_gmac_siv/mod.rs deleted file mode 100644 index 06d48a802..000000000 --- a/crypto/src/aes_gmac_siv/mod.rs +++ /dev/null @@ -1,572 +0,0 @@ -// (c) 2020-2022 ZeroTier, Inc. -- currently propritery pending actual release and licensing. See LICENSE.md. - -#[cfg(any(target_os = "macos", target_os = "ios"))] -#[allow(unused)] -mod impl_macos; - -#[cfg(not(any(target_os = "macos", target_os = "ios")))] -#[allow(unused)] -mod impl_openssl; - -#[cfg(any(target_os = "macos", target_os = "ios"))] -pub use crate::aes_gmac_siv::impl_macos::AesGmacSiv; - -#[cfg(not(any(target_os = "macos", target_os = "ios")))] -pub use crate::aes_gmac_siv::impl_openssl::AesGmacSiv; - -#[cfg(test)] -mod tests { - use crate::aes_gmac_siv::AesGmacSiv; - use sha2::Digest; - use std::time::SystemTime; - - const TV0_KEYS: [&'static [u8]; 2] = [ - "00000000000000000000000000000000".as_bytes(), - "11111111111111111111111111111111".as_bytes(), - ]; - - /// Test vectors consist of a series of input sizes, a SHA384 hash of a resulting ciphertext, and an expected tag. - /// Input is a standard byte array consisting of bytes 0, 1, 2, 3, ..., 255 and then cycling back to 0 over and over - /// and is provided both as ciphertext and associated data (AAD). - #[allow(unused)] - const TEST_VECTORS: [(usize, &'static str, &'static str); 85] = [ - ( - 0, - "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", - "43847e644239134deccf5538162c861e", - ), - ( - 777, - "aabf892f18a620b9c3bae91bb03a74c84193e4a7b64916c6bc88b885b9ebed4134495e5f22f12e3046fbb3f26fa111a7", - "b8c318b5dcc1d672114a6f7be54ef289", - ), - ( - 1554, - "648f551df29217f0e634b72ba6973c0eb95c7d4be8b135e550d8bcdf65b75980881bc0e03cf22589e04bedc7da1804cd", - "535b8ddd51ec82a1e850906fe321b21a", - ), - ( - 2331, - "bfbfdffea40062e23bbdf0835e1d38d1623bebca7407908bbc6d5b3f2bfd062a2d237f091affda7348094fafda0bd1a7", - "4f521876fbb2c563051196b33c20c822", - ), - ( - 3108, - "cc6035cab70f3a3298a5c4956ff07f179acf3771bb915c590a8a19fe5133d6d8a81c118148394dfb364af5c2fbdaadeb", - "d3adfa578c8bcd738c55ffc527358cef", - ), - ( - 3885, - "15ec2760a21c25f9870a84ee757f3da2c261a950c2f692d75ff9e99b2d50c826c21e27e49c4cd3450fedc7e60371589f", - "a4c22d6c3d773634c2dc057e1f7c6738", - ), - ( - 4662, - "c2afad6f034704300c34f143dcdcb86c9b954cec1ebf22e7071f288c58a2ae430d3e3748d214d1021472793d3f337dc6", - "c0601cb6cd4883102f70570c2cdc0ab6", - ), - ( - 5439, - "8fee067f5a7a475a630f9db8b2eb80c1edc40eb4246a0f1c078e535df7d06451c6a9bde1a23ba70285690dd7100a8626", - "7352239f2302b08844309d28b13fa867", - ), - ( - 6216, - "60095b4172438aee61e65f5379f4ef276c3632d4ac74eea7723a2201823432614aba7b4670d9bf7a5b9126ca38f3b88a", - "c0f0b0aa651965f8514b473c5406285e", - ), - ( - 6993, - "10e754dd08b4d2a6c109fb01fce2b57d54743947e14a7e67d7efd0608baf91f7fc42a53328fe8c18d234abad8ebcdff0", - "58444988a62a99060728a7637c8499eb", - ), - ( - 7770, - "1abc4a5dcd2696336bd0e8af20fe7fc261aa424b52cfb5ad80ee7c7c793ac44f11db3506cdbbbaed0f80000925d08d52", - "e8065c563bc6018cdcbf9aaafef767e6", - ), - ( - 8547, - "26aaf74ae8bfc6aaf45ceee0476ea0a484304f5c36050d3e2265cb194a2f7c308213314232270608b6d3f1c11b834e33", - "ec50e4b3f6e4b3de24b3476623d08157", - ), - ( - 9324, - "863206305d466aa9c0d0ec674572069f61fe5009767f99ec8832912725c28c49d6a106ad3f55372c922e4e169fc382ce", - "0cfac64f49e0f128d0a18d293878f222", - ), - ( - 10101, - "bd0c0950b947a6c34f1fa6e877433b42c039a8ea7b37634c40fb47efae4958ba74ef0991cfedf3c82a0b87ef59635071", - "e0220a02b74259eeebbebede847d50f9", - ), - ( - 10878, - "d7b9901af1dacf6a8c369b993ba1c607f9b7f073d02311c72d8449d3494d477ffc8344a1d8b488020ccfc7c80fbd27e1", - "ebe3933146734a6ade2b434f2bcd78ae", - ), - ( - 11655, - "0ba265e3ef0bebf01a4f3490da462c7730aad6aa6c70bb9ce64a36d26d24fe213660e60e4d3301329170471f11ff8ca2", - "ec3dd4bf4cb7d527a86dd559c773a87b", - ), - ( - 12432, - "c3b6755a1be922ec71c1e187ead36c4e6fc307c72969c64ca1e9b7339d61e1a93a74a315fd73bed8fa5797b78b19dbe5", - "5b58dcf392749bcef91056ba9475d0ef", - ), - ( - 13209, - "2fb1a67151183daa2f0d7f0064534497357f173161349dd008499a8c1a123cc942662ecc426e2ad7743fe0ab9f5d7be1", - "c011260d328d310e2ab606aa1ef8afd4", - ), - ( - 13986, - "6afae2a07ce9bfe30fbbfb7dcf32d755bcf357334dc5c309e58cab38ebe559f25b313a0b3ca32ff1dc41f7b99718f653", - "011bf43cfbbb7ae5986f8e0fc87771a9", - ), - ( - 14763, - "cc6215c115eb6411f4712c2289f5bf0ccb5151635f9f9ceac7c1b62d8d2f4d26498079d0289f83aeb26e97b5b924ffc4", - "a015034a8d5bc83cc76c6983a5ba19ab", - ), - ( - 15540, - "3cebce794e947341c4ceec444ca43c6ac57c6f58de462bfec7566cbd59a1b6f2eae774120e29521e76120a604d1a12d9", - "d373cd2bd9000655141ac632880eca40", - ), - ( - 16317, - "899147b98d78bb5d137dc7c4f03be7eca82bcca19cc3a701261332923707aed2e6719d35d2f2bf067cd1d193a53529cf", - "ed223b64529299c787f49d631ce181c1", - ), - ( - 17094, - "aecd1830958b994b2c331b90e7d8ff79f27c83a71f5797a65ade3a30b4fa5928e79140bcd03f375591d53df96fea1a4d", - "948a7c253d54bb6b65d78530c0eb7aab", - ), - ( - 17871, - "e677ffd4ecaba5899659fefe5fe8e643004392be3be6dc5a801409870ac1e3398f47cc1d83f7a4c41925b6337e01f7fd", - "156a600c336f3ac034ca90034aa22635", - ), - ( - 18648, - "4ee50f4a98d0bbd160add6acf76765ccdac0c1cd0bb2adbbcb22dd012a1121620b739a120df7dc4091e684ddf28eb726", - "75873467b416a7b025f9f1b015bf653a", - ), - ( - 19425, - "aa025f32c0575af7209828fc7fc4591b41fa7cfb485e26c5401e63ca1fa05776f8b8af1769a15e81f2c663bca9b02ab3", - "5679efa7a4404e1e5c9b372782a41bf2", - ), - ( - 20202, - "6e77ab62d2affeb27f4ef326191b3df3863c338a629f64a785505f4a5968ff59bc011c7a27951cb00e2e7d9b9bd32fec", - "36a9c4515d34f9bb962d8876ab3b5c86", - ), - ( - 20979, - "1625b4f0e65fc66f11ba3ee6b3e20c732535654c447df6b517ced113107a1057a64477faa2af4a5ede4034bf3cff98ea", - "9058044e0f71c28d4f8d3281a3aec024", - ), - ( - 21756, - "94efe6aa55bd77bfa58c185dec313a41003f9bef02568e72c337be4de1b46c6e5bb9a9329b4f108686489b8bc9d5f4f0", - "8d6d2c90590268a26f5e7d76351f48c1", - ), - ( - 22533, - "7327a05fdb0ac92433dfc2c85c5e96e6ddcbdb01e079f8dafbee79c14cb4d5fd46047acd6bb0e09a98f6dd03dced2a0a", - "4e0f0a394f85bca35c68ef667aa9c244", - ), - ( - 23310, - "93da9e356efbc8b5ae366256f4c6fc11c11fc347aaa879d591b7c1262d90adf98925f571914696054f1d09c74783561e", - "8c83c157be439280afc790ee3fd667eb", - ), - ( - 24087, - "99b91be5ffca51b1cbc7410798b1540b5b1a3356f801ed4dc54812919c08ca5a9adc218bc51e594d97b46445a1515506", - "9436ff05729a77f673e815e464aeaa75", - ), - ( - 24864, - "074253ad5d5a5d2b072e7aeaffa04a06119ec812a88ca43481fe5e2dce02cf6736952095cd342ec70b833c12fc1777f4", - "69d8951b96866a08efbb65f2bc31cfbc", - ), - ( - 25641, - "c0a301f90597c05cf19e60c35378676764086b7156e455f4800347f8a6e733d644e4cc709fb9d95a9211f3e1e10c762a", - "3561c9802143c306ecc5e07e3b976d9e", - ), - ( - 26418, - "3c839e59d945b841acb604e1b9ae3df36a291444ce0bcae336ee875beaf208bf10af7342b375429ecb92ec54d11a5907", - "3032ffdb8daee11b2e739132c6175615", - ), - ( - 27195, - "3dc59b16603950dfc26a90bf036712eb088412e8de4d1b27c3fa6be6502ac12d89d194764fb53c3dc7d90fa696ba5a16", - "49436717edff7cd67c9a1be16d524f07", - ), - ( - 27972, - "4fbc0d40ff13376b8ed5382890cdea337b4a0c9c31b477c4008d2ef8299bd5ab771ba70b1b4b743f8f7caa1f0164d1a1", - "64a9856a3bb81dc81ff1bc1025192dc9", - ), - ( - 28749, - "6ab191aa6327f229cc94e8c7b1b7ee30bc723e6aeaf3050eb7d14cb491c3513254e9b19894c2b4f071d298401fd31945", - "101f2ffea60f246a3b57c4a530d67cf1", - ), - ( - 29526, - "d06dece58e6c7345986aae4b7f15b3317653f5387d6262f389b5cbbe804568124a876eabb89204e96b3c0f7b552df3c4", - "5c0e873adba65a9f4cb24cce4f194b18", - ), - ( - 30303, - "7a33c1268eafdc1f89ad460fa4ded8d3df9a3cabe4339706877878c64a2c8080cf3fa5ea7f2f24744e3341476b1eb5a5", - "b7dc708fc46ce5cde24a31ad549fec83", - ), - ( - 31080, - "37bf1f9fca6d705b989b2d63259ca924dc860fc6027e07d9aad79b94841227739774f5d324590df45d8f41249ef742ea", - "8ead50308c281e699b79b69dad7ecb91", - ), - ( - 31857, - "91b120c73be86f9d53326fa707cfa1411e5ac76ab998a2d7ebd73a75e3b1a04c9f0855d102184b8a3fd5d99818b0b134", - "6056d09595bd16bfa317c6f87ce64bb7", - ), - ( - 32634, - "42cc255c06184ead57b27efd0cefb0f2c788c8962a6fd15db3f25533a7f49700bca85af916f9e985f1941a6e66943b38", - "3b15e332d2f53bb97e1a9d03e6113b97", - ), - ( - 33411, - "737f8bb8f3fd03a9d13e50abba3a42f4491c36eda3eb215085abda733227ec490cb863ffbd68f915c8fb2926a899fbc3", - "b2c647d25c46aab4d4a5ede4a3b4576d", - ), - ( - 34188, - "e9caa36505e19628175d1ce8b933267380099753a41e503fa2f894cea17b7692f0b27079ed33cdd1293db9a35722d561", - "a2882adfd00f22823250215b12b3a1fd", - ), - ( - 34965, - "81ddc348ebbdfb963daa5d0c1b51bbb73cacd883d4fc4316db6bd3388779beff7be0655bbac73951f89dc53832199c11", - "f33106eb8104f3780350c6d4f82333ad", - ), - ( - 35742, - "308ce31daf40dab707e2cb4c4a5307bc403e24c971ae1e30e998449f804a167fe5f2cf617d585851b6fe9f2b4209f09c", - "44070ac90cbf350ab92289cc063e978c", - ), - ( - 36519, - "71f51b4bddbe8a52f18be75f9bdb3fca0773901b794de845450fb308c34775ede1a6da9a82b61e9682a29a3ef71274e2", - "0e387704298c444bf3afba0edc0c1c1c", - ), - ( - 37296, - "478ac94eee8c5f96210003fcb478392b91f2ef6fc3a729774e5fe82a2d8d0abc54ae1d25b3eaefb061e2bd43b70ca4ea", - "fb65ebeda52cd5848d303c0677cecb7f", - ), - ( - 38073, - "bc3a9390618da7d644be932627353e2c92024df939d2d8497fba61fae3dd822cdd3e130c1707f4a9d5d4a0cbb4b3e0b3", - "d790d529a837ec79f7cc3f66ed9a399f", - ), - ( - 38850, - "ef0e63a53a10e56477c47e13320b8a7d330aee3a4363c850edc56c0707a2686478e5a5193f54ceb33467ab7e8a22aa21", - "6f2c18742f106f16fc290767342fb62b", - ), - ( - 39627, - "c16f63533c099d872d9a01c326db7756e7eb488c756b9a6ebf575993d8ea2eb45c572b2e162f061e145710e0e21e8e18", - "a57afde7938b223ae5e109a03db4ee4c", - ), - ( - 40404, - "ade484ae8c13465a73589ef14789bb6891c933453e198df84edd34b4ac5c83aa90f2cf61fa072fa4d8f5b5c4cd68fa9e", - "a01d13009db86ac442f7afd39d83309f", - ), - ( - 41181, - "6c5c7eed0e043a0bd60bcac9b5b546e150028d70c1efefc9ff69037ef4dc1a36878b171b9f2a639df822d11054a0e405", - "6321c8622ca5866c875d340206d06a28", - ), - ( - 41958, - "dd311c54222fb0d92858719cf5b1c51bb5e3ca2539ffd68f1dd6c7e38969495be935804855ccdcc4b4cf221fcdbda886", - "cf401eb819b5dc5cd8c909aae9b3b34b", - ), - ( - 42735, - "31cda9d663199b32eff042dd16c0b909ba999641e77ba751c91752bfc4d595e17ec6467119e74a600b72da72ba287d0a", - "12fd6298ab5d744eb6ade3106565afad", - ), - ( - 43512, - "11b014057d51a8384d549d5d083c4406b575df6a9295853dd8f2f84f078cc241bb90495a119126b10b9510efcb68c0d3", - "a48a49eea5dc90359ef21f32132f8604", - ), - ( - 44289, - "b44f5dbeecd76ee7efe3fb4dfe10ba8135d7a5e4d104149f4a91c5c6ee9446d9be19fb4c9ba668b074466d3892e22228", - "07e1cbb7a19174d9b1e4d5a2c741cc14", - ), - ( - 45066, - "d87bbba3a3c739cab622386c89aeb685a70009fab1a606bd34622adfa3a75a05b58d56ee6b9874d414db38a6a32927b3", - "a27cd252712cd2a1a2d95dea39f888d4", - ), - ( - 45843, - "abb90e60ea13c6cb3b401b8e271637416b87fbede165dde7be1d34abe4427dae4b39b499352cacac909bc43fb94028c8", - "df3ae762b9257936feda435a61a9c3a1", - ), - ( - 46620, - "56d1132ee6e0f85543950d2d9667244b66b0ce6414eacd1859b128ed0b9026b31a25bfdcce3d1a0ce7c39d99f609c89c", - "cfe7c3c3f1cb615e2d210cc8136443e6", - ), - ( - 47397, - "ecb023ec4c23cf95d1848a38b359f1f590f172dee9d8fb1be6bc9c4fb2ce96f612d60d7b111de539ab8313a87b821176", - "501d24752bf55cb12239863981898a07", - ), - ( - 48174, - "34236ab60f05bb510aa0880fec358fb2002903efa14c912cab8a399e09418f97223ca2f7b8d6798c11d39e79032eaaa8", - "4ecaba4eae886aa429927188abab9623", - ), - ( - 48951, - "55e8b40fad90a3d8c85a0f4d5bcf5975b8a6e2fb78377109f5b607a5e367187fbbc9a1e978aab3228fbf43ad23d0ad13", - "84c43bc30eb4a67230b6c634fe3c7782", - ), - ( - 49728, - "14b1f896d0d01ecff4e456c3c392b1ca2bad9f1ef07713f84cdd89e663aa27ca77d80213ed57a89431eb992b11d98749", - "7f58c2f9a249f70fe1c6f9b4f65e5a1d", - ), - ( - 50505, - "1335b1fb56196e0b371fa53ab7445845fdefcea3eb2833478deb3526e2ec888945e95ee8239b52caae5b9920ba4f43bb", - "5fd729126b236ce3e0686fc706dce20f", - ), - ( - 51282, - "0d1983a6cab870c5e78f89a11dd30e7d2c71a3882f8bba3e71dc1b96a2d9fc6cc6d91d683b74456b886de34df792cfda", - "7731ae6e6c54dfde12f6116357e812ea", - ), - ( - 52059, - "9d619fb4aa8441baaefed7b778693c291f2c1441b206ec135930fac3529d26587ac36f4472949e0b198b51c0c5a9d0f8", - "39db2c996aea28996e03d576c118630f", - ), - ( - 52836, - "31dca4fa285878ba3efc3b66a248a078b69a11c3c73f81077377c4ffcb7002627aad5faa955e3141c1d8508aad68c8f6", - "32ac1e5a09e7e629ff95f30aa9b69c00", - ), - ( - 53613, - "931a9969cf2bb02302c32b1eecd4933805e2da403d85aaf98c82c68129fb95f089eb85c65a6fcbc7d81bedb39de0cabb", - "1a6f54b87c12868da530eac94d99eb31", - ), - ( - 54390, - "2f0742565801a37810ecb3f50a6f782e73a369a790d1a6a85135e7ffa12fc063db8909ab9eca7cf7308832887a6149d1", - "1b18ed6a8f901b7947626216839f0643", - ), - ( - 55167, - "901defbd308b54deef89acd0d94e4387b370f9d2e6f870d72da2e447ed3ebe69c5f9f144488bd6207a732102160bff47", - "1e0e6a05fcc0794121f617e28cfac1a0", - ), - ( - 55944, - "df984a5f7475250155dc4733a746e98446dc93a56a3f3bff691ddfef7deefb32b1da1b0e7e15cce443831ebfb3e30ada", - "876121af882d0ebeae38f111f3d4b6e8", - ), - ( - 56721, - "acb693ed837b33561408cb1eed636e0082ac404f3fd72d277fa146ae5cd81a1fde3645f4cdc7babd8ba044b78075cb67", - "5b90ed6c7943fc6da623c536e2ff1352", - ), - ( - 57498, - "dffb54bf5938e812076cfbf15cd524d72a189566c7980363a49dd89fb49e230d9742ef0b0e1ac543dca14366d735d152", - "22aee072457306e32747fbbbc3ae127c", - ), - ( - 58275, - "92dbc245a980fc78974f7a27e62c22b12a00be9d3ef8d3718ff85f6d5fbcbf1d9d1e0f0a3daeb8c2628d090550a0ff6b", - "5fa348117faba4ac8c9d9317ff44cd2d", - ), - ( - 59052, - "57721475cb719691850696d9a8ad4c28ca8ef9a7d45874ca21df4df250cb87ea60c464f4e3252e2d6161ed36c4b56d75", - "24d92ae7cac56d9c0276b06f7428d5df", - ), - ( - 59829, - "d0936026440b5276747cb9fb7dc96de5d4e7846c233ca5f6f9354b2b39f760333483cbe99ffa905facb347242f58a7ef", - "05c57068e183f9d835e7f461202f923c", - ), - ( - 60606, - "7b3bb3527b73a8692f076f6a503b2e09b427119543c7812db73c7c7fb2d43af9ecbd2a8a1452ac8ada96ad0bad7bb185", - "f958635a193fec0bfb958e97961381df", - ), - ( - 61383, - "ff0d00255a36747eced86acfccd0cf9ef09faa9f44c8cf382efec462e7ead66e562a971060c3f32798ba142d9e1640a2", - "838159b222e56aadde8229ed56a14095", - ), - ( - 62160, - "15806e088ed1428cd73ede3fecf5b60e2a616f1925004dadd2cab8e847059f795659659e82a4554f270baf88bf60af63", - "fed2aa0c9c0a73d499cc970aef21c52f", - ), - ( - 62937, - "cfad71b23b6da51256bd1ddbd1ac77977fe10b2ad0a830a23a794cef914bf71a9519d78a5f83fc411e8d8db996a45d4e", - "e1ea412fd3e1bd91c24b6b6445e8ff43", - ), - ( - 63714, - "7d03a3698a79b1af1663e3e485c2efdc306ecd87b2644f2e01d83a35999d6cdf12241b6114d60d107c10c0d0c9cc0d23", - "e6a3c3f3fd2d9cfcdc06cca2f59e9a83", - ), - ( - 64491, - "e12b168cce0e82ed1db88df549f39b3ff40b5884a09fceae69c4c3db13c1c37ea79531c47b2700d1c27774a1ab7e8b35", - "4cbb14d789f5cd8eca49ce9e1d442ea1", - ), - ( - 65268, - "056c9d1172cfa76ce7f19c605e5969c284b82dca155dc9c1ed58062ab4d5a7704e27fe69f3aa745b73f45f1cd0ee57df", - "8195187f092d52c2a8695b680568b934", - ), - ]; - - fn to_hex(b: &[u8]) -> String { - let mut s = String::new(); - for c in b.iter() { - s = format!("{}{:0>2x}", s, *c); - } - s - } - - /// Run a bunch of test vectors. - #[test] - fn test_vectors() { - let mut test_pt = [0_u8; 65536]; - let mut test_ct = [0_u8; 65536]; - let mut test_aad = [0_u8; 65536]; - for i in 0..65536 { - test_pt[i] = i as u8; - test_aad[i] = i as u8; - } - let mut c = AesGmacSiv::new(TV0_KEYS[0], TV0_KEYS[1]); - for (test_length, expected_ct_sha384, expected_tag) in TEST_VECTORS.iter() { - test_ct.fill(0); - c.reset(); - c.encrypt_init(&(*test_length as u64).to_le_bytes()); - c.encrypt_set_aad(&test_aad[0..*test_length]); - c.encrypt_first_pass(&test_pt[0..*test_length]); - c.encrypt_first_pass_finish(); - c.encrypt_second_pass(&test_pt[0..*test_length], &mut test_ct[0..*test_length]); - let tag = c.encrypt_second_pass_finish(); - let ct_hash = sha2::Sha384::digest(&test_ct[0..*test_length]).to_vec(); - //println!("{} {} {}", *test_length, to_hex(ct_hash.as_slice()), to_hex(tag)); - if !to_hex(ct_hash.as_slice()).eq(*expected_ct_sha384) { - panic!("test vector failed (ciphertest)"); - } - if !to_hex(tag).eq(*expected_tag) { - panic!("test vector failed (tag)"); - } - } - } - - /// Test repeated encrypt/decrypt and run a benchmark. Run with --nocapture to see it. - #[test] - fn encrypt_decrypt() { - 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]; - for i in 1..12345 { - buf[i] = i as u8; - } - - let mut c = AesGmacSiv::new(&aes_key_0, &aes_key_1); - - for _ in 0..256 { - c.reset(); - c.encrypt_init(&iv); - c.encrypt_first_pass(&buf); - c.encrypt_first_pass_finish(); - c.encrypt_second_pass_in_place(&mut buf); - 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 != "4dc97c10abb6112a3907e5eb588ea5123719442b715da994d9756b003677719824326973960268823d924f66491a16e6" { - panic!("encrypt result hash check failed! {}", sha); - } - //println!("Encrypt OK, tag: {}, hash: {}", to_hex(&tag), sha); - - c.reset(); - c.decrypt_init(&tag); - c.decrypt_in_place(&mut buf); - let _ = c.decrypt_finish().expect("decrypt_finish() failed!"); - for i in 1..12345 { - if buf[i] != (i & 0xff) as u8 { - panic!("decrypt data check failed!"); - } - } - //println!("Decrypt OK"); - } - println!("Encrypt/decrypt test OK"); - - let benchmark_iterations: usize = 80000; - let start = SystemTime::now(); - for _ in 0..benchmark_iterations { - c.reset(); - c.encrypt_init(&iv); - c.encrypt_first_pass(&buf); - c.encrypt_first_pass_finish(); - c.encrypt_second_pass_in_place(&mut buf); - let _ = c.encrypt_second_pass_finish(); - } - let duration = SystemTime::now().duration_since(start).unwrap(); - println!( - "AES-GMAC-SIV (legacy) encrypt benchmark: {} MiB/sec", - (((benchmark_iterations * buf.len()) as f64) / 1048576.0) / duration.as_secs_f64() - ); - let start = SystemTime::now(); - for _ in 0..benchmark_iterations { - c.reset(); - c.decrypt_init(&buf[0..16]); // we don't care if decryption is successful to benchmark, so anything will do - c.decrypt_in_place(&mut buf); - c.decrypt_finish(); - } - let duration = SystemTime::now().duration_since(start).unwrap(); - println!( - "AES-GMAC-SIV (legacy) decrypt benchmark: {} MiB/sec", - (((benchmark_iterations * buf.len()) as f64) / 1048576.0) / duration.as_secs_f64() - ); - } -} diff --git a/crypto/src/lib.rs b/crypto/src/lib.rs index b1f39e6c7..6b81a159f 100644 --- a/crypto/src/lib.rs +++ b/crypto/src/lib.rs @@ -4,8 +4,8 @@ pub use openssl::hash; pub use openssl::p384; pub use openssl::random; pub use openssl::secret; +pub use openssl::aes_gmac_siv; -//pub mod aes_gmac_siv; pub mod poly1305; pub mod salsa; pub mod typestate; diff --git a/openssl-zt/src/aes.rs b/openssl-zt/src/aes.rs index af36308b9..1a1694886 100644 --- a/openssl-zt/src/aes.rs +++ b/openssl-zt/src/aes.rs @@ -1,3 +1,4 @@ +// (c) 2020-2022 ZeroTier, Inc. -- currently proprietary pending actual release and licensing. See LICENSE.md. use std::{ptr, mem::MaybeUninit}; diff --git a/openssl-zt/src/aes_gmac_siv.rs b/openssl-zt/src/aes_gmac_siv.rs index b1b182235..1b10069bf 100644 --- a/openssl-zt/src/aes_gmac_siv.rs +++ b/openssl-zt/src/aes_gmac_siv.rs @@ -1,3 +1,4 @@ +// (c) 2020-2022 ZeroTier, Inc. -- currently proprietary pending actual release and licensing. See LICENSE.md. use std::ptr; use foreign_types::ForeignType; diff --git a/openssl-zt/src/p384.rs b/openssl-zt/src/p384.rs index 80526afa2..6ea268d66 100644 --- a/openssl-zt/src/p384.rs +++ b/openssl-zt/src/p384.rs @@ -1,4 +1,3 @@ -// (c) 2020-2022 ZeroTier, Inc. -- currently proprietary pending actual release and licensing. See LICENSE.md. #![allow( dead_code, diff --git a/openssl-zt/src/rand.rs b/openssl-zt/src/rand.rs deleted file mode 100644 index bd679512e..000000000 --- a/openssl-zt/src/rand.rs +++ /dev/null @@ -1,56 +0,0 @@ -//! Utilities for secure random number generation. -//! -//! # Examples -//! -//! To generate a buffer with cryptographically strong bytes: -//! -//! ``` -//! use openssl::rand::rand_bytes; -//! -//! let mut buf = [0; 256]; -//! rand_bytes(&mut buf).unwrap(); -//! ``` -use libc::c_int; - -use crate::error::ErrorStack; -use crate::cvt; - -/// Fill buffer with cryptographically strong pseudo-random bytes. -/// -/// # Examples -/// -/// To generate a buffer with cryptographically strong random bytes: -/// -/// ``` -/// use openssl::rand::rand_bytes; -/// -/// let mut buf = [0; 256]; -/// rand_bytes(&mut buf).unwrap(); -/// ``` -pub fn rand_bytes(buf: &mut [u8]) -> Result<(), ErrorStack> { - unsafe { - debug_assert!(buf.len() <= c_int::max_value() as usize); - cvt(ffi::RAND_bytes(buf.as_mut_ptr(), buf.len() as LenType)).map(|_| ()) - } -} - -/// Controls random device file descriptor behavior. -/// -/// Requires OpenSSL 1.1.1 or newer. -#[cfg(ossl111)] -pub fn keep_random_devices_open(keep: bool) { - unsafe { - ffi::RAND_keep_random_devices_open(keep as LenType); - } -} - -#[cfg(test)] -mod tests { - use super::rand_bytes; - - #[test] - fn test_rand_bytes() { - let mut buf = [0; 32]; - rand_bytes(&mut buf).unwrap(); - } -} diff --git a/openssl-zt/src/random.rs b/openssl-zt/src/random.rs index 5ef20b6fd..36d4f1686 100644 --- a/openssl-zt/src/random.rs +++ b/openssl-zt/src/random.rs @@ -1,4 +1,3 @@ -// (c) 2020-2022 ZeroTier, Inc. -- currently proprietary pending actual release and licensing. See LICENSE.md. use std::sync::atomic::{AtomicU64, Ordering};