blob: 5dd6c56157b58fff58fc87c60a9334ea12f59bc3 [file] [log] [blame]
Paul Bakker38119b12009-01-10 23:31:23 +00001/*
2 * Camellia implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
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 Bakker38119b12009-01-10 23:31:23 +000018 */
19/*
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000020 * The Camellia block cipher was designed by NTT and Mitsubishi Electric
21 * Corporation.
Paul Bakker38119b12009-01-10 23:31:23 +000022 *
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000023 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
Paul Bakker38119b12009-01-10 23:31:23 +000024 */
25
Gilles Peskinedb09ef62020-06-03 01:43:33 +020026#include "common.h"
Paul Bakker38119b12009-01-10 23:31:23 +000027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if defined(MBEDTLS_CAMELLIA_C)
Paul Bakker38119b12009-01-10 23:31:23 +000029
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000030#include "mbedtls/camellia.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050031#include "mbedtls/platform_util.h"
Paul Bakker38119b12009-01-10 23:31:23 +000032
Rich Evans00ab4702015-02-06 13:43:58 +000033#include <string.h>
Manuel Pégourié-Gonnard394608e2015-02-17 16:01:07 +010034
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000035#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020037#if !defined(MBEDTLS_CAMELLIA_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020038
Paul Bakker38119b12009-01-10 23:31:23 +000039static const unsigned char SIGMA_CHARS[6][8] =
40{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000041 { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
42 { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
43 { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
44 { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
45 { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
46 { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
Paul Bakker38119b12009-01-10 23:31:23 +000047};
48
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020049#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
Paul Bakkerfa049db2009-01-12 22:12:03 +000050
51static const unsigned char FSb[256] =
Paul Bakker38119b12009-01-10 23:31:23 +000052{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000053 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
54 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
55 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
56 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
57 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
58 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
59 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
60 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
61 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
62 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
63 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
64 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
65 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
66 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
67 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
68 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
Paul Bakker38119b12009-01-10 23:31:23 +000069};
70
71#define SBOX1(n) FSb[(n)]
72#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
73#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
Paul Bakkerfa049db2009-01-12 22:12:03 +000074#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
75
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020076#else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +000077
Paul Bakkerc32c6b52009-01-11 21:36:43 +000078static const unsigned char FSb[256] =
79{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +020080 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65,
81 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189,
82 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26,
83 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77,
84 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153,
85 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215,
86 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
87 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80,
88 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210,
89 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148,
90 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226,
91 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46,
92 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89,
93 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
94 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164,
95 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +000096};
97
98static const unsigned char FSb2[256] =
99{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200100 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
101 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
102 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
103 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
104 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
105 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
106 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
107 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
108 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
109 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
110 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
111 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
112 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
113 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
114 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
115 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000116};
117
118static const unsigned char FSb3[256] =
119{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200120 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
121 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
122 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
123 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
124 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
125 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
126 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
127 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
128 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
129 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
130 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
131 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
132 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
133 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
134 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
135 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000136};
137
138static const unsigned char FSb4[256] =
139{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200140 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
141 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
142 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
143 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
144 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
145 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
146 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
147 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
148 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
149 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
150 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
151 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
152 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
153 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
154 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
155 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000156};
157
158#define SBOX1(n) FSb[(n)]
159#define SBOX2(n) FSb2[(n)]
160#define SBOX3(n) FSb3[(n)]
161#define SBOX4(n) FSb4[(n)]
Paul Bakker38119b12009-01-10 23:31:23 +0000162
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200163#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000164
Paul Bakker38119b12009-01-10 23:31:23 +0000165static const unsigned char shifts[2][4][4] =
166{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000167 {
168 { 1, 1, 1, 1 }, /* KL */
169 { 0, 0, 0, 0 }, /* KR */
170 { 1, 1, 1, 1 }, /* KA */
171 { 0, 0, 0, 0 } /* KB */
172 },
173 {
174 { 1, 0, 1, 1 }, /* KL */
175 { 1, 1, 0, 1 }, /* KR */
176 { 1, 1, 1, 0 }, /* KA */
177 { 1, 1, 0, 1 } /* KB */
178 }
Paul Bakker38119b12009-01-10 23:31:23 +0000179};
180
Paul Bakker026c03b2009-03-28 17:53:03 +0000181static const signed char indexes[2][4][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000182{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000183 {
184 { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39,
185 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
186 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
187 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
188 { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17,
189 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
190 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
191 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */
192 },
193 {
194 { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1,
195 -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
196 { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17,
197 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
198 { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
199 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
200 { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21,
201 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */
202 }
Paul Bakker38119b12009-01-10 23:31:23 +0000203};
204
Paul Bakker026c03b2009-03-28 17:53:03 +0000205static const signed char transposes[2][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000206{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000207 {
208 21, 22, 23, 20,
209 -1, -1, -1, -1,
210 18, 19, 16, 17,
211 11, 8, 9, 10,
212 15, 12, 13, 14
213 },
214 {
215 25, 26, 27, 24,
216 29, 30, 31, 28,
217 18, 19, 16, 17,
218 -1, -1, -1, -1,
219 -1, -1, -1, -1
220 }
Paul Bakker38119b12009-01-10 23:31:23 +0000221};
222
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000223/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000224#define ROTL(DEST, SRC, SHIFT) \
225{ \
226 (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \
227 (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \
228 (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \
229 (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \
Paul Bakker38119b12009-01-10 23:31:23 +0000230}
231
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000232#define FL(XL, XR, KL, KR) \
233{ \
234 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
235 (XL) = ((XR) | (KR)) ^ (XL); \
Paul Bakker38119b12009-01-10 23:31:23 +0000236}
Paul Bakker9af723c2014-05-01 13:03:14 +0200237
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000238#define FLInv(YL, YR, KL, KR) \
239{ \
240 (YL) = ((YR) | (KR)) ^ (YL); \
241 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
Paul Bakker38119b12009-01-10 23:31:23 +0000242}
Paul Bakker9af723c2014-05-01 13:03:14 +0200243
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000244#define SHIFT_AND_PLACE(INDEX, OFFSET) \
245{ \
246 TK[0] = KC[(OFFSET) * 4 + 0]; \
247 TK[1] = KC[(OFFSET) * 4 + 1]; \
248 TK[2] = KC[(OFFSET) * 4 + 2]; \
249 TK[3] = KC[(OFFSET) * 4 + 3]; \
250 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200251 for( i = 1; i <= 4; i++ ) \
252 if( shifts[(INDEX)][(OFFSET)][i -1] ) \
253 ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000254 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200255 for( i = 0; i < 20; i++ ) \
256 if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
257 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
258 } \
Paul Bakker38119b12009-01-10 23:31:23 +0000259}
260
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200261static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
262 uint32_t z[2])
Paul Bakker38119b12009-01-10 23:31:23 +0000263{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000264 uint32_t I0, I1;
265 I0 = x[0] ^ k[0];
266 I1 = x[1] ^ k[1];
Paul Bakker38119b12009-01-10 23:31:23 +0000267
Joe Subbianicd84d762021-07-08 14:59:52 +0100268 I0 = ((uint32_t) SBOX1( MBEDTLS_BYTE_3( I0 )) << 24) |
269 ((uint32_t) SBOX2( MBEDTLS_BYTE_2( I0 )) << 16) |
270 ((uint32_t) SBOX3( MBEDTLS_BYTE_1( I0 )) << 8) |
271 ((uint32_t) SBOX4( MBEDTLS_BYTE_0( I0 )) );
272 I1 = ((uint32_t) SBOX2( MBEDTLS_BYTE_3( I1 )) << 24) |
273 ((uint32_t) SBOX3( MBEDTLS_BYTE_2( I1 )) << 16) |
274 ((uint32_t) SBOX4( MBEDTLS_BYTE_1( I1 )) << 8) |
275 ((uint32_t) SBOX1( MBEDTLS_BYTE_0( I1 )) );
Paul Bakker38119b12009-01-10 23:31:23 +0000276
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000277 I0 ^= (I1 << 8) | (I1 >> 24);
278 I1 ^= (I0 << 16) | (I0 >> 16);
279 I0 ^= (I1 >> 8) | (I1 << 24);
280 I1 ^= (I0 >> 8) | (I0 << 24);
Paul Bakker38119b12009-01-10 23:31:23 +0000281
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000282 z[0] ^= I1;
283 z[1] ^= I0;
Paul Bakker38119b12009-01-10 23:31:23 +0000284}
285
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200287{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200288 memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200289}
290
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200291void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200292{
293 if( ctx == NULL )
294 return;
295
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500296 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200297}
298
Paul Bakker38119b12009-01-10 23:31:23 +0000299/*
300 * Camellia key schedule (encryption)
301 */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500302int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx,
303 const unsigned char *key,
304 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000305{
Paul Bakker23986e52011-04-24 08:57:21 +0000306 int idx;
307 size_t i;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000308 uint32_t *RK;
Paul Bakker38119b12009-01-10 23:31:23 +0000309 unsigned char t[64];
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000310 uint32_t SIGMA[6][2];
311 uint32_t KC[16];
312 uint32_t TK[20];
Paul Bakker38119b12009-01-10 23:31:23 +0000313
314 RK = ctx->rk;
315
Paul Bakker66d5d072014-06-17 16:39:18 +0200316 memset( t, 0, 64 );
317 memset( RK, 0, sizeof(ctx->rk) );
Paul Bakker38119b12009-01-10 23:31:23 +0000318
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200319 switch( keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000320 {
321 case 128: ctx->nr = 3; idx = 0; break;
322 case 192:
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000323 case 256: ctx->nr = 4; idx = 1; break;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500324 default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000325 }
326
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200327 for( i = 0; i < keybits / 8; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000328 t[i] = key[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000329
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200330 if( keybits == 192 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200331 for( i = 0; i < 8; i++ )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000332 t[24 + i] = ~t[16 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000333 }
334
Paul Bakker38119b12009-01-10 23:31:23 +0000335 /*
336 * Prepare SIGMA values
337 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200338 for( i = 0; i < 6; i++ ) {
Joe Subbiani6a506312021-07-07 16:56:29 +0100339 SIGMA[i][0] = MBEDTLS_GET_UINT32_BE( SIGMA_CHARS[i], 0 );
340 SIGMA[i][1] = MBEDTLS_GET_UINT32_BE( SIGMA_CHARS[i], 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000341 }
342
343 /*
344 * Key storage in KC
345 * Order: KL, KR, KA, KB
346 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200347 memset( KC, 0, sizeof(KC) );
Paul Bakker38119b12009-01-10 23:31:23 +0000348
349 /* Store KL, KR */
Paul Bakker66d5d072014-06-17 16:39:18 +0200350 for( i = 0; i < 8; i++ )
Joe Subbiani6a506312021-07-07 16:56:29 +0100351 KC[i] = MBEDTLS_GET_UINT32_BE( t, i * 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000352
353 /* Generate KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200354 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000355 KC[8 + i] = KC[i] ^ KC[4 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000356
Paul Bakker66d5d072014-06-17 16:39:18 +0200357 camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
358 camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000359
Paul Bakker66d5d072014-06-17 16:39:18 +0200360 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000361 KC[8 + i] ^= KC[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000362
Paul Bakker66d5d072014-06-17 16:39:18 +0200363 camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
364 camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000365
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200366 if( keybits > 128 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000367 /* Generate KB */
Paul Bakker66d5d072014-06-17 16:39:18 +0200368 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000369 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000370
Paul Bakker66d5d072014-06-17 16:39:18 +0200371 camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
372 camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000373 }
374
375 /*
376 * Generating subkeys
Paul Bakker9af723c2014-05-01 13:03:14 +0200377 */
Paul Bakker38119b12009-01-10 23:31:23 +0000378
379 /* Manipulating KL */
Paul Bakker66d5d072014-06-17 16:39:18 +0200380 SHIFT_AND_PLACE( idx, 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000381
382 /* Manipulating KR */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200383 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200384 SHIFT_AND_PLACE( idx, 1 );
Paul Bakker38119b12009-01-10 23:31:23 +0000385 }
386
387 /* Manipulating KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200388 SHIFT_AND_PLACE( idx, 2 );
Paul Bakker38119b12009-01-10 23:31:23 +0000389
390 /* Manipulating KB */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200391 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200392 SHIFT_AND_PLACE( idx, 3 );
Paul Bakker38119b12009-01-10 23:31:23 +0000393 }
394
395 /* Do transpositions */
Paul Bakker66d5d072014-06-17 16:39:18 +0200396 for( i = 0; i < 20; i++ ) {
397 if( transposes[idx][i] != -1 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000398 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
399 }
Paul Bakker38119b12009-01-10 23:31:23 +0000400 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000401
402 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000403}
404
405/*
406 * Camellia key schedule (decryption)
407 */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500408int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx,
409 const unsigned char *key,
410 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000411{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200412 int idx, ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000413 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414 mbedtls_camellia_context cty;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000415 uint32_t *RK;
416 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200417
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200418 mbedtls_camellia_init( &cty );
Paul Bakker38119b12009-01-10 23:31:23 +0000419
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200420 /* Also checks keybits */
421 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200422 goto exit;
Paul Bakker38119b12009-01-10 23:31:23 +0000423
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200424 ctx->nr = cty.nr;
425 idx = ( ctx->nr == 4 );
426
427 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000428 SK = cty.rk + 24 * 2 + 8 * idx * 2;
429
430 *RK++ = *SK++;
431 *RK++ = *SK++;
432 *RK++ = *SK++;
433 *RK++ = *SK++;
434
Paul Bakker66d5d072014-06-17 16:39:18 +0200435 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
Paul Bakker38119b12009-01-10 23:31:23 +0000436 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000437 *RK++ = *SK++;
438 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000439 }
440
441 SK -= 2;
442
443 *RK++ = *SK++;
444 *RK++ = *SK++;
445 *RK++ = *SK++;
446 *RK++ = *SK++;
447
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200448exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200449 mbedtls_camellia_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000450
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200451 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000452}
453
454/*
455 * Camellia-ECB block encryption/decryption
456 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200457int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000458 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000459 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000460 unsigned char output[16] )
461{
Paul Bakker026c03b2009-03-28 17:53:03 +0000462 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000463 uint32_t *RK, X[4];
Tuvshinzaya Erdenekhuu1fd7f982022-08-05 15:31:57 +0100464 if( mode != MBEDTLS_CAMELLIA_ENCRYPT && mode != MBEDTLS_CAMELLIA_DECRYPT )
465 return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA;
Paul Bakker38119b12009-01-10 23:31:23 +0000466
Paul Bakkerc2547b02009-07-20 20:40:52 +0000467 ( (void) mode );
468
Paul Bakker38119b12009-01-10 23:31:23 +0000469 NR = ctx->nr;
470 RK = ctx->rk;
471
Joe Subbiani6a506312021-07-07 16:56:29 +0100472 X[0] = MBEDTLS_GET_UINT32_BE( input, 0 );
473 X[1] = MBEDTLS_GET_UINT32_BE( input, 4 );
474 X[2] = MBEDTLS_GET_UINT32_BE( input, 8 );
475 X[3] = MBEDTLS_GET_UINT32_BE( input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000476
477 X[0] ^= *RK++;
478 X[1] ^= *RK++;
479 X[2] ^= *RK++;
480 X[3] ^= *RK++;
481
Paul Bakker66d5d072014-06-17 16:39:18 +0200482 while( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000483 --NR;
Paul Bakker66d5d072014-06-17 16:39:18 +0200484 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000485 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200486 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000487 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200488 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000489 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200490 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000491 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200492 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000493 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200494 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000495 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000496
Paul Bakker66d5d072014-06-17 16:39:18 +0200497 if( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000498 FL(X[0], X[1], RK[0], RK[1]);
499 RK += 2;
500 FLInv(X[2], X[3], RK[0], RK[1]);
501 RK += 2;
502 }
Paul Bakker38119b12009-01-10 23:31:23 +0000503 }
504
505 X[2] ^= *RK++;
506 X[3] ^= *RK++;
507 X[0] ^= *RK++;
508 X[1] ^= *RK++;
509
Joe Subbiani5ecac212021-06-24 13:00:03 +0100510 MBEDTLS_PUT_UINT32_BE( X[2], output, 0 );
511 MBEDTLS_PUT_UINT32_BE( X[3], output, 4 );
512 MBEDTLS_PUT_UINT32_BE( X[0], output, 8 );
513 MBEDTLS_PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000514
515 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000516}
517
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200518#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000519/*
520 * Camellia-CBC buffer encryption/decryption
521 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200522int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500523 int mode,
524 size_t length,
525 unsigned char iv[16],
526 const unsigned char *input,
527 unsigned char *output )
Paul Bakker38119b12009-01-10 23:31:23 +0000528{
529 int i;
530 unsigned char temp[16];
Tuvshinzaya Erdenekhuu1fd7f982022-08-05 15:31:57 +0100531 if( mode != MBEDTLS_CAMELLIA_ENCRYPT && mode != MBEDTLS_CAMELLIA_DECRYPT )
532 return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA;
Paul Bakker38119b12009-01-10 23:31:23 +0000533
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000534 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200535 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000536
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200537 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000538 {
539 while( length > 0 )
540 {
541 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200542 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000543
544 for( i = 0; i < 16; i++ )
545 output[i] = (unsigned char)( output[i] ^ iv[i] );
546
547 memcpy( iv, temp, 16 );
548
549 input += 16;
550 output += 16;
551 length -= 16;
552 }
553 }
554 else
555 {
556 while( length > 0 )
557 {
558 for( i = 0; i < 16; i++ )
559 output[i] = (unsigned char)( input[i] ^ iv[i] );
560
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200561 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000562 memcpy( iv, output, 16 );
563
564 input += 16;
565 output += 16;
566 length -= 16;
567 }
568 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000569
570 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000571}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200572#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000573
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000575/*
576 * Camellia-CFB128 buffer encryption/decryption
577 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200578int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000579 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000580 size_t length,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000581 size_t *iv_off,
Paul Bakker38119b12009-01-10 23:31:23 +0000582 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000583 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000584 unsigned char *output )
585{
Paul Bakker1ef71df2011-06-09 14:14:58 +0000586 int c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500587 size_t n;
Tuvshinzaya Erdenekhuu1fd7f982022-08-05 15:31:57 +0100588 if( mode != MBEDTLS_CAMELLIA_ENCRYPT && mode != MBEDTLS_CAMELLIA_DECRYPT )
589 return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500590
591 n = *iv_off;
592 if( n >= 16 )
593 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000594
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200595 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000596 {
597 while( length-- )
598 {
599 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200600 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000601
602 c = *input++;
603 *output++ = (unsigned char)( c ^ iv[n] );
604 iv[n] = (unsigned char) c;
605
Paul Bakker66d5d072014-06-17 16:39:18 +0200606 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000607 }
608 }
609 else
610 {
611 while( length-- )
612 {
613 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200614 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000615
616 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
617
Paul Bakker66d5d072014-06-17 16:39:18 +0200618 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000619 }
620 }
621
622 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000623
624 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000625}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200626#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000629/*
630 * Camellia-CTR buffer encryption/decryption
631 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200632int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000633 size_t length,
634 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000635 unsigned char nonce_counter[16],
636 unsigned char stream_block[16],
637 const unsigned char *input,
638 unsigned char *output )
639{
Paul Bakker369e14b2012-04-18 14:16:09 +0000640 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500641 size_t n;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500642
643 n = *nc_off;
644 if( n >= 16 )
645 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000646
647 while( length-- )
648 {
649 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200650 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200651 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000652
Paul Bakker369e14b2012-04-18 14:16:09 +0000653 for( i = 16; i > 0; i-- )
654 if( ++nonce_counter[i - 1] != 0 )
655 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000656 }
657 c = *input++;
658 *output++ = (unsigned char)( c ^ stream_block[n] );
659
Paul Bakker66d5d072014-06-17 16:39:18 +0200660 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000661 }
662
663 *nc_off = n;
664
665 return( 0 );
666}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200667#endif /* MBEDTLS_CIPHER_MODE_CTR */
668#endif /* !MBEDTLS_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000669
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200670#if defined(MBEDTLS_SELF_TEST)
Paul Bakker38119b12009-01-10 23:31:23 +0000671
Paul Bakker38119b12009-01-10 23:31:23 +0000672/*
673 * Camellia test vectors from:
674 *
675 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
676 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
677 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000678 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000679 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000680#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000681
682static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
683{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000684 {
685 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
686 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200687 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000688 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
689 },
690 {
691 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
692 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
693 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200694 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000695 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
696 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
697 },
698 {
699 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
700 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
701 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
702 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200703 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000704 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
706 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
707 },
Paul Bakker38119b12009-01-10 23:31:23 +0000708};
709
710static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
711{
712 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
713 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200714 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000715 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
716};
717
718static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
719{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000720 {
721 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
722 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
723 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
724 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
725 },
726 {
727 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
728 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
729 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
730 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
731 },
732 {
733 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
734 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
735 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
736 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
737 }
Paul Bakker38119b12009-01-10 23:31:23 +0000738};
739
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200740#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000741#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000742
743static const unsigned char camellia_test_cbc_key[3][32] =
744{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000745 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
746 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
747 ,
748 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
749 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
750 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
751 ,
752 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
753 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
754 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
755 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000756};
757
758static const unsigned char camellia_test_cbc_iv[16] =
759
760 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
761 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
762;
763
764static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
765{
766 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
767 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
768 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
769 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
770 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
771 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
772
773};
774
775static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
776{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000777 {
778 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
779 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
780 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
781 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
782 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
783 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
784 },
785 {
786 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
787 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
788 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
789 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
790 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
791 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
792 },
793 {
794 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
795 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
796 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
797 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
798 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
799 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
800 }
Paul Bakker38119b12009-01-10 23:31:23 +0000801};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200802#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000803
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200804#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000805/*
806 * Camellia-CTR test vectors from:
807 *
808 * http://www.faqs.org/rfcs/rfc5528.html
809 */
810
811static const unsigned char camellia_test_ctr_key[3][16] =
812{
813 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
814 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
815 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
816 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
817 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
818 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
819};
820
821static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
822{
823 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
825 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
826 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
827 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
828 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
829};
830
831static const unsigned char camellia_test_ctr_pt[3][48] =
832{
833 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
834 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
835
836 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
837 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
838 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
839 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
840
841 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
842 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
843 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
844 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
845 0x20, 0x21, 0x22, 0x23 }
846};
847
848static const unsigned char camellia_test_ctr_ct[3][48] =
849{
850 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
851 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
852 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
853 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
854 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
855 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
856 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
857 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
858 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
859 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
860 0xDF, 0x50, 0x86, 0x96 }
861};
862
863static const int camellia_test_ctr_len[3] =
864 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000866
867/*
868 * Checkup routine
869 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200870int mbedtls_camellia_self_test( int verbose )
Paul Bakker38119b12009-01-10 23:31:23 +0000871{
Paul Bakker026c03b2009-03-28 17:53:03 +0000872 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000873 unsigned char key[32];
874 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000875 unsigned char src[16];
876 unsigned char dst[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200877#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000878 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200879#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200880#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000881 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000882 unsigned char nonce_counter[16];
883 unsigned char stream_block[16];
884#endif
Gilles Peskinec537aa82021-05-25 09:17:46 +0200885 int ret = 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000886
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200887 mbedtls_camellia_context ctx;
Paul Bakker38119b12009-01-10 23:31:23 +0000888
Gilles Peskinec537aa82021-05-25 09:17:46 +0200889 mbedtls_camellia_init( &ctx );
Paul Bakker38119b12009-01-10 23:31:23 +0000890 memset( key, 0, 32 );
891
Paul Bakker66d5d072014-06-17 16:39:18 +0200892 for( j = 0; j < 6; j++ ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000893 u = j >> 1;
894 v = j & 1;
Paul Bakker38119b12009-01-10 23:31:23 +0000895
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000896 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200897 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
898 (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
Paul Bakker38119b12009-01-10 23:31:23 +0000899
Paul Bakker66d5d072014-06-17 16:39:18 +0200900 for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
901 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000902
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200903 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
904 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200905 memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
906 memcpy( dst, camellia_test_ecb_plain[i], 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200907 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
908 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200909 memcpy( src, camellia_test_ecb_plain[i], 16 );
910 memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000911 }
Paul Bakker38119b12009-01-10 23:31:23 +0000912
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200913 mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
Paul Bakker38119b12009-01-10 23:31:23 +0000914
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000915 if( memcmp( buf, dst, 16 ) != 0 )
916 {
917 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200918 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +0200919 goto exit;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000920 }
921 }
Paul Bakker38119b12009-01-10 23:31:23 +0000922
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000923 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200924 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000925 }
926
927 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200928 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000929
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200930#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000931 /*
932 * CBC mode
933 */
934 for( j = 0; j < 6; j++ )
935 {
936 u = j >> 1;
937 v = j & 1;
938
939 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200940 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
941 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +0000942
Janos Follath98e28a72016-05-31 14:03:54 +0100943 memcpy( src, camellia_test_cbc_iv, 16 );
944 memcpy( dst, camellia_test_cbc_iv, 16 );
945 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000946
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200947 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Janos Follath98e28a72016-05-31 14:03:54 +0100948 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
949 } else {
950 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000951 }
Paul Bakker38119b12009-01-10 23:31:23 +0000952
Janos Follath98e28a72016-05-31 14:03:54 +0100953 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +0000954
Janos Follath98e28a72016-05-31 14:03:54 +0100955 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
956 memcpy( iv , src, 16 );
957 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
958 memcpy( dst, camellia_test_cbc_plain[i], 16 );
959 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
960 memcpy( iv , dst, 16 );
961 memcpy( src, camellia_test_cbc_plain[i], 16 );
962 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
963 }
Paul Bakker38119b12009-01-10 23:31:23 +0000964
Janos Follath98e28a72016-05-31 14:03:54 +0100965 mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
966
967 if( memcmp( buf, dst, 16 ) != 0 )
968 {
969 if( verbose != 0 )
970 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +0200971 goto exit;
Janos Follath98e28a72016-05-31 14:03:54 +0100972 }
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000973 }
Paul Bakker38119b12009-01-10 23:31:23 +0000974
975 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200976 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000977 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200978#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000979
980 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200981 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000982
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200983#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000984 /*
985 * CTR mode
986 */
987 for( i = 0; i < 6; i++ )
988 {
989 u = i >> 1;
990 v = i & 1;
991
992 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
994 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000995
996 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
997 memcpy( key, camellia_test_ctr_key[u], 16 );
998
999 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001000 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001001
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001002 if( v == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001003 {
1004 len = camellia_test_ctr_len[u];
1005 memcpy( buf, camellia_test_ctr_ct[u], len );
1006
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001007 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001008 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001009
1010 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1011 {
1012 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001013 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +02001014 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001015 }
1016 }
1017 else
1018 {
1019 len = camellia_test_ctr_len[u];
1020 memcpy( buf, camellia_test_ctr_pt[u], len );
1021
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001023 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001024
1025 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1026 {
1027 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +02001029 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001030 }
1031 }
1032
1033 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001034 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001035 }
1036
1037 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001038 mbedtls_printf( "\n" );
1039#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001040
Gilles Peskinec537aa82021-05-25 09:17:46 +02001041 ret = 0;
1042
1043exit:
1044 mbedtls_camellia_free( &ctx );
1045 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +00001046}
1047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001048#endif /* MBEDTLS_SELF_TEST */
Paul Bakker38119b12009-01-10 23:31:23 +00001049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001050#endif /* MBEDTLS_CAMELLIA_C */