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 (CompressedDataPkt algo bs) =
case runGetOrFail get (dfunc algo bs) of
Left _ -> []
Right (_, _, packs) -> unBlock packs
where
dfunc ZIP = ZlibRaw.decompress
dfunc ZLIB = Zlib.decompress
dfunc BZip2 = BZip.decompress
dfunc _ = error "Compression algorithm not supported"
decompressPkt p = [p]
compressPkts :: CompressionAlgorithm -> [Pkt] -> Pkt
compressPkts ca packs =
let bs = runPut $ put (Block packs)
cbs = cfunc ca bs
in CompressedDataPkt ca cbs
where
cfunc ZIP = ZlibRaw.compress
cfunc ZLIB = Zlib.compress
cfunc BZip2 = BZip.compress
cfunc _ = error "Compression algorithm not supported"