blob: a6319d3e29fa7b08dde8001673619f3c7647d36e [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{
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100215 *a = ( (uint32_t) sa[ *a & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100216 (((uint32_t) sb[(*a >> 8) & 0xFF]) << 8) ^
217 (((uint32_t) sc[(*a >> 16) & 0xFF]) << 16) ^
218 (((uint32_t) sd[ *a >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100219 *b = ( (uint32_t) sa[ *b & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100220 (((uint32_t) sb[(*b >> 8) & 0xFF]) << 8) ^
221 (((uint32_t) sc[(*b >> 16) & 0xFF]) << 16) ^
222 (((uint32_t) sd[ *b >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100223 *c = ( (uint32_t) sa[ *c & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100224 (((uint32_t) sb[(*c >> 8) & 0xFF]) << 8) ^
225 (((uint32_t) sc[(*c >> 16) & 0xFF]) << 16) ^
226 (((uint32_t) sd[ *c >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100227 *d = ( (uint32_t) sa[ *d & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100228 (((uint32_t) sb[(*d >> 8) & 0xFF]) << 8) ^
229 (((uint32_t) sc[(*d >> 16) & 0xFF]) << 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 Subbiani5ecac212021-06-24 13:00:03 +0100388 * GET/MBEDTLS_PUT_UINT32_LE) so we need to reverse bytes here.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100389 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100390static void aria_rot128( uint32_t r[4], const uint32_t a[4],
391 const uint32_t b[4], uint8_t n )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000392{
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100393 uint8_t i, j;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000394 uint32_t t, u;
395
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100396 const uint8_t n1 = n % 32; // bit offset
397 const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100398
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200399 j = ( n / 32 ) % 4; // initial word offset
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100400 t = ARIA_P3( b[j] ); // big endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000401 for( i = 0; i < 4; i++ )
402 {
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200403 j = ( j + 1 ) % 4; // get next word, big endian
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100404 u = ARIA_P3( b[j] );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000405 t <<= n1; // rotate
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100406 t |= u >> n2;
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100407 t = ARIA_P3( t ); // back to little endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000408 r[i] = a[i] ^ t; // store
409 t = u; // move to next word
410 }
411}
412
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100413/*
414 * Set encryption key
415 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100416int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx,
417 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000418{
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100419 /* round constant masks */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000420 const uint32_t rc[3][4] =
421 {
422 { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
423 { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
424 { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
425 };
426
427 int i;
428 uint32_t w[4][4], *w2;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500429 ARIA_VALIDATE_RET( ctx != NULL );
430 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000431
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100432 if( keybits != 128 && keybits != 192 && keybits != 256 )
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500433 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000434
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100435 /* Copy key to W0 (and potential remainder to W1) */
Joe Subbiani5ecac212021-06-24 13:00:03 +0100436 MBEDTLS_GET_UINT32_LE( w[0][0], key, 0 );
437 MBEDTLS_GET_UINT32_LE( w[0][1], key, 4 );
438 MBEDTLS_GET_UINT32_LE( w[0][2], key, 8 );
439 MBEDTLS_GET_UINT32_LE( w[0][3], key, 12 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000440
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100441 memset( w[1], 0, 16 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000442 if( keybits >= 192 )
443 {
Joe Subbiani5ecac212021-06-24 13:00:03 +0100444 MBEDTLS_GET_UINT32_LE( w[1][0], key, 16 ); // 192 bit key
445 MBEDTLS_GET_UINT32_LE( w[1][1], key, 20 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000446 }
447 if( keybits == 256 )
448 {
Joe Subbiani5ecac212021-06-24 13:00:03 +0100449 MBEDTLS_GET_UINT32_LE( w[1][2], key, 24 ); // 256 bit key
450 MBEDTLS_GET_UINT32_LE( w[1][3], key, 28 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000451 }
452
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200453 i = ( keybits - 128 ) >> 6; // index: 0, 1, 2
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000454 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
455
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100456 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 +0000457 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100458 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 +0000459 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100460 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 +0000461
462 for( i = 0; i < 4; i++ ) // create round keys
463 {
464 w2 = w[(i + 1) & 3];
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100465 aria_rot128( ctx->rk[i ], w[i], w2, 128 - 19 );
466 aria_rot128( ctx->rk[i + 4], w[i], w2, 128 - 31 );
467 aria_rot128( ctx->rk[i + 8], w[i], w2, 61 );
468 aria_rot128( ctx->rk[i + 12], w[i], w2, 31 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000469 }
470 aria_rot128( ctx->rk[16], w[0], w[1], 19 );
471
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200472 /* w holds enough info to reconstruct the round keys */
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200473 mbedtls_platform_zeroize( w, sizeof( w ) );
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200474
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100475 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000476}
477
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100478/*
479 * Set decryption key
480 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100481int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx,
482 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000483{
484 int i, j, k, ret;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500485 ARIA_VALIDATE_RET( ctx != NULL );
486 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000487
488 ret = mbedtls_aria_setkey_enc( ctx, key, keybits );
489 if( ret != 0 )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100490 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000491
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100492 /* flip the order of round keys */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000493 for( i = 0, j = ctx->nr; i < j; i++, j-- )
494 {
495 for( k = 0; k < 4; k++ )
496 {
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100497 uint32_t t = ctx->rk[i][k];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000498 ctx->rk[i][k] = ctx->rk[j][k];
499 ctx->rk[j][k] = t;
500 }
501 }
502
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100503 /* apply affine transform to middle keys */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100504 for( i = 1; i < ctx->nr; i++ )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100505 {
506 aria_a( &ctx->rk[i][0], &ctx->rk[i][1],
507 &ctx->rk[i][2], &ctx->rk[i][3] );
508 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000509
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100510 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000511}
512
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100513/*
514 * Encrypt a block
515 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000516int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100517 const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
518 unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000519{
520 int i;
521
522 uint32_t a, b, c, d;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500523 ARIA_VALIDATE_RET( ctx != NULL );
524 ARIA_VALIDATE_RET( input != NULL );
525 ARIA_VALIDATE_RET( output != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000526
Joe Subbiani5ecac212021-06-24 13:00:03 +0100527 MBEDTLS_GET_UINT32_LE( a, input, 0 );
528 MBEDTLS_GET_UINT32_LE( b, input, 4 );
529 MBEDTLS_GET_UINT32_LE( c, input, 8 );
530 MBEDTLS_GET_UINT32_LE( d, input, 12 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000531
532 i = 0;
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100533 while( 1 )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000534 {
535 a ^= ctx->rk[i][0];
536 b ^= ctx->rk[i][1];
537 c ^= ctx->rk[i][2];
538 d ^= ctx->rk[i][3];
539 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100540
541 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
542 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000543
544 a ^= ctx->rk[i][0];
545 b ^= ctx->rk[i][1];
546 c ^= ctx->rk[i][2];
547 d ^= ctx->rk[i][3];
548 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100549
550 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100551 if( i >= ctx->nr )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000552 break;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100553 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000554 }
555
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100556 /* final key mixing */
557 a ^= ctx->rk[i][0];
558 b ^= ctx->rk[i][1];
559 c ^= ctx->rk[i][2];
560 d ^= ctx->rk[i][3];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000561
Joe Subbiani5ecac212021-06-24 13:00:03 +0100562 MBEDTLS_PUT_UINT32_LE( a, output, 0 );
563 MBEDTLS_PUT_UINT32_LE( b, output, 4 );
564 MBEDTLS_PUT_UINT32_LE( c, output, 8 );
565 MBEDTLS_PUT_UINT32_LE( d, output, 12 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000566
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100567 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000568}
569
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100570/* Initialize context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000571void mbedtls_aria_init( mbedtls_aria_context *ctx )
572{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500573 ARIA_VALIDATE( ctx != NULL );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000574 memset( ctx, 0, sizeof( mbedtls_aria_context ) );
575}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000576
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100577/* Clear context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000578void mbedtls_aria_free( mbedtls_aria_context *ctx )
579{
580 if( ctx == NULL )
581 return;
582
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200583 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aria_context ) );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000584}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000585
586#if defined(MBEDTLS_CIPHER_MODE_CBC)
587/*
588 * ARIA-CBC buffer encryption/decryption
589 */
590int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100591 int mode,
592 size_t length,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100593 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100594 const unsigned char *input,
595 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000596{
597 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100598 unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000599
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500600 ARIA_VALIDATE_RET( ctx != NULL );
601 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
602 mode == MBEDTLS_ARIA_DECRYPT );
603 ARIA_VALIDATE_RET( length == 0 || input != NULL );
604 ARIA_VALIDATE_RET( length == 0 || output != NULL );
605 ARIA_VALIDATE_RET( iv != NULL );
606
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100607 if( length % MBEDTLS_ARIA_BLOCKSIZE )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000608 return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH );
609
610 if( mode == MBEDTLS_ARIA_DECRYPT )
611 {
612 while( length > 0 )
613 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100614 memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200615 mbedtls_aria_crypt_ecb( ctx, input, output );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000616
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100617 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000618 output[i] = (unsigned char)( output[i] ^ iv[i] );
619
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100620 memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000621
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100622 input += MBEDTLS_ARIA_BLOCKSIZE;
623 output += MBEDTLS_ARIA_BLOCKSIZE;
624 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000625 }
626 }
627 else
628 {
629 while( length > 0 )
630 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100631 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000632 output[i] = (unsigned char)( input[i] ^ iv[i] );
633
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200634 mbedtls_aria_crypt_ecb( ctx, output, output );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100635 memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000636
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100637 input += MBEDTLS_ARIA_BLOCKSIZE;
638 output += MBEDTLS_ARIA_BLOCKSIZE;
639 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000640 }
641 }
642
643 return( 0 );
644}
645#endif /* MBEDTLS_CIPHER_MODE_CBC */
646
647#if defined(MBEDTLS_CIPHER_MODE_CFB)
648/*
649 * ARIA-CFB128 buffer encryption/decryption
650 */
651int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100652 int mode,
653 size_t length,
654 size_t *iv_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100655 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100656 const unsigned char *input,
657 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000658{
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200659 unsigned char c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500660 size_t n;
661
662 ARIA_VALIDATE_RET( ctx != NULL );
663 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
664 mode == MBEDTLS_ARIA_DECRYPT );
665 ARIA_VALIDATE_RET( length == 0 || input != NULL );
666 ARIA_VALIDATE_RET( length == 0 || output != NULL );
667 ARIA_VALIDATE_RET( iv != NULL );
668 ARIA_VALIDATE_RET( iv_off != NULL );
669
670 n = *iv_off;
671
672 /* An overly large value of n can lead to an unlimited
673 * buffer overflow. Therefore, guard against this
674 * outside of parameter validation. */
675 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
676 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000677
678 if( mode == MBEDTLS_ARIA_DECRYPT )
679 {
680 while( length-- )
681 {
682 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200683 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000684
685 c = *input++;
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200686 *output++ = c ^ iv[n];
687 iv[n] = c;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000688
689 n = ( n + 1 ) & 0x0F;
690 }
691 }
692 else
693 {
694 while( length-- )
695 {
696 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200697 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000698
699 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
700
701 n = ( n + 1 ) & 0x0F;
702 }
703 }
704
705 *iv_off = n;
706
707 return( 0 );
708}
709#endif /* MBEDTLS_CIPHER_MODE_CFB */
710
711#if defined(MBEDTLS_CIPHER_MODE_CTR)
712/*
713 * ARIA-CTR buffer encryption/decryption
714 */
715int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100716 size_t length,
717 size_t *nc_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100718 unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
719 unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100720 const unsigned char *input,
721 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000722{
723 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500724 size_t n;
725
726 ARIA_VALIDATE_RET( ctx != NULL );
727 ARIA_VALIDATE_RET( length == 0 || input != NULL );
728 ARIA_VALIDATE_RET( length == 0 || output != NULL );
729 ARIA_VALIDATE_RET( nonce_counter != NULL );
730 ARIA_VALIDATE_RET( stream_block != NULL );
731 ARIA_VALIDATE_RET( nc_off != NULL );
732
733 n = *nc_off;
734 /* An overly large value of n can lead to an unlimited
735 * buffer overflow. Therefore, guard against this
736 * outside of parameter validation. */
737 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
738 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000739
740 while( length-- )
741 {
742 if( n == 0 ) {
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200743 mbedtls_aria_crypt_ecb( ctx, nonce_counter,
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000744 stream_block );
745
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100746 for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000747 if( ++nonce_counter[i - 1] != 0 )
748 break;
749 }
750 c = *input++;
751 *output++ = (unsigned char)( c ^ stream_block[n] );
752
753 n = ( n + 1 ) & 0x0F;
754 }
755
756 *nc_off = n;
757
758 return( 0 );
759}
760#endif /* MBEDTLS_CIPHER_MODE_CTR */
761#endif /* !MBEDTLS_ARIA_ALT */
762
763#if defined(MBEDTLS_SELF_TEST)
764
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100765/*
766 * Basic ARIA ECB test vectors from RFC 5794
767 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000768static const uint8_t aria_test1_ecb_key[32] = // test key
769{
770 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
771 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
772 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
773 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
774};
775
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100776static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000777{
778 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
779 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
780};
781
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100782static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000783{
784 { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
785 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
786 { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
787 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
788 { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
789 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
790};
791
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100792/*
793 * Mode tests from "Test Vectors for ARIA" Version 1.0
794 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
795 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000796#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000797 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000798static const uint8_t aria_test2_key[32] =
799{
800 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
801 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
802 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
803 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
804};
805
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000806static const uint8_t aria_test2_pt[48] =
807{
808 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
809 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
810 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
811 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
812 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
813 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
814};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000815#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000816
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000817#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100818static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000819{
820 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
821 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
822};
823#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000824
825#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100826static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000827{
828 { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
829 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
830 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
831 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
832 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
833 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
834 { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
835 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
836 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
837 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
838 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
839 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
840 { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
841 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
842 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
843 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
844 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
845 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
846};
847#endif /* MBEDTLS_CIPHER_MODE_CBC */
848
849#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100850static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000851{
852 { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
853 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
854 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
855 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
856 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
857 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
858 { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
859 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
860 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
861 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
862 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
863 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
864 { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
865 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
866 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
867 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
868 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
869 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
870};
871#endif /* MBEDTLS_CIPHER_MODE_CFB */
872
873#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100874static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000875{
876 { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
877 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
878 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
879 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
880 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
881 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
882 { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
883 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
884 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
885 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
886 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
887 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
888 { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
889 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
890 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
891 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
892 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
893 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
894};
895#endif /* MBEDTLS_CIPHER_MODE_CFB */
896
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000897#define ARIA_SELF_TEST_IF_FAIL \
898 { \
899 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300900 mbedtls_printf( "failed\n" ); \
Gilles Peskinebe89fea2021-05-25 09:17:22 +0200901 goto exit; \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000902 } else { \
903 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300904 mbedtls_printf( "passed\n" ); \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000905 }
906
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100907/*
908 * Checkup routine
909 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000910int mbedtls_aria_self_test( int verbose )
911{
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000912 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100913 uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000914 mbedtls_aria_context ctx;
Gilles Peskinebe89fea2021-05-25 09:17:22 +0200915 int ret = 1;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000916
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000917#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
918 size_t j;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000919#endif
920
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000921#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
922 defined(MBEDTLS_CIPHER_MODE_CFB) || \
923 defined(MBEDTLS_CIPHER_MODE_CTR))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100924 uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000925#endif
926
Gilles Peskinebe89fea2021-05-25 09:17:22 +0200927 mbedtls_aria_init( &ctx );
928
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100929 /*
930 * Test set 1
931 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000932 for( i = 0; i < 3; i++ )
933 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100934 /* test ECB encryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000935 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300936 mbedtls_printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000937 mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200938 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_pt, blk );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100939 if( memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000940 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000941
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100942 /* test ECB decryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000943 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300944 mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000945 mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200946 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100947 if( memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000948 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000949 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000950 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300951 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000952
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100953 /*
954 * Test set 2
955 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000956#if defined(MBEDTLS_CIPHER_MODE_CBC)
957 for( i = 0; i < 3; i++ )
958 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100959 /* Test CBC encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000960 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300961 mbedtls_printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000962 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100963 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100964 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000965 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
966 aria_test2_pt, buf );
967 if( memcmp( buf, aria_test2_cbc_ct[i], 48 ) != 0 )
968 ARIA_SELF_TEST_IF_FAIL;
969
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100970 /* Test CBC decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000971 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300972 mbedtls_printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000973 mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100974 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100975 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000976 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
977 aria_test2_cbc_ct[i], buf );
978 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
979 ARIA_SELF_TEST_IF_FAIL;
980 }
981 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300982 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000983
984#endif /* MBEDTLS_CIPHER_MODE_CBC */
985
986#if defined(MBEDTLS_CIPHER_MODE_CFB)
987 for( i = 0; i < 3; i++ )
988 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100989 /* Test CFB encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000990 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300991 mbedtls_printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000992 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100993 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100994 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000995 j = 0;
996 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
997 aria_test2_pt, buf );
998 if( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 )
999 ARIA_SELF_TEST_IF_FAIL;
1000
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001001 /* Test CFB decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001002 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001003 mbedtls_printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001004 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001005 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001006 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001007 j = 0;
1008 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
1009 iv, aria_test2_cfb_ct[i], buf );
1010 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1011 ARIA_SELF_TEST_IF_FAIL;
1012 }
1013 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001014 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001015#endif /* MBEDTLS_CIPHER_MODE_CFB */
1016
1017#if defined(MBEDTLS_CIPHER_MODE_CTR)
1018 for( i = 0; i < 3; i++ )
1019 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001020 /* Test CTR encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001021 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001022 mbedtls_printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001023 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001024 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001025 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001026 j = 0;
1027 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1028 aria_test2_pt, buf );
1029 if( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 )
1030 ARIA_SELF_TEST_IF_FAIL;
1031
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001032 /* Test CTR decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001033 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001034 mbedtls_printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001035 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001036 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001037 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001038 j = 0;
1039 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1040 aria_test2_ctr_ct[i], buf );
1041 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1042 ARIA_SELF_TEST_IF_FAIL;
1043 }
1044 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001045 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001046#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001047
Gilles Peskinebe89fea2021-05-25 09:17:22 +02001048 ret = 0;
1049
1050exit:
1051 mbedtls_aria_free( &ctx );
1052 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001053}
1054
1055#endif /* MBEDTLS_SELF_TEST */
1056
1057#endif /* MBEDTLS_ARIA_C */