From d1a85eb87934d348c9789aec59c751fa615ec363 Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Thu, 23 Aug 2018 17:24:47 -0400 Subject: Clean up casts Use unsigned char buffers more pervasively throughout the code. This removes most calls to `asCUCharBuf`, isolating `unsafeCoerce` further. By making some type signatures slightly more flexible, also eliminate most explicit integer conversions. --- src/Data/Digest.hs | 13 ++----------- src/Data/HMAC.hs | 14 ++++---------- 2 files changed, 6 insertions(+), 21 deletions(-) (limited to 'src/Data') diff --git a/src/Data/Digest.hs b/src/Data/Digest.hs index 0587d2b..3e6f263 100644 --- a/src/Data/Digest.hs +++ b/src/Data/Digest.hs @@ -27,7 +27,6 @@ import Foreign.Marshal.Unsafe (unsafeLocalState) import BTLS.BoringSSL.Base import BTLS.BoringSSL.Digest import BTLS.BoringSSLPatterns (initUpdateFinalize) -import BTLS.Cast (asCUCharBuf) import BTLS.Types (Algorithm(Algorithm), Digest(Digest)) type LazyByteString = ByteString.Lazy.ByteString @@ -45,13 +44,5 @@ hash :: Algorithm -> LazyByteString -> Digest hash (Algorithm md) = Digest . unsafeLocalState - . initUpdateFinalize mallocEVPMDCtx initialize evpDigestUpdate finalize - where - initialize ctx = evpDigestInitEx ctx md noEngine - - finalize ctx mdOut pOutSize = - -- 'mdOut' is a 'Ptr CChar'. However, to make life more interesting, - -- 'evpDigestFinalEx' requires a 'Ptr CUChar'. To work around this, - -- we're going to cheat and let Haskell reinterpret-cast 'mdOut' to 'Ptr - -- CUChar. - evpDigestFinalEx ctx (asCUCharBuf mdOut) pOutSize + . initUpdateFinalize mallocEVPMDCtx initialize evpDigestUpdate evpDigestFinalEx + where initialize ctx = evpDigestInitEx ctx md noEngine diff --git a/src/Data/HMAC.hs b/src/Data/HMAC.hs index 8697c20..1850103 100644 --- a/src/Data/HMAC.hs +++ b/src/Data/HMAC.hs @@ -27,7 +27,7 @@ import BTLS.BoringSSL.Base import BTLS.BoringSSL.HMAC import BTLS.BoringSSL.Mem (cryptoMemcmp) import BTLS.BoringSSLPatterns (initUpdateFinalize) -import BTLS.Cast (asCUCharBuf) +import BTLS.Buffer (unsafeUseAsCUStringLen) import BTLS.Types (Algorithm(Algorithm), Digest(Digest), SecretKey(SecretKey)) type LazyByteString = ByteString.Lazy.ByteString @@ -51,14 +51,8 @@ hmac :: Algorithm -> SecretKey -> LazyByteString -> HMAC hmac (Algorithm md) (SecretKey key) = HMAC . unsafeLocalState - . initUpdateFinalize mallocHMACCtx initialize update finalize + . initUpdateFinalize mallocHMACCtx initialize hmacUpdate hmacFinal where initialize ctx = - ByteString.unsafeUseAsCStringLen key $ \(keyBytes, keySize) -> - hmacInitEx ctx keyBytes (fromIntegral keySize) md noEngine - - -- initUpdateFinalize deals with buffers that are 'Ptr CChar'. However, - -- BoringSSL's HMAC functions deal with buffers that are 'Ptr CUChar'. As - -- in Data.Digest, we'll let Haskell reinterpret-cast the buffers. - update ctx buf len = hmacUpdate ctx (asCUCharBuf buf) len - finalize ctx hmacOut pOutSize = hmacFinal ctx (asCUCharBuf hmacOut) pOutSize + unsafeUseAsCUStringLen key $ \(keyBytes, keySize) -> + hmacInitEx ctx keyBytes keySize md noEngine -- cgit v1.2.3