@jedisct1/charm
v2.0.0
Published
Charm port to JavaScript
Maintainers
Readme
charm.js
A tiny, self-contained cryptography library, implementing authenticated encryption and keyed hashing.
Any number of hashing and authenticated encryption operations can be freely chained using a single rolling state. In this mode, each authentication tag authenticates the whole transcript since the beginning of the session.
This is a port to JavaScript (TypeScript). It is fully compatible with the C and Zig versions.
Features
- Authenticated encryption with 128-bit security
- Keyed hashing
- No practical limits on message size and length
- Works in both Node.js and Bun environments
- Supports both ESM and CommonJS module systems
- Full TypeScript support with type definitions
- Zero dependencies
- Comprehensive test coverage
Installation
npm install @jedisct1/charmUsage
ESM
import { Charm } from "@jedisct1/charm";
// Create a key and nonce
const key = new Uint8Array(Charm.key_length).fill(1);
const nonce = new Uint8Array(Charm.nonce_length).fill(2);
// Create a message
const message = new TextEncoder().encode('Hello from Charm!');
// Initialize the state
const charm = new Charm(key, nonce);
// Encrypt
const tag = charm.encrypt(message);
// Decrypt
const charm2 = new Charm(key, nonce);
charm2.decrypt(message, tag);
// Hash
const hash = charm.hash(message);CommonJS
const { Charm } = require("@jedisct1/charm");
// Create a key and nonce
const key = new Uint8Array(Charm.key_length).fill(1);
const nonce = new Uint8Array(Charm.nonce_length).fill(2);
// Create a message
const message = new TextEncoder().encode('Hello from Charm!');
// Initialize the state
const charm = new Charm(key, nonce);
// Encrypt
const tag = charm.encrypt(message);
// Decrypt
const charm2 = new Charm(key, nonce);
charm2.decrypt(message, tag);
// Hash
const hash = charm.hash(message);API
Constructor
new Charm(key: Uint8Array, nonce?: Uint8Array)key: AUint8Arrayof lengthCharm.key_length(32 bytes)nonce: An optionalUint8Arrayof lengthCharm.nonce_length(16 bytes)
Static Properties
Charm.key_length: 32 (bytes)Charm.nonce_length: 16 (bytes)Charm.tag_length: 16 (bytes)Charm.hash_length: 32 (bytes)
Methods
encrypt(msg: Uint8Array): Uint8Array
Encrypts a message in-place and returns the authentication tag.
decrypt(msg: Uint8Array, expected_tag: Uint8Array): void
Decrypts a message in-place and verifies the authentication tag. Throws an error if verification fails.
hash(msg: Uint8Array): Uint8Array
Computes a keyed hash of the message.
Development
Building
npm run buildThis will build both ESM and CommonJS versions of the library.
Testing
npm testLinting
npm run lintSecurity
This implementation provides 128-bit security and has no practical limits on the size and length of messages.
Other implementations
License
MIT
