packages feed

pipes-cacophony-0.3.0: examples/loopback/Main.hs

module Main where

import Control.Lens
import Control.Monad (forever)
import Data.ByteString.Char8 (unpack, pack)
import Pipes
import qualified Pipes.Prelude as P

import Crypto.Noise
import Crypto.Noise.Cipher.ChaChaPoly1305
import Crypto.Noise.DH
import Crypto.Noise.DH.Curve25519
import Crypto.Noise.HandshakePatterns (noiseNN)
import Crypto.Noise.Hash.SHA256
import Data.ByteArray.Extend

import Pipes.Noise

strToSB :: Pipe String ScrubbedBytes IO (Either NoiseException ())
strToSB = forever $ await >>= yield . convert . pack

sbToStr :: Pipe ScrubbedBytes String IO (Either NoiseException ())
sbToStr = forever $ await >>= yield . unpack . convert

main :: IO ()
main = do
  iek <- dhGenKey :: IO (KeyPair Curve25519)
  rek <- dhGenKey :: IO (KeyPair Curve25519)

  let idho     = defaultHandshakeOpts noiseNN InitiatorRole
      rdho     = defaultHandshakeOpts noiseNN ResponderRole
      iho      = idho & hoLocalEphemeral .~ Just iek
      rho      = rdho & hoLocalEphemeral .~ Just rek
      ins      = noiseState iho :: NoiseState ChaChaPoly1305 Curve25519 SHA256
      rns      = noiseState rho :: NoiseState ChaChaPoly1305 Curve25519 SHA256

  (iip, iop) <- mkNoisePipes ins
  (rip, rop) <- mkNoisePipes rns

  result <- runEffect $ (Right () <$ P.stdinLn) >-> strToSB >-> iop >-> rip >-> rop >-> iip >-> sbToStr >-> (Right () <$ P.stdoutLn)
  case result of
    Left e  -> print e
    Right _ -> return ()