diff options
author | wwylele <wwylele@gmail.com> | 2017-01-01 13:58:02 +0100 |
---|---|---|
committer | wwylele <wwylele@gmail.com> | 2017-02-21 22:57:31 +0100 |
commit | ea1ea0224c04753402e0b6472080f0c5d90a7a46 (patch) | |
tree | d6823e52d913418d63ec3f0b7ed12eb763a98899 /src/core/hw/aes/arithmetic128.cpp | |
parent | Merge pull request #2562 from yuriks/pica-refactor3 (diff) | |
download | yuzu-ea1ea0224c04753402e0b6472080f0c5d90a7a46.tar yuzu-ea1ea0224c04753402e0b6472080f0c5d90a7a46.tar.gz yuzu-ea1ea0224c04753402e0b6472080f0c5d90a7a46.tar.bz2 yuzu-ea1ea0224c04753402e0b6472080f0c5d90a7a46.tar.lz yuzu-ea1ea0224c04753402e0b6472080f0c5d90a7a46.tar.xz yuzu-ea1ea0224c04753402e0b6472080f0c5d90a7a46.tar.zst yuzu-ea1ea0224c04753402e0b6472080f0c5d90a7a46.zip |
Diffstat (limited to 'src/core/hw/aes/arithmetic128.cpp')
-rw-r--r-- | src/core/hw/aes/arithmetic128.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/core/hw/aes/arithmetic128.cpp b/src/core/hw/aes/arithmetic128.cpp new file mode 100644 index 000000000..55b954a52 --- /dev/null +++ b/src/core/hw/aes/arithmetic128.cpp @@ -0,0 +1,47 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <algorithm> +#include <functional> +#include "core/hw/aes/arithmetic128.h" + +namespace HW { +namespace AES { + +AESKey Lrot128(const AESKey& in, u32 rot) { + AESKey out; + rot %= 128; + const u32 byte_shift = rot / 8; + const u32 bit_shift = rot % 8; + + for (u32 i = 0; i < 16; i++) { + const u32 wrap_index_a = (i + byte_shift) % 16; + const u32 wrap_index_b = (i + byte_shift + 1) % 16; + out[i] = ((in[wrap_index_a] << bit_shift) | (in[wrap_index_b] >> (8 - bit_shift))) & 0xFF; + } + return out; +} + +AESKey Add128(const AESKey& a, const AESKey& b) { + AESKey out; + u32 carry = 0; + u32 sum = 0; + + for (int i = 15; i >= 0; i--) { + sum = a[i] + b[i] + carry; + carry = sum >> 8; + out[i] = static_cast<u8>(sum & 0xff); + } + + return out; +} + +AESKey Xor128(const AESKey& a, const AESKey& b) { + AESKey out; + std::transform(a.cbegin(), a.cend(), b.cbegin(), out.begin(), std::bit_xor<>()); + return out; +} + +} // namespace AES +} // namespace HW |