From c4cb7c442917b94f01227cb736b728a6bc44fff9 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Tue, 14 Mar 2023 15:22:37 -0400 Subject: [PATCH] Turns out a Mutex is not really any slower... --- crypto/src/aes_fruity.rs | 47 ++++++++++------------------------------ 1 file changed, 12 insertions(+), 35 deletions(-) diff --git a/crypto/src/aes_fruity.rs b/crypto/src/aes_fruity.rs index 5a0d5355c..b46c2d2c7 100644 --- a/crypto/src/aes_fruity.rs +++ b/crypto/src/aes_fruity.rs @@ -3,7 +3,7 @@ // MacOS implementation of AES primitives since CommonCrypto seems to be faster than OpenSSL, especially on ARM64. use std::os::raw::{c_int, c_void}; use std::ptr::{null, null_mut}; -use std::sync::atomic::AtomicPtr; +use std::sync::Mutex; use crate::secret::Secret; use crate::secure_eq; @@ -172,25 +172,18 @@ impl AesGcm { } } -pub struct Aes(AtomicPtr, AtomicPtr); +pub struct Aes(Mutex<(*mut c_void, *mut c_void)>); impl Drop for Aes { #[inline(always)] fn drop(&mut self) { unsafe { - loop { - let p = self.0.load(std::sync::atomic::Ordering::Acquire); - if !p.is_null() { - CCCryptorRelease(p); - break; - } + let p = self.0.lock().unwrap(); + if !p.0.is_null() { + CCCryptorRelease(p.0); } - loop { - let p = self.1.load(std::sync::atomic::Ordering::Acquire); - if !p.is_null() { - CCCryptorRelease(p); - break; - } + if !p.1.is_null() { + CCCryptorRelease(p.1); } } } @@ -238,7 +231,7 @@ impl Aes { ), 0 ); - Self(AtomicPtr::new(p0), AtomicPtr::new(p1)) + Self(Mutex::new((p0, p1))) } } @@ -247,16 +240,8 @@ impl Aes { assert_eq!(data.len(), 16); unsafe { let mut data_out_written = 0; - loop { - let p = self.0.load(std::sync::atomic::Ordering::Acquire); - if !p.is_null() { - CCCryptorUpdate(p, data.as_ptr().cast(), 16, data.as_mut_ptr().cast(), 16, &mut data_out_written); - self.0.store(p, std::sync::atomic::Ordering::Release); - break; - } else { - std::thread::yield_now(); - } - } + let p = self.0.lock().unwrap(); + CCCryptorUpdate(p.0, data.as_ptr().cast(), 16, data.as_mut_ptr().cast(), 16, &mut data_out_written); } } @@ -265,16 +250,8 @@ impl Aes { assert_eq!(data.len(), 16); unsafe { let mut data_out_written = 0; - loop { - let p = self.1.load(std::sync::atomic::Ordering::Acquire); - if !p.is_null() { - CCCryptorUpdate(p, data.as_ptr().cast(), 16, data.as_mut_ptr().cast(), 16, &mut data_out_written); - self.1.store(p, std::sync::atomic::Ordering::Release); - break; - } else { - std::thread::yield_now(); - } - } + let p = self.0.lock().unwrap(); + CCCryptorUpdate(p.1, data.as_ptr().cast(), 16, data.as_mut_ptr().cast(), 16, &mut data_out_written); } } }