v/vlib/crypto/cipher/xor_generic.v

37 lines
956 B
V
Raw Normal View History

2020-02-03 05:00:36 +01:00
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
2019-07-25 17:49:57 +02:00
// 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.
2020-06-04 10:35:40 +02:00
pub fn xor_bytes(mut dst []byte, a, b []byte) int {
2019-07-25 17:49:57 +02:00
mut n := a.len
if b.len < n {
n = b.len
}
if n == 0 {
return 0
}
safe_xor_bytes(mut dst, a, b, n)
2019-07-25 17:49:57 +02:00
return n
}
// n needs to be smaller or equal than the length of a and b.
2020-06-04 10:35:40 +02:00
pub fn safe_xor_bytes(mut dst []byte, a, b []byte, n int) {
for i in 0..n {
2019-07-25 17:49:57 +02:00
dst[i] = a[i] ^ b[i]
}
}
// fast_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.
2020-06-04 10:35:40 +02:00
pub fn xor_words(mut dst []byte, a, b []byte) {
safe_xor_bytes(mut dst, a, b, b.len)
2019-07-25 17:49:57 +02:00
}