diff options
author | joe <joe@jerkface.net> | 2016-08-26 02:40:02 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-07-01 09:19:55 -0400 |
commit | a90b1f609d8a559694ad31ea0b28ec6309a8b661 (patch) | |
tree | 20a12fad58c51d0f75e5305636ae0050d2dc6e72 /Crypto/Cipher/ThomasToVincent.hs | |
parent | f1a0772d5fb17f4460bdf996e06bb0983cf7a530 (diff) |
Drop dependency on Thamas's crypto-api package.
Diffstat (limited to 'Crypto/Cipher/ThomasToVincent.hs')
-rw-r--r-- | Crypto/Cipher/ThomasToVincent.hs | 52 |
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 #-} |
3 | module Crypto.Cipher.ThomasToVincent where | 3 | module Crypto.Cipher.ThomasToVincent where |
4 | 4 | ||
5 | import qualified Data.ByteString as S | ||
5 | import Crypto.Cipher.Types | 6 | import Crypto.Cipher.Types |
7 | import Crypto.Cipher.Cast5 | ||
6 | import Data.Byteable | 8 | import Data.Byteable |
7 | 9 | ||
8 | import Data.Tagged | 10 | import Data.Tagged |
11 | {- | ||
9 | import qualified Crypto.Classes as Thomas | 12 | import qualified Crypto.Classes as Thomas |
10 | #if ! MIN_VERSION_crypto_api(0,11,0) | 13 | if ! MIN_VERSION_crypto_api(0,11,0) |
11 | import qualified Crypto.Modes as Thomas | 14 | import qualified Crypto.Modes as Thomas |
12 | #endif | 15 | endif |
16 | -} | ||
13 | 17 | ||
14 | 18 | ||
19 | type ThomasToVincent b = b | ||
20 | |||
21 | instance 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. | ||
30 | chunkFor' :: (Cast5Bits size) => Cast5 size -> S.ByteString -> [S.ByteString] | ||
31 | chunkFor' 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. | ||
38 | for :: Tagged a b -> a -> b | ||
39 | for t _ = unTagged t | ||
40 | |||
41 | instance 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 | {- | ||
15 | newtype ThomasToVincent b = ThomasToVincent b | 56 | newtype ThomasToVincent b = ThomasToVincent b |
16 | 57 | ||
17 | instance Thomas.BlockCipher b => Cipher (ThomasToVincent b) where | 58 | instance Thomas.BlockCipher b => Cipher (ThomasToVincent b) where |
@@ -24,12 +65,13 @@ instance Thomas.BlockCipher b => Cipher (ThomasToVincent b) where | |||
24 | instance Thomas.BlockCipher b => BlockCipher (ThomasToVincent b) where | 65 | instance 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) | 68 | if ! 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 | 71 | else |
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 | 74 | endif |
75 | -} | ||
34 | 76 | ||
35 | 77 | ||