module OpenSSL.EVP.Open
( open
, openBS
, openLBS
)
where
import qualified Data.ByteString.Char8 as B8
import qualified Data.ByteString.Lazy.Char8 as L8
import Foreign
import Foreign.C
import OpenSSL.EVP.Cipher hiding (cipher)
import OpenSSL.EVP.PKey
import OpenSSL.EVP.Internal
import OpenSSL.Utils
foreign import ccall unsafe "EVP_OpenInit"
_OpenInit :: Ptr EVP_CIPHER_CTX
-> Cipher
-> Ptr CChar
-> CInt
-> CString
-> Ptr EVP_PKEY
-> IO CInt
openInit :: KeyPair key => Cipher -> String -> String -> key -> IO CipherCtx
openInit cipher encKey iv pkey
= do ctx <- newCipherCtx
withCipherCtxPtr ctx $ \ ctxPtr ->
withCStringLen encKey $ \ (encKeyPtr, encKeyLen) ->
withCString iv $ \ ivPtr ->
withPKeyPtr' pkey $ \ pkeyPtr ->
_OpenInit ctxPtr cipher encKeyPtr (fromIntegral encKeyLen) ivPtr pkeyPtr
>>= failIf_ (== 0)
return ctx
open :: KeyPair key =>
Cipher
-> String
-> String
-> key
-> String
-> String
open cipher encKey iv pkey input
= L8.unpack $ openLBS cipher encKey iv pkey $ L8.pack input
openBS :: KeyPair key =>
Cipher
-> String
-> String
-> key
-> B8.ByteString
-> B8.ByteString
openBS cipher encKey iv pkey input
= unsafePerformIO $
do ctx <- openInit cipher encKey iv pkey
cipherStrictly ctx input
openLBS :: KeyPair key =>
Cipher
-> String
-> String
-> key
-> L8.ByteString
-> L8.ByteString
openLBS cipher encKey iv pkey input
= unsafePerformIO $
do ctx <- openInit cipher encKey iv pkey
cipherLazily ctx input