blob: c7cdb979092e05fbdcd4f31f6b51ba518caac21a [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é-Gonnardc0bb66f2018-02-28 12:38:04 +010051#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
52 !defined(inline) && !defined(__cplusplus)
53#define inline __inline
54#endif
55
Manuel Pégourié-Gonnard56453932018-02-21 10:08:31 +010056/* Implementation that should never be optimized out by the compiler */
57static void mbedtls_zeroize( void *v, size_t n ) {
58 volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;
59}
60
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010061/*
62 * 32-bit integer manipulation macros (little endian)
63 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000064#ifndef GET_UINT32_LE
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +010065#define GET_UINT32_LE( n, b, i ) \
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000066{ \
67 (n) = ( (uint32_t) (b)[(i) ] ) \
68 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
69 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
70 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
71}
72#endif
73
74#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +010075#define PUT_UINT32_LE( n, b, i ) \
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000076{ \
77 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
78 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
79 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
80 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
81}
82#endif
83
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010084/*
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +010085 * 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 +010086 *
87 * This is submatrix P1 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +010088 *
89 * Common compilers fail to translate this to minimal number of instructions,
90 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +010091 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +010092#if defined(MBEDTLS_HAVE_ASM)
93#if defined(__arm__)
94/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
95#if defined(__GNUC__) && \
96 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 )
97static inline uint32_t aria_p1( uint32_t x )
98{
99 uint32_t r;
100 asm( "rev16 %0, %1" : "=l" (r) : "l" (x) );
101 return( r );
102}
103#define ARIA_P1 aria_p1
104#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100105static inline uint32_t aria_p1( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100106{
107 uint32_t r;
108 __asm( "rev16 r, x" );
109 return( r );
110}
111#define ARIA_P1 aria_p1
112#endif
113#endif /* arm */
114#if defined(__GNUC__) && \
115 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100116/* I couldn't find an Intel equivalent of ret16, so two instructions */
117#define ARIA_P1(x) ARIA_P2( ARIA_P3( x ) )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100118#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100119#endif /* MBEDTLS_HAVE_ASM && GNUC */
120#if !defined(ARIA_P1)
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100121#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100122#endif
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000123
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100124/*
125 * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits
126 *
127 * This is submatrix P2 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100128 *
129 * Common compilers will translate this to a single instruction.
Manuel Pégourié-Gonnard35ad8912018-02-26 11:59:16 +0100130 */
131#define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16))
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000132
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100133/*
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100134 * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness
135 *
136 * This is submatrix P3 in [1] Appendix B.1
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100137 *
138 * Some compilers fail to translate this to a single instruction,
139 * so let's provide asm versions for common platforms with C fallback.
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100140 */
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100141#if defined(MBEDTLS_HAVE_ASM)
142#if defined(__arm__)
143/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */
144#if defined(__GNUC__) && \
145 ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 )
146static inline uint32_t aria_p3( uint32_t x )
147{
148 uint32_t r;
149 asm( "rev %0, %1" : "=l" (r) : "l" (x) );
150 return( r );
151}
152#define ARIA_P3 aria_p3
153#elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000
Manuel Pégourié-Gonnardc0bb66f2018-02-28 12:38:04 +0100154static inline uint32_t aria_p3( uint32_t x )
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100155{
156 uint32_t r;
157 __asm( "rev r, x" );
158 return( r );
159}
160#define ARIA_P3 aria_p3
161#endif
162#endif /* arm */
163#if defined(__GNUC__) && \
164 defined(__i386__) || defined(__amd64__) || defined( __x86_64__)
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100165static inline uint32_t aria_p3( uint32_t x )
166{
167 asm( "bswap %0" : "=r" (x) : "0" (x) );
168 return( x );
169}
170#define ARIA_P3 aria_p3
Manuel Pégourié-Gonnard377b2b62018-02-27 10:22:26 +0100171#endif /* x86 gnuc */
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100172#endif /* MBEDTLS_HAVE_ASM && GNUC */
173#if !defined(ARIA_P3)
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100174#define ARIA_P3(x) ARIA_P2( ARIA_P1 ( x ) )
Manuel Pégourié-Gonnardfb0e4f02018-02-26 16:08:40 +0100175#endif
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100176
177/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100178 * ARIA Affine Transform
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100179 * (a, b, c, d) = state in/out
180 *
181 * If we denote the first by of input by 0, ..., the last byte by f,
182 * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef.
183 *
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100184 * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100185 * rearrangements on adjacent pairs, output is:
186 *
187 * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe
188 * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd
189 * b = 0101 + 2323 + 5476 + 8998 + baab + ecec + ffdd
190 * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc
191 * c = 0022 + 1133 + 4545 + 7667 + ab89 + dcdc + fefe
192 * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc
193 * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cedf
194 * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef
195 *
196 * Note: another presentation of the A transform can be found as the first
197 * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4.
198 * The implementation below uses only P1 and P2 as they are sufficient.
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100199 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100200static inline void aria_a( uint32_t *a, uint32_t *b,
201 uint32_t *c, uint32_t *d )
202{
203 uint32_t ta, tb, tc;
Manuel Pégourié-Gonnardf205a012018-02-26 14:10:23 +0100204 ta = *b; // 4567
205 *b = *a; // 0123
206 *a = ARIA_P2( ta ); // 6745
207 tb = ARIA_P2( *d ); // efcd
208 *d = ARIA_P1( *c ); // 98ba
209 *c = ARIA_P1( tb ); // fedc
210 ta ^= *d; // 4567+98ba
211 tc = ARIA_P2( *b ); // 2301
212 ta = ARIA_P1( ta ) ^ tc ^ *c; // 2301+5476+89ab+fedc
213 tb ^= ARIA_P2( *d ); // ba98+efcd
214 tc ^= ARIA_P1( *a ); // 2301+7654
215 *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT
216 tb = ARIA_P2( tb ) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc
217 *a ^= ARIA_P1( tb ); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT
218 ta = ARIA_P2( ta ); // 0123+7654+ab89+dcfe
219 *d ^= ARIA_P1( ta ) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT
220 tc = ARIA_P2( tc ); // 0123+5476
221 *c ^= ARIA_P1( tc ) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000222}
223
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100224/*
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100225 * ARIA Substitution Layer SL1 / SL2
226 * (a, b, c, d) = state in/out
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100227 * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100228 *
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100229 * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1
230 * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100231 */
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100232static inline void aria_sl( uint32_t *a, uint32_t *b,
233 uint32_t *c, uint32_t *d,
234 const uint8_t sa[0x100], const uint8_t sb[0x100],
235 const uint8_t sc[0x100], const uint8_t sd[0x100] )
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100236{
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100237 *a = ( (uint32_t) sa[ *a & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100238 (((uint32_t) sb[(*a >> 8) & 0xFF]) << 8) ^
239 (((uint32_t) sc[(*a >> 16) & 0xFF]) << 16) ^
240 (((uint32_t) sd[ *a >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100241 *b = ( (uint32_t) sa[ *b & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100242 (((uint32_t) sb[(*b >> 8) & 0xFF]) << 8) ^
243 (((uint32_t) sc[(*b >> 16) & 0xFF]) << 16) ^
244 (((uint32_t) sd[ *b >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100245 *c = ( (uint32_t) sa[ *c & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100246 (((uint32_t) sb[(*c >> 8) & 0xFF]) << 8) ^
247 (((uint32_t) sc[(*c >> 16) & 0xFF]) << 16) ^
248 (((uint32_t) sd[ *c >> 24 ]) << 24);
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100249 *d = ( (uint32_t) sa[ *d & 0xFF] ) ^
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100250 (((uint32_t) sb[(*d >> 8) & 0xFF]) << 8) ^
251 (((uint32_t) sc[(*d >> 16) & 0xFF]) << 16) ^
252 (((uint32_t) sd[ *d >> 24 ]) << 24);
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000253}
254
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100255/*
256 * S-Boxes
257 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000258static const uint8_t aria_sb1[0x100] =
259{
260 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
261 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
262 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
263 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
264 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
265 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
266 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
267 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
268 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
269 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
270 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
271 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
272 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
273 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
274 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
275 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
276 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
277 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
278 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
279 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
280 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
281 0xB0, 0x54, 0xBB, 0x16
282};
283
284static const uint8_t aria_sb2[0x100] =
285{
286 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46,
287 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B,
288 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B,
289 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB,
290 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA,
291 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91,
292 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38,
293 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53,
294 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74,
295 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26,
296 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD,
297 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC,
298 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E,
299 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A,
300 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5,
301 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8,
302 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24,
303 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F,
304 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
305 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D,
306 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A,
307 0xAF, 0xBA, 0xB5, 0x81
308};
309
310static const uint8_t aria_is1[0x100] =
311{
312 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
313 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
314 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
315 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
316 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
317 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
318 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
319 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
320 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
321 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
322 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
323 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
324 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
325 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
326 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
327 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
328 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
329 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
330 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
331 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
332 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
333 0x55, 0x21, 0x0C, 0x7D
334};
335
336static const uint8_t aria_is2[0x100] =
337{
338 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1,
339 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3,
340 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89,
341 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D,
342 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98,
343 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58,
344 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F,
345 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE,
346 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23,
347 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19,
348 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55,
349 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A,
350 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE,
351 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0,
352 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6,
353 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5,
354 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13,
355 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73,
356 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
357 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3,
358 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33,
359 0x03, 0xA2, 0xAC, 0x60
360};
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000361
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100362/*
363 * Helper for key schedule: r = FO( p, k ) ^ x
364 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100365static void aria_fo_xor( uint32_t r[4], const uint32_t p[4],
366 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000367{
368 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000369
370 a = p[0] ^ k[0];
371 b = p[1] ^ k[1];
372 c = p[2] ^ k[2];
373 d = p[3] ^ k[3];
374
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100375 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
376 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000377
378 r[0] = a ^ x[0];
379 r[1] = b ^ x[1];
380 r[2] = c ^ x[2];
381 r[3] = d ^ x[3];
382}
383
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100384/*
385 * Helper for key schedule: r = FE( p, k ) ^ x
386 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100387static void aria_fe_xor( uint32_t r[4], const uint32_t p[4],
388 const uint32_t k[4], const uint32_t x[4] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000389{
390 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000391
392 a = p[0] ^ k[0];
393 b = p[1] ^ k[1];
394 c = p[2] ^ k[2];
395 d = p[3] ^ k[3];
396
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100397 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
398 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000399
400 r[0] = a ^ x[0];
401 r[1] = b ^ x[1];
402 r[2] = c ^ x[2];
403 r[3] = d ^ x[3];
404}
405
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100406/*
407 * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup.
408 *
409 * We chose to store bytes into 32-bit words in little-endian format (see
410 * GET/PUT_UINT32_LE) so we need to reverse bytes here.
411 */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100412static void aria_rot128( uint32_t r[4], const uint32_t a[4],
413 const uint32_t b[4], uint8_t n )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000414{
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100415 uint8_t i, j;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000416 uint32_t t, u;
417
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100418 const uint8_t n1 = n % 32; // bit offset
419 const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100420
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100421 j = (n / 32) % 4; // initial word offset
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100422 t = ARIA_P3( b[j] ); // big endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000423 for( i = 0; i < 4; i++ )
424 {
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100425 j = (j + 1) % 4; // get next word, big endian
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100426 u = ARIA_P3( b[j] );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000427 t <<= n1; // rotate
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100428 t |= u >> n2;
Manuel Pégourié-Gonnardcac50082018-02-26 15:23:03 +0100429 t = ARIA_P3( t ); // back to little endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000430 r[i] = a[i] ^ t; // store
431 t = u; // move to next word
432 }
433}
434
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100435/*
436 * Set encryption key
437 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100438int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx,
439 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000440{
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100441 /* round constant masks */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000442 const uint32_t rc[3][4] =
443 {
444 { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
445 { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
446 { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
447 };
448
449 int i;
450 uint32_t w[4][4], *w2;
451
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100452 if( keybits != 128 && keybits != 192 && keybits != 256 )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100453 return( MBEDTLS_ERR_ARIA_INVALID_KEY_LENGTH );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000454
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100455 /* Copy key to W0 (and potential remainder to W1) */
456 GET_UINT32_LE( w[0][0], key, 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000457 GET_UINT32_LE( w[0][1], key, 4 );
458 GET_UINT32_LE( w[0][2], key, 8 );
459 GET_UINT32_LE( w[0][3], key, 12 );
460
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100461 memset( w[1], 0, 16 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000462 if( keybits >= 192 )
463 {
464 GET_UINT32_LE( w[1][0], key, 16 ); // 192 bit key
465 GET_UINT32_LE( w[1][1], key, 20 );
466 }
467 if( keybits == 256 )
468 {
469 GET_UINT32_LE( w[1][2], key, 24 ); // 256 bit key
470 GET_UINT32_LE( w[1][3], key, 28 );
471 }
472
473 i = (keybits - 128) >> 6; // index: 0, 1, 2
474 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
475
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100476 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 +0000477 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100478 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 +0000479 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100480 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 +0000481
482 for( i = 0; i < 4; i++ ) // create round keys
483 {
484 w2 = w[(i + 1) & 3];
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100485 aria_rot128( ctx->rk[i ], w[i], w2, 128 - 19 );
486 aria_rot128( ctx->rk[i + 4], w[i], w2, 128 - 31 );
487 aria_rot128( ctx->rk[i + 8], w[i], w2, 61 );
488 aria_rot128( ctx->rk[i + 12], w[i], w2, 31 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000489 }
490 aria_rot128( ctx->rk[16], w[0], w[1], 19 );
491
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100492 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000493}
494
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100495/*
496 * Set decryption key
497 */
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100498int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx,
499 const unsigned char *key, unsigned int keybits )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000500{
501 int i, j, k, ret;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000502
503 ret = mbedtls_aria_setkey_enc( ctx, key, keybits );
504 if( ret != 0 )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100505 return( ret );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000506
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100507 /* flip the order of round keys */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000508 for( i = 0, j = ctx->nr; i < j; i++, j-- )
509 {
510 for( k = 0; k < 4; k++ )
511 {
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100512 uint32_t t = ctx->rk[i][k];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000513 ctx->rk[i][k] = ctx->rk[j][k];
514 ctx->rk[j][k] = t;
515 }
516 }
517
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100518 /* apply affine transform to middle keys */
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100519 for( i = 1; i < ctx->nr; i++ )
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100520 {
521 aria_a( &ctx->rk[i][0], &ctx->rk[i][1],
522 &ctx->rk[i][2], &ctx->rk[i][3] );
523 }
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000524
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100525 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000526}
527
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100528/*
529 * Encrypt a block
530 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000531int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx,
532 int mode,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100533 const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE],
534 unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000535{
536 int i;
537
538 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000539
540 ( (void) mode );
541
542 GET_UINT32_LE( a, input, 0 );
543 GET_UINT32_LE( b, input, 4 );
544 GET_UINT32_LE( c, input, 8 );
545 GET_UINT32_LE( d, input, 12 );
546
547 i = 0;
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100548 while( 1 )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000549 {
550 a ^= ctx->rk[i][0];
551 b ^= ctx->rk[i][1];
552 c ^= ctx->rk[i][2];
553 d ^= ctx->rk[i][3];
554 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100555
556 aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
557 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000558
559 a ^= ctx->rk[i][0];
560 b ^= ctx->rk[i][1];
561 c ^= ctx->rk[i][2];
562 d ^= ctx->rk[i][3];
563 i++;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100564
565 aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100566 if( i >= ctx->nr )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000567 break;
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100568 aria_a( &a, &b, &c, &d );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000569 }
570
Manuel Pégourié-Gonnard64744f82018-02-21 12:35:19 +0100571 /* final key mixing */
572 a ^= ctx->rk[i][0];
573 b ^= ctx->rk[i][1];
574 c ^= ctx->rk[i][2];
575 d ^= ctx->rk[i][3];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000576
577 PUT_UINT32_LE( a, output, 0 );
578 PUT_UINT32_LE( b, output, 4 );
579 PUT_UINT32_LE( c, output, 8 );
580 PUT_UINT32_LE( d, output, 12 );
581
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100582 return( 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000583}
584
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100585/* Initialize context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000586void mbedtls_aria_init( mbedtls_aria_context *ctx )
587{
588 memset( ctx, 0, sizeof( mbedtls_aria_context ) );
589}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000590
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100591/* Clear context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000592void mbedtls_aria_free( mbedtls_aria_context *ctx )
593{
594 if( ctx == NULL )
595 return;
596
Manuel Pégourié-Gonnard56453932018-02-21 10:08:31 +0100597 mbedtls_zeroize( ctx, sizeof( mbedtls_aria_context ) );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000598}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000599
600#if defined(MBEDTLS_CIPHER_MODE_CBC)
601/*
602 * ARIA-CBC buffer encryption/decryption
603 */
604int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100605 int mode,
606 size_t length,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100607 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100608 const unsigned char *input,
609 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000610{
611 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100612 unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000613
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100614 if( length % MBEDTLS_ARIA_BLOCKSIZE )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000615 return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH );
616
617 if( mode == MBEDTLS_ARIA_DECRYPT )
618 {
619 while( length > 0 )
620 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100621 memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000622 mbedtls_aria_crypt_ecb( ctx, mode, input, output );
623
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100624 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000625 output[i] = (unsigned char)( output[i] ^ iv[i] );
626
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100627 memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000628
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100629 input += MBEDTLS_ARIA_BLOCKSIZE;
630 output += MBEDTLS_ARIA_BLOCKSIZE;
631 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000632 }
633 }
634 else
635 {
636 while( length > 0 )
637 {
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100638 for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000639 output[i] = (unsigned char)( input[i] ^ iv[i] );
640
641 mbedtls_aria_crypt_ecb( ctx, mode, output, output );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100642 memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000643
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100644 input += MBEDTLS_ARIA_BLOCKSIZE;
645 output += MBEDTLS_ARIA_BLOCKSIZE;
646 length -= MBEDTLS_ARIA_BLOCKSIZE;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000647 }
648 }
649
650 return( 0 );
651}
652#endif /* MBEDTLS_CIPHER_MODE_CBC */
653
654#if defined(MBEDTLS_CIPHER_MODE_CFB)
655/*
656 * ARIA-CFB128 buffer encryption/decryption
657 */
658int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100659 int mode,
660 size_t length,
661 size_t *iv_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100662 unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100663 const unsigned char *input,
664 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000665{
666 int c;
667 size_t n = *iv_off;
668
669 if( mode == MBEDTLS_ARIA_DECRYPT )
670 {
671 while( length-- )
672 {
673 if( n == 0 )
674 mbedtls_aria_crypt_ecb( ctx, MBEDTLS_ARIA_ENCRYPT, iv, iv );
675
676 c = *input++;
677 *output++ = (unsigned char)( c ^ iv[n] );
678 iv[n] = (unsigned char) c;
679
680 n = ( n + 1 ) & 0x0F;
681 }
682 }
683 else
684 {
685 while( length-- )
686 {
687 if( n == 0 )
688 mbedtls_aria_crypt_ecb( ctx, MBEDTLS_ARIA_ENCRYPT, iv, iv );
689
690 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
691
692 n = ( n + 1 ) & 0x0F;
693 }
694 }
695
696 *iv_off = n;
697
698 return( 0 );
699}
700#endif /* MBEDTLS_CIPHER_MODE_CFB */
701
702#if defined(MBEDTLS_CIPHER_MODE_CTR)
703/*
704 * ARIA-CTR buffer encryption/decryption
705 */
706int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx,
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100707 size_t length,
708 size_t *nc_off,
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100709 unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE],
710 unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE],
Manuel Pégourié-Gonnard4231e7f2018-02-28 10:54:31 +0100711 const unsigned char *input,
712 unsigned char *output )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000713{
714 int c, i;
715 size_t n = *nc_off;
716
717 while( length-- )
718 {
719 if( n == 0 ) {
720 mbedtls_aria_crypt_ecb( ctx, MBEDTLS_ARIA_ENCRYPT, nonce_counter,
721 stream_block );
722
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100723 for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- )
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000724 if( ++nonce_counter[i - 1] != 0 )
725 break;
726 }
727 c = *input++;
728 *output++ = (unsigned char)( c ^ stream_block[n] );
729
730 n = ( n + 1 ) & 0x0F;
731 }
732
733 *nc_off = n;
734
735 return( 0 );
736}
737#endif /* MBEDTLS_CIPHER_MODE_CTR */
738#endif /* !MBEDTLS_ARIA_ALT */
739
740#if defined(MBEDTLS_SELF_TEST)
741
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100742/*
743 * Basic ARIA ECB test vectors from RFC 5794
744 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000745static const uint8_t aria_test1_ecb_key[32] = // test key
746{
747 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
748 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
749 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
750 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
751};
752
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100753static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000754{
755 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
756 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
757};
758
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100759static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000760{
761 { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
762 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
763 { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
764 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
765 { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
766 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
767};
768
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100769/*
770 * Mode tests from "Test Vectors for ARIA" Version 1.0
771 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
772 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000773#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000774 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000775static const uint8_t aria_test2_key[32] =
776{
777 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
778 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
779 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
780 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
781};
782
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000783static const uint8_t aria_test2_pt[48] =
784{
785 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
786 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
787 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
788 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
789 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
790 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
791};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000792#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000793
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000794#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100795static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] =
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000796{
797 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
798 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
799};
800#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000801
802#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100803static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000804{
805 { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
806 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
807 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
808 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
809 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
810 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
811 { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
812 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
813 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
814 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
815 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
816 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
817 { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
818 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
819 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
820 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
821 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
822 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
823};
824#endif /* MBEDTLS_CIPHER_MODE_CBC */
825
826#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100827static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000828{
829 { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
830 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
831 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
832 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
833 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
834 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
835 { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
836 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
837 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
838 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
839 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
840 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
841 { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
842 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
843 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
844 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
845 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
846 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
847};
848#endif /* MBEDTLS_CIPHER_MODE_CFB */
849
850#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardf3a46a92018-02-28 12:38:21 +0100851static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000852{
853 { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
854 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
855 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
856 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
857 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
858 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
859 { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
860 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
861 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
862 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
863 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
864 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
865 { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
866 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
867 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
868 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
869 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
870 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
871};
872#endif /* MBEDTLS_CIPHER_MODE_CFB */
873
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000874#define ARIA_SELF_TEST_IF_FAIL \
875 { \
876 if( verbose ) \
877 printf( "failed\n" ); \
878 return( 1 ); \
879 } else { \
880 if( verbose ) \
881 printf( "passed\n" ); \
882 }
883
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100884/*
885 * Checkup routine
886 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000887int mbedtls_aria_self_test( int verbose )
888{
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000889 int i;
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100890 uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000891 mbedtls_aria_context ctx;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000892
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000893#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
894 size_t j;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000895#endif
896
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000897#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
898 defined(MBEDTLS_CIPHER_MODE_CFB) || \
899 defined(MBEDTLS_CIPHER_MODE_CTR))
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100900 uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE];
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000901#endif
902
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100903 /*
904 * Test set 1
905 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000906 for( i = 0; i < 3; i++ )
907 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100908 /* test ECB encryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000909 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100910 printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000911 mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000912 mbedtls_aria_crypt_ecb( &ctx, MBEDTLS_ARIA_ENCRYPT,
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000913 aria_test1_ecb_pt, blk );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100914 if( memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000915 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000916
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100917 /* test ECB decryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000918 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100919 printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000920 mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000921 mbedtls_aria_crypt_ecb( &ctx, MBEDTLS_ARIA_DECRYPT,
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000922 aria_test1_ecb_ct[i], blk );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100923 if( memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) != 0 )
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000924 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000925 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000926 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100927 printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000928
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100929 /*
930 * Test set 2
931 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000932#if defined(MBEDTLS_CIPHER_MODE_CBC)
933 for( i = 0; i < 3; i++ )
934 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100935 /* Test CBC encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000936 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100937 printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000938 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100939 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100940 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000941 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
942 aria_test2_pt, buf );
943 if( memcmp( buf, aria_test2_cbc_ct[i], 48 ) != 0 )
944 ARIA_SELF_TEST_IF_FAIL;
945
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100946 /* Test CBC decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000947 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100948 printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000949 mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100950 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100951 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000952 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
953 aria_test2_cbc_ct[i], buf );
954 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
955 ARIA_SELF_TEST_IF_FAIL;
956 }
957 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100958 printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000959
960#endif /* MBEDTLS_CIPHER_MODE_CBC */
961
962#if defined(MBEDTLS_CIPHER_MODE_CFB)
963 for( i = 0; i < 3; i++ )
964 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100965 /* Test CFB encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000966 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100967 printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000968 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100969 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100970 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000971 j = 0;
972 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
973 aria_test2_pt, buf );
974 if( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 )
975 ARIA_SELF_TEST_IF_FAIL;
976
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100977 /* Test CFB decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000978 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100979 printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000980 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +0100981 memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE );
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100982 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000983 j = 0;
984 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
985 iv, aria_test2_cfb_ct[i], buf );
986 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
987 ARIA_SELF_TEST_IF_FAIL;
988 }
989 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100990 printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000991#endif /* MBEDTLS_CIPHER_MODE_CFB */
992
993#if defined(MBEDTLS_CIPHER_MODE_CTR)
994 for( i = 0; i < 3; i++ )
995 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100996 /* Test CTR encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000997 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +0100998 printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000999 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001000 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001001 memset( buf, 0x55, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001002 j = 0;
1003 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1004 aria_test2_pt, buf );
1005 if( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 )
1006 ARIA_SELF_TEST_IF_FAIL;
1007
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +01001008 /* Test CTR decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001009 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001010 printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001011 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
Manuel Pégourié-Gonnard5ad88b62018-03-01 09:20:47 +01001012 memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001013 memset( buf, 0xAA, sizeof( buf ) );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001014 j = 0;
1015 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
1016 aria_test2_ctr_ct[i], buf );
1017 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
1018 ARIA_SELF_TEST_IF_FAIL;
1019 }
1020 if( verbose )
Manuel Pégourié-Gonnard7fc08792018-03-01 09:33:20 +01001021 printf( "\n" );
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +00001022#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +00001023
1024 return( 0 );
1025}
1026
1027#endif /* MBEDTLS_SELF_TEST */
1028
1029#endif /* MBEDTLS_ARIA_C */