// This is a benchmark for`x.crypto.chacha20` encryption and decryption
//
// Current output on my tests
//
// Chacha20 Encryption
// -----------
// Iterations:      10000          Total Duration:   76.045ms      ns/op:       7604       B/op:      4    allocs/op:      2
//
// ChaCha20 Decryption
// -----------
// Iterations:      10000          Total Duration:   71.275ms      ns/op:       7127       B/op:     11    allocs/op:     14
//
// After the patch
// Chacha20 Encryption
// -----------
// Iterations:      10000          Total Duration:   46.833ms      ns/op:       4683       B/op:     11    allocs/op:     11
//
// ChaCha20 Decryption
// -----------
// Iterations:      10000          Total Duration:   48.242ms      ns/op:       4824       B/op:      3    allocs/op:      4
//
import x.benchmark
import encoding.hex
import x.crypto.chacha20

// randomly generated key and nonce, 32-bytes of key, 12-bytes of nonce
const key = hex.decode('9d9603f4fc460e273b80795ea50eab5873c04f589226c7d591b5336feb32fcba')!
const nonce = hex.decode('9a3c83e4236ea9a2c4e482da')!

const plaintext = 'ChaCha20 encrypt decrypt benchmarking message'.bytes()

// expected ciphertext
const ciphertext = hex.decode('dbddb264e4c478d96805b2d557649232b4b3f37c51035464d12e3675e5e36ce6f6822b49dd6494ccd5213a89c9')!

fn bench_chacha20_encrypt() ! {
	_ := chacha20.encrypt(key, nonce, plaintext)!
}

fn bench_chacha20_decrypt() ! {
	_ := chacha20.decrypt(key, nonce, ciphertext)!
}

fn main() {
	cf := benchmark.BenchmarkDefaults{
		n: 10000
	}
	println('Chacha20 Encryption')
	println('-----------')
	mut b0 := benchmark.setup(bench_chacha20_encrypt, cf)!
	b0.run()

	println('')
	println('ChaCha20 Decryption')
	println('-----------')
	mut b1 := benchmark.setup(bench_chacha20_decrypt, cf)!
	b1.run()
}
