packages feed

libsecp256k1 0.0.2 → 0.0.3

raw patch · 2 files changed

+79/−11 lines, 2 filesdep −cryptonitePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies removed: cryptonite

API changes (from Hackage documentation)

+ Crypto.Secp256k1: instance GHC.Classes.Eq Crypto.Secp256k1.KeyPair
+ Crypto.Secp256k1: instance GHC.Classes.Eq Crypto.Secp256k1.PubKeyXO
+ Crypto.Secp256k1: instance GHC.Classes.Eq Crypto.Secp256k1.PubKeyXY
+ Crypto.Secp256k1: instance GHC.Classes.Eq Crypto.Secp256k1.RecoverableSignature
+ Crypto.Secp256k1: instance GHC.Classes.Eq Crypto.Secp256k1.SecKey
+ Crypto.Secp256k1: instance GHC.Classes.Eq Crypto.Secp256k1.Signature
+ Crypto.Secp256k1: instance GHC.Classes.Eq Crypto.Secp256k1.Tweak
+ Crypto.Secp256k1: instance GHC.Classes.Ord Crypto.Secp256k1.PubKeyXO
+ Crypto.Secp256k1: instance GHC.Classes.Ord Crypto.Secp256k1.PubKeyXY
+ Crypto.Secp256k1: instance GHC.Classes.Ord Crypto.Secp256k1.SecKey
+ Crypto.Secp256k1: instance GHC.Classes.Ord Crypto.Secp256k1.Tweak
- Crypto.Secp256k1: ecdh :: SecKey -> PubKeyXY -> Digest SHA256
+ Crypto.Secp256k1: ecdh :: SecKey -> PubKeyXY -> SizedByteArray 32 ByteString
- Crypto.Secp256k1: taggedSha256 :: ByteString -> ByteString -> Digest SHA256
+ Crypto.Secp256k1: taggedSha256 :: ByteString -> ByteString -> SizedByteArray 32 ByteString

Files

