0 branches
Tree Top files
Code
Clone with HTTPS:
56 years ago
..
chacha.v revert: deprecated_after attribute change (fixes #19138) - incomplete, breaks time/format.v last Apr 14 7.25 KB
stream.v all: super_batch6 fixes last Apr 17 12.57 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:


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
}