From 1fb7736a6061f7088656392a1b38b402d5d228c1 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Tue, 16 Jun 2015 20:47:55 +0300 Subject: cxx: include data structures & I/O functions --- cxx/include/aesnixx/all.hpp | 1 + cxx/include/aesnixx/data.hpp | 110 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 cxx/include/aesnixx/data.hpp (limited to 'cxx/include') diff --git a/cxx/include/aesnixx/all.hpp b/cxx/include/aesnixx/all.hpp index cf00535..f105059 100644 --- a/cxx/include/aesnixx/all.hpp +++ b/cxx/include/aesnixx/all.hpp @@ -8,4 +8,5 @@ #pragma once +#include "data.hpp" #include "error.hpp" diff --git a/cxx/include/aesnixx/data.hpp b/cxx/include/aesnixx/data.hpp new file mode 100644 index 0000000..9eec56c --- /dev/null +++ b/cxx/include/aesnixx/data.hpp @@ -0,0 +1,110 @@ +/** + * \file + * \author Egor Tensin + * \date 2015 + * \copyright This file is licensed under the terms of the MIT License. + * See LICENSE.txt for details. + */ + +#pragma once + +#include "error.hpp" + +#include + +#include + +#include +#include + +namespace aesni +{ + typedef AesNI_Block128 Block128; + typedef AesNI_Block192 Block192; + typedef AesNI_Block256 Block256; + + typedef AesNI_KeySchedule128 KeySchedule128; + typedef AesNI_KeySchedule192 KeySchedule192; + typedef AesNI_KeySchedule256 KeySchedule256; + + template + inline std::size_t get_number_of_keys(const KeyScheduleT& key_schedule) + { + return sizeof(key_schedule) / sizeof(Block128); + } + + inline void make_block(Block128& dest, int hi3, int hi2, int lo1, int lo0) + { + dest = aesni_make_block128(hi3, hi2, lo1, lo0); + } + + inline void make_block(Block192& dest, int hi5, int hi4, int hi3, int lo2, int lo1, int lo0) + { + dest = aesni_make_block192(hi5, hi4, hi3, lo2, lo1, lo0); + } + + inline void make_block(Block256& dest, int hi7, int hi6, int hi5, int hi4, int lo3, int lo2, int lo1, int lo0) + { + dest = aesni_make_block256(hi7, hi6, hi5, hi4, lo3, lo2, lo1, lo0); + } + + std::string to_string(const Block128& block) + { + AesNI_BlockString128 str; + aesni_format_block128(&str, &block, ErrorDetailsThrowsInDestructor()); + return std::string(str.str); + } + + std::string to_string(const Block192& block) + { + AesNI_BlockString192 str; + aesni_format_block192(&str, &block, ErrorDetailsThrowsInDestructor()); + return std::string(str.str); + } + + std::string to_string(const Block256& block) + { + AesNI_BlockString256 str; + aesni_format_block256(&str, &block, ErrorDetailsThrowsInDestructor()); + return std::string(str.str); + } + + std::string to_matrix_string(const Block128& block) + { + AesNI_BlockMatrixString128 str; + aesni_format_block128_as_matrix(&str, &block, ErrorDetailsThrowsInDestructor()); + return std::string(str.str); + } + + std::string to_matrix_string(const Block192& block) + { + AesNI_BlockMatrixString192 str; + aesni_format_block192_as_matrix(&str, &block, ErrorDetailsThrowsInDestructor()); + return std::string(str.str); + } + + std::string to_matrix_string(const Block256& block) + { + AesNI_BlockMatrixString256 str; + aesni_format_block256_as_matrix(&str, &block, ErrorDetailsThrowsInDestructor()); + return std::string(str.str); + } +} + +namespace +{ + std::ostream& operator<<(std::ostream& os, const aesni::Block128& block) + { + return os << aesni::to_string(block); + } + + std::ostream& operator<<(std::ostream& os, const aesni::Block192& block) + { + return os << aesni::to_string(block); + } + + std::ostream& operator<<(std::ostream& os, const aesni::Block256& block) + { + return os << aesni::to_string(block); + } +} -- cgit v1.2.3