fizz/crypto/aead/IOBufUtil.cpp (36 lines of code) (raw):
/*
* Copyright (c) 2018-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#include <fizz/crypto/aead/IOBufUtil.h>
using namespace folly;
namespace fizz {
void trimBytes(IOBuf& buf, folly::MutableByteRange trimmed) {
auto trim = trimmed.size();
size_t currentTrim = trim;
IOBuf* current = buf.prev();
// Iterate using the buffer.
do {
size_t toTrim =
std::min(currentTrim, static_cast<size_t>(current->length()));
memcpy(
trimmed.begin() + (currentTrim - toTrim),
current->data() + (current->length() - toTrim),
toTrim);
current->trimEnd(toTrim);
currentTrim -= toTrim;
DCHECK(current != &buf || currentTrim == 0);
current = current->prev();
} while (currentTrim != 0);
}
void trimStart(IOBuf& buf, size_t toTrim) {
// Trimming on the IOBufQueue is slow, it does a bunch of
// pop operations, trimming manually is faster.
auto currentBuffer = &buf;
do {
auto amtTrim = std::min(currentBuffer->length(), toTrim);
currentBuffer->trimStart(amtTrim);
toTrim -= amtTrim;
currentBuffer = currentBuffer->next();
} while (toTrim > 0 && currentBuffer != &buf);
}
void XOR(ByteRange first, MutableByteRange second) {
CHECK_EQ(first.size(), second.size());
for (size_t i = 0; i < first.size(); ++i) {
second[i] ^= first[i];
}
};
} // namespace fizz