diff --git a/src/Test/Serialization/Symbiote/ZeroMQ.hs b/src/Test/Serialization/Symbiote/ZeroMQ.hs
--- a/src/Test/Serialization/Symbiote/ZeroMQ.hs
+++ b/src/Test/Serialization/Symbiote/ZeroMQ.hs
@@ -28,6 +28,7 @@
 import qualified Data.Serialize as Cereal
 import Data.List.NonEmpty (NonEmpty (..))
 import Data.Singleton.Class (Extractable)
+import Data.Restricted (Restricted)
 import Control.Monad (forever, void)
 import Control.Monad.IO.Class (MonadIO (liftIO))
 import Control.Monad.Trans.Control.Aligned (MonadBaseControl, liftBaseWith)
@@ -39,16 +40,17 @@
 import Control.Concurrent.STM.TChan.Typed (TChanRW, newTChanRW, writeTChanRW, readTChanRW)
 import Control.Concurrent.Threaded.Hash (threaded)
 import System.ZMQ4 (Router (..), Dealer (..), Pair (..))
-import System.ZMQ4.Monadic (runZMQ, async)
-import System.ZMQ4.Simple (ZMQIdent, socket, bind, send, receive, connect, setUUIDIdentity)
+import System.ZMQ4.Monadic (runZMQ, async, KeyFormat, setCurveServer, setCurvePublicKey, setCurveSecretKey, setCurveServerKey)
+import System.ZMQ4.Simple (ZMQIdent, socket, bind, send, receive, connect, setUUIDIdentity, Socket (..))
 import System.Timeout (timeout)
+import Unsafe.Coerce (unsafeCoerce)
 
 
 
 secondPeerZeroMQ :: MonadIO m
                  => MonadBaseControl IO m stM
                  => Extractable stM
-                 => ZeroMQParams
+                 => ZeroMQParams f
                  -> Debug
                  -> SymbioteT BS.ByteString m () -- ^ Tests registered
                  -> m ()
@@ -57,33 +59,52 @@
 firstPeerZeroMQ :: MonadIO m
                 => MonadBaseControl IO m stM
                 => Extractable stM
-                => ZeroMQParams
+                => ZeroMQParams f
                 -> Debug
                 -> SymbioteT BS.ByteString m () -- ^ Tests registered
                 -> m ()
 firstPeerZeroMQ params debug = peerZeroMQ params debug firstPeer
 
+-- | Parameterized by optional keypairs associated with CurveMQ
+data ZeroMQServerOrClient f
+  = ZeroMQServer (Maybe (ServerKeys f))
+  | ZeroMQClient (Maybe (ClientKeys f))
 
-data ZeroMQServerOrClient
-  = ZeroMQServer
-  | ZeroMQClient
+data Key f = Key
+  { format :: KeyFormat f -- ^ Text via Z85 or raw binary
+  , key    :: Restricted f BS.ByteString
+  }
 
-data ZeroMQParams = ZeroMQParams
+data KeyPair f = KeyPair
+  { public :: Key f
+  , secret :: Key f
+  }
+
+newtype ServerKeys f = ServerKeys
+  { serverKeyPair :: KeyPair f
+  }
+
+data ClientKeys f = ClientKeys
+  { clientKeyPair :: KeyPair f
+  , clientServer  :: Key f -- ^ The public key of the server
+  }
+
+data ZeroMQParams f = ZeroMQParams
   { zmqHost           :: String
-  , zmqServerOrClient :: ZeroMQServerOrClient
+  , zmqServerOrClient :: ZeroMQServerOrClient f
   , zmqNetwork        :: Network
   }
 
 
 -- | ZeroMQ can only work on 'BS.ByteString's
-peerZeroMQ :: forall m stM them me
+peerZeroMQ :: forall m stM them me f
             . MonadIO m
            => MonadBaseControl IO m stM
            => Extractable stM
            => Show (them BS.ByteString)
            => Cereal.Serialize (me BS.ByteString)
            => Cereal.Serialize (them BS.ByteString)
