Skip to content

orsinium-labs/subcrypt

Repository files navigation

subcrypt

[ github ] [ npm ]

Type-safe cross-environment encryption (RSA/AES) library for JS/TS built on top of crypto.subtle.

Features:

  • Works in browser, node.js, react native, and expo.
  • Type-safe and written in TypeScript.
  • Safe defaults.
  • Friendly API that doesn't require deep technical knowledge of cryptography.
  • 100% test coverage.

Installation

npm i --save subcrypto

For React Native (or Expo) projects, you also need to install react-native-webview-crypto:

npm install --save react-native-webview react-native-webview-crypto

See the project documentation on how to enable react-native-webview-crypto polyfill.

Usage

Symmetric encryption:

import { Salt, SymEnc, encrypt, decrypt } from "subcrypt";

// generate a new AES key
let key = await SymEnc.generate();

// or derive it from a password
const salt = Salt.fromString("som3thing r@ndom");
key = await SymEnc.derive("p@ssw0rd", salt);

// export key
const dump = await SymEnc.armor(key);

// encrypt a message
const encMsg = await encrypt(key, "oh hi mark", salt);

// import key
key = await SymEnc.dearmor(dump);

// decrypt encrypted message
const plainMsg = await decrypt(key, encMsg, salt);

Asymmetric encryption:

import { EncryptKey, EncPair, encrypt, decrypt } from "subcrypt";

// generate a new RSA key pair
let pair = await EncPair.generate();

// export public encryption key
const dump = await EncryptKey.armor(key);

// import key
const encKey = await EncryptKey.dearmor(dump);

// encrypt a message using the encryption key
const encMsg = await encrypt(encKey, "oh hi mark");

// or using the key pair
encMsg = await encrypt(pair, "oh hi mark");

// decrypt encrypted message
const plainMsg = await decrypt(pair, encMsg);

Asymmetric signatures:

import { SignPair, VerifyKey, sign, verify } from "subcrypt";

// generate a new RSA key pair
let pair = await SignPair.generate();

// encrypt a message using the pair
const msg = "oh hi mark";
const sig = await sign(pair, msg);

// export public verification key
const dump = await VerifyKey.armor(key);

// import key
const verifyKey = await VerifyKey.dearmor(dump);

// verify message using the public key
const isOk = await verify(verifyKey, msg, sig);

// or using the key pair
isOk = await verify(pair, msg, sig);