packages feed

saltine 0.2.1.0 → 0.2.2.0

raw patch · 10 files changed

+133/−22 lines, 10 filesdep ~bytestringdep ~deepseqdep ~textPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: bytestring, deepseq, text

API changes (from Hackage documentation)

- Crypto.Saltine.Internal.AEAD.AES256GCM: instance Data.Data.Data Crypto.Saltine.Internal.AEAD.AES256GCM.Key
- Crypto.Saltine.Internal.AEAD.AES256GCM: instance Data.Data.Data Crypto.Saltine.Internal.AEAD.AES256GCM.Nonce
- Crypto.Saltine.Internal.AEAD.AES256GCM: instance GHC.Generics.Generic Crypto.Saltine.Internal.AEAD.AES256GCM.Key
- Crypto.Saltine.Internal.AEAD.AES256GCM: instance GHC.Generics.Generic Crypto.Saltine.Internal.AEAD.AES256GCM.Nonce
- Crypto.Saltine.Internal.AEAD.AES256GCM: instance GHC.Show.Show Crypto.Saltine.Internal.AEAD.AES256GCM.Key
- Crypto.Saltine.Internal.AEAD.AES256GCM: instance GHC.Show.Show Crypto.Saltine.Internal.AEAD.AES256GCM.Nonce
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance Data.Data.Data Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Key
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance Data.Data.Data Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Nonce
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance GHC.Generics.Generic Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Key
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance GHC.Generics.Generic Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Nonce
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance GHC.Show.Show Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Key
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance GHC.Show.Show Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Nonce
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance Data.Data.Data Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Key
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance Data.Data.Data Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Nonce
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance GHC.Generics.Generic Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Key
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance GHC.Generics.Generic Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Nonce
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance GHC.Show.Show Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Key
- Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance GHC.Show.Show Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Nonce
- Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance Data.Data.Data Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Key
- Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance Data.Data.Data Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Nonce
- Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance GHC.Generics.Generic Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Key
- Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance GHC.Generics.Generic Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Nonce
- Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance GHC.Show.Show Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Key
- Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance GHC.Show.Show Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Nonce
- Crypto.Saltine.Internal.Auth: instance Data.Data.Data Crypto.Saltine.Internal.Auth.Authenticator
- Crypto.Saltine.Internal.Auth: instance Data.Data.Data Crypto.Saltine.Internal.Auth.Key
- Crypto.Saltine.Internal.Auth: instance GHC.Generics.Generic Crypto.Saltine.Internal.Auth.Authenticator
- Crypto.Saltine.Internal.Auth: instance GHC.Generics.Generic Crypto.Saltine.Internal.Auth.Key
- Crypto.Saltine.Internal.Auth: instance GHC.Show.Show Crypto.Saltine.Internal.Auth.Authenticator
- Crypto.Saltine.Internal.Auth: instance GHC.Show.Show Crypto.Saltine.Internal.Auth.Key
- Crypto.Saltine.Internal.Box: instance Data.Data.Data Crypto.Saltine.Internal.Box.CombinedKey
- Crypto.Saltine.Internal.Box: instance Data.Data.Data Crypto.Saltine.Internal.Box.Keypair
- Crypto.Saltine.Internal.Box: instance Data.Data.Data Crypto.Saltine.Internal.Box.Nonce
- Crypto.Saltine.Internal.Box: instance Data.Data.Data Crypto.Saltine.Internal.Box.PublicKey
- Crypto.Saltine.Internal.Box: instance Data.Data.Data Crypto.Saltine.Internal.Box.SecretKey
- Crypto.Saltine.Internal.Box: instance GHC.Generics.Generic Crypto.Saltine.Internal.Box.CombinedKey
- Crypto.Saltine.Internal.Box: instance GHC.Generics.Generic Crypto.Saltine.Internal.Box.Keypair
- Crypto.Saltine.Internal.Box: instance GHC.Generics.Generic Crypto.Saltine.Internal.Box.Nonce
- Crypto.Saltine.Internal.Box: instance GHC.Generics.Generic Crypto.Saltine.Internal.Box.PublicKey
- Crypto.Saltine.Internal.Box: instance GHC.Generics.Generic Crypto.Saltine.Internal.Box.SecretKey
- Crypto.Saltine.Internal.Box: instance GHC.Show.Show Crypto.Saltine.Internal.Box.CombinedKey
- Crypto.Saltine.Internal.Box: instance GHC.Show.Show Crypto.Saltine.Internal.Box.Keypair
- Crypto.Saltine.Internal.Box: instance GHC.Show.Show Crypto.Saltine.Internal.Box.Nonce
- Crypto.Saltine.Internal.Box: instance GHC.Show.Show Crypto.Saltine.Internal.Box.PublicKey
- Crypto.Saltine.Internal.Box: instance GHC.Show.Show Crypto.Saltine.Internal.Box.SecretKey
- Crypto.Saltine.Internal.Hash: instance Data.Data.Data Crypto.Saltine.Internal.Hash.GenerichashKey
- Crypto.Saltine.Internal.Hash: instance Data.Data.Data Crypto.Saltine.Internal.Hash.GenerichashOutLen
- Crypto.Saltine.Internal.Hash: instance Data.Data.Data Crypto.Saltine.Internal.Hash.ShorthashKey
- Crypto.Saltine.Internal.Hash: instance GHC.Generics.Generic Crypto.Saltine.Internal.Hash.GenerichashKey
- Crypto.Saltine.Internal.Hash: instance GHC.Generics.Generic Crypto.Saltine.Internal.Hash.GenerichashOutLen
- Crypto.Saltine.Internal.Hash: instance GHC.Generics.Generic Crypto.Saltine.Internal.Hash.ShorthashKey
- Crypto.Saltine.Internal.Hash: instance GHC.Show.Show Crypto.Saltine.Internal.Hash.GenerichashKey
- Crypto.Saltine.Internal.Hash: instance GHC.Show.Show Crypto.Saltine.Internal.Hash.ShorthashKey
- Crypto.Saltine.Internal.OneTimeAuth: instance Data.Data.Data Crypto.Saltine.Internal.OneTimeAuth.Authenticator
- Crypto.Saltine.Internal.OneTimeAuth: instance Data.Data.Data Crypto.Saltine.Internal.OneTimeAuth.Key
- Crypto.Saltine.Internal.OneTimeAuth: instance GHC.Generics.Generic Crypto.Saltine.Internal.OneTimeAuth.Authenticator
- Crypto.Saltine.Internal.OneTimeAuth: instance GHC.Generics.Generic Crypto.Saltine.Internal.OneTimeAuth.Key
- Crypto.Saltine.Internal.OneTimeAuth: instance GHC.Show.Show Crypto.Saltine.Internal.OneTimeAuth.Authenticator
- Crypto.Saltine.Internal.OneTimeAuth: instance GHC.Show.Show Crypto.Saltine.Internal.OneTimeAuth.Key
- Crypto.Saltine.Internal.Password: instance Data.Data.Data Crypto.Saltine.Internal.Password.Algorithm
- Crypto.Saltine.Internal.Password: instance Data.Data.Data Crypto.Saltine.Internal.Password.Memlimit
- Crypto.Saltine.Internal.Password: instance Data.Data.Data Crypto.Saltine.Internal.Password.Opslimit
- Crypto.Saltine.Internal.Password: instance Data.Data.Data Crypto.Saltine.Internal.Password.PasswordHash
- Crypto.Saltine.Internal.Password: instance Data.Data.Data Crypto.Saltine.Internal.Password.Policy
- Crypto.Saltine.Internal.Password: instance Data.Data.Data Crypto.Saltine.Internal.Password.Salt
- Crypto.Saltine.Internal.Password: instance GHC.Enum.Bounded Crypto.Saltine.Internal.Password.Algorithm
- Crypto.Saltine.Internal.Password: instance GHC.Enum.Enum Crypto.Saltine.Internal.Password.Algorithm
- Crypto.Saltine.Internal.Password: instance GHC.Generics.Generic Crypto.Saltine.Internal.Password.Algorithm
- Crypto.Saltine.Internal.Password: instance GHC.Generics.Generic Crypto.Saltine.Internal.Password.Memlimit
- Crypto.Saltine.Internal.Password: instance GHC.Generics.Generic Crypto.Saltine.Internal.Password.Opslimit
- Crypto.Saltine.Internal.Password: instance GHC.Generics.Generic Crypto.Saltine.Internal.Password.PasswordHash
- Crypto.Saltine.Internal.Password: instance GHC.Generics.Generic Crypto.Saltine.Internal.Password.Policy
- Crypto.Saltine.Internal.Password: instance GHC.Generics.Generic Crypto.Saltine.Internal.Password.Salt
- Crypto.Saltine.Internal.Password: instance GHC.Show.Show Crypto.Saltine.Internal.Password.Algorithm
- Crypto.Saltine.Internal.Password: instance GHC.Show.Show Crypto.Saltine.Internal.Password.Memlimit
- Crypto.Saltine.Internal.Password: instance GHC.Show.Show Crypto.Saltine.Internal.Password.Opslimit
- Crypto.Saltine.Internal.Password: instance GHC.Show.Show Crypto.Saltine.Internal.Password.PasswordHash
- Crypto.Saltine.Internal.Password: instance GHC.Show.Show Crypto.Saltine.Internal.Password.Policy
- Crypto.Saltine.Internal.Password: instance GHC.Show.Show Crypto.Saltine.Internal.Password.Salt
- Crypto.Saltine.Internal.ScalarMult: instance Data.Data.Data Crypto.Saltine.Internal.ScalarMult.GroupElement
- Crypto.Saltine.Internal.ScalarMult: instance Data.Data.Data Crypto.Saltine.Internal.ScalarMult.Scalar
- Crypto.Saltine.Internal.ScalarMult: instance GHC.Generics.Generic Crypto.Saltine.Internal.ScalarMult.GroupElement
- Crypto.Saltine.Internal.ScalarMult: instance GHC.Generics.Generic Crypto.Saltine.Internal.ScalarMult.Scalar
- Crypto.Saltine.Internal.ScalarMult: instance GHC.Show.Show Crypto.Saltine.Internal.ScalarMult.GroupElement
- Crypto.Saltine.Internal.ScalarMult: instance GHC.Show.Show Crypto.Saltine.Internal.ScalarMult.Scalar
- Crypto.Saltine.Internal.SecretBox: instance Data.Data.Data Crypto.Saltine.Internal.SecretBox.Authenticator
- Crypto.Saltine.Internal.SecretBox: instance Data.Data.Data Crypto.Saltine.Internal.SecretBox.Key
- Crypto.Saltine.Internal.SecretBox: instance Data.Data.Data Crypto.Saltine.Internal.SecretBox.Nonce
- Crypto.Saltine.Internal.SecretBox: instance GHC.Generics.Generic Crypto.Saltine.Internal.SecretBox.Authenticator
- Crypto.Saltine.Internal.SecretBox: instance GHC.Generics.Generic Crypto.Saltine.Internal.SecretBox.Key
- Crypto.Saltine.Internal.SecretBox: instance GHC.Generics.Generic Crypto.Saltine.Internal.SecretBox.Nonce
- Crypto.Saltine.Internal.SecretBox: instance GHC.Show.Show Crypto.Saltine.Internal.SecretBox.Authenticator
- Crypto.Saltine.Internal.SecretBox: instance GHC.Show.Show Crypto.Saltine.Internal.SecretBox.Key
- Crypto.Saltine.Internal.SecretBox: instance GHC.Show.Show Crypto.Saltine.Internal.SecretBox.Nonce
- Crypto.Saltine.Internal.Sign: instance Data.Data.Data Crypto.Saltine.Internal.Sign.Keypair
- Crypto.Saltine.Internal.Sign: instance Data.Data.Data Crypto.Saltine.Internal.Sign.PublicKey
- Crypto.Saltine.Internal.Sign: instance Data.Data.Data Crypto.Saltine.Internal.Sign.SecretKey
- Crypto.Saltine.Internal.Sign: instance Data.Data.Data Crypto.Saltine.Internal.Sign.Signature
- Crypto.Saltine.Internal.Sign: instance GHC.Generics.Generic Crypto.Saltine.Internal.Sign.Keypair
- Crypto.Saltine.Internal.Sign: instance GHC.Generics.Generic Crypto.Saltine.Internal.Sign.PublicKey
- Crypto.Saltine.Internal.Sign: instance GHC.Generics.Generic Crypto.Saltine.Internal.Sign.SecretKey
- Crypto.Saltine.Internal.Sign: instance GHC.Generics.Generic Crypto.Saltine.Internal.Sign.Signature
- Crypto.Saltine.Internal.Sign: instance GHC.Show.Show Crypto.Saltine.Internal.Sign.Keypair
- Crypto.Saltine.Internal.Sign: instance GHC.Show.Show Crypto.Saltine.Internal.Sign.PublicKey
- Crypto.Saltine.Internal.Sign: instance GHC.Show.Show Crypto.Saltine.Internal.Sign.SecretKey
- Crypto.Saltine.Internal.Sign: instance GHC.Show.Show Crypto.Saltine.Internal.Sign.Signature
- Crypto.Saltine.Internal.Stream: instance Data.Data.Data Crypto.Saltine.Internal.Stream.Key
- Crypto.Saltine.Internal.Stream: instance Data.Data.Data Crypto.Saltine.Internal.Stream.Nonce
- Crypto.Saltine.Internal.Stream: instance GHC.Generics.Generic Crypto.Saltine.Internal.Stream.Key
- Crypto.Saltine.Internal.Stream: instance GHC.Generics.Generic Crypto.Saltine.Internal.Stream.Nonce
- Crypto.Saltine.Internal.Stream: instance GHC.Show.Show Crypto.Saltine.Internal.Stream.Key
- Crypto.Saltine.Internal.Stream: instance GHC.Show.Show Crypto.Saltine.Internal.Stream.Nonce
+ Crypto.Saltine.Core.Hash: sha256 :: ByteString -> ByteString
+ Crypto.Saltine.Core.Sign: signPublicKeyToScalarMult :: PublicKey -> Maybe GroupElement
+ Crypto.Saltine.Core.Sign: signSecretKeyToScalarMult :: SecretKey -> Maybe Scalar
+ Crypto.Saltine.Internal.AEAD.AES256GCM: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.AEAD.AES256GCM.Key
+ Crypto.Saltine.Internal.AEAD.AES256GCM: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.AEAD.AES256GCM.Nonce
+ Crypto.Saltine.Internal.AEAD.AES256GCM: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.AEAD.AES256GCM.Key
+ Crypto.Saltine.Internal.AEAD.AES256GCM: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.AEAD.AES256GCM.Nonce
+ Crypto.Saltine.Internal.AEAD.AES256GCM: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.AEAD.AES256GCM.Key
+ Crypto.Saltine.Internal.AEAD.AES256GCM: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.AEAD.AES256GCM.Nonce
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Key
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Nonce
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Key
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Nonce
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Key
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305.Nonce
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Key
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Nonce
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Key
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Nonce
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Key
+ Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.AEAD.ChaCha20Poly1305IETF.Nonce
+ Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Key
+ Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Nonce
+ Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Key
+ Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Nonce
+ Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Key
+ Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.AEAD.XChaCha20Poly1305.Nonce
+ Crypto.Saltine.Internal.Auth: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Auth.Authenticator
+ Crypto.Saltine.Internal.Auth: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Auth.Key
+ Crypto.Saltine.Internal.Auth: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Auth.Authenticator
+ Crypto.Saltine.Internal.Auth: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Auth.Key
+ Crypto.Saltine.Internal.Auth: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Auth.Authenticator
+ Crypto.Saltine.Internal.Auth: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Auth.Key
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Box.CombinedKey
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Box.Keypair
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Box.Nonce
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Box.PublicKey
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Box.SecretKey
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Box.CombinedKey
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Box.Keypair
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Box.Nonce
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Box.PublicKey
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Box.SecretKey
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Box.CombinedKey
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Box.Keypair
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Box.Nonce
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Box.PublicKey
+ Crypto.Saltine.Internal.Box: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Box.SecretKey
+ Crypto.Saltine.Internal.Hash: c_hash_sha256 :: Ptr CChar -> Ptr CChar -> CULLong -> IO CInt
+ Crypto.Saltine.Internal.Hash: hash_sha256_bytes :: Int
+ Crypto.Saltine.Internal.Hash: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Hash.GenerichashKey
+ Crypto.Saltine.Internal.Hash: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Hash.GenerichashOutLen
+ Crypto.Saltine.Internal.Hash: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Hash.ShorthashKey
+ Crypto.Saltine.Internal.Hash: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Hash.GenerichashKey
+ Crypto.Saltine.Internal.Hash: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Hash.GenerichashOutLen
+ Crypto.Saltine.Internal.Hash: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Hash.ShorthashKey
+ Crypto.Saltine.Internal.Hash: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Hash.GenerichashKey
+ Crypto.Saltine.Internal.Hash: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Hash.ShorthashKey
+ Crypto.Saltine.Internal.OneTimeAuth: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.OneTimeAuth.Authenticator
+ Crypto.Saltine.Internal.OneTimeAuth: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.OneTimeAuth.Key
+ Crypto.Saltine.Internal.OneTimeAuth: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.OneTimeAuth.Authenticator
+ Crypto.Saltine.Internal.OneTimeAuth: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.OneTimeAuth.Key
+ Crypto.Saltine.Internal.OneTimeAuth: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.OneTimeAuth.Authenticator
+ Crypto.Saltine.Internal.OneTimeAuth: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.OneTimeAuth.Key
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Password.Algorithm
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Password.Memlimit
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Password.Opslimit
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Password.PasswordHash
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Password.Policy
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Password.Salt
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Enum.Bounded Crypto.Saltine.Internal.Password.Algorithm
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Enum.Enum Crypto.Saltine.Internal.Password.Algorithm
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Password.Algorithm
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Password.Memlimit
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Password.Opslimit
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Password.PasswordHash
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Password.Policy
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Password.Salt
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Password.Algorithm
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Password.Memlimit
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Password.Opslimit
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Password.PasswordHash
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Password.Policy
+ Crypto.Saltine.Internal.Password: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Password.Salt
+ Crypto.Saltine.Internal.ScalarMult: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.ScalarMult.GroupElement
+ Crypto.Saltine.Internal.ScalarMult: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.ScalarMult.Scalar
+ Crypto.Saltine.Internal.ScalarMult: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.ScalarMult.GroupElement
+ Crypto.Saltine.Internal.ScalarMult: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.ScalarMult.Scalar
+ Crypto.Saltine.Internal.ScalarMult: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.ScalarMult.GroupElement
+ Crypto.Saltine.Internal.ScalarMult: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.ScalarMult.Scalar
+ Crypto.Saltine.Internal.SecretBox: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.SecretBox.Authenticator
+ Crypto.Saltine.Internal.SecretBox: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.SecretBox.Key
+ Crypto.Saltine.Internal.SecretBox: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.SecretBox.Nonce
+ Crypto.Saltine.Internal.SecretBox: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.SecretBox.Authenticator
+ Crypto.Saltine.Internal.SecretBox: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.SecretBox.Key
+ Crypto.Saltine.Internal.SecretBox: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.SecretBox.Nonce
+ Crypto.Saltine.Internal.SecretBox: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.SecretBox.Authenticator
+ Crypto.Saltine.Internal.SecretBox: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.SecretBox.Key
+ Crypto.Saltine.Internal.SecretBox: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.SecretBox.Nonce
+ Crypto.Saltine.Internal.Sign: c_sign_ed25519_pk_to_curve25519 :: Ptr CChar -> Ptr CChar -> IO CInt
+ Crypto.Saltine.Internal.Sign: c_sign_ed25519_sk_to_curve25519 :: Ptr CChar -> Ptr CChar -> IO CInt
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Sign.Keypair
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Sign.PublicKey
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Sign.SecretKey
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Sign.Signature
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Sign.Keypair
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Sign.PublicKey
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Sign.SecretKey
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Sign.Signature
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Sign.Keypair
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Sign.PublicKey
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Sign.SecretKey
+ Crypto.Saltine.Internal.Sign: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Sign.Signature
+ Crypto.Saltine.Internal.Stream: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Stream.Key
+ Crypto.Saltine.Internal.Stream: instance GHC.Internal.Data.Data.Data Crypto.Saltine.Internal.Stream.Nonce
+ Crypto.Saltine.Internal.Stream: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Stream.Key
+ Crypto.Saltine.Internal.Stream: instance GHC.Internal.Generics.Generic Crypto.Saltine.Internal.Stream.Nonce
+ Crypto.Saltine.Internal.Stream: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Stream.Key
+ Crypto.Saltine.Internal.Stream: instance GHC.Internal.Show.Show Crypto.Saltine.Internal.Stream.Nonce