-           => ZeroMQParams
+           => ZeroMQParams f
            -> Debug
            -> ( (me BS.ByteString -> m ())
              -> m (them BS.ByteString)
@@ -97,7 +118,7 @@
            -> m ()
 peerZeroMQ (ZeroMQParams host clientOrServer network) debug peer tests =
   case (network,clientOrServer) of
-    (Public,ZeroMQServer) -> do
+    (Public, ZeroMQServer mKeys) -> do
       (incoming :: TChanRW 'Write (ZMQIdent, them BS.ByteString)) <- writeOnly <$> liftIO (atomically newTChanRW)
       -- the process that gets invoked for each new thread. Writes to a @me BS.ByteString@ and reads from a @them BS.ByteString@.
       let process :: TChanRW 'Read (them BS.ByteString) -> TChanRW 'Write (me BS.ByteString) -> m ()
@@ -123,7 +144,12 @@
 
       -- forever bind to ZeroMQ
       runZMQ $ do
-        s <- socket Router Dealer
+        s@(Socket s') <- socket Router Dealer
+        case mKeys of
+          Nothing -> pure ()
+          Just (ServerKeys (KeyPair _ (Key secFormat secKey))) -> do
+            setCurveServer True s'
+            setCurveSecretKey secFormat secKey s'
         bind s host
 
         -- sending loop (separate thread)
@@ -177,7 +203,15 @@
       zThread <- case network of
         -- is a ZeroMQClient
         Public -> runZMQ $ async $ do
-          s <- socket Dealer Router
+          s@(Socket s') <- socket Dealer Router
+          case clientOrServer of
+            ZeroMQClient mKeys -> case mKeys of
+              Nothing -> pure ()
+              Just (ClientKeys (KeyPair (Key pubFormat pubKey) (Key secFormat secKey)) (Key servFormat server)) -> do
+                setCurvePublicKey pubFormat pubKey s'
+                setCurveSecretKey secFormat secKey s'
+                setCurveServerKey servFormat server s'
+            _ -> error "impossible case"
           setUUIDIdentity s
           connect s host
 
@@ -185,15 +219,26 @@
 
           receivingLoop s
         Private -> case clientOrServer of
-          ZeroMQServer -> runZMQ $ async $ do
-            s <- socket Pair Pair
+          ZeroMQServer mKeys -> runZMQ $ async $ do
+            s@(Socket s') <- socket Pair Pair
+            case mKeys of
+              Nothing -> pure ()
+              Just (ServerKeys (KeyPair _ (Key secFormat secKey))) -> do
+                setCurveServer True s'
+                setCurveSecretKey secFormat secKey s'
             bind s host
 
             sendingThread s
 
             receivingLoop s
-          ZeroMQClient -> runZMQ $ async $ do
-            s <- socket Pair Pair
+          ZeroMQClient mKeys -> runZMQ $ async $ do
+            s@(Socket s') <- socket Pair Pair
+            case mKeys of
+              Nothing -> pure ()
+              Just (ClientKeys (KeyPair (Key pubFormat pubKey) (Key secFormat secKey)) (Key servFormat server)) -> do
+                setCurvePublicKey pubFormat pubKey s'
+                setCurveSecretKey secFormat secKey s'
+                setCurveServerKey servFormat server s'
             connect s host
 
             sendingThread s
diff --git a/symbiote.cabal b/symbiote.cabal
--- a/symbiote.cabal
+++ b/symbiote.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: bb816980e733fd1d164875e94302b3003d655cc593b1de79483b12e50a73761b
+-- hash: b0ed7398ea9c3fdf50a9dfc395712f17935161fec68786977d951a94aacb8142
 
 name:           symbiote
-version:        0.0.3
+version:        0.0.4
 synopsis:       Data serialization, communication, and operation verification implementation
 description:    Please see the README on GitHub at <https://github.com/athanclark/symbiote#readme>
 category:       Data, Testing
