module Crypto.Cipher.Utils (
    validateKeySize,
) where

import Crypto.Cipher.Types
import Crypto.Error

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