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