-- BlowfishAux.hs (C) 2002 HardCore SoftWare, Doug Hoyte
--
-- Doug has kindly agreed to release this under BSD.
--
-- Haskell implementation of Bruce Schneier's blowfish encryption algorithm.
-- This implementation uses 16 rounds and produces the same ciphertext as
-- the OpenBSD and Paul Kocher 16-round implementations.
--
-- The function bfMakeKey should be passed a list of Chars. These represent
-- the key. It will return a datatype called "BF", which contains the
-- initialized key information.
--
-- The function bfEnc is passed a BF datatype representing the key and a
-- list of 2 Word32s (the plaintext). It returns a list of 2 Word32s
-- (the ciphertext).
--
-- The function bfDec is passed a BF datatype representing the key and a list
-- of 2 Word32s (the ciphertext) and a BF datatype representing the key. It
-- returns a list of 2 Word32s (the plaintext).

module Codec.Encryption.BlowfishAux
   (bfMakeKey,
    bfEnc,
    bfDec) where

import Data.Array
import Data.Bits
import Data.Word
import Data.Char

type Pbox = Array Word32 Word32
type Sbox = Array Word32 Word32

data BF = BF Pbox Sbox Sbox Sbox Sbox



bfEnc :: BF -> [Word32] -> [Word32]
bfEnc :: BF -> [Word32] -> [Word32]
bfEnc BF
a [Word32]
b = BF -> [Word32] -> Word32 -> [Word32]
aux BF
a [Word32]
b Word32
0
  where
    aux :: BF -> [Word32] -> Word32 -> [Word32]
    aux :: BF -> [Word32] -> Word32 -> [Word32]
aux bs :: BF
bs@(BF Pbox
p Pbox
s0 Pbox
s1 Pbox
s2 Pbox
s3) (Word32
l:Word32
r:[]) Word32
16 = (Word32
r forall a. Bits a => a -> a -> a
`xor` Pbox
pforall i e. Ix i => Array i e -> i -> e
!Word32
17)forall a. a -> [a] -> [a]
:(Word32
l forall a. Bits a => a -> a -> a
`xor` Pbox
pforall i e. Ix i => Array i e -> i -> e
!Word32
16)forall a. a -> [a] -> [a]
:[]
    aux bs :: BF
bs@(BF Pbox
p Pbox
s0 Pbox
s1 Pbox
s2 Pbox
s3) (Word32
l:Word32
r:[]) Word32
i = BF -> [Word32] -> Word32 -> [Word32]
aux BF
bs (Word32
newrforall a. a -> [a] -> [a]
:Word32
newlforall a. a -> [a] -> [a]
:[]) (Word32
iforall a. Num a => a -> a -> a
+Word32
1)
      where newl :: Word32
newl = Word32
l forall a. Bits a => a -> a -> a
`xor` (Pbox
p forall i e. Ix i => Array i e -> i -> e
! Word32
i)
            newr :: Word32
newr = Word32
r forall a. Bits a => a -> a -> a
`xor` (Word32 -> Word32
f Word32
newl)
            f   :: Word32 -> Word32
            f :: Word32 -> Word32
f Word32
t  = ((Pbox
s0forall i e. Ix i => Array i e -> i -> e
!Word32
a forall a. Num a => a -> a -> a
+ Pbox
s1forall i e. Ix i => Array i e -> i -> e
!Word32
b) forall a. Bits a => a -> a -> a
`xor` (Pbox
s2 forall i e. Ix i => Array i e -> i -> e
! Word32
c)) forall a. Num a => a -> a -> a
+ (Pbox
s3 forall i e. Ix i => Array i e -> i -> e
! Word32
d)
              where a :: Word32
a =  (Word32
t forall a. Bits a => a -> Int -> a
`shiftR` Int
24)
                    b :: Word32
b =  ((Word32
t forall a. Bits a => a -> Int -> a
`shiftL` Int
8) forall a. Bits a => a -> Int -> a
`shiftR` Int
24)
                    c :: Word32
c =  ((Word32
t forall a. Bits a => a -> Int -> a
`shiftL` Int
16) forall a. Bits a => a -> Int -> a
`shiftR` Int
24)
                    d :: Word32
d =  ((Word32
t forall a. Bits a => a -> Int -> a
`shiftL` Int
24) forall a. Bits a => a -> Int -> a
`shiftR` Int
24)


bfDec :: BF -> [Word32] -> [Word32]
bfDec :: BF -> [Word32] -> [Word32]
bfDec (BF Pbox
p Pbox
s0 Pbox
s1 Pbox
s2 Pbox
s3) [Word32]
a = BF -> [Word32] -> [Word32]
bfEnc (Pbox -> Pbox -> Pbox -> Pbox -> Pbox -> BF
BF (Pbox -> Pbox
revP Pbox
p) Pbox
s0 Pbox
s1 Pbox
s2 Pbox
s3) [Word32]
a
    where revP  :: Pbox -> Pbox
          revP :: Pbox -> Pbox
revP Pbox
x = Pbox
xforall i e. Ix i => Array i e -> [(i, e)] -> Array i e
//[(Word32
i, Pbox
x forall i e. Ix i => Array i e -> i -> e
! (Word32
17forall a. Num a => a -> a -> a
-Word32
i)) | Word32
i <- [Word32
0..Word32
17]]


bfMakeKey   :: [Char] -> BF
bfMakeKey :: [Char] -> BF
bfMakeKey [] = [Word32] -> BF -> Word32 -> BF
procKey [Word32
0,Word32
0] (Pbox -> Pbox -> Pbox -> Pbox -> Pbox -> BF
BF Pbox
iPbox Pbox
iSbox0 Pbox
iSbox1 Pbox
iSbox2 Pbox
iSbox3) Word32
0
bfMakeKey [Char]
k  = [Word32] -> BF -> Word32 -> BF
procKey [Word32
0,Word32
0] (Pbox -> Pbox -> Pbox -> Pbox -> Pbox -> BF
BF ([Char] -> Pbox
string2Pbox [Char]
k) Pbox
iSbox0 Pbox
iSbox1 Pbox
iSbox2 Pbox
iSbox3) Word32
0


