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