module Codec.Encryption.Modes (
cbc, unCbc
) where
import Data.Word
import Data.Bits
cbc :: Bits block =>
(key -> block -> block) ->
block ->
key ->
[block] ->
[block]
cbc :: forall block key.
Bits block =>
(key -> block -> block) -> block -> key -> [block] -> [block]
cbc key -> block -> block
e block
iv key
k [block]
ps =
[block]
ciphers where
ciphers :: [block]
ciphers = forall a b. (a -> b) -> [a] -> [b]
map (key -> block -> block
e key
k) [block]
feedIns
feedIns :: [block]
feedIns = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Bits a => a -> a -> a
xor (block
iv forall a. a -> [a] -> [a]
: [block]
ciphers) [block]
ps
unCbc :: Bits block =>
(key -> block -> block) ->
block ->
key ->
[block] ->
[block]
unCbc :: forall block key.
Bits block =>
(key -> block -> block) -> block -> key -> [block] -> [block]
unCbc key -> block -> block
d block
iv key
k [block]
ms =
[block]
outOfCbcs where
beforeXOrs :: [block]
beforeXOrs = forall a b. (a -> b) -> [a] -> [b]
map (key -> block -> block
d key
k) [block]
ms
outOfCbcs :: [block]
outOfCbcs = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Bits a => a -> a -> a
xor (block
iv forall a. a -> [a] -> [a]
: [block]
ms) [block]
beforeXOrs