aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Benjamin Barenblat <bbaren@google.com>2018-09-25 18:13:26 -0400
committerGravatar Benjamin Barenblat <bbaren@google.com>2018-09-25 18:13:26 -0400
commit100fc7dc0c7ce85aad0e413b97a90b98185326ef (patch)
tree4a4fc7e8bc296b0069166fea55fe9456fa994cb0 /src
parenta643f96bd1b8048a08277f7992ca7d43ee2423c3 (diff)
Give `Algorithm` a `Show` instance
Diffstat (limited to 'src')
-rw-r--r--src/BTLS/BoringSSL/Digest.chs3
-rw-r--r--src/BTLS/BoringSSL/Obj.chs23
-rw-r--r--src/BTLS/Types.hs14
3 files changed, 39 insertions, 1 deletions
diff --git a/src/BTLS/BoringSSL/Digest.chs b/src/BTLS/BoringSSL/Digest.chs
index c919125..793cc68 100644
--- a/src/BTLS/BoringSSL/Digest.chs
+++ b/src/BTLS/BoringSSL/Digest.chs
@@ -19,6 +19,7 @@ module BTLS.BoringSSL.Digest
, mallocEVPMDCtx
, evpDigestInitEx, evpDigestUpdate, evpDigestFinalEx
, evpMaxMDSize
+ , evpMDType
) where
import Data.ByteString (ByteString)
@@ -63,6 +64,8 @@ foreign import ccall "&btlsFinalizeEVPMDCtx"
evpMaxMDSize :: Int
evpMaxMDSize = {#const EVP_MAX_MD_SIZE#}
+{#fun pure EVP_MD_type as evpMDType {`Ptr EVPMD'} -> `Int'#}
+
instance Storable EVPMDCtx where
sizeOf _ = {#sizeof EVP_MD_CTX#}
alignment _ = {#alignof EVP_MD_CTX#}
diff --git a/src/BTLS/BoringSSL/Obj.chs b/src/BTLS/BoringSSL/Obj.chs
new file mode 100644
index 0000000..a337ad5
--- /dev/null
+++ b/src/BTLS/BoringSSL/Obj.chs
@@ -0,0 +1,23 @@
+-- Copyright 2018 Google LLC
+--
+-- Licensed under the Apache License, Version 2.0 (the "License"); you may not
+-- use this file except in compliance with the License. You may obtain a copy of
+-- the License at
+--
+-- https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+-- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+-- License for the specific language governing permissions and limitations under
+-- the License.
+
+module BTLS.BoringSSL.Obj
+ ( objNID2SN
+ ) where
+
+import Foreign.C (CString)
+
+#include <openssl/obj.h>
+
+{#fun pure OBJ_nid2sn as objNID2SN {`Int'} -> `CString'#}
diff --git a/src/BTLS/Types.hs b/src/BTLS/Types.hs
index 4a4e518..6abd632 100644
--- a/src/BTLS/Types.hs
+++ b/src/BTLS/Types.hs
@@ -18,13 +18,25 @@ import Data.ByteString (ByteString)
import qualified Data.ByteString as ByteString
import qualified Data.ByteString.Base16 as ByteString.Base16
import qualified Data.ByteString.Char8 as ByteString.Char8
-import Foreign (Ptr)
+import Foreign (Ptr, nullPtr)
+import Foreign.C (peekCString)
+import Foreign.Marshal.Unsafe (unsafeLocalState)
import BTLS.BoringSSL.Base (EVPMD)
+import BTLS.BoringSSL.Digest (evpMDType)
+import BTLS.BoringSSL.Obj (objNID2SN)
-- | A cryptographic hash function.
newtype Algorithm = Algorithm (Ptr EVPMD)
+instance Eq Algorithm where
+ Algorithm a == Algorithm b = evpMDType a == evpMDType b
+
+instance Show Algorithm where
+ show (Algorithm md) =
+ let sn = objNID2SN (evpMDType md) in
+ if sn == nullPtr then "<algorithm>" else unsafeLocalState (peekCString sn)
+
-- | Context or application-specific information. Equality comparisons on this
-- type are variable-time.
newtype AssociatedData = AssociatedData ByteString