packages feed

libsecp256k1 0.1.5 → 0.2.0

raw patch · 4 files changed

+35/−27 lines, 4 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Crypto.Secp256k1: importSignature :: ByteString -> Maybe Signature
+ Crypto.Secp256k1: importSignatureCompact :: ByteString -> Maybe Signature
+ Crypto.Secp256k1: importSignatureDer :: ByteString -> Maybe Signature

Files

libsecp256k1.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           libsecp256k1-version:        0.1.5+version:        0.2.0 synopsis:       Bindings for secp256k1 description:    Sign and verify signatures using the secp256k1 library. category:       Crypto
src/Crypto/Secp256k1.hs view
@@ -2,7 +2,6 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -35,7 +34,8 @@     exportPubKeyXY,     importPubKeyXO,     exportPubKeyXO,-    importSignature,+    importSignatureCompact,+    importSignatureDer,     exportSignatureCompact,     exportSignatureDer,     importRecoverableSignature,@@ -80,6 +80,7 @@     ecdh, ) where +import Control.Applicative (Alternative (..)) import Control.DeepSeq (NFData (..)) import Control.Monad (replicateM, unless, (<=<)) import Control.Monad.Trans.Class (lift)@@ -255,7 +256,7 @@     kp == kp' = unsafePerformIO . evalContT $ do         kpp <- ContT $ withForeignPtr (keyPairFPtr kp)         kpp' <- ContT $ withForeignPtr (keyPairFPtr kp')-        (EQ ==) <$> lift (memCompare (castPtr kpp) (castPtr kpp') 32)+        (EQ ==) <$> lift (memCompare (castPtr kpp) (castPtr kpp') 96) instance NFData KeyPair where     rnf KeyPair{..} = seq keyPairFPtr () @@ -269,7 +270,7 @@ instance Read Signature where     readsPrec i cs = case decodeBase16 $ B8.pack token of         Left e -> []-        Right a -> maybeToList $ (,rest) <$> importSignature a+        Right a -> maybeToList $ (,rest) <$> (importSignatureCompact a <|> importSignatureDer a)         where             trimmed = dropWhile isSpace cs             (token, rest) = span isAlphaNum trimmed@@ -277,7 +278,7 @@     sig == sig' = unsafePerformIO . evalContT $ do         sigp <- ContT $ withForeignPtr (signatureFPtr sig)         sigp' <- ContT $ withForeignPtr (signatureFPtr sig')-        (EQ ==) <$> lift (memCompare (castPtr sigp) (castPtr sigp') 32)+        (EQ ==) <$> lift (memCompare (castPtr sigp) (castPtr sigp') 64) instance NFData Signature where     rnf Signature{..} = seq signatureFPtr () @@ -299,7 +300,7 @@     rs == rs' = unsafePerformIO . evalContT $ do         rsp <- ContT $ withForeignPtr (recoverableSignatureFPtr rs)         rsp' <- ContT $ withForeignPtr (recoverableSignatureFPtr rs')-        (EQ ==) <$> lift (memCompare (castPtr rsp) (castPtr rsp') 32)+        (EQ ==) <$> lift (memCompare (castPtr rsp) (castPtr rsp') 65) instance NFData RecoverableSignature where     rnf RecoverableSignature{..} = seq recoverableSignatureFPtr () @@ -414,24 +415,33 @@     unsafePackByteString (outBuf, 32)  --- | Parses 'Signature' from DER (71 | 72 | 73 bytes) or Compact (64 bytes) representations.-importSignature :: ByteString -> Maybe Signature-importSignature bs = unsafePerformIO $+-- | Parses 'Signature' from Compact (64 bytes) representation.+importSignatureCompact :: ByteString -> Maybe Signature+importSignatureCompact bs = unsafePerformIO $     unsafeUseByteString bs $ \(inBuf, len) -> do         outBuf <- mallocBytes 64         ret <--            if+            if len == 64                 -- compact-                | len == 64 -> Prim.ecdsaSignatureParseCompact ctx outBuf inBuf-                -- der-                | len >= 69 && len <= 73 -> Prim.ecdsaSignatureParseDer ctx outBuf inBuf len+                then Prim.ecdsaSignatureParseCompact ctx outBuf inBuf                 -- invalid-                | otherwise -> pure 0+                else pure 0         if isSuccess ret             then Just . Signature <$> newForeignPtr finalizerFree outBuf             else free outBuf $> Nothing  +-- | Parses 'Signature' from DER representation.+importSignatureDer :: ByteString -> Maybe Signature+importSignatureDer bs = unsafePerformIO $+    unsafeUseByteString bs $ \(inBuf, len) -> do+        outBuf <- mallocBytes 64+        ret <- Prim.ecdsaSignatureParseDer ctx outBuf inBuf len+        if isSuccess ret+            then Just . Signature <$> newForeignPtr finalizerFree outBuf+            else pure Nothing++ -- | Serializes 'Signature' to Compact (64 byte) representation exportSignatureCompact :: Signature -> ByteString exportSignatureCompact (Signature fptr) = unsafePerformIO $ do@@ -843,7 +853,3 @@         tweakPtr <- ContT (withForeignPtr tweakFPtr)         let parityInt = if parity then 1 else 0         lift $ isSuccess <$> Prim.xonlyPubkeyTweakAddCheck ctx tweakedPtr parityInt origPtr tweakPtr---foreign import ccall "wrapper"-    mkNonceFunHardened :: Prim.NonceFunHardened a -> IO (FunPtr (Prim.NonceFunHardened a))
test/Crypto/Secp256k1Prop.hs view
@@ -123,7 +123,8 @@     let serialized = export sig     annotateShow serialized     annotateShow (BS.length serialized)-    case importSignature serialized of+    let parse = if exportDer then importSignatureDer else importSignatureCompact+    case parse serialized of         Nothing -> failure         Just x -> x === sig @@ -185,12 +186,12 @@     msg <- forAll $ bytes (singleton 32)     sig <- maybe failure pure $ ecdsaSign sk msg     useDer <- forAll enumBounded-    let export =+    let (serialize, parse) =             if useDer-                then exportSignatureDer-                else exportSignatureCompact-    let serialized = export sig-    let parsed = fromJust (importSignature serialized)+                then (exportSignatureDer, importSignatureDer)+                else (exportSignatureCompact, importSignatureCompact)+    let serialized = serialize sig+    let parsed = fromJust (parse serialized)     assert $ ecdsaVerify msg (derivePubKey sk) parsed  
test/Crypto/Secp256k1Spec.hs view
@@ -3,6 +3,7 @@ import Control.Monad.Par qualified as P import Crypto.Secp256k1 import Crypto.Secp256k1.Internal+import Data.ByteArray.Encoding (Base (Base16), convertFromBase) import Data.ByteString qualified as BS import Data.ByteString.Char8 qualified as B8 import Data.Either (fromRight)@@ -69,7 +70,7 @@  serializeSigTest :: (BS.ByteString, SecKey) -> Bool serializeSigTest (fm, fk) =-    (fg >>= importSignature . exportSignatureDer) == fg && isJust fg+    (fg >>= importSignatureDer . exportSignatureDer) == fg && isJust fg     where         fg = ecdsaSign fk fm @@ -82,7 +83,7 @@  serializeCompactSigTest :: (BS.ByteString, SecKey) -> Bool serializeCompactSigTest (fm, fk) =-    (fg >>= importSignature . exportSignatureCompact) == fg && isJust fg+    (fg >>= importSignatureCompact . exportSignatureCompact) == fg && isJust fg     where         fg = ecdsaSign fk fm