blob: aff66d667f1dc172d988691dfddeaaf74791bc35 [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
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000028#if !defined(MBEDTLS_CONFIG_FILE)
29#include "mbedtls/config.h"
30#else
31#include MBEDTLS_CONFIG_FILE
32#endif
33
34#if defined(MBEDTLS_ARIA_C)
35
36#include "mbedtls/aria.h"
37
38#include <string.h>
39
40#if defined(MBEDTLS_SELF_TEST)
41#if defined(MBEDTLS_PLATFORM_C)
42#include "mbedtls/platform.h"
43#else
44#include <stdio.h>
45#define mbedtls_printf printf
46#endif /* MBEDTLS_PLATFORM_C */
47#endif /* MBEDTLS_SELF_TEST */
48
49#if !defined(MBEDTLS_ARIA_ALT)
50
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +020051#include "mbedtls/platform_util.h"
52
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +010053#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
54 !defined(inline) && !defined(__cplusplus)
55#define inline __inline
56#endif
57
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050058/* Parameter validation macros */
59#define ARIA_VALIDATE_RET( cond ) \
60 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ARIA_BAD_INPUT_DATA )
61#define ARIA_VALIDATE( cond ) \
62 MBEDTLS_INTERNAL_VALIDATE( cond )
63
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010064/*
65 * 32-bit integer manipulation macros (little endian)
66 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000067#ifndef GET_UINT32_LE
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +010068#define GET_UINT32_LE( n, b, i ) \
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000069{ \
70 (n) = ( (uint32_t) (b)[(i) ] ) \
71 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
72 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
73 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
74}
75#endif
76
77#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +010078#define PUT_UINT32_LE( n, b, i ) \
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000079{ \
80 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
81 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
82 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
83 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
84}
85#endif
86
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010087/*
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +010088 * 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 +010089 *
90 * This is submatrix P1 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010091 *
92 * Common compilers fail to translate this to minimal number of instructions,
93 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010094 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010095#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010096#if defined(__arm__) /* rev16 available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010097/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
98#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +010099 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
100 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100101static inline uint32_t aria_p1( uint32_t x )
102{
103 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100104 __asm( "rev16 %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100105 return( r );
106}
107#define ARIA_P1 aria_p1
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100108#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
109 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100110static inline uint32_t aria_p1( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100111{
112 uint32_t r;
113 __asm( "rev16 r, x" );
114 return( r );
115}
116#define ARIA_P1 aria_p1
117#endif
118#endif /* arm */
119#if defined(__GNUC__) && \
120 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnard2df4bfe2018-05-22 13:39:01 +0200121/* I couldn't find an Intel equivalent of rev16, so two instructions */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100122#define ARIA_P1(x) ARIA_P2( ARIA_P3( x ) )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100123#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100124#endif /* MBEDTLS_HAVE_ASM && GNUC */
125#if !defined(ARIA_P1)
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100126#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100127#endif
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000128
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100129/*
130 * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits
131 *
132 * This is submatrix P2 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100133 *
134 * Common compilers will translate this to a single instruction.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100135 */
136#define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16))
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000137
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100138/*
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100139 * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness
140 *
141 * This is submatrix P3 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100142 *
143 * Some compilers fail to translate this to a single instruction,
144 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100145 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100146#if defined(MBEDTLS_HAVE_ASM)
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100147#if defined(__arm__) /* rev available from v6 up */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100148/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
149#if defined(__GNUC__) && \
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100150 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \
151 __ARM_ARCH >= 6
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100152static inline uint32_t aria_p3( uint32_t x )
153{
154 uint32_t r;
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100155 __asm( "rev %0, %1" : "=l" (r) : "l" (x) );
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100156 return( r );
157}
158#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard20787252018-03-01 10:37:47 +0100159#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \
160 ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 )
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100161static inline uint32_t aria_p3( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100162{
163 uint32_t r;
164 __asm( "rev r, x" );
165 return( r );
166}
167#define ARIA_P3 aria_p3
168#endif
169#endif /* arm */
170#if defined(__GNUC__) && \
171 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100172static inline uint32_t aria_p3( uint32_t x )
173{
Manuel Pégourié-Gonnard21662142018-03-01 11:27:14 +0100174 __asm( "bswap %0" : "=r" (x) : "0" (x) );
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100175 return( x );
176}
177#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100178#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100179#endif /* MBEDTLS_HAVE_ASM && GNUC */
180#if !defined(ARIA_P3)
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100181#define ARIA_P3(x) ARIA_P2( ARIA_P1 ( x ) )
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100182#endif
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100183
184/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100185 * ARIA Affine Transform
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100186 * (a, b, c, d) = state in/out
187 *
Manuel Pégourié-Gonnardd418b0d2018-05-22 12:56:11 +0200188 * If we denote the first byte of input by 0, ..., the last byte by f,
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100189 * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef.
190 *
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100191 * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100192 * rearrangements on adjacent pairs, output is:
193 *
194 * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe
195 * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100196 * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100197 * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100198 * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100199 * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc
Manuel Pégourié-Gonnard366e1b02018-03-01 14:48:10 +0100200 * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100201 * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef
202 *
203 * Note: another presentation of the A transform can be found as the first
204 * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4.
205 * The implementation below uses only P1 and P2 as they are sufficient.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100206 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100207static inline void aria_a( uint32_t *a, uint32_t *b,
208 uint32_t *c, uint32_t *d )
209{
210 uint32_t ta, tb, tc;
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100211 ta = *b; // 4567
212 *b = *a; // 0123
213 *a = ARIA_P2( ta ); // 6745
214 tb = ARIA_P2( *d ); // efcd
215 *d = ARIA_P1( *c ); // 98ba
216 *c = ARIA_P1( tb ); // fedc
217 ta ^= *d; // 4567+98ba
218 tc = ARIA_P2( *b ); // 2301
219 ta = ARIA_P1( ta ) ^ tc ^ *c; // 2301+5476+89ab+fedc
220 tb ^= ARIA_P2( *d ); // ba98+efcd
221 tc ^= ARIA_P1( *a ); // 2301+7654
222 *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT
223 tb = ARIA_P2( tb ) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc
224 *a ^= ARIA_P1( tb ); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT
225 ta = ARIA_P2( ta ); // 0123+7654+ab89+dcfe
226 *d ^= ARIA_P1( ta ) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT
227 tc = ARIA_P2( tc ); // 0123+5476
228 *c ^= ARIA_P1( tc ) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000229}
230
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100231/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100232 * ARIA Substitution Layer SL1 / SL2
233 * (a, b, c, d) = state in/out
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100234 * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100235 *
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100236 * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1
237 * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100238 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100239static inline void aria_sl( uint32_t *a, uint32_t *b,
240 uint32_t *c, uint32_t *d,
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200241 const uint8_t sa[256], const uint8_t sb[256],
242 const uint8_t sc[256], const uint8_t sd[256] )
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100243{
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100244 *a = ( (uint32_t) sa[ *a & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100245 (((uint32_t) sb[(*a >> 8) & 0xFF]) << 8) ^
246 (((uint32_t) sc[(*a >> 16) & 0xFF]) << 16) ^
247 (((uint32_t) sd[ *a >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100248 *b = ( (uint32_t) sa[ *b & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100249 (((uint32_t) sb[(*b >> 8) & 0xFF]) << 8) ^
250 (((uint32_t) sc[(*b >> 16) & 0xFF]) << 16) ^
251 (((uint32_t) sd[ *b >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100252 *c = ( (uint32_t) sa[ *c & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100253 (((uint32_t) sb[(*c >> 8) & 0xFF]) << 8) ^
254 (((uint32_t) sc[(*c >> 16) & 0xFF]) << 16) ^
255 (((uint32_t) sd[ *c >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100256 *d = ( (uint32_t) sa[ *d & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100257 (((uint32_t) sb[(*d >> 8) & 0xFF]) << 8) ^
258 (((uint32_t) sc[(*d >> 16) & 0xFF]) << 16) ^
259 (((uint32_t) sd[ *d >> 24 ]) << 24);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000260}
261
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100262/*
263 * S-Boxes
264 */
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200265static const uint8_t aria_sb1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000266{
267 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
268 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
269 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
270 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
271 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
272 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
273 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
274 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
275 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
276 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
277 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
278 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
279 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
280 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
281 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
282 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
283 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
284 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
285 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
286 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
287 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
288 0xB0, 0x54, 0xBB, 0x16
289};
290
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200291static const uint8_t aria_sb2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000292{
293 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46,
294 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B,
295 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B,
296 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB,
297 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA,
298 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91,
299 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38,
300 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53,
301 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74,
302 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26,
303 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD,
304 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC,
305 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E,
306 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A,
307 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5,
308 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8,
309 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24,
310 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F,
311 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
312 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D,
313 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A,
314 0xAF, 0xBA, 0xB5, 0x81
315};
316
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200317static const uint8_t aria_is1[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000318{
319 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
320 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
321 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
322 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
323 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
324 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
325 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
326 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
327 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
328 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
329 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
330 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
331 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
332 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
333 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
334 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
335 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
336 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
337 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
338 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
339 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
340 0x55, 0x21, 0x0C, 0x7D
341};
342
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200343static const uint8_t aria_is2[256] =
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000344{
345 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1,
346 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3,
347 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89,
348 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D,
349 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98,
350 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58,
351 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F,
352 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE,
353 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23,
354 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19,
355 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55,
356 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A,
357 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE,
358 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0,
359 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6,
360 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5,
361 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13,
362 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73,
363 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
364 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3,
365 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33,
366 0x03, 0xA2, 0xAC, 0x60
367};
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000368
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100369/*
370 * Helper for key schedule: r = FO( p, k ) ^ x
371 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100372static void aria_fo_xor( uint32_t r[4], const uint32_t p[4],
373 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000374{
375 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000376
377 a = p[0] ^ k[0];
378 b = p[1] ^ k[1];
379 c = p[2] ^ k[2];
380 d = p[3] ^ k[3];
381
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100382 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
383 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000384
385 r[0] = a ^ x[0];
386 r[1] = b ^ x[1];
387 r[2] = c ^ x[2];
388 r[3] = d ^ x[3];
389}
390
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100391/*
392 * Helper for key schedule: r = FE( p, k ) ^ x
393 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100394static void aria_fe_xor( uint32_t r[4], const uint32_t p[4],
395 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000396{
397 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000398
399 a = p[0] ^ k[0];
400 b = p[1] ^ k[1];
401 c = p[2] ^ k[2];
402 d = p[3] ^ k[3];
403
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100404 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
405 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000406
407 r[0] = a ^ x[0];
408 r[1] = b ^ x[1];
409 r[2] = c ^ x[2];
410 r[3] = d ^ x[3];
411}
412
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100413/*
414 * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup.
415 *
416 * We chose to store bytes into 32-bit words in little-endian format (see
417 * GET/PUT_UINT32_LE) so we need to reverse bytes here.
418 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100419static void aria_rot128( uint32_t r[4], const uint32_t a[4],
420 const uint32_t b[4], uint8_t n )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000421{
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100422 uint8_t i, j;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000423 uint32_t t, u;
424
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100425 const uint8_t n1 = n % 32; // bit offset
426 const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100427
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200428 j = ( n / 32 ) % 4; // initial word offset
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100429 t = ARIA_P3( b[j] ); // big endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000430 for( i = 0; i < 4; i++ )
431 {
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200432 j = ( j + 1 ) % 4; // get next word, big endian
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100433 u = ARIA_P3( b[j] );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000434 t <<= n1; // rotate
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100435 t |= u >> n2;
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100436 t = ARIA_P3( t ); // back to little endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000437 r[i] = a[i] ^ t; // store
438 t = u; // move to next word
439 }
440}
441
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100442/*
443 * Set encryption key
444 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100445int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx,
446 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000447{
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100448 /* round constant masks */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000449 const uint32_t rc[3][4] =
450 {
451 { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
452 { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
453 { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
454 };
455
456 int i;
457 uint32_t w[4][4], *w2;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500458 ARIA_VALIDATE_RET( ctx != NULL );
459 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000460
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100461 if( keybits != 128 && keybits != 192 && keybits != 256 )
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500462 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000463
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100464 /* Copy key to W0 (and potential remainder to W1) */
465 GET_UINT32_LE( w[0][0], key, 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000466 GET_UINT32_LE( w[0][1], key, 4 );
467 GET_UINT32_LE( w[0][2], key, 8 );
468 GET_UINT32_LE( w[0][3], key, 12 );
469
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100470 memset( w[1], 0, 16 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000471 if( keybits >= 192 )
472 {
473 GET_UINT32_LE( w[1][0], key, 16 ); // 192 bit key
474 GET_UINT32_LE( w[1][1], key, 20 );
475 }
476 if( keybits == 256 )
477 {
478 GET_UINT32_LE( w[1][2], key, 24 ); // 256 bit key
479 GET_UINT32_LE( w[1][3], key, 28 );
480 }
481
Manuel Pégourié-Gonnard12e2fbd2018-05-22 13:01:09 +0200482 i = ( keybits - 128 ) >> 6; // index: 0, 1, 2
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000483 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
484
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100485 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 +0000486 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100487 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 +0000488 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100489 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 +0000490
491 for( i = 0; i < 4; i++ ) // create round keys
492 {
493 w2 = w[(i + 1) & 3];
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100494 aria_rot128( ctx->rk[i ], w[i], w2, 128 - 19 );
495 aria_rot128( ctx->rk[i + 4], w[i], w2, 128 - 31 );
496 aria_rot128( ctx->rk[i + 8], w[i], w2, 61 );
497 aria_rot128( ctx->rk[i + 12], w[i], w2, 31 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000498 }
499 aria_rot128( ctx->rk[16], w[0], w[1], 19 );
500
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200501 /* w holds enough info to reconstruct the round keys */
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200502 mbedtls_platform_zeroize( w, sizeof( w ) );
Manuel Pégourié-Gonnard89924dd2018-05-22 13:07:07 +0200503
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100504 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000505}
506
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100507/*
508 * Set decryption key
509 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100510int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx,
511 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000512{
513 int i, j, k, ret;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500514 ARIA_VALIDATE_RET( ctx != NULL );
515 ARIA_VALIDATE_RET( key != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000516
517 ret = mbedtls_aria_setkey_enc( ctx, key, keybits );
518 if( ret != 0 )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100519 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000520
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100521 /* flip the order of round keys */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000522 for( i = 0, j = ctx->nr; i < j; i++, j-- )
523 {
524 for( k = 0; k < 4; k++ )
525 {
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100526 uint32_t t = ctx->rk[i][k];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000527 ctx->rk[i][k] = ctx->rk[j][k];
528 ctx->rk[j][k] = t;
529 }
530 }
531
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100532 /* apply affine transform to middle keys */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100533 for( i = 1; i < ctx->nr; i++ )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100534 {
535 aria_a( &ctx->rk[i][0], &ctx->rk[i][1],
536 &ctx->rk[i][2], &ctx->rk[i][3] );
537 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000538
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100539 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000540}
541
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100542/*
543 * Encrypt a block
544 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000545int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100546 const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
547 unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000548{
549 int i;
550
551 uint32_t a, b, c, d;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500552 ARIA_VALIDATE_RET( ctx != NULL );
553 ARIA_VALIDATE_RET( input != NULL );
554 ARIA_VALIDATE_RET( output != NULL );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000555
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000556 GET_UINT32_LE( a, input, 0 );
557 GET_UINT32_LE( b, input, 4 );
558 GET_UINT32_LE( c, input, 8 );
559 GET_UINT32_LE( d, input, 12 );
560
561 i = 0;
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100562 while( 1 )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000563 {
564 a ^= ctx->rk[i][0];
565 b ^= ctx->rk[i][1];
566 c ^= ctx->rk[i][2];
567 d ^= ctx->rk[i][3];
568 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100569
570 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
571 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000572
573 a ^= ctx->rk[i][0];
574 b ^= ctx->rk[i][1];
575 c ^= ctx->rk[i][2];
576 d ^= ctx->rk[i][3];
577 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100578
579 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100580 if( i >= ctx->nr )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000581 break;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100582 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000583 }
584
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100585 /* final key mixing */
586 a ^= ctx->rk[i][0];
587 b ^= ctx->rk[i][1];
588 c ^= ctx->rk[i][2];
589 d ^= ctx->rk[i][3];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000590
591 PUT_UINT32_LE( a, output, 0 );
592 PUT_UINT32_LE( b, output, 4 );
593 PUT_UINT32_LE( c, output, 8 );
594 PUT_UINT32_LE( d, output, 12 );
595
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100596 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000597}
598
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100599/* Initialize context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000600void mbedtls_aria_init( mbedtls_aria_context *ctx )
601{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500602 ARIA_VALIDATE( ctx != NULL );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000603 memset( ctx, 0, sizeof( mbedtls_aria_context ) );
604}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000605
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100606/* Clear context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000607void mbedtls_aria_free( mbedtls_aria_context *ctx )
608{
609 if( ctx == NULL )
610 return;
611
Manuel Pégourié-Gonnard7124fb62018-05-22 16:05:33 +0200612 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aria_context ) );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000613}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000614
615#if defined(MBEDTLS_CIPHER_MODE_CBC)
616/*
617 * ARIA-CBC buffer encryption/decryption
618 */
619int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100620 int mode,
621 size_t length,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100622 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100623 const unsigned char *input,
624 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000625{
626 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100627 unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000628
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500629 ARIA_VALIDATE_RET( ctx != NULL );
630 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
631 mode == MBEDTLS_ARIA_DECRYPT );
632 ARIA_VALIDATE_RET( length == 0 || input != NULL );
633 ARIA_VALIDATE_RET( length == 0 || output != NULL );
634 ARIA_VALIDATE_RET( iv != NULL );
635
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100636 if( length % MBEDTLS_ARIA_BLOCKSIZE )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000637 return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH );
638
639 if( mode == MBEDTLS_ARIA_DECRYPT )
640 {
641 while( length > 0 )
642 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100643 memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200644 mbedtls_aria_crypt_ecb( ctx, input, output );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000645
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100646 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000647 output[i] = (unsigned char)( output[i] ^ iv[i] );
648
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100649 memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000650
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100651 input += MBEDTLS_ARIA_BLOCKSIZE;
652 output += MBEDTLS_ARIA_BLOCKSIZE;
653 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000654 }
655 }
656 else
657 {
658 while( length > 0 )
659 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100660 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000661 output[i] = (unsigned char)( input[i] ^ iv[i] );
662
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200663 mbedtls_aria_crypt_ecb( ctx, output, output );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100664 memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000665
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100666 input += MBEDTLS_ARIA_BLOCKSIZE;
667 output += MBEDTLS_ARIA_BLOCKSIZE;
668 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000669 }
670 }
671
672 return( 0 );
673}
674#endif /* MBEDTLS_CIPHER_MODE_CBC */
675
676#if defined(MBEDTLS_CIPHER_MODE_CFB)
677/*
678 * ARIA-CFB128 buffer encryption/decryption
679 */
680int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100681 int mode,
682 size_t length,
683 size_t *iv_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100684 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100685 const unsigned char *input,
686 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000687{
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200688 unsigned char c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500689 size_t n;
690
691 ARIA_VALIDATE_RET( ctx != NULL );
692 ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT ||
693 mode == MBEDTLS_ARIA_DECRYPT );
694 ARIA_VALIDATE_RET( length == 0 || input != NULL );
695 ARIA_VALIDATE_RET( length == 0 || output != NULL );
696 ARIA_VALIDATE_RET( iv != NULL );
697 ARIA_VALIDATE_RET( iv_off != NULL );
698
699 n = *iv_off;
700
701 /* An overly large value of n can lead to an unlimited
702 * buffer overflow. Therefore, guard against this
703 * outside of parameter validation. */
704 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
705 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000706
707 if( mode == MBEDTLS_ARIA_DECRYPT )
708 {
709 while( length-- )
710 {
711 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200712 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000713
714 c = *input++;
Manuel Pégourié-Gonnard565e4e02018-05-22 13:30:28 +0200715 *output++ = c ^ iv[n];
716 iv[n] = c;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000717
718 n = ( n + 1 ) & 0x0F;
719 }
720 }
721 else
722 {
723 while( length-- )
724 {
725 if( n == 0 )
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200726 mbedtls_aria_crypt_ecb( ctx, iv, iv );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000727
728 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
729
730 n = ( n + 1 ) & 0x0F;
731 }
732 }
733
734 *iv_off = n;
735
736 return( 0 );
737}
738#endif /* MBEDTLS_CIPHER_MODE_CFB */
739
740#if defined(MBEDTLS_CIPHER_MODE_CTR)
741/*
742 * ARIA-CTR buffer encryption/decryption
743 */
744int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100745 size_t length,
746 size_t *nc_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100747 unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
748 unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100749 const unsigned char *input,
750 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000751{
752 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500753 size_t n;
754
755 ARIA_VALIDATE_RET( ctx != NULL );
756 ARIA_VALIDATE_RET( length == 0 || input != NULL );
757 ARIA_VALIDATE_RET( length == 0 || output != NULL );
758 ARIA_VALIDATE_RET( nonce_counter != NULL );
759 ARIA_VALIDATE_RET( stream_block != NULL );
760 ARIA_VALIDATE_RET( nc_off != NULL );
761
762 n = *nc_off;
763 /* An overly large value of n can lead to an unlimited
764 * buffer overflow. Therefore, guard against this
765 * outside of parameter validation. */
766 if( n >= MBEDTLS_ARIA_BLOCKSIZE )
767 return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000768
769 while( length-- )
770 {
771 if( n == 0 ) {
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200772 mbedtls_aria_crypt_ecb( ctx, nonce_counter,
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000773 stream_block );
774
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100775 for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000776 if( ++nonce_counter[i - 1] != 0 )
777 break;
778 }
779 c = *input++;
780 *output++ = (unsigned char)( c ^ stream_block[n] );
781
782 n = ( n + 1 ) & 0x0F;
783 }
784
785 *nc_off = n;
786
787 return( 0 );
788}
789#endif /* MBEDTLS_CIPHER_MODE_CTR */
790#endif /* !MBEDTLS_ARIA_ALT */
791
792#if defined(MBEDTLS_SELF_TEST)
793
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100794/*
795 * Basic ARIA ECB test vectors from RFC 5794
796 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000797static const uint8_t aria_test1_ecb_key[32] = // test key
798{
799 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
800 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
801 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
802 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
803};
804
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100805static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000806{
807 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
808 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
809};
810
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100811static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000812{
813 { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
814 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
815 { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
816 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
817 { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
818 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
819};
820
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100821/*
822 * Mode tests from "Test Vectors for ARIA" Version 1.0
823 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
824 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000825#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000826 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000827static const uint8_t aria_test2_key[32] =
828{
829 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
830 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
831 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
832 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
833};
834
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000835static const uint8_t aria_test2_pt[48] =
836{
837 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
838 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
839 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
840 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
841 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
842 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
843};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000844#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000845
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000846#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100847static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000848{
849 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
850 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
851};
852#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000853
854#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100855static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000856{
857 { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
858 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
859 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
860 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
861 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
862 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
863 { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
864 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
865 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
866 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
867 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
868 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
869 { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
870 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
871 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
872 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
873 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
874 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
875};
876#endif /* MBEDTLS_CIPHER_MODE_CBC */
877
878#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100879static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000880{
881 { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
882 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
883 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
884 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
885 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
886 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
887 { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
888 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
889 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
890 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
891 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
892 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
893 { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
894 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
895 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
896 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
897 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
898 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
899};
900#endif /* MBEDTLS_CIPHER_MODE_CFB */
901
902#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100903static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000904{
905 { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
906 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
907 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
908 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
909 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
910 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
911 { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
912 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
913 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
914 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
915 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
916 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
917 { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
918 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
919 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
920 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
921 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
922 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
923};
924#endif /* MBEDTLS_CIPHER_MODE_CFB */
925
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000926#define ARIA_SELF_TEST_IF_FAIL \
927 { \
928 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300929 mbedtls_printf( "failed\n" ); \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000930 return( 1 ); \
931 } else { \
932 if( verbose ) \
Ron Eldord1a47622018-08-13 13:49:52 +0300933 mbedtls_printf( "passed\n" ); \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000934 }
935
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100936/*
937 * Checkup routine
938 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000939int mbedtls_aria_self_test( int verbose )
940{
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000941 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100942 uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000943 mbedtls_aria_context ctx;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000944
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000945#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
946 size_t j;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000947#endif
948
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000949#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
950 defined(MBEDTLS_CIPHER_MODE_CFB) || \
951 defined(MBEDTLS_CIPHER_MODE_CTR))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100952 uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000953#endif
954
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100955 /*
956 * Test set 1
957 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000958 for( i = 0; i < 3; i++ )
959 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100960 /* test ECB encryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000961 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300962 mbedtls_printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000963 mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200964 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_pt, blk );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100965 if( memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000966 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000967
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100968 /* test ECB decryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000969 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300970 mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000971 mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Manuel Pégourié-Gonnard08c337d2018-05-22 13:18:01 +0200972 mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100973 if( memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000974 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000975 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000976 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300977 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000978
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100979 /*
980 * Test set 2
981 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000982#if defined(MBEDTLS_CIPHER_MODE_CBC)
983 for( i = 0; i < 3; i++ )
984 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100985 /* Test CBC encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000986 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300987 mbedtls_printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000988 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100989 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100990 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000991 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
992 aria_test2_pt, buf );
993 if( memcmp( buf, aria_test2_cbc_ct[i], 48 ) != 0 )
994 ARIA_SELF_TEST_IF_FAIL;
995
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100996 /* Test CBC decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000997 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +0300998 mbedtls_printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000999 mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001000 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001001 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001002 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
1003 aria_test2_cbc_ct[i], buf );
1004 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1005 ARIA_SELF_TEST_IF_FAIL;
1006 }
1007 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001008 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001009
1010#endif /* MBEDTLS_CIPHER_MODE_CBC */
1011
1012#if defined(MBEDTLS_CIPHER_MODE_CFB)
1013 for( i = 0; i < 3; i++ )
1014 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001015 /* Test CFB encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001016 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001017 mbedtls_printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001018 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001019 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001020 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001021 j = 0;
1022 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
1023 aria_test2_pt, buf );
1024 if( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 )
1025 ARIA_SELF_TEST_IF_FAIL;
1026
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001027 /* Test CFB decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001028 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001029 mbedtls_printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001030 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001031 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001032 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001033 j = 0;
1034 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
1035 iv, aria_test2_cfb_ct[i], buf );
1036 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1037 ARIA_SELF_TEST_IF_FAIL;
1038 }
1039 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001040 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001041#endif /* MBEDTLS_CIPHER_MODE_CFB */
1042
1043#if defined(MBEDTLS_CIPHER_MODE_CTR)
1044 for( i = 0; i < 3; i++ )
1045 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001046 /* Test CTR encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001047 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001048 mbedtls_printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001049 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001050 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001051 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001052 j = 0;
1053 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1054 aria_test2_pt, buf );
1055 if( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 )
1056 ARIA_SELF_TEST_IF_FAIL;
1057
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001058 /* Test CTR decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001059 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001060 mbedtls_printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001061 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001062 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001063 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001064 j = 0;
1065 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1066 aria_test2_ctr_ct[i], buf );
1067 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1068 ARIA_SELF_TEST_IF_FAIL;
1069 }
1070 if( verbose )
Ron Eldord1a47622018-08-13 13:49:52 +03001071 mbedtls_printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001072#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001073
1074 return( 0 );
1075}
1076
1077#endif /* MBEDTLS_SELF_TEST */
1078
1079#endif /* MBEDTLS_ARIA_C */