Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/mbedtls/library/aria.c
9903 views
1
/*
2
* ARIA implementation
3
*
4
* Copyright The Mbed TLS Contributors
5
* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6
*/
7
8
/*
9
* This implementation is based on the following standards:
10
* [1] http://210.104.33.10/ARIA/doc/ARIA-specification-e.pdf
11
* [2] https://tools.ietf.org/html/rfc5794
12
*/
13
14
#include "common.h"
15
16
#if defined(MBEDTLS_ARIA_C)
17
18
#include "mbedtls/aria.h"
19
20
#include <string.h>
21
22
#include "mbedtls/platform.h"
23
24
#if !defined(MBEDTLS_ARIA_ALT)
25
26
#include "mbedtls/platform_util.h"
27
28
/*
29
* modify byte order: ( A B C D ) -> ( B A D C ), i.e. swap pairs of bytes
30
*
31
* This is submatrix P1 in [1] Appendix B.1
32
*
33
* Common compilers fail to translate this to minimal number of instructions,
34
* so let's provide asm versions for common platforms with C fallback.
35
*/
36
#if defined(MBEDTLS_HAVE_ASM)
37
#if defined(__arm__) /* rev16 available from v6 up */
38
/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
39
#if defined(__GNUC__) && \
40
(!defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000) && \
41
__ARM_ARCH >= 6
42
static inline uint32_t aria_p1(uint32_t x)
43
{
44
uint32_t r;
45
__asm("rev16 %0, %1" : "=l" (r) : "l" (x));
46
return r;
47
}
48
#define ARIA_P1 aria_p1
49
#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
50
(__TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3)
51
static inline uint32_t aria_p1(uint32_t x)
52
{
53
uint32_t r;
54
__asm("rev16 r, x");
55
return r;
56
}
57
#define ARIA_P1 aria_p1
58
#endif
59
#endif /* arm */
60
#if defined(__GNUC__) && \
61
defined(__i386__) || defined(__amd64__) || defined(__x86_64__)
62
/* I couldn't find an Intel equivalent of rev16, so two instructions */
63
#define ARIA_P1(x) ARIA_P2(ARIA_P3(x))
64
#endif /* x86 gnuc */
65
#endif /* MBEDTLS_HAVE_ASM && GNUC */
66
#if !defined(ARIA_P1)
67
#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
68
#endif
69
70
/*
71
* modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits
72
*
73
* This is submatrix P2 in [1] Appendix B.1
74
*
75
* Common compilers will translate this to a single instruction.
76
*/
77
#define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16))
78
79
/*
80
* modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness
81
*
82
* This is submatrix P3 in [1] Appendix B.1
83
*/
84
#define ARIA_P3(x) MBEDTLS_BSWAP32(x)
85
86
/*
87
* ARIA Affine Transform
88
* (a, b, c, d) = state in/out
89
*
90
* If we denote the first byte of input by 0, ..., the last byte by f,
91
* then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef.
92
*
93
* Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple
94
* rearrangements on adjacent pairs, output is:
95
*
96
* a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe
97
* = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd
98
* b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd
99
* = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc
100
* c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe
101
* = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc
102
* d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef
103
* = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef
104
*
105
* Note: another presentation of the A transform can be found as the first
106
* half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4.
107
* The implementation below uses only P1 and P2 as they are sufficient.
108
*/
109
static inline void aria_a(uint32_t *a, uint32_t *b,
110
uint32_t *c, uint32_t *d)
111
{
112
uint32_t ta, tb, tc;
113
ta = *b; // 4567
114
*b = *a; // 0123
115
*a = ARIA_P2(ta); // 6745
116
tb = ARIA_P2(*d); // efcd
117
*d = ARIA_P1(*c); // 98ba
118
*c = ARIA_P1(tb); // fedc
119
ta ^= *d; // 4567+98ba
120
tc = ARIA_P2(*b); // 2301
121
ta = ARIA_P1(ta) ^ tc ^ *c; // 2301+5476+89ab+fedc
122
tb ^= ARIA_P2(*d); // ba98+efcd
123
tc ^= ARIA_P1(*a); // 2301+7654
124
*b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT
125
tb = ARIA_P2(tb) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc
126
*a ^= ARIA_P1(tb); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT
127
ta = ARIA_P2(ta); // 0123+7654+ab89+dcfe
128
*d ^= ARIA_P1(ta) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT
129
tc = ARIA_P2(tc); // 0123+5476
130
*c ^= ARIA_P1(tc) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT
131
}
132
133
/*
134
* ARIA Substitution Layer SL1 / SL2
135
* (a, b, c, d) = state in/out
136
* (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
137
*
138
* By passing sb1, sb2, is1, is2 as S-Boxes you get SL1
139
* By passing is1, is2, sb1, sb2 as S-Boxes you get SL2
140
*/
141
static inline void aria_sl(uint32_t *a, uint32_t *b,
142
uint32_t *c, uint32_t *d,
143
const uint8_t sa[256], const uint8_t sb[256],
144
const uint8_t sc[256], const uint8_t sd[256])
145
{
146
*a = ((uint32_t) sa[MBEDTLS_BYTE_0(*a)]) ^
147
(((uint32_t) sb[MBEDTLS_BYTE_1(*a)]) << 8) ^
148
(((uint32_t) sc[MBEDTLS_BYTE_2(*a)]) << 16) ^
149
(((uint32_t) sd[MBEDTLS_BYTE_3(*a)]) << 24);
150
*b = ((uint32_t) sa[MBEDTLS_BYTE_0(*b)]) ^
151
(((uint32_t) sb[MBEDTLS_BYTE_1(*b)]) << 8) ^
152
(((uint32_t) sc[MBEDTLS_BYTE_2(*b)]) << 16) ^
153
(((uint32_t) sd[MBEDTLS_BYTE_3(*b)]) << 24);
154
*c = ((uint32_t) sa[MBEDTLS_BYTE_0(*c)]) ^
155
(((uint32_t) sb[MBEDTLS_BYTE_1(*c)]) << 8) ^
156
(((uint32_t) sc[MBEDTLS_BYTE_2(*c)]) << 16) ^
157
(((uint32_t) sd[MBEDTLS_BYTE_3(*c)]) << 24);
158
*d = ((uint32_t) sa[MBEDTLS_BYTE_0(*d)]) ^
159
(((uint32_t) sb[MBEDTLS_BYTE_1(*d)]) << 8) ^
160
(((uint32_t) sc[MBEDTLS_BYTE_2(*d)]) << 16) ^
161
(((uint32_t) sd[MBEDTLS_BYTE_3(*d)]) << 24);
162
}
163
164
/*
165
* S-Boxes
166
*/
167
static const uint8_t aria_sb1[256] =
168
{
169
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
170
0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
171
0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
172
0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
173
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
174
0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
175
0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
176
0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
177
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
178
0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
179
0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
180
0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
181
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
182
0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
183
0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
184
0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
185
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
186
0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
187
0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
188
0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
189
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
190
0xB0, 0x54, 0xBB, 0x16
191
};
192
193
static const uint8_t aria_sb2[256] =
194
{
195
0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46,
196
0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B,
197
0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B,
198
0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB,
199
0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA,
200
0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91,
201
0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38,
202
0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53,
203
0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74,
204
0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26,
205
0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD,
206
0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC,
207
0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E,
208
0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A,
209
0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5,
210
0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8,
211
0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24,
212
0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F,
213
0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
214
0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D,
215
0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A,
216
0xAF, 0xBA, 0xB5, 0x81
217
};
218
219
static const uint8_t aria_is1[256] =
220
{
221
0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
222
0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
223
0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
224
0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
225
0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
226
0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
227
0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
228
0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
229
0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
230
0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
231
0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
232
0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
233
0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
234
0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
235
0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
236
0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
237
0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
238
0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
239
0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
240
0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
241
0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
242
0x55, 0x21, 0x0C, 0x7D
243
};
244
245
static const uint8_t aria_is2[256] =
246
{
247
0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1,
248
0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3,
249
0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89,
250
0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D,
251
0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98,
252
0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58,
253
0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F,
254
0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE,
255
0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23,
256
0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19,
257
0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55,
258
0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A,
259
0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE,
260
0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0,
261
0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6,
262
0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5,
263
0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13,
264
0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73,
265
0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
266
0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3,
267
0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33,
268
0x03, 0xA2, 0xAC, 0x60
269
};
270
271
/*
272
* Helper for key schedule: r = FO( p, k ) ^ x
273
*/
274
static void aria_fo_xor(uint32_t r[4], const uint32_t p[4],
275
const uint32_t k[4], const uint32_t x[4])
276
{
277
uint32_t a, b, c, d;
278
279
a = p[0] ^ k[0];
280
b = p[1] ^ k[1];
281
c = p[2] ^ k[2];
282
d = p[3] ^ k[3];
283
284
aria_sl(&a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2);
285
aria_a(&a, &b, &c, &d);
286
287
r[0] = a ^ x[0];
288
r[1] = b ^ x[1];
289
r[2] = c ^ x[2];
290
r[3] = d ^ x[3];
291
}
292
293
/*
294
* Helper for key schedule: r = FE( p, k ) ^ x
295
*/
296
static void aria_fe_xor(uint32_t r[4], const uint32_t p[4],
297
const uint32_t k[4], const uint32_t x[4])
298
{
299
uint32_t a, b, c, d;
300
301
a = p[0] ^ k[0];
302
b = p[1] ^ k[1];
303
c = p[2] ^ k[2];
304
d = p[3] ^ k[3];
305
306
aria_sl(&a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2);
307
aria_a(&a, &b, &c, &d);
308
309
r[0] = a ^ x[0];
310
r[1] = b ^ x[1];
311
r[2] = c ^ x[2];
312
r[3] = d ^ x[3];
313
}
314
315
/*
316
* Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup.
317
*
318
* We chose to store bytes into 32-bit words in little-endian format (see
319
* MBEDTLS_GET_UINT32_LE / MBEDTLS_PUT_UINT32_LE ) so we need to reverse
320
* bytes here.
321
*/
322
static void aria_rot128(uint32_t r[4], const uint32_t a[4],
323
const uint32_t b[4], uint8_t n)
324
{
325
uint8_t i, j;
326
uint32_t t, u;
327
328
const uint8_t n1 = n % 32; // bit offset
329
const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
330
331
j = (n / 32) % 4; // initial word offset
332
t = ARIA_P3(b[j]); // big endian
333
for (i = 0; i < 4; i++) {
334
j = (j + 1) % 4; // get next word, big endian
335
u = ARIA_P3(b[j]);
336
t <<= n1; // rotate
337
t |= u >> n2;
338
t = ARIA_P3(t); // back to little endian
339
r[i] = a[i] ^ t; // store
340
t = u; // move to next word
341
}
342
}
343
344
/*
345
* Set encryption key
346
*/
347
int mbedtls_aria_setkey_enc(mbedtls_aria_context *ctx,
348
const unsigned char *key, unsigned int keybits)
349
{
350
/* round constant masks */
351
const uint32_t rc[3][4] =
352
{
353
{ 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
354
{ 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
355
{ 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
356
};
357
358
int i;
359
uint32_t w[4][4], *w2;
360
361
if (keybits != 128 && keybits != 192 && keybits != 256) {
362
return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
363
}
364
365
/* Copy key to W0 (and potential remainder to W1) */
366
w[0][0] = MBEDTLS_GET_UINT32_LE(key, 0);
367
w[0][1] = MBEDTLS_GET_UINT32_LE(key, 4);
368
w[0][2] = MBEDTLS_GET_UINT32_LE(key, 8);
369
w[0][3] = MBEDTLS_GET_UINT32_LE(key, 12);
370
371
memset(w[1], 0, 16);
372
if (keybits >= 192) {
373
w[1][0] = MBEDTLS_GET_UINT32_LE(key, 16); // 192 bit key
374
w[1][1] = MBEDTLS_GET_UINT32_LE(key, 20);
375
}
376
if (keybits == 256) {
377
w[1][2] = MBEDTLS_GET_UINT32_LE(key, 24); // 256 bit key
378
w[1][3] = MBEDTLS_GET_UINT32_LE(key, 28);
379
}
380
381
i = (keybits - 128) >> 6; // index: 0, 1, 2
382
ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
383
384
aria_fo_xor(w[1], w[0], rc[i], w[1]); // W1 = FO(W0, CK1) ^ KR
385
i = i < 2 ? i + 1 : 0;
386
aria_fe_xor(w[2], w[1], rc[i], w[0]); // W2 = FE(W1, CK2) ^ W0
387
i = i < 2 ? i + 1 : 0;
388
aria_fo_xor(w[3], w[2], rc[i], w[1]); // W3 = FO(W2, CK3) ^ W1
389
390
for (i = 0; i < 4; i++) { // create round keys
391
w2 = w[(i + 1) & 3];
392
aria_rot128(ctx->rk[i], w[i], w2, 128 - 19);
393
aria_rot128(ctx->rk[i + 4], w[i], w2, 128 - 31);
394
aria_rot128(ctx->rk[i + 8], w[i], w2, 61);
395
aria_rot128(ctx->rk[i + 12], w[i], w2, 31);
396
}
397
aria_rot128(ctx->rk[16], w[0], w[1], 19);
398
399
/* w holds enough info to reconstruct the round keys */
400
mbedtls_platform_zeroize(w, sizeof(w));
401
402
return 0;
403
}
404
405
/*
406
* Set decryption key
407
*/
408
#if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
409
int mbedtls_aria_setkey_dec(mbedtls_aria_context *ctx,
410
const unsigned char *key, unsigned int keybits)
411
{
412
int i, j, k, ret;
413
414
ret = mbedtls_aria_setkey_enc(ctx, key, keybits);
415
if (ret != 0) {
416
return ret;
417
}
418
419
/* flip the order of round keys */
420
for (i = 0, j = ctx->nr; i < j; i++, j--) {
421
for (k = 0; k < 4; k++) {
422
uint32_t t = ctx->rk[i][k];
423
ctx->rk[i][k] = ctx->rk[j][k];
424
ctx->rk[j][k] = t;
425
}
426
}
427
428
/* apply affine transform to middle keys */
429
for (i = 1; i < ctx->nr; i++) {
430
aria_a(&ctx->rk[i][0], &ctx->rk[i][1],
431
&ctx->rk[i][2], &ctx->rk[i][3]);
432
}
433
434
return 0;
435
}
436
#endif /* !MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
437
438
/*
439
* Encrypt a block
440
*/
441
int mbedtls_aria_crypt_ecb(mbedtls_aria_context *ctx,
442
const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
443
unsigned char output[MBEDTLS_ARIA_BLOCKSIZE])
444
{
445
int i;
446
447
uint32_t a, b, c, d;
448
449
a = MBEDTLS_GET_UINT32_LE(input, 0);
450
b = MBEDTLS_GET_UINT32_LE(input, 4);
451
c = MBEDTLS_GET_UINT32_LE(input, 8);
452
d = MBEDTLS_GET_UINT32_LE(input, 12);
453
454
i = 0;
455
while (1) {
456
a ^= ctx->rk[i][0];
457
b ^= ctx->rk[i][1];
458
c ^= ctx->rk[i][2];
459
d ^= ctx->rk[i][3];
460
i++;
461
462
aria_sl(&a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2);
463
aria_a(&a, &b, &c, &d);
464
465
a ^= ctx->rk[i][0];
466
b ^= ctx->rk[i][1];
467
c ^= ctx->rk[i][2];
468
d ^= ctx->rk[i][3];
469
i++;
470
471
aria_sl(&a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2);
472
if (i >= ctx->nr) {
473
break;
474
}
475
aria_a(&a, &b, &c, &d);
476
}
477
478
/* final key mixing */
479
a ^= ctx->rk[i][0];
480
b ^= ctx->rk[i][1];
481
c ^= ctx->rk[i][2];
482
d ^= ctx->rk[i][3];
483
484
MBEDTLS_PUT_UINT32_LE(a, output, 0);
485
MBEDTLS_PUT_UINT32_LE(b, output, 4);
486
MBEDTLS_PUT_UINT32_LE(c, output, 8);
487
MBEDTLS_PUT_UINT32_LE(d, output, 12);
488
489
return 0;
490
}
491
492
/* Initialize context */
493
void mbedtls_aria_init(mbedtls_aria_context *ctx)
494
{
495
memset(ctx, 0, sizeof(mbedtls_aria_context));
496
}
497
498
/* Clear context */
499
void mbedtls_aria_free(mbedtls_aria_context *ctx)
500
{
501
if (ctx == NULL) {
502
return;
503
}
504
505
mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aria_context));
506
}
507
508
#if defined(MBEDTLS_CIPHER_MODE_CBC)
509
/*
510
* ARIA-CBC buffer encryption/decryption
511
*/
512
int mbedtls_aria_crypt_cbc(mbedtls_aria_context *ctx,
513
int mode,
514
size_t length,
515
unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
516
const unsigned char *input,
517
unsigned char *output)
518
{
519
unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
520
521
if ((mode != MBEDTLS_ARIA_ENCRYPT) && (mode != MBEDTLS_ARIA_DECRYPT)) {
522
return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
523
}
524
525
if (length % MBEDTLS_ARIA_BLOCKSIZE) {
526
return MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH;
527
}
528
529
if (mode == MBEDTLS_ARIA_DECRYPT) {
530
while (length > 0) {
531
memcpy(temp, input, MBEDTLS_ARIA_BLOCKSIZE);
532
mbedtls_aria_crypt_ecb(ctx, input, output);
533
534
mbedtls_xor(output, output, iv, MBEDTLS_ARIA_BLOCKSIZE);
535
536
memcpy(iv, temp, MBEDTLS_ARIA_BLOCKSIZE);
537
538
input += MBEDTLS_ARIA_BLOCKSIZE;
539
output += MBEDTLS_ARIA_BLOCKSIZE;
540
length -= MBEDTLS_ARIA_BLOCKSIZE;
541
}
542
} else {
543
while (length > 0) {
544
mbedtls_xor(output, input, iv, MBEDTLS_ARIA_BLOCKSIZE);
545
546
mbedtls_aria_crypt_ecb(ctx, output, output);
547
memcpy(iv, output, MBEDTLS_ARIA_BLOCKSIZE);
548
549
input += MBEDTLS_ARIA_BLOCKSIZE;
550
output += MBEDTLS_ARIA_BLOCKSIZE;
551
length -= MBEDTLS_ARIA_BLOCKSIZE;
552
}
553
}
554
555
return 0;
556
}
557
#endif /* MBEDTLS_CIPHER_MODE_CBC */
558
559
#if defined(MBEDTLS_CIPHER_MODE_CFB)
560
/*
561
* ARIA-CFB128 buffer encryption/decryption
562
*/
563
int mbedtls_aria_crypt_cfb128(mbedtls_aria_context *ctx,
564
int mode,
565
size_t length,
566
size_t *iv_off,
567
unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
568
const unsigned char *input,
569
unsigned char *output)
570
{
571
unsigned char c;
572
size_t n;
573
574
if ((mode != MBEDTLS_ARIA_ENCRYPT) && (mode != MBEDTLS_ARIA_DECRYPT)) {
575
return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
576
}
577
578
n = *iv_off;
579
580
/* An overly large value of n can lead to an unlimited
581
* buffer overflow. */
582
if (n >= MBEDTLS_ARIA_BLOCKSIZE) {
583
return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
584
}
585
586
if (mode == MBEDTLS_ARIA_DECRYPT) {
587
while (length--) {
588
if (n == 0) {
589
mbedtls_aria_crypt_ecb(ctx, iv, iv);
590
}
591
592
c = *input++;
593
*output++ = c ^ iv[n];
594
iv[n] = c;
595
596
n = (n + 1) & 0x0F;
597
}
598
} else {
599
while (length--) {
600
if (n == 0) {
601
mbedtls_aria_crypt_ecb(ctx, iv, iv);
602
}
603
604
iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
605
606
n = (n + 1) & 0x0F;
607
}
608
}
609
610
*iv_off = n;
611
612
return 0;
613
}
614
#endif /* MBEDTLS_CIPHER_MODE_CFB */
615
616
#if defined(MBEDTLS_CIPHER_MODE_CTR)
617
/*
618
* ARIA-CTR buffer encryption/decryption
619
*/
620
int mbedtls_aria_crypt_ctr(mbedtls_aria_context *ctx,
621
size_t length,
622
size_t *nc_off,
623
unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
624
unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
625
const unsigned char *input,
626
unsigned char *output)
627
{
628
int c, i;
629
size_t n;
630
631
n = *nc_off;
632
/* An overly large value of n can lead to an unlimited
633
* buffer overflow. */
634
if (n >= MBEDTLS_ARIA_BLOCKSIZE) {
635
return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
636
}
637
638
while (length--) {
639
if (n == 0) {
640
mbedtls_aria_crypt_ecb(ctx, nonce_counter,
641
stream_block);
642
643
for (i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i--) {
644
if (++nonce_counter[i - 1] != 0) {
645
break;
646
}
647
}
648
}
649
c = *input++;
650
*output++ = (unsigned char) (c ^ stream_block[n]);
651
652
n = (n + 1) & 0x0F;
653
}
654
655
*nc_off = n;
656
657
return 0;
658
}
659
#endif /* MBEDTLS_CIPHER_MODE_CTR */
660
#endif /* !MBEDTLS_ARIA_ALT */
661
662
#if defined(MBEDTLS_SELF_TEST)
663
664
/*
665
* Basic ARIA ECB test vectors from RFC 5794
666
*/
667
static const uint8_t aria_test1_ecb_key[32] = // test key
668
{
669
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
670
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
671
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
672
0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
673
};
674
675
static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
676
{
677
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
678
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
679
};
680
681
static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
682
{
683
{ 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
684
0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
685
{ 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
686
0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
687
{ 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
688
0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
689
};
690
691
/*
692
* Mode tests from "Test Vectors for ARIA" Version 1.0
693
* http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
694
*/
695
#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
696
defined(MBEDTLS_CIPHER_MODE_CTR))
697
static const uint8_t aria_test2_key[32] =
698
{
699
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
700
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
701
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
702
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
703
};
704
705
static const uint8_t aria_test2_pt[48] =
706
{
707
0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
708
0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
709
0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
710
0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
711
0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
712
0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
713
};
714
#endif
715
716
#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
717
static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
718
{
719
0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
720
0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
721
};
722
#endif
723
724
#if defined(MBEDTLS_CIPHER_MODE_CBC)
725
static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
726
{
727
{ 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
728
0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
729
0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
730
0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
731
0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
732
0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
733
{ 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
734
0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
735
0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
736
0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
737
0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
738
0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
739
{ 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
740
0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
741
0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
742
0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
743
0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
744
0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
745
};
746
#endif /* MBEDTLS_CIPHER_MODE_CBC */
747
748
#if defined(MBEDTLS_CIPHER_MODE_CFB)
749
static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
750
{
751
{ 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
752
0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
753
0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
754
0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
755
0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
756
0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
757
{ 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
758
0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
759
0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
760
0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
761
0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
762
0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
763
{ 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
764
0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
765
0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
766
0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
767
0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
768
0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
769
};
770
#endif /* MBEDTLS_CIPHER_MODE_CFB */
771
772
#if defined(MBEDTLS_CIPHER_MODE_CTR)
773
static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
774
{
775
{ 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
776
0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
777
0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
778
0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
779
0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
780
0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
781
{ 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
782
0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
783
0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
784
0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
785
0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
786
0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
787
{ 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
788
0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
789
0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
790
0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
791
0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
792
0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
793
};
794
#endif /* MBEDTLS_CIPHER_MODE_CFB */
795
796
#define ARIA_SELF_TEST_ASSERT(cond) \
797
do { \
798
if (cond) { \
799
if (verbose) \
800
mbedtls_printf("failed\n"); \
801
goto exit; \
802
} else { \
803
if (verbose) \
804
mbedtls_printf("passed\n"); \
805
} \
806
} while (0)
807
808
/*
809
* Checkup routine
810
*/
811
int mbedtls_aria_self_test(int verbose)
812
{
813
int i;
814
uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
815
mbedtls_aria_context ctx;
816
int ret = 1;
817
818
#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
819
size_t j;
820
#endif
821
822
#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
823
defined(MBEDTLS_CIPHER_MODE_CFB) || \
824
defined(MBEDTLS_CIPHER_MODE_CTR))
825
uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
826
#endif
827
828
mbedtls_aria_init(&ctx);
829
830
/*
831
* Test set 1
832
*/
833
for (i = 0; i < 3; i++) {
834
/* test ECB encryption */
835
if (verbose) {
836
mbedtls_printf(" ARIA-ECB-%d (enc): ", 128 + 64 * i);
837
}
838
mbedtls_aria_setkey_enc(&ctx, aria_test1_ecb_key, 128 + 64 * i);
839
mbedtls_aria_crypt_ecb(&ctx, aria_test1_ecb_pt, blk);
840
ARIA_SELF_TEST_ASSERT(
841
memcmp(blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE)
842
!= 0);
843
844
/* test ECB decryption */
845
if (verbose) {
846
mbedtls_printf(" ARIA-ECB-%d (dec): ", 128 + 64 * i);
847
#if defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
848
mbedtls_printf("skipped\n");
849
#endif
850
}
851
852
#if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
853
mbedtls_aria_setkey_dec(&ctx, aria_test1_ecb_key, 128 + 64 * i);
854
mbedtls_aria_crypt_ecb(&ctx, aria_test1_ecb_ct[i], blk);
855
ARIA_SELF_TEST_ASSERT(
856
memcmp(blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE)
857
!= 0);
858
#endif
859
}
860
if (verbose) {
861
mbedtls_printf("\n");
862
}
863
864
/*
865
* Test set 2
866
*/
867
#if defined(MBEDTLS_CIPHER_MODE_CBC)
868
for (i = 0; i < 3; i++) {
869
/* Test CBC encryption */
870
if (verbose) {
871
mbedtls_printf(" ARIA-CBC-%d (enc): ", 128 + 64 * i);
872
}
873
mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
874
memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
875
memset(buf, 0x55, sizeof(buf));
876
mbedtls_aria_crypt_cbc(&ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
877
aria_test2_pt, buf);
878
ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_cbc_ct[i], 48)
879
!= 0);
880
881
/* Test CBC decryption */
882
if (verbose) {
883
mbedtls_printf(" ARIA-CBC-%d (dec): ", 128 + 64 * i);
884
}
885
mbedtls_aria_setkey_dec(&ctx, aria_test2_key, 128 + 64 * i);
886
memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
887
memset(buf, 0xAA, sizeof(buf));
888
mbedtls_aria_crypt_cbc(&ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
889
aria_test2_cbc_ct[i], buf);
890
ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0);
891
}
892
if (verbose) {
893
mbedtls_printf("\n");
894
}
895
896
#endif /* MBEDTLS_CIPHER_MODE_CBC */
897
898
#if defined(MBEDTLS_CIPHER_MODE_CFB)
899
for (i = 0; i < 3; i++) {
900
/* Test CFB encryption */
901
if (verbose) {
902
mbedtls_printf(" ARIA-CFB-%d (enc): ", 128 + 64 * i);
903
}
904
mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
905
memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
906
memset(buf, 0x55, sizeof(buf));
907
j = 0;
908
mbedtls_aria_crypt_cfb128(&ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
909
aria_test2_pt, buf);
910
ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_cfb_ct[i], 48) != 0);
911
912
/* Test CFB decryption */
913
if (verbose) {
914
mbedtls_printf(" ARIA-CFB-%d (dec): ", 128 + 64 * i);
915
}
916
mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
917
memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
918
memset(buf, 0xAA, sizeof(buf));
919
j = 0;
920
mbedtls_aria_crypt_cfb128(&ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
921
iv, aria_test2_cfb_ct[i], buf);
922
ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0);
923
}
924
if (verbose) {
925
mbedtls_printf("\n");
926
}
927
#endif /* MBEDTLS_CIPHER_MODE_CFB */
928
929
#if defined(MBEDTLS_CIPHER_MODE_CTR)
930
for (i = 0; i < 3; i++) {
931
/* Test CTR encryption */
932
if (verbose) {
933
mbedtls_printf(" ARIA-CTR-%d (enc): ", 128 + 64 * i);
934
}
935
mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
936
memset(iv, 0, MBEDTLS_ARIA_BLOCKSIZE); // IV = 0
937
memset(buf, 0x55, sizeof(buf));
938
j = 0;
939
mbedtls_aria_crypt_ctr(&ctx, 48, &j, iv, blk,
940
aria_test2_pt, buf);
941
ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_ctr_ct[i], 48) != 0);
942
943
/* Test CTR decryption */
944
if (verbose) {
945
mbedtls_printf(" ARIA-CTR-%d (dec): ", 128 + 64 * i);
946
}
947
mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
948
memset(iv, 0, MBEDTLS_ARIA_BLOCKSIZE); // IV = 0
949
memset(buf, 0xAA, sizeof(buf));
950
j = 0;
951
mbedtls_aria_crypt_ctr(&ctx, 48, &j, iv, blk,
952
aria_test2_ctr_ct[i], buf);
953
ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0);
954
}
955
if (verbose) {
956
mbedtls_printf("\n");
957
}
958
#endif /* MBEDTLS_CIPHER_MODE_CTR */
959
960
ret = 0;
961
962
exit:
963
mbedtls_aria_free(&ctx);
964
return ret;
965
}
966
967
#endif /* MBEDTLS_SELF_TEST */
968
969
#endif /* MBEDTLS_ARIA_C */
970
971