Dust-2.0: Dust/Core/CryptoProtocol.hs
{-# LANGUAGE DeriveGeneric, DefaultSignatures #-} -- For automatic generation of cereal put and get
module Dust.Core.CryptoProtocol
(
Session(..),
Stream(..),
StreamHeader(..),
makeSession,
makeEncrypt,
makeDecrypt,
makeHeader,
makeStream,
makeEncoder
) where
import Dust.Core.DustPacket
import Dust.Crypto.DustCipher
import Dust.Crypto.ECDH
import Dust.Crypto.Keys
import Dust.Model.TrafficModel
data Session = Session Keypair PublicKey IV deriving (Show)
data Stream = Stream StreamHeader CipherDataPacket deriving (Show)
data StreamHeader = StreamHeader PublicKey IV deriving (Show)
makeSession :: Keypair -> PublicKey -> IV -> Session
makeSession keypair publicKey iv = Session keypair publicKey iv
makeEncrypt :: Session -> (Plaintext -> Ciphertext)
makeEncrypt (Session (Keypair myPublic myPrivate) otherPublic iv) =
let key = createShared myPrivate otherPublic
in encrypt key iv
makeDecrypt :: Session -> (Ciphertext -> Plaintext)
makeDecrypt (Session (Keypair myPublic myPrivate) otherPublic iv) =
let key = createShared myPrivate otherPublic
in decrypt key iv
makeHeader :: PublicKey -> IV -> StreamHeader
makeHeader publicKey iv = StreamHeader publicKey iv
makeStream :: StreamHeader -> CipherDataPacket -> Stream
makeStream header cipherPacket = Stream header cipherPacket
makeEncoder :: Session -> (Plaintext -> Stream)
makeEncoder session@(Session (Keypair myPublic _) _ iv) =
let header = makeHeader myPublic iv
cipher = makeEncrypt session
encrypter = encryptData cipher
stream = makeStream header
in stream . encrypter . makePlainPacket