blob: d958ef615ddc91a8c029f2043e460eb45d8384aa [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
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050040/* Parameter validation macros */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010041#define ARIA_VALIDATE_RET(cond) \
42 MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_ARIA_BAD_INPUT_DATA)
43#define ARIA_VALIDATE(cond) \
44 MBEDTLS_INTERNAL_VALIDATE(cond)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050045
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010046/*
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +010047 * 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 +010048 *
49 * This is submatrix P1 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010050 *
51 * Common compilers fail to translate this to minimal number of instructions,
52 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010053 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010054#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010055#if defined(__arm__) /* rev16 available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010056/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
57#if defined(__GNUC__) && \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010058 (!defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010059 __ARM_ARCH >= 6
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010060static inline uint32_t aria_p1(uint32_t x)
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010061{
62 uint32_t r;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010063 __asm("rev16 %0, %1" : "=l" (r) : "l" (x));
64 return r;
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010065}
66#define ARIA_P1 aria_p1
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010067#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010068 (__TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3)
69static inline uint32_t aria_p1(uint32_t x)
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010070{
71 uint32_t r;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010072 __asm("rev16 r, x");
73 return r;
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010074}
75#define ARIA_P1 aria_p1
76#endif
77#endif /* arm */
78#if defined(__GNUC__) && \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010079 defined(__i386__) || defined(__amd64__) || defined(__x86_64__)
Manuel Pégourié-Gonnard2df4bfe2018-05-22 13:39:01 +020080/* I couldn't find an Intel equivalent of rev16, so two instructions */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010081#define ARIA_P1(x) ARIA_P2(ARIA_P3(x))
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010082#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010083#endif /* MBEDTLS_HAVE_ASM && GNUC */
84#if !defined(ARIA_P1)
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010085#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010086#endif
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000087
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010088/*
89 * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits
90 *
91 * This is submatrix P2 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010092 *
93 * Common compilers will translate this to a single instruction.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010094 */
95#define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16))
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000096
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010097/*
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +010098 * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness
99 *
100 * This is submatrix P3 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100101 *
102 * Some compilers fail to translate this to a single instruction,
103 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100104 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100105#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100106#if defined(__arm__) /* rev available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100107/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
108#if defined(__GNUC__) && \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100109 (!defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100110 __ARM_ARCH >= 6
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100111static inline uint32_t aria_p3(uint32_t x)
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100112{
113 uint32_t r;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100114 __asm("rev %0, %1" : "=l" (r) : "l" (x));
115 return r;
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100116}
117#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100118#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100119 (__TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3)
120static inline uint32_t aria_p3(uint32_t x)
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100121{
122 uint32_t r;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100123 __asm("rev r, x");
124 return r;
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100125}
126#define ARIA_P3 aria_p3
127#endif
128#endif /* arm */
129#if defined(__GNUC__) && \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100130 defined(__i386__) || defined(__amd64__) || defined(__x86_64__)
131static inline uint32_t aria_p3(uint32_t x)
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100132{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100133 __asm("bswap %0" : "=r" (x) : "0" (x));
134 return x;
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100135}
136#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100137#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100138#endif /* MBEDTLS_HAVE_ASM && GNUC */
139#if !defined(ARIA_P3)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100140#define ARIA_P3(x) ARIA_P2(ARIA_P1(x))
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100141#endif
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100142
143/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100144 * ARIA Affine Transform
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100145 * (a, b, c, d) = state in/out
146 *
Manuel Pégourié-Gonnardd418b0d2018-05-22 12:56:11 +0200147 * If we denote the first byte of input by 0, ..., the last byte by f,
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100148 * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef.
149 *
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100150 * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100151 * rearrangements on adjacent pairs, output is:
152 *
153 * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe
154 * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100155 * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100156 * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100157 * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100158 * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100159 * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100160 * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef
161 *
162 * Note: another presentation of the A transform can be found as the first
163 * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4.
164 * The implementation below uses only P1 and P2 as they are sufficient.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100165 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100166static inline void aria_a(uint32_t *a, uint32_t *b,
167 uint32_t *c, uint32_t *d)
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100168{
169 uint32_t ta, tb, tc;
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100170 ta = *b; // 4567
171 *b = *a; // 0123
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100172 *a = ARIA_P2(ta); // 6745
173 tb = ARIA_P2(*d); // efcd
174 *d = ARIA_P1(*c); // 98ba
175 *c = ARIA_P1(tb); // fedc
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100176 ta ^= *d; // 4567+98ba
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100177 tc = ARIA_P2(*b); // 2301
178 ta = ARIA_P1(ta) ^ tc ^ *c; // 2301+5476+89ab+fedc
179 tb ^= ARIA_P2(*d); // ba98+efcd
180 tc ^= ARIA_P1(*a); // 2301+7654
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100181 *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100182 tb = ARIA_P2(tb) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc
183 *a ^= ARIA_P1(tb); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT
184 ta = ARIA_P2(ta); // 0123+7654+ab89+dcfe
185 *d ^= ARIA_P1(ta) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT
186 tc = ARIA_P2(tc); // 0123+5476
187 *c ^= ARIA_P1(tc) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000188}
189
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100190/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100191 * ARIA Substitution Layer SL1 / SL2
192 * (a, b, c, d) = state in/out
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100193 * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100194 *
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100195 * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1
196 * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100197 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100198static inline void aria_sl(uint32_t *a, uint32_t *b,
199 uint32_t *c, uint32_t *d,
200 const uint8_t sa[256], const uint8_t sb[256],
201 const uint8_t sc[256], const uint8_t sd[256])
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100202{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100203 *a = ((uint32_t) sa[MBEDTLS_BYTE_0(*a)]) ^
204 (((uint32_t) sb[MBEDTLS_BYTE_1(*a)]) << 8) ^
205 (((uint32_t) sc[MBEDTLS_BYTE_2(*a)]) << 16) ^
206 (((uint32_t) sd[MBEDTLS_BYTE_3(*a)]) << 24);
207 *b = ((uint32_t) sa[MBEDTLS_BYTE_0(*b)]) ^
208 (((uint32_t) sb[MBEDTLS_BYTE_1(*b)]) << 8) ^
209 (((uint32_t) sc[MBEDTLS_BYTE_2(*b)]) << 16) ^
210 (((uint32_t) sd[MBEDTLS_BYTE_3(*b)]) << 24);
211 *c = ((uint32_t) sa[MBEDTLS_BYTE_0(*c)]) ^
212 (((uint32_t) sb[MBEDTLS_BYTE_1(*c)]) << 8) ^
213 (((uint32_t) sc[MBEDTLS_BYTE_2(*c)]) << 16) ^
214 (((uint32_t) sd[MBEDTLS_BYTE_3(*c)]) << 24);
215 *d = ((uint32_t) sa[MBEDTLS_BYTE_0(*d)]) ^
216 (((uint32_t) sb[MBEDTLS_BYTE_1(*d)]) << 8) ^
217 (((uint32_t) sc[MBEDTLS_BYTE_2(*d)]) << 16) ^
218 (((uint32_t) sd[MBEDTLS_BYTE_3(*d)]) << 24);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000219}
220
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100221/*
222 * S-Boxes
223 */
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200224static const uint8_t aria_sb1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000225{
226 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
227 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
228 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
229 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
230 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
231 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
232 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
233 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
234 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
235 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
236 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
237 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
238 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
239 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
240 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
241 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
242 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
243 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
244 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
245 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
246 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
247 0xB0, 0x54, 0xBB, 0x16
248};
249
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200250static const uint8_t aria_sb2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000251{
252 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46,
253 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B,
254 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B,
255 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB,
256 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA,
257 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91,
258 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38,
259 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53,
260 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74,
261 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26,
262 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD,
263 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC,
264 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E,
265 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A,
266 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5,
267 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8,
268 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24,
269 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F,
270 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
271 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D,
272 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A,
273 0xAF, 0xBA, 0xB5, 0x81
274};
275
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200276static const uint8_t aria_is1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000277{
278 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
279 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
280 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
281 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
282 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
283 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
284 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
285 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
286 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
287 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
288 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
289 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
290 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
291 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
292 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
293 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
294 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
295 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
296 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
297 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
298 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
299 0x55, 0x21, 0x0C, 0x7D
300};
301
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200302static const uint8_t aria_is2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000303{
304 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1,
305 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3,
306 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89,
307 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D,
308 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98,
309 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58,
310 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F,
311 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE,
312 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23,
313 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19,
314 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55,
315 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A,
316 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE,
317 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0,
318 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6,
319 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5,
320 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13,
321 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73,
322 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
323 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3,
324 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33,
325 0x03, 0xA2, 0xAC, 0x60
326};
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000327
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100328/*
329 * Helper for key schedule: r = FO( p, k ) ^ x
330 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100331static void aria_fo_xor(uint32_t r[4], const uint32_t p[4],
332 const uint32_t k[4], const uint32_t x[4])
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000333{
334 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000335
336 a = p[0] ^ k[0];
337 b = p[1] ^ k[1];
338 c = p[2] ^ k[2];
339 d = p[3] ^ k[3];
340
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100341 aria_sl(&a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2);
342 aria_a(&a, &b, &c, &d);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000343
344 r[0] = a ^ x[0];
345 r[1] = b ^ x[1];
346 r[2] = c ^ x[2];
347 r[3] = d ^ x[3];
348}
349
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100350/*
351 * Helper for key schedule: r = FE( p, k ) ^ x
352 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100353static void aria_fe_xor(uint32_t r[4], const uint32_t p[4],
354 const uint32_t k[4], const uint32_t x[4])
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000355{
356 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000357
358 a = p[0] ^ k[0];
359 b = p[1] ^ k[1];
360 c = p[2] ^ k[2];
361 d = p[3] ^ k[3];
362
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100363 aria_sl(&a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2);
364 aria_a(&a, &b, &c, &d);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000365
366 r[0] = a ^ x[0];
367 r[1] = b ^ x[1];
368 r[2] = c ^ x[2];
369 r[3] = d ^ x[3];
370}
371
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100372/*
373 * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup.
374 *
375 * We chose to store bytes into 32-bit words in little-endian format (see
Joe Subbiani266476d2021-07-07 15:16:56 +0100376 * MBEDTLS_GET_UINT32_LE / MBEDTLS_PUT_UINT32_LE ) so we need to reverse
377 * bytes here.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100378 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100379static void aria_rot128(uint32_t r[4], const uint32_t a[4],
380 const uint32_t b[4], uint8_t n)
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000381{
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100382 uint8_t i, j;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000383 uint32_t t, u;
384
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100385 const uint8_t n1 = n % 32; // bit offset
386 const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100387
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100388 j = (n / 32) % 4; // initial word offset
389 t = ARIA_P3(b[j]); // big endian
390 for (i = 0; i < 4; i++) {
391 j = (j + 1) % 4; // get next word, big endian
392 u = ARIA_P3(b[j]);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000393 t <<= n1; // rotate
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100394 t |= u >> n2;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100395 t = ARIA_P3(t); // back to little endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000396 r[i] = a[i] ^ t; // store
397 t = u; // move to next word
398 }
399}
400
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100401/*
402 * Set encryption key
403 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100404int mbedtls_aria_setkey_enc(mbedtls_aria_context *ctx,
405 const unsigned char *key, unsigned int keybits)
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000406{
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100407 /* round constant masks */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000408 const uint32_t rc[3][4] =
409 {
410 { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
411 { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
412 { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
413 };
414
415 int i;
416 uint32_t w[4][4], *w2;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100417 ARIA_VALIDATE_RET(ctx != NULL);
418 ARIA_VALIDATE_RET(key != NULL);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000419
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100420 if (keybits != 128 && keybits != 192 && keybits != 256) {
421 return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
422 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000423
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100424 /* Copy key to W0 (and potential remainder to W1) */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100425 w[0][0] = MBEDTLS_GET_UINT32_LE(key, 0);
426 w[0][1] = MBEDTLS_GET_UINT32_LE(key, 4);
427 w[0][2] = MBEDTLS_GET_UINT32_LE(key, 8);
428 w[0][3] = MBEDTLS_GET_UINT32_LE(key, 12);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000429
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100430 memset(w[1], 0, 16);
431 if (keybits >= 192) {
432 w[1][0] = MBEDTLS_GET_UINT32_LE(key, 16); // 192 bit key
433 w[1][1] = MBEDTLS_GET_UINT32_LE(key, 20);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000434 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100435 if (keybits == 256) {
436 w[1][2] = MBEDTLS_GET_UINT32_LE(key, 24); // 256 bit key
437 w[1][3] = MBEDTLS_GET_UINT32_LE(key, 28);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000438 }
439
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100440 i = (keybits - 128) >> 6; // index: 0, 1, 2
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000441 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
442
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100443 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 +0000444 i = i < 2 ? i + 1 : 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100445 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 +0000446 i = i < 2 ? i + 1 : 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100447 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 +0000448
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100449 for (i = 0; i < 4; i++) { // create round keys
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000450 w2 = w[(i + 1) & 3];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100451 aria_rot128(ctx->rk[i], w[i], w2, 128 - 19);
452 aria_rot128(ctx->rk[i + 4], w[i], w2, 128 - 31);
453 aria_rot128(ctx->rk[i + 8], w[i], w2, 61);
454 aria_rot128(ctx->rk[i + 12], w[i], w2, 31);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000455 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100456 aria_rot128(ctx->rk[16], w[0], w[1], 19);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000457
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200458 /* w holds enough info to reconstruct the round keys */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100459 mbedtls_platform_zeroize(w, sizeof(w));
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200460
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100461 return 0;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000462}
463
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100464/*
465 * Set decryption key
466 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100467int mbedtls_aria_setkey_dec(mbedtls_aria_context *ctx,
468 const unsigned char *key, unsigned int keybits)
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000469{
470 int i, j, k, ret;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100471 ARIA_VALIDATE_RET(ctx != NULL);
472 ARIA_VALIDATE_RET(key != NULL);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000473
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100474 ret = mbedtls_aria_setkey_enc(ctx, key, keybits);
475 if (ret != 0) {
476 return ret;
477 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000478
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100479 /* flip the order of round keys */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100480 for (i = 0, j = ctx->nr; i < j; i++, j--) {
481 for (k = 0; k < 4; k++) {
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100482 uint32_t t = ctx->rk[i][k];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000483 ctx->rk[i][k] = ctx->rk[j][k];
484 ctx->rk[j][k] = t;
485 }
486 }
487
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100488 /* apply affine transform to middle keys */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100489 for (i = 1; i < ctx->nr; i++) {
490 aria_a(&ctx->rk[i][0], &ctx->rk[i][1],
491 &ctx->rk[i][2], &ctx->rk[i][3]);
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100492 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000493
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100494 return 0;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000495}
496
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100497/*
498 * Encrypt a block
499 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100500int mbedtls_aria_crypt_ecb(mbedtls_aria_context *ctx,
501 const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
502 unsigned char output[MBEDTLS_ARIA_BLOCKSIZE])
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000503{
504 int i;
505
506 uint32_t a, b, c, d;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100507 ARIA_VALIDATE_RET(ctx != NULL);
508 ARIA_VALIDATE_RET(input != NULL);
509 ARIA_VALIDATE_RET(output != NULL);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000510
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100511 a = MBEDTLS_GET_UINT32_LE(input, 0);
512 b = MBEDTLS_GET_UINT32_LE(input, 4);
513 c = MBEDTLS_GET_UINT32_LE(input, 8);
514 d = MBEDTLS_GET_UINT32_LE(input, 12);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000515
516 i = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100517 while (1) {
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000518 a ^= ctx->rk[i][0];
519 b ^= ctx->rk[i][1];
520 c ^= ctx->rk[i][2];
521 d ^= ctx->rk[i][3];
522 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100523
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100524 aria_sl(&a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2);
525 aria_a(&a, &b, &c, &d);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000526
527 a ^= ctx->rk[i][0];
528 b ^= ctx->rk[i][1];
529 c ^= ctx->rk[i][2];
530 d ^= ctx->rk[i][3];
531 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100532
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100533 aria_sl(&a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2);
534 if (i >= ctx->nr) {
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000535 break;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100536 }
537 aria_a(&a, &b, &c, &d);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000538 }
539
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100540 /* final key mixing */
541 a ^= ctx->rk[i][0];
542 b ^= ctx->rk[i][1];
543 c ^= ctx->rk[i][2];
544 d ^= ctx->rk[i][3];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000545
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100546 MBEDTLS_PUT_UINT32_LE(a, output, 0);
547 MBEDTLS_PUT_UINT32_LE(b, output, 4);
548 MBEDTLS_PUT_UINT32_LE(c, output, 8);
549 MBEDTLS_PUT_UINT32_LE(d, output, 12);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000550
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100551 return 0;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000552}
553
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100554/* Initialize context */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100555void mbedtls_aria_init(mbedtls_aria_context *ctx)
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000556{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100557 ARIA_VALIDATE(ctx != NULL);
558 memset(ctx, 0, sizeof(mbedtls_aria_context));
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000559}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000560
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100561/* Clear context */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100562void mbedtls_aria_free(mbedtls_aria_context *ctx)
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000563{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100564 if (ctx == NULL) {
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000565 return;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100566 }
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000567
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100568 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_aria_context));
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000569}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000570
571#if defined(MBEDTLS_CIPHER_MODE_CBC)
572/*
573 * ARIA-CBC buffer encryption/decryption
574 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100575int mbedtls_aria_crypt_cbc(mbedtls_aria_context *ctx,
576 int mode,
577 size_t length,
578 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
579 const unsigned char *input,
580 unsigned char *output)
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000581{
582 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100583 unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000584
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100585 ARIA_VALIDATE_RET(ctx != NULL);
586 ARIA_VALIDATE_RET(mode == MBEDTLS_ARIA_ENCRYPT ||
587 mode == MBEDTLS_ARIA_DECRYPT);
588 ARIA_VALIDATE_RET(length == 0 || input != NULL);
589 ARIA_VALIDATE_RET(length == 0 || output != NULL);
590 ARIA_VALIDATE_RET(iv != NULL);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500591
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100592 if (length % MBEDTLS_ARIA_BLOCKSIZE) {
593 return MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH;
594 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000595
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100596 if (mode == MBEDTLS_ARIA_DECRYPT) {
597 while (length > 0) {
598 memcpy(temp, input, MBEDTLS_ARIA_BLOCKSIZE);
599 mbedtls_aria_crypt_ecb(ctx, input, output);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000600
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100601 for (i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++) {
602 output[i] = (unsigned char) (output[i] ^ iv[i]);
603 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000604
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100605 memcpy(iv, temp, MBEDTLS_ARIA_BLOCKSIZE);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000606
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100607 input += MBEDTLS_ARIA_BLOCKSIZE;
608 output += MBEDTLS_ARIA_BLOCKSIZE;
609 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000610 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100611 } else {
612 while (length > 0) {
613 for (i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++) {
614 output[i] = (unsigned char) (input[i] ^ iv[i]);
615 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000616
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100617 mbedtls_aria_crypt_ecb(ctx, output, output);
618 memcpy(iv, output, MBEDTLS_ARIA_BLOCKSIZE);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000619
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100620 input += MBEDTLS_ARIA_BLOCKSIZE;
621 output += MBEDTLS_ARIA_BLOCKSIZE;
622 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000623 }
624 }
625
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100626 return 0;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000627}
628#endif /* MBEDTLS_CIPHER_MODE_CBC */
629
630#if defined(MBEDTLS_CIPHER_MODE_CFB)
631/*
632 * ARIA-CFB128 buffer encryption/decryption
633 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100634int mbedtls_aria_crypt_cfb128(mbedtls_aria_context *ctx,
635 int mode,
636 size_t length,
637 size_t *iv_off,
638 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
639 const unsigned char *input,
640 unsigned char *output)
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000641{
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200642 unsigned char c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500643 size_t n;
644
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100645 ARIA_VALIDATE_RET(ctx != NULL);
646 ARIA_VALIDATE_RET(mode == MBEDTLS_ARIA_ENCRYPT ||
647 mode == MBEDTLS_ARIA_DECRYPT);
648 ARIA_VALIDATE_RET(length == 0 || input != NULL);
649 ARIA_VALIDATE_RET(length == 0 || output != NULL);
650 ARIA_VALIDATE_RET(iv != NULL);
651 ARIA_VALIDATE_RET(iv_off != NULL);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500652
653 n = *iv_off;
654
655 /* An overly large value of n can lead to an unlimited
656 * buffer overflow. Therefore, guard against this
657 * outside of parameter validation. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100658 if (n >= MBEDTLS_ARIA_BLOCKSIZE) {
659 return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
660 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000661
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100662 if (mode == MBEDTLS_ARIA_DECRYPT) {
663 while (length--) {
664 if (n == 0) {
665 mbedtls_aria_crypt_ecb(ctx, iv, iv);
666 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000667
668 c = *input++;
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200669 *output++ = c ^ iv[n];
670 iv[n] = c;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000671
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100672 n = (n + 1) & 0x0F;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000673 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100674 } else {
675 while (length--) {
676 if (n == 0) {
677 mbedtls_aria_crypt_ecb(ctx, iv, iv);
678 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000679
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100680 iv[n] = *output++ = (unsigned char) (iv[n] ^ *input++);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000681
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100682 n = (n + 1) & 0x0F;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000683 }
684 }
685
686 *iv_off = n;
687
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100688 return 0;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000689}
690#endif /* MBEDTLS_CIPHER_MODE_CFB */
691
692#if defined(MBEDTLS_CIPHER_MODE_CTR)
693/*
694 * ARIA-CTR buffer encryption/decryption
695 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100696int mbedtls_aria_crypt_ctr(mbedtls_aria_context *ctx,
697 size_t length,
698 size_t *nc_off,
699 unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
700 unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
701 const unsigned char *input,
702 unsigned char *output)
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000703{
704 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500705 size_t n;
706
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100707 ARIA_VALIDATE_RET(ctx != NULL);
708 ARIA_VALIDATE_RET(length == 0 || input != NULL);
709 ARIA_VALIDATE_RET(length == 0 || output != NULL);
710 ARIA_VALIDATE_RET(nonce_counter != NULL);
711 ARIA_VALIDATE_RET(stream_block != NULL);
712 ARIA_VALIDATE_RET(nc_off != NULL);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500713
714 n = *nc_off;
715 /* An overly large value of n can lead to an unlimited
716 * buffer overflow. Therefore, guard against this
717 * outside of parameter validation. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100718 if (n >= MBEDTLS_ARIA_BLOCKSIZE) {
719 return MBEDTLS_ERR_ARIA_BAD_INPUT_DATA;
720 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000721
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100722 while (length--) {
723 if (n == 0) {
724 mbedtls_aria_crypt_ecb(ctx, nonce_counter,
725 stream_block);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000726
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100727 for (i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i--) {
728 if (++nonce_counter[i - 1] != 0) {
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000729 break;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100730 }
731 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000732 }
733 c = *input++;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100734 *output++ = (unsigned char) (c ^ stream_block[n]);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000735
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100736 n = (n + 1) & 0x0F;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000737 }
738
739 *nc_off = n;
740
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100741 return 0;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000742}
743#endif /* MBEDTLS_CIPHER_MODE_CTR */
744#endif /* !MBEDTLS_ARIA_ALT */
745
746#if defined(MBEDTLS_SELF_TEST)
747
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100748/*
749 * Basic ARIA ECB test vectors from RFC 5794
750 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000751static const uint8_t aria_test1_ecb_key[32] = // test key
752{
753 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
754 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
755 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
756 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
757};
758
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100759static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000760{
761 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
762 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
763};
764
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100765static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000766{
767 { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
768 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
769 { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
770 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
771 { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
772 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
773};
774
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100775/*
776 * Mode tests from "Test Vectors for ARIA" Version 1.0
777 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
778 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000779#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000780 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000781static const uint8_t aria_test2_key[32] =
782{
783 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
784 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
785 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
786 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
787};
788
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000789static const uint8_t aria_test2_pt[48] =
790{
791 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
792 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
793 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
794 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
795 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
796 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
797};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000798#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000799
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000800#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100801static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000802{
803 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
804 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
805};
806#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000807
808#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100809static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000810{
811 { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
812 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
813 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
814 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
815 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
816 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
817 { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
818 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
819 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
820 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
821 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
822 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
823 { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
824 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
825 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
826 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
827 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
828 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
829};
830#endif /* MBEDTLS_CIPHER_MODE_CBC */
831
832#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100833static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000834{
835 { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
836 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
837 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
838 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
839 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
840 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
841 { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
842 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
843 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
844 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
845 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
846 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
847 { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
848 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
849 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
850 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
851 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
852 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
853};
854#endif /* MBEDTLS_CIPHER_MODE_CFB */
855
856#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100857static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000858{
859 { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
860 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
861 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
862 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
863 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
864 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
865 { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
866 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
867 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
868 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
869 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
870 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
871 { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
872 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
873 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
874 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
875 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
876 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
877};
878#endif /* MBEDTLS_CIPHER_MODE_CFB */
879
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100880#define ARIA_SELF_TEST_ASSERT(cond) \
881 do { \
882 if (cond) { \
883 if (verbose) \
884 mbedtls_printf("failed\n"); \
885 goto exit; \
886 } else { \
887 if (verbose) \
888 mbedtls_printf("passed\n"); \
889 } \
890 } while (0)
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000891
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100892/*
893 * Checkup routine
894 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100895int mbedtls_aria_self_test(int verbose)
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000896{
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000897 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100898 uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000899 mbedtls_aria_context ctx;
Gilles Peskineccbbb2c2021-05-25 09:17:22 +0200900 int ret = 1;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000901
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000902#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
903 size_t j;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000904#endif
905
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000906#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100907 defined(MBEDTLS_CIPHER_MODE_CFB) || \
908 defined(MBEDTLS_CIPHER_MODE_CTR))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100909 uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000910#endif
911
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100912 mbedtls_aria_init(&ctx);
Gilles Peskineccbbb2c2021-05-25 09:17:22 +0200913
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100914 /*
915 * Test set 1
916 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100917 for (i = 0; i < 3; i++) {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100918 /* test ECB encryption */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100919 if (verbose) {
920 mbedtls_printf(" ARIA-ECB-%d (enc): ", 128 + 64 * i);
921 }
922 mbedtls_aria_setkey_enc(&ctx, aria_test1_ecb_key, 128 + 64 * i);
923 mbedtls_aria_crypt_ecb(&ctx, aria_test1_ecb_pt, blk);
David Horstmann94303302022-10-25 10:23:34 +0100924 ARIA_SELF_TEST_ASSERT(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100925 memcmp(blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE)
926 != 0);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000927
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100928 /* test ECB decryption */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100929 if (verbose) {
930 mbedtls_printf(" ARIA-ECB-%d (dec): ", 128 + 64 * i);
931 }
932 mbedtls_aria_setkey_dec(&ctx, aria_test1_ecb_key, 128 + 64 * i);
933 mbedtls_aria_crypt_ecb(&ctx, aria_test1_ecb_ct[i], blk);
David Horstmann94303302022-10-25 10:23:34 +0100934 ARIA_SELF_TEST_ASSERT(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100935 memcmp(blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE)
936 != 0);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000937 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100938 if (verbose) {
939 mbedtls_printf("\n");
940 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000941
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100942 /*
943 * Test set 2
944 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000945#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100946 for (i = 0; i < 3; i++) {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100947 /* Test CBC encryption */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100948 if (verbose) {
949 mbedtls_printf(" ARIA-CBC-%d (enc): ", 128 + 64 * i);
950 }
951 mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
952 memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
953 memset(buf, 0x55, sizeof(buf));
954 mbedtls_aria_crypt_cbc(&ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
955 aria_test2_pt, buf);
956 ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_cbc_ct[i], 48)
957 != 0);
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000958
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100959 /* Test CBC decryption */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100960 if (verbose) {
961 mbedtls_printf(" ARIA-CBC-%d (dec): ", 128 + 64 * i);
962 }
963 mbedtls_aria_setkey_dec(&ctx, aria_test2_key, 128 + 64 * i);
964 memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
965 memset(buf, 0xAA, sizeof(buf));
966 mbedtls_aria_crypt_cbc(&ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
967 aria_test2_cbc_ct[i], buf);
968 ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0);
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000969 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100970 if (verbose) {
971 mbedtls_printf("\n");
972 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000973
974#endif /* MBEDTLS_CIPHER_MODE_CBC */
975
976#if defined(MBEDTLS_CIPHER_MODE_CFB)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100977 for (i = 0; i < 3; i++) {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100978 /* Test CFB encryption */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100979 if (verbose) {
980 mbedtls_printf(" ARIA-CFB-%d (enc): ", 128 + 64 * i);
981 }
982 mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
983 memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
984 memset(buf, 0x55, sizeof(buf));
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000985 j = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100986 mbedtls_aria_crypt_cfb128(&ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
987 aria_test2_pt, buf);
988 ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_cfb_ct[i], 48) != 0);
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000989
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100990 /* Test CFB decryption */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100991 if (verbose) {
992 mbedtls_printf(" ARIA-CFB-%d (dec): ", 128 + 64 * i);
993 }
994 mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
995 memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE);
996 memset(buf, 0xAA, sizeof(buf));
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000997 j = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100998 mbedtls_aria_crypt_cfb128(&ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
999 iv, aria_test2_cfb_ct[i], buf);
1000 ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0);
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001001 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001002 if (verbose) {
1003 mbedtls_printf("\n");
1004 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001005#endif /* MBEDTLS_CIPHER_MODE_CFB */
1006
1007#if defined(MBEDTLS_CIPHER_MODE_CTR)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001008 for (i = 0; i < 3; i++) {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001009 /* Test CTR encryption */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001010 if (verbose) {
1011 mbedtls_printf(" ARIA-CTR-%d (enc): ", 128 + 64 * i);
1012 }
1013 mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
1014 memset(iv, 0, MBEDTLS_ARIA_BLOCKSIZE); // IV = 0
1015 memset(buf, 0x55, sizeof(buf));
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001016 j = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001017 mbedtls_aria_crypt_ctr(&ctx, 48, &j, iv, blk,
1018 aria_test2_pt, buf);
1019 ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_ctr_ct[i], 48) != 0);
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001020
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001021 /* Test CTR decryption */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001022 if (verbose) {
1023 mbedtls_printf(" ARIA-CTR-%d (dec): ", 128 + 64 * i);
1024 }
1025 mbedtls_aria_setkey_enc(&ctx, aria_test2_key, 128 + 64 * i);
1026 memset(iv, 0, MBEDTLS_ARIA_BLOCKSIZE); // IV = 0
1027 memset(buf, 0xAA, sizeof(buf));
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001028 j = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001029 mbedtls_aria_crypt_ctr(&ctx, 48, &j, iv, blk,
1030 aria_test2_ctr_ct[i], buf);
1031 ARIA_SELF_TEST_ASSERT(memcmp(buf, aria_test2_pt, 48) != 0);
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001032 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001033 if (verbose) {
1034 mbedtls_printf("\n");
1035 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001036#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001037
Gilles Peskineccbbb2c2021-05-25 09:17:22 +02001038 ret = 0;
1039
1040exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001041 mbedtls_aria_free(&ctx);
1042 return ret;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001043}
1044
1045#endif /* MBEDTLS_SELF_TEST */
1046
1047#endif /* MBEDTLS_ARIA_C */