module Data.OpenPGP.CryptoAPI.Util where import Numeric import Control.Applicative import Data.Binary import Data.Binary.Get (runGetOrFail) import qualified Data.Serialize as Serialize import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LZ import qualified Data.OpenPGP as OpenPGP swing :: (((a -> b) -> b) -> c -> d) -> c -> a -> d swing f c a = f ($ a) c hush :: Either a b -> Maybe b hush (Left _) = Nothing hush (Right x) = Just x toStrictBS :: LZ.ByteString -> BS.ByteString toStrictBS = BS.concat . LZ.toChunks toLazyBS :: BS.ByteString -> LZ.ByteString toLazyBS = LZ.fromChunks . (:[]) oo :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c oo = (.) . (.) hexString :: [Word8] -> String hexString = foldr (pad `oo` showHex) "" where pad s | odd $ length s = '0':s | otherwise = s maybeDecode :: (Binary a) => LZ.ByteString -> Maybe a maybeDecode = maybeGet get maybeGet :: (Binary a) => Get a -> LZ.ByteString -> Maybe a maybeGet g bs = (\(_,_,x) -> x) <$> hush (runGetOrFail g bs) sDecode :: (Serialize.Serialize a) => BS.ByteString -> Maybe a sDecode = hush . Serialize.decode keyIdMatch :: String -> String -> Bool keyIdMatch x y = all (uncurry (==)) $ uncurry (flip zip) $ unzip $ zip (reverse x) (reverse y) fromJustMPI :: Maybe OpenPGP.MPI -> Integer fromJustMPI (Just (OpenPGP.MPI x)) = x fromJustMPI _ = error "Not a Just MPI, Data.OpenPGP.CryptoAPI" isSecretKey :: OpenPGP.Packet -> Bool isSecretKey (OpenPGP.SecretKeyPacket {}) = True isSecretKey _ = False isAsymmetricSessionKey :: OpenPGP.Packet -> Bool isAsymmetricSessionKey (OpenPGP.AsymmetricSessionKeyPacket {}) = True isAsymmetricSessionKey _ = False isSymmetricSessionKey :: OpenPGP.Packet -> Bool isSymmetricSessionKey (OpenPGP.SymmetricSessionKeyPacket {}) = True isSymmetricSessionKey _ = False isEncryptedData :: OpenPGP.Packet -> Bool isEncryptedData (OpenPGP.EncryptedDataPacket {}) = True isEncryptedData _ = False isUserID :: OpenPGP.Packet -> Bool isUserID (OpenPGP.UserIDPacket {}) = True isUserID _ = False isSignable :: OpenPGP.Packet -> Bool isSignable (OpenPGP.LiteralDataPacket {}) = True isSignable (OpenPGP.PublicKeyPacket {}) = True isSignable (OpenPGP.SecretKeyPacket {}) = True isSignable _ = False isKey :: OpenPGP.Packet -> Bool isKey (OpenPGP.SecretKeyPacket {}) = True isKey (OpenPGP.PublicKeyPacket {}) = True isKey _ = False