1module Crypto.Cipher.Utils
2    ( validateKeySize
3    ) where
4
5import Crypto.Error
6import Crypto.Cipher.Types
7
8import Data.ByteArray as BA
9
10validateKeySize :: (ByteArrayAccess key, Cipher cipher) => cipher -> key -> CryptoFailable key
11validateKeySize c k = if validKeyLength
12                      then CryptoPassed k
13                      else CryptoFailed CryptoError_KeySizeInvalid
14  where keyLength = BA.length k
15        validKeyLength = case cipherKeySize c of
16          KeySizeRange low high -> keyLength >= low && keyLength <= high
17          KeySizeEnum lengths -> keyLength `elem` lengths
18          KeySizeFixed s -> keyLength == s