blob: 764e4f8a8c6c7d27807d4690b2fb4a4c96080b5b [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
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker38119b12009-01-10 23:31:23 +000020 */
21/*
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000022 * The Camellia block cipher was designed by NTT and Mitsubishi Electric
23 * Corporation.
Paul Bakker38119b12009-01-10 23:31:23 +000024 *
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000025 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
Paul Bakker38119b12009-01-10 23:31:23 +000026 */
27
Gilles Peskinedb09ef62020-06-03 01:43:33 +020028#include "common.h"
Paul Bakker38119b12009-01-10 23:31:23 +000029
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020030#if defined(MBEDTLS_CAMELLIA_C)
Paul Bakker38119b12009-01-10 23:31:23 +000031
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000032#include "mbedtls/camellia.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050033#include "mbedtls/platform_util.h"
Paul Bakker38119b12009-01-10 23:31:23 +000034
Rich Evans00ab4702015-02-06 13:43:58 +000035#include <string.h>
Manuel Pégourié-Gonnard394608e2015-02-17 16:01:07 +010036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020037#if defined(MBEDTLS_SELF_TEST)
38#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000039#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010040#else
Rich Evans00ab4702015-02-06 13:43:58 +000041#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020042#define mbedtls_printf printf
43#endif /* MBEDTLS_PLATFORM_C */
44#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010045
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046#if !defined(MBEDTLS_CAMELLIA_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020047
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050048/* Parameter validation macros */
49#define CAMELLIA_VALIDATE_RET( cond ) \
50 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA )
51#define CAMELLIA_VALIDATE( cond ) \
52 MBEDTLS_INTERNAL_VALIDATE( cond )
53
Paul Bakker38119b12009-01-10 23:31:23 +000054/*
55 * 32-bit integer manipulation macros (big endian)
56 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000057#ifndef GET_UINT32_BE
58#define GET_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000059{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000060 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
61 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
62 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
63 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker38119b12009-01-10 23:31:23 +000064}
65#endif
66
Paul Bakker5c2364c2012-10-01 14:41:15 +000067#ifndef PUT_UINT32_BE
68#define PUT_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000069{ \
70 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
71 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
72 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
73 (b)[(i) + 3] = (unsigned char) ( (n) ); \
74}
75#endif
76
77static const unsigned char SIGMA_CHARS[6][8] =
78{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000079 { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
80 { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
81 { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
82 { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
83 { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
84 { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
Paul Bakker38119b12009-01-10 23:31:23 +000085};
86
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020087#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
Paul Bakkerfa049db2009-01-12 22:12:03 +000088
89static const unsigned char FSb[256] =
Paul Bakker38119b12009-01-10 23:31:23 +000090{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000091 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
92 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
93 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
94 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
95 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
96 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
97 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
98 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
99 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
100 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
101 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
102 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
103 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
104 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
105 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
106 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
Paul Bakker38119b12009-01-10 23:31:23 +0000107};
108
109#define SBOX1(n) FSb[(n)]
110#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
111#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
Paul Bakkerfa049db2009-01-12 22:12:03 +0000112#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200114#else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000115
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000116static const unsigned char FSb[256] =
117{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200118 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65,
119 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189,
120 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26,
121 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77,
122 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153,
123 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215,
124 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
125 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80,
126 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210,
127 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148,
128 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226,
129 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46,
130 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89,
131 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
132 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164,
133 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000134};
135
136static const unsigned char FSb2[256] =
137{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200138 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
139 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
140 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
141 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
142 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
143 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
144 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
145 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
146 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
147 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
148 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
149 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
150 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
151 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
152 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
153 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000154};
155
156static const unsigned char FSb3[256] =
157{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200158 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
159 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
160 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
161 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
162 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
163 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
164 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
165 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
166 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
167 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
168 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
169 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
170 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
171 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
172 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
173 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000174};
175
176static const unsigned char FSb4[256] =
177{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200178 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
179 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
180 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
181 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
182 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
183 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
184 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
185 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
186 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
187 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
188 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
189 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
190 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
191 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
192 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
193 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000194};
195
196#define SBOX1(n) FSb[(n)]
197#define SBOX2(n) FSb2[(n)]
198#define SBOX3(n) FSb3[(n)]
199#define SBOX4(n) FSb4[(n)]
Paul Bakker38119b12009-01-10 23:31:23 +0000200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200201#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000202
Paul Bakker38119b12009-01-10 23:31:23 +0000203static const unsigned char shifts[2][4][4] =
204{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000205 {
206 { 1, 1, 1, 1 }, /* KL */
207 { 0, 0, 0, 0 }, /* KR */
208 { 1, 1, 1, 1 }, /* KA */
209 { 0, 0, 0, 0 } /* KB */
210 },
211 {
212 { 1, 0, 1, 1 }, /* KL */
213 { 1, 1, 0, 1 }, /* KR */
214 { 1, 1, 1, 0 }, /* KA */
215 { 1, 1, 0, 1 } /* KB */
216 }
Paul Bakker38119b12009-01-10 23:31:23 +0000217};
218
Paul Bakker026c03b2009-03-28 17:53:03 +0000219static const signed char indexes[2][4][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000220{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000221 {
222 { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39,
223 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
224 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
225 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
226 { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17,
227 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
228 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
229 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */
230 },
231 {
232 { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1,
233 -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
234 { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17,
235 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
236 { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
237 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
238 { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21,
239 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */
240 }
Paul Bakker38119b12009-01-10 23:31:23 +0000241};
242
Paul Bakker026c03b2009-03-28 17:53:03 +0000243static const signed char transposes[2][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000244{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000245 {
246 21, 22, 23, 20,
247 -1, -1, -1, -1,
248 18, 19, 16, 17,
249 11, 8, 9, 10,
250 15, 12, 13, 14
251 },
252 {
253 25, 26, 27, 24,
254 29, 30, 31, 28,
255 18, 19, 16, 17,
256 -1, -1, -1, -1,
257 -1, -1, -1, -1
258 }
Paul Bakker38119b12009-01-10 23:31:23 +0000259};
260
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000261/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000262#define ROTL(DEST, SRC, SHIFT) \
263{ \
264 (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \
265 (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \
266 (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \
267 (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \
Paul Bakker38119b12009-01-10 23:31:23 +0000268}
269
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000270#define FL(XL, XR, KL, KR) \
271{ \
272 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
273 (XL) = ((XR) | (KR)) ^ (XL); \
Paul Bakker38119b12009-01-10 23:31:23 +0000274}
Paul Bakker9af723c2014-05-01 13:03:14 +0200275
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000276#define FLInv(YL, YR, KL, KR) \
277{ \
278 (YL) = ((YR) | (KR)) ^ (YL); \
279 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
Paul Bakker38119b12009-01-10 23:31:23 +0000280}
Paul Bakker9af723c2014-05-01 13:03:14 +0200281
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000282#define SHIFT_AND_PLACE(INDEX, OFFSET) \
283{ \
284 TK[0] = KC[(OFFSET) * 4 + 0]; \
285 TK[1] = KC[(OFFSET) * 4 + 1]; \
286 TK[2] = KC[(OFFSET) * 4 + 2]; \
287 TK[3] = KC[(OFFSET) * 4 + 3]; \
288 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200289 for( i = 1; i <= 4; i++ ) \
290 if( shifts[(INDEX)][(OFFSET)][i -1] ) \
291 ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000292 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200293 for( i = 0; i < 20; i++ ) \
294 if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
295 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
296 } \
Paul Bakker38119b12009-01-10 23:31:23 +0000297}
298
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200299static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
300 uint32_t z[2])
Paul Bakker38119b12009-01-10 23:31:23 +0000301{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000302 uint32_t I0, I1;
303 I0 = x[0] ^ k[0];
304 I1 = x[1] ^ k[1];
Paul Bakker38119b12009-01-10 23:31:23 +0000305
Manuel Pégourié-Gonnardb31b61b2014-11-10 13:05:43 +0100306 I0 = ((uint32_t) SBOX1((I0 >> 24) & 0xFF) << 24) |
307 ((uint32_t) SBOX2((I0 >> 16) & 0xFF) << 16) |
308 ((uint32_t) SBOX3((I0 >> 8) & 0xFF) << 8) |
309 ((uint32_t) SBOX4((I0 ) & 0xFF) );
310 I1 = ((uint32_t) SBOX2((I1 >> 24) & 0xFF) << 24) |
311 ((uint32_t) SBOX3((I1 >> 16) & 0xFF) << 16) |
312 ((uint32_t) SBOX4((I1 >> 8) & 0xFF) << 8) |
313 ((uint32_t) SBOX1((I1 ) & 0xFF) );
Paul Bakker38119b12009-01-10 23:31:23 +0000314
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000315 I0 ^= (I1 << 8) | (I1 >> 24);
316 I1 ^= (I0 << 16) | (I0 >> 16);
317 I0 ^= (I1 >> 8) | (I1 << 24);
318 I1 ^= (I0 >> 8) | (I0 << 24);
Paul Bakker38119b12009-01-10 23:31:23 +0000319
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000320 z[0] ^= I1;
321 z[1] ^= I0;
Paul Bakker38119b12009-01-10 23:31:23 +0000322}
323
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200324void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200325{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500326 CAMELLIA_VALIDATE( ctx != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327 memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200328}
329
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200330void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200331{
332 if( ctx == NULL )
333 return;
334
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500335 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200336}
337
Paul Bakker38119b12009-01-10 23:31:23 +0000338/*
339 * Camellia key schedule (encryption)
340 */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500341int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx,
342 const unsigned char *key,
343 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000344{
Paul Bakker23986e52011-04-24 08:57:21 +0000345 int idx;
346 size_t i;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000347 uint32_t *RK;
Paul Bakker38119b12009-01-10 23:31:23 +0000348 unsigned char t[64];
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000349 uint32_t SIGMA[6][2];
350 uint32_t KC[16];
351 uint32_t TK[20];
Paul Bakker38119b12009-01-10 23:31:23 +0000352
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500353 CAMELLIA_VALIDATE_RET( ctx != NULL );
354 CAMELLIA_VALIDATE_RET( key != NULL );
355
Paul Bakker38119b12009-01-10 23:31:23 +0000356 RK = ctx->rk;
357
Paul Bakker66d5d072014-06-17 16:39:18 +0200358 memset( t, 0, 64 );
359 memset( RK, 0, sizeof(ctx->rk) );
Paul Bakker38119b12009-01-10 23:31:23 +0000360
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200361 switch( keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000362 {
363 case 128: ctx->nr = 3; idx = 0; break;
364 case 192:
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000365 case 256: ctx->nr = 4; idx = 1; break;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500366 default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000367 }
368
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200369 for( i = 0; i < keybits / 8; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000370 t[i] = key[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000371
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200372 if( keybits == 192 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200373 for( i = 0; i < 8; i++ )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000374 t[24 + i] = ~t[16 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000375 }
376
Paul Bakker38119b12009-01-10 23:31:23 +0000377 /*
378 * Prepare SIGMA values
379 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200380 for( i = 0; i < 6; i++ ) {
381 GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 );
382 GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000383 }
384
385 /*
386 * Key storage in KC
387 * Order: KL, KR, KA, KB
388 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200389 memset( KC, 0, sizeof(KC) );
Paul Bakker38119b12009-01-10 23:31:23 +0000390
391 /* Store KL, KR */
Paul Bakker66d5d072014-06-17 16:39:18 +0200392 for( i = 0; i < 8; i++ )
393 GET_UINT32_BE( KC[i], t, i * 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000394
395 /* Generate KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200396 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000397 KC[8 + i] = KC[i] ^ KC[4 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000398
Paul Bakker66d5d072014-06-17 16:39:18 +0200399 camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
400 camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000401
Paul Bakker66d5d072014-06-17 16:39:18 +0200402 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000403 KC[8 + i] ^= KC[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000404
Paul Bakker66d5d072014-06-17 16:39:18 +0200405 camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
406 camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000407
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200408 if( keybits > 128 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000409 /* Generate KB */
Paul Bakker66d5d072014-06-17 16:39:18 +0200410 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000411 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000412
Paul Bakker66d5d072014-06-17 16:39:18 +0200413 camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
414 camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000415 }
416
417 /*
418 * Generating subkeys
Paul Bakker9af723c2014-05-01 13:03:14 +0200419 */
Paul Bakker38119b12009-01-10 23:31:23 +0000420
421 /* Manipulating KL */
Paul Bakker66d5d072014-06-17 16:39:18 +0200422 SHIFT_AND_PLACE( idx, 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000423
424 /* Manipulating KR */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200425 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200426 SHIFT_AND_PLACE( idx, 1 );
Paul Bakker38119b12009-01-10 23:31:23 +0000427 }
428
429 /* Manipulating KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200430 SHIFT_AND_PLACE( idx, 2 );
Paul Bakker38119b12009-01-10 23:31:23 +0000431
432 /* Manipulating KB */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200433 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200434 SHIFT_AND_PLACE( idx, 3 );
Paul Bakker38119b12009-01-10 23:31:23 +0000435 }
436
437 /* Do transpositions */
Paul Bakker66d5d072014-06-17 16:39:18 +0200438 for( i = 0; i < 20; i++ ) {
439 if( transposes[idx][i] != -1 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000440 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
441 }
Paul Bakker38119b12009-01-10 23:31:23 +0000442 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000443
444 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000445}
446
447/*
448 * Camellia key schedule (decryption)
449 */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500450int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx,
451 const unsigned char *key,
452 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000453{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200454 int idx, ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000455 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200456 mbedtls_camellia_context cty;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000457 uint32_t *RK;
458 uint32_t *SK;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500459 CAMELLIA_VALIDATE_RET( ctx != NULL );
460 CAMELLIA_VALIDATE_RET( key != NULL );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200461
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200462 mbedtls_camellia_init( &cty );
Paul Bakker38119b12009-01-10 23:31:23 +0000463
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200464 /* Also checks keybits */
465 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200466 goto exit;
Paul Bakker38119b12009-01-10 23:31:23 +0000467
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200468 ctx->nr = cty.nr;
469 idx = ( ctx->nr == 4 );
470
471 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000472 SK = cty.rk + 24 * 2 + 8 * idx * 2;
473
474 *RK++ = *SK++;
475 *RK++ = *SK++;
476 *RK++ = *SK++;
477 *RK++ = *SK++;
478
Paul Bakker66d5d072014-06-17 16:39:18 +0200479 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
Paul Bakker38119b12009-01-10 23:31:23 +0000480 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000481 *RK++ = *SK++;
482 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000483 }
484
485 SK -= 2;
486
487 *RK++ = *SK++;
488 *RK++ = *SK++;
489 *RK++ = *SK++;
490 *RK++ = *SK++;
491
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200492exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493 mbedtls_camellia_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000494
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200495 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000496}
497
498/*
499 * Camellia-ECB block encryption/decryption
500 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200501int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000502 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000503 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000504 unsigned char output[16] )
505{
Paul Bakker026c03b2009-03-28 17:53:03 +0000506 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000507 uint32_t *RK, X[4];
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500508 CAMELLIA_VALIDATE_RET( ctx != NULL );
509 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
510 mode == MBEDTLS_CAMELLIA_DECRYPT );
511 CAMELLIA_VALIDATE_RET( input != NULL );
512 CAMELLIA_VALIDATE_RET( output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000513
Paul Bakkerc2547b02009-07-20 20:40:52 +0000514 ( (void) mode );
515
Paul Bakker38119b12009-01-10 23:31:23 +0000516 NR = ctx->nr;
517 RK = ctx->rk;
518
Paul Bakker5c2364c2012-10-01 14:41:15 +0000519 GET_UINT32_BE( X[0], input, 0 );
520 GET_UINT32_BE( X[1], input, 4 );
521 GET_UINT32_BE( X[2], input, 8 );
522 GET_UINT32_BE( X[3], input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000523
524 X[0] ^= *RK++;
525 X[1] ^= *RK++;
526 X[2] ^= *RK++;
527 X[3] ^= *RK++;
528
Paul Bakker66d5d072014-06-17 16:39:18 +0200529 while( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000530 --NR;
Paul Bakker66d5d072014-06-17 16:39:18 +0200531 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000532 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200533 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000534 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200535 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000536 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200537 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000538 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200539 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000540 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200541 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000542 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000543
Paul Bakker66d5d072014-06-17 16:39:18 +0200544 if( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000545 FL(X[0], X[1], RK[0], RK[1]);
546 RK += 2;
547 FLInv(X[2], X[3], RK[0], RK[1]);
548 RK += 2;
549 }
Paul Bakker38119b12009-01-10 23:31:23 +0000550 }
551
552 X[2] ^= *RK++;
553 X[3] ^= *RK++;
554 X[0] ^= *RK++;
555 X[1] ^= *RK++;
556
Paul Bakker5c2364c2012-10-01 14:41:15 +0000557 PUT_UINT32_BE( X[2], output, 0 );
558 PUT_UINT32_BE( X[3], output, 4 );
559 PUT_UINT32_BE( X[0], output, 8 );
560 PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000561
562 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000563}
564
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200565#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000566/*
567 * Camellia-CBC buffer encryption/decryption
568 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200569int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500570 int mode,
571 size_t length,
572 unsigned char iv[16],
573 const unsigned char *input,
574 unsigned char *output )
Paul Bakker38119b12009-01-10 23:31:23 +0000575{
576 int i;
577 unsigned char temp[16];
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500578 CAMELLIA_VALIDATE_RET( ctx != NULL );
579 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
580 mode == MBEDTLS_CAMELLIA_DECRYPT );
581 CAMELLIA_VALIDATE_RET( iv != NULL );
582 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
583 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000584
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000585 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200586 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000587
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200588 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000589 {
590 while( length > 0 )
591 {
592 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200593 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000594
595 for( i = 0; i < 16; i++ )
596 output[i] = (unsigned char)( output[i] ^ iv[i] );
597
598 memcpy( iv, temp, 16 );
599
600 input += 16;
601 output += 16;
602 length -= 16;
603 }
604 }
605 else
606 {
607 while( length > 0 )
608 {
609 for( i = 0; i < 16; i++ )
610 output[i] = (unsigned char)( input[i] ^ iv[i] );
611
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200612 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000613 memcpy( iv, output, 16 );
614
615 input += 16;
616 output += 16;
617 length -= 16;
618 }
619 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000620
621 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000622}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200623#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000624
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200625#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000626/*
627 * Camellia-CFB128 buffer encryption/decryption
628 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200629int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000630 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000631 size_t length,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000632 size_t *iv_off,
Paul Bakker38119b12009-01-10 23:31:23 +0000633 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000634 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000635 unsigned char *output )
636{
Paul Bakker1ef71df2011-06-09 14:14:58 +0000637 int c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500638 size_t n;
639 CAMELLIA_VALIDATE_RET( ctx != NULL );
640 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
641 mode == MBEDTLS_CAMELLIA_DECRYPT );
642 CAMELLIA_VALIDATE_RET( iv != NULL );
643 CAMELLIA_VALIDATE_RET( iv_off != NULL );
644 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
645 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
646
647 n = *iv_off;
648 if( n >= 16 )
649 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000650
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200651 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000652 {
653 while( length-- )
654 {
655 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200656 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000657
658 c = *input++;
659 *output++ = (unsigned char)( c ^ iv[n] );
660 iv[n] = (unsigned char) c;
661
Paul Bakker66d5d072014-06-17 16:39:18 +0200662 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000663 }
664 }
665 else
666 {
667 while( length-- )
668 {
669 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200670 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000671
672 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
673
Paul Bakker66d5d072014-06-17 16:39:18 +0200674 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000675 }
676 }
677
678 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000679
680 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000681}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000683
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200684#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000685/*
686 * Camellia-CTR buffer encryption/decryption
687 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200688int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000689 size_t length,
690 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000691 unsigned char nonce_counter[16],
692 unsigned char stream_block[16],
693 const unsigned char *input,
694 unsigned char *output )
695{
Paul Bakker369e14b2012-04-18 14:16:09 +0000696 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500697 size_t n;
698 CAMELLIA_VALIDATE_RET( ctx != NULL );
699 CAMELLIA_VALIDATE_RET( nonce_counter != NULL );
700 CAMELLIA_VALIDATE_RET( stream_block != NULL );
701 CAMELLIA_VALIDATE_RET( nc_off != NULL );
702 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
703 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
704
705 n = *nc_off;
706 if( n >= 16 )
707 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000708
709 while( length-- )
710 {
711 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200713 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000714
Paul Bakker369e14b2012-04-18 14:16:09 +0000715 for( i = 16; i > 0; i-- )
716 if( ++nonce_counter[i - 1] != 0 )
717 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000718 }
719 c = *input++;
720 *output++ = (unsigned char)( c ^ stream_block[n] );
721
Paul Bakker66d5d072014-06-17 16:39:18 +0200722 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000723 }
724
725 *nc_off = n;
726
727 return( 0 );
728}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200729#endif /* MBEDTLS_CIPHER_MODE_CTR */
730#endif /* !MBEDTLS_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000731
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200732#if defined(MBEDTLS_SELF_TEST)
Paul Bakker38119b12009-01-10 23:31:23 +0000733
Paul Bakker38119b12009-01-10 23:31:23 +0000734/*
735 * Camellia test vectors from:
736 *
737 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
738 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
739 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000740 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000741 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000742#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000743
744static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
745{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000746 {
747 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
748 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200749 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000750 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
751 },
752 {
753 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
754 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
755 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200756 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000757 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
759 },
760 {
761 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
762 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
763 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
764 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200765 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000766 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
767 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
768 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
769 },
Paul Bakker38119b12009-01-10 23:31:23 +0000770};
771
772static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
773{
774 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
775 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200776 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
778};
779
780static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
781{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000782 {
783 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
784 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
785 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
786 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
787 },
788 {
789 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
790 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
791 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
792 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
793 },
794 {
795 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
796 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
797 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
798 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
799 }
Paul Bakker38119b12009-01-10 23:31:23 +0000800};
801
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200802#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000803#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000804
805static const unsigned char camellia_test_cbc_key[3][32] =
806{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000807 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
808 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
809 ,
810 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
811 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
812 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
813 ,
814 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
815 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
816 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
817 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000818};
819
820static const unsigned char camellia_test_cbc_iv[16] =
821
822 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
823 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
824;
825
826static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
827{
828 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
829 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
830 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
831 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
832 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
833 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
834
835};
836
837static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
838{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000839 {
840 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
841 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
842 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
843 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
844 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
845 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
846 },
847 {
848 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
849 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
850 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
851 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
852 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
853 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
854 },
855 {
856 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
857 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
858 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
859 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
860 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
861 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
862 }
Paul Bakker38119b12009-01-10 23:31:23 +0000863};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200864#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000865
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200866#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000867/*
868 * Camellia-CTR test vectors from:
869 *
870 * http://www.faqs.org/rfcs/rfc5528.html
871 */
872
873static const unsigned char camellia_test_ctr_key[3][16] =
874{
875 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
876 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
877 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
878 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
879 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
880 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
881};
882
883static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
884{
885 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
886 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
887 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
888 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
889 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
890 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
891};
892
893static const unsigned char camellia_test_ctr_pt[3][48] =
894{
895 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
896 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
897
898 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
899 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
900 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
901 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
902
903 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
904 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
905 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
906 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
907 0x20, 0x21, 0x22, 0x23 }
908};
909
910static const unsigned char camellia_test_ctr_ct[3][48] =
911{
912 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
913 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
914 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
915 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
916 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
917 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
918 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
919 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
920 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
921 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
922 0xDF, 0x50, 0x86, 0x96 }
923};
924
925static const int camellia_test_ctr_len[3] =
926 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000928
929/*
930 * Checkup routine
931 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200932int mbedtls_camellia_self_test( int verbose )
Paul Bakker38119b12009-01-10 23:31:23 +0000933{
Paul Bakker026c03b2009-03-28 17:53:03 +0000934 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000935 unsigned char key[32];
936 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000937 unsigned char src[16];
938 unsigned char dst[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200939#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000940 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200941#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200942#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000943 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000944 unsigned char nonce_counter[16];
945 unsigned char stream_block[16];
946#endif
947
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200948 mbedtls_camellia_context ctx;
Paul Bakker38119b12009-01-10 23:31:23 +0000949
950 memset( key, 0, 32 );
951
Paul Bakker66d5d072014-06-17 16:39:18 +0200952 for( j = 0; j < 6; j++ ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000953 u = j >> 1;
954 v = j & 1;
Paul Bakker38119b12009-01-10 23:31:23 +0000955
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000956 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200957 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
958 (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
Paul Bakker38119b12009-01-10 23:31:23 +0000959
Paul Bakker66d5d072014-06-17 16:39:18 +0200960 for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
961 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000962
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200963 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
964 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200965 memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
966 memcpy( dst, camellia_test_ecb_plain[i], 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200967 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
968 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200969 memcpy( src, camellia_test_ecb_plain[i], 16 );
970 memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000971 }
Paul Bakker38119b12009-01-10 23:31:23 +0000972
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200973 mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
Paul Bakker38119b12009-01-10 23:31:23 +0000974
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000975 if( memcmp( buf, dst, 16 ) != 0 )
976 {
977 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200978 mbedtls_printf( "failed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000979
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000980 return( 1 );
981 }
982 }
Paul Bakker38119b12009-01-10 23:31:23 +0000983
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000984 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200985 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000986 }
987
988 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000990
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200991#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000992 /*
993 * CBC mode
994 */
995 for( j = 0; j < 6; j++ )
996 {
997 u = j >> 1;
998 v = j & 1;
999
1000 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001001 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
1002 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +00001003
Janos Follath98e28a72016-05-31 14:03:54 +01001004 memcpy( src, camellia_test_cbc_iv, 16 );
1005 memcpy( dst, camellia_test_cbc_iv, 16 );
1006 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +00001007
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001008 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Janos Follath98e28a72016-05-31 14:03:54 +01001009 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
1010 } else {
1011 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001012 }
Paul Bakker38119b12009-01-10 23:31:23 +00001013
Janos Follath98e28a72016-05-31 14:03:54 +01001014 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +00001015
Janos Follath98e28a72016-05-31 14:03:54 +01001016 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
1017 memcpy( iv , src, 16 );
1018 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
1019 memcpy( dst, camellia_test_cbc_plain[i], 16 );
1020 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
1021 memcpy( iv , dst, 16 );
1022 memcpy( src, camellia_test_cbc_plain[i], 16 );
1023 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
1024 }
Paul Bakker38119b12009-01-10 23:31:23 +00001025
Janos Follath98e28a72016-05-31 14:03:54 +01001026 mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
1027
1028 if( memcmp( buf, dst, 16 ) != 0 )
1029 {
1030 if( verbose != 0 )
1031 mbedtls_printf( "failed\n" );
1032
1033 return( 1 );
1034 }
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001035 }
Paul Bakker38119b12009-01-10 23:31:23 +00001036
1037 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001038 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001039 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001040#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +00001041
1042 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001043 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001044
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001045#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001046 /*
1047 * CTR mode
1048 */
1049 for( i = 0; i < 6; i++ )
1050 {
1051 u = i >> 1;
1052 v = i & 1;
1053
1054 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001055 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
1056 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001057
1058 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1059 memcpy( key, camellia_test_ctr_key[u], 16 );
1060
1061 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001062 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001063
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001064 if( v == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001065 {
1066 len = camellia_test_ctr_len[u];
1067 memcpy( buf, camellia_test_ctr_ct[u], len );
1068
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001069 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001070 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001071
1072 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1073 {
1074 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001075 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001076
1077 return( 1 );
1078 }
1079 }
1080 else
1081 {
1082 len = camellia_test_ctr_len[u];
1083 memcpy( buf, camellia_test_ctr_pt[u], len );
1084
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001085 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001086 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001087
1088 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1089 {
1090 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001092
1093 return( 1 );
1094 }
1095 }
1096
1097 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001098 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001099 }
1100
1101 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001102 mbedtls_printf( "\n" );
1103#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001104
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001105 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +00001106}
1107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001108#endif /* MBEDTLS_SELF_TEST */
Paul Bakker38119b12009-01-10 23:31:23 +00001109
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001110#endif /* MBEDTLS_CAMELLIA_C */