-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmixColumns.cpp
30 lines (23 loc) · 956 Bytes
/
mixColumns.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "mixColumns.h"
#include <vector>
#include <cstdint>
// Function to perform Galois multiplication of a byte by 2
uint8_t galoisMultiplyBy2(uint8_t value) {
return (value << 1) ^ ((value >> 7) * 0x1b);
}
// Function to perform Galois multiplication of a byte by 3
uint8_t galoisMultiplyBy3(uint8_t value) {
return galoisMultiplyBy2(value) ^ value;
}
void mixColumns(std::vector<uint8_t> &block) {
for (size_t i = 0; i < 4; ++i) {
uint8_t s0 = block[i * 4 + 0];
uint8_t s1 = block[i * 4 + 1];
uint8_t s2 = block[i * 4 + 2];
uint8_t s3 = block[i * 4 + 3];
block[i * 4 + 0] = galoisMultiplyBy2(s0) ^ galoisMultiplyBy3(s1) ^ s2 ^ s3;
block[i * 4 + 1] = s0 ^ galoisMultiplyBy2(s1) ^ galoisMultiplyBy3(s2) ^ s3;
block[i * 4 + 2] = s0 ^ s1 ^ galoisMultiplyBy2(s2) ^ galoisMultiplyBy3(s3);
block[i * 4 + 3] = galoisMultiplyBy3(s0) ^ s1 ^ s2 ^ galoisMultiplyBy2(s3);
}
}