blob: cfa69c2ad6c4be828dc5a9f53ddb3874cda80297 [file] [log] [blame]
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001/*
2 * ARIA implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000018 */
19
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +010020/*
21 * This implementation is based on the following standards:
22 * [1] http://210.104.33.10/ARIA/doc/ARIA-specification-e.pdf
23 * [2] https://tools.ietf.org/html/rfc5794
24 */
25
Gilles Peskinedb09ef62020-06-03 01:43:33 +020026#include "common.h"
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000027
28#if defined(MBEDTLS_ARIA_C)
29
30#include "mbedtls/aria.h"
31
32#include <string.h>
33
34#if defined(MBEDTLS_SELF_TEST)
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000035#include "mbedtls/platform.h"
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000036#endif /* MBEDTLS_SELF_TEST */
37
38#if !defined(MBEDTLS_ARIA_ALT)
39
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +020040#include "mbedtls/platform_util.h"
41
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +010042#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
43 !defined(inline) && !defined(__cplusplus)
44#define inline __inline
45#endif
46
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050047/* Parameter validation macros */
48#define ARIA_VALIDATE_RET( cond ) \
49 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ARIA_BAD_INPUT_DATA )
50#define ARIA_VALIDATE( cond ) \
51 MBEDTLS_INTERNAL_VALIDATE( cond )
52
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010053/*
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +010054 * 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 +010055 *
56 * This is submatrix P1 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010057 *
58 * Common compilers fail to translate this to minimal number of instructions,
59 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010060 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010061#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010062#if defined(__arm__) /* rev16 available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010063/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
64#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010065 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
66 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010067static inline uint32_t aria_p1( uint32_t x )
68{
69 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +010070 __asm( "rev16 %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010071 return( r );
72}
73#define ARIA_P1 aria_p1
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010074#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
75 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +010076static inline uint32_t aria_p1( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010077{
78 uint32_t r;
79 __asm( "rev16 r, x" );
80 return( r );
81}
82#define ARIA_P1 aria_p1
83#endif
84#endif /* arm */
85#if defined(__GNUC__) && \
86 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnard2df4bfe2018-05-22 13:39:01 +020087/* I couldn't find an Intel equivalent of rev16, so two instructions */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010088#define ARIA_P1(x) ARIA_P2( ARIA_P3( x ) )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010089#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010090#endif /* MBEDTLS_HAVE_ASM && GNUC */
91#if !defined(ARIA_P1)
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010092#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010093#endif
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000094
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010095/*
96 * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits
97 *
98 * This is submatrix P2 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010099 *
100 * Common compilers will translate this to a single instruction.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100101 */
102#define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16))
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000103
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100104/*
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100105 * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness
106 *
107 * This is submatrix P3 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100108 *
109 * Some compilers fail to translate this to a single instruction,
110 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100111 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100112#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100113#if defined(__arm__) /* rev available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100114/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
115#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100116 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
117 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100118static inline uint32_t aria_p3( uint32_t x )
119{
120 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100121 __asm( "rev %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100122 return( r );
123}
124#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100125#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
126 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100127static inline uint32_t aria_p3( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100128{
129 uint32_t r;
130 __asm( "rev r, x" );
131 return( r );
132}
133#define ARIA_P3 aria_p3
134#endif
135#endif /* arm */
136#if defined(__GNUC__) && \
137 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100138static inline uint32_t aria_p3( uint32_t x )
139{
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100140 __asm( "bswap %0" : "=r" (x) : "0" (x) );
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100141 return( x );
142}
143#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100144#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100145#endif /* MBEDTLS_HAVE_ASM && GNUC */
146#if !defined(ARIA_P3)
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100147#define ARIA_P3(x) ARIA_P2( ARIA_P1 ( x ) )
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100148#endif
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100149
150/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100151 * ARIA Affine Transform
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100152 * (a, b, c, d) = state in/out
153 *
Manuel Pégourié-Gonnardd418b0d2018-05-22 12:56:11 +0200154 * If we denote the first byte of input by 0, ..., the last byte by f,
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100155 * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef.
156 *
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100157 * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100158 * rearrangements on adjacent pairs, output is:
159 *
160 * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe
161 * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100162 * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100163 * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100164 * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100165 * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100166 * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100167 * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef
168 *
169 * Note: another presentation of the A transform can be found as the first
170 * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4.
171 * The implementation below uses only P1 and P2 as they are sufficient.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100172 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100173static inline void aria_a( uint32_t *a, uint32_t *b,
174 uint32_t *c, uint32_t *d )
175{
176 uint32_t ta, tb, tc;
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100177 ta = *b; // 4567
178 *b = *a; // 0123
179 *a = ARIA_P2( ta ); // 6745
180 tb = ARIA_P2( *d ); // efcd
181 *d = ARIA_P1( *c ); // 98ba
182 *c = ARIA_P1( tb ); // fedc
183 ta ^= *d; // 4567+98ba
184 tc = ARIA_P2( *b ); // 2301
185 ta = ARIA_P1( ta ) ^ tc ^ *c; // 2301+5476+89ab+fedc
186 tb ^= ARIA_P2( *d ); // ba98+efcd
187 tc ^= ARIA_P1( *a ); // 2301+7654
188 *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT
189 tb = ARIA_P2( tb ) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc
190 *a ^= ARIA_P1( tb ); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT
191 ta = ARIA_P2( ta ); // 0123+7654+ab89+dcfe
192 *d ^= ARIA_P1( ta ) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT
193 tc = ARIA_P2( tc ); // 0123+5476
194 *c ^= ARIA_P1( tc ) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000195}
196
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100197/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100198 * ARIA Substitution Layer SL1 / SL2
199 * (a, b, c, d) = state in/out
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100200 * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100201 *
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100202 * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1
203 * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100204 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100205static inline void aria_sl( uint32_t *a, uint32_t *b,
206 uint32_t *c, uint32_t *d,
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200207 const uint8_t sa[256], const uint8_t sb[256],
208 const uint8_t sc[256], const uint8_t sd[256] )
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100209{
Joe Subbianicd84d762021-07-08 14:59:52 +0100210 *a = ( (uint32_t) sa[ MBEDTLS_BYTE_0( *a ) ] ) ^
211 (((uint32_t) sb[ MBEDTLS_BYTE_1( *a ) ]) << 8) ^
212 (((uint32_t) sc[ MBEDTLS_BYTE_2( *a ) ]) << 16) ^
Joe Subbiani54550f72021-07-14 11:59:48 +0100213 (((uint32_t) sd[ MBEDTLS_BYTE_3( *a ) ]) << 24);
Joe Subbianicd84d762021-07-08 14:59:52 +0100214 *b = ( (uint32_t) sa[ MBEDTLS_BYTE_0( *b ) ] ) ^
215 (((uint32_t) sb[ MBEDTLS_BYTE_1( *b ) ]) << 8) ^
216 (((uint32_t) sc[ MBEDTLS_BYTE_2( *b ) ]) << 16) ^
Joe Subbiani54550f72021-07-14 11:59:48 +0100217 (((uint32_t) sd[ MBEDTLS_BYTE_3( *b ) ]) << 24);
Joe Subbianicd84d762021-07-08 14:59:52 +0100218 *c = ( (uint32_t) sa[ MBEDTLS_BYTE_0( *c ) ] ) ^
219 (((uint32_t) sb[ MBEDTLS_BYTE_1( *c ) ]) << 8) ^
220 (((uint32_t) sc[ MBEDTLS_BYTE_2( *c ) ]) << 16) ^
Joe Subbiani54550f72021-07-14 11:59:48 +0100221 (((uint32_t) sd[ MBEDTLS_BYTE_3( *c ) ]) << 24);
Joe Subbianicd84d762021-07-08 14:59:52 +0100222 *d = ( (uint32_t) sa[ MBEDTLS_BYTE_0( *d ) ] ) ^
223 (((uint32_t) sb[ MBEDTLS_BYTE_1( *d ) ]) << 8) ^
224 (((uint32_t) sc[ MBEDTLS_BYTE_2( *d ) ]) << 16) ^
Joe Subbiani54550f72021-07-14 11:59:48 +0100225 (((uint32_t) sd[ MBEDTLS_BYTE_3( *d ) ]) << 24);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000226}
227
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100228/*
229 * S-Boxes
230 */
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200231static const uint8_t aria_sb1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000232{
233 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
234 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
235 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
236 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
237 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
238 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
239 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
240 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
241 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
242 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
243 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
244 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
245 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
246 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
247 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
248 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
249 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
250 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
251 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
252 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
253 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
254 0xB0, 0x54, 0xBB, 0x16
255};
256
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200257static const uint8_t aria_sb2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000258{
259 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46,
260 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B,
261 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B,
262 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB,
263 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA,
264 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91,
265 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38,
266 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53,
267 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74,
268 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26,
269 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD,
270 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC,
271 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E,
272 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A,
273 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5,
274 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8,
275 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24,
276 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F,
277 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
278 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D,
279 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A,
280 0xAF, 0xBA, 0xB5, 0x81
281};
282
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200283static const uint8_t aria_is1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000284{
285 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
286 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
287 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
288 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
289 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
290 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
291 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
292 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
293 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
294 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
295 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
296 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
297 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
298 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
299 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
300 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
301 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
302 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
303 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
304 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
305 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
306 0x55, 0x21, 0x0C, 0x7D
307};
308
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200309static const uint8_t aria_is2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000310{
311 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1,
312 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3,
313 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89,
314 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D,
315 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98,
316 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58,
317 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F,
318 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE,
319 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23,
320 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19,
321 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55,
322 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A,
323 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE,
324 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0,
325 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6,
326 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5,
327 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13,
328 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73,
329 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
330 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3,
331 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33,
332 0x03, 0xA2, 0xAC, 0x60
333};
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000334
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100335/*
336 * Helper for key schedule: r = FO( p, k ) ^ x
337 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100338static void aria_fo_xor( uint32_t r[4], const uint32_t p[4],
339 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000340{
341 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000342
343 a = p[0] ^ k[0];
344 b = p[1] ^ k[1];
345 c = p[2] ^ k[2];
346 d = p[3] ^ k[3];
347
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100348 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
349 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000350
351 r[0] = a ^ x[0];
352 r[1] = b ^ x[1];
353 r[2] = c ^ x[2];
354 r[3] = d ^ x[3];
355}
356
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100357/*
358 * Helper for key schedule: r = FE( p, k ) ^ x
359 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100360static void aria_fe_xor( uint32_t r[4], const uint32_t p[4],
361 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000362{
363 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000364
365 a = p[0] ^ k[0];
366 b = p[1] ^ k[1];
367 c = p[2] ^ k[2];
368 d = p[3] ^ k[3];
369
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100370 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
371 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000372
373 r[0] = a ^ x[0];
374 r[1] = b ^ x[1];
375 r[2] = c ^ x[2];
376 r[3] = d ^ x[3];
377}
378
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100379/*
380 * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup.
381 *
382 * We chose to store bytes into 32-bit words in little-endian format (see
Joe Subbiani394bdd62021-07-07 15:16:56 +0100383 * MBEDTLS_GET_UINT32_LE / MBEDTLS_PUT_UINT32_LE ) so we need to reverse
384 * bytes here.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100385 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100386static void aria_rot128( uint32_t r[4], const uint32_t a[4],
387 const uint32_t b[4], uint8_t n )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000388{
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100389 uint8_t i, j;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000390 uint32_t t, u;
391
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100392 const uint8_t n1 = n % 32; // bit offset
393 const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100394
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200395 j = ( n / 32 ) % 4; // initial word offset
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100396 t = ARIA_P3( b[j] ); // big endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000397 for( i = 0; i < 4; i++ )
398 {
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200399 j = ( j + 1 ) % 4; // get next word, big endian
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100400 u = ARIA_P3( b[j] );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000401 t <<= n1; // rotate
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100402 t |= u >> n2;
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100403 t = ARIA_P3( t ); // back to little endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000404 r[i] = a[i] ^ t; // store
405 t = u; // move to next word
406 }
407}
408
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100409/*
410 * Set encryption key
411 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100412int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx,
413 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000414{
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100415 /* round constant masks */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000416 const uint32_t rc[3][4] =
417 {
418 { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
419 { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
420 { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
421 };
422
423 int i;
424 uint32_t w[4][4], *w2;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500425 ARIA_VALIDATE_RET( ctx != NULL );
426 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000427
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100428 if( keybits != 128 && keybits != 192 && keybits != 256 )
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500429 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000430
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100431 /* Copy key to W0 (and potential remainder to W1) */
Joe Subbiani6a506312021-07-07 16:56:29 +0100432 w[0][0] = MBEDTLS_GET_UINT32_LE( key, 0 );
433 w[0][1] = MBEDTLS_GET_UINT32_LE( key, 4 );
434 w[0][2] = MBEDTLS_GET_UINT32_LE( key, 8 );
435 w[0][3] = MBEDTLS_GET_UINT32_LE( key, 12 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000436
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100437 memset( w[1], 0, 16 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000438 if( keybits >= 192 )
439 {
Joe Subbiani6a506312021-07-07 16:56:29 +0100440 w[1][0] = MBEDTLS_GET_UINT32_LE( key, 16 ); // 192 bit key
441 w[1][1] = MBEDTLS_GET_UINT32_LE( key, 20 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000442 }
443 if( keybits == 256 )
444 {
Joe Subbiani6a506312021-07-07 16:56:29 +0100445 w[1][2] = MBEDTLS_GET_UINT32_LE( key, 24 ); // 256 bit key
446 w[1][3] = MBEDTLS_GET_UINT32_LE( key, 28 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000447 }
448
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200449 i = ( keybits - 128 ) >> 6; // index: 0, 1, 2
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000450 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
451
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100452 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 +0000453 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100454 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 +0000455 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100456 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 +0000457
458 for( i = 0; i < 4; i++ ) // create round keys
459 {
460 w2 = w[(i + 1) & 3];
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100461 aria_rot128( ctx->rk[i ], w[i], w2, 128 - 19 );
462 aria_rot128( ctx->rk[i + 4], w[i], w2, 128 - 31 );
463 aria_rot128( ctx->rk[i + 8], w[i], w2, 61 );
464 aria_rot128( ctx->rk[i + 12], w[i], w2, 31 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000465 }
466 aria_rot128( ctx->rk[16], w[0], w[1], 19 );
467
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200468 /* w holds enough info to reconstruct the round keys */
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200469 mbedtls_platform_zeroize( w, sizeof( w ) );
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200470
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100471 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000472}
473
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100474/*
475 * Set decryption key
476 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100477int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx,
478 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000479{
480 int i, j, k, ret;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500481 ARIA_VALIDATE_RET( ctx != NULL );
482 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000483
484 ret = mbedtls_aria_setkey_enc( ctx, key, keybits );
485 if( ret != 0 )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100486 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000487
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100488 /* flip the order of round keys */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000489 for( i = 0, j = ctx->nr; i < j; i++, j-- )
490 {
491 for( k = 0; k < 4; k++ )
492 {
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100493 uint32_t t = ctx->rk[i][k];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000494 ctx->rk[i][k] = ctx->rk[j][k];
495 ctx->rk[j][k] = t;
496 }
497 }
498
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100499 /* apply affine transform to middle keys */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100500 for( i = 1; i < ctx->nr; i++ )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100501 {
502 aria_a( &ctx->rk[i][0], &ctx->rk[i][1],
503 &ctx->rk[i][2], &ctx->rk[i][3] );
504 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000505
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100506 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000507}
508
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100509/*
510 * Encrypt a block
511 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000512int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100513 const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
514 unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000515{
516 int i;
517
518 uint32_t a, b, c, d;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500519 ARIA_VALIDATE_RET( ctx != NULL );
520 ARIA_VALIDATE_RET( input != NULL );
521 ARIA_VALIDATE_RET( output != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000522
Joe Subbiani6a506312021-07-07 16:56:29 +0100523 a = MBEDTLS_GET_UINT32_LE( input, 0 );
524 b = MBEDTLS_GET_UINT32_LE( input, 4 );
525 c = MBEDTLS_GET_UINT32_LE( input, 8 );
526 d = MBEDTLS_GET_UINT32_LE( input, 12 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000527
528 i = 0;
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100529 while( 1 )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000530 {
531 a ^= ctx->rk[i][0];
532 b ^= ctx->rk[i][1];
533 c ^= ctx->rk[i][2];
534 d ^= ctx->rk[i][3];
535 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100536
537 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
538 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000539
540 a ^= ctx->rk[i][0];
541 b ^= ctx->rk[i][1];
542 c ^= ctx->rk[i][2];
543 d ^= ctx->rk[i][3];
544 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100545
546 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100547 if( i >= ctx->nr )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000548 break;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100549 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000550 }
551
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100552 /* final key mixing */
553 a ^= ctx->rk[i][0];
554 b ^= ctx->rk[i][1];
555 c ^= ctx->rk[i][2];
556 d ^= ctx->rk[i][3];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000557
Joe Subbiani5ecac212021-06-24 13:00:03 +0100558 MBEDTLS_PUT_UINT32_LE( a, output, 0 );
559 MBEDTLS_PUT_UINT32_LE( b, output, 4 );
560 MBEDTLS_PUT_UINT32_LE( c, output, 8 );
561 MBEDTLS_PUT_UINT32_LE( d, output, 12 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000562
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100563 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000564}
565
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100566/* Initialize context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000567void mbedtls_aria_init( mbedtls_aria_context *ctx )
568{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500569 ARIA_VALIDATE( ctx != NULL );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000570 memset( ctx, 0, sizeof( mbedtls_aria_context ) );
571}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000572
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100573/* Clear context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000574void mbedtls_aria_free( mbedtls_aria_context *ctx )
575{
576 if( ctx == NULL )
577 return;
578
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200579 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aria_context ) );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000580}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000581
582#if defined(MBEDTLS_CIPHER_MODE_CBC)
583/*
584 * ARIA-CBC buffer encryption/decryption
585 */
586int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100587 int mode,
588 size_t length,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100589 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100590 const unsigned char *input,
591 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000592{
593 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100594 unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000595
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500596 ARIA_VALIDATE_RET( ctx != NULL );
597 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
598 mode == MBEDTLS_ARIA_DECRYPT );
599 ARIA_VALIDATE_RET( length == 0 || input != NULL );
600 ARIA_VALIDATE_RET( length == 0 || output != NULL );
601 ARIA_VALIDATE_RET( iv != NULL );
602
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100603 if( length % MBEDTLS_ARIA_BLOCKSIZE )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000604 return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH );
605
606 if( mode == MBEDTLS_ARIA_DECRYPT )
607 {
608 while( length > 0 )
609 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100610 memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200611 mbedtls_aria_crypt_ecb( ctx, input, output );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000612
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100613 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000614 output[i] = (unsigned char)( output[i] ^ iv[i] );
615
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100616 memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000617
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100618 input += MBEDTLS_ARIA_BLOCKSIZE;
619 output += MBEDTLS_ARIA_BLOCKSIZE;
620 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000621 }
622 }
623 else
624 {
625 while( length > 0 )
626 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100627 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000628 output[i] = (unsigned char)( input[i] ^ iv[i] );
629
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200630 mbedtls_aria_crypt_ecb( ctx, output, output );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100631 memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000632
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100633 input += MBEDTLS_ARIA_BLOCKSIZE;
634 output += MBEDTLS_ARIA_BLOCKSIZE;
635 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000636 }
637 }
638
639 return( 0 );
640}
641#endif /* MBEDTLS_CIPHER_MODE_CBC */
642
643#if defined(MBEDTLS_CIPHER_MODE_CFB)
644/*
645 * ARIA-CFB128 buffer encryption/decryption
646 */
647int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100648 int mode,
649 size_t length,
650 size_t *iv_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100651 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100652 const unsigned char *input,
653 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000654{
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200655 unsigned char c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500656 size_t n;
657
658 ARIA_VALIDATE_RET( ctx != NULL );
659 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
660 mode == MBEDTLS_ARIA_DECRYPT );
661 ARIA_VALIDATE_RET( length == 0 || input != NULL );
662 ARIA_VALIDATE_RET( length == 0 || output != NULL );
663 ARIA_VALIDATE_RET( iv != NULL );
664 ARIA_VALIDATE_RET( iv_off != NULL );
665
666 n = *iv_off;
667
668 /* An overly large value of n can lead to an unlimited
669 * buffer overflow. Therefore, guard against this
670 * outside of parameter validation. */
671 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
672 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000673
674 if( mode == MBEDTLS_ARIA_DECRYPT )
675 {
676 while( length-- )
677 {
678 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200679 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000680
681 c = *input++;
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200682 *output++ = c ^ iv[n];
683 iv[n] = c;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000684
685 n = ( n + 1 ) & 0x0F;
686 }
687 }
688 else
689 {
690 while( length-- )
691 {
692 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200693 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000694
695 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
696
697 n = ( n + 1 ) & 0x0F;
698 }
699 }
700
701 *iv_off = n;
702
703 return( 0 );
704}
705#endif /* MBEDTLS_CIPHER_MODE_CFB */
706
707#if defined(MBEDTLS_CIPHER_MODE_CTR)
708/*
709 * ARIA-CTR buffer encryption/decryption
710 */
711int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100712 size_t length,
713 size_t *nc_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100714 unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
715 unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100716 const unsigned char *input,
717 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000718{
719 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500720 size_t n;
721
722 ARIA_VALIDATE_RET( ctx != NULL );
723 ARIA_VALIDATE_RET( length == 0 || input != NULL );
724 ARIA_VALIDATE_RET( length == 0 || output != NULL );
725 ARIA_VALIDATE_RET( nonce_counter != NULL );
726 ARIA_VALIDATE_RET( stream_block != NULL );
727 ARIA_VALIDATE_RET( nc_off != NULL );
728
729 n = *nc_off;
730 /* An overly large value of n can lead to an unlimited
731 * buffer overflow. Therefore, guard against this
732 * outside of parameter validation. */
733 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
734 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000735
736 while( length-- )
737 {
738 if( n == 0 ) {
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200739 mbedtls_aria_crypt_ecb( ctx, nonce_counter,
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000740 stream_block );
741
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100742 for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000743 if( ++nonce_counter[i - 1] != 0 )
744 break;
745 }
746 c = *input++;
747 *output++ = (unsigned char)( c ^ stream_block[n] );
748
749 n = ( n + 1 ) & 0x0F;
750 }
751
752 *nc_off = n;
753
754 return( 0 );
755}
756#endif /* MBEDTLS_CIPHER_MODE_CTR */
757#endif /* !MBEDTLS_ARIA_ALT */
758
759#if defined(MBEDTLS_SELF_TEST)
760
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100761/*
762 * Basic ARIA ECB test vectors from RFC 5794
763 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000764static const uint8_t aria_test1_ecb_key[32] = // test key
765{
766 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
767 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
768 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
769 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
770};
771
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100772static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000773{
774 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
775 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
776};
777
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100778static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000779{
780 { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
781 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
782 { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
783 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
784 { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
785 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
786};
787
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100788/*
789 * Mode tests from "Test Vectors for ARIA" Version 1.0
790 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
791 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000792#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000793 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000794static const uint8_t aria_test2_key[32] =
795{
796 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
797 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
798 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
799 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
800};
801
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000802static const uint8_t aria_test2_pt[48] =
803{
804 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
805 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
806 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
807 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
808 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
809 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
810};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000811#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000812
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000813#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100814static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000815{
816 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
817 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
818};
819#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000820
821#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100822static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000823{
824 { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
825 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
826 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
827 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
828 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
829 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
830 { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
831 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
832 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
833 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
834 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
835 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
836 { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
837 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
838 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
839 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
840 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
841 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
842};
843#endif /* MBEDTLS_CIPHER_MODE_CBC */
844
845#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100846static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000847{
848 { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
849 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
850 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
851 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
852 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
853 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
854 { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
855 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
856 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
857 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
858 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
859 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
860 { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
861 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
862 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
863 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
864 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
865 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
866};
867#endif /* MBEDTLS_CIPHER_MODE_CFB */
868
869#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100870static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000871{
872 { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
873 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
874 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
875 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
876 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
877 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
878 { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
879 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
880 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
881 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
882 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
883 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
884 { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
885 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
886 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
887 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
888 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
889 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
890};
891#endif /* MBEDTLS_CIPHER_MODE_CFB */
892
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000893#define ARIA_SELF_TEST_IF_FAIL \
894 { \
895 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300896 mbedtls_printf( "failed\n" ); \
Gilles Peskinebe89fea2021-05-25 09:17:22 +0200897 goto exit; \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000898 } else { \
899 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300900 mbedtls_printf( "passed\n" ); \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000901 }
902
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 Peskinebe89fea2021-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 Peskinebe89fea2021-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 );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100935 if( memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000936 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000937
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100938 /* test ECB decryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000939 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300940 mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000941 mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200942 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100943 if( memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000944 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000945 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000946 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300947 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000948
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100949 /*
950 * Test set 2
951 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000952#if defined(MBEDTLS_CIPHER_MODE_CBC)
953 for( i = 0; i < 3; i++ )
954 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100955 /* Test CBC encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000956 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300957 mbedtls_printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000958 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100959 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100960 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000961 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
962 aria_test2_pt, buf );
963 if( memcmp( buf, aria_test2_cbc_ct[i], 48 ) != 0 )
964 ARIA_SELF_TEST_IF_FAIL;
965
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100966 /* Test CBC decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000967 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300968 mbedtls_printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000969 mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100970 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100971 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000972 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
973 aria_test2_cbc_ct[i], buf );
974 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
975 ARIA_SELF_TEST_IF_FAIL;
976 }
977 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300978 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000979
980#endif /* MBEDTLS_CIPHER_MODE_CBC */
981
982#if defined(MBEDTLS_CIPHER_MODE_CFB)
983 for( i = 0; i < 3; i++ )
984 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100985 /* Test CFB encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000986 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300987 mbedtls_printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000988 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100989 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100990 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000991 j = 0;
992 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
993 aria_test2_pt, buf );
994 if( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 )
995 ARIA_SELF_TEST_IF_FAIL;
996
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 );
1006 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1007 ARIA_SELF_TEST_IF_FAIL;
1008 }
1009 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001010 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001011#endif /* MBEDTLS_CIPHER_MODE_CFB */
1012
1013#if defined(MBEDTLS_CIPHER_MODE_CTR)
1014 for( i = 0; i < 3; i++ )
1015 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001016 /* Test CTR encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001017 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001018 mbedtls_printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001019 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001020 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001021 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001022 j = 0;
1023 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1024 aria_test2_pt, buf );
1025 if( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 )
1026 ARIA_SELF_TEST_IF_FAIL;
1027
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001028 /* Test CTR decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001029 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001030 mbedtls_printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001031 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001032 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001033 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001034 j = 0;
1035 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1036 aria_test2_ctr_ct[i], buf );
1037 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1038 ARIA_SELF_TEST_IF_FAIL;
1039 }
1040 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001041 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001042#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001043
Gilles Peskinebe89fea2021-05-25 09:17:22 +02001044 ret = 0;
1045
1046exit:
1047 mbedtls_aria_free( &ctx );
1048 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001049}
1050
1051#endif /* MBEDTLS_SELF_TEST */
1052
1053#endif /* MBEDTLS_ARIA_C */