module Codec.Encryption.OpenPGP.BlockCipher (
BCipher(..)
, bcBlockSize
, saBlockSize
, keySize
) where
import Codec.Encryption.OpenPGP.Types
import Crypto.Cipher.Types (BlockCipher(..))
import qualified Crypto.Cipher as CC
import qualified Crypto.Nettle.Ciphers as CNC
data BCipher = forall a. (BlockCipher a) => BCipher a
bcBlockSize :: BCipher -> Int
bcBlockSize (BCipher bc) = blockSize bc
saBlockSize :: SymmetricAlgorithm -> Int
saBlockSize = bcBlockSize . saToBCipher
saToBCipher :: SymmetricAlgorithm -> BCipher
saToBCipher Plaintext = error "this shouldn't have happened"
saToBCipher IDEA = error "IDEA not yet implemented"
saToBCipher ReservedSAFER = error "SAFER not implemented"
saToBCipher ReservedDES = error "DES not implemented"
saToBCipher (OtherSA _) = error "Unknown, unimplemented symmetric algorithm"
saToBCipher CAST5 = BCipher (undefined :: CNC.CAST128)
saToBCipher Twofish = BCipher (undefined :: CNC.TWOFISH)
saToBCipher TripleDES = BCipher (undefined :: CC.DES_EDE3)
saToBCipher Blowfish = BCipher (undefined :: CC.Blowfish128)
saToBCipher AES128 = BCipher (undefined :: CC.AES128)
saToBCipher AES192 = BCipher (undefined :: CC.AES192)
saToBCipher AES256 = BCipher (undefined :: CC.AES256)
keySize :: SymmetricAlgorithm -> Int
keySize Plaintext = 0
keySize IDEA = 16
keySize TripleDES = 24
keySize CAST5 = 16
keySize Blowfish = 16
keySize ReservedSAFER = undefined
keySize ReservedDES = undefined
keySize AES128 = 16
keySize AES192 = 24
keySize AES256 = 32
keySize Twofish = 32
keySize (OtherSA _) = undefined