diff --git a/benchmark/bench_crypto.cpp b/benchmark/bench_crypto.cpp index 4d4edd0fd..e77f703a8 100644 --- a/benchmark/bench_crypto.cpp +++ b/benchmark/bench_crypto.cpp @@ -346,11 +346,11 @@ class Crc64Bench : public td::Benchmark { int main() { td::init_openssl_threads(); - td::bench(AesIgeShortBench()); td::bench(AesIgeEncryptBench()); td::bench(AesIgeDecryptBench()); td::bench(AesCtrBench()); td::bench(AesEcbBench()); + td::bench(AesIgeShortBench()); td::bench(Pbkdf2Bench()); td::bench(RandBench()); diff --git a/tdutils/td/utils/crypto.cpp b/tdutils/td/utils/crypto.cpp index fdcbba806..efefce438 100644 --- a/tdutils/td/utils/crypto.cpp +++ b/tdutils/td/utils/crypto.cpp @@ -75,11 +75,13 @@ struct AesBlock { } AesBlock inc() const { - AesBlock res; + AesBlock res = *this; auto ptr = res.raw(); - for (int i = 15; i >= 0; i--) { - if (++ptr[i] != 0) { - break; + if (++ptr[15] == 0) { + for (int i = 14; i >= 0; i--) { + if (++ptr[i] != 0) { + break; + } } } return res; @@ -91,21 +93,23 @@ static_assert(sizeof(AesBlock) == AES_BLOCK_SIZE, ""); class XorBytes { public: static void run(const uint8 *a, const uint8 *b, uint8 *c, size_t n) { - XorBytes xorer; - xorer.a = a; - xorer.b = b; - xorer.c = c; - xorer.n = n; - xorer.step<16>(); - xorer.step<1>(); + static constexpr int BLOCK_SIZE = 16; + auto block_cnt = n / BLOCK_SIZE; + n -= block_cnt * BLOCK_SIZE; + while (block_cnt-- > 0) { + Block a_big = as>(a); + Block b_big = as>(b); + as>(c) = a_big ^ b_big; + a += BLOCK_SIZE; + b += BLOCK_SIZE; + c += BLOCK_SIZE; + } + while (n-- > 0) { + c[n] = a[n] ^ b[n]; + } } private: - const uint8 *a; - const uint8 *b; - uint8 *c; - size_t n; - template struct alignas(N) Block { uint8 data[N]; @@ -117,20 +121,6 @@ class XorBytes { return res; } }; - - template - void step() { - auto cnt = n / N; - n -= cnt * N; - for (size_t i = 0; i < cnt; i++) { - Block a_big = as>(a); - Block b_big = as>(b); - as>(c) = a_big ^ b_big; - a += N; - b += N; - c += N; - } - } }; struct AesCtrCounterPack {