cryptocipher 0.5.0 → 0.5.1
raw patch · 6 files changed
+541/−141 lines, 6 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
+ Crypto.Cipher.DES: decrypt :: Word64 -> Word64 -> Word64
+ Crypto.Cipher.DES: encrypt :: Word64 -> Word64 -> Word64
+ Crypto.Cipher.DES: instance Bits [Bool]
+ Crypto.Cipher.DES: instance Num [Bool]
+ Crypto.Cipher.TripleDES: DesEde2Key :: Word64 -> Word64 -> DesEde2Key
+ Crypto.Cipher.TripleDES: DesEde3Key :: Word64 -> Word64 -> Word64 -> DesEde3Key
+ Crypto.Cipher.TripleDES: DesEee2Key :: Word64 -> Word64 -> DesEee2Key
+ Crypto.Cipher.TripleDES: DesEee3Key :: Word64 -> Word64 -> Word64 -> DesEee3Key
+ Crypto.Cipher.TripleDES: data DesEde2Key
+ Crypto.Cipher.TripleDES: data DesEde3Key
+ Crypto.Cipher.TripleDES: data DesEee2Key
+ Crypto.Cipher.TripleDES: data DesEee3Key
+ Crypto.Cipher.TripleDES: instance BlockCipher DesEde2Key
+ Crypto.Cipher.TripleDES: instance BlockCipher DesEde3Key
+ Crypto.Cipher.TripleDES: instance BlockCipher DesEee2Key
+ Crypto.Cipher.TripleDES: instance BlockCipher DesEee3Key
+ Crypto.Cipher.TripleDES: instance Eq DesEde2Key
+ Crypto.Cipher.TripleDES: instance Eq DesEde3Key
+ Crypto.Cipher.TripleDES: instance Eq DesEee2Key
+ Crypto.Cipher.TripleDES: instance Eq DesEee3Key
+ Crypto.Cipher.TripleDES: instance Serialize DesEde2Key
+ Crypto.Cipher.TripleDES: instance Serialize DesEde3Key
+ Crypto.Cipher.TripleDES: instance Serialize DesEee2Key
+ Crypto.Cipher.TripleDES: instance Serialize DesEee3Key
+ Crypto.Cipher.TripleDES: instance Show DesEde2Key
+ Crypto.Cipher.TripleDES: instance Show DesEde3Key
+ Crypto.Cipher.TripleDES: instance Show DesEee2Key
+ Crypto.Cipher.TripleDES: instance Show DesEee3Key
Files
- Benchmarks/Benchmarks.hs +0/−20
- Crypto/Cipher/DES.hs +202/−0
- Crypto/Cipher/TripleDES.hs +134/−0
- Tests/tests.hs +193/−66
- cbits/aes/aes.h +0/−50
- cryptocipher.cabal +12/−5
Benchmarks/Benchmarks.hs view
@@ -13,25 +13,12 @@ import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L -import qualified Crypto.Cipher.AES as AES import qualified Crypto.Cipher.RC4 as RC4 import qualified Crypto.Cipher.Blowfish as Blowfish import qualified Crypto.Cipher.Camellia as Camellia import Crypto.Classes -key128 = AES.initKey $ B.replicate 16 0-aesEncrypt128 = AES.encryptECB key128-aesEncrypt128CBC = AES.encryptCBC key128 (AES.IV $ B.replicate 16 0)--key192 = AES.initKey $ B.replicate 24 0-aesEncrypt192 = AES.encryptECB key192-aesEncrypt192CBC = AES.encryptCBC key192 (AES.IV $ B.replicate 16 0)--key256 = AES.initKey $ B.replicate 32 0-aesEncrypt256 = AES.encryptECB key256-aesEncrypt256CBC = AES.encryptCBC key256 (AES.IV $ B.replicate 16 0)- (Right blowfishKey) = Blowfish.initKey $ B.empty blowfishEncrypt = Blowfish.encrypt blowfishKey @@ -82,13 +69,6 @@ [ ("RC4" , rc4Encrypt) , ("Blowfish" , blowfishEncrypt) , ("Camellia128", camelliaEncrypt128)- , ("AES128" , aesEncrypt128)- , ("AES128-CBC" , aesEncrypt128CBC)- -- , ("AES128-CBC-capi", aesEncrypt128CBC_capi)- , ("AES192" , aesEncrypt192)- , ("AES192-CBC" , aesEncrypt192CBC)- , ("AES256" , aesEncrypt256)- , ("AES256-CBC" , aesEncrypt256CBC) ] liftIO $ printf "%12s| %12s %12s %12s %12s %12s %12s\n" "cipher" "16 bytes" "32 bytes" "64 bytes" "512 bytes" "1024 bytes" "4096 bytes"
+ Crypto/Cipher/DES.hs view
@@ -0,0 +1,202 @@+{-# LANGUAGE FlexibleInstances #-}++-----------------------------------------------------------------------------+-- |+-- Module : Crypto.Cipher.DES+-- License : BSD-style+--+-- This module is copy of DES module from Crypto package.+-- http://hackage.haskell.org/package/Crypto+--+-----------------------------------------------------------------------------+++module Crypto.Cipher.DES (encrypt, decrypt) where++import Data.Word+import Data.Bits++type Rotation = Int+type Key = Word64+type Message = Word64+type Enc = Word64++type BitsX = [Bool]+type Bits4 = [Bool]+type Bits6 = [Bool]+type Bits32 = [Bool]+type Bits48 = [Bool]+type Bits56 = [Bool]+type Bits64 = [Bool]++instance Num [Bool]++instance Bits [Bool] where+ a `xor` b = (zipWith (\x y -> (not x && y) || (x && not y)) a b)+ rotate bits rot = drop rot' bits ++ take rot' bits+ where rot' = rot `mod` (length bits)++bitify :: Word64 -> Bits64+bitify w = map (\b -> w .&. (shiftL 1 b) /= 0) [63,62..0]++unbitify :: Bits64 -> Word64+unbitify bs = foldl (\i b -> if b then 1 + shiftL i 1 else shiftL i 1) 0 bs++initial_permutation :: Bits64 -> Bits64+initial_permutation mb = map ((!!) mb) i+ where i = [57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,+ 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7,+ 56, 48, 40, 32, 24, 16, 8, 0, 58, 50, 42, 34, 26, 18, 10, 2,+ 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6]++key_transformation :: Bits64 -> Bits56+key_transformation kb = map ((!!) kb) i+ where i = [56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,+ 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,+ 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,+ 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3]++des_enc :: Message -> Key -> Enc+des_enc = do_des [1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28]++des_dec :: Message -> Key -> Enc+des_dec = do_des [28,27,25,23,21,19,17,15,14,12,10,8,6,4,2,1]++do_des :: [Rotation] -> Message -> Key -> Enc+do_des rots m k = des_work rots (takeDrop 32 mb) kb+ where kb = key_transformation $ bitify k+ mb = initial_permutation $ bitify m++des_work :: [Rotation] -> (Bits32, Bits32) -> Bits56 -> Enc+des_work [] (ml, mr) _ = unbitify $ final_perm $ (mr ++ ml)+des_work (r:rs) mb kb = des_work rs mb' kb+ where mb' = do_round r mb kb++do_round :: Rotation -> (Bits32, Bits32) -> Bits56 -> (Bits32, Bits32)+do_round r (ml, mr) kb = (mr, m')+ where kb' = get_key kb r+ comp_kb = compression_permutation kb'+ expa_mr = expansion_permutation mr+ res = comp_kb `xor` expa_mr+ res' = tail $ iterate (trans 6) ([], res)+ trans n (_, b) = (take n b, drop n b)+ res_s = concat $ zipWith (\f (x,_) -> f x) [s_box_1, s_box_2,+ s_box_3, s_box_4,+ s_box_5, s_box_6,+ s_box_7, s_box_8] res'+ res_p = p_box res_s+ m' = res_p `xor` ml++get_key :: Bits56 -> Rotation -> Bits56+get_key kb r = kb'+ where (kl, kr) = takeDrop 28 kb+ kb' = rotateL kl r ++ rotateL kr r++compression_permutation :: Bits56 -> Bits48+compression_permutation kb = map ((!!) kb) i+ where i = [13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,+ 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,+ 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,+ 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31]++expansion_permutation :: Bits32 -> Bits48+expansion_permutation mb = map ((!!) mb) i+ where i = [31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8,+ 7, 8, 9, 10, 11, 12, 11, 12, 13, 14, 15, 16,+ 15, 16, 17, 18, 19, 20, 19, 20, 21, 22, 23, 24,+ 23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31, 0]++s_box :: [[Word8]] -> Bits6 -> Bits4+s_box s [a,b,c,d,e,f] = to_bool 4 $ (s !! row) !! col+ where row = sum $ zipWith numericise [a,f] [1, 0]+ col = sum $ zipWith numericise [b,c,d,e] [3, 2, 1, 0]+ numericise = (\x y -> if x then 2^y else 0)+ to_bool 0 _ = []+ to_bool n i = ((i .&. 8) == 8):to_bool (n-1) (shiftL i 1)++s_box_1 :: Bits6 -> Bits4+s_box_1 = s_box i+ where i = [[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],+ [ 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],+ [ 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],+ [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]]++s_box_2 :: Bits6 -> Bits4+s_box_2 = s_box i+ where i = [[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],+ [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],+ [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],+ [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]]++s_box_3 :: Bits6 -> Bits4+s_box_3 = s_box i+ where i = [[10, 0, 9, 14 , 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],+ [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],+ [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],+ [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]]++s_box_4 :: Bits6 -> Bits4+s_box_4 = s_box i+ where i = [[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],+ [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],+ [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],+ [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]]++s_box_5 :: Bits6 -> Bits4+s_box_5 = s_box i+ where i = [[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],+ [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],+ [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],+ [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]]++s_box_6 :: Bits6 -> Bits4+s_box_6 = s_box i+ where i = [[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],+ [10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],+ [9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],+ [4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]]++s_box_7 :: Bits6 -> Bits4+s_box_7 = s_box i+ where i = [[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],+ [13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],+ [1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],+ [6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]]++s_box_8 :: Bits6 -> Bits4+s_box_8 = s_box i+ where i = [[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],+ [1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],+ [7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],+ [2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]]++p_box :: Bits32 -> Bits32+p_box kb = map ((!!) kb) i+ where i = [15, 6, 19, 20, 28, 11, 27, 16, 0, 14, 22, 25, 4, 17, 30, 9,+ 1, 7, 23, 13, 31, 26, 2, 8, 18, 12, 29, 5, 21, 10, 3, 24]++final_perm :: Bits64 -> Bits64+final_perm kb = map ((!!) kb) i+ where i = [39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30,+ 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28,+ 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26,+ 33, 1, 41, 9, 49, 17, 57, 25, 32, 0, 40 , 8, 48, 16, 56, 24]++takeDrop :: Int -> [a] -> ([a], [a])+takeDrop _ [] = ([], [])+takeDrop 0 xs = ([], xs)+takeDrop n (x:xs) = (x:ys, zs)+ where (ys, zs) = takeDrop (n-1) xs+++-- | Basic DES encryption which takes a key and a block of plaintext+-- and returns the encrypted block of ciphertext according to the standard.++encrypt :: Word64 -> Word64 -> Word64+encrypt = flip des_enc++-- | Basic DES decryption which takes a key and a block of ciphertext and+-- returns the decrypted block of plaintext according to the standard.++decrypt :: Word64 -> Word64 -> Word64+decrypt = flip des_dec
+ Crypto/Cipher/TripleDES.hs view
@@ -0,0 +1,134 @@+-- |+-- Module : Crypto.Cipher.TripleDES+-- License : BSD-style+-- Stability : experimental+-- Portability : ???++module Crypto.Cipher.TripleDES+ ( DesEee3Key(..)+ , DesEde3Key(..)+ , DesEee2Key(..)+ , DesEde2Key(..)+ ) where++import Control.Applicative ((<$>))+import Data.Serialize (Get, Put, Serialize(..), runGet, runPut,+ getWord8, putWord64le)+import Data.Word (Word8, Word64)+import Foreign (castPtr, peek)+import System.IO.Unsafe (unsafePerformIO)+import Data.ByteString.Unsafe (unsafeUseAsCString)+import qualified Data.ByteString as B+import qualified Data.Bits as Bits++import Crypto.Classes (BlockCipher(..))+import qualified Crypto.Cipher.DES as DES++data DesEee3Key = DesEee3Key Word64 Word64 Word64 -- three different keys+ deriving (Show, Eq)++data DesEde3Key = DesEde3Key Word64 Word64 Word64 -- three different keys+ deriving (Show, Eq)++data DesEee2Key = DesEee2Key Word64 Word64 -- key1 and key3 are equal+ deriving (Show, Eq)++data DesEde2Key = DesEde2Key Word64 Word64 -- key1 and key3 are equal+ deriving (Show, Eq)++triplePut :: Word64 -> Word64 -> Word64 -> Put+triplePut f s t = putWord64le f >> putWord64le s >> putWord64le t++doublePut :: Word64 -> Word64 -> Put+doublePut f s = putWord64le f >> putWord64le s++getFixedParityByte :: Get Word8+getFixedParityByte = do+ sourceWord <- getWord8+ return $ case odd(Bits.popCount sourceWord) of+ True -> Bits.clearBit sourceWord lsb+ False -> sourceWord+ where+ lsb = 0++getFixedParityWord64le :: Get Word64+getFixedParityWord64le =+ sum <$> sequence [ shiftWord8Toword64 pos <$> getFixedParityByte+ | pos <- [7,6..0] ]+ where+ shiftWord8Toword64 :: Int -> Word8 -> Word64+ shiftWord8Toword64 pos = flip Bits.shiftL (pos * 8) . fromIntegral++tripleGet :: Get (Word64, Word64, Word64)+tripleGet = do+ f <- getFixedParityWord64le+ s <- getFixedParityWord64le+ t <- getFixedParityWord64le+ return (f, s, t)++doubleGet :: Get (Word64, Word64)+doubleGet = do+ f <- getFixedParityWord64le+ s <- getFixedParityWord64le+ return (f, s)++uncurry3 :: (a -> b -> c -> d) -> ((a, b, c) -> d)+uncurry3 f (x, y, z) = f x y z++instance Serialize DesEee3Key where+ put (DesEee3Key f s t) = triplePut f s t+ get = uncurry3 DesEee3Key <$> tripleGet++instance Serialize DesEde3Key where+ put (DesEde3Key f s t) = triplePut f s t+ get = uncurry3 DesEde3Key <$> tripleGet++instance Serialize DesEee2Key where+ put (DesEee2Key f s) = doublePut f s+ get = uncurry DesEee2Key <$> doubleGet++instance Serialize DesEde2Key where+ put (DesEde2Key f s) = doublePut f s+ get = uncurry DesEde2Key <$> doubleGet++bsToWord64 :: B.ByteString -> Word64+bsToWord64 bs = unsafePerformIO $ unsafeUseAsCString bs $ peek . castPtr++word64ToBs :: Word64 -> B.ByteString+word64ToBs = runPut . putWord64le++instance BlockCipher DesEee3Key where+ blockSize = 64+ encryptBlock (DesEee3Key f s t) = word64ToBs .+ DES.encrypt f . DES.encrypt s . DES.encrypt t . bsToWord64+ decryptBlock (DesEee3Key f s t) = word64ToBs .+ DES.decrypt t . DES.decrypt s . DES.decrypt f . bsToWord64+ buildKey = either (const Nothing) Just . runGet get+ keyLength = 64 * 3++instance BlockCipher DesEde3Key where+ blockSize = 64+ encryptBlock (DesEde3Key f s t) = word64ToBs .+ DES.encrypt f . DES.decrypt s . DES.encrypt t . bsToWord64+ decryptBlock (DesEde3Key f s t) = word64ToBs .+ DES.decrypt t . DES.encrypt s . DES.decrypt f . bsToWord64+ buildKey = either (const Nothing) Just . runGet get+ keyLength = 64 * 3++instance BlockCipher DesEee2Key where+ blockSize = 64+ encryptBlock (DesEee2Key f s) = word64ToBs .+ DES.encrypt f . DES.encrypt s . DES.encrypt f . bsToWord64+ decryptBlock (DesEee2Key f s) = word64ToBs .+ DES.decrypt f . DES.decrypt s . DES.decrypt f . bsToWord64+ buildKey = either (const Nothing) Just . runGet get+ keyLength = 64 * 2++instance BlockCipher DesEde2Key where+ blockSize = 64+ encryptBlock (DesEde2Key f s) = word64ToBs .+ DES.encrypt f . DES.decrypt s . DES.encrypt f . bsToWord64+ decryptBlock (DesEde2Key f s) = word64ToBs .+ DES.decrypt f . DES.encrypt s . DES.decrypt f . bsToWord64+ buildKey = either (const Nothing) Just . runGet get+ keyLength = 64 * 2
Tests/tests.hs view
@@ -15,6 +15,7 @@ import Data.Char import Data.Bits import Data.Word+import Data.Maybe (fromJust) import qualified Data.Vector.Unboxed as V import qualified Data.ByteString as B import qualified Data.ByteString.Char8 as BC@@ -22,74 +23,196 @@ import qualified Crypto.Hash.SHA1 as SHA1 -- ciphers/Kexch-import AES (aesTests)-import qualified Crypto.Cipher.AES as AES+import qualified Crypto.Cipher.TripleDES as TripleDES+import qualified Crypto.Classes as CryptoAPI+import qualified Crypto.Types as CryptoTypes import Crypto.Random import KAT +prop_ecb_valid encrypt decrypt k msg = decrypt k (encrypt k msg) == msg+ {-----------------------------------------------------------------------------------------------}-{- testing AES -}+{- testing 3DES -} {-----------------------------------------------------------------------------------------------}-data AES128Message = AES128Message B.ByteString B.ByteString B.ByteString deriving (Show, Eq)-data AES192Message = AES192Message B.ByteString B.ByteString B.ByteString deriving (Show, Eq)-data AES256Message = AES256Message B.ByteString B.ByteString B.ByteString deriving (Show, Eq) -arbitraryAES keysize = do- sz <- choose (1, 12)- ws <- replicateM (sz*16) (choose (0,255) :: Gen Int)- key <- replicateM keysize (choose (0,255) :: Gen Int)- iv <- replicateM 16 (choose (0,255) :: Gen Int)- return (ws, key, iv)+data DESEEE3Message = DESEEE3Message B.ByteString B.ByteString B.ByteString deriving (Show, Eq)+data DESEDE3Message = DESEDE3Message B.ByteString B.ByteString B.ByteString deriving (Show, Eq)+data DESEEE2Message = DESEEE2Message B.ByteString B.ByteString B.ByteString deriving (Show, Eq)+data DESEDE2Message = DESEDE2Message B.ByteString B.ByteString B.ByteString deriving (Show, Eq) -instance Arbitrary AES128Message where- arbitrary = do- (ws, key, iv) <- arbitraryAES 16- return $ AES128Message (B.pack $ map fromIntegral key)- (B.pack $ map fromIntegral iv)- (B.pack $ map fromIntegral ws)+commonTripleDesMessage construct keysNumber = do+ key <- replicateM (8 * keysNumber) (choose (0, 255) :: Gen Int)+ sz <- choose (1, 12)+ ws <- replicateM (sz * 16) (choose (0, 255) :: Gen Int)+ iv <- replicateM 8 (choose (0,255) :: Gen Int)+ return $ construct (B.pack $ map fromIntegral key)+ (B.pack $ map fromIntegral ws)+ (B.pack $ map fromIntegral iv) -instance Arbitrary AES192Message where- arbitrary = do- (ws, key, iv) <- arbitraryAES 24- return $ AES192Message (B.pack $ map fromIntegral key)- (B.pack $ map fromIntegral iv)- (B.pack $ map fromIntegral ws)+instance Arbitrary DESEEE3Message where+ arbitrary = commonTripleDesMessage DESEEE3Message 3 -instance Arbitrary AES256Message where- arbitrary = do- (ws, key, iv) <- arbitraryAES 32- return $ AES256Message (B.pack $ map fromIntegral key)- (B.pack $ map fromIntegral iv)- (B.pack $ map fromIntegral ws)+instance Arbitrary DESEDE3Message where+ arbitrary = commonTripleDesMessage DESEDE3Message 3 +instance Arbitrary DESEEE2Message where+ arbitrary = commonTripleDesMessage DESEEE2Message 2 -prop_ecb_valid k msg = AES.decryptECB k (AES.encryptECB k msg) == msg-prop_cbc_valid k iv msg = AES.decryptCBC k (AES.IV iv) (AES.encryptCBC k (AES.IV iv) msg) == msg+instance Arbitrary DESEDE2Message where+ arbitrary = commonTripleDesMessage DESEDE2Message 2 -prop_aes128_ecb_valid (AES128Message key _ msg) =- let k = AES.initKey key in- prop_ecb_valid k msg+prop_3des_valid encrypt decrypt key iv msg =+ (fst $ decrypt key (CryptoTypes.IV iv) (fst $ encrypt key (CryptoTypes.IV iv) msg)) == msg -prop_aes192_ecb_valid (AES192Message key _ msg) =- let k = AES.initKey key in- prop_ecb_valid k msg+tripleDesCipherKey :: (CryptoAPI.BlockCipher c) => B.ByteString -> c+tripleDesCipherKey = fromJust . CryptoAPI.buildKey -prop_aes256_ecb_valid (AES256Message key _ msg) =- let k = AES.initKey key in- prop_ecb_valid k msg+-- 3DES ECB section -prop_aes128_cbc_valid (AES128Message key iv msg) =- let k = AES.initKey key in- prop_cbc_valid k iv msg+prop_des_eee3_ecb_valid (DESEEE3Message key _ msg) =+ prop_ecb_valid CryptoAPI.ecb+ CryptoAPI.unEcb+ (tripleDesCipherKey key :: TripleDES.DesEee3Key)+ msg -prop_aes192_cbc_valid (AES192Message key iv msg) =- let k = AES.initKey key in- prop_cbc_valid k iv msg+prop_des_ede3_ecb_valid (DESEDE3Message key _ msg) =+ prop_ecb_valid CryptoAPI.ecb+ CryptoAPI.unEcb+ (tripleDesCipherKey key :: TripleDES.DesEde3Key)+ msg -prop_aes256_cbc_valid (AES256Message key iv msg) =- let k = AES.initKey key in- prop_cbc_valid k iv msg+prop_des_eee2_ecb_valid (DESEEE2Message key _ msg) =+ prop_ecb_valid CryptoAPI.ecb+ CryptoAPI.unEcb+ (tripleDesCipherKey key :: TripleDES.DesEee2Key)+ msg +prop_des_ede2_ecb_valid (DESEDE2Message key _ msg) =+ prop_ecb_valid CryptoAPI.ecb+ CryptoAPI.unEcb+ (tripleDesCipherKey key :: TripleDES.DesEde2Key)+ msg++-- 3DES CBC section++prop_des_eee3_cbc_valid (DESEEE3Message key iv msg) =+ prop_3des_valid CryptoAPI.cbc+ CryptoAPI.unCbc+ (tripleDesCipherKey key :: TripleDES.DesEee3Key)+ iv+ msg++prop_des_ede3_cbc_valid (DESEDE3Message key iv msg) =+ prop_3des_valid CryptoAPI.cbc+ CryptoAPI.unCbc+ (tripleDesCipherKey key :: TripleDES.DesEde3Key)+ iv+ msg++prop_des_eee2_cbc_valid (DESEEE2Message key iv msg) =+ prop_3des_valid CryptoAPI.cbc+ CryptoAPI.unCbc+ (tripleDesCipherKey key :: TripleDES.DesEee2Key)+ iv+ msg++prop_des_ede2_cbc_valid (DESEDE2Message key iv msg) =+ prop_3des_valid CryptoAPI.cbc+ CryptoAPI.unCbc+ (tripleDesCipherKey key :: TripleDES.DesEde2Key)+ iv+ msg++-- 3DES CTR section++prop_des_eee3_ctr_valid (DESEEE3Message key iv msg) =+ prop_3des_valid CryptoAPI.ctr+ CryptoAPI.unCtr+ (tripleDesCipherKey key :: TripleDES.DesEee3Key)+ iv+ msg++prop_des_ede3_ctr_valid (DESEDE3Message key iv msg) =+ prop_3des_valid CryptoAPI.ctr+ CryptoAPI.unCtr+ (tripleDesCipherKey key :: TripleDES.DesEde3Key)+ iv+ msg++prop_des_eee2_ctr_valid (DESEEE2Message key iv msg) =+ prop_3des_valid CryptoAPI.ctr+ CryptoAPI.unCtr+ (tripleDesCipherKey key :: TripleDES.DesEee2Key)+ iv+ msg++prop_des_ede2_ctr_valid (DESEDE2Message key iv msg) =+ prop_3des_valid CryptoAPI.ctr+ CryptoAPI.unCtr+ (tripleDesCipherKey key :: TripleDES.DesEde2Key)+ iv+ msg++-- 3DES CFB section++prop_des_eee3_cfb_valid (DESEEE3Message key iv msg) =+ prop_3des_valid CryptoAPI.cfb+ CryptoAPI.unCfb+ (tripleDesCipherKey key :: TripleDES.DesEee3Key)+ iv+ msg++prop_des_ede3_cfb_valid (DESEDE3Message key iv msg) =+ prop_3des_valid CryptoAPI.cfb+ CryptoAPI.unCfb+ (tripleDesCipherKey key :: TripleDES.DesEde3Key)+ iv+ msg++prop_des_eee2_cfb_valid (DESEEE2Message key iv msg) =+ prop_3des_valid CryptoAPI.cfb+ CryptoAPI.unCfb+ (tripleDesCipherKey key :: TripleDES.DesEee2Key)+ iv+ msg++prop_des_ede2_cfb_valid (DESEDE2Message key iv msg) =+ prop_3des_valid CryptoAPI.cfb+ CryptoAPI.unCfb+ (tripleDesCipherKey key :: TripleDES.DesEde2Key)+ iv+ msg++-- 3DES OFB section++prop_des_eee3_ofb_valid (DESEEE3Message key iv msg) =+ prop_3des_valid CryptoAPI.ofb+ CryptoAPI.unOfb+ (tripleDesCipherKey key :: TripleDES.DesEee3Key)+ iv+ msg++prop_des_ede3_ofb_valid (DESEDE3Message key iv msg) =+ prop_3des_valid CryptoAPI.ofb+ CryptoAPI.unOfb+ (tripleDesCipherKey key :: TripleDES.DesEde3Key)+ iv+ msg++prop_des_eee2_ofb_valid (DESEEE2Message key iv msg) =+ prop_3des_valid CryptoAPI.ofb+ CryptoAPI.unOfb+ (tripleDesCipherKey key :: TripleDES.DesEee2Key)+ iv+ msg++prop_des_ede2_ofb_valid (DESEDE2Message key iv msg) =+ prop_3des_valid CryptoAPI.ofb+ CryptoAPI.unOfb+ (tripleDesCipherKey key :: TripleDES.DesEde2Key)+ iv+ msg+ {-----------------------------------------------------------------------------------------------} {- main -} {-----------------------------------------------------------------------------------------------}@@ -97,28 +220,32 @@ symCipherExpectedTests = testGroup "symmetric cipher KAT" katTests symCipherMarshallTests = testGroup "symmetric cipher marshall"- [ testProperty "AES128 (ECB)" prop_aes128_ecb_valid- , testProperty "AES128 (CBC)" prop_aes128_cbc_valid- , testProperty "AES192 (ECB)" prop_aes192_ecb_valid- , testProperty "AES192 (CBC)" prop_aes192_cbc_valid- , testProperty "AES256 (ECB)" prop_aes256_ecb_valid- , testProperty "AES256 (CBC)" prop_aes256_cbc_valid+ [ testProperty "DES-EEE3 (ECB)" prop_des_eee3_ecb_valid+ , testProperty "DES-EEE3 (CBC)" prop_des_eee3_cbc_valid+ , testProperty "DES-EEE3 (CTR)" prop_des_eee3_ctr_valid+ , testProperty "DES-EEE3 (CFB)" prop_des_eee3_cfb_valid+ , testProperty "DES-EEE3 (OFB)" prop_des_eee3_ofb_valid+ , testProperty "DES-EDE3 (ECB)" prop_des_ede3_ecb_valid+ , testProperty "DES-EDE3 (CBC)" prop_des_ede3_cbc_valid+ , testProperty "DES-EDE3 (CTR)" prop_des_ede3_ctr_valid+ , testProperty "DES-EDE3 (CFB)" prop_des_ede3_cfb_valid+ , testProperty "DES-EDE3 (OFB)" prop_des_ede3_ofb_valid+ , testProperty "DES-EEE2 (ECB)" prop_des_eee2_ecb_valid+ , testProperty "DES-EEE2 (CBC)" prop_des_eee2_cbc_valid+ , testProperty "DES-EEE2 (CTR)" prop_des_eee2_ctr_valid+ , testProperty "DES-EEE2 (CFB)" prop_des_eee2_cfb_valid+ , testProperty "DES-EEE2 (OFB)" prop_des_eee2_ofb_valid+ , testProperty "DES-EDE2 (ECB)" prop_des_ede2_ecb_valid+ , testProperty "DES-EDE2 (CBC)" prop_des_ede2_cbc_valid+ , testProperty "DES-EDE2 (CTR)" prop_des_ede2_ctr_valid+ , testProperty "DES-EDE2 (CFB)" prop_des_ede2_cfb_valid+ , testProperty "DES-EDE2 (OFB)" prop_des_ede2_ofb_valid ] tests :: [Test] tests = [ symCipherExpectedTests , symCipherMarshallTests- , testGroup "AES" aesTests ] main = defaultMain tests-{-- -- Number Tests- run_test "gcde binary valid" prop_gcde_binary_valid- run_test "exponantiation RTL valid" prop_modexp_rtl_valid- run_test "inverse valid" prop_modinv_valid- run_test "sqrt integer valid" prop_sqrti_valid- run_test "primality test Miller Rabin" prop_miller_rabin_valid- run_test "Generate prime" prop_generate_prime_valid- -}
− cbits/aes/aes.h
@@ -1,50 +0,0 @@-/*- * Copyright (c) 2010-2012 Vincent Hanquez <vincent@snarc.org>- * - * All rights reserved.- * - * Redistribution and use in source and binary forms, with or without- * modification, are permitted provided that the following conditions- * are met:- * 1. Redistributions of source code must retain the above copyright- * notice, this list of conditions and the following disclaimer.- * 2. Redistributions in binary form must reproduce the above copyright- * notice, this list of conditions and the following disclaimer in the- * documentation and/or other materials provided with the distribution.- * 3. Neither the name of the author nor the names of his contributors- * may be used to endorse or promote products derived from this software- * without specific prior written permission.- * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF- * SUCH DAMAGE.- */-#ifndef CRYPTOCIPHER_AES_H-#define CRYPTOCIPHER_AES_H--#define AES128_NB_ROUNDS 10--#include <stdint.h>--/* aes_key128 need to be 16 aligned by higher layer using the code. */-typedef struct { uint8_t _data[20]; } aes_key128;--void aes_generate_key128(aes_key128 *key, uint8_t *ikey);--/* ECB mode */-void aes_encrypt(uint8_t *out, aes_key128 *key, uint8_t *in, uint32_t blocks);-void aes_decrypt(uint8_t *out, aes_key128 *key, uint8_t *in, uint32_t blocks);--/* CBC mode */-void aes_encrypt_cbc(uint8_t *out, aes_key128 *key, uint8_t *iv, uint8_t *in, uint32_t blocks);-void aes_decrypt_cbc(uint8_t *out, aes_key128 *key, uint8_t *iv, uint8_t *in, uint32_t blocks);--#endif
cryptocipher.cabal view
@@ -1,6 +1,11 @@ Name: cryptocipher-Version: 0.5.0-Description: Symmetrical block and stream ciphers.+Version: 0.5.1+Description:+ Symmetrical block and stream ciphers.+ .+ This package is eventually going away in this form, and should be considered deprecated.+ use 'cipher-aes' for AES. For blowfish, camellia, DES/3DES, the package is still maintained,+ but eventually each cipher will be available in another package. License: BSD3 License-file: LICENSE Copyright: Vincent Hanquez <vincent@snarc.org>@@ -9,10 +14,9 @@ Synopsis: Symmetrical block and stream ciphers. Category: Cryptography Build-Type: Simple-Homepage: http://github.com/vincenthz/hs-cryptocipher+Homepage: http://github.com/vincenthz/hs-crypto-cipher Cabal-Version: >=1.8 Extra-Source-Files: Tests/*.hs- cbits/aes/aes.h Flag benchmark Description: Build benchmarks@@ -33,6 +37,8 @@ Crypto.Cipher.AES Crypto.Cipher.Blowfish Crypto.Cipher.Camellia+ Crypto.Cipher.TripleDES+ Crypto.Cipher.DES ghc-options: -Wall Test-Suite test-cryptocipher@@ -66,4 +72,5 @@ source-repository head type: git- location: git://github.com/vincenthz/hs-cryptocipher+ location: git://github.com/vincenthz/hs-crypto-cipher+ subdir: cryptocipher