    module Crypto.Cipher.Twofish
        ( Twofish128
        , Twofish192
        , Twofish256
        ) where

    import Crypto.Cipher.Twofish.Primitive
    import Crypto.Cipher.Types
    import Crypto.Cipher.Utils
    import Crypto.Internal.Imports

    newtype Twofish128 = Twofish128 Twofish

    instance Cipher Twofish128 where
        cipherName    _ = "Twofish128"
        cipherKeySize _ = KeySizeFixed 16
        cipherInit key  = Twofish128 <$> (initTwofish =<< validateKeySize (undefined :: Twofish128) key)

    instance BlockCipher Twofish128 where
        blockSize                 _ = 16
        ecbEncrypt (Twofish128 key) = encrypt key
        ecbDecrypt (Twofish128 key) = decrypt key

    newtype Twofish192 = Twofish192 Twofish

    instance Cipher Twofish192 where
        cipherName    _ = "Twofish192"
        cipherKeySize _ = KeySizeFixed 24
        cipherInit key  = Twofish192 <$> (initTwofish =<< validateKeySize (undefined :: Twofish192) key)

    instance BlockCipher Twofish192 where
        blockSize                 _ = 16
        ecbEncrypt (Twofish192 key) = encrypt key
        ecbDecrypt (Twofish192 key) = decrypt key

    newtype Twofish256 = Twofish256 Twofish

    instance Cipher Twofish256 where
        cipherName    _ = "Twofish256"
        cipherKeySize _ = KeySizeFixed 32
        cipherInit key  = Twofish256 <$> (initTwofish =<< validateKeySize (undefined :: Twofish256) key)

    instance BlockCipher Twofish256 where
        blockSize                 _ = 16
        ecbEncrypt (Twofish256 key) = encrypt key
        ecbDecrypt (Twofish256 key) = decrypt key