/
Sign.purs
68 lines (56 loc) · 2.17 KB
/
Sign.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
module Crypt.NaCl.Sign
( generateSignKeyPair
, getSignKeyPair
, getSignKeyPairFromSeed
, getSignPublicKey
, getSignSecretKey
, signDetached
, signOpen
, sign
, verifyDetached
) where
import Effect (Effect)
import Data.ArrayBuffer.ArrayBuffer (byteLength)
import Data.ArrayBuffer.Typed (buffer)
import Data.ArrayBuffer.Types (Uint8Array)
import Data.Nullable (Nullable, toMaybe)
import Data.Maybe (Maybe(..))
import Prelude
import Unsafe.Coerce (unsafeCoerce)
import Crypt.NaCl.Types
( Message
, SignKeyPair
, Signature
, SignedMessage
, SignPublicKey
, SignSecretKey
, SignSeed
)
-- | Generate a random key pair for signing messages
foreign import generateSignKeyPair :: Effect SignKeyPair
-- | Get the signing keypair for a given `SignSecretKey`
foreign import getSignKeyPair :: SignSecretKey -> SignKeyPair
-- | Get the signing keypair for a given `SignSeed`
foreign import getSignKeyPairFromSeed :: SignSeed -> SignKeyPair
-- | Get the `SignPublicKey` for a given `SignKeyPair`
foreign import getSignPublicKey :: SignKeyPair -> SignPublicKey
-- | Get the `SignSecretKey` for a given `SignKeyPair`
foreign import getSignSecretKey :: SignKeyPair -> SignSecretKey
-- | Sign a `Message` using the given `SignSecretKey`.
-- | Returns the contents of the message, signed, as a `SignedMessage`
foreign import sign :: Message -> SignSecretKey -> SignedMessage
foreign import _signOpen :: SignedMessage -> SignPublicKey -> Nullable Message
-- | Like `sign`, but only returns the `Signature`, not the message contents
foreign import signDetached :: Message -> SignSecretKey -> Signature
-- | Verifies a `Signature`, given the `Message`
foreign import verifyDetached :: Message -> Signature -> Boolean
-- | Varifies the signature contained in a `SignedMessage` against a given
-- | `SignPublicKey`. Returns `Just Message` if the signature verifies,
-- | or `Nothing` otherwise.
signOpen :: SignedMessage -> SignPublicKey -> Maybe Message
signOpen m s = toMaybe (_signOpen m s)
-- | Constructs a `SignSeed` provided the length is 32 bytes.
mkSignSeed :: Uint8Array -> Maybe SignSeed
mkSignSeed bs
| 32 == (byteLength $ buffer $ bs) = Just (unsafeCoerce bs)
| otherwise = Nothing