blob: 6cf265e5789c5e3431e4d8fe86bce924f2f69f2f [file] [log] [blame]
Paul Bakker38119b12009-01-10 23:31:23 +00001/*
2 * Camellia implementation
3 *
Bence Szépkútia2947ac2020-08-19 16:37:36 +02004 * Copyright The Mbed TLS Contributors
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 * **********
Paul Bakker38119b12009-01-10 23:31:23 +000045 */
46/*
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000047 * The Camellia block cipher was designed by NTT and Mitsubishi Electric
48 * Corporation.
Paul Bakker38119b12009-01-10 23:31:23 +000049 *
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000050 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
Paul Bakker38119b12009-01-10 23:31:23 +000051 */
52
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000054#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020055#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020056#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020057#endif
Paul Bakker38119b12009-01-10 23:31:23 +000058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020059#if defined(MBEDTLS_CAMELLIA_C)
Paul Bakker38119b12009-01-10 23:31:23 +000060
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000061#include "mbedtls/camellia.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050062#include "mbedtls/platform_util.h"
Paul Bakker38119b12009-01-10 23:31:23 +000063
Rich Evans00ab4702015-02-06 13:43:58 +000064#include <string.h>
Manuel Pégourié-Gonnard394608e2015-02-17 16:01:07 +010065
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020066#if defined(MBEDTLS_SELF_TEST)
67#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000068#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010069#else
Rich Evans00ab4702015-02-06 13:43:58 +000070#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020071#define mbedtls_printf printf
72#endif /* MBEDTLS_PLATFORM_C */
73#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010074
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020075#if !defined(MBEDTLS_CAMELLIA_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020076
Hanno Beckerb4b7fb72018-12-12 18:02:06 +000077/* Parameter validation macros */
78#define CAMELLIA_VALIDATE_RET( cond ) \
79 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA )
80#define CAMELLIA_VALIDATE( cond ) \
81 MBEDTLS_INTERNAL_VALIDATE( cond )
82
Paul Bakker38119b12009-01-10 23:31:23 +000083/*
84 * 32-bit integer manipulation macros (big endian)
85 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000086#ifndef GET_UINT32_BE
87#define GET_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000088{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000089 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
90 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
91 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
92 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker38119b12009-01-10 23:31:23 +000093}
94#endif
95
Paul Bakker5c2364c2012-10-01 14:41:15 +000096#ifndef PUT_UINT32_BE
97#define PUT_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000098{ \
99 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
100 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
101 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
102 (b)[(i) + 3] = (unsigned char) ( (n) ); \
103}
104#endif
105
106static const unsigned char SIGMA_CHARS[6][8] =
107{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000108 { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
109 { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
110 { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
111 { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
112 { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
113 { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
Paul Bakker38119b12009-01-10 23:31:23 +0000114};
115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200116#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
Paul Bakkerfa049db2009-01-12 22:12:03 +0000117
118static const unsigned char FSb[256] =
Paul Bakker38119b12009-01-10 23:31:23 +0000119{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000120 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
121 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
122 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
123 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
124 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
125 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
126 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
127 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
128 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
129 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
130 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
131 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
132 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
133 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
134 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
135 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
Paul Bakker38119b12009-01-10 23:31:23 +0000136};
137
138#define SBOX1(n) FSb[(n)]
139#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
140#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
Paul Bakkerfa049db2009-01-12 22:12:03 +0000141#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
142
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200143#else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000144
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000145static const unsigned char FSb[256] =
146{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200147 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65,
148 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189,
149 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26,
150 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77,
151 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153,
152 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215,
153 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
154 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80,
155 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210,
156 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148,
157 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226,
158 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46,
159 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89,
160 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
161 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164,
162 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000163};
164
165static const unsigned char FSb2[256] =
166{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200167 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
168 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
169 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
170 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
171 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
172 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
173 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
174 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
175 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
176 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
177 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
178 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
179 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
180 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
181 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
182 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000183};
184
185static const unsigned char FSb3[256] =
186{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200187 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
188 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
189 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
190 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
191 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
192 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
193 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
194 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
195 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
196 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
197 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
198 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
199 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
200 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
201 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
202 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000203};
204
205static const unsigned char FSb4[256] =
206{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200207 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
208 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
209 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
210 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
211 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
212 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
213 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
214 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
215 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
216 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
217 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
218 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
219 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
220 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
221 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
222 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000223};
224
225#define SBOX1(n) FSb[(n)]
226#define SBOX2(n) FSb2[(n)]
227#define SBOX3(n) FSb3[(n)]
228#define SBOX4(n) FSb4[(n)]
Paul Bakker38119b12009-01-10 23:31:23 +0000229
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200230#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000231
Paul Bakker38119b12009-01-10 23:31:23 +0000232static const unsigned char shifts[2][4][4] =
233{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000234 {
235 { 1, 1, 1, 1 }, /* KL */
236 { 0, 0, 0, 0 }, /* KR */
237 { 1, 1, 1, 1 }, /* KA */
238 { 0, 0, 0, 0 } /* KB */
239 },
240 {
241 { 1, 0, 1, 1 }, /* KL */
242 { 1, 1, 0, 1 }, /* KR */
243 { 1, 1, 1, 0 }, /* KA */
244 { 1, 1, 0, 1 } /* KB */
245 }
Paul Bakker38119b12009-01-10 23:31:23 +0000246};
247
Paul Bakker026c03b2009-03-28 17:53:03 +0000248static const signed char indexes[2][4][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000249{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000250 {
251 { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39,
252 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
253 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
254 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
255 { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17,
256 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
257 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
258 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */
259 },
260 {
261 { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1,
262 -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
263 { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17,
264 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
265 { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
266 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
267 { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21,
268 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */
269 }
Paul Bakker38119b12009-01-10 23:31:23 +0000270};
271
Paul Bakker026c03b2009-03-28 17:53:03 +0000272static const signed char transposes[2][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000273{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000274 {
275 21, 22, 23, 20,
276 -1, -1, -1, -1,
277 18, 19, 16, 17,
278 11, 8, 9, 10,
279 15, 12, 13, 14
280 },
281 {
282 25, 26, 27, 24,
283 29, 30, 31, 28,
284 18, 19, 16, 17,
285 -1, -1, -1, -1,
286 -1, -1, -1, -1
287 }
Paul Bakker38119b12009-01-10 23:31:23 +0000288};
289
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000290/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000291#define ROTL(DEST, SRC, SHIFT) \
292{ \
293 (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \
294 (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \
295 (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \
296 (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \
Paul Bakker38119b12009-01-10 23:31:23 +0000297}
298
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000299#define FL(XL, XR, KL, KR) \
300{ \
301 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
302 (XL) = ((XR) | (KR)) ^ (XL); \
Paul Bakker38119b12009-01-10 23:31:23 +0000303}
Paul Bakker9af723c2014-05-01 13:03:14 +0200304
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000305#define FLInv(YL, YR, KL, KR) \
306{ \
307 (YL) = ((YR) | (KR)) ^ (YL); \
308 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
Paul Bakker38119b12009-01-10 23:31:23 +0000309}
Paul Bakker9af723c2014-05-01 13:03:14 +0200310
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000311#define SHIFT_AND_PLACE(INDEX, OFFSET) \
312{ \
313 TK[0] = KC[(OFFSET) * 4 + 0]; \
314 TK[1] = KC[(OFFSET) * 4 + 1]; \
315 TK[2] = KC[(OFFSET) * 4 + 2]; \
316 TK[3] = KC[(OFFSET) * 4 + 3]; \
317 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200318 for( i = 1; i <= 4; i++ ) \
319 if( shifts[(INDEX)][(OFFSET)][i -1] ) \
320 ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000321 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200322 for( i = 0; i < 20; i++ ) \
323 if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
324 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
325 } \
Paul Bakker38119b12009-01-10 23:31:23 +0000326}
327
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200328static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
329 uint32_t z[2])
Paul Bakker38119b12009-01-10 23:31:23 +0000330{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000331 uint32_t I0, I1;
332 I0 = x[0] ^ k[0];
333 I1 = x[1] ^ k[1];
Paul Bakker38119b12009-01-10 23:31:23 +0000334
Manuel Pégourié-Gonnardb31b61b2014-11-10 13:05:43 +0100335 I0 = ((uint32_t) SBOX1((I0 >> 24) & 0xFF) << 24) |
336 ((uint32_t) SBOX2((I0 >> 16) & 0xFF) << 16) |
337 ((uint32_t) SBOX3((I0 >> 8) & 0xFF) << 8) |
338 ((uint32_t) SBOX4((I0 ) & 0xFF) );
339 I1 = ((uint32_t) SBOX2((I1 >> 24) & 0xFF) << 24) |
340 ((uint32_t) SBOX3((I1 >> 16) & 0xFF) << 16) |
341 ((uint32_t) SBOX4((I1 >> 8) & 0xFF) << 8) |
342 ((uint32_t) SBOX1((I1 ) & 0xFF) );
Paul Bakker38119b12009-01-10 23:31:23 +0000343
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000344 I0 ^= (I1 << 8) | (I1 >> 24);
345 I1 ^= (I0 << 16) | (I0 >> 16);
346 I0 ^= (I1 >> 8) | (I1 << 24);
347 I1 ^= (I0 >> 8) | (I0 << 24);
Paul Bakker38119b12009-01-10 23:31:23 +0000348
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000349 z[0] ^= I1;
350 z[1] ^= I0;
Paul Bakker38119b12009-01-10 23:31:23 +0000351}
352
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200353void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200354{
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000355 CAMELLIA_VALIDATE( ctx != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200356 memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200357}
358
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200359void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200360{
361 if( ctx == NULL )
362 return;
363
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500364 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200365}
366
Paul Bakker38119b12009-01-10 23:31:23 +0000367/*
368 * Camellia key schedule (encryption)
369 */
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000370int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx,
371 const unsigned char *key,
372 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000373{
Paul Bakker23986e52011-04-24 08:57:21 +0000374 int idx;
375 size_t i;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000376 uint32_t *RK;
Paul Bakker38119b12009-01-10 23:31:23 +0000377 unsigned char t[64];
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000378 uint32_t SIGMA[6][2];
379 uint32_t KC[16];
380 uint32_t TK[20];
Hanno Becker70ded362018-12-19 13:42:05 +0000381
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000382 CAMELLIA_VALIDATE_RET( ctx != NULL );
383 CAMELLIA_VALIDATE_RET( key != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000384
385 RK = ctx->rk;
386
Paul Bakker66d5d072014-06-17 16:39:18 +0200387 memset( t, 0, 64 );
388 memset( RK, 0, sizeof(ctx->rk) );
Paul Bakker38119b12009-01-10 23:31:23 +0000389
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200390 switch( keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000391 {
392 case 128: ctx->nr = 3; idx = 0; break;
393 case 192:
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000394 case 256: ctx->nr = 4; idx = 1; break;
Hanno Becker4c029d02018-12-17 13:20:05 +0000395 default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000396 }
397
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200398 for( i = 0; i < keybits / 8; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000399 t[i] = key[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000400
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200401 if( keybits == 192 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200402 for( i = 0; i < 8; i++ )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000403 t[24 + i] = ~t[16 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000404 }
405
Paul Bakker38119b12009-01-10 23:31:23 +0000406 /*
407 * Prepare SIGMA values
408 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200409 for( i = 0; i < 6; i++ ) {
410 GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 );
411 GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000412 }
413
414 /*
415 * Key storage in KC
416 * Order: KL, KR, KA, KB
417 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200418 memset( KC, 0, sizeof(KC) );
Paul Bakker38119b12009-01-10 23:31:23 +0000419
420 /* Store KL, KR */
Paul Bakker66d5d072014-06-17 16:39:18 +0200421 for( i = 0; i < 8; i++ )
422 GET_UINT32_BE( KC[i], t, i * 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000423
424 /* Generate KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200425 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000426 KC[8 + i] = KC[i] ^ KC[4 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000427
Paul Bakker66d5d072014-06-17 16:39:18 +0200428 camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
429 camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000430
Paul Bakker66d5d072014-06-17 16:39:18 +0200431 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000432 KC[8 + i] ^= KC[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000433
Paul Bakker66d5d072014-06-17 16:39:18 +0200434 camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
435 camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000436
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200437 if( keybits > 128 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000438 /* Generate KB */
Paul Bakker66d5d072014-06-17 16:39:18 +0200439 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000440 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000441
Paul Bakker66d5d072014-06-17 16:39:18 +0200442 camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
443 camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000444 }
445
446 /*
447 * Generating subkeys
Paul Bakker9af723c2014-05-01 13:03:14 +0200448 */
Paul Bakker38119b12009-01-10 23:31:23 +0000449
450 /* Manipulating KL */
Paul Bakker66d5d072014-06-17 16:39:18 +0200451 SHIFT_AND_PLACE( idx, 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000452
453 /* Manipulating KR */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200454 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200455 SHIFT_AND_PLACE( idx, 1 );
Paul Bakker38119b12009-01-10 23:31:23 +0000456 }
457
458 /* Manipulating KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200459 SHIFT_AND_PLACE( idx, 2 );
Paul Bakker38119b12009-01-10 23:31:23 +0000460
461 /* Manipulating KB */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200462 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200463 SHIFT_AND_PLACE( idx, 3 );
Paul Bakker38119b12009-01-10 23:31:23 +0000464 }
465
466 /* Do transpositions */
Paul Bakker66d5d072014-06-17 16:39:18 +0200467 for( i = 0; i < 20; i++ ) {
468 if( transposes[idx][i] != -1 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000469 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
470 }
Paul Bakker38119b12009-01-10 23:31:23 +0000471 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000472
473 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000474}
475
476/*
477 * Camellia key schedule (decryption)
478 */
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000479int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx,
480 const unsigned char *key,
481 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000482{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200483 int idx, ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000484 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200485 mbedtls_camellia_context cty;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000486 uint32_t *RK;
487 uint32_t *SK;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000488 CAMELLIA_VALIDATE_RET( ctx != NULL );
489 CAMELLIA_VALIDATE_RET( key != NULL );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200490
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200491 mbedtls_camellia_init( &cty );
Paul Bakker38119b12009-01-10 23:31:23 +0000492
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200493 /* Also checks keybits */
494 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200495 goto exit;
Paul Bakker38119b12009-01-10 23:31:23 +0000496
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200497 ctx->nr = cty.nr;
498 idx = ( ctx->nr == 4 );
499
500 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000501 SK = cty.rk + 24 * 2 + 8 * idx * 2;
502
503 *RK++ = *SK++;
504 *RK++ = *SK++;
505 *RK++ = *SK++;
506 *RK++ = *SK++;
507
Paul Bakker66d5d072014-06-17 16:39:18 +0200508 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
Paul Bakker38119b12009-01-10 23:31:23 +0000509 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000510 *RK++ = *SK++;
511 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000512 }
513
514 SK -= 2;
515
516 *RK++ = *SK++;
517 *RK++ = *SK++;
518 *RK++ = *SK++;
519 *RK++ = *SK++;
520
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200521exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200522 mbedtls_camellia_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000523
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200524 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000525}
526
527/*
528 * Camellia-ECB block encryption/decryption
529 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200530int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000531 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000532 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000533 unsigned char output[16] )
534{
Paul Bakker026c03b2009-03-28 17:53:03 +0000535 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000536 uint32_t *RK, X[4];
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000537 CAMELLIA_VALIDATE_RET( ctx != NULL );
538 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
539 mode == MBEDTLS_CAMELLIA_DECRYPT );
540 CAMELLIA_VALIDATE_RET( input != NULL );
541 CAMELLIA_VALIDATE_RET( output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000542
Paul Bakkerc2547b02009-07-20 20:40:52 +0000543 ( (void) mode );
544
Paul Bakker38119b12009-01-10 23:31:23 +0000545 NR = ctx->nr;
546 RK = ctx->rk;
547
Paul Bakker5c2364c2012-10-01 14:41:15 +0000548 GET_UINT32_BE( X[0], input, 0 );
549 GET_UINT32_BE( X[1], input, 4 );
550 GET_UINT32_BE( X[2], input, 8 );
551 GET_UINT32_BE( X[3], input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000552
553 X[0] ^= *RK++;
554 X[1] ^= *RK++;
555 X[2] ^= *RK++;
556 X[3] ^= *RK++;
557
Paul Bakker66d5d072014-06-17 16:39:18 +0200558 while( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000559 --NR;
Paul Bakker66d5d072014-06-17 16:39:18 +0200560 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000561 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200562 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000563 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200564 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000565 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200566 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000567 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200568 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000569 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200570 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000571 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000572
Paul Bakker66d5d072014-06-17 16:39:18 +0200573 if( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000574 FL(X[0], X[1], RK[0], RK[1]);
575 RK += 2;
576 FLInv(X[2], X[3], RK[0], RK[1]);
577 RK += 2;
578 }
Paul Bakker38119b12009-01-10 23:31:23 +0000579 }
580
581 X[2] ^= *RK++;
582 X[3] ^= *RK++;
583 X[0] ^= *RK++;
584 X[1] ^= *RK++;
585
Paul Bakker5c2364c2012-10-01 14:41:15 +0000586 PUT_UINT32_BE( X[2], output, 0 );
587 PUT_UINT32_BE( X[3], output, 4 );
588 PUT_UINT32_BE( X[0], output, 8 );
589 PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000590
591 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000592}
593
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200594#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000595/*
596 * Camellia-CBC buffer encryption/decryption
597 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200598int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
Hanno Becker70ded362018-12-19 13:42:05 +0000599 int mode,
600 size_t length,
601 unsigned char iv[16],
602 const unsigned char *input,
603 unsigned char *output )
Paul Bakker38119b12009-01-10 23:31:23 +0000604{
605 int i;
606 unsigned char temp[16];
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000607 CAMELLIA_VALIDATE_RET( ctx != NULL );
608 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
609 mode == MBEDTLS_CAMELLIA_DECRYPT );
610 CAMELLIA_VALIDATE_RET( iv != NULL );
611 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
612 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000613
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000614 if( length % 16 )
Hanno Becker938f9e92018-12-18 09:40:25 +0000615 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000616
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200617 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000618 {
619 while( length > 0 )
620 {
621 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200622 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000623
624 for( i = 0; i < 16; i++ )
625 output[i] = (unsigned char)( output[i] ^ iv[i] );
626
627 memcpy( iv, temp, 16 );
628
629 input += 16;
630 output += 16;
631 length -= 16;
632 }
633 }
634 else
635 {
636 while( length > 0 )
637 {
638 for( i = 0; i < 16; i++ )
639 output[i] = (unsigned char)( input[i] ^ iv[i] );
640
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200641 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000642 memcpy( iv, output, 16 );
643
644 input += 16;
645 output += 16;
646 length -= 16;
647 }
648 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000649
650 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000651}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200652#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000653
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200654#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000655/*
656 * Camellia-CFB128 buffer encryption/decryption
657 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200658int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000659 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000660 size_t length,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000661 size_t *iv_off,
Paul Bakker38119b12009-01-10 23:31:23 +0000662 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000663 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000664 unsigned char *output )
665{
Paul Bakker1ef71df2011-06-09 14:14:58 +0000666 int c;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000667 size_t n;
668 CAMELLIA_VALIDATE_RET( ctx != NULL );
669 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
670 mode == MBEDTLS_CAMELLIA_DECRYPT );
671 CAMELLIA_VALIDATE_RET( iv != NULL );
672 CAMELLIA_VALIDATE_RET( iv_off != NULL );
673 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
674 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
675
676 n = *iv_off;
677 if( n >= 16 )
678 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000679
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200680 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000681 {
682 while( length-- )
683 {
684 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200685 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000686
687 c = *input++;
688 *output++ = (unsigned char)( c ^ iv[n] );
689 iv[n] = (unsigned char) c;
690
Paul Bakker66d5d072014-06-17 16:39:18 +0200691 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000692 }
693 }
694 else
695 {
696 while( length-- )
697 {
698 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200699 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000700
701 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
702
Paul Bakker66d5d072014-06-17 16:39:18 +0200703 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000704 }
705 }
706
707 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000708
709 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000710}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200711#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000712
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200713#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000714/*
715 * Camellia-CTR buffer encryption/decryption
716 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200717int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000718 size_t length,
719 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000720 unsigned char nonce_counter[16],
721 unsigned char stream_block[16],
722 const unsigned char *input,
723 unsigned char *output )
724{
Paul Bakker369e14b2012-04-18 14:16:09 +0000725 int c, i;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000726 size_t n;
727 CAMELLIA_VALIDATE_RET( ctx != NULL );
728 CAMELLIA_VALIDATE_RET( nonce_counter != NULL );
729 CAMELLIA_VALIDATE_RET( stream_block != NULL );
730 CAMELLIA_VALIDATE_RET( nc_off != NULL );
731 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
732 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
733
734 n = *nc_off;
735 if( n >= 16 )
736 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000737
738 while( length-- )
739 {
740 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200741 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200742 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000743
Paul Bakker369e14b2012-04-18 14:16:09 +0000744 for( i = 16; i > 0; i-- )
745 if( ++nonce_counter[i - 1] != 0 )
746 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000747 }
748 c = *input++;
749 *output++ = (unsigned char)( c ^ stream_block[n] );
750
Paul Bakker66d5d072014-06-17 16:39:18 +0200751 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000752 }
753
754 *nc_off = n;
755
756 return( 0 );
757}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200758#endif /* MBEDTLS_CIPHER_MODE_CTR */
759#endif /* !MBEDTLS_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000760
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200761#if defined(MBEDTLS_SELF_TEST)
Paul Bakker38119b12009-01-10 23:31:23 +0000762
Paul Bakker38119b12009-01-10 23:31:23 +0000763/*
764 * Camellia test vectors from:
765 *
766 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
767 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
768 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000769 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000770 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000771#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000772
773static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
774{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000775 {
776 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
777 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200778 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000779 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
780 },
781 {
782 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
783 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
784 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200785 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000786 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
787 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
788 },
789 {
790 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
791 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
792 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
793 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200794 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000795 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
797 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
798 },
Paul Bakker38119b12009-01-10 23:31:23 +0000799};
800
801static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
802{
803 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
804 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200805 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
807};
808
809static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
810{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000811 {
812 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
813 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
814 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
815 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
816 },
817 {
818 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
819 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
820 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
821 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
822 },
823 {
824 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
825 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
826 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
827 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
828 }
Paul Bakker38119b12009-01-10 23:31:23 +0000829};
830
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200831#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000832#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000833
834static const unsigned char camellia_test_cbc_key[3][32] =
835{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000836 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
837 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
838 ,
839 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
840 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
841 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
842 ,
843 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
844 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
845 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
846 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000847};
848
849static const unsigned char camellia_test_cbc_iv[16] =
850
851 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
852 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
853;
854
855static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
856{
857 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
858 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
859 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
860 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
861 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
862 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
863
864};
865
866static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
867{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000868 {
869 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
870 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
871 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
872 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
873 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
874 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
875 },
876 {
877 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
878 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
879 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
880 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
881 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
882 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
883 },
884 {
885 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
886 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
887 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
888 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
889 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
890 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
891 }
Paul Bakker38119b12009-01-10 23:31:23 +0000892};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200893#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000894
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200895#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000896/*
897 * Camellia-CTR test vectors from:
898 *
899 * http://www.faqs.org/rfcs/rfc5528.html
900 */
901
902static const unsigned char camellia_test_ctr_key[3][16] =
903{
904 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
905 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
906 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
907 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
908 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
909 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
910};
911
912static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
913{
914 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
915 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
916 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
917 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
918 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
919 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
920};
921
922static const unsigned char camellia_test_ctr_pt[3][48] =
923{
924 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
925 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
926
927 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
928 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
929 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
930 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
931
932 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
933 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
934 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
935 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
936 0x20, 0x21, 0x22, 0x23 }
937};
938
939static const unsigned char camellia_test_ctr_ct[3][48] =
940{
941 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
942 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
943 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
944 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
945 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
946 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
947 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
948 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
949 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
950 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
951 0xDF, 0x50, 0x86, 0x96 }
952};
953
954static const int camellia_test_ctr_len[3] =
955 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200956#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000957
958/*
959 * Checkup routine
960 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200961int mbedtls_camellia_self_test( int verbose )
Paul Bakker38119b12009-01-10 23:31:23 +0000962{
Paul Bakker026c03b2009-03-28 17:53:03 +0000963 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000964 unsigned char key[32];
965 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000966 unsigned char src[16];
967 unsigned char dst[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200968#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000969 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200970#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200971#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000972 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000973 unsigned char nonce_counter[16];
974 unsigned char stream_block[16];
975#endif
Gilles Peskine39f5dae2021-05-25 09:17:46 +0200976 int ret = 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000977
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200978 mbedtls_camellia_context ctx;
Paul Bakker38119b12009-01-10 23:31:23 +0000979
Gilles Peskine39f5dae2021-05-25 09:17:46 +0200980 mbedtls_camellia_init( &ctx );
Paul Bakker38119b12009-01-10 23:31:23 +0000981 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" );
Gilles Peskine39f5dae2021-05-25 09:17:46 +02001010 goto exit;
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001011 }
1012 }
Paul Bakker38119b12009-01-10 23:31:23 +00001013
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001014 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001015 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001016 }
1017
1018 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001019 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001020
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001021#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +00001022 /*
1023 * CBC mode
1024 */
1025 for( j = 0; j < 6; j++ )
1026 {
1027 u = j >> 1;
1028 v = j & 1;
1029
1030 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001031 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
1032 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +00001033
Janos Follath98e28a72016-05-31 14:03:54 +01001034 memcpy( src, camellia_test_cbc_iv, 16 );
1035 memcpy( dst, camellia_test_cbc_iv, 16 );
1036 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +00001037
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001038 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Janos Follath98e28a72016-05-31 14:03:54 +01001039 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
1040 } else {
1041 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001042 }
Paul Bakker38119b12009-01-10 23:31:23 +00001043
Janos Follath98e28a72016-05-31 14:03:54 +01001044 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +00001045
Janos Follath98e28a72016-05-31 14:03:54 +01001046 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
1047 memcpy( iv , src, 16 );
1048 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
1049 memcpy( dst, camellia_test_cbc_plain[i], 16 );
1050 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
1051 memcpy( iv , dst, 16 );
1052 memcpy( src, camellia_test_cbc_plain[i], 16 );
1053 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
1054 }
Paul Bakker38119b12009-01-10 23:31:23 +00001055
Janos Follath98e28a72016-05-31 14:03:54 +01001056 mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
1057
1058 if( memcmp( buf, dst, 16 ) != 0 )
1059 {
1060 if( verbose != 0 )
1061 mbedtls_printf( "failed\n" );
Gilles Peskine39f5dae2021-05-25 09:17:46 +02001062 goto exit;
Janos Follath98e28a72016-05-31 14:03:54 +01001063 }
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001064 }
Paul Bakker38119b12009-01-10 23:31:23 +00001065
1066 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001067 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001068 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001069#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +00001070
1071 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001072 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001073
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001074#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001075 /*
1076 * CTR mode
1077 */
1078 for( i = 0; i < 6; i++ )
1079 {
1080 u = i >> 1;
1081 v = i & 1;
1082
1083 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001084 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
1085 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001086
1087 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1088 memcpy( key, camellia_test_ctr_key[u], 16 );
1089
1090 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001092
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001093 if( v == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001094 {
1095 len = camellia_test_ctr_len[u];
1096 memcpy( buf, camellia_test_ctr_ct[u], len );
1097
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001098 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001099 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001100
1101 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1102 {
1103 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001104 mbedtls_printf( "failed\n" );
Gilles Peskine39f5dae2021-05-25 09:17:46 +02001105 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001106 }
1107 }
1108 else
1109 {
1110 len = camellia_test_ctr_len[u];
1111 memcpy( buf, camellia_test_ctr_pt[u], len );
1112
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001113 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001114 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001115
1116 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1117 {
1118 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001119 mbedtls_printf( "failed\n" );
Gilles Peskine39f5dae2021-05-25 09:17:46 +02001120 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001121 }
1122 }
1123
1124 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001125 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001126 }
1127
1128 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001129 mbedtls_printf( "\n" );
1130#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001131
Gilles Peskine39f5dae2021-05-25 09:17:46 +02001132 ret = 0;
1133
1134exit:
1135 mbedtls_camellia_free( &ctx );
1136 return( ret );
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 */