aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/cxx/include/aesnixx/data.hpp
blob: c667e942ac8e16a5220d59825bfa4a49904f452f (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
133
134
135
136
137
138
139
140
/**
 * \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 "error.hpp"

#include <aesni/all.h>

#include <cstdlib>

#include <ostream>
#include <string>

namespace aesni
{
    typedef AesNI_Block128 Block128;
    typedef AesNI_Block192 Block192;
    typedef AesNI_Block256 Block256;

    typedef AesNI_Aes128_RoundKeys KeySchedule128;
    typedef AesNI_Aes192_RoundKeys KeySchedule192;
    typedef AesNI_Aes256_RoundKeys KeySchedule256;

    template <typename KeyScheduleT>
    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);
    }

    void from_string(Block128& dest, const char* src)
    {
        aesni_parse_block128(&dest, src, ErrorDetailsThrowsInDestructor());
    }

    void from_string(Block192& dest, const char* src)
    {
        aesni_parse_block192(&dest, src, ErrorDetailsThrowsInDestructor());
    }

    void from_string(Block256& dest, const char* src)
    {
        aesni_parse_block256(&dest, src, ErrorDetailsThrowsInDestructor());
    }

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

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

    void from_string(Block256& dest, const std::string& src)
    {
        return from_string(dest, src.c_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);
    }
}