saltine 0.0.0.6 → 0.0.1.0
raw patch · 3 files changed
+65/−4 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Crypto.Saltine.Core.Sign: signDetached :: SecretKey -> ByteString -> ByteString
+ Crypto.Saltine.Core.Sign: signVerifyDetached :: PublicKey -> ByteString -> ByteString -> Bool
Files
- saltine.cabal +2/−2
- src/Crypto/Saltine/Core/Sign.hs +54/−1
- tests/SignProperties.hs +9/−1
saltine.cabal view
@@ -1,5 +1,5 @@ name: saltine-version: 0.0.0.6+version: 0.0.1.0 synopsis: Cryptography that's easy to digest (NaCl/libsodium bindings). description: @@ -70,7 +70,7 @@ SignProperties StreamProperties Util- ghc-options: -Wall -threaded -O0 -rtsopts+ ghc-options: -Wall -threaded -rtsopts hs-source-dirs: tests default-language: Haskell2010 build-depends:
src/Crypto/Saltine/Core/Sign.hs view
@@ -28,7 +28,8 @@ module Crypto.Saltine.Core.Sign ( SecretKey, PublicKey, Keypair, newKeypair,- sign, signOpen+ sign, signOpen,+ signDetached, signVerifyDetached ) where import Crypto.Saltine.Class@@ -116,7 +117,36 @@ _ -> return Nothing where smlen = S.length sm +-- | Returns just the signature for a message using a SecretKey.+signDetached :: SecretKey+ -> ByteString+ -- ^ Message+ -> ByteString+ -- ^ Signature+signDetached (SK k) m = unsafePerformIO $+ alloca $ \psmlen -> do+ (_err, sm) <- buildUnsafeCVector' Bytes.sign $ \sigbuf ->+ constVectors [k, m] $ \[(pk, _), (pm, _)] ->+ c_sign_detached sigbuf psmlen pm (fromIntegral len) pk+ smlen <- peek psmlen+ return $ S.take (fromIntegral smlen) sm+ where len = S.length m +-- | Returns @True@ if the signature is valid for the given public key and+-- message.+signVerifyDetached :: PublicKey+ -> ByteString+ -- ^ Signature+ -> ByteString+ -- ^ Message+ -> Bool+signVerifyDetached (PK k) sig sm = unsafePerformIO $+ constVectors [k, sig, sm] $ \[(pk, _), (psig, _), (psm, _)] -> do+ res <- c_sign_verify_detached psig psm (fromIntegral len) pk+ return (res == 0)+ where len = S.length sm++ foreign import ccall "crypto_sign_keypair" c_sign_keypair :: Ptr CChar -- ^ Public key output buffer@@ -152,3 +182,26 @@ -- ^ Public key buffer -> IO CInt -- ^ 0 if signature is verifiable, -1 otherwise++foreign import ccall "crypto_sign_detached"+ c_sign_detached :: Ptr CChar+ -- ^ Signature output buffer+ -> Ptr CULLong+ -- ^ Length of the signature+ -> Ptr CChar+ -- ^ Constant message buffer+ -> CULLong+ -- ^ Length of message buffer+ -> Ptr CChar+ -- ^ Constant secret key buffer+ -> IO CInt+foreign import ccall "crypto_sign_verify_detached"+ c_sign_verify_detached :: Ptr CChar+ -- ^ Signature buffer+ -> Ptr CChar+ -- ^ Constant signed message buffer+ -> CULLong+ -- ^ Length of signed message buffer+ -> Ptr CChar+ -- ^ Public key buffer+ -> IO CInt
tests/SignProperties.hs view
@@ -22,10 +22,18 @@ testProperty "Verifies signed message" $ \(Message bs) -> signOpen pk1 (sign sk1 bs) == Just bs, + testProperty "Verifies signed message w/ detached signature"+ $ \(Message bs) -> signVerifyDetached pk1 (signDetached sk1 bs) bs,+ testProperty "Signed message longer than message" $ \(Message bs) -> S.length (sign sk1 bs) >= S.length bs, testProperty "Rejects message with mismatched key"- $ \(Message bs) -> not (S.null bs) ==> signOpen pk2 (sign sk1 bs) == Nothing+ $ \(Message bs) -> not (S.null bs) ==>+ signOpen pk2 (sign sk1 bs) == Nothing,++ testProperty "Rejects message with mismatched key w/ detached signature"+ $ \(Message bs) -> not (S.null bs) ==>+ not (signVerifyDetached pk2 (sign sk1 bs) bs) ]