summaryrefslogtreecommitdiff
path: root/Crypto/Cipher/SBox.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Crypto/Cipher/SBox.hs')
-rw-r--r--Crypto/Cipher/SBox.hs63
1 files changed, 63 insertions, 0 deletions
diff --git a/Crypto/Cipher/SBox.hs b/Crypto/Cipher/SBox.hs
new file mode 100644
index 0000000..5c1a206
--- /dev/null
+++ b/Crypto/Cipher/SBox.hs
@@ -0,0 +1,63 @@
1{-# LANGUAGE TemplateHaskell #-}
2module Crypto.Cipher.SBox (SBox,(#),sbox,pbox,bytes,parseBox,parseBytes) where
3
4import Language.Haskell.TH
5import Language.Haskell.TH.Quote
6import Data.Bits
7import Data.Binary
8import Data.Char
9import Data.Word
10import Data.List
11import qualified Data.Vector.Unboxed as V
12import qualified Data.ByteString as S
13
14unsupported _ = fail "not supported."
15
16qw = QuasiQuoter f unsupported unsupported unsupported
17 where unsupported _ = fail "not supported."
18 f x = return $ ListE $ map (LitE . StringL) $ words x
19
20str = QuasiQuoter {
21 quoteExp = stringE,
22 quotePat = unsupported,
23 quoteDec = unsupported,
24 quoteType = unsupported
25 }
26sbox = str { quoteExp = sboxExp }
27pbox = sbox
28bytes = str { quoteExp = bytesExp }
29
30sboxExp st = let w=mkName "parseBox" in return $ AppE (VarE w) (LitE (StringL st))
31bytesExp st = let w=mkName "parseBytes" in return $ AppE (VarE w) (LitE (StringL st))
32
33type SBox = V.Vector Word32
34
35{-# INLINE (#) #-}
36(#) :: SBox -> Word8 -> Word32
37v # i = v V.! (fromIntegral i )
38
39
40parseBox :: String -> SBox
41parseBox xs = V.fromList $ (map (read . ("0x"++) {- . reverseNibbles -} ) . words $ xs :: [Word32])
42 where
43 reverseNibbles = concat . reverse . group2 (\a b->[a,b])
44
45 group2 f (x:y:ys) = f x y : group2 f ys
46 group2 _ _ = []
47
48parseBytes bs = S.pack . parseHex' . concat . words $ bs
49 where
50 parseHex' bs =
51 let (dnib,ts) = splitAt 2 bs
52 parseNibble x = group2 toW8 $ map (hexDigit . ord8) x
53 hexDigit d = d - (if d>0x39 then if d<0x61 then 0x37 else 0x57 else 0x30)
54 group2 f (x:y:ys) = f x y : group2 f ys
55 group2 _ _ = []
56 toW8 a b = shift a 4 .|. b
57 ord8 c = fromIntegral . ord $ c :: Word8
58 in parseNibble dnib ++
59 if null ts
60 then []
61 else parseHex' ts
62
63