blob: 50ccb91c702f93ba663b41ed456e92aa9fcbdd9a [file] [log] [blame]
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001/*
2 * ARIA implementation
3 *
Bence Szépkútia2947ac2020-08-19 16:37:36 +02004 * Copyright The Mbed TLS Contributors
Bence Szépkútif744bd72020-06-05 13:02:18 +02005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 *
7 * This file is provided under the Apache License 2.0, or the
8 * GNU General Public License v2.0 or later.
9 *
10 * **********
11 * Apache License 2.0:
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000012 *
13 * Licensed under the Apache License, Version 2.0 (the "License"); you may
14 * not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 * http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
24 *
Bence Szépkútif744bd72020-06-05 13:02:18 +020025 * **********
26 *
27 * **********
28 * GNU General Public License v2.0 or later:
29 *
30 * This program is free software; you can redistribute it and/or modify
31 * it under the terms of the GNU General Public License as published by
32 * the Free Software Foundation; either version 2 of the License, or
33 * (at your option) any later version.
34 *
35 * This program is distributed in the hope that it will be useful,
36 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38 * GNU General Public License for more details.
39 *
40 * You should have received a copy of the GNU General Public License along
41 * with this program; if not, write to the Free Software Foundation, Inc.,
42 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
43 *
44 * **********
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000045 */
46
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +010047/*
48 * This implementation is based on the following standards:
49 * [1] http://210.104.33.10/ARIA/doc/ARIA-specification-e.pdf
50 * [2] https://tools.ietf.org/html/rfc5794
51 */
52
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000053#if !defined(MBEDTLS_CONFIG_FILE)
54#include "mbedtls/config.h"
55#else
56#include MBEDTLS_CONFIG_FILE
57#endif
58
59#if defined(MBEDTLS_ARIA_C)
60
61#include "mbedtls/aria.h"
62
63#include <string.h>
64
65#if defined(MBEDTLS_SELF_TEST)
66#if defined(MBEDTLS_PLATFORM_C)
67#include "mbedtls/platform.h"
68#else
69#include <stdio.h>
70#define mbedtls_printf printf
71#endif /* MBEDTLS_PLATFORM_C */
72#endif /* MBEDTLS_SELF_TEST */
73
74#if !defined(MBEDTLS_ARIA_ALT)
75
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +020076#include "mbedtls/platform_util.h"
77
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +010078#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
79 !defined(inline) && !defined(__cplusplus)
80#define inline __inline
81#endif
82
Hanno Beckerb54ae0b2018-12-11 21:51:32 +000083/* Parameter validation macros */
84#define ARIA_VALIDATE_RET( cond ) \
85 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ARIA_BAD_INPUT_DATA )
86#define ARIA_VALIDATE( cond ) \
87 MBEDTLS_INTERNAL_VALIDATE( cond )
88
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010089/*
90 * 32-bit integer manipulation macros (little endian)
91 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000092#ifndef GET_UINT32_LE
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +010093#define GET_UINT32_LE( n, b, i ) \
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000094{ \
95 (n) = ( (uint32_t) (b)[(i) ] ) \
96 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
97 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
98 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
99}
100#endif
101
102#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100103#define PUT_UINT32_LE( n, b, i ) \
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000104{ \
105 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
106 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
107 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
108 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
109}
110#endif
111
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100112/*
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100113 * 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 +0100114 *
115 * This is submatrix P1 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100116 *
117 * Common compilers fail to translate this to minimal number of instructions,
118 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100119 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100120#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100121#if defined(__arm__) /* rev16 available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100122/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
123#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100124 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
125 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100126static inline uint32_t aria_p1( uint32_t x )
127{
128 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100129 __asm( "rev16 %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100130 return( r );
131}
132#define ARIA_P1 aria_p1
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100133#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
134 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100135static inline uint32_t aria_p1( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100136{
137 uint32_t r;
138 __asm( "rev16 r, x" );
139 return( r );
140}
141#define ARIA_P1 aria_p1
142#endif
143#endif /* arm */
144#if defined(__GNUC__) && \
145 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnard2df4bfe2018-05-22 13:39:01 +0200146/* I couldn't find an Intel equivalent of rev16, so two instructions */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100147#define ARIA_P1(x) ARIA_P2( ARIA_P3( x ) )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100148#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100149#endif /* MBEDTLS_HAVE_ASM && GNUC */
150#if !defined(ARIA_P1)
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100151#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100152#endif
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000153
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100154/*
155 * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits
156 *
157 * This is submatrix P2 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100158 *
159 * Common compilers will translate this to a single instruction.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100160 */
161#define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16))
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000162
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100163/*
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100164 * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness
165 *
166 * This is submatrix P3 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100167 *
168 * Some compilers fail to translate this to a single instruction,
169 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100170 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100171#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100172#if defined(__arm__) /* rev available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100173/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
174#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100175 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
176 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100177static inline uint32_t aria_p3( uint32_t x )
178{
179 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100180 __asm( "rev %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100181 return( r );
182}
183#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100184#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
185 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100186static inline uint32_t aria_p3( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100187{
188 uint32_t r;
189 __asm( "rev r, x" );
190 return( r );
191}
192#define ARIA_P3 aria_p3
193#endif
194#endif /* arm */
195#if defined(__GNUC__) && \
196 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100197static inline uint32_t aria_p3( uint32_t x )
198{
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100199 __asm( "bswap %0" : "=r" (x) : "0" (x) );
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100200 return( x );
201}
202#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100203#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100204#endif /* MBEDTLS_HAVE_ASM && GNUC */
205#if !defined(ARIA_P3)
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100206#define ARIA_P3(x) ARIA_P2( ARIA_P1 ( x ) )
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100207#endif
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100208
209/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100210 * ARIA Affine Transform
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100211 * (a, b, c, d) = state in/out
212 *
Manuel Pégourié-Gonnardd418b0d2018-05-22 12:56:11 +0200213 * If we denote the first byte of input by 0, ..., the last byte by f,
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100214 * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef.
215 *
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100216 * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100217 * rearrangements on adjacent pairs, output is:
218 *
219 * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe
220 * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100221 * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100222 * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100223 * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100224 * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100225 * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100226 * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef
227 *
228 * Note: another presentation of the A transform can be found as the first
229 * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4.
230 * The implementation below uses only P1 and P2 as they are sufficient.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100231 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100232static inline void aria_a( uint32_t *a, uint32_t *b,
233 uint32_t *c, uint32_t *d )
234{
235 uint32_t ta, tb, tc;
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100236 ta = *b; // 4567
237 *b = *a; // 0123
238 *a = ARIA_P2( ta ); // 6745
239 tb = ARIA_P2( *d ); // efcd
240 *d = ARIA_P1( *c ); // 98ba
241 *c = ARIA_P1( tb ); // fedc
242 ta ^= *d; // 4567+98ba
243 tc = ARIA_P2( *b ); // 2301
244 ta = ARIA_P1( ta ) ^ tc ^ *c; // 2301+5476+89ab+fedc
245 tb ^= ARIA_P2( *d ); // ba98+efcd
246 tc ^= ARIA_P1( *a ); // 2301+7654
247 *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT
248 tb = ARIA_P2( tb ) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc
249 *a ^= ARIA_P1( tb ); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT
250 ta = ARIA_P2( ta ); // 0123+7654+ab89+dcfe
251 *d ^= ARIA_P1( ta ) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT
252 tc = ARIA_P2( tc ); // 0123+5476
253 *c ^= ARIA_P1( tc ) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000254}
255
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100256/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100257 * ARIA Substitution Layer SL1 / SL2
258 * (a, b, c, d) = state in/out
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100259 * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100260 *
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100261 * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1
262 * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100263 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100264static inline void aria_sl( uint32_t *a, uint32_t *b,
265 uint32_t *c, uint32_t *d,
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200266 const uint8_t sa[256], const uint8_t sb[256],
267 const uint8_t sc[256], const uint8_t sd[256] )
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100268{
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100269 *a = ( (uint32_t) sa[ *a & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100270 (((uint32_t) sb[(*a >> 8) & 0xFF]) << 8) ^
271 (((uint32_t) sc[(*a >> 16) & 0xFF]) << 16) ^
272 (((uint32_t) sd[ *a >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100273 *b = ( (uint32_t) sa[ *b & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100274 (((uint32_t) sb[(*b >> 8) & 0xFF]) << 8) ^
275 (((uint32_t) sc[(*b >> 16) & 0xFF]) << 16) ^
276 (((uint32_t) sd[ *b >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100277 *c = ( (uint32_t) sa[ *c & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100278 (((uint32_t) sb[(*c >> 8) & 0xFF]) << 8) ^
279 (((uint32_t) sc[(*c >> 16) & 0xFF]) << 16) ^
280 (((uint32_t) sd[ *c >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100281 *d = ( (uint32_t) sa[ *d & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100282 (((uint32_t) sb[(*d >> 8) & 0xFF]) << 8) ^
283 (((uint32_t) sc[(*d >> 16) & 0xFF]) << 16) ^
284 (((uint32_t) sd[ *d >> 24 ]) << 24);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000285}
286
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100287/*
288 * S-Boxes
289 */
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200290static const uint8_t aria_sb1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000291{
292 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
293 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
294 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
295 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
296 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
297 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
298 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
299 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
300 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
301 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
302 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
303 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
304 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
305 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
306 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
307 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
308 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
309 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
310 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
311 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
312 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
313 0xB0, 0x54, 0xBB, 0x16
314};
315
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200316static const uint8_t aria_sb2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000317{
318 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46,
319 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B,
320 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B,
321 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB,
322 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA,
323 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91,
324 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38,
325 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53,
326 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74,
327 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26,
328 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD,
329 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC,
330 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E,
331 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A,
332 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5,
333 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8,
334 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24,
335 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F,
336 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
337 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D,
338 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A,
339 0xAF, 0xBA, 0xB5, 0x81
340};
341
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200342static const uint8_t aria_is1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000343{
344 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
345 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
346 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
347 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
348 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
349 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
350 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
351 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
352 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
353 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
354 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
355 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
356 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
357 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
358 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
359 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
360 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
361 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
362 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
363 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
364 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
365 0x55, 0x21, 0x0C, 0x7D
366};
367
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200368static const uint8_t aria_is2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000369{
370 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1,
371 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3,
372 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89,
373 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D,
374 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98,
375 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58,
376 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F,
377 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE,
378 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23,
379 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19,
380 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55,
381 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A,
382 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE,
383 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0,
384 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6,
385 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5,
386 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13,
387 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73,
388 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
389 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3,
390 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33,
391 0x03, 0xA2, 0xAC, 0x60
392};
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000393
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100394/*
395 * Helper for key schedule: r = FO( p, k ) ^ x
396 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100397static void aria_fo_xor( uint32_t r[4], const uint32_t p[4],
398 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000399{
400 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000401
402 a = p[0] ^ k[0];
403 b = p[1] ^ k[1];
404 c = p[2] ^ k[2];
405 d = p[3] ^ k[3];
406
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100407 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
408 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000409
410 r[0] = a ^ x[0];
411 r[1] = b ^ x[1];
412 r[2] = c ^ x[2];
413 r[3] = d ^ x[3];
414}
415
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100416/*
417 * Helper for key schedule: r = FE( p, k ) ^ x
418 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100419static void aria_fe_xor( uint32_t r[4], const uint32_t p[4],
420 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000421{
422 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000423
424 a = p[0] ^ k[0];
425 b = p[1] ^ k[1];
426 c = p[2] ^ k[2];
427 d = p[3] ^ k[3];
428
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100429 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
430 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000431
432 r[0] = a ^ x[0];
433 r[1] = b ^ x[1];
434 r[2] = c ^ x[2];
435 r[3] = d ^ x[3];
436}
437
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100438/*
439 * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup.
440 *
441 * We chose to store bytes into 32-bit words in little-endian format (see
442 * GET/PUT_UINT32_LE) so we need to reverse bytes here.
443 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100444static void aria_rot128( uint32_t r[4], const uint32_t a[4],
445 const uint32_t b[4], uint8_t n )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000446{
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100447 uint8_t i, j;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000448 uint32_t t, u;
449
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100450 const uint8_t n1 = n % 32; // bit offset
451 const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100452
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200453 j = ( n / 32 ) % 4; // initial word offset
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100454 t = ARIA_P3( b[j] ); // big endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000455 for( i = 0; i < 4; i++ )
456 {
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200457 j = ( j + 1 ) % 4; // get next word, big endian
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100458 u = ARIA_P3( b[j] );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000459 t <<= n1; // rotate
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100460 t |= u >> n2;
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100461 t = ARIA_P3( t ); // back to little endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000462 r[i] = a[i] ^ t; // store
463 t = u; // move to next word
464 }
465}
466
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100467/*
468 * Set encryption key
469 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100470int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx,
471 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000472{
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100473 /* round constant masks */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000474 const uint32_t rc[3][4] =
475 {
476 { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
477 { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
478 { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
479 };
480
481 int i;
482 uint32_t w[4][4], *w2;
Hanno Beckerb54ae0b2018-12-11 21:51:32 +0000483 ARIA_VALIDATE_RET( ctx != NULL );
484 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000485
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100486 if( keybits != 128 && keybits != 192 && keybits != 256 )
Hanno Becker2f475502018-12-17 13:19:06 +0000487 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000488
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100489 /* Copy key to W0 (and potential remainder to W1) */
490 GET_UINT32_LE( w[0][0], key, 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000491 GET_UINT32_LE( w[0][1], key, 4 );
492 GET_UINT32_LE( w[0][2], key, 8 );
493 GET_UINT32_LE( w[0][3], key, 12 );
494
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100495 memset( w[1], 0, 16 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000496 if( keybits >= 192 )
497 {
498 GET_UINT32_LE( w[1][0], key, 16 ); // 192 bit key
499 GET_UINT32_LE( w[1][1], key, 20 );
500 }
501 if( keybits == 256 )
502 {
503 GET_UINT32_LE( w[1][2], key, 24 ); // 256 bit key
504 GET_UINT32_LE( w[1][3], key, 28 );
505 }
506
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200507 i = ( keybits - 128 ) >> 6; // index: 0, 1, 2
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000508 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
509
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100510 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 +0000511 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100512 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 +0000513 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100514 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 +0000515
516 for( i = 0; i < 4; i++ ) // create round keys
517 {
518 w2 = w[(i + 1) & 3];
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100519 aria_rot128( ctx->rk[i ], w[i], w2, 128 - 19 );
520 aria_rot128( ctx->rk[i + 4], w[i], w2, 128 - 31 );
521 aria_rot128( ctx->rk[i + 8], w[i], w2, 61 );
522 aria_rot128( ctx->rk[i + 12], w[i], w2, 31 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000523 }
524 aria_rot128( ctx->rk[16], w[0], w[1], 19 );
525
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200526 /* w holds enough info to reconstruct the round keys */
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200527 mbedtls_platform_zeroize( w, sizeof( w ) );
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200528
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100529 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000530}
531
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100532/*
533 * Set decryption key
534 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100535int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx,
536 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000537{
538 int i, j, k, ret;
Hanno Beckerb54ae0b2018-12-11 21:51:32 +0000539 ARIA_VALIDATE_RET( ctx != NULL );
540 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000541
542 ret = mbedtls_aria_setkey_enc( ctx, key, keybits );
543 if( ret != 0 )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100544 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000545
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100546 /* flip the order of round keys */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000547 for( i = 0, j = ctx->nr; i < j; i++, j-- )
548 {
549 for( k = 0; k < 4; k++ )
550 {
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100551 uint32_t t = ctx->rk[i][k];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000552 ctx->rk[i][k] = ctx->rk[j][k];
553 ctx->rk[j][k] = t;
554 }
555 }
556
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100557 /* apply affine transform to middle keys */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100558 for( i = 1; i < ctx->nr; i++ )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100559 {
560 aria_a( &ctx->rk[i][0], &ctx->rk[i][1],
561 &ctx->rk[i][2], &ctx->rk[i][3] );
562 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000563
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100564 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000565}
566
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100567/*
568 * Encrypt a block
569 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000570int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100571 const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
572 unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000573{
574 int i;
575
576 uint32_t a, b, c, d;
Hanno Beckerb54ae0b2018-12-11 21:51:32 +0000577 ARIA_VALIDATE_RET( ctx != NULL );
578 ARIA_VALIDATE_RET( input != NULL );
579 ARIA_VALIDATE_RET( output != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000580
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000581 GET_UINT32_LE( a, input, 0 );
582 GET_UINT32_LE( b, input, 4 );
583 GET_UINT32_LE( c, input, 8 );
584 GET_UINT32_LE( d, input, 12 );
585
586 i = 0;
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100587 while( 1 )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000588 {
589 a ^= ctx->rk[i][0];
590 b ^= ctx->rk[i][1];
591 c ^= ctx->rk[i][2];
592 d ^= ctx->rk[i][3];
593 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100594
595 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
596 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000597
598 a ^= ctx->rk[i][0];
599 b ^= ctx->rk[i][1];
600 c ^= ctx->rk[i][2];
601 d ^= ctx->rk[i][3];
602 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100603
604 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100605 if( i >= ctx->nr )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000606 break;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100607 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000608 }
609
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100610 /* final key mixing */
611 a ^= ctx->rk[i][0];
612 b ^= ctx->rk[i][1];
613 c ^= ctx->rk[i][2];
614 d ^= ctx->rk[i][3];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000615
616 PUT_UINT32_LE( a, output, 0 );
617 PUT_UINT32_LE( b, output, 4 );
618 PUT_UINT32_LE( c, output, 8 );
619 PUT_UINT32_LE( d, output, 12 );
620
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100621 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000622}
623
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100624/* Initialize context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000625void mbedtls_aria_init( mbedtls_aria_context *ctx )
626{
Hanno Beckerb54ae0b2018-12-11 21:51:32 +0000627 ARIA_VALIDATE( ctx != NULL );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000628 memset( ctx, 0, sizeof( mbedtls_aria_context ) );
629}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000630
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100631/* Clear context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000632void mbedtls_aria_free( mbedtls_aria_context *ctx )
633{
634 if( ctx == NULL )
635 return;
636
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200637 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aria_context ) );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000638}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000639
640#if defined(MBEDTLS_CIPHER_MODE_CBC)
641/*
642 * ARIA-CBC buffer encryption/decryption
643 */
644int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100645 int mode,
646 size_t length,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100647 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100648 const unsigned char *input,
649 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000650{
651 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100652 unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000653
Hanno Beckerb54ae0b2018-12-11 21:51:32 +0000654 ARIA_VALIDATE_RET( ctx != NULL );
655 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
656 mode == MBEDTLS_ARIA_DECRYPT );
657 ARIA_VALIDATE_RET( length == 0 || input != NULL );
658 ARIA_VALIDATE_RET( length == 0 || output != NULL );
659 ARIA_VALIDATE_RET( iv != NULL );
660
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100661 if( length % MBEDTLS_ARIA_BLOCKSIZE )
Hanno Beckera0343692018-12-18 09:42:58 +0000662 return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000663
664 if( mode == MBEDTLS_ARIA_DECRYPT )
665 {
666 while( length > 0 )
667 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100668 memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200669 mbedtls_aria_crypt_ecb( ctx, input, output );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000670
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100671 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000672 output[i] = (unsigned char)( output[i] ^ iv[i] );
673
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100674 memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000675
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100676 input += MBEDTLS_ARIA_BLOCKSIZE;
677 output += MBEDTLS_ARIA_BLOCKSIZE;
678 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000679 }
680 }
681 else
682 {
683 while( length > 0 )
684 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100685 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000686 output[i] = (unsigned char)( input[i] ^ iv[i] );
687
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200688 mbedtls_aria_crypt_ecb( ctx, output, output );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100689 memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000690
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100691 input += MBEDTLS_ARIA_BLOCKSIZE;
692 output += MBEDTLS_ARIA_BLOCKSIZE;
693 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000694 }
695 }
696
697 return( 0 );
698}
699#endif /* MBEDTLS_CIPHER_MODE_CBC */
700
701#if defined(MBEDTLS_CIPHER_MODE_CFB)
702/*
703 * ARIA-CFB128 buffer encryption/decryption
704 */
705int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100706 int mode,
707 size_t length,
708 size_t *iv_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100709 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100710 const unsigned char *input,
711 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000712{
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200713 unsigned char c;
Hanno Beckerb54ae0b2018-12-11 21:51:32 +0000714 size_t n;
715
716 ARIA_VALIDATE_RET( ctx != NULL );
717 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
718 mode == MBEDTLS_ARIA_DECRYPT );
719 ARIA_VALIDATE_RET( length == 0 || input != NULL );
720 ARIA_VALIDATE_RET( length == 0 || output != NULL );
721 ARIA_VALIDATE_RET( iv != NULL );
722 ARIA_VALIDATE_RET( iv_off != NULL );
723
724 n = *iv_off;
725
726 /* An overly large value of n can lead to an unlimited
727 * buffer overflow. Therefore, guard against this
728 * outside of parameter validation. */
729 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
730 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000731
732 if( mode == MBEDTLS_ARIA_DECRYPT )
733 {
734 while( length-- )
735 {
736 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200737 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000738
739 c = *input++;
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200740 *output++ = c ^ iv[n];
741 iv[n] = c;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000742
743 n = ( n + 1 ) & 0x0F;
744 }
745 }
746 else
747 {
748 while( length-- )
749 {
750 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200751 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000752
753 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
754
755 n = ( n + 1 ) & 0x0F;
756 }
757 }
758
759 *iv_off = n;
760
761 return( 0 );
762}
763#endif /* MBEDTLS_CIPHER_MODE_CFB */
764
765#if defined(MBEDTLS_CIPHER_MODE_CTR)
766/*
767 * ARIA-CTR buffer encryption/decryption
768 */
769int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100770 size_t length,
771 size_t *nc_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100772 unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
773 unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100774 const unsigned char *input,
775 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000776{
777 int c, i;
Hanno Beckerb54ae0b2018-12-11 21:51:32 +0000778 size_t n;
779
780 ARIA_VALIDATE_RET( ctx != NULL );
781 ARIA_VALIDATE_RET( length == 0 || input != NULL );
782 ARIA_VALIDATE_RET( length == 0 || output != NULL );
783 ARIA_VALIDATE_RET( nonce_counter != NULL );
784 ARIA_VALIDATE_RET( stream_block != NULL );
785 ARIA_VALIDATE_RET( nc_off != NULL );
786
787 n = *nc_off;
788 /* An overly large value of n can lead to an unlimited
789 * buffer overflow. Therefore, guard against this
790 * outside of parameter validation. */
791 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
792 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000793
794 while( length-- )
795 {
796 if( n == 0 ) {
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200797 mbedtls_aria_crypt_ecb( ctx, nonce_counter,
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000798 stream_block );
799
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100800 for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000801 if( ++nonce_counter[i - 1] != 0 )
802 break;
803 }
804 c = *input++;
805 *output++ = (unsigned char)( c ^ stream_block[n] );
806
807 n = ( n + 1 ) & 0x0F;
808 }
809
810 *nc_off = n;
811
812 return( 0 );
813}
814#endif /* MBEDTLS_CIPHER_MODE_CTR */
815#endif /* !MBEDTLS_ARIA_ALT */
816
817#if defined(MBEDTLS_SELF_TEST)
818
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100819/*
820 * Basic ARIA ECB test vectors from RFC 5794
821 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000822static const uint8_t aria_test1_ecb_key[32] = // test key
823{
824 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
825 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
826 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
827 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
828};
829
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100830static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000831{
832 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
833 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
834};
835
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100836static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000837{
838 { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
839 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
840 { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
841 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
842 { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
843 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
844};
845
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100846/*
847 * Mode tests from "Test Vectors for ARIA" Version 1.0
848 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
849 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000850#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000851 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000852static const uint8_t aria_test2_key[32] =
853{
854 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
855 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
856 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
857 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
858};
859
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000860static const uint8_t aria_test2_pt[48] =
861{
862 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
863 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
864 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
865 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
866 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
867 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
868};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000869#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000870
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000871#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100872static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000873{
874 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
875 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
876};
877#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000878
879#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100880static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000881{
882 { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
883 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
884 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
885 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
886 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
887 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
888 { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
889 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
890 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
891 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
892 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
893 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
894 { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
895 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
896 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
897 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
898 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
899 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
900};
901#endif /* MBEDTLS_CIPHER_MODE_CBC */
902
903#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100904static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000905{
906 { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
907 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
908 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
909 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
910 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
911 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
912 { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
913 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
914 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
915 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
916 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
917 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
918 { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
919 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
920 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
921 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
922 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
923 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
924};
925#endif /* MBEDTLS_CIPHER_MODE_CFB */
926
927#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100928static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000929{
930 { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
931 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
932 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
933 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
934 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
935 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
936 { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
937 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
938 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
939 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
940 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
941 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
942 { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
943 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
944 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
945 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
946 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
947 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
948};
949#endif /* MBEDTLS_CIPHER_MODE_CFB */
950
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000951#define ARIA_SELF_TEST_IF_FAIL \
952 { \
953 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300954 mbedtls_printf( "failed\n" ); \
Gilles Peskineba93f592021-05-25 09:17:22 +0200955 goto exit; \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000956 } else { \
957 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300958 mbedtls_printf( "passed\n" ); \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000959 }
960
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100961/*
962 * Checkup routine
963 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000964int mbedtls_aria_self_test( int verbose )
965{
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000966 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100967 uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000968 mbedtls_aria_context ctx;
Gilles Peskineba93f592021-05-25 09:17:22 +0200969 int ret = 1;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000970
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000971#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
972 size_t j;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000973#endif
974
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000975#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
976 defined(MBEDTLS_CIPHER_MODE_CFB) || \
977 defined(MBEDTLS_CIPHER_MODE_CTR))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100978 uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000979#endif
980
Gilles Peskineba93f592021-05-25 09:17:22 +0200981 mbedtls_aria_init( &ctx );
982
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100983 /*
984 * Test set 1
985 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000986 for( i = 0; i < 3; i++ )
987 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100988 /* test ECB encryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000989 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300990 mbedtls_printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000991 mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200992 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_pt, blk );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100993 if( memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000994 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000995
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100996 /* test ECB decryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000997 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300998 mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000999 mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +02001000 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001001 if( memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001002 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001003 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001004 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001005 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001006
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001007 /*
1008 * Test set 2
1009 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001010#if defined(MBEDTLS_CIPHER_MODE_CBC)
1011 for( i = 0; i < 3; i++ )
1012 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001013 /* Test CBC encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001014 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001015 mbedtls_printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001016 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001017 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001018 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001019 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
1020 aria_test2_pt, buf );
1021 if( memcmp( buf, aria_test2_cbc_ct[i], 48 ) != 0 )
1022 ARIA_SELF_TEST_IF_FAIL;
1023
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001024 /* Test CBC decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001025 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001026 mbedtls_printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001027 mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001028 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001029 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001030 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
1031 aria_test2_cbc_ct[i], buf );
1032 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1033 ARIA_SELF_TEST_IF_FAIL;
1034 }
1035 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001036 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001037
1038#endif /* MBEDTLS_CIPHER_MODE_CBC */
1039
1040#if defined(MBEDTLS_CIPHER_MODE_CFB)
1041 for( i = 0; i < 3; i++ )
1042 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001043 /* Test CFB encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001044 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001045 mbedtls_printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001046 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001047 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001048 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001049 j = 0;
1050 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
1051 aria_test2_pt, buf );
1052 if( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 )
1053 ARIA_SELF_TEST_IF_FAIL;
1054
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001055 /* Test CFB decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001056 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001057 mbedtls_printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001058 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001059 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001060 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001061 j = 0;
1062 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
1063 iv, aria_test2_cfb_ct[i], buf );
1064 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1065 ARIA_SELF_TEST_IF_FAIL;
1066 }
1067 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001068 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001069#endif /* MBEDTLS_CIPHER_MODE_CFB */
1070
1071#if defined(MBEDTLS_CIPHER_MODE_CTR)
1072 for( i = 0; i < 3; i++ )
1073 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001074 /* Test CTR encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001075 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001076 mbedtls_printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001077 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001078 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001079 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001080 j = 0;
1081 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1082 aria_test2_pt, buf );
1083 if( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 )
1084 ARIA_SELF_TEST_IF_FAIL;
1085
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001086 /* Test CTR decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001087 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001088 mbedtls_printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001089 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001090 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001091 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001092 j = 0;
1093 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1094 aria_test2_ctr_ct[i], buf );
1095 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1096 ARIA_SELF_TEST_IF_FAIL;
1097 }
1098 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001099 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001100#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001101
Gilles Peskineba93f592021-05-25 09:17:22 +02001102 ret = 0;
1103
1104exit:
1105 mbedtls_aria_free( &ctx );
1106 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001107}
1108
1109#endif /* MBEDTLS_SELF_TEST */
1110
1111#endif /* MBEDTLS_ARIA_C */