Chacha20 (and XChacha20) stream cipher encryption algorithm in pure V. Its mostly based on RFC 8439 and inspired by Go version of the same library.
This module already supports a 32-bit counter mode, and recently expanded to support a 64-bit counter mode. The implemented features at the time of writing (2025/09/22) are:
import crypto.rand
import x.crypto.chacha20
fn main() {
// 1. Creates a standard IETF variant, supplied with 12-bytes nonce
key0 := rand.read(32)!
nonce0 := rand.read(12)!
mut c0 := chacha20.new_cipher(key0, nonce0)!
// and then, do work with the c0 that was just created
// 2. Creates an original (DJ Bernstein) variant, supplied with 8-bytes nonce
key1 := rand.read(32)!
nonce1 := rand.read(8)!
mut c1 := chacha20.new_cipher(key1, nonce1)!
// do with yours cipher
// 3. Creates an eXtended ChaCha20 construction with 64-bit counter
key2 := rand.read(32)!
nonce2 := rand.read(24)!
mut c2 := chacha20.new_cipher(key2, nonce2, use_64bit_counter: true)!
// do with yours cipher
}
module main
import encoding.hex
import x.crypto.chacha20
fn main() {
// example of random key
// you should make sure the key (and nonce) are random enough.
// The security guarantees of the ChaCha20 require that the same nonce
// value is never used twice with the same key.
key := hex.decode('bf32a829ebf86d23f6a32a74ef0333401e54a6b2900d35bfadef82c5d49da15f')!
nonce := hex.decode('a7d7cf3405631f25cc1054bd')!
input := 'Good of gambler'.bytes()
// encrypt and the decrypt back
output := chacha20.encrypt(key, nonce, input)!
input_back := chacha20.decrypt(key, nonce, output)!
// should true
assert input == input_back
}