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