summaryrefslogtreecommitdiff
path: root/Crypto/Cipher/ThomasToVincent.hs
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2016-08-26 02:40:02 -0400
committerJoe Crayne <joe@jerkface.net>2019-07-01 09:19:55 -0400
commita90b1f609d8a559694ad31ea0b28ec6309a8b661 (patch)
tree20a12fad58c51d0f75e5305636ae0050d2dc6e72 /Crypto/Cipher/ThomasToVincent.hs
parentf1a0772d5fb17f4460bdf996e06bb0983cf7a530 (diff)
Drop dependency on Thamas's crypto-api package.
Diffstat (limited to 'Crypto/Cipher/ThomasToVincent.hs')
-rw-r--r--Crypto/Cipher/ThomasToVincent.hs52
1 files changed, 47 insertions, 5 deletions
diff --git a/Crypto/Cipher/ThomasToVincent.hs b/Crypto/Cipher/ThomasToVincent.hs
index 11cede3..5a68cf3 100644
--- a/Crypto/Cipher/ThomasToVincent.hs
+++ b/Crypto/Cipher/ThomasToVincent.hs
@@ -2,16 +2,57 @@
2{-# LANGUAGE ScopedTypeVariables #-} 2{-# LANGUAGE ScopedTypeVariables #-}
3module Crypto.Cipher.ThomasToVincent where 3module Crypto.Cipher.ThomasToVincent where
4 4
5import qualified Data.ByteString as S
5import Crypto.Cipher.Types 6import Crypto.Cipher.Types
7import Crypto.Cipher.Cast5
6import Data.Byteable 8import Data.Byteable
7 9
8import Data.Tagged 10import Data.Tagged
11{-
9import qualified Crypto.Classes as Thomas 12import qualified Crypto.Classes as Thomas
10#if ! MIN_VERSION_crypto_api(0,11,0) 13if ! MIN_VERSION_crypto_api(0,11,0)
11import qualified Crypto.Modes as Thomas 14import qualified Crypto.Modes as Thomas
12#endif 15endif
16-}
13 17
14 18
19type ThomasToVincent b = b
20
21instance Cast5Bits size => Cipher (Cast5 size) where
22 cipherName _ = "CAST-5"
23 cipherInit k = b
24 where Just b = buildKey (toBytes k)
25 cipherKeySize _ = KeySizeFixed (bitlen `div` 8)
26 where Tagged bitlen = keyLength :: Tagged (Cast5 size) Int
27
28
29-- Break a bytestring into block size chunks.
30chunkFor' :: (Cast5Bits size) => Cast5 size -> S.ByteString -> [S.ByteString]
31chunkFor' k = go
32 where
33 blkSz = (Crypto.Cipher.Cast5.blockSize `for` k) `div` 8
34 go bs | S.length bs < blkSz = []
35 | otherwise = let (blk,rest) = S.splitAt blkSz bs in blk : go rest
36
37-- |Obtain a tagged value for a particular instantiated type.
38for :: Tagged a b -> a -> b
39for t _ = unTagged t
40
41instance Cast5Bits size => BlockCipher (Cast5 size) where
42 blockSize _ = bitlen `div` 8
43 where Tagged bitlen = Crypto.Cipher.Cast5.blockSize :: Tagged (Cast5 size) Int
44
45 -- modeEcb' :: BlockCipher k => k -> B.ByteString -> B.ByteString
46 ecbEncrypt k msg =
47 let chunks = chunkFor' k msg
48 in S.concat $ map (encryptBlock k) chunks
49
50 ecbDecrypt k ct =
51 let chunks = chunkFor' k ct
52 in S.concat $ map (decryptBlock k) chunks
53
54
55{-
15newtype ThomasToVincent b = ThomasToVincent b 56newtype ThomasToVincent b = ThomasToVincent b
16 57
17instance Thomas.BlockCipher b => Cipher (ThomasToVincent b) where 58instance Thomas.BlockCipher b => Cipher (ThomasToVincent b) where
@@ -24,12 +65,13 @@ instance Thomas.BlockCipher b => Cipher (ThomasToVincent b) where
24instance Thomas.BlockCipher b => BlockCipher (ThomasToVincent b) where 65instance Thomas.BlockCipher b => BlockCipher (ThomasToVincent b) where
25 blockSize _ = bitlen `div` 8 66 blockSize _ = bitlen `div` 8
26 where Tagged bitlen = Thomas.blockSize :: Tagged b Int 67 where Tagged bitlen = Thomas.blockSize :: Tagged b Int
27#if ! MIN_VERSION_crypto_api(0,11,0) 68if ! MIN_VERSION_crypto_api(0,11,0)
28 ecbEncrypt (ThomasToVincent k) = Thomas.ecb' k 69 ecbEncrypt (ThomasToVincent k) = Thomas.ecb' k
29 ecbDecrypt (ThomasToVincent k) = Thomas.unEcb' k 70 ecbDecrypt (ThomasToVincent k) = Thomas.unEcb' k
30#else 71else
31 ecbEncrypt (ThomasToVincent k) = Thomas.ecb k 72 ecbEncrypt (ThomasToVincent k) = Thomas.ecb k
32 ecbDecrypt (ThomasToVincent k) = Thomas.unEcb k 73 ecbDecrypt (ThomasToVincent k) = Thomas.unEcb k
33#endif 74endif
75-}
34 76
35 77