kryptos

Package VersionHex Docs

A cryptography library for Gleam targeting both Erlang and JavaScript runtimes.

Why kryptos?

kryptos logo

Note

Browser JavaScript is not supported. The WebCrypto API is promise-based, which doesn't fit the synchronous FFI model. For browser crypto, see plinth which provides Gleam bindings to WebCrypto using promises.

Installation

gleam add kryptos

Requirements

Features

ModuleAlgorithms
aeadAES-GCM, AES-CCM, ChaCha20-Poly1305, XChaCha20-Poly1305
blockAES-128, AES-192, AES-256, AES Key Wrap (RFC 3394)
cryptoHKDF, PBKDF2, random bytes
ecKey generation, import/export, introspection
ecdhP-256, P-384, P-521, secp256k1
ecdsaP-256, P-384, P-521, secp256k1
eddsaEd25519, Ed448
hashSHA-1, SHA-2, SHA-3, SHAKE, BLAKE2
hmacAll hash algorithms
rsaOAEP, PKCS#1 v1.5, PSS, PKCS#1 v1.5 signatures
x509/certificateCertificate parsing and self-signed generation
x509/csrCSR generation with ECDSA/RSA/EdDSA, SANs
xdhX25519, X448

Getting Started

Encrypt and decrypt data using AES-GCM:

import kryptos/aead
import kryptos/block
import kryptos/crypto
pub fn main() {
// Generate a random 256-bit key
let assert Ok(cipher) = block.aes_256(crypto.random_bytes(32))
let ctx = aead.gcm(cipher)
// Generate a random nonce (never reuse with the same key!)
let nonce = crypto.random_bytes(aead.nonce_size(ctx))
// Encrypt
let plaintext = <<"hello, world!":utf8>>
let assert Ok(#(ciphertext, tag)) = aead.seal(ctx, nonce:, plaintext:)
// Decrypt
let assert Ok(decrypted) = aead.open(ctx, nonce:, ciphertext:, tag:)
// decrypted == plaintext
}

Tip

If you're looking for a higher-level library for simple encryption, check out amaro.

Security

For guidance on choosing cryptographic primitives, see Cryptographic Right Answers.