string2Pbox  :: [Char] -> Pbox
string2Pbox :: [Char] -> Pbox
string2Pbox [Char]
k = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (Word32
0,Word32
17) [(forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i,[Word32]
xtextforall a. [a] -> Int -> a
!!Int
i) | Int
i <- [Int
0..Int
17]]
  where xtext :: [Word32]
xtext = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (forall a. Bits a => a -> a -> a
xor)
                        (forall {a}. Bits a => [a] -> [a]
compress4 (forall {a}. Bits a => [a] -> Int -> [a]
doShift (forall {a}. [a] -> Int -> [a]
makeTo72 (forall {a} {a}. (Num a, Enum a) => [a] -> [a]
charsToWord32s [Char]
k) Int
0) Int
0))
                        [Pbox
iPbox forall i e. Ix i => Array i e -> i -> e
! (forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
i) | Integer
i <- [Integer
0..Integer
17]]
        charsToWord32s :: [a] -> [a]
charsToWord32s []     = []
        charsToWord32s (a
k:[a]
ks) = (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. Enum a => a -> Int
fromEnum a
k) forall a. a -> [a] -> [a]
: [a] -> [a]
charsToWord32s [a]
ks
        makeTo72 :: [a] -> Int -> [a]
makeTo72 [a]
k Int
72 = []
        makeTo72 [a]
k  Int
i = [a]
kforall a. [a] -> Int -> a
!!(Int
i forall a. Integral a => a -> a -> a
`mod` (forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
k)) forall a. a -> [a] -> [a]
: [a] -> Int -> [a]
makeTo72 [a]
k (Int
iforall a. Num a => a -> a -> a
+Int
1)
        doShift :: [a] -> Int -> [a]
doShift [] Int
i     = []
        doShift (a
w:[a]
ws) Int
i = a
w forall a. Bits a => a -> Int -> a
`shiftL` (Int
8forall a. Num a => a -> a -> a
*(Int
3 forall a. Num a => a -> a -> a
- (Int
i forall a. Integral a => a -> a -> a
`mod` Int
4))) forall a. a -> [a] -> [a]
: [a] -> Int -> [a]
doShift [a]
ws (Int
iforall a. Num a => a -> a -> a
+Int
1)
        compress4 :: [a] -> [a]
compress4 []            = []
        compress4 (a
a:a
b:a
c:a
d:[a]
etc) = (a
a forall a. Bits a => a -> a -> a
.|. a
b forall a. Bits a => a -> a -> a
.|. a
c forall a. Bits a => a -> a -> a
.|. a
d) forall a. a -> [a] -> [a]
: [a] -> [a]
compress4 [a]
etc


procKey :: [Word32] -> BF -> Word32 -> BF
procKey :: [Word32] -> BF -> Word32 -> BF
procKey (Word32
l:Word32
r:[]) tpbf :: BF
tpbf@(BF Pbox
p Pbox
s0 Pbox
s1 Pbox
s2 Pbox
s3) Word32
1042 = BF
tpbf
procKey (Word32
l:Word32
r:[]) tpbf :: BF
tpbf@(BF Pbox
p Pbox
s0 Pbox
s1 Pbox
s2 Pbox
s3)    Word32
i = [Word32] -> BF -> Word32 -> BF
procKey [Word32
nl,Word32
nr] (Word32 -> BF
newbf Word32
i) (Word32
iforall a. Num a => a -> a -> a
+Word32
2)
  where [Word32
nl,Word32
nr] = BF -> [Word32] -> [Word32]
bfEnc BF
tpbf [Word32
l,Word32
r]
        newbf :: Word32 -> BF
newbf Word32
x | Word32
x forall a. Ord a => a -> a -> Bool
<   Word32
18 = (Pbox -> Pbox -> Pbox -> Pbox -> Pbox -> BF
BF (Pbox
pforall i e. Ix i => Array i e -> [(i, e)] -> Array i e
//[(Word32
x,Word32
nl),(Word32
xforall a. Num a => a -> a -> a
+Word32
1,Word32
nr)]) Pbox
s0 Pbox
s1 Pbox
s2 Pbox
s3)
                | Word32
x forall a. Ord a => a -> a -> Bool
<  Word32
274 = (Pbox -> Pbox -> Pbox -> Pbox -> Pbox -> BF
BF Pbox
p (Pbox
s0forall i e. Ix i => Array i e -> [(i, e)] -> Array i e
//[(Word32
xforall a. Num a => a -> a -> a
-Word32
18,Word32
nl),(Word32
xforall a. Num a => a -> a -> a
-Word32
17,Word32
nr)]) Pbox
s1 Pbox
s2 Pbox
s3)
                | Word32
x forall a. Ord a => a -> a -> Bool
<  Word32
530 = (Pbox -> Pbox -> Pbox -> Pbox -> Pbox -> BF
BF Pbox
p Pbox
s0 (Pbox
s1forall i e. Ix i => Array i e -> [(i, e)] -> Array i e
//[(Word32
xforall a. Num a => a -> a -> a
-Word32
274,Word32
nl),(Word32
xforall a. Num a => a -> a -> a
-Word32
273,Word32
nr)]) Pbox
s2 Pbox
s3)
                | Word32
x forall a. Ord a => a -> a -> Bool
<  Word32
786 = (Pbox -> Pbox -> Pbox -> Pbox -> Pbox -> BF
BF Pbox
p Pbox
s0 Pbox
s1 (Pbox
s2forall i e. Ix i => Array i e -> [(i, e)] -> Array i e
//[(Word32
xforall a. Num a => a -> a -> a
-Word32
530,Word32
nl),(Word32
xforall a. Num a => a -> a -> a
-Word32
529,Word32
nr)]) Pbox
s3)
                | Word32
