module Crypto.Gpgme.Types where
import Bindings.Gpgme
import qualified Data.ByteString as BS
import Foreign
import qualified Foreign.Concurrent as FC
import Foreign.C.String (peekCString)
import System.IO.Unsafe (unsafePerformIO)
data Protocol =
CMS
| GPGCONF
| OpenPGP
| UNKNOWN
deriving (Show, Eq, Ord)
data Ctx = Ctx {
_ctx :: Ptr C'gpgme_ctx_t
, _version :: String
, _protocol :: Protocol
, _engineVersion :: String
}
type Fpr = BS.ByteString
type Plain = BS.ByteString
type Encrypted = BS.ByteString
type InvalidKey = (String, Int)
newtype Key = Key { unKey :: ForeignPtr C'gpgme_key_t }
allocKey :: IO Key
allocKey = do
keyPtr <- malloc
let finalize = do
peek keyPtr >>= c'gpgme_key_unref
free keyPtr
Key `fmap` FC.newForeignPtr keyPtr finalize
withKeyPtr :: Key -> (Ptr C'gpgme_key_t -> IO a) -> IO a
withKeyPtr (Key fPtr) f = withForeignPtr fPtr f
data IncludeSecret =
WithSecret
| NoSecret
deriving (Show, Eq, Ord)
data Flag =
AlwaysTrust
| NoFlag
deriving (Show, Eq, Ord)
newtype GpgmeError = GpgmeError C'gpgme_error_t
deriving (Show, Ord, Eq)
errorString :: GpgmeError -> String
errorString (GpgmeError n) =
unsafePerformIO $ c'gpgme_strerror n >>= peekCString
sourceString :: GpgmeError -> String
sourceString (GpgmeError n) =
unsafePerformIO $ c'gpgme_strsource n >>= peekCString
data DecryptError =
NoData
| Failed
| BadPass
| Unknown GpgmeError
deriving (Show, Eq, Ord)
toDecryptError :: C'gpgme_error_t -> DecryptError
toDecryptError n =
case unsafePerformIO $ c'gpgme_err_code n of
58 -> NoData
152 -> Failed
11 -> BadPass
x -> Unknown (GpgmeError x)
data Validity =
ValidityUnknown
| ValidityUndefined
| ValidityNever
| ValidityMarginal
| ValidityFull
| ValidityUltimate
deriving (Show, Ord, Eq)
data PubKeyAlgo =
Rsa
| RsaE
| RsaS
| ElgE
| Dsa
| Elg
deriving (Show, Ord, Eq)