From 90e8c3adf6974b74b4d27a0ec8d6f2c96bbc4aee Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 2 Jun 2025 20:11:27 +0100 Subject: [PATCH] smp agent: use static RNG function to avoid dynamic C stub created by Haskell FFI wrapper (#1556) --- .../Messaging/Crypto/SNTRUP761/Bindings.hs | 7 +++---- .../Crypto/SNTRUP761/Bindings/RNG.hs | 20 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/Simplex/Messaging/Crypto/SNTRUP761/Bindings.hs b/src/Simplex/Messaging/Crypto/SNTRUP761/Bindings.hs index 82483491e..94ce7d748 100644 --- a/src/Simplex/Messaging/Crypto/SNTRUP761/Bindings.hs +++ b/src/Simplex/Messaging/Crypto/SNTRUP761/Bindings.hs @@ -10,11 +10,10 @@ import Data.Bifunctor (bimap) import Data.ByteArray (ScrubbedBytes) import qualified Data.ByteArray as BA import Data.ByteString (ByteString) -import Foreign (nullPtr) import Simplex.Messaging.Agent.Store.DB (FromField (..), ToField (..)) import Simplex.Messaging.Crypto.SNTRUP761.Bindings.Defines import Simplex.Messaging.Crypto.SNTRUP761.Bindings.FFI -import Simplex.Messaging.Crypto.SNTRUP761.Bindings.RNG (withDRG) +import Simplex.Messaging.Crypto.SNTRUP761.Bindings.RNG (rngFuncPtr, withDRG) import Simplex.Messaging.Encoding import Simplex.Messaging.Encoding.String @@ -43,7 +42,7 @@ sntrup761Keypair drg = c_SNTRUP761_SECRETKEY_SIZE ( \skPtr -> BA.alloc c_SNTRUP761_PUBLICKEY_SIZE $ \pkPtr -> - withDRG drg $ c_sntrup761_keypair pkPtr skPtr nullPtr + withDRG drg $ \cxtPtr -> c_sntrup761_keypair pkPtr skPtr cxtPtr rngFuncPtr ) sntrup761Enc :: TVar ChaChaDRG -> KEMPublicKey -> IO (KEMCiphertext, KEMSharedKey) @@ -54,7 +53,7 @@ sntrup761Enc drg (KEMPublicKey pk) = c_SNTRUP761_SIZE ( \kPtr -> BA.alloc c_SNTRUP761_CIPHERTEXT_SIZE $ \cPtr -> - withDRG drg $ c_sntrup761_enc cPtr kPtr pkPtr nullPtr + withDRG drg $ \cxtPtr -> c_sntrup761_enc cPtr kPtr pkPtr cxtPtr rngFuncPtr ) sntrup761Dec :: KEMCiphertext -> KEMSecretKey -> IO KEMSharedKey diff --git a/src/Simplex/Messaging/Crypto/SNTRUP761/Bindings/RNG.hs b/src/Simplex/Messaging/Crypto/SNTRUP761/Bindings/RNG.hs index 322d583c9..d884d9d51 100644 --- a/src/Simplex/Messaging/Crypto/SNTRUP761/Bindings/RNG.hs +++ b/src/Simplex/Messaging/Crypto/SNTRUP761/Bindings/RNG.hs @@ -1,5 +1,6 @@ module Simplex.Messaging.Crypto.SNTRUP761.Bindings.RNG ( withDRG, + rngFuncPtr, RNGContext, RNGFunc, ) where @@ -12,19 +13,20 @@ import Foreign import Foreign.C import qualified Simplex.Messaging.Crypto as C -withDRG :: TVar ChaChaDRG -> (FunPtr RNGFunc -> IO a) -> IO a -withDRG drg = bracket (createRNGFunc drg) freeHaskellFunPtr +withDRG :: TVar ChaChaDRG -> (Ptr RNGContext -> IO a) -> IO a +withDRG drg = bracket (castStablePtrToPtr <$> newStablePtr drg) (freeStablePtr . castPtrToStablePtr) -createRNGFunc :: TVar ChaChaDRG -> IO (FunPtr RNGFunc) -createRNGFunc drg = - mkRNGFunc $ \_ctx sz buf -> do - bs <- atomically $ C.randomBytes (fromIntegral sz) drg - copyByteArrayToPtr bs buf +rngFunc :: RNGFunc +rngFunc cxt sz buf = do + drg <- deRefStablePtr $ castPtrToStablePtr cxt + bs <- atomically $ C.randomBytes (fromIntegral sz) drg + copyByteArrayToPtr bs buf type RNGContext = () -- typedef void random_func (void *ctx, size_t length, uint8_t *dst); type RNGFunc = Ptr RNGContext -> CSize -> Ptr Word8 -> IO () -foreign import ccall "wrapper" - mkRNGFunc :: RNGFunc -> IO (FunPtr RNGFunc) +foreign export ccall "haskell_rng_func" rngFunc :: RNGFunc + +foreign import ccall "&haskell_rng_func" rngFuncPtr :: FunPtr RNGFunc