x forall a. Ord a => a -> a -> Bool
< Word32
1042 = (Pbox -> Pbox -> Pbox -> Pbox -> Pbox -> BF
BF Pbox
p Pbox
s0 Pbox
s1 Pbox
s2 (Pbox
s3forall i e. Ix i => Array i e -> [(i, e)] -> Array i e
//[(Word32
xforall a. Num a => a -> a -> a
-Word32
786,Word32
nl),(Word32
xforall a. Num a => a -> a -> a
-Word32
785,Word32
nr)]))



---------- INITIAL S AND P BOXES ARE THE HEXADECIMAL DIGITS OF PI ------------

iPbox :: Pbox
iPbox :: Pbox
iPbox  = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (Word32
0,Word32
17) (forall a b. [a] -> [b] -> [(a, b)]
zip [Word32
0..Word32
17]
 [Word32
0x243f6a88, Word32
0x85a308d3, Word32
0x13198a2e, Word32
0x03707344, Word32
0xa4093822, Word32
0x299f31d0,
  Word32
0x082efa98, Word32
0xec4e6c89, Word32
0x452821e6, Word32
0x38d01377, Word32
0xbe5466cf, Word32
0x34e90c6c,
  Word32
0xc0ac29b7, Word32
0xc97c50dd, Word32
0x3f84d5b5, Word32
0xb5470917, Word32
0x9216d5d9, Word32
0x8979fb1b])

iSbox0 :: Sbox
iSbox0 :: Pbox
iSbox0  = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (Word32
0,Word32
255) (forall a b. [a] -> [b] -> [(a, b)]
zip [Word32
0..Word32
255]
 [Word32
0xd1310ba6, Word32
0x98dfb5ac, Word32
0x2ffd72db, Word32
0xd01adfb7, Word32
0xb8e1afed, Word32
0x6a267e96,
  Word32
0xba7c9045, Word32
0xf12c7f99, Word32
0x24a19947, Word32
0xb3916cf7, Word32
0x0801f2e2, Word32
0x858efc16,
  Word32
0x636920d8, Word32
0x71574e69, Word32
0xa458fea3, Word32
0xf4933d7e, Word32
0x0d95748f, Word32
0x728eb658,
  Word32
0x718bcd58, Word32
0x82154aee, Word32
0x7b54a41d, Word32
0xc25a59b5, Word32
0x9c30d539, Word32
0x2af26013,
  Word32
0xc5d1b023, Word32
0x286085f0, Word32
0xca417918, Word32
0xb8db38ef, Word32
0x8e79dcb0, Word32
0x603a180e,
  Word32
0x6c9e0e8b, Word32
0xb01e8a3e, Word32
0xd71577c1, Word32
0xbd314b27, Word32
0x78af2fda, Word32
0x55605c60,
  Word32
0xe65525f3, Word32
0xaa55ab94, Word32
0x57489862, Word32
0x63e81440, Word32
0x55ca396a, Word32
0x2aab10b6,
  Word32
0xb4cc5c34, Word32
0x1141e8ce, Word32
0xa15486af, Word32
0x7c72e993, Word32
0xb3ee1411, Word32
0x636fbc2a,
  Word32
0x2ba9c55d, Word32
0x741831f6, Word32
0xce5c3e16, Word32
0x9b87931e, Word32
0xafd6ba33, Word32
0x6c24cf5c,
  Word32
0x7a325381, Word32
0x28958677, Word32
0x3b8f4898, Word32
0x6b4bb9af, Word32
0xc4bfe81b, Word32
0x66282193,
  Word32
0x61d809cc, Word32
0xfb21a991, Word32
0x487cac60, Word32
0x5dec8032, Word32
0xef845d5d, Word32
0xe98575b1,
  Word32
0xdc262302, Word32
0xeb651b88, Word32
0x23893e81, Word32
0xd396acc5, Word32
0x0f6d6ff3, Word32
0x83f44239,
  Word32
0x2e0b4482, Word32
0xa4842004, Word32
0x69c8f04a, Word32
0x9e1f9b5e, Word32
0x21c66842, Word32
0xf6e96c9a,
  Word32
0x670c9c61, Word32
0xabd388f0, Word32
0x6a51a0d2, Word32
0xd8542f68, Word32
0x960fa728, Word32
0xab5133a3,
  Word32
0x6eef0b6c, Word32
0x137a3be4, Word32
0xba3bf050, Word32
0x7efb2a98, Word32
0xa1f1651d, Word32
0x39af0176,
  Word32
0x66ca593e, Word32
0x82430e88, Word32
0x8cee8619, Word32
0x456f9fb4, Word32
0x7d84a5c3, Word32
0x3b8b5ebe,
  Word32
0xe06f75d8, Word32
0x85c12073, Word32
0x401a449f, Word32
0x56c16aa6, Word32
0x4ed3aa62, Word32
0x363f7706,
  Word32
0x1bfedf72, Word32
0x429b023d, Word32
0x37d0d724, Word32
0xd00a1248, Word32
0xdb0fead3, Word32
0x49f1c09b,
  Word32
0x075372c9, Word32
0x80991b7b, Word32
0x25d479d8, Word32
0xf6e8def7, Word32
0xe3fe501a, Word32
0xb6794c3b,
  Word32
0x976ce0bd, Word32
0x04c006ba, Word32
0xc1a94fb6, Word32
0x409f60c4, Word32
0x5e5c9ec2, Word32
0x196a2463,
  Word32
0x68fb6faf, Word32
0x3e6c53b5, Word32
0x1339b2eb, Word32
0x3b52ec6f, Word32
0x6dfc511f, Word32
0x9b30952c,
  Word32
0xcc814544, Word32
0xaf5ebd09, Word32
0xbee3d004, Word32
0xde334afd, Word32
0x660f2807, Word32
0x192e4bb3,
  Word32
0xc0cba857, Word32
0x45c8740f, Word32
0xd20b5f39, Word32
0xb9d3fbdb, Word32
0x5579c0bd, Word32
0x1a60320a,
  Word32
0xd6a100c6, Word32
0x402c7279, Word32
0x679f25fe, Word32
0xfb1fa3cc, Word32
0x8ea5e9f8, Word32
0xdb3222f8,
  Word32
0x3c7516df, Word32
0xfd616b15, Word32
0x2f501ec8, Word32
0xad0552ab, Word32
0x323db5fa, Word32
0xfd238760,
  Word32
0x53317b48, Word32
0x3e00df82, Word32
0x9e5c57bb, Word32
0xca6f8ca0, Word32
0x1a87562e, Word32
0xdf1769db,
  Word32
0xd542a8f6, Word32
0x287effc3, Word32
0xac6732c6, Word32
0x8c4f5573, Word32
0x695b27b0, Word32
0xbbca58c8,
  Word32
0xe1ffa35d, Word32
0xb8f011a0, Word32
0x10fa3d98, Word32
0xfd2183b8, Word32
0x4afcb56c, Word32
0x2dd1d35b,
  Word32
0x9a53e479, Word32
0xb6f84565, Word32
0xd28e49bc, Word32
0x4bfb9790, Word32
0xe1ddf2da, Word32
0xa4cb7e33,
  Word32
0x62fb1341, Word32
0xcee4c6e8, Word32
0xef20cada, Word32
0x36774c01, Word32
0xd07e9efe, Word32
0x2bf11fb4,
  Word32
0x95dbda4d, Word32
0xae909198, Word32
0xeaad8e71, Word32
0x6b93d5a0, Word32
0xd08ed1d0, Word32
0xafc725e0,
  Word32
0x8e3c5b2f, Word32
0x8e7594b7, Word32
0x8ff6e2fb, Word32
0xf2122b64, Word32
0x8888b812, Word32
0x900df01c,
  Word32
0x4fad5ea0, Word32
0x688fc31c, Word32
0xd1cff191, Word32
0xb3a8c1ad, Word32
0x2f2f2218, Word32
0xbe0e1777,
  Word32
0xea752dfe, Word32
0x8b021fa1, Word32
0xe5a0cc0f, Word32
0xb56f74e8, Word32
0x18acf3d6, Word32
0xce89e299,
  Word32
0xb4a84fe0, Word32
0xfd13e0b7, Word32
0x7cc43b81, Word32
0xd2ada8d9, Word32
0x165fa266, Word32
0x80957705,
  Word32
0x93cc7314, Word32
0x211a1477, Word32
0xe6ad2065, Word32
0x77b5fa86, Word32
0xc75442f5, Word32
0xfb9d35cf,
  Word32
0xebcdaf0c, Word32
0x7b3e89a0, Word32
0xd6411bd3, Word32
0xae1e7e49, Word32
0x00250e2d, Word32
0x2071b35e,
  Word32
0x226800bb, Word32
0x57b8e0af, Word32
0x2464369b, Word32
0xf009b91e, Word32
0x5563911d, Word32
0x59dfa6aa,
  Word32
0x78c14389, Word32
0xd95a537f, Word32
0x207d5ba2, Word32
0x02e5b9c5, Word32
0x83260376, Word32
0x6295cfa9,
  Word32
0x11c81968, Word32
0x4e734a41, Word32
0xb3472dca, Word32
0x7b14a94a, Word32
0x1b510052, Word32
0x9a532915,
  Word32
0xd60f573f, Word32
0xbc9bc6e4, Word32
0x2b60a476, Word32
0x81e67400, Word32
0x08ba6fb5, Word32
0x571be91f,
  Word32
0xf296ec6b, Word32
0x2a0dd915, Word32
0xb6636521, Word32
0xe7b9f9b6, Word32
0xff34052e, Word32
0xc5855664,
  Word32
0x53b02d5d, Word32
0xa99f8fa1, Word32
0x08ba4799, Word32
0x6e85076a])
  
