Expand description
JWE (JSON Web Encryption) key management algorithms.
This module provides implementations of various JWE key management algorithms as specified in RFC 7518. Each key type is strongly typed to prevent misuse.
§Supported Algorithms
§RSA Key Management
RSA-OAEP- RSA with OAEP using SHA-1
Note: RSA-OAEP-256 (with SHA-256) is not currently supported because the underlying boring/superboring crates do not expose the API to specify the OAEP hash function.
§Symmetric Key Wrap
A256KW- AES-256 Key Wrap (recommended)A128KW- AES-128 Key Wrap
§ECDH Key Agreement
ECDH-ES+A256KW- ECDH with AES-256 Key Wrap (recommended)ECDH-ES+A128KW- ECDH with AES-128 Key Wrap
§Content Encryption
All key management algorithms support these content encryption algorithms:
A256GCM- AES-256-GCM (default, recommended)A128GCM- AES-128-GCM
§Sender Authentication
Authenticated encryption authenticates the ciphertext, not the sender.
With the asymmetric modes (RSA-OAEP and ECDH-ES), the encryption key is public,
so anyone can produce a token that decrypts successfully, carrying any claims.
Successful decryption in these modes proves nothing about who sent the token,
and checking issuer or audience claims is no substitute, since the sender picked them too.
The AES key wrap modes (A128KW, A256KW) are different: producing a decryptable
token requires the shared secret, so decryption authenticates the sender as one of
the key holders.
When the sender’s identity matters with the asymmetric modes, verify a signature after decryption, for example a signed token carried in a custom claim.
§Examples
§RSA-OAEP
use jwt_simple::prelude::*;
// Generate a key pair
let decryption_key = RsaOaepDecryptionKey::generate(2048).unwrap();
let encryption_key = decryption_key.encryption_key();
// Encrypt
let claims = Claims::create(Duration::from_hours(1))
.with_subject("user@example.com");
let token = encryption_key.encrypt(claims).unwrap();
// Decrypt
let claims = decryption_key.decrypt_token::<NoCustomClaims>(&token, None).unwrap();§AES Key Wrap
use jwt_simple::prelude::*;
// Generate a symmetric key
let key = A256KWKey::generate();
// Encrypt
let claims = Claims::create(Duration::from_hours(1));
let token = key.encrypt(claims).unwrap();
// Decrypt
let claims = key.decrypt_token::<NoCustomClaims>(&token, None).unwrap();§ECDH-ES+A256KW
use jwt_simple::prelude::*;
// Generate a key pair
let decryption_key = EcdhEsA256KWDecryptionKey::generate();
let encryption_key = decryption_key.encryption_key();
// Encrypt
let claims = Claims::create(Duration::from_hours(1));
let token = encryption_key.encrypt(claims).unwrap();
// Decrypt
let claims = decryption_key.decrypt_token::<NoCustomClaims>(&token, None).unwrap();Re-exports§
pub use aes_kw::A128KWKey;pub use aes_kw::A256KWKey;pub use content::ContentEncryption;pub use ecdh_es::EcdhEsA128KWDecryptionKey;pub use ecdh_es::EcdhEsA128KWEncryptionKey;pub use ecdh_es::EcdhEsA256KWDecryptionKey;pub use ecdh_es::EcdhEsA256KWEncryptionKey;pub use rsa_oaep::RsaOaepDecryptionKey;pub use rsa_oaep::RsaOaepEncryptionKey;