# amaro
[](https://hex.pm/packages/amaro)
[](https://hexdocs.pm/amaro/)
Fernet and Branca token encryption for Gleam.
```sh
gleam add amaro
```
## Fernet
[Fernet](https://github.com/fernet/spec) tokens use AES-128-CBC with HMAC-SHA256. Tokens are base64url-encoded.
```gleam
import amaro/fernet
let key = fernet.generate_key()
let token = fernet.encrypt(key, plaintext: <<"too many secrets":utf8>>)
let assert Ok(plaintext) = fernet.decrypt(key, token:)
```
Enforce a maximum token age:
```gleam
import gleam/time/duration
let assert Ok(plaintext) =
fernet.decrypt_with_ttl(key, token:, ttl: duration.seconds(60))
```
Keys serialize as base64url strings:
```gleam
let encoded = fernet.key_to_string(key)
let assert Ok(key) = fernet.key_from_string(encoded:)
```
## Branca
[Branca](https://github.com/tuupola/branca-spec) tokens use XChaCha20-Poly1305 authenticated encryption. Tokens are base62-encoded.
```gleam
import amaro/branca
let key = branca.generate_key()
let token = branca.encrypt(key, plaintext: <<"too many secrets":utf8>>)
let assert Ok(plaintext) = branca.decrypt(key, token:)
```
Enforce a maximum token age:
```gleam
import gleam/time/duration
let assert Ok(plaintext) =
branca.decrypt_with_ttl(key, token:, ttl: duration.seconds(60))
```
Keys are raw 32-byte values:
```gleam
let bytes = branca.key_to_bytes(key)
let assert Ok(key) = branca.key_from_bytes(bytes:)
```