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