blob: b71cc3845169c9c8c8abe7c3c0cf2c31ef55ac3c [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é-Gonnard56453932018-02-21 10:08:31 +010051/* Implementation that should never be optimized out by the compiler */
52static void mbedtls_zeroize( void *v, size_t n ) {
53 volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;
54}
55
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010056/*
57 * 32-bit integer manipulation macros (little endian)
58 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000059
60#ifndef GET_UINT32_LE
61#define GET_UINT32_LE(n,b,i) \
62{ \
63 (n) = ( (uint32_t) (b)[(i) ] ) \
64 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
65 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
66 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
67}
68#endif
69
70#ifndef PUT_UINT32_LE
71#define PUT_UINT32_LE(n,b,i) \
72{ \
73 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
74 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
75 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
76 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
77}
78#endif
79
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010080/* modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000081#define ARIA_FLIP1(x) (((x) >> 16) ^ ((x) << 16))
82
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010083/* modify byte order ( A B C D ) -> ( B A D C ), i.e. swap pairs of bytes */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000084#define ARIA_FLIP2(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8))
85
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +010086/*
87 * Affine Transform A
88 * (ra, rb, rc, rd) = state in/out
89 */
90#define ARIA_A( ra, rb, rc, rd ) { \
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +010091 uint32_t ta, tb, tc; \
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +000092 ta = rb; \
93 rb = ra; \
94 ra = ARIA_FLIP1( ta ); \
95 tb = ARIA_FLIP1( rd ); \
96 rd = ARIA_FLIP2( rc ); \
97 rc = ARIA_FLIP2( tb ); \
98 ta ^= rd; \
99 tc = ARIA_FLIP1( rb ); \
100 ta = ARIA_FLIP2( ta ) ^ tc ^ rc; \
101 tb ^= ARIA_FLIP1( rd ); \
102 tc ^= ARIA_FLIP2( ra ); \
103 rb ^= ta ^ tb; \
104 tb = ARIA_FLIP1( tb ) ^ ta; \
105 ra ^= ARIA_FLIP2( tb ); \
106 ta = ARIA_FLIP1( ta ); \
107 rd ^= ARIA_FLIP2( ta ) ^ tc; \
108 tc = ARIA_FLIP1( tc ); \
109 rc ^= ARIA_FLIP2( tc ) ^ ta; \
110}
111
112
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100113/*
114 * ARIA Round function ( Substitution Layer SLx + Affine Transform A )
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100115 * (ra, rb, rc, rd) = state in/out
116 * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below)
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100117 *
118 * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1-then-A.
119 * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2-then-A.
120 */
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100121static inline void aria_sla( uint32_t *a, uint32_t *b,
122 uint32_t *c, uint32_t *d,
123 const uint8_t sa[0x100], const uint8_t sb[0x100],
124 const uint8_t sc[0x100], const uint8_t sd[0x100] )
125{
126 uint32_t ra, rb, rc, rd, ta, tb, tc;
127
128 ra = *a;
129 rb = *b;
130 rc = *c;
131 rd = *d;
132
133 ta = ( (uint32_t) sc[(rb >> 16) & 0xFF]) ^
134 (((uint32_t) sd[ rb >> 24]) << 8) ^
135 (((uint32_t) sa[ rb & 0xFF]) << 16) ^
136 (((uint32_t) sb[(rb >> 8) & 0xFF]) << 24);
137 rb = ( (uint32_t) sa[ ra & 0xFF]) ^
138 (((uint32_t) sb[(ra >> 8) & 0xFF]) << 8) ^
139 (((uint32_t) sc[(ra >> 16) & 0xFF]) << 16) ^
140 (((uint32_t) sd[ ra >> 24]) << 24);
141 ra = ta;
142 ta = ( (uint32_t) sd[ rd >> 24]) ^
143 (((uint32_t) sc[(rd >> 16) & 0xFF]) << 8) ^
144 (((uint32_t) sb[(rd >> 8) & 0xFF]) << 16) ^
145 (((uint32_t) sa[ rd & 0xFF]) << 24);
146 rd = ( (uint32_t) sb[(rc >> 8) & 0xFF]) ^
147 (((uint32_t) sa[ rc & 0xFF]) << 8) ^
148 (((uint32_t) sd[ rc >> 24]) << 16) ^
149 (((uint32_t) sc[(rc >> 16) & 0xFF]) << 24);
150 rc = ta;
151 ta = ARIA_FLIP1( ra ) ^ rd;
152 tc = ARIA_FLIP1( rb );
153 ta = ARIA_FLIP2( ta ) ^ tc ^ rc;
154 tb = ARIA_FLIP2( rc ) ^ ARIA_FLIP1( rd );
155 tc ^= ARIA_FLIP2( ra );
156 rb ^= ta ^ tb;
157 tb = ARIA_FLIP1( tb ) ^ ta;
158 ra ^= ARIA_FLIP2( tb );
159 ta = ARIA_FLIP1( ta );
160 rd ^= ARIA_FLIP2( ta ) ^ tc;
161 tc = ARIA_FLIP1( tc );
162 rc ^= ARIA_FLIP2( tc ) ^ ta;
163
164 *a = ra;
165 *b = rb;
166 *c = rc;
167 *d = rd;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000168}
169
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100170/*
171 * S-Boxes
172 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000173static const uint8_t aria_sb1[0x100] =
174{
175 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,
176 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
177 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26,
178 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
179 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,
180 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
181 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED,
182 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
183 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F,
184 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
185 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC,
186 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
187 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14,
188 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
189 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,
190 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
191 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F,
192 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
193 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
194 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
195 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F,
196 0xB0, 0x54, 0xBB, 0x16
197};
198
199static const uint8_t aria_sb2[0x100] =
200{
201 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46,
202 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B,
203 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B,
204 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB,
205 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA,
206 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91,
207 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38,
208 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53,
209 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74,
210 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26,
211 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD,
212 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC,
213 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E,
214 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A,
215 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5,
216 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8,
217 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24,
218 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F,
219 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
220 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D,
221 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A,
222 0xAF, 0xBA, 0xB5, 0x81
223};
224
225static const uint8_t aria_is1[0x100] =
226{
227 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
228 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
229 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32,
230 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
231 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49,
232 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
233 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
234 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
235 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05,
236 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
237 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41,
238 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
239 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
240 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
241 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B,
242 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
243 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59,
244 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
245 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
246 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
247 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63,
248 0x55, 0x21, 0x0C, 0x7D
249};
250
251static const uint8_t aria_is2[0x100] =
252{
253 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1,
254 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3,
255 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89,
256 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D,
257 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98,
258 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58,
259 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F,
260 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE,
261 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23,
262 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19,
263 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55,
264 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A,
265 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE,
266 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0,
267 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6,
268 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5,
269 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13,
270 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73,
271 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
272 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3,
273 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33,
274 0x03, 0xA2, 0xAC, 0x60
275};
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000276
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100277/*
278 * Helper for key schedule: r = FO( p, k ) ^ x
279 */
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100280static void aria_fo_xor( uint32_t r[4],
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000281 const uint32_t p[4], const uint32_t k[4], const uint32_t x[4] )
282{
283 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000284
285 a = p[0] ^ k[0];
286 b = p[1] ^ k[1];
287 c = p[2] ^ k[2];
288 d = p[3] ^ k[3];
289
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100290 aria_sla( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000291
292 r[0] = a ^ x[0];
293 r[1] = b ^ x[1];
294 r[2] = c ^ x[2];
295 r[3] = d ^ x[3];
296}
297
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100298/*
299 * Helper for key schedule: r = FE( p, k ) ^ x
300 */
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100301static void aria_fe_xor(uint32_t r[4],
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000302 const uint32_t p[4], const uint32_t k[4], const uint32_t x[4] )
303{
304 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000305
306 a = p[0] ^ k[0];
307 b = p[1] ^ k[1];
308 c = p[2] ^ k[2];
309 d = p[3] ^ k[3];
310
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100311 aria_sla( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000312
313 r[0] = a ^ x[0];
314 r[1] = b ^ x[1];
315 r[2] = c ^ x[2];
316 r[3] = d ^ x[3];
317}
318
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100319/*
320 * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup.
321 *
322 * We chose to store bytes into 32-bit words in little-endian format (see
323 * GET/PUT_UINT32_LE) so we need to reverse bytes here.
324 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000325static void aria_rot128(uint32_t r[4], const uint32_t a[4],
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100326 const uint32_t b[4], uint8_t n)
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000327{
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100328 uint8_t i, j;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000329 uint32_t t, u;
330
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100331 const uint8_t n1 = n % 32; // bit offset
332 const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100333
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100334 j = (n / 32) % 4; // initial word offset
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000335 t = ARIA_FLIP1( ARIA_FLIP2( b[j] ) ); // big endian
336 for( i = 0; i < 4; i++ )
337 {
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100338 j = (j + 1) % 4; // get next word, big endian
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000339 u = ARIA_FLIP1( ARIA_FLIP2( b[j] ) );
340 t <<= n1; // rotate
Manuel Pégourié-Gonnardc76ceb62018-02-21 09:50:17 +0100341 t |= u >> n2;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000342 t = ARIA_FLIP1( ARIA_FLIP2( t ) ); // back to little endian
343 r[i] = a[i] ^ t; // store
344 t = u; // move to next word
345 }
346}
347
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100348/*
349 * Set encryption key
350 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000351int mbedtls_aria_setkey_enc(mbedtls_aria_context *ctx,
352 const unsigned char *key, unsigned int keybits)
353{
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100354 /* round constant masks */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000355 const uint32_t rc[3][4] =
356 {
357 { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA },
358 { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF },
359 { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 }
360 };
361
362 int i;
363 uint32_t w[4][4], *w2;
364
365 if (keybits != 128 && keybits != 192 && keybits != 256)
366 return MBEDTLS_ERR_ARIA_INVALID_KEY_LENGTH;
367
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100368 /* Copy key to W0 (and potential remainder to W1) */
369 GET_UINT32_LE( w[0][0], key, 0 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000370 GET_UINT32_LE( w[0][1], key, 4 );
371 GET_UINT32_LE( w[0][2], key, 8 );
372 GET_UINT32_LE( w[0][3], key, 12 );
373
374 memset(w[1], 0, 16);
375 if( keybits >= 192 )
376 {
377 GET_UINT32_LE( w[1][0], key, 16 ); // 192 bit key
378 GET_UINT32_LE( w[1][1], key, 20 );
379 }
380 if( keybits == 256 )
381 {
382 GET_UINT32_LE( w[1][2], key, 24 ); // 256 bit key
383 GET_UINT32_LE( w[1][3], key, 28 );
384 }
385
386 i = (keybits - 128) >> 6; // index: 0, 1, 2
387 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16
388
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100389 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 +0000390 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100391 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 +0000392 i = i < 2 ? i + 1 : 0;
Manuel Pégourié-Gonnarda6d639e2018-02-20 13:45:44 +0100393 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 +0000394
395 for( i = 0; i < 4; i++ ) // create round keys
396 {
397 w2 = w[(i + 1) & 3];
Manuel Pégourié-Gonnard9cc89242018-02-21 09:44:29 +0100398 aria_rot128( ctx->rk[i ], w[i], w2, 128 - 19 );
399 aria_rot128( ctx->rk[i + 4], w[i], w2, 128 - 31 );
400 aria_rot128( ctx->rk[i + 8], w[i], w2, 61 );
401 aria_rot128( ctx->rk[i + 12], w[i], w2, 31 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000402 }
403 aria_rot128( ctx->rk[16], w[0], w[1], 19 );
404
405 return 0;
406}
407
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100408/*
409 * Set decryption key
410 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000411int mbedtls_aria_setkey_dec(mbedtls_aria_context *ctx,
412 const unsigned char *key, unsigned int keybits)
413{
414 int i, j, k, ret;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000415
416 ret = mbedtls_aria_setkey_enc( ctx, key, keybits );
417 if( ret != 0 )
418 return ret;
419
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100420 /* flip the order of round keys */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000421 for( i = 0, j = ctx->nr; i < j; i++, j-- )
422 {
423 for( k = 0; k < 4; k++ )
424 {
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100425 uint32_t t = ctx->rk[i][k];
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000426 ctx->rk[i][k] = ctx->rk[j][k];
427 ctx->rk[j][k] = t;
428 }
429 }
430
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100431 /* apply affine transform to middle keys */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000432 for (i = 1; i < ctx->nr; i++ )
Manuel Pégourié-Gonnarde1ad7492018-02-20 13:59:05 +0100433 ARIA_A( ctx->rk[i][0], ctx->rk[i][1], ctx->rk[i][2], ctx->rk[i][3] );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000434
435 return 0;
436}
437
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100438/*
439 * Encrypt a block
440 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000441int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx,
442 int mode,
443 const unsigned char input[16],
444 unsigned char output[16] )
445{
446 int i;
447
448 uint32_t a, b, c, d;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000449
450 ( (void) mode );
451
452 GET_UINT32_LE( a, input, 0 );
453 GET_UINT32_LE( b, input, 4 );
454 GET_UINT32_LE( c, input, 8 );
455 GET_UINT32_LE( d, input, 12 );
456
457 i = 0;
458 while (1)
459 {
460 a ^= ctx->rk[i][0];
461 b ^= ctx->rk[i][1];
462 c ^= ctx->rk[i][2];
463 d ^= ctx->rk[i][3];
464 i++;
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100465 aria_sla( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000466
467 a ^= ctx->rk[i][0];
468 b ^= ctx->rk[i][1];
469 c ^= ctx->rk[i][2];
470 d ^= ctx->rk[i][3];
471 i++;
472 if (i >= ctx->nr)
473 break;
474
Manuel Pégourié-Gonnard8c76a942018-02-21 12:03:22 +0100475 aria_sla( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000476 }
477
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100478 /* final substitution */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000479 a = ctx->rk[i][0] ^
480 ( (uint32_t) aria_is1[ a & 0xFF]) ^
481 (((uint32_t) aria_is2[(a >> 8) & 0xFF]) << 8) ^
482 (((uint32_t) aria_sb1[(a >> 16) & 0xFF]) << 16) ^
483 (((uint32_t) aria_sb2[ a >> 24 ]) << 24);
484
485 b = ctx->rk[i][1] ^
486 ( (uint32_t) aria_is1[ b & 0xFF]) ^
487 (((uint32_t) aria_is2[(b >> 8) & 0xFF]) << 8) ^
488 (((uint32_t) aria_sb1[(b >> 16) & 0xFF]) << 16) ^
489 (((uint32_t) aria_sb2[ b >> 24 ]) << 24);
490
491 c = ctx->rk[i][2] ^
492 ( (uint32_t) aria_is1[ c & 0xFF]) ^
493 (((uint32_t) aria_is2[(c >> 8) & 0xFF]) << 8) ^
494 (((uint32_t) aria_sb1[(c >> 16) & 0xFF]) << 16) ^
495 (((uint32_t) aria_sb2[ c >> 24 ]) << 24);
496
497 d = ctx->rk[i][3] ^
498 ( (uint32_t) aria_is1[ d & 0xFF]) ^
499 (((uint32_t) aria_is2[(d >> 8) & 0xFF]) << 8) ^
500 (((uint32_t) aria_sb1[(d >> 16) & 0xFF]) << 16) ^
501 (((uint32_t) aria_sb2[ d >> 24 ]) << 24);
502
503 PUT_UINT32_LE( a, output, 0 );
504 PUT_UINT32_LE( b, output, 4 );
505 PUT_UINT32_LE( c, output, 8 );
506 PUT_UINT32_LE( d, output, 12 );
507
508 return 0;
509}
510
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100511/* Initialize context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000512void mbedtls_aria_init( mbedtls_aria_context *ctx )
513{
514 memset( ctx, 0, sizeof( mbedtls_aria_context ) );
515}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000516
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100517/* Clear context */
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000518void mbedtls_aria_free( mbedtls_aria_context *ctx )
519{
520 if( ctx == NULL )
521 return;
522
Manuel Pégourié-Gonnard56453932018-02-21 10:08:31 +0100523 mbedtls_zeroize( ctx, sizeof( mbedtls_aria_context ) );
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000524}
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000525
526#if defined(MBEDTLS_CIPHER_MODE_CBC)
527/*
528 * ARIA-CBC buffer encryption/decryption
529 */
530int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx,
531 int mode,
532 size_t length,
533 unsigned char iv[16],
534 const unsigned char *input,
535 unsigned char *output )
536{
537 int i;
538 unsigned char temp[16];
539
540 if( length % 16 )
541 return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH );
542
543 if( mode == MBEDTLS_ARIA_DECRYPT )
544 {
545 while( length > 0 )
546 {
547 memcpy( temp, input, 16 );
548 mbedtls_aria_crypt_ecb( ctx, mode, input, output );
549
550 for( i = 0; i < 16; i++ )
551 output[i] = (unsigned char)( output[i] ^ iv[i] );
552
553 memcpy( iv, temp, 16 );
554
555 input += 16;
556 output += 16;
557 length -= 16;
558 }
559 }
560 else
561 {
562 while( length > 0 )
563 {
564 for( i = 0; i < 16; i++ )
565 output[i] = (unsigned char)( input[i] ^ iv[i] );
566
567 mbedtls_aria_crypt_ecb( ctx, mode, output, output );
568 memcpy( iv, output, 16 );
569
570 input += 16;
571 output += 16;
572 length -= 16;
573 }
574 }
575
576 return( 0 );
577}
578#endif /* MBEDTLS_CIPHER_MODE_CBC */
579
580#if defined(MBEDTLS_CIPHER_MODE_CFB)
581/*
582 * ARIA-CFB128 buffer encryption/decryption
583 */
584int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx,
585 int mode,
586 size_t length,
587 size_t *iv_off,
588 unsigned char iv[16],
589 const unsigned char *input,
590 unsigned char *output )
591{
592 int c;
593 size_t n = *iv_off;
594
595 if( mode == MBEDTLS_ARIA_DECRYPT )
596 {
597 while( length-- )
598 {
599 if( n == 0 )
600 mbedtls_aria_crypt_ecb( ctx, MBEDTLS_ARIA_ENCRYPT, iv, iv );
601
602 c = *input++;
603 *output++ = (unsigned char)( c ^ iv[n] );
604 iv[n] = (unsigned char) c;
605
606 n = ( n + 1 ) & 0x0F;
607 }
608 }
609 else
610 {
611 while( length-- )
612 {
613 if( n == 0 )
614 mbedtls_aria_crypt_ecb( ctx, MBEDTLS_ARIA_ENCRYPT, iv, iv );
615
616 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
617
618 n = ( n + 1 ) & 0x0F;
619 }
620 }
621
622 *iv_off = n;
623
624 return( 0 );
625}
626#endif /* MBEDTLS_CIPHER_MODE_CFB */
627
628#if defined(MBEDTLS_CIPHER_MODE_CTR)
629/*
630 * ARIA-CTR buffer encryption/decryption
631 */
632int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx,
633 size_t length,
634 size_t *nc_off,
635 unsigned char nonce_counter[16],
636 unsigned char stream_block[16],
637 const unsigned char *input,
638 unsigned char *output )
639{
640 int c, i;
641 size_t n = *nc_off;
642
643 while( length-- )
644 {
645 if( n == 0 ) {
646 mbedtls_aria_crypt_ecb( ctx, MBEDTLS_ARIA_ENCRYPT, nonce_counter,
647 stream_block );
648
649 for( i = 16; i > 0; i-- )
650 if( ++nonce_counter[i - 1] != 0 )
651 break;
652 }
653 c = *input++;
654 *output++ = (unsigned char)( c ^ stream_block[n] );
655
656 n = ( n + 1 ) & 0x0F;
657 }
658
659 *nc_off = n;
660
661 return( 0 );
662}
663#endif /* MBEDTLS_CIPHER_MODE_CTR */
664#endif /* !MBEDTLS_ARIA_ALT */
665
666#if defined(MBEDTLS_SELF_TEST)
667
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100668/*
669 * Basic ARIA ECB test vectors from RFC 5794
670 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000671static const uint8_t aria_test1_ecb_key[32] = // test key
672{
673 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit
674 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
675 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit
676 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit
677};
678
679static const uint8_t aria_test1_ecb_pt[16] = // plaintext
680{
681 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all
682 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes
683};
684
685static const uint8_t aria_test1_ecb_ct[3][16] = // ciphertext
686{
687 { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit
688 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 },
689 { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit
690 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 },
691 { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit
692 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC }
693};
694
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100695/*
696 * Mode tests from "Test Vectors for ARIA" Version 1.0
697 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf
698 */
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000699#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000700 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000701static const uint8_t aria_test2_key[32] =
702{
703 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit
704 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
705 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit
706 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit
707};
708
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000709static const uint8_t aria_test2_pt[48] =
710{
711 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all
712 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb,
713 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc,
714 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd,
715 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa,
716 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb,
717};
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000718#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000719
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000720#if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB))
721static const uint8_t aria_test2_iv[16] =
722{
723 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB
724 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV
725};
726#endif
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000727
728#if defined(MBEDTLS_CIPHER_MODE_CBC)
729static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertxt
730{
731 { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key
732 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34,
733 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64,
734 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38,
735 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c,
736 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 },
737 { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key
738 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f,
739 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1,
740 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5,
741 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92,
742 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e },
743 { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key
744 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab,
745 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef,
746 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52,
747 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5,
748 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b }
749};
750#endif /* MBEDTLS_CIPHER_MODE_CBC */
751
752#if defined(MBEDTLS_CIPHER_MODE_CFB)
753static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertxt
754{
755 { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key
756 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00,
757 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a,
758 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01,
759 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96,
760 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b },
761 { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key
762 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c,
763 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94,
764 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59,
765 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86,
766 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b },
767 { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key
768 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35,
769 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70,
770 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa,
771 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c,
772 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 }
773};
774#endif /* MBEDTLS_CIPHER_MODE_CFB */
775
776#if defined(MBEDTLS_CIPHER_MODE_CTR)
777static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertxt
778{
779 { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key
780 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1,
781 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1,
782 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f,
783 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71,
784 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 },
785 { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key
786 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce,
787 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde,
788 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79,
789 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce,
790 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf },
791 { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key
792 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2,
793 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89,
794 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f,
795 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7,
796 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 }
797};
798#endif /* MBEDTLS_CIPHER_MODE_CFB */
799
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000800#define ARIA_SELF_TEST_IF_FAIL \
801 { \
802 if( verbose ) \
803 printf( "failed\n" ); \
804 return( 1 ); \
805 } else { \
806 if( verbose ) \
807 printf( "passed\n" ); \
808 }
809
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100810/*
811 * Checkup routine
812 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000813int mbedtls_aria_self_test( int verbose )
814{
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000815 int i;
816 uint8_t blk[16];
817 mbedtls_aria_context ctx;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000818
Markku-Juhani O. Saarinen6ba68d42017-12-01 14:26:21 +0000819#if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR))
820 size_t j;
Markku-Juhani O. Saarinen3c0b53b2017-11-30 16:00:34 +0000821#endif
822
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000823#if (defined(MBEDTLS_CIPHER_MODE_CBC) || \
824 defined(MBEDTLS_CIPHER_MODE_CFB) || \
825 defined(MBEDTLS_CIPHER_MODE_CTR))
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000826 uint8_t buf[48], iv[16];
827#endif
828
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100829 /*
830 * Test set 1
831 */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000832 for( i = 0; i < 3; i++ )
833 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100834 /* test ECB encryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000835 if( verbose )
836 printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i);
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000837 mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000838 mbedtls_aria_crypt_ecb( &ctx, MBEDTLS_ARIA_ENCRYPT,
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000839 aria_test1_ecb_pt, blk );
840 if( memcmp( blk, aria_test1_ecb_ct[i], 16 ) != 0 )
841 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000842
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100843 /* test ECB decryption */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000844 if( verbose )
845 printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i);
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000846 mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i );
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000847 mbedtls_aria_crypt_ecb( &ctx, MBEDTLS_ARIA_DECRYPT,
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000848 aria_test1_ecb_ct[i], blk );
849 if (memcmp( blk, aria_test1_ecb_pt, 16 ) != 0)
850 ARIA_SELF_TEST_IF_FAIL;
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000851 }
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000852 if( verbose )
853 printf("\n");
854
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100855 /*
856 * Test set 2
857 */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000858#if defined(MBEDTLS_CIPHER_MODE_CBC)
859 for( i = 0; i < 3; i++ )
860 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100861 /* Test CBC encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000862 if( verbose )
863 printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i);
864 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
865 memcpy( iv, aria_test2_iv, 16 );
866 memset( buf, 0x55, sizeof(buf) );
867 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv,
868 aria_test2_pt, buf );
869 if( memcmp( buf, aria_test2_cbc_ct[i], 48 ) != 0 )
870 ARIA_SELF_TEST_IF_FAIL;
871
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100872 /* Test CBC decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000873 if( verbose )
874 printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i);
875 mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i );
876 memcpy( iv, aria_test2_iv, 16 );
877 memset( buf, 0xAA, sizeof(buf) );
878 mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv,
879 aria_test2_cbc_ct[i], buf );
880 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
881 ARIA_SELF_TEST_IF_FAIL;
882 }
883 if( verbose )
884 printf("\n");
885
886#endif /* MBEDTLS_CIPHER_MODE_CBC */
887
888#if defined(MBEDTLS_CIPHER_MODE_CFB)
889 for( i = 0; i < 3; i++ )
890 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100891 /* Test CFB encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000892 if( verbose )
893 printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i);
894 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
895 memcpy( iv, aria_test2_iv, 16 );
896 memset( buf, 0x55, sizeof(buf) );
897 j = 0;
898 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv,
899 aria_test2_pt, buf );
900 if( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 )
901 ARIA_SELF_TEST_IF_FAIL;
902
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100903 /* Test CFB decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000904 if( verbose )
905 printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i);
906 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
907 memcpy( iv, aria_test2_iv, 16 );
908 memset( buf, 0xAA, sizeof(buf) );
909 j = 0;
910 mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j,
911 iv, aria_test2_cfb_ct[i], buf );
912 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
913 ARIA_SELF_TEST_IF_FAIL;
914 }
915 if( verbose )
916 printf("\n");
917#endif /* MBEDTLS_CIPHER_MODE_CFB */
918
919#if defined(MBEDTLS_CIPHER_MODE_CTR)
920 for( i = 0; i < 3; i++ )
921 {
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100922 /* Test CTR encryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000923 if( verbose )
924 printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i);
925 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
926 memset( iv, 0, 16 ); // IV = 0
927 memset( buf, 0x55, sizeof(buf) );
928 j = 0;
929 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
930 aria_test2_pt, buf );
931 if( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 )
932 ARIA_SELF_TEST_IF_FAIL;
933
Manuel Pégourié-Gonnarda41ecda2018-02-21 10:33:26 +0100934 /* Test CTR decryption */
Markku-Juhani O. Saarinen259fa602017-11-30 15:48:37 +0000935 if( verbose )
936 printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i);
937 mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i );
938 memset( iv, 0, 16 ); // IV = 0
939 memset( buf, 0xAA, sizeof(buf) );
940 j = 0;
941 mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk,
942 aria_test2_ctr_ct[i], buf );
943 if( memcmp( buf, aria_test2_pt, 48 ) != 0 )
944 ARIA_SELF_TEST_IF_FAIL;
945 }
946 if( verbose )
947 printf("\n");
948#endif /* MBEDTLS_CIPHER_MODE_CTR */
Markku-Juhani O. Saarinen41efbaa2017-11-30 11:37:55 +0000949
950 return( 0 );
951}
952
953#endif /* MBEDTLS_SELF_TEST */
954
955#endif /* MBEDTLS_ARIA_C */