aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/cxx/include/aesnixx/aes.hpp
blob: 55dfa0e21dfd826d2d2f2a633289bb746f679dad (plain) (blame)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
 * \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.
 */

#include "data.hpp"

#include <aesni/all.h>

#include <string>

#pragma once

namespace aesni
{
    namespace aes
    {
        typedef AesNI_Aes_Block Block;

        typedef AesNI_Aes128_Key Key128;
        typedef AesNI_Aes192_Key Key192;
        typedef AesNI_Aes256_Key Key256;

        inline void make_block(Block& dest, int hi3, int hi2, int lo1, int lo0)
        {
            aesni_aes_make_block(&dest, hi3, hi2, lo1, lo0);
        }

        inline void make_key(Key128& dest, int hi3, int hi2, int lo1, int lo0)
        {
            aesni_aes128_make_key(&dest, hi3, hi2, lo1, lo0);
        }

        inline void make_key(Key192& dest, int hi5, int hi4, int hi3, int lo2, int lo1, int lo0)
        {
            aesni_aes192_make_key(&dest, hi5, hi4, hi3, lo2, lo1, lo0);
        }

        inline void make_key(Key256& dest, int hi7, int hi6, int hi5, int hi4, int lo3, int lo2, int lo1, int lo0)
        {
            aesni_aes256_make_key(&dest, hi7, hi6, hi5, hi4, lo3, lo2, lo1, lo0);
        }

        std::string to_string(const Block& block)
        {
            AesNI_Aes_BlockString str;
            aesni_aes_format_block(&str, &block, ErrorDetailsThrowsInDestructor());
            return std::string(str.str);
        }

        std::string to_matrix_string(const Block& block)
        {
            AesNI_Aes_BlockMatrixString str;
            aesni_aes_format_block_as_matrix(&str, &block, ErrorDetailsThrowsInDestructor());
            return std::string(str.str);
        }

        inline void from_string(Block& dest, const char* src)
        {
            aesni_aes_parse_block(&dest, src, ErrorDetailsThrowsInDestructor());
        }

        inline void from_string(Block& dest, const std::string& src)
        {
            from_string(dest, src.c_str());
        }

        std::string to_string(const Key128& block)
        {
            AesNI_Aes128_KeyString str;
            aesni_aes128_format_key(&str, &block, ErrorDetailsThrowsInDestructor());
            return std::string(str.str);
        }

        std::string to_string(const Key192& block)
        {
            AesNI_Aes192_KeyString str;
            aesni_aes192_format_key(&str, &block, ErrorDetailsThrowsInDestructor());
            return std::string(str.str);
        }

        std::string to_string(const Key256& block)
        {
            AesNI_Aes256_KeyString str;
            aesni_aes256_format_key(&str, &block, ErrorDetailsThrowsInDestructor());
            return std::string(str.str);
        }

        inline void from_string(Key128& dest, const char* src)
        {
            aesni_aes128_parse_key(&dest, src, ErrorDetailsThrowsInDestructor());
        }

        inline void from_string(Key192& dest, const char* src)
        {
            aesni_aes192_parse_key(&dest, src, ErrorDetailsThrowsInDestructor());
        }

        inline void from_string(Key256& dest, const char* src)
        {
            aesni_aes256_parse_key(&dest, src, ErrorDetailsThrowsInDestructor());
        }

        inline void from_string(Key128& dest, const std::string& src)
        {
            return from_string(dest, src.c_str());
        }

        inline void from_string(Key192& dest, const std::string& src)
        {
            return from_string(dest, src.c_str());
        }

        inline void from_string(Key256& dest, const std::string& src)
        {
            return from_string(dest, src.c_str());
        }

        typedef AesNI_Aes128_RoundKeys RoundKeys128;
        typedef AesNI_Aes192_RoundKeys RoundKeys192;
        typedef AesNI_Aes256_RoundKeys RoundKeys256;

        template <typename RoundKeysT>
        inline std::size_t get_number_of_rounds(const RoundKeysT& round_keys)
        {
            return sizeof(round_keys) / sizeof(Block128);
        }
    }
}