iSbox1 :: Sbox
iSbox1 :: Pbox
iSbox1  = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (Word32
0,Word32
255) (forall a b. [a] -> [b] -> [(a, b)]
zip [Word32
0..Word32
255]
 [Word32
0x4b7a70e9, Word32
0xb5b32944, Word32
0xdb75092e, Word32
0xc4192623, Word32
0xad6ea6b0, Word32
0x49a7df7d,
  Word32
0x9cee60b8, Word32
0x8fedb266, Word32
0xecaa8c71, Word32
0x699a17ff, Word32
0x5664526c, Word32
0xc2b19ee1,
  Word32
0x193602a5, Word32
0x75094c29, Word32
0xa0591340, Word32
0xe4183a3e, Word32
0x3f54989a, Word32
0x5b429d65,
  Word32
0x6b8fe4d6, Word32
0x99f73fd6, Word32
0xa1d29c07, Word32
0xefe830f5, Word32
0x4d2d38e6, Word32
0xf0255dc1,
  Word32
0x4cdd2086, Word32
0x8470eb26, Word32
0x6382e9c6, Word32
0x021ecc5e, Word32
0x09686b3f, Word32
0x3ebaefc9,
  Word32
0x3c971814, Word32
0x6b6a70a1, Word32
0x687f3584, Word32
0x52a0e286, Word32
0xb79c5305, Word32
0xaa500737,
  Word32
0x3e07841c, Word32
0x7fdeae5c, Word32
0x8e7d44ec, Word32
0x5716f2b8, Word32
0xb03ada37, Word32
0xf0500c0d,
  Word32
0xf01c1f04, Word32
0x0200b3ff, Word32
0xae0cf51a, Word32
0x3cb574b2, Word32
0x25837a58, Word32
0xdc0921bd,
  Word32
0xd19113f9, Word32
0x7ca92ff6, Word32
0x94324773, Word32
0x22f54701, Word32
0x3ae5e581, Word32
0x37c2dadc,
  Word32
0xc8b57634, Word32
0x9af3dda7, Word32
0xa9446146, Word32
0x0fd0030e, Word32
0xecc8c73e, Word32
0xa4751e41,
  Word32
0xe238cd99, Word32
0x3bea0e2f, Word32
0x3280bba1, Word32
0x183eb331, Word32
0x4e548b38, Word32
0x4f6db908,
  Word32
0x6f420d03, Word32
0xf60a04bf, Word32
0x2cb81290, Word32
0x24977c79, Word32
0x5679b072, Word32
0xbcaf89af,
  Word32
0xde9a771f, Word32
0xd9930810, Word32
0xb38bae12, Word32
0xdccf3f2e, Word32
0x5512721f, Word32
0x2e6b7124,
  Word32
0x501adde6, Word32
0x9f84cd87, Word32
0x7a584718, Word32
0x7408da17, Word32
0xbc9f9abc, Word32
0xe94b7d8c,
  Word32
0xec7aec3a, Word32
0xdb851dfa, Word32
0x63094366, Word32
0xc464c3d2, Word32
0xef1c1847, Word32
0x3215d908,
  Word32
0xdd433b37, Word32
0x24c2ba16, Word32
0x12a14d43, Word32
0x2a65c451, Word32
0x50940002, Word32
0x133ae4dd,
  Word32
0x71dff89e, Word32
0x10314e55, Word32
0x81ac77d6, Word32
0x5f11199b, Word32
0x043556f1, Word32
0xd7a3c76b,
  Word32
0x3c11183b, Word32
0x5924a509, Word32
0xf28fe6ed, Word32
0x97f1fbfa, Word32
0x9ebabf2c, Word32
0x1e153c6e,
  Word32
0x86e34570, Word32
0xeae96fb1, Word32
0x860e5e0a, Word32
0x5a3e2ab3, Word32
0x771fe71c, Word32
0x4e3d06fa,
  Word32
0x2965dcb9, Word32
0x99e71d0f, Word32
0x803e89d6, Word32
0x5266c825, Word32
0x2e4cc978, Word32
0x9c10b36a,
  Word32
0xc6150eba, Word32
0x94e2ea78, Word32
0xa5fc3c53, Word32
0x1e0a2df4, Word32
0xf2f74ea7, Word32
0x361d2b3d,
  Word32
0x1939260f, Word32
0x19c27960, Word32
0x5223a708, Word32
0xf71312b6, Word32
0xebadfe6e, Word32
0xeac31f66,
  Word32
0xe3bc4595, Word32
0xa67bc883, Word32
0xb17f37d1, Word32
0x018cff28, Word32
0xc332ddef, Word32
0xbe6c5aa5,
  Word32
0x65582185, Word32
0x68ab9802, Word32
0xeecea50f, Word32
0xdb2f953b, Word32
0x2aef7dad, Word32
0x5b6e2f84,
  Word32
0x1521b628, Word32
0x29076170, Word32
0xecdd4775, Word32
0x619f1510, Word32
0x13cca830, Word32
0xeb61bd96,
  Word32
0x0334fe1e, Word32
0xaa0363cf, Word32
0xb5735c90, Word32
0x4c70a239, Word32
0xd59e9e0b, Word32
0xcbaade14,
  Word32
0xeecc86bc, Word32
0x60622ca7, Word32
0x9cab5cab, Word32
0xb2f3846e, Word32
0x648b1eaf, Word32
0x19bdf0ca,
  Word32
0xa02369b9, Word32
0x655abb50, Word32
0x40685a32, Word32
0x3c2ab4b3, Word32
0x319ee9d5, Word32
0xc021b8f7,
  Word32
0x9b540b19, Word32
0x875fa099, Word32
0x95f7997e, Word32
0x623d7da8, Word32
0xf837889a, Word32
0x97e32d77,
  Word32
0x11ed935f, Word32
0x16681281, Word32
0x0e358829, Word32
0xc7e61fd6, Word32
0x96dedfa1, Word32
0x7858ba99,
  Word32
0x57f584a5, Word32
0x1b227263, Word32
0x9b83c3ff, Word32
0x1ac24696, Word32
0xcdb30aeb, Word32
0x532e3054,
  Word32
0x8fd948e4, Word32
0x6dbc3128, Word32
0x58ebf2ef, Word32
0x34c6ffea, Word32
0xfe28ed61, Word32
0xee7c3c73,
  Word32
0x5d4a14d9, Word32
0xe864b7e3, Word32
0x42105d14, Word32
0x203e13e0, Word32
0x45eee2b6, Word32
0xa3aaabea,
  Word32
0xdb6c4f15, Word32
0xfacb4fd0, Word32
0xc742f442, Word32
0xef6abbb5, Word32
0x654f3b1d, Word32
0x41cd2105,
  Word32
0xd81e799e, Word32
0x86854dc7, Word32
0xe44b476a, Word32
0x3d816250, Word32
0xcf62a1f2, Word32
0x5b8d2646,
  Word32
0xfc8883a0, Word32
0xc1c7b6a3, Word32
0x7f1524c3, Word32
0x69cb7492, Word32
0x47848a0b, Word32
0x5692b285,
  Word32
0x095bbf00, Word32
0xad19489d, Word32
0x1462b174, Word32
0x23820e00, Word32
0x58428d2a, Word32
0x0c55f5ea,
  Word32
0x1dadf43e, Word32
0x233f7061, Word32
0x3372f092, Word32
0x8d937e41, Word32
0xd65fecf1, Word32
0x6c223bdb,
  Word32
0x7cde3759, Word32
0xcbee7460, Word32
0x4085f2a7, Word32
0xce77326e, Word32
0xa6078084, Word32
0x19f8509e,
  Word32
0xe8efd855, Word32
0x61d99735, Word32
0xa969a7aa, Word32
0xc50c06c2, Word32
0x5a04abfc, Word32
0x800bcadc,
  Word32
0x9e447a2e, Word32
0xc3453484, Word32
0xfdd56705, Word32
0x0e1e9ec9, Word32
0xdb73dbd3, Word32
0x105588cd,
  Word32
0x675fda79, Word32
0xe3674340, Word32
0xc5c43465, Word32
0x713e38d8, Word32
0x3d28f89e, Word32
0xf16dff20,
  Word32
0x153e21e7, Word32
0x8fb03d4a, Word32
0xe6e39f2b, Word32
0xdb83adf7])
  
