blob: 107be27cf378cde784a10405911091c7ec8ba887 [file] [log] [blame]
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001/*
2 * ARIA implementation
3 *
4 * Copyright (C) 2006-2017, ARM Limited, All Rights Reserved
5 * 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.
18 *
19 * This file is part of mbed TLS (https://tls.mbed.org)
20 */
21
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +010022/*
23 * This implementation is based on the following standards:
24 * [1] http://210.104.33.10/ARIA/doc/ARIA-specification-e.pdf
25 * [2] https://tools.ietf.org/html/rfc5794
26 */
27
Gilles Peskinedb09ef62020-06-03 01:43:33 +020028#include "common.h"
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000029
30#if defined(MBEDTLS_ARIA_C)
31
32#include "mbedtls/aria.h"
33
34#include <string.h>
35
36#if defined(MBEDTLS_SELF_TEST)
37#if defined(MBEDTLS_PLATFORM_C)
38#include "mbedtls/platform.h"
39#else
40#include <stdio.h>
41#define mbedtls_printf printf
42#endif /* MBEDTLS_PLATFORM_C */
43#endif /* MBEDTLS_SELF_TEST */
44
45#if !defined(MBEDTLS_ARIA_ALT)
46
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +020047#include "mbedtls/platform_util.h"
48
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +010049#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
50 !defined(inline) && !defined(__cplusplus)
51#define inline __inline
52#endif
53
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050054/* Parameter validation macros */
55#define ARIA_VALIDATE_RET( cond ) \
56 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ARIA_BAD_INPUT_DATA )
57#define ARIA_VALIDATE( cond ) \
58 MBEDTLS_INTERNAL_VALIDATE( cond )
59
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010060/*
61 * 32-bit integer manipulation macros (little endian)
62 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000063#ifndef GET_UINT32_LE
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +010064#define GET_UINT32_LE( n, b, i ) \
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000065{ \
66 (n) = ( (uint32_t) (b)[(i) ] ) \
67 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
68 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
69 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
70}
71#endif
72
73#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +010074#define PUT_UINT32_LE( n, b, i ) \
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000075{ \
76 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
77 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
78 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
79 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
80}
81#endif
82
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010083/*
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +010084 * 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 +010085 *
86 * This is submatrix P1 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010087 *
88 * Common compilers fail to translate this to minimal number of instructions,
89 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010090 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010091#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010092#if defined(__arm__) /* rev16 available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010093/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
94#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010095 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
96 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010097static inline uint32_t aria_p1( uint32_t x )
98{
99 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100100 __asm( "rev16 %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100101 return( r );
102}
103#define ARIA_P1 aria_p1
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100104#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
105 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100106static inline uint32_t aria_p1( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100107{
108 uint32_t r;
109 __asm( "rev16 r, x" );
110 return( r );
111}
112#define ARIA_P1 aria_p1
113#endif
114#endif /* arm */
115#if defined(__GNUC__) && \
116 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnard2df4bfe2018-05-22 13:39:01 +0200117/* I couldn't find an Intel equivalent of rev16, so two instructions */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100118#define ARIA_P1(x) ARIA_P2( ARIA_P3( x ) )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100119#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100120#endif /* MBEDTLS_HAVE_ASM && GNUC */
121#if !defined(ARIA_P1)
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100122#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100123#endif
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000124
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100125/*
126 * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits
127 *
128 * This is submatrix P2 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100129 *
130 * Common compilers will translate this to a single instruction.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100131 */
132#define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16))
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000133
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100134/*
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100135 * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness
136 *
137 * This is submatrix P3 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100138 *
139 * Some compilers fail to translate this to a single instruction,
140 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100141 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100142#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100143#if defined(__arm__) /* rev available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100144/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
145#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100146 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
147 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100148static inline uint32_t aria_p3( uint32_t x )
149{
150 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100151 __asm( "rev %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100152 return( r );
153}
154#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100155#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
156 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100157static inline uint32_t aria_p3( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100158{
159 uint32_t r;
160 __asm( "rev r, x" );
161 return( r );
162}
163#define ARIA_P3 aria_p3
164#endif
165#endif /* arm */
166#if defined(__GNUC__) && \
167 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100168static inline uint32_t aria_p3( uint32_t x )
169{
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100170 __asm( "bswap %0" : "=r" (x) : "0" (x) );
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100171 return( x );
172}
173#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100174#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100175#endif /* MBEDTLS_HAVE_ASM && GNUC */
176#if !defined(ARIA_P3)
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100177#define ARIA_P3(x) ARIA_P2( ARIA_P1 ( x ) )
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100178#endif
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100179
180/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100181 * ARIA Affine Transform
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100182 * (a, b, c, d) = state in/out
183 *
Manuel Pégourié-Gonnardd418b0d2018-05-22 12:56:11 +0200184 * If we denote the first byte of input by 0, ..., the last byte by f,
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100185 * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef.
186 *
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100187 * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100188 * rearrangements on adjacent pairs, output is:
189 *
190 * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe
191 * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100192 * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100193 * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100194 * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100195 * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100196 * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100197 * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef
198 *
199 * Note: another presentation of the A transform can be found as the first
200 * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4.
201 * The implementation below uses only P1 and P2 as they are sufficient.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100202 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100203static inline void aria_a( uint32_t *a, uint32_t *b,
204 uint32_t *c, uint32_t *d )
205{
206 uint32_t ta, tb, tc;
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100207 ta = *b; // 4567
208 *b = *a; // 0123
209 *a = ARIA_P2( ta ); // 6745
210 tb = ARIA_P2( *d ); // efcd
211 *d = ARIA_P1( *c ); // 98ba
212 *c = ARIA_P1( tb ); // fedc
213 ta ^= *d; // 4567+98ba
214 tc = ARIA_P2( *b ); // 2301
215 ta = ARIA_P1( ta ) ^ tc ^ *c; // 2301+5476+89ab+fedc
216 tb ^= ARIA_P2( *d ); // ba98+efcd
217 tc ^= ARIA_P1( *a ); // 2301+7654
218 *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT
219 tb = ARIA_P2( tb ) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc
220 *a ^= ARIA_P1( tb ); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT
221 ta = ARIA_P2( ta ); // 0123+7654+ab89+dcfe
222 *d ^= ARIA_P1( ta ) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT
223 tc = ARIA_P2( tc ); // 0123+5476
224 *c ^= ARIA_P1( tc ) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000225}
226
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100227/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100228 * ARIA Substitution Layer SL1 / SL2
229 * (a, b, c, d) = state in/out
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100230 * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100231 *
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100232 * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1
233 * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100234 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100235static inline void aria_sl( uint32_t *a, uint32_t *b,
236 uint32_t *c, uint32_t *d,
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200237 const uint8_t sa[256], const uint8_t sb[256],
238 const uint8_t sc[256], const uint8_t sd[256] )
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100239{
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100240 *a = ( (uint32_t) sa[ *a & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100241 (((uint32_t) sb[(*a >> 8) & 0xFF]) << 8) ^
242 (((uint32_t) sc[(*a >> 16) & 0xFF]) << 16) ^
243 (((uint32_t) sd[ *a >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100244 *b = ( (uint32_t) sa[ *b & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100245 (((uint32_t) sb[(*b >> 8) & 0xFF]) << 8) ^
246 (((uint32_t) sc[(*b >> 16) & 0xFF]) << 16) ^
247 (((uint32_t) sd[ *b >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100248 *c = ( (uint32_t) sa[ *c & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100249 (((uint32_t) sb[(*c >> 8) & 0xFF]) << 8) ^
250 (((uint32_t) sc[(*c >> 16) & 0xFF]) << 16) ^
251 (((uint32_t) sd[ *c >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100252 *d = ( (uint32_t) sa[ *d & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100253 (((uint32_t) sb[(*d >> 8) & 0xFF]) << 8) ^
254 (((uint32_t) sc[(*d >> 16) & 0xFF]) << 16) ^
255 (((uint32_t) sd[ *d >> 24 ]) << 24);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000256}
257
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100258/*
259 * S-Boxes
260 */
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200261static const uint8_t aria_sb1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000262{
263 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
264 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
265 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
266 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
267 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
268 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
269 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
270 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
271 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
272 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
273 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
274 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
275 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
276 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
277 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
278 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
279 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
280 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
281 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
282 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
283 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
284 0xB0, 0x54, 0xBB, 0x16
285};
286
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200287static const uint8_t aria_sb2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000288{
289 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46,
290 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B,
291 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B,
292 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB,
293 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA,
294 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91,
295 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38,
296 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53,
297 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74,
298 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26,
299 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD,
300 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC,
301 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E,
302 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A,
303 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5,
304 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8,
305 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24,
306 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F,
307 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
308 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D,
309 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A,
310 0xAF, 0xBA, 0xB5, 0x81
311};
312
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200313static const uint8_t aria_is1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000314{
315 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
316 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
317 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
318 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
319 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
320 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
321 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
322 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
323 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
324 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
325 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
326 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
327 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
328 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
329 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
330 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
331 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
332 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
333 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
334 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
335 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
336 0x55, 0x21, 0x0C, 0x7D
337};
338
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200339static const uint8_t aria_is2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000340{
341 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1,
342 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3,
343 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89,
344 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D,
345 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98,
346 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58,
347 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F,
348 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE,
349 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23,
350 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19,
351 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55,
352 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A,
353 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE,
354 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0,
355 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6,
356 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5,
357 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13,
358 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73,
359 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
360 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3,
361 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33,
362 0x03, 0xA2, 0xAC, 0x60
363};
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000364
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100365/*
366 * Helper for key schedule: r = FO( p, k ) ^ x
367 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100368static void aria_fo_xor( uint32_t r[4], const uint32_t p[4],
369 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000370{
371 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000372
373 a = p[0] ^ k[0];
374 b = p[1] ^ k[1];
375 c = p[2] ^ k[2];
376 d = p[3] ^ k[3];
377
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100378 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
379 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000380
381 r[0] = a ^ x[0];
382 r[1] = b ^ x[1];
383 r[2] = c ^ x[2];
384 r[3] = d ^ x[3];
385}
386
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100387/*
388 * Helper for key schedule: r = FE( p, k ) ^ x
389 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100390static void aria_fe_xor( uint32_t r[4], const uint32_t p[4],
391 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000392{
393 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000394
395 a = p[0] ^ k[0];
396 b = p[1] ^ k[1];
397 c = p[2] ^ k[2];
398 d = p[3] ^ k[3];
399
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100400 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
401 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000402
403 r[0] = a ^ x[0];
404 r[1] = b ^ x[1];
405 r[2] = c ^ x[2];
406 r[3] = d ^ x[3];
407}
408
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100409/*
410 * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup.
411 *
412 * We chose to store bytes into 32-bit words in little-endian format (see
413 * GET/PUT_UINT32_LE) so we need to reverse bytes here.
414 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100415static void aria_rot128( uint32_t r[4], const uint32_t a[4],
416 const uint32_t b[4], uint8_t n )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000417{
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100418 uint8_t i, j;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000419 uint32_t t, u;
420
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100421 const uint8_t n1 = n % 32; // bit offset
422 const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100423
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200424 j = ( n / 32 ) % 4; // initial word offset
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100425 t = ARIA_P3( b[j] ); // big endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000426 for( i = 0; i < 4; i++ )
427 {
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200428 j = ( j + 1 ) % 4; // get next word, big endian
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100429 u = ARIA_P3( b[j] );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000430 t <<= n1; // rotate
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100431 t |= u >> n2;
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100432 t = ARIA_P3( t ); // back to little endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000433 r[i] = a[i] ^ t; // store
434 t = u; // move to next word
435 }
436}
437
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100438/*
439 * Set encryption key
440 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100441int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx,
442 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000443{
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100444 /* round constant masks */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000445 const uint32_t rc[3][4] =
446 {
447 { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
448 { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
449 { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
450 };
451
452 int i;
453 uint32_t w[4][4], *w2;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500454 ARIA_VALIDATE_RET( ctx != NULL );
455 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000456
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100457 if( keybits != 128 && keybits != 192 && keybits != 256 )
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500458 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000459
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100460 /* Copy key to W0 (and potential remainder to W1) */
461 GET_UINT32_LE( w[0][0], key, 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000462 GET_UINT32_LE( w[0][1], key, 4 );
463 GET_UINT32_LE( w[0][2], key, 8 );
464 GET_UINT32_LE( w[0][3], key, 12 );
465
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100466 memset( w[1], 0, 16 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000467 if( keybits >= 192 )
468 {
469 GET_UINT32_LE( w[1][0], key, 16 ); // 192 bit key
470 GET_UINT32_LE( w[1][1], key, 20 );
471 }
472 if( keybits == 256 )
473 {
474 GET_UINT32_LE( w[1][2], key, 24 ); // 256 bit key
475 GET_UINT32_LE( w[1][3], key, 28 );
476 }
477
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200478 i = ( keybits - 128 ) >> 6; // index: 0, 1, 2
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000479 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
480
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100481 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 +0000482 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100483 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 +0000484 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100485 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 +0000486
487 for( i = 0; i < 4; i++ ) // create round keys
488 {
489 w2 = w[(i + 1) & 3];
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100490 aria_rot128( ctx->rk[i ], w[i], w2, 128 - 19 );
491 aria_rot128( ctx->rk[i + 4], w[i], w2, 128 - 31 );
492 aria_rot128( ctx->rk[i + 8], w[i], w2, 61 );
493 aria_rot128( ctx->rk[i + 12], w[i], w2, 31 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000494 }
495 aria_rot128( ctx->rk[16], w[0], w[1], 19 );
496
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200497 /* w holds enough info to reconstruct the round keys */
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200498 mbedtls_platform_zeroize( w, sizeof( w ) );
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200499
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100500 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000501}
502
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100503/*
504 * Set decryption key
505 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100506int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx,
507 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000508{
509 int i, j, k, ret;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500510 ARIA_VALIDATE_RET( ctx != NULL );
511 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000512
513 ret = mbedtls_aria_setkey_enc( ctx, key, keybits );
514 if( ret != 0 )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100515 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000516
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100517 /* flip the order of round keys */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000518 for( i = 0, j = ctx->nr; i < j; i++, j-- )
519 {
520 for( k = 0; k < 4; k++ )
521 {
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100522 uint32_t t = ctx->rk[i][k];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000523 ctx->rk[i][k] = ctx->rk[j][k];
524 ctx->rk[j][k] = t;
525 }
526 }
527
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100528 /* apply affine transform to middle keys */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100529 for( i = 1; i < ctx->nr; i++ )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100530 {
531 aria_a( &ctx->rk[i][0], &ctx->rk[i][1],
532 &ctx->rk[i][2], &ctx->rk[i][3] );
533 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000534
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100535 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000536}
537
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100538/*
539 * Encrypt a block
540 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000541int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100542 const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
543 unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000544{
545 int i;
546
547 uint32_t a, b, c, d;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500548 ARIA_VALIDATE_RET( ctx != NULL );
549 ARIA_VALIDATE_RET( input != NULL );
550 ARIA_VALIDATE_RET( output != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000551
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000552 GET_UINT32_LE( a, input, 0 );
553 GET_UINT32_LE( b, input, 4 );
554 GET_UINT32_LE( c, input, 8 );
555 GET_UINT32_LE( d, input, 12 );
556
557 i = 0;
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100558 while( 1 )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000559 {
560 a ^= ctx->rk[i][0];
561 b ^= ctx->rk[i][1];
562 c ^= ctx->rk[i][2];
563 d ^= ctx->rk[i][3];
564 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100565
566 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
567 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000568
569 a ^= ctx->rk[i][0];
570 b ^= ctx->rk[i][1];
571 c ^= ctx->rk[i][2];
572 d ^= ctx->rk[i][3];
573 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100574
575 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100576 if( i >= ctx->nr )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000577 break;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100578 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000579 }
580
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100581 /* final key mixing */
582 a ^= ctx->rk[i][0];
583 b ^= ctx->rk[i][1];
584 c ^= ctx->rk[i][2];
585 d ^= ctx->rk[i][3];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000586
587 PUT_UINT32_LE( a, output, 0 );
588 PUT_UINT32_LE( b, output, 4 );
589 PUT_UINT32_LE( c, output, 8 );
590 PUT_UINT32_LE( d, output, 12 );
591
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100592 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000593}
594
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100595/* Initialize context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000596void mbedtls_aria_init( mbedtls_aria_context *ctx )
597{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500598 ARIA_VALIDATE( ctx != NULL );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000599 memset( ctx, 0, sizeof( mbedtls_aria_context ) );
600}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000601
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100602/* Clear context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000603void mbedtls_aria_free( mbedtls_aria_context *ctx )
604{
605 if( ctx == NULL )
606 return;
607
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200608 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aria_context ) );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000609}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000610
611#if defined(MBEDTLS_CIPHER_MODE_CBC)
612/*
613 * ARIA-CBC buffer encryption/decryption
614 */
615int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100616 int mode,
617 size_t length,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100618 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100619 const unsigned char *input,
620 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000621{
622 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100623 unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000624
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500625 ARIA_VALIDATE_RET( ctx != NULL );
626 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
627 mode == MBEDTLS_ARIA_DECRYPT );
628 ARIA_VALIDATE_RET( length == 0 || input != NULL );
629 ARIA_VALIDATE_RET( length == 0 || output != NULL );
630 ARIA_VALIDATE_RET( iv != NULL );
631
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100632 if( length % MBEDTLS_ARIA_BLOCKSIZE )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000633 return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH );
634
635 if( mode == MBEDTLS_ARIA_DECRYPT )
636 {
637 while( length > 0 )
638 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100639 memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200640 mbedtls_aria_crypt_ecb( ctx, input, output );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000641
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100642 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000643 output[i] = (unsigned char)( output[i] ^ iv[i] );
644
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100645 memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000646
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100647 input += MBEDTLS_ARIA_BLOCKSIZE;
648 output += MBEDTLS_ARIA_BLOCKSIZE;
649 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000650 }
651 }
652 else
653 {
654 while( length > 0 )
655 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100656 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000657 output[i] = (unsigned char)( input[i] ^ iv[i] );
658
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200659 mbedtls_aria_crypt_ecb( ctx, output, output );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100660 memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000661
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100662 input += MBEDTLS_ARIA_BLOCKSIZE;
663 output += MBEDTLS_ARIA_BLOCKSIZE;
664 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000665 }
666 }
667
668 return( 0 );
669}
670#endif /* MBEDTLS_CIPHER_MODE_CBC */
671
672#if defined(MBEDTLS_CIPHER_MODE_CFB)
673/*
674 * ARIA-CFB128 buffer encryption/decryption
675 */
676int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100677 int mode,
678 size_t length,
679 size_t *iv_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100680 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100681 const unsigned char *input,
682 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000683{
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200684 unsigned char c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500685 size_t n;
686
687 ARIA_VALIDATE_RET( ctx != NULL );
688 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
689 mode == MBEDTLS_ARIA_DECRYPT );
690 ARIA_VALIDATE_RET( length == 0 || input != NULL );
691 ARIA_VALIDATE_RET( length == 0 || output != NULL );
692 ARIA_VALIDATE_RET( iv != NULL );
693 ARIA_VALIDATE_RET( iv_off != NULL );
694
695 n = *iv_off;
696
697 /* An overly large value of n can lead to an unlimited
698 * buffer overflow. Therefore, guard against this
699 * outside of parameter validation. */
700 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
701 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000702
703 if( mode == MBEDTLS_ARIA_DECRYPT )
704 {
705 while( length-- )
706 {
707 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200708 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000709
710 c = *input++;
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200711 *output++ = c ^ iv[n];
712 iv[n] = c;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000713
714 n = ( n + 1 ) & 0x0F;
715 }
716 }
717 else
718 {
719 while( length-- )
720 {
721 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200722 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000723
724 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
725
726 n = ( n + 1 ) & 0x0F;
727 }
728 }
729
730 *iv_off = n;
731
732 return( 0 );
733}
734#endif /* MBEDTLS_CIPHER_MODE_CFB */
735
736#if defined(MBEDTLS_CIPHER_MODE_CTR)
737/*
738 * ARIA-CTR buffer encryption/decryption
739 */
740int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100741 size_t length,
742 size_t *nc_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100743 unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
744 unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100745 const unsigned char *input,
746 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000747{
748 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500749 size_t n;
750
751 ARIA_VALIDATE_RET( ctx != NULL );
752 ARIA_VALIDATE_RET( length == 0 || input != NULL );
753 ARIA_VALIDATE_RET( length == 0 || output != NULL );
754 ARIA_VALIDATE_RET( nonce_counter != NULL );
755 ARIA_VALIDATE_RET( stream_block != NULL );
756 ARIA_VALIDATE_RET( nc_off != NULL );
757
758 n = *nc_off;
759 /* An overly large value of n can lead to an unlimited
760 * buffer overflow. Therefore, guard against this
761 * outside of parameter validation. */
762 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
763 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000764
765 while( length-- )
766 {
767 if( n == 0 ) {
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200768 mbedtls_aria_crypt_ecb( ctx, nonce_counter,
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000769 stream_block );
770
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100771 for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000772 if( ++nonce_counter[i - 1] != 0 )
773 break;
774 }
775 c = *input++;
776 *output++ = (unsigned char)( c ^ stream_block[n] );
777
778 n = ( n + 1 ) & 0x0F;
779 }
780
781 *nc_off = n;
782
783 return( 0 );
784}
785#endif /* MBEDTLS_CIPHER_MODE_CTR */
786#endif /* !MBEDTLS_ARIA_ALT */
787
788#if defined(MBEDTLS_SELF_TEST)
789
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100790/*
791 * Basic ARIA ECB test vectors from RFC 5794
792 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000793static const uint8_t aria_test1_ecb_key[32] = // test key
794{
795 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
796 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
797 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
798 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
799};
800
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100801static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000802{
803 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
804 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
805};
806
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100807static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000808{
809 { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
810 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
811 { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
812 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
813 { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
814 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
815};
816
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100817/*
818 * Mode tests from "Test Vectors for ARIA" Version 1.0
819 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
820 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000821#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000822 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000823static const uint8_t aria_test2_key[32] =
824{
825 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
826 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
827 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
828 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
829};
830
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000831static const uint8_t aria_test2_pt[48] =
832{
833 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
834 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
835 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
836 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
837 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
838 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
839};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000840#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000841
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000842#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100843static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000844{
845 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
846 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
847};
848#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000849
850#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100851static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000852{
853 { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
854 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
855 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
856 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
857 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
858 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
859 { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
860 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
861 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
862 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
863 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
864 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
865 { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
866 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
867 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
868 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
869 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
870 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
871};
872#endif /* MBEDTLS_CIPHER_MODE_CBC */
873
874#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100875static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000876{
877 { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
878 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
879 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
880 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
881 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
882 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
883 { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
884 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
885 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
886 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
887 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
888 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
889 { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
890 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
891 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
892 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
893 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
894 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
895};
896#endif /* MBEDTLS_CIPHER_MODE_CFB */
897
898#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100899static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000900{
901 { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
902 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
903 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
904 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
905 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
906 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
907 { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
908 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
909 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
910 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
911 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
912 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
913 { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
914 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
915 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
916 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
917 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
918 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
919};
920#endif /* MBEDTLS_CIPHER_MODE_CFB */
921
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000922#define ARIA_SELF_TEST_IF_FAIL \
923 { \
924 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300925 mbedtls_printf( "failed\n" ); \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000926 return( 1 ); \
927 } else { \
928 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300929 mbedtls_printf( "passed\n" ); \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000930 }
931
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100932/*
933 * Checkup routine
934 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000935int mbedtls_aria_self_test( int verbose )
936{
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000937 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100938 uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000939 mbedtls_aria_context ctx;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000940
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000941#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
942 size_t j;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000943#endif
944
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000945#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
946 defined(MBEDTLS_CIPHER_MODE_CFB) || \
947 defined(MBEDTLS_CIPHER_MODE_CTR))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100948 uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000949#endif
950
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100951 /*
952 * Test set 1
953 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000954 for( i = 0; i < 3; i++ )
955 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100956 /* test ECB encryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000957 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300958 mbedtls_printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000959 mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200960 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_pt, blk );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100961 if( memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000962 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000963
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100964 /* test ECB decryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000965 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300966 mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000967 mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200968 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100969 if( memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000970 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000971 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000972 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300973 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000974
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100975 /*
976 * Test set 2
977 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000978#if defined(MBEDTLS_CIPHER_MODE_CBC)
979 for( i = 0; i < 3; i++ )
980 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100981 /* Test CBC encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000982 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300983 mbedtls_printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000984 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100985 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100986 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000987 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
988 aria_test2_pt, buf );
989 if( memcmp( buf, aria_test2_cbc_ct[i], 48 ) != 0 )
990 ARIA_SELF_TEST_IF_FAIL;
991
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100992 /* Test CBC decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000993 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300994 mbedtls_printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000995 mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100996 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100997 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000998 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
999 aria_test2_cbc_ct[i], buf );
1000 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1001 ARIA_SELF_TEST_IF_FAIL;
1002 }
1003 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001004 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001005
1006#endif /* MBEDTLS_CIPHER_MODE_CBC */
1007
1008#if defined(MBEDTLS_CIPHER_MODE_CFB)
1009 for( i = 0; i < 3; i++ )
1010 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001011 /* Test CFB encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001012 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001013 mbedtls_printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001014 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001015 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001016 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001017 j = 0;
1018 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
1019 aria_test2_pt, buf );
1020 if( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 )
1021 ARIA_SELF_TEST_IF_FAIL;
1022
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001023 /* Test CFB decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001024 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001025 mbedtls_printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001026 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001027 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001028 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001029 j = 0;
1030 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
1031 iv, aria_test2_cfb_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#endif /* MBEDTLS_CIPHER_MODE_CFB */
1038
1039#if defined(MBEDTLS_CIPHER_MODE_CTR)
1040 for( i = 0; i < 3; i++ )
1041 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001042 /* Test CTR encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001043 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001044 mbedtls_printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001045 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001046 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001047 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001048 j = 0;
1049 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1050 aria_test2_pt, buf );
1051 if( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 )
1052 ARIA_SELF_TEST_IF_FAIL;
1053
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001054 /* Test CTR decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001055 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001056 mbedtls_printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001057 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001058 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001059 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001060 j = 0;
1061 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1062 aria_test2_ctr_ct[i], buf );
1063 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1064 ARIA_SELF_TEST_IF_FAIL;
1065 }
1066 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001067 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001068#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001069
1070 return( 0 );
1071}
1072
1073#endif /* MBEDTLS_SELF_TEST */
1074
1075#endif /* MBEDTLS_ARIA_C */