module Crypto.Cipher.Utils ( validateKeySize ) where import Crypto.Error import Crypto.Cipher.Types import Data.ByteArray as BA validateKeySize :: (ByteArrayAccess key, Cipher cipher) => cipher -> key -> CryptoFailable key validateKeySize :: forall key cipher. (ByteArrayAccess key, Cipher cipher) => cipher -> key -> CryptoFailable key validateKeySize cipher c key k = if Bool validKeyLength then key -> CryptoFailable key forall a. a -> CryptoFailable a CryptoPassed key k else CryptoError -> CryptoFailable key forall a. CryptoError -> CryptoFailable a CryptoFailed CryptoError CryptoError_KeySizeInvalid where keyLength :: Int keyLength = key -> Int forall ba. ByteArrayAccess ba => ba -> Int BA.length key k validKeyLength :: Bool validKeyLength = case cipher -> KeySizeSpecifier forall cipher. Cipher cipher => cipher -> KeySizeSpecifier cipherKeySize cipher c of KeySizeRange Int low Int high -> Int keyLength Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >= Int low Bool -> Bool -> Bool && Int keyLength Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <= Int high KeySizeEnum [Int] lengths -> Int keyLength Int -> [Int] -> Bool forall a. Eq a => a -> [a] -> Bool forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` [Int] lengths KeySizeFixed Int s -> Int keyLength Int -> Int -> Bool forall a. Eq a => a -> a -> Bool == Int s