aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/old/vlib/crypto/cipher/xor_generic.v
blob: bbec30b3a62be5ca1db67b50b266a1b3c3d9b47b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Copyright (c) 2019-2021 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
module cipher

// NOTE: Implement other versions (joe-c)
// xor_bytes xors the bytes in a and b. The destination should have enough
// space, otherwise xor_bytes will panic. Returns the number of bytes xor'd.
pub fn xor_bytes(mut dst []byte, a []byte, b []byte) int {
	mut n := a.len
	if b.len < n {
		n = b.len
	}
	if n == 0 {
		return 0
	}
	safe_xor_bytes(mut dst, a, b, n)
	return n
}

// safe_xor_bytes XORs the bytes in `a` and `b` into `dst` it does so `n` times.
// Please note: `n` needs to be smaller or equal than the length of `a` and `b`.
pub fn safe_xor_bytes(mut dst []byte, a []byte, b []byte, n int) {
	for i in 0 .. n {
		dst[i] = a[i] ^ b[i]
	}
}

// xor_words XORs multiples of 4 or 8 bytes (depending on architecture.)
// The slice arguments `a` and `b` are assumed to be of equal length.
pub fn xor_words(mut dst []byte, a []byte, b []byte) {
	safe_xor_bytes(mut dst, a, b, b.len)
}