aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/cxx/include/aesnixx/api.hpp
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2015-08-02 20:35:38 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2015-08-02 20:35:38 +0300
commit2f7feb1d9222e0afaac8ae17db98d1556aa46aa4 (patch)
tree84adde32dc3ff844f7c7e63477c2d0cc0529e7ac /cxx/include/aesnixx/api.hpp
parentcxx: more mode helpers (diff)
downloadaes-tools-2f7feb1d9222e0afaac8ae17db98d1556aa46aa4.tar.gz
aes-tools-2f7feb1d9222e0afaac8ae17db98d1556aa46aa4.zip
cxx: more algorithm-agnostic API
The code (in the utilities in particular) is a mess though, so a refactoring's coming up.
Diffstat (limited to 'cxx/include/aesnixx/api.hpp')
-rw-r--r--cxx/include/aesnixx/api.hpp171
1 files changed, 171 insertions, 0 deletions
diff --git a/cxx/include/aesnixx/api.hpp b/cxx/include/aesnixx/api.hpp
new file mode 100644
index 0000000..6995ae2
--- /dev/null
+++ b/cxx/include/aesnixx/api.hpp
@@ -0,0 +1,171 @@
+/**
+ * \file
+ * \author Egor Tensin <Egor.Tensin@gmail.com>
+ * \date 2015
+ * \copyright This file is licensed under the terms of the MIT License.
+ * See LICENSE.txt for details.
+ */
+
+#pragma once
+
+#include "algorithm.hpp"
+#include "mode.hpp"
+
+#include <cstddef>
+
+#include <string>
+#include <type_traits>
+
+namespace aesni
+{
+ template <Algorithm algorithm>
+ struct Types;
+
+ template <Algorithm algorithm>
+ std::size_t get_number_of_rounds();
+
+ template <Algorithm algorithm>
+ void from_string(
+ typename Types<algorithm>::Block&,
+ const char*);
+
+ template <Algorithm algorithm>
+ inline void from_string(
+ typename Types<algorithm>::Block& dest,
+ const std::string& src)
+ {
+ from_string<algorithm>(dest, src.c_str());
+ }
+
+ template <Algorithm algorithm>
+ std::string to_string(const typename Types<algorithm>::Block&);
+
+ template <Algorithm algorithm>
+ std::string to_matrix_string(const typename Types<algorithm>::Block&);
+
+ template <Algorithm algorithm>
+ void from_string(
+ typename Types<algorithm>::Key&,
+ const char*);
+
+ template <Algorithm algorithm>
+ inline void from_string(
+ typename Types<algorithm>::Key& dest,
+ const std::string& src)
+ {
+ from_string<algorithm>(dest, src.c_str());
+ }
+
+ template <Algorithm algorithm>
+ std::string to_string(const typename Types<algorithm>::Key&);
+
+ template <Algorithm algorithm>
+ inline void expand_key(
+ const typename Types<algorithm>::Key& key,
+ typename Types<algorithm>::RoundKeys& encryption_keys);
+
+ template <Algorithm algorithm>
+ inline void derive_decryption_keys(
+ const typename Types<algorithm>::RoundKeys& encryption_keys,
+ typename Types<algorithm>::RoundKeys& decryption_keys);
+
+ template <Algorithm algorithm, Mode mode, typename std::enable_if<ModeRequiresInitializationVector<mode>::value>::type* = 0>
+ inline void encrypt_block(
+ const typename Types<algorithm>::Block& plaintext,
+ const typename Types<algorithm>::RoundKeys& round_keys,
+ typename Types<algorithm>::Block& iv,
+ typename Types<algorithm>::Block& ciphertext);
+
+ template <Algorithm algorithm, Mode mode, typename std::enable_if<!ModeRequiresInitializationVector<mode>::value>::type* = 0>
+ inline void encrypt_block(
+ const typename Types<algorithm>::Block& plaintext,
+ const typename Types<algorithm>::RoundKeys& round_keys,
+ typename Types<algorithm>::Block& ciphertext);
+
+ template <Algorithm algorithm, Mode mode, typename std::enable_if<!ModeRequiresInitializationVector<mode>::value>::type* = 0>
+ inline void encrypt_block(
+ const typename Types<algorithm>::Block& plaintext,
+ const typename Types<algorithm>::RoundKeys& round_keys,
+ typename Types<algorithm>::Block&,
+ typename Types<algorithm>::Block& ciphertext)
+ {
+ encrypt_block<algorithm, mode>(plaintext, round_keys, ciphertext);
+ }
+
+ template <Algorithm algorithm, Mode mode, typename std::enable_if<ModeRequiresInitializationVector<mode>::value>::type* = 0>
+ inline void decrypt_block(
+ const typename Types<algorithm>::Block& ciphertext,
+ const typename Types<algorithm>::RoundKeys& round_keys,
+ typename Types<algorithm>::Block& iv,
+ typename Types<algorithm>::Block& plaintext);
+
+ template <Algorithm algorithm, Mode mode, typename std::enable_if<!ModeRequiresInitializationVector<mode>::value>::type* = 0>
+ inline void decrypt_block(
+ const typename Types<algorithm>::Block& ciphertext,
+ const typename Types<algorithm>::RoundKeys& round_keys,
+ typename Types<algorithm>::Block& plaintext);
+
+ template <Algorithm algorithm, Mode mode, typename std::enable_if<!ModeRequiresInitializationVector<mode>::value>::type* = 0>
+ inline void decrypt_block(
+ const typename Types<algorithm>::Block& ciphertext,
+ const typename Types<algorithm>::RoundKeys& round_keys,
+ typename Types<algorithm>::Block&,
+ typename Types<algorithm>::Block& plaintext)
+ {
+ decrypt_block<algorithm, mode>(ciphertext, round_keys, plaintext);
+ }
+
+ template <Algorithm algorithm, Mode mode>
+ struct EncryptWrapper
+ {
+ EncryptWrapper(
+ const typename Types<algorithm>::Key& key,
+ const typename Types<algorithm>::Block& iv) : iv(iv)
+ {
+ expand_key<algorithm>(key, encryption_keys);
+ }
+
+ inline void encrypt_block(
+ const typename Types<algorithm>::Block& plaintext,
+ typename Types<algorithm>::Block& ciphertext)
+ {
+ aesni::encrypt_block<algorithm, mode>(
+ plaintext, encryption_keys, iv, ciphertext);
+ }
+
+ typename Types<algorithm>::Block iv;
+ typename Types<algorithm>::RoundKeys encryption_keys;
+ };
+
+ template <Algorithm algorithm, Mode mode>
+ struct DecryptWrapper
+ {
+ DecryptWrapper(
+ const typename Types<algorithm>::Key& key,
+ const typename Types<algorithm>::Block& iv) : iv(iv)
+ {
+ typename Types<algorithm>::RoundKeys encryption_keys;
+ expand_key<algorithm>(key, encryption_keys);
+
+ if (ModeUsesEncryptionKeysOnly<mode>::value)
+ {
+ decryption_keys = encryption_keys;
+ }
+ else
+ {
+ derive_decryption_keys<algorithm>(encryption_keys, decryption_keys);
+ }
+ }
+
+ inline void decrypt_block(
+ const typename Types<algorithm>::Block& ciphertext,
+ typename Types<algorithm>::Block& plaintext)
+ {
+ aesni::decrypt_block<algorithm, mode>(
+ ciphertext, decryption_keys, iv, plaintext);
+ }
+
+ typename Types<algorithm>::Block iv;
+ typename Types<algorithm>::RoundKeys decryption_keys;
+ };
+}