2020-02-03 07:00:36 +03:00
|
|
|
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
2019-07-25 18:49:57 +03: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.
|
2019-08-07 09:19:27 +03:00
|
|
|
pub fn xor_bytes(dst mut []byte, a, b []byte) int {
|
2019-07-25 18:49:57 +03:00
|
|
|
mut n := a.len
|
|
|
|
if b.len < n {
|
|
|
|
n = b.len
|
|
|
|
}
|
|
|
|
if n == 0 {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2019-08-07 09:19:27 +03:00
|
|
|
safe_xor_bytes(mut dst, a, b, n)
|
2019-07-25 18:49:57 +03:00
|
|
|
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
// n needs to be smaller or equal than the length of a and b.
|
2019-08-07 09:19:27 +03:00
|
|
|
pub fn safe_xor_bytes(dst mut []byte, a, b []byte, n int) {
|
2019-07-25 18:49:57 +03:00
|
|
|
for i := 0; i < n; i++ {
|
|
|
|
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.
|
2019-08-07 14:37:07 +03:00
|
|
|
pub fn xor_words(dst mut []byte, a, b []byte) {
|
2019-08-07 09:19:27 +03:00
|
|
|
safe_xor_bytes(mut dst, a, b, b.len)
|
2019-07-25 18:49:57 +03:00
|
|
|
}
|