module Codec.Encryption.OpenPGP.Compression
( decompressPkt
, compressPkts
) where
import qualified Codec.Compression.BZip as BZip
import qualified Codec.Compression.Zlib as Zlib
import qualified Codec.Compression.Zlib.Raw as ZlibRaw
import Codec.Encryption.OpenPGP.Serialize ()
import Codec.Encryption.OpenPGP.Types
import Data.Binary (get, put)
import Data.Binary.Get (runGetOrFail)
import Data.Binary.Put (runPut)
decompressPkt :: Pkt -> [Pkt]
decompressPkt :: Pkt -> [Pkt]
decompressPkt (CompressedDataPkt algo :: CompressionAlgorithm
algo bs :: CompressedDataPayload
bs) =
case Get (Block Pkt)
-> CompressedDataPayload
-> Either
(CompressedDataPayload, ByteOffset, String)
(CompressedDataPayload, ByteOffset, Block Pkt)
forall a.
Get a
-> CompressedDataPayload
-> Either
(CompressedDataPayload, ByteOffset, String)
(CompressedDataPayload, ByteOffset, a)
runGetOrFail Get (Block Pkt)
forall t. Binary t => Get t
get (CompressionAlgorithm
-> CompressedDataPayload -> CompressedDataPayload
dfunc CompressionAlgorithm
algo CompressedDataPayload
bs) of
Left _ -> []
Right (_, _, packs :: Block Pkt
packs) -> Block Pkt -> [Pkt]
forall a. Block a -> [a]
unBlock Block Pkt
packs
where
dfunc :: CompressionAlgorithm
-> CompressedDataPayload -> CompressedDataPayload
dfunc ZIP = CompressedDataPayload -> CompressedDataPayload
ZlibRaw.decompress
dfunc ZLIB = CompressedDataPayload -> CompressedDataPayload
Zlib.decompress
dfunc BZip2 = CompressedDataPayload -> CompressedDataPayload
BZip.decompress
dfunc _ = String -> CompressedDataPayload -> CompressedDataPayload
forall a. HasCallStack => String -> a
error "Compression algorithm not supported"
decompressPkt p :: Pkt
p = [Pkt
p]
compressPkts :: CompressionAlgorithm -> [Pkt] -> Pkt
compressPkts :: CompressionAlgorithm -> [Pkt] -> Pkt
compressPkts ca :: CompressionAlgorithm
ca packs :: [Pkt]
packs =
let bs :: CompressedDataPayload
bs = Put -> CompressedDataPayload
runPut (Put -> CompressedDataPayload) -> Put -> CompressedDataPayload
forall a b. (a -> b) -> a -> b
$ Block Pkt -> Put
forall t. Binary t => t -> Put
put ([Pkt] -> Block Pkt
forall a. [a] -> Block a
Block [Pkt]
packs)
cbs :: CompressedDataPayload
cbs = CompressionAlgorithm
-> CompressedDataPayload -> CompressedDataPayload
cfunc CompressionAlgorithm
ca CompressedDataPayload
bs
in CompressionAlgorithm -> CompressedDataPayload -> Pkt
CompressedDataPkt CompressionAlgorithm
ca CompressedDataPayload
cbs
where
cfunc :: CompressionAlgorithm
-> CompressedDataPayload -> CompressedDataPayload
cfunc ZIP = CompressedDataPayload -> CompressedDataPayload
ZlibRaw.compress
cfunc ZLIB = CompressedDataPayload -> CompressedDataPayload
Zlib.compress
cfunc BZip2 = CompressedDataPayload -> CompressedDataPayload
BZip.compress
cfunc _ = String -> CompressedDataPayload -> CompressedDataPayload
forall a. HasCallStack => String -> a
error "Compression algorithm not supported"