libsecp256k1.cabal view
@@ -1,11 +1,11 @@-cabal-version: 2.0+cabal-version: 1.12  -- This file has been generated from package.yaml by hpack version 0.34.4. -- -- see: https://github.com/sol/hpack  name:           libsecp256k1-version:        0.0.2+version:        0.0.3 synopsis:       Bindings for secp256k1 description:    Sign and verify signatures using the secp256k1 library. category:       Crypto@@ -30,8 +30,7 @@       Crypto.Secp256k1       Crypto.Secp256k1.Internal       Crypto.Secp256k1.Prim-      Paths_libsecp256k1-  autogen-modules:+  other-modules:       Paths_libsecp256k1   hs-source-dirs:       src@@ -40,7 +39,6 @@   build-depends:       base >=4.9 && <5     , bytestring >=0.10.8 && <0.12-    , cryptonite     , memory     , transformers   default-language: Haskell2010@@ -59,7 +57,6 @@       HUnit     , base >=4.9 && <5     , bytestring >=0.10.8 && <0.12-    , cryptonite     , hspec     , memory     , monad-par
src/Crypto/Secp256k1.hs view
@@ -100,8 +100,8 @@  -- import Data.String.Conversions (ConvertibleStrings, cs) -import Crypto.Hash (Digest, SHA256, digestFromByteString) import Data.Foldable (for_)+import Data.Memory.PtrMethods (memCompare) import Foreign (     Bits (..),     ForeignPtr,@@ -148,12 +148,83 @@   newtype SecKey = SecKey {secKeyFPtr :: ForeignPtr Prim.Seckey32}+instance Eq SecKey where+    sk == sk' = unsafePerformIO . evalContT $ do+        skp <- ContT $ withForeignPtr (secKeyFPtr sk)+        skp' <- ContT $ withForeignPtr (secKeyFPtr sk')+        (EQ ==) <$> lift (memCompare (castPtr skp) (castPtr skp') 32)+instance Ord SecKey where+    sk `compare` sk' = unsafePerformIO . evalContT $ do+        skp <- ContT $ withForeignPtr (secKeyFPtr sk)+        skp' <- ContT $ withForeignPtr (secKeyFPtr sk')+        lift (memCompare (castPtr skp) (castPtr skp') 32)++ newtype PubKeyXY = PubKeyXY {pubKeyXYFPtr :: ForeignPtr Prim.Pubkey64}+instance Eq PubKeyXY where+    pk == pk' = unsafePerformIO . evalContT $ do+        pkp <- ContT . withForeignPtr . pubKeyXYFPtr $ pk+        pkp' <- ContT . withForeignPtr . pubKeyXYFPtr $ pk'+        res <- lift (Prim.ecPubkeyCmp ctx pkp pkp')+        pure $ res == 0+instance Ord PubKeyXY where+    pk `compare` pk' = unsafePerformIO . evalContT $ do+        pkp <- ContT . withForeignPtr . pubKeyXYFPtr $ pk+        pkp' <- ContT . withForeignPtr . pubKeyXYFPtr $ pk'+        res <- lift (Prim.ecPubkeyCmp ctx pkp pkp')+        pure $ compare res 0++ newtype PubKeyXO = PubKeyXO {pubKeyXOFPtr :: ForeignPtr Prim.XonlyPubkey64}+instance Eq PubKeyXO where+    pk == pk' = unsafePerformIO . evalContT $ do+        pkp <- ContT . withForeignPtr . pubKeyXOFPtr $ pk+        pkp' <- ContT . withForeignPtr . pubKeyXOFPtr $ pk'+        res <- lift (Prim.xonlyPubkeyCmp ctx pkp pkp')+        pure $ res == 0+instance Ord PubKeyXO where+    pk `compare` pk' = unsafePerformIO . evalContT $ do+        pkp <- ContT . withForeignPtr . pubKeyXOFPtr $ pk+        pkp' <- ContT . withForeignPtr . pubKeyXOFPtr $ pk'+        res <- lift (Prim.xonlyPubkeyCmp ctx pkp pkp')+        pure $ compare res 0++ newtype KeyPair = KeyPair {keyPairFPtr :: ForeignPtr Prim.Keypair96}+instance Eq KeyPair where+    kp == kp' = unsafePerformIO . evalContT $ do+        kpp <- ContT $ withForeignPtr (keyPairFPtr kp)+        kpp' <- ContT $ withForeignPtr (keyPairFPtr kp')+        (EQ ==) <$> lift (memCompare (castPtr kpp) (castPtr kpp') 32)++ newtype Signature = Signature {signatureFPtr :: ForeignPtr Prim.Sig64}+instance Eq Signature where+    sig == sig' = unsafePerformIO . evalContT $ do+        sigp <- ContT $ withForeignPtr (signatureFPtr sig)+        sigp' <- ContT $ withForeignPtr (signatureFPtr sig')+        (EQ ==) <$> lift (memCompare (castPtr sigp) (castPtr sigp') 32)++ newtype RecoverableSignature = RecoverableSignature {recoverableSignatureFPtr :: ForeignPtr Prim.RecSig65}+instance Eq RecoverableSignature where+    rs == rs' = unsafePerformIO . evalContT $ do+        rsp <- ContT $ withForeignPtr (recoverableSignatureFPtr rs)+        rsp' <- ContT $ withForeignPtr (recoverableSignatureFPtr rs')+        (EQ ==) <$> lift (memCompare (castPtr rsp) (castPtr rsp') 32)++ newtype Tweak = Tweak {tweakFPtr :: ForeignPtr Prim.Tweak32}+instance Eq Tweak where+    sk == sk' = unsafePerformIO . evalContT $ do+        skp <- ContT $ withForeignPtr (tweakFPtr sk)+        skp' <- ContT $ withForeignPtr (tweakFPtr sk')+        (EQ ==) <$> lift (memCompare (castPtr skp) (castPtr skp') 32)+instance Ord Tweak where+    sk `compare` sk' = unsafePerformIO . evalContT $ do+        skp <- ContT $ withForeignPtr (tweakFPtr sk)+        skp' <- ContT $ withForeignPtr (tweakFPtr sk')+        lift (memCompare (castPtr skp) (castPtr skp') 32)   -- | Preinitialized context for signing and verification@@ -378,7 +449,7 @@  -- | Compute a shared secret using ECDH and SHA256. This algorithm uses your own 'SecKey', your counterparty's 'PubKeyXY' -- and results in a 32 byte SHA256 Digest.-ecdh :: SecKey -> PubKeyXY -> Digest SHA256+ecdh :: SecKey -> PubKeyXY -> SizedByteArray 32 ByteString ecdh SecKey{..} PubKeyXY{..} = unsafePerformIO . evalContT $ do     outBuf <- lift (mallocBytes 32)     sk <- ContT (withForeignPtr secKeyFPtr)@@ -387,7 +458,7 @@     if isSuccess ret         then do             bs <- lift $ unsafePackByteString (outBuf, 32)-            let Just digest = digestFromByteString bs+            let Just digest = sizedByteArray bs             pure digest         else lift (free outBuf) *> error "Bug: Invalid Scalar or Overflow" @@ -573,7 +644,7 @@   -- | Generate a tagged sha256 digest as specified in BIP340-taggedSha256 :: ByteString -> ByteString -> Digest SHA256+taggedSha256 :: ByteString -> ByteString -> SizedByteArray 32 ByteString taggedSha256 tag msg = unsafePerformIO . evalContT $ do     (tagBuf, tagLen) <- ContT (unsafeUseByteString tag)     (msgBuf, msgLen) <- ContT (unsafeUseByteString msg)@@ -584,7 +655,7 @@             free hashBuf             error "Bug: Invalid use of C Lib"         bs <- unsafePackByteString (hashBuf, 32)-        let Just digest = digestFromByteString bs+        let Just digest = sizedByteArray bs         pure digest