Skip to content

AES-GCM Encryption

Encrypt and decrypt data with AES-256-GCM.

sh
cargo add wasm_web_crypto --features encrypt,key,random
rust
use wasm_web_crypto::*;

let crypto = Crypto::new()?;
let subtle = SubtleCrypto::new()?;

// Generate a 256-bit AES key
let key = subtle.generate_key(
    &GenerateKeyParams::Aes {
        algorithm: Algorithm::AesGcm {
            iv: None, additional_data: None,
            tag_length: None, key_length: None,
        },
        length: 256,
    },
    true,
    &[KeyUsage::Encrypt, KeyUsage::Decrypt],
).await?;

let key = match key {
    GenerateKeyResult::Key(k) => k,
    _ => unreachable!(),
};

// Generate a random 12-byte IV
let mut iv = [0u8; 12];
crypto.get_random_values(&mut iv)?;

// Encrypt
let ciphertext = subtle.encrypt(
    &Algorithm::AesGcm {
        iv: Some(iv.to_vec()), additional_data: None,
        tag_length: None, key_length: None,
    },
    &key,
    b"secret message",
).await?;

// Decrypt
let plaintext = subtle.decrypt(
    &Algorithm::AesGcm {
        iv: Some(iv.to_vec()), additional_data: None,
        tag_length: None, key_length: None,
    },
    &key,
    ciphertext.to_bytes(),
).await?;

assert_eq!(plaintext.to_bytes(), b"secret message");