Implement profiler
This commit is contained in:
50
aes.cpp
50
aes.cpp
@@ -3,7 +3,9 @@
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
|
||||
const FiniteFieldCalculator AES::ffcalc(0x11b);
|
||||
#include "profiler.hpp"
|
||||
|
||||
const uint8_t AES::irreducible_polynomial = 0x1b;
|
||||
|
||||
const uint8_t AES::sbox[256] = {
|
||||
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
|
||||
@@ -56,6 +58,7 @@ const uint8_t AES::rc[10] = {
|
||||
|
||||
void AES::print_data(uint8_t data[16])
|
||||
{
|
||||
PROFILER_RECORD;
|
||||
for (int i = 0;i < 16;i++)
|
||||
{
|
||||
std::cout << std::hex << (int) data[i] << " ";
|
||||
@@ -65,6 +68,7 @@ void AES::print_data(uint8_t data[16])
|
||||
|
||||
void AES::encrypt_ecb(uint8_t data[16], const uint8_t key[16])
|
||||
{
|
||||
PROFILER_RECORD;
|
||||
uint8_t round_keys[11][16];
|
||||
construct_round_keys(key, round_keys);
|
||||
add_round_key(data, round_keys[0]);
|
||||
@@ -82,6 +86,7 @@ void AES::encrypt_ecb(uint8_t data[16], const uint8_t key[16])
|
||||
|
||||
void AES::add_round_key(uint8_t data_[16], const uint8_t key_[16])
|
||||
{
|
||||
PROFILER_RECORD;
|
||||
const uint32_t (&key)[4] = *reinterpret_cast<const uint32_t (*)[4]>(key_);
|
||||
uint32_t (&data)[4] = *reinterpret_cast<uint32_t (*)[4]>(data_);
|
||||
for (int i = 0;i < 4;i++)
|
||||
@@ -92,6 +97,7 @@ void AES::add_round_key(uint8_t data_[16], const uint8_t key_[16])
|
||||
|
||||
void AES::sub_bytes(uint8_t data[16])
|
||||
{
|
||||
PROFILER_RECORD;
|
||||
for (int i = 0;i < 16;i++)
|
||||
{
|
||||
data[i] = sbox[data[i]];
|
||||
@@ -102,6 +108,7 @@ void AES::sub_bytes(uint8_t data[16])
|
||||
|
||||
void AES::shift_rows(uint8_t data[16])
|
||||
{
|
||||
PROFILER_RECORD;
|
||||
uint8_t tmp = data[1];
|
||||
data[1] = data[5];
|
||||
data[5] = data[9];
|
||||
@@ -122,19 +129,21 @@ void AES::shift_rows(uint8_t data[16])
|
||||
|
||||
void AES::mix_columns(uint8_t data[16])
|
||||
{
|
||||
PROFILER_RECORD;
|
||||
uint8_t data_new[16];
|
||||
for (int i = 0;i < 4;i++)
|
||||
{
|
||||
data_new[i * 4 + 0] = ffcalc.mult2(data[i * 4 + 0]) ^ ffcalc.mult3(data[i * 4 + 1]) ^ data[i * 4 + 2] ^ data[i * 4 + 3];
|
||||
data_new[i * 4 + 1] = data[i * 4 + 0] ^ ffcalc.mult2(data[i * 4 + 1]) ^ ffcalc.mult3(data[i * 4 + 2]) ^ data[i * 4 + 3];
|
||||
data_new[i * 4 + 2] = data[i * 4 + 0] ^ data[i * 4 + 1] ^ ffcalc.mult2(data[i * 4 + 2]) ^ ffcalc.mult3(data[i * 4 + 3]);
|
||||
data_new[i * 4 + 3] = ffcalc.mult3(data[i * 4 + 0]) ^ data[i * 4 + 1] ^ data[i * 4 + 2] ^ ffcalc.mult2(data[i * 4 + 3]);
|
||||
data_new[i * 4 + 0] = gf_mult2(data[i * 4 + 0]) ^ gf_mult3(data[i * 4 + 1]) ^ data[i * 4 + 2] ^ data[i * 4 + 3];
|
||||
data_new[i * 4 + 1] = data[i * 4 + 0] ^ gf_mult2(data[i * 4 + 1]) ^ gf_mult3(data[i * 4 + 2]) ^ data[i * 4 + 3];
|
||||
data_new[i * 4 + 2] = data[i * 4 + 0] ^ data[i * 4 + 1] ^ gf_mult2(data[i * 4 + 2]) ^ gf_mult3(data[i * 4 + 3]);
|
||||
data_new[i * 4 + 3] = gf_mult3(data[i * 4 + 0]) ^ data[i * 4 + 1] ^ data[i * 4 + 2] ^ gf_mult2(data[i * 4 + 3]);
|
||||
}
|
||||
memcpy(data, data_new, 16);
|
||||
}
|
||||
|
||||
void AES::construct_round_keys(const uint8_t initial_key_[16], uint8_t round_keys_[11][16])
|
||||
{
|
||||
PROFILER_RECORD;
|
||||
const uint32_t (&initial_key)[4] = *reinterpret_cast<const uint32_t (*)[4]>(initial_key_);
|
||||
uint32_t (&round_keys)[11][4] = *reinterpret_cast<uint32_t (*)[11][4]>(round_keys_);
|
||||
for (int k = 0;k < 4;k++)
|
||||
@@ -152,6 +161,7 @@ void AES::construct_round_keys(const uint8_t initial_key_[16], uint8_t round_key
|
||||
|
||||
uint32_t AES::roundkey_g(uint32_t last_roundkey, uint8_t round)
|
||||
{
|
||||
PROFILER_RECORD;
|
||||
uint32_t result;
|
||||
uint8_t *last = (uint8_t*) &last_roundkey;
|
||||
uint8_t *next = (uint8_t*) &result;
|
||||
@@ -162,24 +172,15 @@ uint32_t AES::roundkey_g(uint32_t last_roundkey, uint8_t round)
|
||||
return result;
|
||||
}
|
||||
|
||||
FiniteFieldCalculator::FiniteFieldCalculator(uint16_t irreducible_polynomial)
|
||||
: irreducible_polynomial(irreducible_polynomial)
|
||||
uint8_t AES::gf_reduce(uint8_t value)
|
||||
{
|
||||
// Nothing to do
|
||||
PROFILER_RECORD;
|
||||
return value ^ irreducible_polynomial;
|
||||
}
|
||||
|
||||
uint16_t FiniteFieldCalculator::get_irreducible_polynomial() const
|
||||
{
|
||||
return irreducible_polynomial;
|
||||
}
|
||||
|
||||
uint8_t FiniteFieldCalculator::reduce(uint16_t value) const
|
||||
{
|
||||
return (uint8_t) add(value, get_irreducible_polynomial());
|
||||
}
|
||||
|
||||
uint8_t FiniteFieldCalculator::mult2(uint8_t value) const
|
||||
uint8_t AES::gf_mult2(uint8_t value)
|
||||
{
|
||||
PROFILER_RECORD;
|
||||
uint16_t result = ((uint16_t) value) << 1;
|
||||
if ((result & 0x100) == 0)
|
||||
{
|
||||
@@ -187,14 +188,13 @@ uint8_t FiniteFieldCalculator::mult2(uint8_t value) const
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0;i < 50;i++)
|
||||
;
|
||||
return reduce(result);
|
||||
return gf_reduce(result);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t FiniteFieldCalculator::mult3(uint8_t value) const
|
||||
uint8_t AES::gf_mult3(uint8_t value)
|
||||
{
|
||||
uint8_t result = mult2(value);
|
||||
return add(result, value);
|
||||
PROFILER_RECORD;
|
||||
uint8_t result = gf_mult2(value);
|
||||
return result ^ value;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user