0 branches
Tree
Top files
Clone with HTTPS:
README.md
x.crypto.chacha20: expand the xchacha20 construction to support 64-bit counters (#25377)
last Sep 24
2.02 KB
chacha.v
revert: deprecated_after attribute change (fixes #19138) - incomplete, breaks time/format.v
last Apr 14
7.25 KB
chacha_64bitctr_test.v
x.crypto.chacha20: fix internal counter handling (#25334)
last Sep 19
29.15 KB
chacha_test.v
x.crypto.chacha20: mark `State` as public to make it reusable (#25449)
last Oct 7
91.39 KB
module chacha20
chacha20
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.
Status
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:
- Support for standard IETF ChaCha20 with 32-bit counter and 12 bytes nonce
- Support for eXtended ChaCha20 (XChaCha20) constructions with 24 bytes nonce, with 32 or 64-bit counter.
- Support for original ChaCha20 with 8 bytes nonce and 64-bit counter.Example
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
}
Complete example
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
}