v2 / vlib / x / crypto / chacha20 / README.md
74 lines · 56 sloc · 2.02 KB · e0d20a0d9f5ecdd919cb3bc4a7d1da50cbc64f0c
Raw

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
}