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