28 typedef std::vector<std::byte> ShiftResult;
30 static bool extract_bit(
const std::byte* data, std::size_t size,
unsigned int n) {
36 const auto mask = std::byte{1} << r;
37 return (data[size - s - 1] & mask) != std::byte{0};
40 static bool extract_bit(
const std::vector<std::byte>& key,
unsigned int n) {
41 return extract_bit(key.data(), key.size(), n);
46 static std::vector<std::byte> shift(
const std::byte* data, std::size_t size,
unsigned int n) {
52 const auto shifted_size = size - s;
53 std::vector<std::byte> shifted(shifted_size);
56 std::ranges::copy(data, data + shifted_size, shifted.begin());
61 std::transform(data, data + shifted_size, shifted.begin(), [r] (std::byte b) { return b >> r; });
62 for (
int i = 1; i < shifted_size; ++i) {
63 shifted[i] |= data[i - 1] << l;
68 static std::vector<std::byte> shift(
const std::vector<std::byte>& key,
unsigned int n) {
69 return shift(key.data(), key.size(), n);