72 lines
1.8 KiB
Haskell

-- | Mix address field encoding
{-# LANGUAGE StrictData #-}
module Mix.Address where
--------------------------------------------------------------------------------
import Data.Word
import Control.Monad
import System.Random
import Data.Octets
--------------------------------------------------------------------------------
-- * network addresses
-- | We encode networks addresses as strings for simplicity
type NetworkAddress = String
-- | Compressed mix addresses are something like a hash
newtype ComprMixAddr
= MkMixAddr [Word8]
deriving (Eq,Show)
-- | A mix node can have a full address or a compressed address
data MixAddress
= CompressedMixAddr ComprMixAddr
| FullMixAddr NetworkAddress
deriving (Eq,Show)
-- | An address can be a mix node or an external address
data SomeAddress
= MixAddress MixAddress
| ExternalAddress NetworkAddress
deriving (Eq,Show)
--------------------------------------------------------------------------------
-- * delays
newtype DelayHint
= DelayHint Word16
deriving (Eq,Show)
randomDelayHint :: IO DelayHint
randomDelayHint = DelayHint <$> randomRIO (1,2^15-1)
--------------------------------------------------------------------------------
-- * mix addresses
data TransportVersion
= TransportVersion1
deriving (Eq,Show)
data RecvProtocol
= BasicMixProtocol -- ^ just sending packets
| MixTransportProtocol TransportVersion -- ^ it's the transport layer protocol
deriving (Eq,Show)
data FwdAddress
= ForwardingHop MixAddress
| FinalHop RecvProtocol SomeAddress
deriving (Eq,Show)
-- | An address field contains a delay hint, and an forwarding address
data AddressField
= MkAddressField DelayHint FwdAddress
deriving (Eq,Show)
--------------------------------------------------------------------------------