summaryrefslogtreecommitdiff
path: root/src/Erebos/Network/Protocol.hs
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-10-18 10:13:30 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-10-23 23:26:21 +0200
commite45b366ca8b9caa4fe0087e5c4fb1720472d9c23 (patch)
tree284f7cca2d3d58482ea459bd3b80c585a0fa7c72 /src/Erebos/Network/Protocol.hs
parent552cb773ce9d8472530e123e926493b3dd1e658f (diff)
Refactor code to support multiple crypto backendsHEADmaster
Diffstat (limited to 'src/Erebos/Network/Protocol.hs')
-rw-r--r--src/Erebos/Network/Protocol.hs41
1 files changed, 17 insertions, 24 deletions
diff --git a/src/Erebos/Network/Protocol.hs b/src/Erebos/Network/Protocol.hs
index 6654b27..87272a2 100644
--- a/src/Erebos/Network/Protocol.hs
+++ b/src/Erebos/Network/Protocol.hs
@@ -45,11 +45,6 @@ import Control.Monad
import Control.Monad.Except
import Control.Monad.Trans
-import Crypto.Cipher.ChaChaPoly1305 qualified as C
-import Crypto.MAC.Poly1305 qualified as C (Auth(..), authTag)
-import Crypto.Error
-import Crypto.Random
-
import Data.Binary
import Data.Binary.Get
import Data.Binary.Put
@@ -69,6 +64,7 @@ import Data.Void
import System.Clock
+import Crypto as C
import Erebos.Flow
import Erebos.Identity
import Erebos.Network.Channel
@@ -149,7 +145,7 @@ instance Binary ParsedCookie where
putByteString cookieContent
get = do
- Just cookieNonce <- maybeCryptoError . C.nonce12 <$> getByteString 12
+ Just cookieNonce <- maybeCryptoError . C.nonce12 . BA.convert <$> getByteString 12
cookieValidity <- getWord32be
Just cookieMac <- maybeCryptoError . C.authTag <$> getByteString 16
cookieContent <- BL.toStrict <$> getRemainingLazyByteString
@@ -810,11 +806,11 @@ createCookie GlobalState {..} addr = do
cookieValidity = validSecondsFromStart - gCookieStartTime
plainContent = BC.pack (show addr)
throwCryptoErrorIO $ do
- cookieNonce <- C.nonce12 nonceBytes
- st1 <- C.initialize gCookieKey cookieNonce
- let st2 = C.finalizeAAD $ C.appendAAD (BL.toStrict $ runPut $ putWord32be cookieValidity) st1
- (cookieContent, st3) = C.encrypt plainContent st2
- cookieMac = C.finalize st3
+ cookieNonce <- nonce12 nonceBytes
+ st1 <- aeadInitialize gCookieKey cookieNonce
+ let st2 = aeadFinalizeAAD $ aeadAppendAAD (BL.toStrict $ runPut $ putWord32be cookieValidity) st1
+ ( cookieContent, st3 ) = encrypt plainContent st2
+ cookieMac = aeadFinalize st3
return $ Cookie $ BL.toStrict $ encode $ ParsedCookie {..}
verifyCookie :: GlobalState addr -> addr -> Cookie -> IO Bool
@@ -822,19 +818,16 @@ verifyCookie GlobalState {..} addr (Cookie cookie) = do
ctime <- getTime Monotonic
return $ fromMaybe False $ do
( _, _, ParsedCookie {..} ) <- either (const Nothing) Just $ decodeOrFail $ BL.fromStrict cookie
- maybeCryptoError $ do
- st1 <- C.initialize gCookieKey cookieNonce
- let st2 = C.finalizeAAD $ C.appendAAD (BL.toStrict $ runPut $ putWord32be cookieValidity) st1
- (plainContent, st3) = C.decrypt cookieContent st2
- mac = C.finalize st3
-
- validSecondsFromStart = fromIntegral $ cookieValidity + gCookieStartTime
- validUntil = gStartTime + fromNanoSecs (validSecondsFromStart * (10^(9 :: Int)))
- return $ and
- [ mac == cookieMac
- , ctime <= validUntil
- , show addr == BC.unpack plainContent
- ]
+ st1 <- maybeCryptoError $ do
+ aeadInitialize gCookieKey cookieNonce
+ let st2 = aeadFinalizeAAD $ aeadAppendAAD (BL.toStrict $ runPut $ putWord32be cookieValidity) st1
+ plainContent <- decrypt ( cookieContent, cookieMac ) st2
+ let validSecondsFromStart = fromIntegral $ cookieValidity + gCookieStartTime
+ validUntil = gStartTime + fromNanoSecs (validSecondsFromStart * (10^(9 :: Int)))
+ return $ and
+ [ ctime <= validUntil
+ , show addr == BC.unpack plainContent
+ ]
reservePacket :: Connection addr -> STM ReservedToSend
reservePacket conn@Connection {..} = do