iSbox2 :: Sbox
iSbox2 :: Pbox
iSbox2  = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (Word32
0,Word32
255) (forall a b. [a] -> [b] -> [(a, b)]
zip [Word32
0..Word32
255]
 [Word32
0xe93d5a68, Word32
0x948140f7, Word32
0xf64c261c, Word32
0x94692934, Word32
0x411520f7, Word32
0x7602d4f7,
  Word32
0xbcf46b2e, Word32
0xd4a20068, Word32
0xd4082471, Word32
0x3320f46a, Word32
0x43b7d4b7, Word32
0x500061af,
  Word32
0x1e39f62e, Word32
0x97244546, Word32
0x14214f74, Word32
0xbf8b8840, Word32
0x4d95fc1d, Word32
0x96b591af,
  Word32
0x70f4ddd3, Word32
0x66a02f45, Word32
0xbfbc09ec, Word32
0x03bd9785, Word32
0x7fac6dd0, Word32
0x31cb8504,
  Word32
0x96eb27b3, Word32
0x55fd3941, Word32
0xda2547e6, Word32
0xabca0a9a, Word32
0x28507825, Word32
0x530429f4,
  Word32
0x0a2c86da, Word32
0xe9b66dfb, Word32
0x68dc1462, Word32
0xd7486900, Word32
0x680ec0a4, Word32
0x27a18dee,
  Word32
0x4f3ffea2, Word32
0xe887ad8c, Word32
0xb58ce006, Word32
0x7af4d6b6, Word32
0xaace1e7c, Word32
0xd3375fec,
  Word32
0xce78a399, Word32
0x406b2a42, Word32
0x20fe9e35, Word32
0xd9f385b9, Word32
0xee39d7ab, Word32
0x3b124e8b,
  Word32
0x1dc9faf7, Word32
0x4b6d1856, Word32
0x26a36631, Word32
0xeae397b2, Word32
0x3a6efa74, Word32
0xdd5b4332,
  Word32
0x6841e7f7, Word32
0xca7820fb, Word32
0xfb0af54e, Word32
0xd8feb397, Word32
0x454056ac, Word32
0xba489527,
  Word32
0x55533a3a, Word32
0x20838d87, Word32
0xfe6ba9b7, Word32
0xd096954b, Word32
0x55a867bc, Word32
0xa1159a58,
  Word32
0xcca92963, Word32
0x99e1db33, Word32
0xa62a4a56, Word32
0x3f3125f9, Word32
0x5ef47e1c, Word32
0x9029317c,
  Word32
0xfdf8e802, Word32
0x04272f70, Word32
0x80bb155c, Word32
0x05282ce3, Word32
0x95c11548, Word32
0xe4c66d22,
  Word32
0x48c1133f, Word32
0xc70f86dc, Word32
0x07f9c9ee, Word32
0x41041f0f, Word32
0x404779a4, Word32
0x5d886e17,
  Word32
0x325f51eb, Word32
0xd59bc0d1, Word32
0xf2bcc18f, Word32
0x41113564, Word32
0x257b7834, Word32
0x602a9c60,
  Word32
0xdff8e8a3, Word32
0x1f636c1b, Word32
0x0e12b4c2, Word32
0x02e1329e, Word32
0xaf664fd1, Word32
0xcad18115,
  Word32
0x6b2395e0, Word32
0x333e92e1, Word32
0x3b240b62, Word32
0xeebeb922, Word32
0x85b2a20e, Word32
0xe6ba0d99,
  Word32
0xde720c8c, Word32
0x2da2f728, Word32
0xd0127845, Word32
0x95b794fd, Word32
0x647d0862, Word32
0xe7ccf5f0,
  Word32
0x5449a36f, Word32
0x877d48fa, Word32
0xc39dfd27, Word32
0xf33e8d1e, Word32
0x0a476341, Word32
0x992eff74,
  Word32
0x3a6f6eab, Word32
0xf4f8fd37, Word32
0xa812dc60, Word32
0xa1ebddf8, Word32
0x991be14c, Word32
0xdb6e6b0d,
  Word32
0xc67b5510, Word32
0x6d672c37, Word32
0x2765d43b, Word32
0xdcd0e804, Word32
0xf1290dc7, Word32
0xcc00ffa3,
  Word32
0xb5390f92, Word32
0x690fed0b, Word32
0x667b9ffb, Word32
0xcedb7d9c, Word32
0xa091cf0b, Word32
0xd9155ea3,
  Word32
0xbb132f88, Word32
0x515bad24, Word32
0x7b9479bf, Word32
0x763bd6eb, Word32
0x37392eb3, Word32
0xcc115979,
  Word32
0x8026e297, Word32
0xf42e312d, Word32
0x6842ada7, Word32
0xc66a2b3b, Word32
0x12754ccc, Word32
0x782ef11c,
  Word32
0x6a124237, Word32
0xb79251e7, Word32
0x06a1bbe6, Word32
0x4bfb6350, Word32
0x1a6b1018, Word32
0x11caedfa,
  Word32
0x3d25bdd8, Word32
0xe2e1c3c9, Word32
0x44421659, Word32
0x0a121386, Word32
0xd90cec6e, Word32
0xd5abea2a,
  Word32
0x64af674e, Word32
0xda86a85f, Word32
0xbebfe988, Word32
0x64e4c3fe, Word32
0x9dbc8057, Word32
0xf0f7c086,
  Word32
0x60787bf8, Word32
0x6003604d, Word32
0xd1fd8346, Word32
0xf6381fb0, Word32
0x7745ae04, Word32
0xd736fccc,
  Word32
0x83426b33, Word32
0xf01eab71, Word32
0xb0804187, Word32
0x3c005e5f, Word32
0x77a057be, Word32
0xbde8ae24,
  Word32
0x55464299, Word32
0xbf582e61, Word32
0x4e58f48f, Word32
0xf2ddfda2, Word32
0xf474ef38, Word32
0x8789bdc2,
  Word32
0x5366f9c3, Word32
0xc8b38e74, Word32
0xb475f255, Word32
0x46fcd9b9, Word32
0x7aeb2661, Word32
0x8b1ddf84,
  Word32
0x846a0e79, Word32
0x915f95e2, Word32
0x466e598e, Word32
0x20b45770, Word32
0x8cd55591, Word32
0xc902de4c,
  Word32
0xb90bace1, Word32
0xbb8205d0, Word32
0x11a86248, Word32
0x7574a99e, Word32
0xb77f19b6, Word32
0xe0a9dc09,
  Word32
0x662d09a1, Word32
0xc4324633, Word32
0xe85a1f02, Word32
0x09f0be8c, Word32
0x4a99a025, Word32
0x1d6efe10,
  Word32
0x1ab93d1d, Word32
0x0ba5a4df, Word32
0xa186f20f, Word32
0x2868f169, Word32
0xdcb7da83, Word32
0x573906fe,
  Word32
0xa1e2ce9b, Word32
0x4fcd7f52, Word32
0x50115e01, Word32
0xa70683fa, Word32
0xa002b5c4, Word32
0x0de6d027,
  Word32
0x9af88c27, Word32
0x773f8641, Word32
0xc3604c06, Word32
0x61a806b5, Word32
0xf0177a28, Word32
0xc0f586e0,
  Word32
0x006058aa, Word32
0x30dc7d62, Word32
0x11e69ed7, Word32
0x2338ea63, Word32
0x53c2dd94, Word32
0xc2c21634,
  Word32
0xbbcbee56, Word32
0x90bcb6de, Word32
0xebfc7da1, Word32
0xce591d76, Word32
0x6f05e409, Word32
0x4b7c0188,
  Word32
0x39720a3d, Word32
0x7c927c24, Word32
0x86e3725f, Word32
0x724d9db9, Word32
0x1ac15bb4, Word32
0xd39eb8fc,
  Word32
0xed545578, Word32
0x08fca5b5, Word32
0xd83d7cd3, Word32
0x4dad0fc4, Word32
0x1e50ef5e, Word32
0xb161e6f8,
  Word32
0xa28514d9, Word32
0x6c51133c, Word32
0x6fd5c7e7, Word32
0x56e14ec4, Word32
0x362abfce, Word32
0xddc6c837,
  Word32
0xd79a3234, Word32
0x92638212, Word32
0x670efa8e, Word32
0x406000e0])
  