Files

CHANGELOG.md view
@@ -7,6 +7,13 @@ ### Added ### Changed +## [0.2.2.0] - 2025-02-22+### Added+- SHA256 support, thanks [@jmazon](https://github.com/jmazon)+- Ed25519 to Curve25519 conversion support, thanks [@jmazon](https://github.com/jmazon)+### Changed+- Version bounds relaxed+ ## [0.2.1.0] - 2023-02-17 ### Changed - Fix Show instances formatting, and add instances for Keypairs, thanks [@NicolasT](https://github.com/NicolasT)
README.md view
@@ -1,4 +1,4 @@-# Saltine 0.2.1.0 [![Hackage version](https://img.shields.io/hackage/v/saltine.svg?colorB=4FB900)](https://hackage.haskell.org/package/saltine)+# Saltine 0.2.2.0 [![Hackage version](https://img.shields.io/hackage/v/saltine.svg?colorB=4FB900)](https://hackage.haskell.org/package/saltine)  A Haskell binding for @jedisct1's portable binding for djb's NaCl. **This is an early release.** Please try it out, but don't just@@ -43,22 +43,22 @@ provide even more simplicity and safety to the usage of cryptography.  Note that it's still possible to shoot yourself in the foot pretty-easily using Saltine. Nonces must always be unique which must be managed +easily using Saltine. Nonces must always be unique which must be managed by the library user. [`Crypto.Saltine.Core.Stream`](https://github.com/tel/saltine/blob/master/src/Crypto/Saltine/Core/Stream.hs)-produces messages which can beundetectably tampered with in-flight. -Keys are insecurely read from disk—they may be copied and then paged +produces messages which can beundetectably tampered with in-flight.+Keys are insecurely read from disk—they may be copied and then paged back to disk. -When uncertain, use [`Crypto.Saltine.Core.SecretBox`](https://github.com/tel/saltine/blob/master/src/Crypto/Saltine/Core/SecretBox.hs) +When uncertain, use [`Crypto.Saltine.Core.SecretBox`](https://github.com/tel/saltine/blob/master/src/Crypto/Saltine/Core/SecretBox.hs) and [`Crypto.Saltine.Core.Box`](https://github.com/tel/saltine/blob/master/src/Crypto/Saltine/Core/Box.hs).-If you can think of ways to use Haskell's type system to enforce +If you can think of ways to use Haskell's type system to enforce security invariants, please suggest them. -To use it on Windows systems, download -[a prebuild libsodium-\*-stable-mingw.tar.gz file](https://download.libsodium.org/libsodium/releases/) -and copy the files in `libsodium-win64`  into the equivalent places -in `C:\Program Files\Haskell Platform\*\mingw`. Then just add saltine +To use it on Windows systems, download+[a prebuild libsodium-\*-stable-mingw.tar.gz file](https://download.libsodium.org/libsodium/releases/)+and copy the files in `libsodium-win64`  into the equivalent places+in `C:\Program Files\Haskell Platform\*\mingw`. Then just add saltine to your cabal file and watch it go.  Tested with [`libsodium-1.0.18`](https://download.libsodium.org/libsodium/releases/).
saltine.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.0  name:                saltine-version:             0.2.1.0+version:             0.2.2.0 synopsis:            Cryptography that's easy to digest (NaCl/libsodium bindings). description: @@ -85,11 +85,11 @@   default-language:   Haskell2010   build-depends:                 base        >= 4.5    && < 5-              , bytestring  >= 0.10.8 && < 0.12-              , deepseq    ^>= 1.4+              , bytestring  >= 0.10.8 && < 0.13+              , deepseq     >= 1.4    && < 1.6               , profunctors >= 5.3    && < 5.7               , hashable-              , text       ^>= 1.2 || ^>= 2.0+              , text       ^>= 1.2 || >= 2.0 && < 2.2  test-suite tests   type:    exitcode-stdio-1.0
src/Crypto/Saltine/Core/Hash.hs view
@@ -41,18 +41,28 @@ -- This is version 2010.08.30 of the hash.html web page. Information -- about SipHash has been added. module Crypto.Saltine.Core.Hash (+  -- * Documentation   ShorthashKey,   hash,   shorthash, newShorthashKey,   GenerichashKey,   newGenerichashKey,   GenerichashOutLen,-  generichashOutLen, generichash+  generichashOutLen, generichash,++  -- * Advanced: SHA-2+  --+  -- | The SHA-256 function is provided for interoperability with+  -- other applications. If you are looking for a generic hash+  -- function and not specifically SHA-2, using 'generichash'+  -- (BLAKE2b) might be a better choice.+  sha256   ) where  import Crypto.Saltine.Internal.Hash             ( c_hash             , c_generichash+            , c_hash_sha256             , shorthash             , ShorthashKey(..)             , GenerichashKey(..)@@ -101,3 +111,8 @@ generichash (GhK k) m (GhOL outLen) = snd . buildUnsafeByteString outLen $ \ph ->   constByteStrings [k, m] $ \[(pk, _), (pm, _)] ->     c_generichash ph (fromIntegral outLen) pm (fromIntegral $ S.length m) pk (fromIntegral $ S.length k)++-- | Computes a SHA256 hash.+sha256 :: ByteString -> ByteString+sha256 m = snd . buildUnsafeByteString Bytes.hash_sha256_bytes $ \ph ->+  constByteStrings [m] $ \[(pm,_)] -> c_hash_sha256 ph pm (fromIntegral $ S.length m)
src/Crypto/Saltine/Core/Sign.hs view
@@ -27,10 +27,19 @@ -- This is current information as of 2013 June 6.  module Crypto.Saltine.Core.Sign (+  -- * Documentation   SecretKey, PublicKey, Keypair(..), Signature,   newKeypair,   sign, signOpen,-  signDetached, signVerifyDetached+  signDetached, signVerifyDetached,++  -- * Advanced: Ed25519 to Curve25519+  --+  -- | Ed25519 keys can be converted to X25519 keys, so that the same+  -- key pair can be used both for authenticated encryption+  -- ("Crypto.Saltine.Core.Box") and for signatures+  -- ("Crypto.Saltine.Core.Sign").+  signPublicKeyToScalarMult, signSecretKeyToScalarMult   ) where  import Crypto.Saltine.Internal.Sign@@ -39,6 +48,8 @@             , c_sign_open             , c_sign_detached             , c_sign_verify_detached+            , c_sign_ed25519_pk_to_curve25519+            , c_sign_ed25519_sk_to_curve25519             , SecretKey(..)             , PublicKey(..)             , Keypair(..)@@ -51,6 +62,7 @@ import System.IO.Unsafe  import qualified Crypto.Saltine.Internal.Sign as Bytes+import qualified Crypto.Saltine.Internal.ScalarMult as SM import qualified Data.ByteString              as S  -- | Creates a random key of the correct size for 'sign' and@@ -128,4 +140,22 @@         return (res == 0)   where len = S.length sm +-- | Converts an Ed25519 public key to an X25519 public key.+signPublicKeyToScalarMult :: PublicKey -> Maybe SM.GroupElement+signPublicKeyToScalarMult (PK pk) = unsafePerformIO $ do+  (err,x) <- buildUnsafeByteString' SM.scalarmult_bytes $ \xbuf ->+    constByteStrings [pk] $ \[(edbuf,_)] ->+      c_sign_ed25519_pk_to_curve25519 xbuf edbuf+  case err of+    0 -> return $ Just $ SM.GE x+    _ -> return   Nothing +-- | Converts an Ed25519 secret key to an X25519 secret key.+signSecretKeyToScalarMult :: SecretKey -> Maybe SM.Scalar+signSecretKeyToScalarMult (SK sk) = unsafePerformIO $ do+  (err,x) <- buildUnsafeByteString' SM.scalarmult_bytes $ \xbuf ->+    constByteStrings [sk] $ \[(edbuf,_)] ->+      c_sign_ed25519_sk_to_curve25519 xbuf edbuf+  case err of+    0 -> return $ Just $ SM.Sc x+    _ -> return   Nothing
src/Crypto/Saltine/Internal/Hash.hs view
@@ -14,9 +14,11 @@   , shorthash_keybytes   , generichash_bytes_max   , generichash_keybytes_max+  , hash_sha256_bytes   , c_hash   , c_shorthash   , c_generichash+  , c_hash_sha256   , nullShKey   , shorthash   , ShorthashKey(..)@@ -85,7 +87,7 @@  newtype GenerichashOutLen = GhOL { unGhOL :: Int } deriving (Eq, Ord, Hashable, Data, Typeable, Generic, NFData) -hash_bytes, shorthash_bytes, shorthash_keybytes, generichash_bytes_max, generichash_keybytes_max :: Int+hash_bytes, shorthash_bytes, shorthash_keybytes, generichash_bytes_max, generichash_keybytes_max, hash_sha256_bytes :: Int  -- Hashes -- | The size of a hash resulting from@@ -103,6 +105,9 @@ -- | The maximum key size of the generic hash function -- 'Crypto.Saltine.Core.Hash.generichash' generichash_keybytes_max = fromIntegral c_crypto_generichash_keybytes_max+-- | The size of a hash resulting from+-- 'Crypto.Saltine.Core.Hash.sha256'.+hash_sha256_bytes = fromIntegral c_crypto_hash_sha256_bytes  -- src/libsodium/crypto_generichash/crypto_generichash.c foreign import ccall "crypto_generichash_bytes_max"@@ -122,7 +127,12 @@ foreign import ccall "crypto_shorthash_keybytes"   c_crypto_shorthash_keybytes :: CSize +-- src/libsodium/crypto_hash/sha256/hash_sha256.c+-- src/libsodium/include/sodium/crypto_hash_sha256.h+foreign import ccall "crypto_hash_sha256_bytes"+  c_crypto_hash_sha256_bytes :: CSize + foreign import ccall "crypto_hash"   c_hash :: Ptr CChar          -- ^ Output hash buffer@@ -158,5 +168,15 @@                 -- ^ Constant Key buffer                 -> CULLong                 -- ^ Key buffer length+                -> IO CInt+                -- ^ Always 0++foreign import ccall "crypto_hash_sha256"+  c_hash_sha256 :: Ptr CChar+                -- ^ Output hash buffer+                -> Ptr CChar+                -- ^ Constant message buffer+                -> CULLong+                -- ^ Message buffer length                 -> IO CInt                 -- ^ Always 0
src/Crypto/Saltine/Internal/Sign.hs view
@@ -17,6 +17,8 @@   , c_sign_open   , c_sign_detached   , c_sign_verify_detached+  , c_sign_ed25519_pk_to_curve25519+  , c_sign_ed25519_sk_to_curve25519   , SecretKey(..)   , PublicKey(..)   , Keypair(..)@@ -180,3 +182,17 @@                            -> Ptr CChar                            -- ^ Public key buffer                            -> IO CInt++foreign import ccall "crypto_sign_ed25519_pk_to_curve25519"+    c_sign_ed25519_pk_to_curve25519 :: Ptr CChar+                                    -- ^ X25519 public key output buffer+                                    -> Ptr CChar+                                    -- ^ Ed25519 public key buffer+                                    -> IO CInt++foreign import ccall "crypto_sign_ed25519_sk_to_curve25519"+    c_sign_ed25519_sk_to_curve25519 :: Ptr CChar+                                    -- ^ X25519 secret key output buffer+                                    -> Ptr CChar+                                    -- ^ Ed25519 secret key buffer+                                    -> IO CInt
tests/HashProperties.hs view
@@ -28,6 +28,9 @@     testProperty "Hash of empty ByteString is correct"     $ \(Message bs) -> (bs == S.empty) ==> hash bs == (read hashEmptyBS :: S.ByteString), +    testProperty "SHA256 of empty ByteString is correct"+    $ \(Message bs) -> (bs == S.empty) ==> sha256 bs == (read sha256EmptyBS :: S.ByteString),+     testProperty "No two shorthashes are alike"     $ \(Message bs1, Message bs2) -> bs1 /= bs2 ==> shorthash shKey bs1 /= shorthash shKey bs2, @@ -37,10 +40,14 @@     testProperty "No two generic hashes are alike"     $ \(Message bs1, Message bs2) -> bs1 /= bs2 ==> generichash ghKey bs1 ghOutLen /= generichash ghKey bs2 ghOutLen, +    testProperty "No two SHA256 hashes are alike"+    $ \(Message bs1, Message bs2) -> bs1 /= bs2 ==> sha256 bs1 /= sha256 bs2,+     testProperty "Different keys produce different generichashes"     $ \(Message bs) -> generichash ghKey bs ghOutLen /= generichash ghKey2 bs ghOutLen      ]    where-    hashEmptyBS = "\"\207\131\225\&5~\239\184\189\241T(P\214m\128\a\214 \228\ENQ\vW\NAK\220\131\244\169!\211l\233\206G\208\209<]\133\242\176\255\131\CAN\210\135~\236/c\185\&1\189GAz\129\165\&82z\249'\218>\""+    hashEmptyBS   = "\"\207\131\225\&5~\239\184\189\241T(P\214m\128\a\214 \228\ENQ\vW\NAK\220\131\244\169!\211l\233\206G\208\209<]\133\242\176\255\131\CAN\210\135~\236/c\185\&1\189GAz\129\165\&82z\249'\218>\""+    sha256EmptyBS = "\"\227\176\196B\152\252\FS\DC4\154\251\244\200\153o\185$'\174A\228d\155\147L\164\149\153\ESCxR\184U\""
tests/SignProperties.hs view
@@ -5,10 +5,15 @@   ) where  import           Util+import           Crypto.Saltine.Class+ import           Crypto.Saltine.Core.Sign import           Crypto.Saltine.Internal.Sign-+import qualified Crypto.Saltine.Core.Box              as Box+import           Crypto.Saltine.Core.ScalarMult       ()+import           Crypto.Saltine.Internal.ScalarMult import qualified Data.ByteString                      as S+import           Data.Maybe                           (fromJust) import           Test.Framework.Providers.QuickCheck2 import           Test.Framework import           Test.QuickCheck@@ -19,7 +24,9 @@   let sk1 = secretKey kp1   let pk1 = publicKey kp1   kp2 <- newKeypair+  let sk2 = secretKey kp2   let pk2 = publicKey kp2+  n <- Box.newNonce    return $ testGroup "...Internal.Sign" [ @@ -38,6 +45,15 @@      testProperty "Rejects message with mismatched key w/ detached signature"     $ \(Message bs) -> not (S.null bs) ==>-                         not (signVerifyDetached pk2 (signDetached sk1 bs) bs)+                         not (signVerifyDetached pk2 (signDetached sk1 bs) bs), +    testProperty "Ed25515 -> Curve25519 conversion produces valid keypairs"+    $ \(Message bs) ->+        let p1 = fromJust . decode . unGE . fromJust $ signPublicKeyToScalarMult pk1+            s1 = fromJust . decode . unSc . fromJust $ signSecretKeyToScalarMult sk1++            p2 = fromJust . decode . unGE . fromJust $ signPublicKeyToScalarMult pk2+            s2 = fromJust . decode . unSc . fromJust $ signSecretKeyToScalarMult sk2++        in  (Box.boxOpen p2 s1 n (Box.box p1 s2 n bs)) == Just bs     ]
tests/StreamProperties.hs view
@@ -23,8 +23,8 @@               ==> S.length (stream k n len) == len,      testProperty "xor munges input"-    $ \(Message bs) -> not (S.null bs)-                       ==> xor k n bs /= bs,+    $ \(ByteString32 bs) ->     -- ByteString32 so we don't fail the test by pure chance, e.g. in case of 1-byte bytestrings+        xor k n bs /= bs,      testProperty "xor is involutive"     $ \(Message bs) -> xor k n (xor k n bs) == bs