blob: 9f5724917b544b200d339a35226873a7b4196847 [file] [log] [blame]
Paul Bakker38119b12009-01-10 23:31:23 +00001/*
2 * Camellia implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Bence Szépkútif744bd72020-06-05 13:02:18 +02005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 *
7 * This file is provided under the Apache License 2.0, or the
8 * GNU General Public License v2.0 or later.
9 *
10 * **********
11 * Apache License 2.0:
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +020012 *
13 * Licensed under the Apache License, Version 2.0 (the "License"); you may
14 * not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 * http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000024 *
Bence Szépkútif744bd72020-06-05 13:02:18 +020025 * **********
26 *
27 * **********
28 * GNU General Public License v2.0 or later:
29 *
30 * This program is free software; you can redistribute it and/or modify
31 * it under the terms of the GNU General Public License as published by
32 * the Free Software Foundation; either version 2 of the License, or
33 * (at your option) any later version.
34 *
35 * This program is distributed in the hope that it will be useful,
36 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38 * GNU General Public License for more details.
39 *
40 * You should have received a copy of the GNU General Public License along
41 * with this program; if not, write to the Free Software Foundation, Inc.,
42 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
43 *
44 * **********
45 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000046 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker38119b12009-01-10 23:31:23 +000047 */
48/*
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000049 * The Camellia block cipher was designed by NTT and Mitsubishi Electric
50 * Corporation.
Paul Bakker38119b12009-01-10 23:31:23 +000051 *
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000052 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
Paul Bakker38119b12009-01-10 23:31:23 +000053 */
54
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000056#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020057#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020058#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020059#endif
Paul Bakker38119b12009-01-10 23:31:23 +000060
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020061#if defined(MBEDTLS_CAMELLIA_C)
Paul Bakker38119b12009-01-10 23:31:23 +000062
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000063#include "mbedtls/camellia.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050064#include "mbedtls/platform_util.h"
Paul Bakker38119b12009-01-10 23:31:23 +000065
Rich Evans00ab4702015-02-06 13:43:58 +000066#include <string.h>
Manuel Pégourié-Gonnard394608e2015-02-17 16:01:07 +010067
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020068#if defined(MBEDTLS_SELF_TEST)
69#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000070#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010071#else
Rich Evans00ab4702015-02-06 13:43:58 +000072#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020073#define mbedtls_printf printf
74#endif /* MBEDTLS_PLATFORM_C */
75#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010076
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020077#if !defined(MBEDTLS_CAMELLIA_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020078
Hanno Beckerb4b7fb72018-12-12 18:02:06 +000079/* Parameter validation macros */
80#define CAMELLIA_VALIDATE_RET( cond ) \
81 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA )
82#define CAMELLIA_VALIDATE( cond ) \
83 MBEDTLS_INTERNAL_VALIDATE( cond )
84
Paul Bakker38119b12009-01-10 23:31:23 +000085/*
86 * 32-bit integer manipulation macros (big endian)
87 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000088#ifndef GET_UINT32_BE
89#define GET_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000090{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000091 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
92 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
93 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
94 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker38119b12009-01-10 23:31:23 +000095}
96#endif
97
Paul Bakker5c2364c2012-10-01 14:41:15 +000098#ifndef PUT_UINT32_BE
99#define PUT_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +0000100{ \
101 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
102 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
103 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
104 (b)[(i) + 3] = (unsigned char) ( (n) ); \
105}
106#endif
107
108static const unsigned char SIGMA_CHARS[6][8] =
109{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000110 { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
111 { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
112 { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
113 { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
114 { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
115 { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
Paul Bakker38119b12009-01-10 23:31:23 +0000116};
117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200118#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
Paul Bakkerfa049db2009-01-12 22:12:03 +0000119
120static const unsigned char FSb[256] =
Paul Bakker38119b12009-01-10 23:31:23 +0000121{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000122 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
123 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
124 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
125 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
126 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
127 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
128 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
129 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
130 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
131 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
132 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
133 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
134 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
135 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
136 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
137 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
Paul Bakker38119b12009-01-10 23:31:23 +0000138};
139
140#define SBOX1(n) FSb[(n)]
141#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
142#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
Paul Bakkerfa049db2009-01-12 22:12:03 +0000143#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
144
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200145#else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000146
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000147static const unsigned char FSb[256] =
148{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200149 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65,
150 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189,
151 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26,
152 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77,
153 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153,
154 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215,
155 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
156 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80,
157 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210,
158 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148,
159 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226,
160 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46,
161 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89,
162 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
163 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164,
164 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000165};
166
167static const unsigned char FSb2[256] =
168{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200169 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
170 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
171 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
172 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
173 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
174 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
175 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
176 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
177 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
178 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
179 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
180 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
181 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
182 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
183 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
184 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000185};
186
187static const unsigned char FSb3[256] =
188{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200189 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
190 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
191 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
192 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
193 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
194 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
195 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
196 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
197 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
198 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
199 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
200 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
201 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
202 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
203 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
204 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000205};
206
207static const unsigned char FSb4[256] =
208{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200209 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
210 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
211 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
212 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
213 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
214 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
215 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
216 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
217 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
218 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
219 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
220 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
221 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
222 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
223 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
224 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000225};
226
227#define SBOX1(n) FSb[(n)]
228#define SBOX2(n) FSb2[(n)]
229#define SBOX3(n) FSb3[(n)]
230#define SBOX4(n) FSb4[(n)]
Paul Bakker38119b12009-01-10 23:31:23 +0000231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200232#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000233
Paul Bakker38119b12009-01-10 23:31:23 +0000234static const unsigned char shifts[2][4][4] =
235{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000236 {
237 { 1, 1, 1, 1 }, /* KL */
238 { 0, 0, 0, 0 }, /* KR */
239 { 1, 1, 1, 1 }, /* KA */
240 { 0, 0, 0, 0 } /* KB */
241 },
242 {
243 { 1, 0, 1, 1 }, /* KL */
244 { 1, 1, 0, 1 }, /* KR */
245 { 1, 1, 1, 0 }, /* KA */
246 { 1, 1, 0, 1 } /* KB */
247 }
Paul Bakker38119b12009-01-10 23:31:23 +0000248};
249
Paul Bakker026c03b2009-03-28 17:53:03 +0000250static const signed char indexes[2][4][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000251{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000252 {
253 { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39,
254 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
255 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
256 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
257 { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17,
258 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
259 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
260 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */
261 },
262 {
263 { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1,
264 -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
265 { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17,
266 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
267 { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
268 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
269 { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21,
270 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */
271 }
Paul Bakker38119b12009-01-10 23:31:23 +0000272};
273
Paul Bakker026c03b2009-03-28 17:53:03 +0000274static const signed char transposes[2][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000275{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000276 {
277 21, 22, 23, 20,
278 -1, -1, -1, -1,
279 18, 19, 16, 17,
280 11, 8, 9, 10,
281 15, 12, 13, 14
282 },
283 {
284 25, 26, 27, 24,
285 29, 30, 31, 28,
286 18, 19, 16, 17,
287 -1, -1, -1, -1,
288 -1, -1, -1, -1
289 }
Paul Bakker38119b12009-01-10 23:31:23 +0000290};
291
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000292/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000293#define ROTL(DEST, SRC, SHIFT) \
294{ \
295 (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \
296 (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \
297 (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \
298 (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \
Paul Bakker38119b12009-01-10 23:31:23 +0000299}
300
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000301#define FL(XL, XR, KL, KR) \
302{ \
303 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
304 (XL) = ((XR) | (KR)) ^ (XL); \
Paul Bakker38119b12009-01-10 23:31:23 +0000305}
Paul Bakker9af723c2014-05-01 13:03:14 +0200306
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000307#define FLInv(YL, YR, KL, KR) \
308{ \
309 (YL) = ((YR) | (KR)) ^ (YL); \
310 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
Paul Bakker38119b12009-01-10 23:31:23 +0000311}
Paul Bakker9af723c2014-05-01 13:03:14 +0200312
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000313#define SHIFT_AND_PLACE(INDEX, OFFSET) \
314{ \
315 TK[0] = KC[(OFFSET) * 4 + 0]; \
316 TK[1] = KC[(OFFSET) * 4 + 1]; \
317 TK[2] = KC[(OFFSET) * 4 + 2]; \
318 TK[3] = KC[(OFFSET) * 4 + 3]; \
319 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200320 for( i = 1; i <= 4; i++ ) \
321 if( shifts[(INDEX)][(OFFSET)][i -1] ) \
322 ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000323 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200324 for( i = 0; i < 20; i++ ) \
325 if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
326 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
327 } \
Paul Bakker38119b12009-01-10 23:31:23 +0000328}
329
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200330static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
331 uint32_t z[2])
Paul Bakker38119b12009-01-10 23:31:23 +0000332{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000333 uint32_t I0, I1;
334 I0 = x[0] ^ k[0];
335 I1 = x[1] ^ k[1];
Paul Bakker38119b12009-01-10 23:31:23 +0000336
Manuel Pégourié-Gonnardb31b61b2014-11-10 13:05:43 +0100337 I0 = ((uint32_t) SBOX1((I0 >> 24) & 0xFF) << 24) |
338 ((uint32_t) SBOX2((I0 >> 16) & 0xFF) << 16) |
339 ((uint32_t) SBOX3((I0 >> 8) & 0xFF) << 8) |
340 ((uint32_t) SBOX4((I0 ) & 0xFF) );
341 I1 = ((uint32_t) SBOX2((I1 >> 24) & 0xFF) << 24) |
342 ((uint32_t) SBOX3((I1 >> 16) & 0xFF) << 16) |
343 ((uint32_t) SBOX4((I1 >> 8) & 0xFF) << 8) |
344 ((uint32_t) SBOX1((I1 ) & 0xFF) );
Paul Bakker38119b12009-01-10 23:31:23 +0000345
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000346 I0 ^= (I1 << 8) | (I1 >> 24);
347 I1 ^= (I0 << 16) | (I0 >> 16);
348 I0 ^= (I1 >> 8) | (I1 << 24);
349 I1 ^= (I0 >> 8) | (I0 << 24);
Paul Bakker38119b12009-01-10 23:31:23 +0000350
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000351 z[0] ^= I1;
352 z[1] ^= I0;
Paul Bakker38119b12009-01-10 23:31:23 +0000353}
354
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200355void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200356{
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000357 CAMELLIA_VALIDATE( ctx != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200358 memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200359}
360
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200362{
363 if( ctx == NULL )
364 return;
365
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500366 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200367}
368
Paul Bakker38119b12009-01-10 23:31:23 +0000369/*
370 * Camellia key schedule (encryption)
371 */
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000372int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx,
373 const unsigned char *key,
374 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000375{
Paul Bakker23986e52011-04-24 08:57:21 +0000376 int idx;
377 size_t i;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000378 uint32_t *RK;
Paul Bakker38119b12009-01-10 23:31:23 +0000379 unsigned char t[64];
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000380 uint32_t SIGMA[6][2];
381 uint32_t KC[16];
382 uint32_t TK[20];
Hanno Becker70ded362018-12-19 13:42:05 +0000383
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000384 CAMELLIA_VALIDATE_RET( ctx != NULL );
385 CAMELLIA_VALIDATE_RET( key != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000386
387 RK = ctx->rk;
388
Paul Bakker66d5d072014-06-17 16:39:18 +0200389 memset( t, 0, 64 );
390 memset( RK, 0, sizeof(ctx->rk) );
Paul Bakker38119b12009-01-10 23:31:23 +0000391
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200392 switch( keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000393 {
394 case 128: ctx->nr = 3; idx = 0; break;
395 case 192:
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000396 case 256: ctx->nr = 4; idx = 1; break;
Hanno Becker4c029d02018-12-17 13:20:05 +0000397 default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000398 }
399
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200400 for( i = 0; i < keybits / 8; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000401 t[i] = key[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000402
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200403 if( keybits == 192 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200404 for( i = 0; i < 8; i++ )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000405 t[24 + i] = ~t[16 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000406 }
407
Paul Bakker38119b12009-01-10 23:31:23 +0000408 /*
409 * Prepare SIGMA values
410 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200411 for( i = 0; i < 6; i++ ) {
412 GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 );
413 GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000414 }
415
416 /*
417 * Key storage in KC
418 * Order: KL, KR, KA, KB
419 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200420 memset( KC, 0, sizeof(KC) );
Paul Bakker38119b12009-01-10 23:31:23 +0000421
422 /* Store KL, KR */
Paul Bakker66d5d072014-06-17 16:39:18 +0200423 for( i = 0; i < 8; i++ )
424 GET_UINT32_BE( KC[i], t, i * 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000425
426 /* Generate KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200427 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000428 KC[8 + i] = KC[i] ^ KC[4 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000429
Paul Bakker66d5d072014-06-17 16:39:18 +0200430 camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
431 camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000432
Paul Bakker66d5d072014-06-17 16:39:18 +0200433 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000434 KC[8 + i] ^= KC[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000435
Paul Bakker66d5d072014-06-17 16:39:18 +0200436 camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
437 camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000438
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200439 if( keybits > 128 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000440 /* Generate KB */
Paul Bakker66d5d072014-06-17 16:39:18 +0200441 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000442 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000443
Paul Bakker66d5d072014-06-17 16:39:18 +0200444 camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
445 camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000446 }
447
448 /*
449 * Generating subkeys
Paul Bakker9af723c2014-05-01 13:03:14 +0200450 */
Paul Bakker38119b12009-01-10 23:31:23 +0000451
452 /* Manipulating KL */
Paul Bakker66d5d072014-06-17 16:39:18 +0200453 SHIFT_AND_PLACE( idx, 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000454
455 /* Manipulating KR */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200456 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200457 SHIFT_AND_PLACE( idx, 1 );
Paul Bakker38119b12009-01-10 23:31:23 +0000458 }
459
460 /* Manipulating KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200461 SHIFT_AND_PLACE( idx, 2 );
Paul Bakker38119b12009-01-10 23:31:23 +0000462
463 /* Manipulating KB */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200464 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200465 SHIFT_AND_PLACE( idx, 3 );
Paul Bakker38119b12009-01-10 23:31:23 +0000466 }
467
468 /* Do transpositions */
Paul Bakker66d5d072014-06-17 16:39:18 +0200469 for( i = 0; i < 20; i++ ) {
470 if( transposes[idx][i] != -1 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000471 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
472 }
Paul Bakker38119b12009-01-10 23:31:23 +0000473 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000474
475 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000476}
477
478/*
479 * Camellia key schedule (decryption)
480 */
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000481int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx,
482 const unsigned char *key,
483 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000484{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200485 int idx, ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000486 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200487 mbedtls_camellia_context cty;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000488 uint32_t *RK;
489 uint32_t *SK;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000490 CAMELLIA_VALIDATE_RET( ctx != NULL );
491 CAMELLIA_VALIDATE_RET( key != NULL );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200492
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493 mbedtls_camellia_init( &cty );
Paul Bakker38119b12009-01-10 23:31:23 +0000494
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200495 /* Also checks keybits */
496 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200497 goto exit;
Paul Bakker38119b12009-01-10 23:31:23 +0000498
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200499 ctx->nr = cty.nr;
500 idx = ( ctx->nr == 4 );
501
502 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000503 SK = cty.rk + 24 * 2 + 8 * idx * 2;
504
505 *RK++ = *SK++;
506 *RK++ = *SK++;
507 *RK++ = *SK++;
508 *RK++ = *SK++;
509
Paul Bakker66d5d072014-06-17 16:39:18 +0200510 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
Paul Bakker38119b12009-01-10 23:31:23 +0000511 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000512 *RK++ = *SK++;
513 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000514 }
515
516 SK -= 2;
517
518 *RK++ = *SK++;
519 *RK++ = *SK++;
520 *RK++ = *SK++;
521 *RK++ = *SK++;
522
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200523exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200524 mbedtls_camellia_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000525
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200526 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000527}
528
529/*
530 * Camellia-ECB block encryption/decryption
531 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200532int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000533 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000534 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000535 unsigned char output[16] )
536{
Paul Bakker026c03b2009-03-28 17:53:03 +0000537 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000538 uint32_t *RK, X[4];
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000539 CAMELLIA_VALIDATE_RET( ctx != NULL );
540 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
541 mode == MBEDTLS_CAMELLIA_DECRYPT );
542 CAMELLIA_VALIDATE_RET( input != NULL );
543 CAMELLIA_VALIDATE_RET( output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000544
Paul Bakkerc2547b02009-07-20 20:40:52 +0000545 ( (void) mode );
546
Paul Bakker38119b12009-01-10 23:31:23 +0000547 NR = ctx->nr;
548 RK = ctx->rk;
549
Paul Bakker5c2364c2012-10-01 14:41:15 +0000550 GET_UINT32_BE( X[0], input, 0 );
551 GET_UINT32_BE( X[1], input, 4 );
552 GET_UINT32_BE( X[2], input, 8 );
553 GET_UINT32_BE( X[3], input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000554
555 X[0] ^= *RK++;
556 X[1] ^= *RK++;
557 X[2] ^= *RK++;
558 X[3] ^= *RK++;
559
Paul Bakker66d5d072014-06-17 16:39:18 +0200560 while( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000561 --NR;
Paul Bakker66d5d072014-06-17 16:39:18 +0200562 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000563 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200564 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000565 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200566 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000567 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200568 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000569 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200570 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000571 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200572 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000573 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000574
Paul Bakker66d5d072014-06-17 16:39:18 +0200575 if( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000576 FL(X[0], X[1], RK[0], RK[1]);
577 RK += 2;
578 FLInv(X[2], X[3], RK[0], RK[1]);
579 RK += 2;
580 }
Paul Bakker38119b12009-01-10 23:31:23 +0000581 }
582
583 X[2] ^= *RK++;
584 X[3] ^= *RK++;
585 X[0] ^= *RK++;
586 X[1] ^= *RK++;
587
Paul Bakker5c2364c2012-10-01 14:41:15 +0000588 PUT_UINT32_BE( X[2], output, 0 );
589 PUT_UINT32_BE( X[3], output, 4 );
590 PUT_UINT32_BE( X[0], output, 8 );
591 PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000592
593 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000594}
595
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200596#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000597/*
598 * Camellia-CBC buffer encryption/decryption
599 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200600int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
Hanno Becker70ded362018-12-19 13:42:05 +0000601 int mode,
602 size_t length,
603 unsigned char iv[16],
604 const unsigned char *input,
605 unsigned char *output )
Paul Bakker38119b12009-01-10 23:31:23 +0000606{
607 int i;
608 unsigned char temp[16];
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000609 CAMELLIA_VALIDATE_RET( ctx != NULL );
610 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
611 mode == MBEDTLS_CAMELLIA_DECRYPT );
612 CAMELLIA_VALIDATE_RET( iv != NULL );
613 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
614 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000615
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000616 if( length % 16 )
Hanno Becker938f9e92018-12-18 09:40:25 +0000617 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000618
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200619 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000620 {
621 while( length > 0 )
622 {
623 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200624 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000625
626 for( i = 0; i < 16; i++ )
627 output[i] = (unsigned char)( output[i] ^ iv[i] );
628
629 memcpy( iv, temp, 16 );
630
631 input += 16;
632 output += 16;
633 length -= 16;
634 }
635 }
636 else
637 {
638 while( length > 0 )
639 {
640 for( i = 0; i < 16; i++ )
641 output[i] = (unsigned char)( input[i] ^ iv[i] );
642
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200643 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000644 memcpy( iv, output, 16 );
645
646 input += 16;
647 output += 16;
648 length -= 16;
649 }
650 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000651
652 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000653}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200654#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000655
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200656#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000657/*
658 * Camellia-CFB128 buffer encryption/decryption
659 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000661 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000662 size_t length,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000663 size_t *iv_off,
Paul Bakker38119b12009-01-10 23:31:23 +0000664 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000665 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000666 unsigned char *output )
667{
Paul Bakker1ef71df2011-06-09 14:14:58 +0000668 int c;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000669 size_t n;
670 CAMELLIA_VALIDATE_RET( ctx != NULL );
671 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
672 mode == MBEDTLS_CAMELLIA_DECRYPT );
673 CAMELLIA_VALIDATE_RET( iv != NULL );
674 CAMELLIA_VALIDATE_RET( iv_off != NULL );
675 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
676 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
677
678 n = *iv_off;
679 if( n >= 16 )
680 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000681
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000683 {
684 while( length-- )
685 {
686 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200687 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000688
689 c = *input++;
690 *output++ = (unsigned char)( c ^ iv[n] );
691 iv[n] = (unsigned char) c;
692
Paul Bakker66d5d072014-06-17 16:39:18 +0200693 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000694 }
695 }
696 else
697 {
698 while( length-- )
699 {
700 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200701 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000702
703 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
704
Paul Bakker66d5d072014-06-17 16:39:18 +0200705 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000706 }
707 }
708
709 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000710
711 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000712}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200713#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000714
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000716/*
717 * Camellia-CTR buffer encryption/decryption
718 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200719int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000720 size_t length,
721 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000722 unsigned char nonce_counter[16],
723 unsigned char stream_block[16],
724 const unsigned char *input,
725 unsigned char *output )
726{
Paul Bakker369e14b2012-04-18 14:16:09 +0000727 int c, i;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000728 size_t n;
729 CAMELLIA_VALIDATE_RET( ctx != NULL );
730 CAMELLIA_VALIDATE_RET( nonce_counter != NULL );
731 CAMELLIA_VALIDATE_RET( stream_block != NULL );
732 CAMELLIA_VALIDATE_RET( nc_off != NULL );
733 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
734 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
735
736 n = *nc_off;
737 if( n >= 16 )
738 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000739
740 while( length-- )
741 {
742 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200743 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200744 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000745
Paul Bakker369e14b2012-04-18 14:16:09 +0000746 for( i = 16; i > 0; i-- )
747 if( ++nonce_counter[i - 1] != 0 )
748 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000749 }
750 c = *input++;
751 *output++ = (unsigned char)( c ^ stream_block[n] );
752
Paul Bakker66d5d072014-06-17 16:39:18 +0200753 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000754 }
755
756 *nc_off = n;
757
758 return( 0 );
759}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760#endif /* MBEDTLS_CIPHER_MODE_CTR */
761#endif /* !MBEDTLS_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000762
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200763#if defined(MBEDTLS_SELF_TEST)
Paul Bakker38119b12009-01-10 23:31:23 +0000764
Paul Bakker38119b12009-01-10 23:31:23 +0000765/*
766 * Camellia test vectors from:
767 *
768 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
769 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
770 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000771 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000772 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000773#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000774
775static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
776{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000777 {
778 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
779 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200780 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000781 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
782 },
783 {
784 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
785 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
786 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200787 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
790 },
791 {
792 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
793 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
794 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
795 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200796 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000797 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
799 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
800 },
Paul Bakker38119b12009-01-10 23:31:23 +0000801};
802
803static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
804{
805 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
806 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200807 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
809};
810
811static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
812{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000813 {
814 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
815 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
816 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
817 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
818 },
819 {
820 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
821 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
822 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
823 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
824 },
825 {
826 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
827 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
828 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
829 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
830 }
Paul Bakker38119b12009-01-10 23:31:23 +0000831};
832
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200833#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000834#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000835
836static const unsigned char camellia_test_cbc_key[3][32] =
837{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000838 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
839 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
840 ,
841 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
842 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
843 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
844 ,
845 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
846 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
847 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
848 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000849};
850
851static const unsigned char camellia_test_cbc_iv[16] =
852
853 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
854 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
855;
856
857static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
858{
859 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
860 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
861 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
862 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
863 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
864 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
865
866};
867
868static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
869{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000870 {
871 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
872 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
873 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
874 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
875 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
876 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
877 },
878 {
879 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
880 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
881 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
882 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
883 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
884 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
885 },
886 {
887 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
888 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
889 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
890 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
891 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
892 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
893 }
Paul Bakker38119b12009-01-10 23:31:23 +0000894};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200895#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000896
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200897#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000898/*
899 * Camellia-CTR test vectors from:
900 *
901 * http://www.faqs.org/rfcs/rfc5528.html
902 */
903
904static const unsigned char camellia_test_ctr_key[3][16] =
905{
906 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
907 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
908 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
909 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
910 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
911 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
912};
913
914static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
915{
916 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
918 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
919 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
920 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
921 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
922};
923
924static const unsigned char camellia_test_ctr_pt[3][48] =
925{
926 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
927 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
928
929 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
930 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
931 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
932 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
933
934 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
935 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
936 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
937 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
938 0x20, 0x21, 0x22, 0x23 }
939};
940
941static const unsigned char camellia_test_ctr_ct[3][48] =
942{
943 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
944 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
945 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
946 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
947 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
948 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
949 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
950 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
951 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
952 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
953 0xDF, 0x50, 0x86, 0x96 }
954};
955
956static const int camellia_test_ctr_len[3] =
957 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200958#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000959
960/*
961 * Checkup routine
962 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200963int mbedtls_camellia_self_test( int verbose )
Paul Bakker38119b12009-01-10 23:31:23 +0000964{
Paul Bakker026c03b2009-03-28 17:53:03 +0000965 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000966 unsigned char key[32];
967 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000968 unsigned char src[16];
969 unsigned char dst[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200970#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000971 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200972#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200973#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000974 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000975 unsigned char nonce_counter[16];
976 unsigned char stream_block[16];
977#endif
978
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200979 mbedtls_camellia_context ctx;
Paul Bakker38119b12009-01-10 23:31:23 +0000980
981 memset( key, 0, 32 );
982
Paul Bakker66d5d072014-06-17 16:39:18 +0200983 for( j = 0; j < 6; j++ ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000984 u = j >> 1;
985 v = j & 1;
Paul Bakker38119b12009-01-10 23:31:23 +0000986
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000987 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200988 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
989 (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
Paul Bakker38119b12009-01-10 23:31:23 +0000990
Paul Bakker66d5d072014-06-17 16:39:18 +0200991 for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
992 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000993
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
995 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200996 memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
997 memcpy( dst, camellia_test_ecb_plain[i], 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200998 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
999 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +02001000 memcpy( src, camellia_test_ecb_plain[i], 16 );
1001 memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001002 }
Paul Bakker38119b12009-01-10 23:31:23 +00001003
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001004 mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
Paul Bakker38119b12009-01-10 23:31:23 +00001005
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001006 if( memcmp( buf, dst, 16 ) != 0 )
1007 {
1008 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001009 mbedtls_printf( "failed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001010
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001011 return( 1 );
1012 }
1013 }
Paul Bakker38119b12009-01-10 23:31:23 +00001014
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001015 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001016 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001017 }
1018
1019 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001020 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001021
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +00001023 /*
1024 * CBC mode
1025 */
1026 for( j = 0; j < 6; j++ )
1027 {
1028 u = j >> 1;
1029 v = j & 1;
1030
1031 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
1033 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +00001034
Janos Follath98e28a72016-05-31 14:03:54 +01001035 memcpy( src, camellia_test_cbc_iv, 16 );
1036 memcpy( dst, camellia_test_cbc_iv, 16 );
1037 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +00001038
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001039 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Janos Follath98e28a72016-05-31 14:03:54 +01001040 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
1041 } else {
1042 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001043 }
Paul Bakker38119b12009-01-10 23:31:23 +00001044
Janos Follath98e28a72016-05-31 14:03:54 +01001045 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +00001046
Janos Follath98e28a72016-05-31 14:03:54 +01001047 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
1048 memcpy( iv , src, 16 );
1049 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
1050 memcpy( dst, camellia_test_cbc_plain[i], 16 );
1051 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
1052 memcpy( iv , dst, 16 );
1053 memcpy( src, camellia_test_cbc_plain[i], 16 );
1054 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
1055 }
Paul Bakker38119b12009-01-10 23:31:23 +00001056
Janos Follath98e28a72016-05-31 14:03:54 +01001057 mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
1058
1059 if( memcmp( buf, dst, 16 ) != 0 )
1060 {
1061 if( verbose != 0 )
1062 mbedtls_printf( "failed\n" );
1063
1064 return( 1 );
1065 }
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001066 }
Paul Bakker38119b12009-01-10 23:31:23 +00001067
1068 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001069 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001070 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001071#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +00001072
1073 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001074 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001075
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001076#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001077 /*
1078 * CTR mode
1079 */
1080 for( i = 0; i < 6; i++ )
1081 {
1082 u = i >> 1;
1083 v = i & 1;
1084
1085 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001086 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
1087 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001088
1089 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1090 memcpy( key, camellia_test_ctr_key[u], 16 );
1091
1092 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001093 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001094
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001095 if( v == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001096 {
1097 len = camellia_test_ctr_len[u];
1098 memcpy( buf, camellia_test_ctr_ct[u], len );
1099
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001100 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001101 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001102
1103 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1104 {
1105 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001107
1108 return( 1 );
1109 }
1110 }
1111 else
1112 {
1113 len = camellia_test_ctr_len[u];
1114 memcpy( buf, camellia_test_ctr_pt[u], len );
1115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001116 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001117 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001118
1119 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1120 {
1121 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001122 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001123
1124 return( 1 );
1125 }
1126 }
1127
1128 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001129 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001130 }
1131
1132 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001133 mbedtls_printf( "\n" );
1134#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001135
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001136 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +00001137}
1138
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001139#endif /* MBEDTLS_SELF_TEST */
Paul Bakker38119b12009-01-10 23:31:23 +00001140
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001141#endif /* MBEDTLS_CAMELLIA_C */