iSbox3 :: Sbox
iSbox3 :: Pbox
iSbox3  = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (Word32
0,Word32
255) (forall a b. [a] -> [b] -> [(a, b)]
zip [Word32
0..Word32
255]
 [Word32
0x3a39ce37, Word32
0xd3faf5cf, Word32
0xabc27737, Word32
0x5ac52d1b, Word32
0x5cb0679e, Word32
0x4fa33742,
  Word32
0xd3822740, Word32
0x99bc9bbe, Word32
0xd5118e9d, Word32
0xbf0f7315, Word32
0xd62d1c7e, Word32
0xc700c47b,
  Word32
0xb78c1b6b, Word32
0x21a19045, Word32
0xb26eb1be, Word32
0x6a366eb4, Word32
0x5748ab2f, Word32
0xbc946e79,
  Word32
0xc6a376d2, Word32
0x6549c2c8, Word32
0x530ff8ee, Word32
0x468dde7d, Word32
0xd5730a1d, Word32
0x4cd04dc6,
  Word32
0x2939bbdb, Word32
0xa9ba4650, Word32
0xac9526e8, Word32
0xbe5ee304, Word32
0xa1fad5f0, Word32
0x6a2d519a,
  Word32
0x63ef8ce2, Word32
0x9a86ee22, Word32
0xc089c2b8, Word32
0x43242ef6, Word32
0xa51e03aa, Word32
0x9cf2d0a4,
  Word32
0x83c061ba, Word32
0x9be96a4d, Word32
0x8fe51550, Word32
0xba645bd6, Word32
0x2826a2f9, Word32
0xa73a3ae1,
  Word32
0x4ba99586, Word32
0xef5562e9, Word32
0xc72fefd3, Word32
0xf752f7da, Word32
0x3f046f69, Word32
0x77fa0a59,
  Word32
0x80e4a915, Word32
0x87b08601, Word32
0x9b09e6ad, Word32
0x3b3ee593, Word32
0xe990fd5a, Word32
0x9e34d797,
  Word32
0x2cf0b7d9, Word32
0x022b8b51, Word32
0x96d5ac3a, Word32
0x017da67d, Word32
0xd1cf3ed6, Word32
0x7c7d2d28,
  Word32
0x1f9f25cf, Word32
0xadf2b89b, Word32
0x5ad6b472, Word32
0x5a88f54c, Word32
0xe029ac71, Word32
0xe019a5e6,
  Word32
0x47b0acfd, Word32
0xed93fa9b, Word32
0xe8d3c48d, Word32
0x283b57cc, Word32
0xf8d56629, Word32
0x79132e28,
  Word32
0x785f0191, Word32
0xed756055, Word32
0xf7960e44, Word32
0xe3d35e8c, Word32
0x15056dd4, Word32
0x88f46dba,
  Word32
0x03a16125, Word32
0x0564f0bd, Word32
0xc3eb9e15, Word32
0x3c9057a2, Word32
0x97271aec, Word32
0xa93a072a,
  Word32
0x1b3f6d9b, Word32
0x1e6321f5, Word32
0xf59c66fb, Word32
0x26dcf319, Word32
0x7533d928, Word32
0xb155fdf5,
  Word32
0x03563482, Word32
0x8aba3cbb, Word32
0x28517711, Word32
0xc20ad9f8, Word32
0xabcc5167, Word32
0xccad925f,
  Word32
0x4de81751, Word32
0x3830dc8e, Word32
0x379d5862, Word32
0x9320f991, Word32
0xea7a90c2, Word32
0xfb3e7bce,
  Word32
0x5121ce64, Word32
0x774fbe32, Word32
0xa8b6e37e, Word32
0xc3293d46, Word32
0x48de5369, Word32
0x6413e680,
  Word32
0xa2ae0810, Word32
0xdd6db224, Word32
0x69852dfd, Word32
0x09072166, Word32
0xb39a460a, Word32
0x6445c0dd,
  Word32
0x586cdecf, Word32
0x1c20c8ae, Word32
0x5bbef7dd, Word32
0x1b588d40, Word32
0xccd2017f, Word32
0x6bb4e3bb,
  Word32
0xdda26a7e, Word32
0x3a59ff45, Word32
0x3e350a44, Word32
0xbcb4cdd5, Word32
0x72eacea8, Word32
0xfa6484bb,
  Word32
0x8d6612ae, Word32
0xbf3c6f47, Word32
0xd29be463, Word32
0x542f5d9e, Word32
0xaec2771b, Word32
0xf64e6370,
  Word32
0x740e0d8d, Word32
0xe75b1357, Word32
0xf8721671, Word32
0xaf537d5d, Word32
0x4040cb08, Word32
0x4eb4e2cc,
  Word32
0x34d2466a, Word32
0x0115af84, Word32
0xe1b00428, Word32
0x95983a1d, Word32
0x06b89fb4, Word32
0xce6ea048,
  Word32
0x6f3f3b82, Word32
0x3520ab82, Word32
0x011a1d4b, Word32
0x277227f8, Word32
0x611560b1, Word32
0xe7933fdc,
  Word32
0xbb3a792b, Word32
0x344525bd, Word32
0xa08839e1, Word32
0x51ce794b, Word32
0x2f32c9b7, Word32
0xa01fbac9,
  Word32
0xe01cc87e, Word32
0xbcc7d1f6, Word32
0xcf0111c3, Word32
0xa1e8aac7, Word32
0x1a908749, Word32
0xd44fbd9a,
  Word32
0xd0dadecb, Word32
0xd50ada38, Word32
0x0339c32a, Word32
0xc6913667, Word32
0x8df9317c, Word32
0xe0b12b4f,
  Word32
0xf79e59b7, Word32
0x43f5bb3a, Word32
0xf2d519ff, Word32
0x27d9459c, Word32
0xbf97222c, Word32
0x15e6fc2a,
  Word32
0x0f91fc71, Word32
0x9b941525, Word32
0xfae59361, Word32
0xceb69ceb, Word32
0xc2a86459, Word32
0x12baa8d1,
  Word32
0xb6c1075e, Word32
0xe3056a0c, Word32
0x10d25065, Word32
0xcb03a442, Word32
0xe0ec6e0e, Word32
0x1698db3b,
  Word32
0x4c98a0be, Word32
0x3278e964, Word32
0x9f1f9532, Word32
0xe0d392df, Word32
0xd3a0342b, Word32
0x8971f21e,
  Word32
0x1b0a7441, Word32
0x4ba3348c, Word32
0xc5be7120, Word32
0xc37632d8, Word32
0xdf359f8d, Word32
0x9b992f2e,
  Word32
0xe60b6f47, Word32
0x0fe3f11d, Word32
0xe54cda54, Word32
0x1edad891, Word32
0xce6279cf, Word32
0xcd3e7e6f,
  Word32
0x1618b166, Word32
0xfd2c1d05, Word32
0x848fd2c5, Word32
0xf6fb2299, Word32
0xf523f357, Word32
0xa6327623,
  Word32
0x93a83531, Word32
0x56cccd02, Word32
0xacf08162, Word32
0x5a75ebb5, Word32
0x6e163697, Word32
0x88d273cc,
  Word32
0xde966292, Word32
0x81b949d0, Word32
0x4c50901b, Word32
0x71c65614, Word32
0xe6c6c7bd, Word32
0x327a140a,
  Word32
0x45e1d006, Word32
0xc3f27b9a, Word32
0xc9aa53fd, Word32
0x62a80f00, Word32
0xbb25bfe2, Word32
0x35bdd2f6,
  Word32
0x71126905, Word32
0xb2040222, Word32
0xb6cbcf7c, Word32
0xcd769c2b, Word32
0x53113ec0, Word32
0x1640e3d3,
  Word32
0x38abbd60, Word32
0x2547adf0, Word32
0xba38209c, Word32
0xf746ce76, Word32
0x77afa1c5, Word32
0x20756060,
  Word32
0x85cbfe4e, Word32
0x8ae88dd8, Word32
0x7aaaf9b0, Word32
0x4cf9aa7e, Word32
0x1948c25c, Word32
0x02fb8a8c,
  Word32
0x01c36ae4, Word32
0xd6ebe1f9, Word32
0x90d4f869, Word32
0xa65cdea0, Word32
0x3f09252d, Word32
0xc208e69f,
  Word32
0xb74e6132, Word32
0xce77e25b, Word32
0x578fdfe3, Word32
0x3ac372e6])