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 +1/−1
- src/Crypto/Secp256k1.hs +24/−18
- test/Crypto/Secp256k1Prop.hs +7/−6
- test/Crypto/Secp256k1Spec.hs +3/−2
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