use cryptographic key pairs for encryption keys (#39)

* use cryptographic key pairs for encryption keys

* use speaking key types

* fix key types

Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
This commit is contained in:
Efim Poberezkin
2021-02-26 18:14:22 +04:00
co-authored by Evgeny Poberezkin
parent 0fe41dbf16
commit 469f84bb74
13 changed files with 85 additions and 79 deletions
+13 -16
View File
@@ -34,9 +34,8 @@ import Simplex.Messaging.Agent.Transmission
import Simplex.Messaging.Client (SMPServerTransmission)
import qualified Simplex.Messaging.Crypto as C
import qualified Simplex.Messaging.Protocol as SMP
import Simplex.Messaging.Server (randomBytes)
import Simplex.Messaging.Transport (putLn, runTCPServer)
import Simplex.Messaging.Types (CorrId (..), MsgBody, PrivateKey, SenderKey)
import Simplex.Messaging.Types (CorrId (..), MsgBody, SenderPublicKey)
import System.IO (Handle)
import UnliftIO.Async (race_)
import UnliftIO.Exception (SomeException)
@@ -135,9 +134,9 @@ processCommand c@AgentClient {sndQ} (corrId, connAlias, cmd) =
joinConnection qInfo@(SMPQueueInfo srv _ _) replyMode = do
-- TODO create connection alias if not passed
-- make connAlias Maybe?
(sq, senderKey) <- newSendQueue qInfo connAlias
(sq, senderKey, verifyKey) <- newSendQueue qInfo connAlias
withStore $ \st -> createSndConn st sq
connectToSendQueue c sq senderKey
connectToSendQueue c sq senderKey verifyKey
case replyMode of
ReplyOn -> sendReplyQInfo srv sq
ReplyVia srv' -> sendReplyQInfo srv' sq
@@ -241,9 +240,9 @@ processSMPTransmission c@AgentClient {sndQ} (srv, rId, cmd) = do
REPLY qInfo -> do
logServer "<--" c srv rId "MSG <REPLY>"
-- TODO move senderKey inside SendQueue
(sq, senderKey) <- newSendQueue qInfo connAlias
(sq, senderKey, verifyKey) <- newSendQueue qInfo connAlias
withStore $ \st -> upgradeRcvConnToDuplex st connAlias sq
connectToSendQueue c sq senderKey
connectToSendQueue c sq senderKey verifyKey
notify connAlias CON
sendAck c rq
A_MSG body -> do
@@ -269,25 +268,23 @@ processSMPTransmission c@AgentClient {sndQ} (srv, rId, cmd) = do
notify :: ConnAlias -> ACommand 'Agent -> m ()
notify connAlias msg = atomically $ writeTBQueue sndQ ("", connAlias, msg)
connectToSendQueue :: AgentMonad m => AgentClient -> SendQueue -> SenderKey -> m ()
connectToSendQueue c sq senderKey = do
connectToSendQueue :: AgentMonad m => AgentClient -> SendQueue -> SenderPublicKey -> VerificationKey -> m ()
connectToSendQueue c sq senderKey verifyKey = do
sendConfirmation c sq senderKey
withStore $ \st -> setSndQueueStatus st sq Confirmed
sendHello c sq
sendHello c sq verifyKey
withStore $ \st -> setSndQueueStatus st sq Active
decryptMessage :: MonadUnliftIO m => PrivateKey -> ByteString -> m ByteString
decryptMessage :: MonadUnliftIO m => DecryptionKey -> ByteString -> m ByteString
decryptMessage _decryptKey = return
newSendQueue ::
(MonadUnliftIO m, MonadReader Env m) => SMPQueueInfo -> ConnAlias -> m (SendQueue, SenderKey)
(MonadUnliftIO m, MonadReader Env m) => SMPQueueInfo -> ConnAlias -> m (SendQueue, SenderPublicKey, VerificationKey)
newSendQueue (SMPQueueInfo smpServer senderId encryptKey) connAlias = do
g <- asks idsDrg
size <- asks $ rsaKeySize . config
(senderKey, sndPrivateKey) <- liftIO $ C.generateKeyPair size
verifyKey <- atomically $ randomBytes 16 g -- TODO replace with cryptographic key pair
let signKey = verifyKey
sndQueue =
(verifyKey, signKey) <- liftIO $ C.generateKeyPair size
let sndQueue =
SendQueue
{ server = smpServer,
sndId = senderId,
@@ -297,4 +294,4 @@ newSendQueue (SMPQueueInfo smpServer senderId encryptKey) connAlias = do
signKey,
status = New
}
return (sndQueue, senderKey)
return (sndQueue, senderKey, verifyKey)
+11 -14
View File
@@ -49,8 +49,7 @@ import Simplex.Messaging.Agent.Transmission
import Simplex.Messaging.Client
import qualified Simplex.Messaging.Crypto as C
import Simplex.Messaging.Protocol (QueueId)
import Simplex.Messaging.Server (randomBytes)
import Simplex.Messaging.Types (ErrorType (AUTH), MsgBody, PrivateKey, PublicKey, SenderKey)
import Simplex.Messaging.Types (ErrorType (AUTH), MsgBody, SenderPublicKey)
import UnliftIO.Concurrent
import UnliftIO.Exception (IOException)
import qualified UnliftIO.Exception as E
@@ -150,15 +149,13 @@ withLogSMP c srv qId cmdStr action = do
newReceiveQueue :: AgentMonad m => AgentClient -> SMPServer -> ConnAlias -> m (ReceiveQueue, SMPQueueInfo)
newReceiveQueue c srv connAlias = do
g <- asks idsDrg
size <- asks $ rsaKeySize . config
(recipientKey, rcvPrivateKey) <- liftIO $ C.generateKeyPair size
logServer "-->" c srv "" "NEW"
(rcvId, sId) <- withSMP c srv $ \smp -> createSMPQueue smp rcvPrivateKey recipientKey
logServer "<--" c srv "" $ B.unwords ["IDS", logSecret rcvId, logSecret sId]
encryptKey <- atomically $ randomBytes 16 g -- TODO replace with cryptographic key pair
let decryptKey = encryptKey
rq =
(encryptKey, decryptKey) <- liftIO $ C.generateKeyPair size
let rq =
ReceiveQueue
{ server = srv,
rcvId,
@@ -211,7 +208,7 @@ showServer srv = B.pack $ host srv <> maybe "" (":" <>) (port srv)
logSecret :: ByteString -> ByteString
logSecret bs = encode $ B.take 3 bs
sendConfirmation :: forall m. AgentMonad m => AgentClient -> SendQueue -> SenderKey -> m ()
sendConfirmation :: forall m. AgentMonad m => AgentClient -> SendQueue -> SenderPublicKey -> m ()
sendConfirmation c SendQueue {server, sndId} senderKey = do
msg <- mkConfirmation
withLogSMP c server sndId "SEND <KEY>" $ \smp ->
@@ -223,14 +220,14 @@ sendConfirmation c SendQueue {server, sndId} senderKey = do
-- TODO encryption
return msg
sendHello :: forall m. AgentMonad m => AgentClient -> SendQueue -> m ()
sendHello c SendQueue {server, sndId, sndPrivateKey, encryptKey} = do
msg <- mkHello "5678" $ AckMode On -- TODO verifyKey
sendHello :: forall m. AgentMonad m => AgentClient -> SendQueue -> VerificationKey -> m ()
sendHello c SendQueue {server, sndId, sndPrivateKey, encryptKey} verifyKey = do
msg <- mkHello $ AckMode On
withLogSMP c server sndId "SEND <HELLO> (retrying)" $
send 20 msg
where
mkHello :: PublicKey -> AckMode -> m ByteString
mkHello verifyKey ackMode =
mkHello :: AckMode -> m ByteString
mkHello ackMode =
mkAgentMessage encryptKey $ HELLO verifyKey ackMode
send :: Int -> ByteString -> SMPClient -> ExceptT SMPClientError IO ()
@@ -242,7 +239,7 @@ sendHello c SendQueue {server, sndId, sndPrivateKey, encryptKey} = do
send (retry - 1) msg smp
e -> throwE e
secureQueue :: AgentMonad m => AgentClient -> ReceiveQueue -> SenderKey -> m ()
secureQueue :: AgentMonad m => AgentClient -> ReceiveQueue -> SenderPublicKey -> m ()
secureQueue c ReceiveQueue {server, rcvId, rcvPrivateKey} senderKey =
withLogSMP c server rcvId "KEY <key>" $ \smp ->
secureSMPQueue smp rcvPrivateKey rcvId senderKey
@@ -268,7 +265,7 @@ sendAgentMessage c SendQueue {server, sndId, sndPrivateKey, encryptKey} agentMsg
withLogSMP c server sndId "SEND <message>" $ \smp ->
sendSMPMessage smp (Just sndPrivateKey) sndId msg
mkAgentMessage :: MonadUnliftIO m => PrivateKey -> AMessage -> m ByteString
mkAgentMessage :: MonadUnliftIO m => EncryptionKey -> AMessage -> m ByteString
mkAgentMessage _encKey agentMessage = do
senderTimestamp <- liftIO getCurrentTime
let msg =
+8 -9
View File
@@ -23,19 +23,18 @@ import Data.Time.Clock (UTCTime)
import Data.Type.Equality
import Simplex.Messaging.Agent.Store.Types (ConnType (..))
import Simplex.Messaging.Agent.Transmission
import qualified Simplex.Messaging.Crypto as C
import qualified Simplex.Messaging.Protocol as SMP
import Simplex.Messaging.Types (PrivateKey, PublicKey)
import Simplex.Messaging.Types (RecipientPrivateKey, SenderPrivateKey, SenderPublicKey)
data ReceiveQueue = ReceiveQueue
{ server :: SMPServer,
rcvId :: SMP.RecipientId,
connAlias :: ConnAlias,
rcvPrivateKey :: C.PrivateKey,
rcvPrivateKey :: RecipientPrivateKey,
sndId :: Maybe SMP.SenderId,
sndKey :: Maybe C.PublicKey,
decryptKey :: PrivateKey,
verifyKey :: Maybe PublicKey,
sndKey :: Maybe SenderPublicKey,
decryptKey :: DecryptionKey,
verifyKey :: Maybe VerificationKey,
status :: QueueStatus
}
deriving (Eq, Show)
@@ -44,9 +43,9 @@ data SendQueue = SendQueue
{ server :: SMPServer,
sndId :: SMP.SenderId,
connAlias :: ConnAlias,
sndPrivateKey :: C.PrivateKey,
encryptKey :: PublicKey,
signKey :: PrivateKey,
sndPrivateKey :: SenderPrivateKey,
encryptKey :: EncryptionKey,
signKey :: SignatureKey,
status :: QueueStatus
}
deriving (Eq, Show)
+15 -10
View File
@@ -37,8 +37,7 @@ import Simplex.Messaging.Types
Encoded,
ErrorType,
MsgBody,
PublicKey,
SenderKey,
SenderPublicKey,
errMessageBody,
)
import qualified Simplex.Messaging.Types as ST
@@ -110,7 +109,7 @@ deriving instance Show (ACommand p)
type Message = ByteString
data SMPMessage
= SMPConfirmation SenderKey
= SMPConfirmation SenderPublicKey
| SMPMessage
{ senderMsgId :: Integer,
senderTimestamp :: UTCTime,
@@ -162,7 +161,7 @@ agentMessageP =
<|> "REPLY " *> reply
<|> "MSG " *> a_msg
where
hello = HELLO <$> base64P <*> ackMode
hello = HELLO <$> C.pubKeyP <*> ackMode
reply = REPLY <$> smpQueueInfoP
a_msg = do
size :: Int <- A.decimal
@@ -171,7 +170,7 @@ agentMessageP =
smpQueueInfoP :: Parser SMPQueueInfo
smpQueueInfoP =
"smp::" *> (SMPQueueInfo <$> smpServerP <* "::" <*> base64P <* "::" <*> base64P)
"smp::" *> (SMPQueueInfo <$> smpServerP <* "::" <*> base64P <* "::" <*> C.pubKeyP)
smpServerP :: Parser SMPServer
smpServerP = SMPServer <$> server <*> port <*> msgHash
@@ -185,15 +184,17 @@ parseAgentMessage = parse agentMessageP $ SYNTAX errBadMessage
serializeAgentMessage :: AMessage -> ByteString
serializeAgentMessage = \case
HELLO verifyKey ackMode -> "HELLO " <> encode verifyKey <> if ackMode == AckMode Off then " NO_ACK" else ""
HELLO verifyKey ackMode -> "HELLO " <> C.serializePubKey verifyKey <> if ackMode == AckMode Off then " NO_ACK" else ""
REPLY qInfo -> "REPLY " <> serializeSmpQueueInfo qInfo
A_MSG body -> "MSG " <> serializeMsg body <> "\n"
serializeSmpQueueInfo :: SMPQueueInfo -> ByteString
serializeSmpQueueInfo (SMPQueueInfo srv qId ek) = B.intercalate "::" ["smp", serializeServer srv, encode qId, encode ek]
serializeSmpQueueInfo (SMPQueueInfo srv qId ek) =
B.intercalate "::" ["smp", serializeServer srv, encode qId, C.serializePubKey ek]
serializeServer :: SMPServer -> ByteString
serializeServer SMPServer {host, port, keyHash} = B.pack $ host <> maybe "" (':' :) port <> maybe "" (('#' :) . B.unpack) keyHash
serializeServer SMPServer {host, port, keyHash} =
B.pack $ host <> maybe "" (':' :) port <> maybe "" (('#' :) . B.unpack) keyHash
data SMPServer = SMPServer
{ host :: HostName,
@@ -217,9 +218,13 @@ data SMPQueueInfo = SMPQueueInfo SMPServer SMP.SenderId EncryptionKey
data ReplyMode = ReplyOff | ReplyOn | ReplyVia SMPServer deriving (Eq, Show)
type EncryptionKey = PublicKey
type EncryptionKey = C.PublicKey
type VerificationKey = PublicKey
type DecryptionKey = C.PrivateKey
type SignatureKey = C.PrivateKey
type VerificationKey = C.PublicKey
data QueueDirection = SND | RCV deriving (Show)
+11 -7
View File
@@ -170,14 +170,18 @@ data SMPClientError
| SMPClientError
deriving (Eq, Show, Exception)
createSMPQueue :: SMPClient -> C.PrivateKey -> RecipientKey -> ExceptT SMPClientError IO (RecipientId, SenderId)
createSMPQueue ::
SMPClient ->
RecipientPrivateKey ->
RecipientPublicKey ->
ExceptT SMPClientError IO (RecipientId, SenderId)
createSMPQueue c rpKey rKey =
-- TODO add signing this request too - requires changes in the server
sendSMPCommand c (Just rpKey) "" (Cmd SRecipient $ NEW rKey) >>= \case
Cmd _ (IDS rId sId) -> return (rId, sId)
_ -> throwE SMPUnexpectedResponse
subscribeSMPQueue :: SMPClient -> C.PrivateKey -> RecipientId -> ExceptT SMPClientError IO ()
subscribeSMPQueue :: SMPClient -> RecipientPrivateKey -> RecipientId -> ExceptT SMPClientError IO ()
subscribeSMPQueue c@SMPClient {smpServer, msgQ} rpKey rId =
sendSMPCommand c (Just rpKey) rId (Cmd SRecipient SUB) >>= \case
Cmd _ OK -> return ()
@@ -185,16 +189,16 @@ subscribeSMPQueue c@SMPClient {smpServer, msgQ} rpKey rId =
lift . atomically $ writeTBQueue msgQ (smpServer, rId, cmd)
_ -> throwE SMPUnexpectedResponse
secureSMPQueue :: SMPClient -> C.PrivateKey -> RecipientId -> SenderKey -> ExceptT SMPClientError IO ()
secureSMPQueue :: SMPClient -> RecipientPrivateKey -> RecipientId -> SenderPublicKey -> ExceptT SMPClientError IO ()
secureSMPQueue c rpKey rId senderKey = okSMPCommand (Cmd SRecipient $ KEY senderKey) c rpKey rId
sendSMPMessage :: SMPClient -> Maybe C.PrivateKey -> SenderId -> MsgBody -> ExceptT SMPClientError IO ()
sendSMPMessage :: SMPClient -> Maybe SenderPrivateKey -> SenderId -> MsgBody -> ExceptT SMPClientError IO ()
sendSMPMessage c spKey sId msg =
sendSMPCommand c spKey sId (Cmd SSender $ SEND msg) >>= \case
Cmd _ OK -> return ()
_ -> throwE SMPUnexpectedResponse
ackSMPMessage :: SMPClient -> C.PrivateKey -> QueueId -> ExceptT SMPClientError IO ()
ackSMPMessage :: SMPClient -> RecipientPrivateKey -> QueueId -> ExceptT SMPClientError IO ()
ackSMPMessage c@SMPClient {smpServer, msgQ} rpKey rId =
sendSMPCommand c (Just rpKey) rId (Cmd SRecipient ACK) >>= \case
Cmd _ OK -> return ()
@@ -202,10 +206,10 @@ ackSMPMessage c@SMPClient {smpServer, msgQ} rpKey rId =
lift . atomically $ writeTBQueue msgQ (smpServer, rId, cmd)
_ -> throwE SMPUnexpectedResponse
suspendSMPQueue :: SMPClient -> C.PrivateKey -> QueueId -> ExceptT SMPClientError IO ()
suspendSMPQueue :: SMPClient -> RecipientPrivateKey -> QueueId -> ExceptT SMPClientError IO ()
suspendSMPQueue = okSMPCommand $ Cmd SRecipient OFF
deleteSMPQueue :: SMPClient -> C.PrivateKey -> QueueId -> ExceptT SMPClientError IO ()
deleteSMPQueue :: SMPClient -> RecipientPrivateKey -> QueueId -> ExceptT SMPClientError IO ()
deleteSMPQueue = okSMPCommand $ Cmd SRecipient DEL
okSMPCommand :: Cmd -> SMPClient -> C.PrivateKey -> QueueId -> ExceptT SMPClientError IO ()
+1
View File
@@ -87,6 +87,7 @@ generateKeyPair size = loop
else
return
( PublicKey pub,
-- TODO add comments explaining why we throw away public key from private
PrivateKey {private_size = R.public_size pub, private_n = n, private_d = d}
)
publicExponent = findPrimeFrom . (+ 3) <$> generateMax pubExpRange
+2 -2
View File
@@ -65,9 +65,9 @@ type SenderId = QueueId
type QueueId = Encoded
data Command (a :: Party) where
NEW :: RecipientKey -> Command Recipient
NEW :: RecipientPublicKey -> Command Recipient
SUB :: Command Recipient
KEY :: SenderKey -> Command Recipient
KEY :: SenderPublicKey -> Command Recipient
ACK :: Command Recipient
OFF :: Command Recipient
DEL :: Command Recipient
+2 -2
View File
@@ -105,7 +105,7 @@ verifyTransmission (sig, t@(corrId, queueId, cmd)) = do
st <- asks queueStore
qr <- atomically $ getQueue st party queueId
return $ either smpErr f qr
verifySend :: C.Signature -> Maybe C.PublicKey -> Cmd
verifySend :: C.Signature -> Maybe SenderPublicKey -> Cmd
verifySend "" = maybe cmd (const authErr)
verifySend _ = maybe authErr verifySignature
verifySignature :: C.PublicKey -> Cmd
@@ -139,7 +139,7 @@ client clnt@Client {subscriptions, rcvQ, sndQ} Server {subscribedQ} =
OFF -> okResp <$> atomically (suspendQueue st queueId)
DEL -> delQueueAndMsgs st
where
createQueue :: QueueStore -> RecipientKey -> m Transmission
createQueue :: QueueStore -> RecipientPublicKey -> m Transmission
createQueue st rKey =
mkResp corrId B.empty <$> addSubscribe
where
+5 -5
View File
@@ -11,21 +11,21 @@ import Simplex.Messaging.Types
data QueueRec = QueueRec
{ recipientId :: QueueId,
senderId :: QueueId,
recipientKey :: RecipientKey,
senderKey :: Maybe SenderKey,
recipientKey :: RecipientPublicKey,
senderKey :: Maybe SenderPublicKey,
status :: QueueStatus
}
data QueueStatus = QueueActive | QueueOff
class MonadQueueStore s m where
addQueue :: s -> RecipientKey -> (RecipientId, SenderId) -> m (Either ErrorType ())
addQueue :: s -> RecipientPublicKey -> (RecipientId, SenderId) -> m (Either ErrorType ())
getQueue :: s -> SParty (a :: Party) -> QueueId -> m (Either ErrorType QueueRec)
secureQueue :: s -> RecipientId -> SenderKey -> m (Either ErrorType ())
secureQueue :: s -> RecipientId -> SenderPublicKey -> m (Either ErrorType ())
suspendQueue :: s -> RecipientId -> m (Either ErrorType ())
deleteQueue :: s -> RecipientId -> m (Either ErrorType ())
mkQueueRec :: RecipientKey -> (RecipientId, SenderId) -> QueueRec
mkQueueRec :: RecipientPublicKey -> (RecipientId, SenderId) -> QueueRec
mkQueueRec recipientKey (recipientId, senderId) =
QueueRec
{ recipientId,
@@ -29,7 +29,7 @@ newQueueStore :: STM QueueStore
newQueueStore = newTVar QueueStoreData {queues = M.empty, senders = M.empty}
instance MonadQueueStore QueueStore STM where
addQueue :: QueueStore -> RecipientKey -> (RecipientId, SenderId) -> STM (Either ErrorType ())
addQueue :: QueueStore -> RecipientPublicKey -> (RecipientId, SenderId) -> STM (Either ErrorType ())
addQueue store rKey ids@(rId, sId) = do
cs@QueueStoreData {queues, senders} <- readTVar store
if M.member rId queues || M.member sId senders
+6 -4
View File
@@ -20,13 +20,15 @@ newtype CorrId = CorrId {bs :: ByteString} deriving (Eq, Ord, Show)
instance IsString CorrId where
fromString = CorrId . fromString
type PublicKey = Encoded
-- only used by Agent, kept here so its definition is close to respective public key
type RecipientPrivateKey = C.PrivateKey
type PrivateKey = Encoded
type RecipientPublicKey = C.PublicKey
type RecipientKey = C.PublicKey
-- only used by Agent, kept here so its definition is close to respective public key
type SenderPrivateKey = C.PrivateKey
type SenderKey = C.PublicKey
type SenderPublicKey = C.PublicKey
type MsgId = Encoded
+1 -1
View File
@@ -141,7 +141,7 @@ syntaxTests = do
it "invalid server keyHash" $ ("223", "", "NEW localhost:5000#1") >#> ("223", "", "ERR SYNTAX 11")
describe "JOIN" do
describe "valid" do
xdescribe "valid" do
-- TODO: ERROR no connection alias in the response (it does not generate it yet if not provided)
-- TODO: add tests with defined connection alias
it "using same server as in invitation" $
+9 -8
View File
@@ -6,6 +6,7 @@
module AgentTests.SQLiteTests (storeTests) where
import Control.Monad.Except (ExceptT, runExceptT)
import qualified Crypto.PubKey.RSA as R
import Data.Word (Word32)
import qualified Database.SQLite.Simple as DB
import Database.SQLite.Simple.QQ (sql)
@@ -92,7 +93,7 @@ rcvQueue1 =
rcvPrivateKey = C.PrivateKey 1 2 3,
sndId = Just "2345",
sndKey = Nothing,
decryptKey = "dcba",
decryptKey = C.PrivateKey 1 2 3,
verifyKey = Nothing,
status = New
}
@@ -104,8 +105,8 @@ sndQueue1 =
sndId = "3456",
connAlias = "conn1",
sndPrivateKey = C.PrivateKey 1 2 3,
encryptKey = "dcba",
signKey = "edcb",
encryptKey = C.PublicKey $ R.PublicKey 1 2 3,
signKey = C.PrivateKey 1 2 3,
status = New
}
@@ -207,8 +208,8 @@ testUpgradeRcvConnToDuplex = do
sndId = "2345",
connAlias = "conn1",
sndPrivateKey = C.PrivateKey 1 2 3,
encryptKey = "dcba",
signKey = "edcb",
encryptKey = C.PublicKey $ R.PublicKey 1 2 3,
signKey = C.PrivateKey 1 2 3,
status = New
}
upgradeRcvConnToDuplex store "conn1" anotherSndQueue
@@ -231,7 +232,7 @@ testUpgradeSndConnToDuplex = do
rcvPrivateKey = C.PrivateKey 1 2 3,
sndId = Just "4567",
sndKey = Nothing,
decryptKey = "dcba",
decryptKey = C.PrivateKey 1 2 3,
verifyKey = Nothing,
status = New
}
@@ -326,7 +327,7 @@ testCreateMsgHello = do
it "should create a HELLO message" $ \store -> do
createRcvConn store rcvQueue1
`returnsResult` ()
let verificationKey = "abcd"
let verificationKey = C.PublicKey $ R.PublicKey 1 2 3
let am = AckMode On
let msg = HELLO verificationKey am
let msgId = 1
@@ -341,7 +342,7 @@ testCreateMsgReply = do
`returnsResult` ()
let smpServer = SMPServer "smp.simplex.im" (Just "5223") (Just "1234")
let senderId = "sender1"
let encryptionKey = "abcd"
let encryptionKey = C.PublicKey $ R.PublicKey 1 2 3
let msg = REPLY $ SMPQueueInfo smpServer senderId encryptionKey
let msgId = 1
-- TODO getMsg to check message