AES operating modes + ChaCha20 AEAD. Each module takes a pre-scheduled block/stream primitive (see cipher/) and uses it to process full buffers.

Module Returns Deps Description
cbc {encrypt, decrypt} bitArray, aes AES-CBC (SP 800-38A §6.2) — confidentiality, caller-provided padding
ctr {encrypt} bitArray, aes AES-CTR (SP 800-38A §6.5) — stream, no padding
gcm {encrypt, decrypt, gmac, gmacVerify, nonceTracker, _internal} bitArray, aes AES-GCM (SP 800-38D) — AEAD, GMAC included
cmac {mac, verify, truncatedMac, truncatedVerify, _internal} bitArray, aes AES-CMAC (SP 800-38B / RFC 4493); TDES rejected
kw {wrap, unwrap, wrapPad, unwrapPad, wrapInverseCipher, unwrapInverseCipher, _internal} bitArray, aes AES-KW + KWP (SP 800-38F / RFC 3394 / RFC 5649)
chacha20poly1305 {encrypt, decrypt, nonceTracker} chacha20, poly1305 AEAD ChaCha20-Poly1305 (RFC 8439)

Common pattern (AEAD)

const { aes, gcm, random, bitArray } = fw.runtime.resolveAll(['aes', 'gcm', 'random', 'bitArray']);

const key   = Array.from(bitArray.ui8_to_ba(random.bytes(32)));
const iv    = bitArray.ui8_to_ba(random.bytes(12));
const cipher = aes.fn(key);
const aad   = bitArray.ui8_to_ba(new TextEncoder().encode('header'));
const pt    = bitArray.ui8_to_ba(new TextEncoder().encode('Hello World'));

const out = gcm.encrypt(cipher, pt, iv, aad, 128);  // { ct, tag }
const dec = gcm.decrypt(cipher, out.ct, iv, aad, out.tag, 128);

See also