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
aria_p1(uint32_t x)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)
aria_p1(uint32_t x)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 */
aria_a(uint32_t * a,uint32_t * b,uint32_t * c,uint32_t * d)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 */
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])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 */
aria_fo_xor(uint32_t r[4],const uint32_t p[4],const uint32_t k[4],const uint32_t x[4])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 */
aria_fe_xor(uint32_t r[4],const uint32_t p[4],const uint32_t k[4],const uint32_t x[4])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 */
aria_rot128(uint32_t r[4],const uint32_t a[4],const uint32_t b[4],uint8_t n)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 */
mbedtls_aria_setkey_enc(mbedtls_aria_context * ctx,const unsigned char * key,unsigned int keybits)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)
mbedtls_aria_setkey_dec(mbedtls_aria_context * ctx,const unsigned char * key,unsigned int keybits)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 */
mbedtls_aria_crypt_ecb(mbedtls_aria_context * ctx,const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],unsigned char output[MBEDTLS_ARIA_BLOCKSIZE])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 */
mbedtls_aria_init(mbedtls_aria_context * ctx)493 void mbedtls_aria_init(mbedtls_aria_context *ctx)
494 {
495 memset(ctx, 0, sizeof(mbedtls_aria_context));
496 }
497
498 /* Clear context */
mbedtls_aria_free(mbedtls_aria_context * ctx)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 */
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)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 */
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)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 */
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)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 */
mbedtls_aria_self_test(int verbose)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