Skip to content

Commit 7a85ec0

Browse files
Add partial bindings to top-level crypto
1 parent ffbd2a8 commit 7a85ec0

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

src/Node/Crypto.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import * as crypto from "node:crypto";
2+
3+
export const checkPrimeImpl = (buf, cb) => crypto.checkPrime(buf, cb);
4+
export const checkPrimeOptsImpl = (buf, opts, cb) => crypto.checkPrime(buf, opts, cb);
5+
export const checkPrimeSyncImpl = (buf) => crypto.checkPrimSync(buf);
6+
export const checkPrimeSyncOptsImpl = (buf, opts) => crypto.checkPrimSync(buf, opts);
7+
export const diffieHelmanImpl = (pair) => crypto.diffieHellman(pair);
8+
export const generateKeyHmacImpl = (len, cb) => crypto.generateKey("hmac", len, cb);
9+
export const generateKeyAesImpl = (len, cb) => crypto.generateKey("aes", len, cb);

src/Node/Crypto.purs

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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

Comments
 (0)