packages feed

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 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)      ]