packages feed

cipher-des (empty) → 0.0.1

raw patch · 9 files changed

+565/−0 lines, 9 filesdep +QuickCheckdep +basedep +byteablesetup-changed

Dependencies added: QuickCheck, base, byteable, bytestring, cereal, cipher-des, criterion, crypto-cipher-benchmarks, crypto-cipher-tests, crypto-cipher-types, mtl, securemem, test-framework, test-framework-quickcheck2

Files

+ Benchmarks/Benchmarks.hs view
@@ -0,0 +1,11 @@+import Crypto.Cipher.Benchmarks+import Crypto.Cipher.DES (DES)+import Crypto.Cipher.TripleDES++main = defaultMain+    [GBlockCipher (undefined :: DES)+    ,GBlockCipher (undefined :: DES_EEE3)+    ,GBlockCipher (undefined :: DES_EDE3)+    ,GBlockCipher (undefined :: DES_EEE2)+    ,GBlockCipher (undefined :: DES_EDE2)+    ]
+ Crypto/Cipher/DES.hs view
@@ -0,0 +1,37 @@+-- |+-- Module      : Crypto.Cipher.DES+-- License     : BSD-style+-- Maintainer  : Vincent Hanquez <vincent@snarc.org>+-- Stability   : stable+-- Portability : good+--+module Crypto.Cipher.DES+    ( DES+    ) where++import Data.Byteable+import Data.Word+import Crypto.Cipher.Types+import Crypto.Cipher.DES.Primitive+import Crypto.Cipher.DES.Serialization++-- | DES Context+data DES = DES Word64+    deriving (Eq)++instance Cipher DES where+    cipherName    _ = "DES"+    cipherKeySize _ = KeySizeFixed 8+    cipherInit k    = initDES k++instance BlockCipher DES where+    blockSize _ = 8+    ecbEncrypt (DES key) = unblockify . map (encrypt key) . blockify+    ecbDecrypt (DES key) = unblockify . map (decrypt key) . blockify++initDES :: Byteable b => b -> DES+initDES k+    | len == 8  = DES key+    | otherwise = error "DES: not a valid key length (valid=8)"+  where len  = byteableLength k+        (Block key) = toW64 $ toBytes k
+ Crypto/Cipher/DES/Primitive.hs view
@@ -0,0 +1,202 @@+{-# LANGUAGE FlexibleInstances #-}++-----------------------------------------------------------------------------+-- |+-- Module      :  Crypto.Cipher.DES.Primitive+-- License     :  BSD-style+--+-- This module is copy of DES module from Crypto package.+-- http://hackage.haskell.org/package/Crypto+--+-----------------------------------------------------------------------------+++module Crypto.Cipher.DES.Primitive (encrypt, decrypt, Block(..)) where++import Data.Word+import Data.Bits++newtype Block = Block Word64++type Rotation = Int+type Key     = 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 :: Block -> Key -> Block+des_enc = do_des [1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28]++des_dec :: Block -> Key -> Block+des_dec = do_des [28,27,25,23,21,19,17,15,14,12,10,8,6,4,2,1]++do_des :: [Rotation] -> Block -> Key -> Block+do_des rots (Block m) k = Block $ des_work rots (takeDrop 32 mb) kb+ where kb = key_transformation $ bitify k+       mb = initial_permutation $ bitify m++des_work :: [Rotation] -> (Bits32, Bits32) -> Bits56 -> Word64+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 -> Block -> Block+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 -> Block -> Block+decrypt = flip des_dec
+ Crypto/Cipher/DES/Serialization.hs view
@@ -0,0 +1,71 @@+-- |+-- Module      : Crypto.Cipher.DES.Serialization+-- License     : BSD-style+-- Maintainer  : Vincent Hanquez <vincent@snarc.org>+-- Stability   : stable+-- Portability : good+--+-- basic routine to convert between W64 and bytestring for DES.+--+{-# LANGUAGE CPP #-}+module Crypto.Cipher.DES.Serialization+    ( toW64+    , toBS+    , blockify+    , unblockify+    ) where++import Data.Word (Word64)+import qualified Data.ByteString as B+import Crypto.Cipher.DES.Primitive (Block(..))++#ifdef ARCH_IS_LITTLE_ENDIAN+import Data.Byteable (withBytePtr)+import qualified Data.ByteString.Internal as B (inlinePerformIO, unsafeCreate)+import Foreign.Storable+import Foreign.Ptr (castPtr, plusPtr, Ptr)+#else+import Data.Bits (shiftL, shiftR, (.|.))+#endif++#ifdef ARCH_IS_LITTLE_ENDIAN+-- | convert a 8 byte bytestring to a little endian word64+toW64 :: B.ByteString -> Block+toW64 b = Block $ B.inlinePerformIO $ withBytePtr b $ \ptr -> peek (castPtr ptr)++-- | convert a word64 to a bytestring in little endian format+toBS :: Block -> B.ByteString+toBS (Block w) = B.unsafeCreate 8 $ \ptr -> poke (castPtr ptr) w++-- | Create a strict bytestring out of DES blocks+unblockify :: [Block] -> B.ByteString+unblockify blocks = B.unsafeCreate (nbBlocks * 8) $ \initPtr -> pokeTo (castPtr initPtr) blocks+  where nbBlocks = length blocks+        pokeTo :: Ptr Word64 -> [Block] -> IO ()+        pokeTo _   []     = return ()+        pokeTo ptr (Block x:xs) = poke ptr x >> pokeTo (ptr `plusPtr` 8) xs++#else+-- | convert a 8 byte bytestring to a little endian word64+toW64 :: B.ByteString -> Block+toW64 b = Block $ case B.unpack b of+            [a,b,c,d,e,f,g,h] -> shl h 0  .|. shl g 8 .|. shl f 16 .|. shl e 24 .|.+                                 shl d 32 .|. shl c 40 .|. shl b 48 .|. shl a 56+            _                 -> 0+  where shl w n = fromIntegral w `shiftL` n++-- | convert a word64 to a bytestring in little endian format+toBS :: Block -> B.ByteString+toBS (Block w) = B.pack $ map (shr w) [56,48,40,32,24,16,8,0]+  where shr w n = fromIntegral (w `shiftR` n)++-- | Create a strict bytestring out of DES blocks+unblockify :: [Block] -> B.ByteString+unblockify = B.concat . map toBS+#endif++-- | create DES blocks from a strict bytestring+blockify :: B.ByteString -> [Block]+blockify s | B.null s  = []+           | otherwise = let (s1,s2) = B.splitAt 8 s+                          in toW64 s1:blockify s2
+ Crypto/Cipher/TripleDES.hs view
@@ -0,0 +1,95 @@+-- |+-- Module      : Crypto.Cipher.TripleDES+-- License     : BSD-style+-- Stability   : experimental+-- Portability : ???++module Crypto.Cipher.TripleDES+    ( DES_EEE3+    , DES_EDE3+    , DES_EEE2+    , DES_EDE2+    ) where++import Data.Word+import Data.Byteable+import qualified Data.ByteString as B++import Crypto.Cipher.Types+import Crypto.Cipher.DES.Primitive+import Crypto.Cipher.DES.Serialization++-- | 3DES with 3 different keys used all in the same direction+data DES_EEE3 = DES_EEE3 Word64 Word64 Word64+    deriving (Eq)++-- | 3DES with 3 different keys used in alternative direction+data DES_EDE3 = DES_EDE3 Word64 Word64 Word64 +    deriving (Eq)++-- | 3DES where the first and third keys are equal, used in the same direction+data DES_EEE2 = DES_EEE2 Word64 Word64 -- key1 and key3 are equal+    deriving (Eq)++-- | 3DES where the first and third keys are equal, used in alternative direction+data DES_EDE2 = DES_EDE2 Word64 Word64 -- key1 and key3 are equal+    deriving (Eq)++instance Cipher DES_EEE3 where+    cipherName    _ = "3DES_EEE"+    cipherKeySize _ = KeySizeFixed 24+    cipherInit k    = init3DES DES_EEE3 k++instance Cipher DES_EDE3 where+    cipherName    _ = "3DES_EDE"+    cipherKeySize _ = KeySizeFixed 24+    cipherInit k    = init3DES DES_EDE3 k++instance Cipher DES_EDE2 where+    cipherName    _ = "2DES_EDE"+    cipherKeySize _ = KeySizeFixed 16+    cipherInit k    = init2DES DES_EDE2 k++instance Cipher DES_EEE2 where+    cipherName    _ = "2DES_EEE"+    cipherKeySize _ = KeySizeFixed 16+    cipherInit k    = init2DES DES_EEE2 k++instance BlockCipher DES_EEE3 where+    blockSize _ = 8+    ecbEncrypt (DES_EEE3 k1 k2 k3) = unblockify . map (encrypt k1 . encrypt k2 . encrypt k3) . blockify+    ecbDecrypt (DES_EEE3 k1 k2 k3) = unblockify . map (decrypt k3 . decrypt k2 . decrypt k1) . blockify++instance BlockCipher DES_EDE3 where+    blockSize _ = 8+    ecbEncrypt (DES_EDE3 k1 k2 k3) = unblockify . map (encrypt k1 . decrypt k2 . encrypt k3) . blockify+    ecbDecrypt (DES_EDE3 k1 k2 k3) = unblockify . map (decrypt k3 . encrypt k2 . decrypt k1) . blockify++instance BlockCipher DES_EEE2 where+    blockSize _ = 8+    ecbEncrypt (DES_EEE2 k1 k2) = unblockify . map (encrypt k1 . encrypt k2 . encrypt k1) . blockify+    ecbDecrypt (DES_EEE2 k1 k2) = unblockify . map (decrypt k1 . decrypt k2 . decrypt k1) . blockify++instance BlockCipher DES_EDE2 where+    blockSize _ = 8+    ecbEncrypt (DES_EDE2 k1 k2) = unblockify . map (encrypt k1 . decrypt k2 . encrypt k1) . blockify+    ecbDecrypt (DES_EDE2 k1 k2) = unblockify . map (decrypt k1 . encrypt k2 . decrypt k1) . blockify++init3DES :: Byteable b => (Word64 -> Word64 -> Word64 -> a) -> b -> a+init3DES constr k+    | len == 24 = constr k1 k2 k3+    | otherwise = error "3DES: not a valid key length (valid=24)"+  where len = byteableLength k+        (Block k1, Block k2, Block k3) =+            let (b1, k') = B.splitAt 8 (toBytes k)+                (b2, b3) = B.splitAt 8 k'+             in (toW64 b1, toW64 b2, toW64 b3)++init2DES :: Byteable b => (Word64 -> Word64 -> a) -> b -> a+init2DES constr k+    | len == 16 = constr k1 k2+    | otherwise = error "2DES: not a valid key length (valid=16)"+  where len = byteableLength k+        (Block k1, Block k2) =+            let (b1, b2) = B.splitAt 8 (toBytes k)+             in (toW64 b1, toW64 b2)
+ LICENSE view
@@ -0,0 +1,27 @@+Copyright (c) 2013 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.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Tests/Tests.hs view
@@ -0,0 +1,61 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ViewPatterns #-}+module Main where++import Control.Applicative+import Control.Monad++import Test.Framework (Test, defaultMain, testGroup)+import Test.Framework.Providers.QuickCheck2 (testProperty)++import Test.QuickCheck+import Test.QuickCheck.Test++import Data.Byteable+import qualified Data.ByteString as B+import qualified Crypto.Cipher.DES as DES+import Crypto.Cipher.Types+import Crypto.Cipher.Tests++vectors_ecb = -- key plaintext ciphertext+    [ KAT_ECB "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x8C\xA6\x4D\xE9\xC1\xB1\x23\xA7"+    , KAT_ECB "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" "\x73\x59\xB2\x16\x3E\x4E\xDC\x58"+    , KAT_ECB "\x30\x00\x00\x00\x00\x00\x00\x00" "\x10\x00\x00\x00\x00\x00\x00\x01" "\x95\x8E\x6E\x62\x7A\x05\x55\x7B"+    , KAT_ECB "\x11\x11\x11\x11\x11\x11\x11\x11" "\x11\x11\x11\x11\x11\x11\x11\x11" "\xF4\x03\x79\xAB\x9E\x0E\xC5\x33"+    , KAT_ECB "\x01\x23\x45\x67\x89\xAB\xCD\xEF" "\x11\x11\x11\x11\x11\x11\x11\x11" "\x17\x66\x8D\xFC\x72\x92\x53\x2D"+    , KAT_ECB "\x11\x11\x11\x11\x11\x11\x11\x11" "\x01\x23\x45\x67\x89\xAB\xCD\xEF" "\x8A\x5A\xE1\xF8\x1A\xB8\xF2\xDD"+    , KAT_ECB "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x8C\xA6\x4D\xE9\xC1\xB1\x23\xA7"+    , KAT_ECB "\xFE\xDC\xBA\x98\x76\x54\x32\x10" "\x01\x23\x45\x67\x89\xAB\xCD\xEF" "\xED\x39\xD9\x50\xFA\x74\xBC\xC4"+    , KAT_ECB "\x7C\xA1\x10\x45\x4A\x1A\x6E\x57" "\x01\xA1\xD6\xD0\x39\x77\x67\x42" "\x69\x0F\x5B\x0D\x9A\x26\x93\x9B"+    , KAT_ECB "\x01\x31\xD9\x61\x9D\xC1\x37\x6E" "\x5C\xD5\x4C\xA8\x3D\xEF\x57\xDA" "\x7A\x38\x9D\x10\x35\x4B\xD2\x71"+    , KAT_ECB "\x07\xA1\x13\x3E\x4A\x0B\x26\x86" "\x02\x48\xD4\x38\x06\xF6\x71\x72" "\x86\x8E\xBB\x51\xCA\xB4\x59\x9A"+    , KAT_ECB "\x38\x49\x67\x4C\x26\x02\x31\x9E" "\x51\x45\x4B\x58\x2D\xDF\x44\x0A" "\x71\x78\x87\x6E\x01\xF1\x9B\x2A"+    , KAT_ECB "\x04\xB9\x15\xBA\x43\xFE\xB5\xB6" "\x42\xFD\x44\x30\x59\x57\x7F\xA2" "\xAF\x37\xFB\x42\x1F\x8C\x40\x95"+    , KAT_ECB "\x01\x13\xB9\x70\xFD\x34\xF2\xCE" "\x05\x9B\x5E\x08\x51\xCF\x14\x3A" "\x86\xA5\x60\xF1\x0E\xC6\xD8\x5B"+    , KAT_ECB "\x01\x70\xF1\x75\x46\x8F\xB5\xE6" "\x07\x56\xD8\xE0\x77\x47\x61\xD2" "\x0C\xD3\xDA\x02\x00\x21\xDC\x09"+    , KAT_ECB "\x43\x29\x7F\xAD\x38\xE3\x73\xFE" "\x76\x25\x14\xB8\x29\xBF\x48\x6A" "\xEA\x67\x6B\x2C\xB7\xDB\x2B\x7A"+    , KAT_ECB "\x07\xA7\x13\x70\x45\xDA\x2A\x16" "\x3B\xDD\x11\x90\x49\x37\x28\x02" "\xDF\xD6\x4A\x81\x5C\xAF\x1A\x0F"+    , KAT_ECB "\x04\x68\x91\x04\xC2\xFD\x3B\x2F" "\x26\x95\x5F\x68\x35\xAF\x60\x9A" "\x5C\x51\x3C\x9C\x48\x86\xC0\x88"+    , KAT_ECB "\x37\xD0\x6B\xB5\x16\xCB\x75\x46" "\x16\x4D\x5E\x40\x4F\x27\x52\x32" "\x0A\x2A\xEE\xAE\x3F\xF4\xAB\x77"+    , KAT_ECB "\x1F\x08\x26\x0D\x1A\xC2\x46\x5E" "\x6B\x05\x6E\x18\x75\x9F\x5C\xCA" "\xEF\x1B\xF0\x3E\x5D\xFA\x57\x5A"+    , KAT_ECB "\x58\x40\x23\x64\x1A\xBA\x61\x76" "\x00\x4B\xD6\xEF\x09\x17\x60\x62" "\x88\xBF\x0D\xB6\xD7\x0D\xEE\x56"+    , KAT_ECB "\x02\x58\x16\x16\x46\x29\xB0\x07" "\x48\x0D\x39\x00\x6E\xE7\x62\xF2" "\xA1\xF9\x91\x55\x41\x02\x0B\x56"+    , KAT_ECB "\x49\x79\x3E\xBC\x79\xB3\x25\x8F" "\x43\x75\x40\xC8\x69\x8F\x3C\xFA" "\x6F\xBF\x1C\xAF\xCF\xFD\x05\x56"+    , KAT_ECB "\x4F\xB0\x5E\x15\x15\xAB\x73\xA7" "\x07\x2D\x43\xA0\x77\x07\x52\x92" "\x2F\x22\xE4\x9B\xAB\x7C\xA1\xAC"+    , KAT_ECB "\x49\xE9\x5D\x6D\x4C\xA2\x29\xBF" "\x02\xFE\x55\x77\x81\x17\xF1\x2A" "\x5A\x6B\x61\x2C\xC2\x6C\xCE\x4A"+    , KAT_ECB "\x01\x83\x10\xDC\x40\x9B\x26\xD6" "\x1D\x9D\x5C\x50\x18\xF7\x28\xC2" "\x5F\x4C\x03\x8E\xD1\x2B\x2E\x41"+    , KAT_ECB "\x1C\x58\x7F\x1C\x13\x92\x4F\xEF" "\x30\x55\x32\x28\x6D\x6F\x29\x5A" "\x63\xFA\xC0\xD0\x34\xD9\xF7\x93"+    , KAT_ECB "\x01\x01\x01\x01\x01\x01\x01\x01" "\x01\x23\x45\x67\x89\xAB\xCD\xEF" "\x61\x7B\x3A\x0C\xE8\xF0\x71\x00"+    , KAT_ECB "\x1F\x1F\x1F\x1F\x0E\x0E\x0E\x0E" "\x01\x23\x45\x67\x89\xAB\xCD\xEF" "\xDB\x95\x86\x05\xF8\xC8\xC6\x06"+    , KAT_ECB "\xE0\xFE\xE0\xFE\xF1\xFE\xF1\xFE" "\x01\x23\x45\x67\x89\xAB\xCD\xEF" "\xED\xBF\xD1\xC6\x6C\x29\xCC\xC7"+    , KAT_ECB "\x00\x00\x00\x00\x00\x00\x00\x00" "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" "\x35\x55\x50\xB2\x15\x0E\x24\x51"+    , KAT_ECB "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" "\x00\x00\x00\x00\x00\x00\x00\x00" "\xCA\xAA\xAF\x4D\xEA\xF1\xDB\xAE"+    , KAT_ECB "\x01\x23\x45\x67\x89\xAB\xCD\xEF" "\x00\x00\x00\x00\x00\x00\x00\x00" "\xD5\xD4\x4F\xF7\x20\x68\x3D\x0D"+    , KAT_ECB "\xFE\xDC\xBA\x98\x76\x54\x32\x10" "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" "\x2A\x2B\xB0\x08\xDF\x97\xC2\xF2"+    ]++kats = defaultKATs { kat_ECB = vectors_ecb }++main = defaultMain+    [ testBlockCipher kats (undefined :: DES.DES)+    ]
+ cipher-des.cabal view
@@ -0,0 +1,59 @@+Name:                cipher-des+Version:             0.0.1+Description:         DES and 3DES primitives+License:             BSD3+License-file:        LICENSE+Copyright:           Vincent Hanquez <vincent@snarc.org>+Author:              Vincent Hanquez <vincent@snarc.org>+Maintainer:          Vincent Hanquez <vincent@snarc.org>+Synopsis:            DES and 3DES primitives+Category:            Cryptography+Build-Type:          Simple+Homepage:            http://github.com/vincenthz/hs-crypto-cipher+Cabal-Version:       >=1.8++Library+  Build-Depends:     base >= 4 && < 5+                   , bytestring+                   , byteable+                   , crypto-cipher-types >= 0.0.3+                   , securemem >= 0.1.2+                   , cereal+  Exposed-modules:   Crypto.Cipher.DES+                   , Crypto.Cipher.TripleDES+  Other-modules:     Crypto.Cipher.DES.Primitive+                   , Crypto.Cipher.DES.Serialization+  ghc-options:       -Wall -optc-O3 -fno-cse -fwarn-tabs+  if (arch(i386) || arch(x86_64))+    CPP-options: -DARCH_IS_LITTLE_ENDIAN++Test-Suite test-cipher-des+  type:              exitcode-stdio-1.0+  hs-source-dirs:    Tests+  Main-Is:           Tests.hs+  Build-depends:     base >= 4 && < 5+                   , cipher-des+                   , crypto-cipher-types+                   , crypto-cipher-tests+                   , bytestring+                   , byteable+                   , QuickCheck >= 2+                   , test-framework >= 0.3.3+                   , test-framework-quickcheck2 >= 0.2.9++Benchmark bench-cipher-des+  hs-source-dirs:    Benchmarks+  Main-Is:           Benchmarks.hs+  type:              exitcode-stdio-1.0+  Build-depends:     base >= 4 && < 5+                   , bytestring+                   , cipher-des+                   , crypto-cipher-types+                   , crypto-cipher-benchmarks+                   , criterion+                   , mtl++source-repository head+  type:     git+  location: git://github.com/vincenthz/hs-crypto-cipher+  subdir:   cipher-des