blob: 6bfdfbdce2b822bef6318a684f0edd6ed194d0df [file] [log] [blame]
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001/*
2 * ARIA implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00005 * 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.
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000018 */
19
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +010020/*
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
Gilles Peskinedb09ef62020-06-03 01:43:33 +020026#include "common.h"
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000027
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
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +020045#include "mbedtls/platform_util.h"
46
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +010047#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
48 !defined(inline) && !defined(__cplusplus)
49#define inline __inline
50#endif
51
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050052/* 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
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010058/*
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +010059 * modify byte order: ( A B C D ) -> ( B A D C ), i.e. swap pairs of bytes
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010060 *
61 * This is submatrix P1 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010062 *
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.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010065 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010066#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010067#if defined(__arm__) /* rev16 available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010068/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
69#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010070 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
71 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010072static inline uint32_t aria_p1( uint32_t x )
73{
74 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +010075 __asm( "rev16 %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010076 return( r );
77}
78#define ARIA_P1 aria_p1
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010079#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
80 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +010081static inline uint32_t aria_p1( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010082{
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__)
Manuel Pégourié-Gonnard2df4bfe2018-05-22 13:39:01 +020092/* I couldn't find an Intel equivalent of rev16, so two instructions */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010093#define ARIA_P1(x) ARIA_P2( ARIA_P3( x ) )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010094#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010095#endif /* MBEDTLS_HAVE_ASM && GNUC */
96#if !defined(ARIA_P1)
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010097#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010098#endif
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000099
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100100/*
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
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100104 *
105 * Common compilers will translate this to a single instruction.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100106 */
107#define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16))
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000108
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100109/*
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100110 * 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
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100113 *
114 * Some compilers fail to translate this to a single instruction,
115 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100116 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100117#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100118#if defined(__arm__) /* rev available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100119/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
120#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100121 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
122 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100123static inline uint32_t aria_p3( uint32_t x )
124{
125 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100126 __asm( "rev %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100127 return( r );
128}
129#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100130#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
131 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100132static inline uint32_t aria_p3( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100133{
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__)
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100143static inline uint32_t aria_p3( uint32_t x )
144{
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100145 __asm( "bswap %0" : "=r" (x) : "0" (x) );
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100146 return( x );
147}
148#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100149#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100150#endif /* MBEDTLS_HAVE_ASM && GNUC */
151#if !defined(ARIA_P3)
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100152#define ARIA_P3(x) ARIA_P2( ARIA_P1 ( x ) )
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100153#endif
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100154
155/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100156 * ARIA Affine Transform
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100157 * (a, b, c, d) = state in/out
158 *
Manuel Pégourié-Gonnardd418b0d2018-05-22 12:56:11 +0200159 * If we denote the first byte of input by 0, ..., the last byte by f,
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100160 * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef.
161 *
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100162 * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100163 * rearrangements on adjacent pairs, output is:
164 *
165 * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe
166 * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100167 * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100168 * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100169 * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100170 * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100171 * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100172 * = 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.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100177 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100178static inline void aria_a( uint32_t *a, uint32_t *b,
179 uint32_t *c, uint32_t *d )
180{
181 uint32_t ta, tb, tc;
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100182 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
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000200}
201
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100202/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100203 * ARIA Substitution Layer SL1 / SL2
204 * (a, b, c, d) = state in/out
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100205 * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100206 *
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100207 * 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
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100209 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100210static inline void aria_sl( uint32_t *a, uint32_t *b,
211 uint32_t *c, uint32_t *d,
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200212 const uint8_t sa[256], const uint8_t sb[256],
213 const uint8_t sc[256], const uint8_t sd[256] )
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100214{
Joe Subbianicd84d762021-07-08 14:59:52 +0100215 *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[ *a >> 24 ]) << 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[ *b >> 24 ]) << 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[ *c >> 24 ]) << 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[ *d >> 24 ]) << 24);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000231}
232
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100233/*
234 * S-Boxes
235 */
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200236static const uint8_t aria_sb1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000237{
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
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200262static const uint8_t aria_sb2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000263{
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
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200288static const uint8_t aria_is1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000289{
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
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200314static const uint8_t aria_is2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000315{
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};
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000339
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100340/*
341 * Helper for key schedule: r = FO( p, k ) ^ x
342 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100343static void aria_fo_xor( uint32_t r[4], const uint32_t p[4],
344 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000345{
346 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000347
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
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100353 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
354 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000355
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
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100362/*
363 * Helper for key schedule: r = FE( p, k ) ^ x
364 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100365static void aria_fe_xor( uint32_t r[4], const uint32_t p[4],
366 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000367{
368 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000369
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
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100375 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
376 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000377
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
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100384/*
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
Joe Subbiani394bdd62021-07-07 15:16:56 +0100388 * MBEDTLS_GET_UINT32_LE / MBEDTLS_PUT_UINT32_LE ) so we need to reverse
389 * bytes here.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100390 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100391static void aria_rot128( uint32_t r[4], const uint32_t a[4],
392 const uint32_t b[4], uint8_t n )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000393{
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100394 uint8_t i, j;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000395 uint32_t t, u;
396
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100397 const uint8_t n1 = n % 32; // bit offset
398 const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100399
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200400 j = ( n / 32 ) % 4; // initial word offset
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100401 t = ARIA_P3( b[j] ); // big endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000402 for( i = 0; i < 4; i++ )
403 {
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200404 j = ( j + 1 ) % 4; // get next word, big endian
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100405 u = ARIA_P3( b[j] );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000406 t <<= n1; // rotate
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100407 t |= u >> n2;
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100408 t = ARIA_P3( t ); // back to little endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000409 r[i] = a[i] ^ t; // store
410 t = u; // move to next word
411 }
412}
413
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100414/*
415 * Set encryption key
416 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100417int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx,
418 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000419{
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100420 /* round constant masks */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000421 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;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500430 ARIA_VALIDATE_RET( ctx != NULL );
431 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000432
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100433 if( keybits != 128 && keybits != 192 && keybits != 256 )
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500434 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000435
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100436 /* Copy key to W0 (and potential remainder to W1) */
Joe Subbiani6a506312021-07-07 16:56:29 +0100437 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 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000441
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100442 memset( w[1], 0, 16 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000443 if( keybits >= 192 )
444 {
Joe Subbiani6a506312021-07-07 16:56:29 +0100445 w[1][0] = MBEDTLS_GET_UINT32_LE( key, 16 ); // 192 bit key
446 w[1][1] = MBEDTLS_GET_UINT32_LE( key, 20 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000447 }
448 if( keybits == 256 )
449 {
Joe Subbiani6a506312021-07-07 16:56:29 +0100450 w[1][2] = MBEDTLS_GET_UINT32_LE( key, 24 ); // 256 bit key
451 w[1][3] = MBEDTLS_GET_UINT32_LE( key, 28 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000452 }
453
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200454 i = ( keybits - 128 ) >> 6; // index: 0, 1, 2
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000455 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
456
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100457 aria_fo_xor( w[1], w[0], rc[i], w[1] ); // W1 = FO(W0, CK1) ^ KR
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000458 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100459 aria_fe_xor( w[2], w[1], rc[i], w[0] ); // W2 = FE(W1, CK2) ^ W0
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000460 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100461 aria_fo_xor( w[3], w[2], rc[i], w[1] ); // W3 = FO(W2, CK3) ^ W1
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000462
463 for( i = 0; i < 4; i++ ) // create round keys
464 {
465 w2 = w[(i + 1) & 3];
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100466 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 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000470 }
471 aria_rot128( ctx->rk[16], w[0], w[1], 19 );
472
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200473 /* w holds enough info to reconstruct the round keys */
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200474 mbedtls_platform_zeroize( w, sizeof( w ) );
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200475
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100476 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000477}
478
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100479/*
480 * Set decryption key
481 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100482int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx,
483 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000484{
485 int i, j, k, ret;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500486 ARIA_VALIDATE_RET( ctx != NULL );
487 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000488
489 ret = mbedtls_aria_setkey_enc( ctx, key, keybits );
490 if( ret != 0 )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100491 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000492
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100493 /* flip the order of round keys */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000494 for( i = 0, j = ctx->nr; i < j; i++, j-- )
495 {
496 for( k = 0; k < 4; k++ )
497 {
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100498 uint32_t t = ctx->rk[i][k];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000499 ctx->rk[i][k] = ctx->rk[j][k];
500 ctx->rk[j][k] = t;
501 }
502 }
503
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100504 /* apply affine transform to middle keys */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100505 for( i = 1; i < ctx->nr; i++ )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100506 {
507 aria_a( &ctx->rk[i][0], &ctx->rk[i][1],
508 &ctx->rk[i][2], &ctx->rk[i][3] );
509 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000510
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100511 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000512}
513
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100514/*
515 * Encrypt a block
516 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000517int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100518 const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
519 unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000520{
521 int i;
522
523 uint32_t a, b, c, d;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500524 ARIA_VALIDATE_RET( ctx != NULL );
525 ARIA_VALIDATE_RET( input != NULL );
526 ARIA_VALIDATE_RET( output != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000527
Joe Subbiani6a506312021-07-07 16:56:29 +0100528 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 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000532
533 i = 0;
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100534 while( 1 )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000535 {
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++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100541
542 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
543 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000544
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++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100550
551 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100552 if( i >= ctx->nr )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000553 break;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100554 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000555 }
556
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100557 /* 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];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000562
Joe Subbiani5ecac212021-06-24 13:00:03 +0100563 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 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000567
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100568 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000569}
570
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100571/* Initialize context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000572void mbedtls_aria_init( mbedtls_aria_context *ctx )
573{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500574 ARIA_VALIDATE( ctx != NULL );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000575 memset( ctx, 0, sizeof( mbedtls_aria_context ) );
576}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000577
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100578/* Clear context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000579void mbedtls_aria_free( mbedtls_aria_context *ctx )
580{
581 if( ctx == NULL )
582 return;
583
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200584 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aria_context ) );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000585}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000586
587#if defined(MBEDTLS_CIPHER_MODE_CBC)
588/*
589 * ARIA-CBC buffer encryption/decryption
590 */
591int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100592 int mode,
593 size_t length,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100594 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100595 const unsigned char *input,
596 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000597{
598 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100599 unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000600
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500601 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
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100608 if( length % MBEDTLS_ARIA_BLOCKSIZE )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000609 return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH );
610
611 if( mode == MBEDTLS_ARIA_DECRYPT )
612 {
613 while( length > 0 )
614 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100615 memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200616 mbedtls_aria_crypt_ecb( ctx, input, output );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000617
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100618 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000619 output[i] = (unsigned char)( output[i] ^ iv[i] );
620
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100621 memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000622
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100623 input += MBEDTLS_ARIA_BLOCKSIZE;
624 output += MBEDTLS_ARIA_BLOCKSIZE;
625 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000626 }
627 }
628 else
629 {
630 while( length > 0 )
631 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100632 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000633 output[i] = (unsigned char)( input[i] ^ iv[i] );
634
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200635 mbedtls_aria_crypt_ecb( ctx, output, output );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100636 memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000637
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100638 input += MBEDTLS_ARIA_BLOCKSIZE;
639 output += MBEDTLS_ARIA_BLOCKSIZE;
640 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000641 }
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 */
652int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100653 int mode,
654 size_t length,
655 size_t *iv_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100656 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100657 const unsigned char *input,
658 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000659{
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200660 unsigned char c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500661 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 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000678
679 if( mode == MBEDTLS_ARIA_DECRYPT )
680 {
681 while( length-- )
682 {
683 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200684 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000685
686 c = *input++;
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200687 *output++ = c ^ iv[n];
688 iv[n] = c;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000689
690 n = ( n + 1 ) & 0x0F;
691 }
692 }
693 else
694 {
695 while( length-- )
696 {
697 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200698 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000699
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 */
716int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100717 size_t length,
718 size_t *nc_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100719 unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
720 unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100721 const unsigned char *input,
722 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000723{
724 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500725 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 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000740
741 while( length-- )
742 {
743 if( n == 0 ) {
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200744 mbedtls_aria_crypt_ecb( ctx, nonce_counter,
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000745 stream_block );
746
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100747 for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000748 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
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100766/*
767 * Basic ARIA ECB test vectors from RFC 5794
768 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000769static 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
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100777static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000778{
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
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100783static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000784{
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
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100793/*
794 * Mode tests from "Test Vectors for ARIA" Version 1.0
795 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
796 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000797#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000798 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000799static 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
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000807static 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};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000816#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000817
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000818#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100819static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000820{
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
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000825
826#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100827static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000828{
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)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100851static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000852{
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)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100875static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000876{
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
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000898#define ARIA_SELF_TEST_IF_FAIL \
899 { \
900 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300901 mbedtls_printf( "failed\n" ); \
Gilles Peskinebe89fea2021-05-25 09:17:22 +0200902 goto exit; \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000903 } else { \
904 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300905 mbedtls_printf( "passed\n" ); \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000906 }
907
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100908/*
909 * Checkup routine
910 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000911int mbedtls_aria_self_test( int verbose )
912{
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000913 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100914 uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000915 mbedtls_aria_context ctx;
Gilles Peskinebe89fea2021-05-25 09:17:22 +0200916 int ret = 1;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000917
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000918#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
919 size_t j;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000920#endif
921
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000922#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
923 defined(MBEDTLS_CIPHER_MODE_CFB) || \
924 defined(MBEDTLS_CIPHER_MODE_CTR))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100925 uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000926#endif
927
Gilles Peskinebe89fea2021-05-25 09:17:22 +0200928 mbedtls_aria_init( &ctx );
929
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100930 /*
931 * Test set 1
932 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000933 for( i = 0; i < 3; i++ )
934 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100935 /* test ECB encryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000936 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300937 mbedtls_printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000938 mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200939 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_pt, blk );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100940 if( memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000941 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000942
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100943 /* test ECB decryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000944 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300945 mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000946 mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200947 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100948 if( memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000949 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000950 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000951 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300952 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000953
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100954 /*
955 * Test set 2
956 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000957#if defined(MBEDTLS_CIPHER_MODE_CBC)
958 for( i = 0; i < 3; i++ )
959 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100960 /* Test CBC encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000961 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300962 mbedtls_printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000963 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100964 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100965 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000966 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
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100971 /* Test CBC decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000972 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300973 mbedtls_printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000974 mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100975 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100976 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000977 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 )
Ron Eldord1a47622018-08-13 13:49:52 +0300983 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000984
985#endif /* MBEDTLS_CIPHER_MODE_CBC */
986
987#if defined(MBEDTLS_CIPHER_MODE_CFB)
988 for( i = 0; i < 3; i++ )
989 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100990 /* Test CFB encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000991 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300992 mbedtls_printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000993 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100994 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100995 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000996 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
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001002 /* Test CFB decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001003 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001004 mbedtls_printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001005 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001006 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001007 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001008 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 )
Ron Eldord1a47622018-08-13 13:49:52 +03001015 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001016#endif /* MBEDTLS_CIPHER_MODE_CFB */
1017
1018#if defined(MBEDTLS_CIPHER_MODE_CTR)
1019 for( i = 0; i < 3; i++ )
1020 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001021 /* Test CTR encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001022 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001023 mbedtls_printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001024 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001025 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001026 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001027 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
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001033 /* Test CTR decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001034 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001035 mbedtls_printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001036 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001037 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001038 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001039 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 )
Ron Eldord1a47622018-08-13 13:49:52 +03001046 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001047#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001048
Gilles Peskinebe89fea2021-05-25 09:17:22 +02001049 ret = 0;
1050
1051exit:
1052 mbedtls_aria_free( &ctx );
1053 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001054}
1055
1056#endif /* MBEDTLS_SELF_TEST */
1057
1058#endif /* MBEDTLS_ARIA_C */