blob: a1876b7763563f287c4a6907f9b59a5c1154f1e0 [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
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000034#include "mbedtls/platform.h"
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000035
36#if !defined(MBEDTLS_ARIA_ALT)
37
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +020038#include "mbedtls/platform_util.h"
39
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +010040#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
41 !defined(inline) && !defined(__cplusplus)
42#define inline __inline
43#endif
44
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050045/* Parameter validation macros */
46#define ARIA_VALIDATE_RET( cond ) \
47 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ARIA_BAD_INPUT_DATA )
48#define ARIA_VALIDATE( cond ) \
49 MBEDTLS_INTERNAL_VALIDATE( cond )
50
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010051/*
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +010052 * 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 +010053 *
54 * This is submatrix P1 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010055 *
56 * Common compilers fail to translate this to minimal number of instructions,
57 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010058 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010059#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010060#if defined(__arm__) /* rev16 available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010061/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
62#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010063 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
64 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010065static inline uint32_t aria_p1( uint32_t x )
66{
67 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +010068 __asm( "rev16 %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010069 return( r );
70}
71#define ARIA_P1 aria_p1
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010072#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
73 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +010074static inline uint32_t aria_p1( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010075{
76 uint32_t r;
77 __asm( "rev16 r, x" );
78 return( r );
79}
80#define ARIA_P1 aria_p1
81#endif
82#endif /* arm */
83#if defined(__GNUC__) && \
84 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnard2df4bfe2018-05-22 13:39:01 +020085/* I couldn't find an Intel equivalent of rev16, so two instructions */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010086#define ARIA_P1(x) ARIA_P2( ARIA_P3( x ) )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010087#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010088#endif /* MBEDTLS_HAVE_ASM && GNUC */
89#if !defined(ARIA_P1)
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010090#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010091#endif
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000092
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010093/*
94 * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits
95 *
96 * This is submatrix P2 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010097 *
98 * Common compilers will translate this to a single instruction.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010099 */
100#define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16))
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000101
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100102/*
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100103 * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness
104 *
105 * This is submatrix P3 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100106 *
107 * Some compilers fail to translate this to a single instruction,
108 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100109 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100110#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100111#if defined(__arm__) /* rev available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100112/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
113#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100114 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
115 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100116static inline uint32_t aria_p3( uint32_t x )
117{
118 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100119 __asm( "rev %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100120 return( r );
121}
122#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100123#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
124 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100125static inline uint32_t aria_p3( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100126{
127 uint32_t r;
128 __asm( "rev r, x" );
129 return( r );
130}
131#define ARIA_P3 aria_p3
132#endif
133#endif /* arm */
134#if defined(__GNUC__) && \
135 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100136static inline uint32_t aria_p3( uint32_t x )
137{
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100138 __asm( "bswap %0" : "=r" (x) : "0" (x) );
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100139 return( x );
140}
141#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100142#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100143#endif /* MBEDTLS_HAVE_ASM && GNUC */
144#if !defined(ARIA_P3)
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100145#define ARIA_P3(x) ARIA_P2( ARIA_P1 ( x ) )
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100146#endif
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100147
148/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100149 * ARIA Affine Transform
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100150 * (a, b, c, d) = state in/out
151 *
Manuel Pégourié-Gonnardd418b0d2018-05-22 12:56:11 +0200152 * If we denote the first byte of input by 0, ..., the last byte by f,
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100153 * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef.
154 *
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100155 * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100156 * rearrangements on adjacent pairs, output is:
157 *
158 * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe
159 * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100160 * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100161 * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100162 * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100163 * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100164 * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100165 * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef
166 *
167 * Note: another presentation of the A transform can be found as the first
168 * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4.
169 * The implementation below uses only P1 and P2 as they are sufficient.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100170 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100171static inline void aria_a( uint32_t *a, uint32_t *b,
172 uint32_t *c, uint32_t *d )
173{
174 uint32_t ta, tb, tc;
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100175 ta = *b; // 4567
176 *b = *a; // 0123
177 *a = ARIA_P2( ta ); // 6745
178 tb = ARIA_P2( *d ); // efcd
179 *d = ARIA_P1( *c ); // 98ba
180 *c = ARIA_P1( tb ); // fedc
181 ta ^= *d; // 4567+98ba
182 tc = ARIA_P2( *b ); // 2301
183 ta = ARIA_P1( ta ) ^ tc ^ *c; // 2301+5476+89ab+fedc
184 tb ^= ARIA_P2( *d ); // ba98+efcd
185 tc ^= ARIA_P1( *a ); // 2301+7654
186 *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT
187 tb = ARIA_P2( tb ) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc
188 *a ^= ARIA_P1( tb ); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT
189 ta = ARIA_P2( ta ); // 0123+7654+ab89+dcfe
190 *d ^= ARIA_P1( ta ) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT
191 tc = ARIA_P2( tc ); // 0123+5476
192 *c ^= ARIA_P1( tc ) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000193}
194
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100195/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100196 * ARIA Substitution Layer SL1 / SL2
197 * (a, b, c, d) = state in/out
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100198 * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100199 *
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100200 * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1
201 * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100202 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100203static inline void aria_sl( uint32_t *a, uint32_t *b,
204 uint32_t *c, uint32_t *d,
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200205 const uint8_t sa[256], const uint8_t sb[256],
206 const uint8_t sc[256], const uint8_t sd[256] )
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100207{
Joe Subbianicd84d762021-07-08 14:59:52 +0100208 *a = ( (uint32_t) sa[ MBEDTLS_BYTE_0( *a ) ] ) ^
209 (((uint32_t) sb[ MBEDTLS_BYTE_1( *a ) ]) << 8) ^
210 (((uint32_t) sc[ MBEDTLS_BYTE_2( *a ) ]) << 16) ^
Joe Subbiani54550f72021-07-14 11:59:48 +0100211 (((uint32_t) sd[ MBEDTLS_BYTE_3( *a ) ]) << 24);
Joe Subbianicd84d762021-07-08 14:59:52 +0100212 *b = ( (uint32_t) sa[ MBEDTLS_BYTE_0( *b ) ] ) ^
213 (((uint32_t) sb[ MBEDTLS_BYTE_1( *b ) ]) << 8) ^
214 (((uint32_t) sc[ MBEDTLS_BYTE_2( *b ) ]) << 16) ^
Joe Subbiani54550f72021-07-14 11:59:48 +0100215 (((uint32_t) sd[ MBEDTLS_BYTE_3( *b ) ]) << 24);
Joe Subbianicd84d762021-07-08 14:59:52 +0100216 *c = ( (uint32_t) sa[ MBEDTLS_BYTE_0( *c ) ] ) ^
217 (((uint32_t) sb[ MBEDTLS_BYTE_1( *c ) ]) << 8) ^
218 (((uint32_t) sc[ MBEDTLS_BYTE_2( *c ) ]) << 16) ^
Joe Subbiani54550f72021-07-14 11:59:48 +0100219 (((uint32_t) sd[ MBEDTLS_BYTE_3( *c ) ]) << 24);
Joe Subbianicd84d762021-07-08 14:59:52 +0100220 *d = ( (uint32_t) sa[ MBEDTLS_BYTE_0( *d ) ] ) ^
221 (((uint32_t) sb[ MBEDTLS_BYTE_1( *d ) ]) << 8) ^
222 (((uint32_t) sc[ MBEDTLS_BYTE_2( *d ) ]) << 16) ^
Joe Subbiani54550f72021-07-14 11:59:48 +0100223 (((uint32_t) sd[ MBEDTLS_BYTE_3( *d ) ]) << 24);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000224}
225
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100226/*
227 * S-Boxes
228 */
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200229static const uint8_t aria_sb1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000230{
231 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
232 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
233 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
234 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
235 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
236 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
237 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
238 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
239 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
240 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
241 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
242 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
243 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
244 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
245 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
246 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
247 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
248 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
249 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
250 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
251 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
252 0xB0, 0x54, 0xBB, 0x16
253};
254
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200255static const uint8_t aria_sb2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000256{
257 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46,
258 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B,
259 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B,
260 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB,
261 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA,
262 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91,
263 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38,
264 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53,
265 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74,
266 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26,
267 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD,
268 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC,
269 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E,
270 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A,
271 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5,
272 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8,
273 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24,
274 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F,
275 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
276 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D,
277 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A,
278 0xAF, 0xBA, 0xB5, 0x81
279};
280
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200281static const uint8_t aria_is1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000282{
283 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
284 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
285 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
286 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
287 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
288 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
289 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
290 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
291 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
292 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
293 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
294 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
295 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
296 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
297 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
298 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
299 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
300 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
301 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
302 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
303 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
304 0x55, 0x21, 0x0C, 0x7D
305};
306
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200307static const uint8_t aria_is2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000308{
309 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1,
310 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3,
311 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89,
312 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D,
313 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98,
314 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58,
315 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F,
316 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE,
317 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23,
318 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19,
319 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55,
320 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A,
321 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE,
322 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0,
323 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6,
324 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5,
325 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13,
326 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73,
327 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
328 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3,
329 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33,
330 0x03, 0xA2, 0xAC, 0x60
331};
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000332
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100333/*
334 * Helper for key schedule: r = FO( p, k ) ^ x
335 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100336static void aria_fo_xor( uint32_t r[4], const uint32_t p[4],
337 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000338{
339 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000340
341 a = p[0] ^ k[0];
342 b = p[1] ^ k[1];
343 c = p[2] ^ k[2];
344 d = p[3] ^ k[3];
345
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100346 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
347 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000348
349 r[0] = a ^ x[0];
350 r[1] = b ^ x[1];
351 r[2] = c ^ x[2];
352 r[3] = d ^ x[3];
353}
354
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100355/*
356 * Helper for key schedule: r = FE( p, k ) ^ x
357 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100358static void aria_fe_xor( uint32_t r[4], const uint32_t p[4],
359 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000360{
361 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000362
363 a = p[0] ^ k[0];
364 b = p[1] ^ k[1];
365 c = p[2] ^ k[2];
366 d = p[3] ^ k[3];
367
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100368 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
369 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000370
371 r[0] = a ^ x[0];
372 r[1] = b ^ x[1];
373 r[2] = c ^ x[2];
374 r[3] = d ^ x[3];
375}
376
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100377/*
378 * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup.
379 *
380 * We chose to store bytes into 32-bit words in little-endian format (see
Joe Subbiani394bdd62021-07-07 15:16:56 +0100381 * MBEDTLS_GET_UINT32_LE / MBEDTLS_PUT_UINT32_LE ) so we need to reverse
382 * bytes here.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100383 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100384static void aria_rot128( uint32_t r[4], const uint32_t a[4],
385 const uint32_t b[4], uint8_t n )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000386{
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100387 uint8_t i, j;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000388 uint32_t t, u;
389
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100390 const uint8_t n1 = n % 32; // bit offset
391 const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100392
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200393 j = ( n / 32 ) % 4; // initial word offset
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100394 t = ARIA_P3( b[j] ); // big endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000395 for( i = 0; i < 4; i++ )
396 {
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200397 j = ( j + 1 ) % 4; // get next word, big endian
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100398 u = ARIA_P3( b[j] );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000399 t <<= n1; // rotate
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100400 t |= u >> n2;
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100401 t = ARIA_P3( t ); // back to little endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000402 r[i] = a[i] ^ t; // store
403 t = u; // move to next word
404 }
405}
406
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100407/*
408 * Set encryption key
409 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100410int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx,
411 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000412{
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100413 /* round constant masks */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000414 const uint32_t rc[3][4] =
415 {
416 { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
417 { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
418 { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
419 };
420
421 int i;
422 uint32_t w[4][4], *w2;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500423 ARIA_VALIDATE_RET( ctx != NULL );
424 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000425
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100426 if( keybits != 128 && keybits != 192 && keybits != 256 )
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500427 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000428
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100429 /* Copy key to W0 (and potential remainder to W1) */
Joe Subbiani6a506312021-07-07 16:56:29 +0100430 w[0][0] = MBEDTLS_GET_UINT32_LE( key, 0 );
431 w[0][1] = MBEDTLS_GET_UINT32_LE( key, 4 );
432 w[0][2] = MBEDTLS_GET_UINT32_LE( key, 8 );
433 w[0][3] = MBEDTLS_GET_UINT32_LE( key, 12 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000434
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100435 memset( w[1], 0, 16 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000436 if( keybits >= 192 )
437 {
Joe Subbiani6a506312021-07-07 16:56:29 +0100438 w[1][0] = MBEDTLS_GET_UINT32_LE( key, 16 ); // 192 bit key
439 w[1][1] = MBEDTLS_GET_UINT32_LE( key, 20 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000440 }
441 if( keybits == 256 )
442 {
Joe Subbiani6a506312021-07-07 16:56:29 +0100443 w[1][2] = MBEDTLS_GET_UINT32_LE( key, 24 ); // 256 bit key
444 w[1][3] = MBEDTLS_GET_UINT32_LE( key, 28 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000445 }
446
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200447 i = ( keybits - 128 ) >> 6; // index: 0, 1, 2
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000448 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
449
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100450 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 +0000451 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100452 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 +0000453 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100454 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 +0000455
456 for( i = 0; i < 4; i++ ) // create round keys
457 {
458 w2 = w[(i + 1) & 3];
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100459 aria_rot128( ctx->rk[i ], w[i], w2, 128 - 19 );
460 aria_rot128( ctx->rk[i + 4], w[i], w2, 128 - 31 );
461 aria_rot128( ctx->rk[i + 8], w[i], w2, 61 );
462 aria_rot128( ctx->rk[i + 12], w[i], w2, 31 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000463 }
464 aria_rot128( ctx->rk[16], w[0], w[1], 19 );
465
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200466 /* w holds enough info to reconstruct the round keys */
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200467 mbedtls_platform_zeroize( w, sizeof( w ) );
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200468
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100469 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000470}
471
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100472/*
473 * Set decryption key
474 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100475int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx,
476 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000477{
478 int i, j, k, ret;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500479 ARIA_VALIDATE_RET( ctx != NULL );
480 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000481
482 ret = mbedtls_aria_setkey_enc( ctx, key, keybits );
483 if( ret != 0 )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100484 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000485
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100486 /* flip the order of round keys */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000487 for( i = 0, j = ctx->nr; i < j; i++, j-- )
488 {
489 for( k = 0; k < 4; k++ )
490 {
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100491 uint32_t t = ctx->rk[i][k];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000492 ctx->rk[i][k] = ctx->rk[j][k];
493 ctx->rk[j][k] = t;
494 }
495 }
496
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100497 /* apply affine transform to middle keys */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100498 for( i = 1; i < ctx->nr; i++ )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100499 {
500 aria_a( &ctx->rk[i][0], &ctx->rk[i][1],
501 &ctx->rk[i][2], &ctx->rk[i][3] );
502 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000503
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100504 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000505}
506
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100507/*
508 * Encrypt a block
509 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000510int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100511 const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
512 unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000513{
514 int i;
515
516 uint32_t a, b, c, d;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500517 ARIA_VALIDATE_RET( ctx != NULL );
518 ARIA_VALIDATE_RET( input != NULL );
519 ARIA_VALIDATE_RET( output != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000520
Joe Subbiani6a506312021-07-07 16:56:29 +0100521 a = MBEDTLS_GET_UINT32_LE( input, 0 );
522 b = MBEDTLS_GET_UINT32_LE( input, 4 );
523 c = MBEDTLS_GET_UINT32_LE( input, 8 );
524 d = MBEDTLS_GET_UINT32_LE( input, 12 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000525
526 i = 0;
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100527 while( 1 )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000528 {
529 a ^= ctx->rk[i][0];
530 b ^= ctx->rk[i][1];
531 c ^= ctx->rk[i][2];
532 d ^= ctx->rk[i][3];
533 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100534
535 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
536 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000537
538 a ^= ctx->rk[i][0];
539 b ^= ctx->rk[i][1];
540 c ^= ctx->rk[i][2];
541 d ^= ctx->rk[i][3];
542 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100543
544 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100545 if( i >= ctx->nr )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000546 break;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100547 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000548 }
549
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100550 /* final key mixing */
551 a ^= ctx->rk[i][0];
552 b ^= ctx->rk[i][1];
553 c ^= ctx->rk[i][2];
554 d ^= ctx->rk[i][3];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000555
Joe Subbiani5ecac212021-06-24 13:00:03 +0100556 MBEDTLS_PUT_UINT32_LE( a, output, 0 );
557 MBEDTLS_PUT_UINT32_LE( b, output, 4 );
558 MBEDTLS_PUT_UINT32_LE( c, output, 8 );
559 MBEDTLS_PUT_UINT32_LE( d, output, 12 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000560
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100561 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000562}
563
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100564/* Initialize context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000565void mbedtls_aria_init( mbedtls_aria_context *ctx )
566{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500567 ARIA_VALIDATE( ctx != NULL );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000568 memset( ctx, 0, sizeof( mbedtls_aria_context ) );
569}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000570
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100571/* Clear context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000572void mbedtls_aria_free( mbedtls_aria_context *ctx )
573{
574 if( ctx == NULL )
575 return;
576
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200577 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aria_context ) );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000578}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000579
580#if defined(MBEDTLS_CIPHER_MODE_CBC)
581/*
582 * ARIA-CBC buffer encryption/decryption
583 */
584int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100585 int mode,
586 size_t length,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100587 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100588 const unsigned char *input,
589 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000590{
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100591 unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000592
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500593 ARIA_VALIDATE_RET( ctx != NULL );
594 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
595 mode == MBEDTLS_ARIA_DECRYPT );
596 ARIA_VALIDATE_RET( length == 0 || input != NULL );
597 ARIA_VALIDATE_RET( length == 0 || output != NULL );
598 ARIA_VALIDATE_RET( iv != NULL );
599
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100600 if( length % MBEDTLS_ARIA_BLOCKSIZE )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000601 return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH );
602
603 if( mode == MBEDTLS_ARIA_DECRYPT )
604 {
605 while( length > 0 )
606 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100607 memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200608 mbedtls_aria_crypt_ecb( ctx, input, output );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000609
Dave Rodgman7bb6b842022-11-22 16:18:55 +0000610 mbedtls_xor( output, output, iv, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000611
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100612 memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000613
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100614 input += MBEDTLS_ARIA_BLOCKSIZE;
615 output += MBEDTLS_ARIA_BLOCKSIZE;
616 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000617 }
618 }
619 else
620 {
621 while( length > 0 )
622 {
Dave Rodgman7bb6b842022-11-22 16:18:55 +0000623 mbedtls_xor( output, input, iv, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000624
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200625 mbedtls_aria_crypt_ecb( ctx, output, output );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100626 memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000627
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100628 input += MBEDTLS_ARIA_BLOCKSIZE;
629 output += MBEDTLS_ARIA_BLOCKSIZE;
630 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000631 }
632 }
633
634 return( 0 );
635}
636#endif /* MBEDTLS_CIPHER_MODE_CBC */
637
638#if defined(MBEDTLS_CIPHER_MODE_CFB)
639/*
640 * ARIA-CFB128 buffer encryption/decryption
641 */
642int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100643 int mode,
644 size_t length,
645 size_t *iv_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100646 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100647 const unsigned char *input,
648 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000649{
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200650 unsigned char c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500651 size_t n;
652
653 ARIA_VALIDATE_RET( ctx != NULL );
654 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
655 mode == MBEDTLS_ARIA_DECRYPT );
656 ARIA_VALIDATE_RET( length == 0 || input != NULL );
657 ARIA_VALIDATE_RET( length == 0 || output != NULL );
658 ARIA_VALIDATE_RET( iv != NULL );
659 ARIA_VALIDATE_RET( iv_off != NULL );
660
661 n = *iv_off;
662
663 /* An overly large value of n can lead to an unlimited
664 * buffer overflow. Therefore, guard against this
665 * outside of parameter validation. */
666 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
667 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000668
669 if( mode == MBEDTLS_ARIA_DECRYPT )
670 {
671 while( length-- )
672 {
673 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200674 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000675
676 c = *input++;
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200677 *output++ = c ^ iv[n];
678 iv[n] = c;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000679
680 n = ( n + 1 ) & 0x0F;
681 }
682 }
683 else
684 {
685 while( length-- )
686 {
687 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200688 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000689
690 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
691
692 n = ( n + 1 ) & 0x0F;
693 }
694 }
695
696 *iv_off = n;
697
698 return( 0 );
699}
700#endif /* MBEDTLS_CIPHER_MODE_CFB */
701
702#if defined(MBEDTLS_CIPHER_MODE_CTR)
703/*
704 * ARIA-CTR buffer encryption/decryption
705 */
706int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100707 size_t length,
708 size_t *nc_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100709 unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
710 unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100711 const unsigned char *input,
712 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000713{
714 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500715 size_t n;
716
717 ARIA_VALIDATE_RET( ctx != NULL );
718 ARIA_VALIDATE_RET( length == 0 || input != NULL );
719 ARIA_VALIDATE_RET( length == 0 || output != NULL );
720 ARIA_VALIDATE_RET( nonce_counter != NULL );
721 ARIA_VALIDATE_RET( stream_block != NULL );
722 ARIA_VALIDATE_RET( nc_off != NULL );
723
724 n = *nc_off;
725 /* An overly large value of n can lead to an unlimited
726 * buffer overflow. Therefore, guard against this
727 * outside of parameter validation. */
728 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
729 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000730
731 while( length-- )
732 {
733 if( n == 0 ) {
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200734 mbedtls_aria_crypt_ecb( ctx, nonce_counter,
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000735 stream_block );
736
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100737 for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000738 if( ++nonce_counter[i - 1] != 0 )
739 break;
740 }
741 c = *input++;
742 *output++ = (unsigned char)( c ^ stream_block[n] );
743
744 n = ( n + 1 ) & 0x0F;
745 }
746
747 *nc_off = n;
748
749 return( 0 );
750}
751#endif /* MBEDTLS_CIPHER_MODE_CTR */
752#endif /* !MBEDTLS_ARIA_ALT */
753
754#if defined(MBEDTLS_SELF_TEST)
755
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100756/*
757 * Basic ARIA ECB test vectors from RFC 5794
758 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000759static const uint8_t aria_test1_ecb_key[32] = // test key
760{
761 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
762 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
763 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
764 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
765};
766
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100767static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000768{
769 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
770 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
771};
772
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100773static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000774{
775 { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
776 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
777 { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
778 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
779 { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
780 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
781};
782
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100783/*
784 * Mode tests from "Test Vectors for ARIA" Version 1.0
785 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
786 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000787#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000788 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000789static const uint8_t aria_test2_key[32] =
790{
791 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
792 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
793 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
794 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
795};
796
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000797static const uint8_t aria_test2_pt[48] =
798{
799 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
800 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
801 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
802 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
803 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
804 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
805};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000806#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000807
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000808#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100809static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000810{
811 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
812 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
813};
814#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000815
816#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100817static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000818{
819 { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
820 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
821 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
822 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
823 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
824 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
825 { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
826 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
827 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
828 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
829 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
830 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
831 { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
832 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
833 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
834 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
835 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
836 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
837};
838#endif /* MBEDTLS_CIPHER_MODE_CBC */
839
840#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100841static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000842{
843 { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
844 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
845 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
846 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
847 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
848 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
849 { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
850 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
851 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
852 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
853 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
854 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
855 { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
856 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
857 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
858 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
859 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
860 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
861};
862#endif /* MBEDTLS_CIPHER_MODE_CFB */
863
864#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100865static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000866{
867 { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
868 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
869 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
870 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
871 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
872 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
873 { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
874 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
875 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
876 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
877 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
878 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
879 { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
880 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
881 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
882 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
883 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
884 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
885};
886#endif /* MBEDTLS_CIPHER_MODE_CFB */
887
David Horstmann9b0eb902022-10-25 10:23:34 +0100888#define ARIA_SELF_TEST_ASSERT( cond ) \
David Horstmann0763ccf2022-10-06 14:32:30 +0100889 do { \
890 if( cond ) { \
891 if( verbose ) \
892 mbedtls_printf( "failed\n" ); \
893 goto exit; \
894 } else { \
895 if( verbose ) \
896 mbedtls_printf( "passed\n" ); \
897 } \
898 } while( 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000899
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100900/*
901 * Checkup routine
902 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000903int mbedtls_aria_self_test( int verbose )
904{
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000905 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100906 uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000907 mbedtls_aria_context ctx;
Gilles Peskinebe89fea2021-05-25 09:17:22 +0200908 int ret = 1;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000909
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000910#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
911 size_t j;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000912#endif
913
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000914#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
915 defined(MBEDTLS_CIPHER_MODE_CFB) || \
916 defined(MBEDTLS_CIPHER_MODE_CTR))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100917 uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000918#endif
919
Gilles Peskinebe89fea2021-05-25 09:17:22 +0200920 mbedtls_aria_init( &ctx );
921
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100922 /*
923 * Test set 1
924 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000925 for( i = 0; i < 3; i++ )
926 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100927 /* test ECB encryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000928 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300929 mbedtls_printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000930 mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200931 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_pt, blk );
David Horstmann9b0eb902022-10-25 10:23:34 +0100932 ARIA_SELF_TEST_ASSERT(
David Horstmann0763ccf2022-10-06 14:32:30 +0100933 memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE )
934 != 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000935
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100936 /* test ECB decryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000937 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300938 mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000939 mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200940 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk );
David Horstmann9b0eb902022-10-25 10:23:34 +0100941 ARIA_SELF_TEST_ASSERT(
David Horstmann0763ccf2022-10-06 14:32:30 +0100942 memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE )
943 != 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000944 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000945 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300946 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000947
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100948 /*
949 * Test set 2
950 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000951#if defined(MBEDTLS_CIPHER_MODE_CBC)
952 for( i = 0; i < 3; i++ )
953 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100954 /* Test CBC encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000955 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300956 mbedtls_printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000957 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100958 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100959 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000960 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
961 aria_test2_pt, buf );
David Horstmann9b0eb902022-10-25 10:23:34 +0100962 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_cbc_ct[i], 48 )
David Horstmann0763ccf2022-10-06 14:32:30 +0100963 != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000964
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100965 /* Test CBC decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000966 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300967 mbedtls_printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000968 mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100969 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100970 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000971 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
972 aria_test2_cbc_ct[i], buf );
David Horstmann9b0eb902022-10-25 10:23:34 +0100973 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_pt, 48 ) != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000974 }
975 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300976 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000977
978#endif /* MBEDTLS_CIPHER_MODE_CBC */
979
980#if defined(MBEDTLS_CIPHER_MODE_CFB)
981 for( i = 0; i < 3; i++ )
982 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100983 /* Test CFB encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000984 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300985 mbedtls_printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000986 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100987 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100988 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000989 j = 0;
990 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
991 aria_test2_pt, buf );
David Horstmann9b0eb902022-10-25 10:23:34 +0100992 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000993
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100994 /* Test CFB decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000995 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300996 mbedtls_printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000997 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100998 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100999 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001000 j = 0;
1001 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
1002 iv, aria_test2_cfb_ct[i], buf );
David Horstmann9b0eb902022-10-25 10:23:34 +01001003 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_pt, 48 ) != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001004 }
1005 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001006 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001007#endif /* MBEDTLS_CIPHER_MODE_CFB */
1008
1009#if defined(MBEDTLS_CIPHER_MODE_CTR)
1010 for( i = 0; i < 3; i++ )
1011 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001012 /* Test CTR encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001013 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001014 mbedtls_printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001015 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001016 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001017 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001018 j = 0;
1019 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1020 aria_test2_pt, buf );
David Horstmann9b0eb902022-10-25 10:23:34 +01001021 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001022
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001023 /* Test CTR decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001024 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001025 mbedtls_printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001026 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001027 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001028 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001029 j = 0;
1030 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1031 aria_test2_ctr_ct[i], buf );
David Horstmann9b0eb902022-10-25 10:23:34 +01001032 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_pt, 48 ) != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001033 }
1034 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001035 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001036#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001037
Gilles Peskinebe89fea2021-05-25 09:17:22 +02001038 ret = 0;
1039
1040exit:
1041 mbedtls_aria_free( &ctx );
1042 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001043}
1044
1045#endif /* MBEDTLS_SELF_TEST */
1046
1047#endif /* MBEDTLS_ARIA_C */