blob: 924f952834ad10df8fc28654f97b6f54c39599e6 [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 Subbiani6b897c92021-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 Subbiani10000372021-07-14 11:59:48 +0100211 (((uint32_t) sd[ MBEDTLS_BYTE_3( *a ) ]) << 24);
Joe Subbiani6b897c92021-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 Subbiani10000372021-07-14 11:59:48 +0100215 (((uint32_t) sd[ MBEDTLS_BYTE_3( *b ) ]) << 24);
Joe Subbiani6b897c92021-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 Subbiani10000372021-07-14 11:59:48 +0100219 (((uint32_t) sd[ MBEDTLS_BYTE_3( *c ) ]) << 24);
Joe Subbiani6b897c92021-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 Subbiani10000372021-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 Subbiani266476d2021-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 Subbiani9231d5f2021-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 Subbiani9231d5f2021-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 Subbiani9231d5f2021-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 Subbiani9231d5f2021-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 Subbiani2bbafda2021-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{
591 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100592 unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000593
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500594 ARIA_VALIDATE_RET( ctx != NULL );
595 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
596 mode == MBEDTLS_ARIA_DECRYPT );
597 ARIA_VALIDATE_RET( length == 0 || input != NULL );
598 ARIA_VALIDATE_RET( length == 0 || output != NULL );
599 ARIA_VALIDATE_RET( iv != NULL );
600
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100601 if( length % MBEDTLS_ARIA_BLOCKSIZE )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000602 return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH );
603
604 if( mode == MBEDTLS_ARIA_DECRYPT )
605 {
606 while( length > 0 )
607 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100608 memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200609 mbedtls_aria_crypt_ecb( ctx, input, output );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000610
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100611 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000612 output[i] = (unsigned char)( output[i] ^ iv[i] );
613
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100614 memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000615
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100616 input += MBEDTLS_ARIA_BLOCKSIZE;
617 output += MBEDTLS_ARIA_BLOCKSIZE;
618 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000619 }
620 }
621 else
622 {
623 while( length > 0 )
624 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100625 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000626 output[i] = (unsigned char)( input[i] ^ iv[i] );
627
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200628 mbedtls_aria_crypt_ecb( ctx, output, output );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100629 memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000630
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100631 input += MBEDTLS_ARIA_BLOCKSIZE;
632 output += MBEDTLS_ARIA_BLOCKSIZE;
633 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000634 }
635 }
636
637 return( 0 );
638}
639#endif /* MBEDTLS_CIPHER_MODE_CBC */
640
641#if defined(MBEDTLS_CIPHER_MODE_CFB)
642/*
643 * ARIA-CFB128 buffer encryption/decryption
644 */
645int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100646 int mode,
647 size_t length,
648 size_t *iv_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100649 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100650 const unsigned char *input,
651 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000652{
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200653 unsigned char c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500654 size_t n;
655
656 ARIA_VALIDATE_RET( ctx != NULL );
657 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
658 mode == MBEDTLS_ARIA_DECRYPT );
659 ARIA_VALIDATE_RET( length == 0 || input != NULL );
660 ARIA_VALIDATE_RET( length == 0 || output != NULL );
661 ARIA_VALIDATE_RET( iv != NULL );
662 ARIA_VALIDATE_RET( iv_off != NULL );
663
664 n = *iv_off;
665
666 /* An overly large value of n can lead to an unlimited
667 * buffer overflow. Therefore, guard against this
668 * outside of parameter validation. */
669 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
670 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000671
672 if( mode == MBEDTLS_ARIA_DECRYPT )
673 {
674 while( length-- )
675 {
676 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200677 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000678
679 c = *input++;
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200680 *output++ = c ^ iv[n];
681 iv[n] = c;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000682
683 n = ( n + 1 ) & 0x0F;
684 }
685 }
686 else
687 {
688 while( length-- )
689 {
690 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200691 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000692
693 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
694
695 n = ( n + 1 ) & 0x0F;
696 }
697 }
698
699 *iv_off = n;
700
701 return( 0 );
702}
703#endif /* MBEDTLS_CIPHER_MODE_CFB */
704
705#if defined(MBEDTLS_CIPHER_MODE_CTR)
706/*
707 * ARIA-CTR buffer encryption/decryption
708 */
709int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100710 size_t length,
711 size_t *nc_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100712 unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
713 unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100714 const unsigned char *input,
715 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000716{
717 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500718 size_t n;
719
720 ARIA_VALIDATE_RET( ctx != NULL );
721 ARIA_VALIDATE_RET( length == 0 || input != NULL );
722 ARIA_VALIDATE_RET( length == 0 || output != NULL );
723 ARIA_VALIDATE_RET( nonce_counter != NULL );
724 ARIA_VALIDATE_RET( stream_block != NULL );
725 ARIA_VALIDATE_RET( nc_off != NULL );
726
727 n = *nc_off;
728 /* An overly large value of n can lead to an unlimited
729 * buffer overflow. Therefore, guard against this
730 * outside of parameter validation. */
731 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
732 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000733
734 while( length-- )
735 {
736 if( n == 0 ) {
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200737 mbedtls_aria_crypt_ecb( ctx, nonce_counter,
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000738 stream_block );
739
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100740 for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000741 if( ++nonce_counter[i - 1] != 0 )
742 break;
743 }
744 c = *input++;
745 *output++ = (unsigned char)( c ^ stream_block[n] );
746
747 n = ( n + 1 ) & 0x0F;
748 }
749
750 *nc_off = n;
751
752 return( 0 );
753}
754#endif /* MBEDTLS_CIPHER_MODE_CTR */
755#endif /* !MBEDTLS_ARIA_ALT */
756
757#if defined(MBEDTLS_SELF_TEST)
758
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100759/*
760 * Basic ARIA ECB test vectors from RFC 5794
761 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000762static const uint8_t aria_test1_ecb_key[32] = // test key
763{
764 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
765 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
766 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
767 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
768};
769
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100770static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000771{
772 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
773 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
774};
775
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100776static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000777{
778 { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
779 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
780 { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
781 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
782 { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
783 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
784};
785
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100786/*
787 * Mode tests from "Test Vectors for ARIA" Version 1.0
788 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
789 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000790#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000791 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000792static const uint8_t aria_test2_key[32] =
793{
794 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
795 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
796 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
797 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
798};
799
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000800static const uint8_t aria_test2_pt[48] =
801{
802 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
803 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
804 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
805 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
806 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
807 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
808};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000809#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000810
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000811#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100812static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000813{
814 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
815 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
816};
817#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000818
819#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100820static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000821{
822 { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
823 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
824 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
825 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
826 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
827 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
828 { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
829 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
830 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
831 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
832 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
833 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
834 { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
835 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
836 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
837 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
838 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
839 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
840};
841#endif /* MBEDTLS_CIPHER_MODE_CBC */
842
843#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100844static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000845{
846 { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
847 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
848 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
849 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
850 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
851 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
852 { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
853 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
854 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
855 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
856 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
857 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
858 { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
859 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
860 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
861 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
862 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
863 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
864};
865#endif /* MBEDTLS_CIPHER_MODE_CFB */
866
867#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100868static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000869{
870 { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
871 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
872 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
873 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
874 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
875 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
876 { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
877 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
878 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
879 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
880 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
881 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
882 { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
883 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
884 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
885 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
886 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
887 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
888};
889#endif /* MBEDTLS_CIPHER_MODE_CFB */
890
David Horstmann94303302022-10-25 10:23:34 +0100891#define ARIA_SELF_TEST_ASSERT( cond ) \
David Horstmann75b1fe72022-10-06 14:32:30 +0100892 do { \
893 if( cond ) { \
894 if( verbose ) \
895 mbedtls_printf( "failed\n" ); \
896 goto exit; \
897 } else { \
898 if( verbose ) \
899 mbedtls_printf( "passed\n" ); \
900 } \
901 } while( 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000902
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100903/*
904 * Checkup routine
905 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000906int mbedtls_aria_self_test( int verbose )
907{
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000908 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100909 uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000910 mbedtls_aria_context ctx;
Gilles Peskineccbbb2c2021-05-25 09:17:22 +0200911 int ret = 1;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000912
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000913#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
914 size_t j;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000915#endif
916
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000917#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
918 defined(MBEDTLS_CIPHER_MODE_CFB) || \
919 defined(MBEDTLS_CIPHER_MODE_CTR))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100920 uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000921#endif
922
Gilles Peskineccbbb2c2021-05-25 09:17:22 +0200923 mbedtls_aria_init( &ctx );
924
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100925 /*
926 * Test set 1
927 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000928 for( i = 0; i < 3; i++ )
929 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100930 /* test ECB encryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000931 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300932 mbedtls_printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000933 mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200934 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_pt, blk );
David Horstmann94303302022-10-25 10:23:34 +0100935 ARIA_SELF_TEST_ASSERT(
David Horstmann75b1fe72022-10-06 14:32:30 +0100936 memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE )
937 != 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000938
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100939 /* test ECB decryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000940 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300941 mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000942 mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200943 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk );
David Horstmann94303302022-10-25 10:23:34 +0100944 ARIA_SELF_TEST_ASSERT(
David Horstmann75b1fe72022-10-06 14:32:30 +0100945 memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE )
946 != 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000947 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000948 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300949 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000950
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100951 /*
952 * Test set 2
953 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000954#if defined(MBEDTLS_CIPHER_MODE_CBC)
955 for( i = 0; i < 3; i++ )
956 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100957 /* Test CBC encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000958 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300959 mbedtls_printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000960 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100961 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100962 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000963 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
964 aria_test2_pt, buf );
David Horstmann94303302022-10-25 10:23:34 +0100965 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_cbc_ct[i], 48 )
David Horstmann75b1fe72022-10-06 14:32:30 +0100966 != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000967
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100968 /* Test CBC decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000969 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300970 mbedtls_printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000971 mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100972 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100973 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000974 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
975 aria_test2_cbc_ct[i], buf );
David Horstmann94303302022-10-25 10:23:34 +0100976 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_pt, 48 ) != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000977 }
978 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300979 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000980
981#endif /* MBEDTLS_CIPHER_MODE_CBC */
982
983#if defined(MBEDTLS_CIPHER_MODE_CFB)
984 for( i = 0; i < 3; i++ )
985 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100986 /* Test CFB encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000987 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300988 mbedtls_printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000989 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100990 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100991 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000992 j = 0;
993 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
994 aria_test2_pt, buf );
David Horstmann94303302022-10-25 10:23:34 +0100995 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000996
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100997 /* Test CFB decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000998 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300999 mbedtls_printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001000 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001001 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001002 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001003 j = 0;
1004 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
1005 iv, aria_test2_cfb_ct[i], buf );
David Horstmann94303302022-10-25 10:23:34 +01001006 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_pt, 48 ) != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001007 }
1008 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001009 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001010#endif /* MBEDTLS_CIPHER_MODE_CFB */
1011
1012#if defined(MBEDTLS_CIPHER_MODE_CTR)
1013 for( i = 0; i < 3; i++ )
1014 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001015 /* Test CTR encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001016 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001017 mbedtls_printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001018 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001019 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001020 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001021 j = 0;
1022 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1023 aria_test2_pt, buf );
David Horstmann94303302022-10-25 10:23:34 +01001024 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001025
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001026 /* Test CTR decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001027 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001028 mbedtls_printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001029 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001030 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001031 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001032 j = 0;
1033 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1034 aria_test2_ctr_ct[i], buf );
David Horstmann94303302022-10-25 10:23:34 +01001035 ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_pt, 48 ) != 0 );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001036 }
1037 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001038 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001039#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001040
Gilles Peskineccbbb2c2021-05-25 09:17:22 +02001041 ret = 0;
1042
1043exit:
1044 mbedtls_aria_free( &ctx );
1045 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001046}
1047
1048#endif /* MBEDTLS_SELF_TEST */
1049
1050#endif /* MBEDTLS_ARIA_C */