|
| 1 | +module Node.Crypto where |
| 2 | + |
| 3 | +import Prelude |
| 4 | + |
| 5 | +import Data.Either (Either(..)) |
| 6 | +import Data.Function.Uncurried (Fn2, mkFn2) |
| 7 | +import Data.Maybe (Maybe(..)) |
| 8 | +import Data.Nullable (Nullable, toMaybe) |
| 9 | +import Effect (Effect) |
| 10 | +import Effect.Exception (Error) |
| 11 | +import Effect.Uncurried (EffectFn1, EffectFn2, EffectFn3, mkEffectFn2, runEffectFn1, runEffectFn2, runEffectFn3) |
| 12 | +import Node.Buffer (Buffer) |
| 13 | +import Node.Crypto.KeyObject (Asymmetric, KeyObject, Private, Public, Symmetric) |
| 14 | + |
| 15 | +foreign import checkPrimeImpl :: forall a. EffectFn2 (Buffer) (Fn2 (Nullable Error) Boolean a) Unit |
| 16 | + |
| 17 | +checkPrime :: forall a. Buffer -> (Either Error Boolean -> a) -> Effect Unit |
| 18 | +checkPrime buffer cb = |
| 19 | + runEffectFn2 checkPrimeImpl buffer $ mkFn2 \err a -> cb case toMaybe err of |
| 20 | + Just err' -> Left err' |
| 21 | + Nothing -> Right a |
| 22 | + |
| 23 | +foreign import checkPrimeOptsImpl :: forall a. EffectFn3 (Buffer) { checks :: Number } (Fn2 (Nullable Error) Boolean a) Unit |
| 24 | + |
| 25 | +checkPrime' :: forall a. Buffer -> { checks :: Number } -> (Either Error Boolean -> a) -> Effect Unit |
| 26 | +checkPrime' buffer checks cb = |
| 27 | + runEffectFn3 checkPrimeOptsImpl buffer checks $ mkFn2 \err a -> cb case toMaybe err of |
| 28 | + Just err' -> Left err' |
| 29 | + Nothing -> Right a |
| 30 | + |
| 31 | +foreign import checkPrimeSyncImpl :: EffectFn1 (Buffer) Boolean |
| 32 | + |
| 33 | +checkPrimeSync :: Buffer -> Effect Boolean |
| 34 | +checkPrimeSync buffer = |
| 35 | + runEffectFn1 checkPrimeSyncImpl buffer |
| 36 | + |
| 37 | +foreign import checkPrimeSyncOptsImpl :: EffectFn2 (Buffer) { checks :: Number } Boolean |
| 38 | + |
| 39 | +checkPrimeSync' :: Buffer -> { checks :: Number } -> Effect Boolean |
| 40 | +checkPrimeSync' buffer checks = |
| 41 | + runEffectFn2 checkPrimeSyncOptsImpl buffer checks |
| 42 | + |
| 43 | +foreign import diffieHelmanImpl :: EffectFn1 ({ privateKey :: KeyObject (Asymmetric Private), publicKey :: KeyObject (Asymmetric Public)}) (Buffer) |
| 44 | + |
| 45 | +-- | Computes the Diffie-Hellman secret based on a privateKey and a publicKey. |
| 46 | +-- | Both keys must have the same asymmetricKeyType, which must be one of 'dh' (for Diffie-Hellman), |
| 47 | +-- | 'ec' (for ECDH), 'x448', or 'x25519' (for ECDH-ES). |
| 48 | +diffieHelman :: { privateKey :: KeyObject (Asymmetric Private), publicKey :: KeyObject (Asymmetric Public)} -> Effect Buffer |
| 49 | +diffieHelman pair = runEffectFn1 diffieHelmanImpl pair |
| 50 | + |
| 51 | +foreign import generateKeyHmacImpl :: forall a. EffectFn2 ({ length :: Number }) (EffectFn2 (Nullable Error) (KeyObject Symmetric) a) (Unit) |
| 52 | + |
| 53 | +-- | Asynchronously generates a new random secret key of the given length. Length must be a multiple of 8 between `8 <= x <= 2^31-1`. |
| 54 | +-- | If the value is not a multiple of 8, the generated key will be truncated to `Math.floor(length / 8)`. |
| 55 | +-- | |
| 56 | +-- | Note: The size of a generated HMAC key should not exceed the block size of the underlying hash function. |
| 57 | +generateKeyHmac :: forall a. { length :: Number } -> (Either Error (KeyObject Symmetric) -> Effect a) -> Effect Unit |
| 58 | +generateKeyHmac lengthNumber cb = |
| 59 | + runEffectFn2 generateKeyHmacImpl lengthNumber $ mkEffectFn2 \err a -> cb case toMaybe err of |
| 60 | + Just err' -> Left err' |
| 61 | + Nothing -> Right a |
| 62 | + |
| 63 | +foreign import generateKeyAesImpl :: forall a. EffectFn2 ({ length :: Number }) (EffectFn2 (Nullable Error) (KeyObject Symmetric) a) (Unit) |
| 64 | + |
| 65 | +-- | Asynchronously generates a new random secret key of the given length. Length must be `128`, `192`, or `256`. |
| 66 | +generateKeyAes :: forall a. { length :: Number } -> (Either Error (KeyObject Symmetric) -> Effect a) -> Effect Unit |
| 67 | +generateKeyAes lengthNumber cb = |
| 68 | + runEffectFn2 generateKeyAesImpl lengthNumber $ mkEffectFn2 \err a -> cb case toMaybe err of |
| 69 | + Just err' -> Left err' |
| 70 | + Nothing -> Right a |
0 commit comments