{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE CApiFFI #-}
module OpenSSL.EVP.Verify
( VerifyStatus(..)
, verify
, verifyBS
, verifyLBS
)
where
import qualified Data.ByteString.Char8 as B8
import qualified Data.ByteString.Lazy.Char8 as L8
import qualified Data.ByteString.Unsafe as B8
import Data.Typeable
import Foreign
import Foreign.C
import OpenSSL.EVP.Digest
import OpenSSL.EVP.PKey
import OpenSSL.EVP.Internal
import OpenSSL.Utils
data VerifyStatus = VerifySuccess
| VerifyFailure
deriving (Int -> VerifyStatus -> ShowS
[VerifyStatus] -> ShowS
VerifyStatus -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [VerifyStatus] -> ShowS
$cshowList :: [VerifyStatus] -> ShowS
show :: VerifyStatus -> String
$cshow :: VerifyStatus -> String
showsPrec :: Int -> VerifyStatus -> ShowS
$cshowsPrec :: Int -> VerifyStatus -> ShowS
Show, VerifyStatus -> VerifyStatus -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: VerifyStatus -> VerifyStatus -> Bool
$c/= :: VerifyStatus -> VerifyStatus -> Bool
== :: VerifyStatus -> VerifyStatus -> Bool
$c== :: VerifyStatus -> VerifyStatus -> Bool
Eq, Typeable)
foreign import capi unsafe "openssl/evp.h EVP_VerifyFinal"
_VerifyFinal :: Ptr EVP_MD_CTX -> Ptr CChar -> CUInt -> Ptr EVP_PKEY -> IO CInt
verifyFinalBS :: PublicKey k =>
DigestCtx
-> B8.ByteString
-> k
-> IO VerifyStatus
verifyFinalBS :: forall k.
PublicKey k =>
DigestCtx -> ByteString -> k -> IO VerifyStatus
verifyFinalBS DigestCtx
ctx ByteString
sig k
k
= forall a. DigestCtx -> (Ptr EVP_MD_CTX -> IO a) -> IO a
withDigestCtxPtr DigestCtx
ctx forall a b. (a -> b) -> a -> b
$ \ Ptr EVP_MD_CTX
ctxPtr ->
forall a. ByteString -> (CStringLen -> IO a) -> IO a
B8.unsafeUseAsCStringLen ByteString
sig forall a b. (a -> b) -> a -> b
$ \ (Ptr CChar
buf, Int
len) ->
forall k a. PKey k => k -> (Ptr EVP_PKEY -> IO a) -> IO a
withPKeyPtr' k
k forall a b. (a -> b) -> a -> b
$ \ Ptr EVP_PKEY
pkeyPtr ->
Ptr EVP_MD_CTX -> Ptr CChar -> CUInt -> Ptr EVP_PKEY -> IO CInt
_VerifyFinal Ptr EVP_MD_CTX
ctxPtr Ptr CChar
buf (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len) Ptr EVP_PKEY
pkeyPtr forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CInt -> IO VerifyStatus
interpret
where
interpret :: CInt -> IO VerifyStatus
interpret :: CInt -> IO VerifyStatus
interpret CInt
1 = forall (m :: * -> *) a. Monad m => a -> m a
return VerifyStatus
VerifySuccess
interpret CInt
0 = forall (m :: * -> *) a. Monad m => a -> m a
return VerifyStatus
VerifyFailure
interpret CInt
_ = forall a. IO a
raiseOpenSSLError
verify :: PublicKey key =>
Digest
-> String
-> key
-> String
-> IO VerifyStatus
{-# DEPRECATED verify "Use verifyBS or verifyLBS instead." #-}
verify :: forall key.
PublicKey key =>
Digest -> String -> key -> String -> IO VerifyStatus
verify Digest
md String
sig key
pkey String
input
= forall key.
PublicKey key =>
Digest -> ByteString -> key -> ByteString -> IO VerifyStatus
verifyLBS Digest
md (String -> ByteString
B8.pack String
sig) key
pkey (String -> ByteString
L8.pack String
input)
verifyBS :: PublicKey key =>
Digest
-> B8.ByteString
-> key
-> B8.ByteString
-> IO VerifyStatus
verifyBS :: forall key.
PublicKey key =>
Digest -> ByteString -> key -> ByteString -> IO VerifyStatus
verifyBS Digest
md ByteString
sig key
pkey ByteString
input
= do DigestCtx
ctx <- Digest -> ByteString -> IO DigestCtx
digestStrictly Digest
md ByteString
input
forall k.
PublicKey k =>
DigestCtx -> ByteString -> k -> IO VerifyStatus
verifyFinalBS DigestCtx
ctx ByteString
sig key
pkey
verifyLBS :: PublicKey key =>
Digest
-> B8.ByteString
-> key
-> L8.ByteString
-> IO VerifyStatus
verifyLBS :: forall key.
PublicKey key =>
Digest -> ByteString -> key -> ByteString -> IO VerifyStatus
verifyLBS Digest
md ByteString
sig key
pkey ByteString
input
= do DigestCtx
ctx <- Digest -> ByteString -> IO DigestCtx
digestLazily Digest
md ByteString
input
forall k.
PublicKey k =>
DigestCtx -> ByteString -> k -> IO VerifyStatus
verifyFinalBS DigestCtx
ctx ByteString
sig key
pkey