1 /*
2 * Camellia implementation
3 *
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19 /*
20 * The Camellia block cipher was designed by NTT and Mitsubishi Electric
21 * Corporation.
22 *
23 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
24 */
25
26 #include "common.h"
27
28 #if defined(MBEDTLS_CAMELLIA_C)
29
30 #include "mbedtls/camellia.h"
31 #include "mbedtls/platform_util.h"
32
33 #include <string.h>
34
35 #include "mbedtls/platform.h"
36
37 #if !defined(MBEDTLS_CAMELLIA_ALT)
38
39 static const unsigned char SIGMA_CHARS[6][8] =
40 {
41 { 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 }
47 };
48
49 #if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
50
51 static const unsigned char FSb[256] =
52 {
53 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
69 };
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)
74 #define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
75
76 #else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
77
78 static const unsigned char FSb[256] =
79 {
80 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
96 };
97
98 static const unsigned char FSb2[256] =
99 {
100 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
116 };
117
118 static const unsigned char FSb3[256] =
119 {
120 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
136 };
137
138 static const unsigned char FSb4[256] =
139 {
140 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
156 };
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)]
162
163 #endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
164
165 static const unsigned char shifts[2][4][4] =
166 {
167 {
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 }
179 };
180
181 static const signed char indexes[2][4][20] =
182 {
183 {
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 }
203 };
204
205 static const signed char transposes[2][20] =
206 {
207 {
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 }
221 };
222
223 /* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
224 #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)); \
230 }
231
232 #define FL(XL, XR, KL, KR) \
233 { \
234 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
235 (XL) = ((XR) | (KR)) ^ (XL); \
236 }
237
238 #define FLInv(YL, YR, KL, KR) \
239 { \
240 (YL) = ((YR) | (KR)) ^ (YL); \
241 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
242 }
243
244 #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 \
251 for( i = 1; i <= 4; i++ ) \
252 if( shifts[(INDEX)][(OFFSET)][i -1] ) \
253 ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
254 \
255 for( i = 0; i < 20; i++ ) \
256 if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
257 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
258 } \
259 }
260
camellia_feistel(const uint32_t x[2],const uint32_t k[2],uint32_t z[2])261 static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
262 uint32_t z[2])
263 {
264 uint32_t I0, I1;
265 I0 = x[0] ^ k[0];
266 I1 = x[1] ^ k[1];
267
268 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 )) );
276
277 I0 ^= (I1 << 8) | (I1 >> 24);
278 I1 ^= (I0 << 16) | (I0 >> 16);
279 I0 ^= (I1 >> 8) | (I1 << 24);
280 I1 ^= (I0 >> 8) | (I0 << 24);
281
282 z[0] ^= I1;
283 z[1] ^= I0;
284 }
285
mbedtls_camellia_init(mbedtls_camellia_context * ctx)286 void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
287 {
288 memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
289 }
290
mbedtls_camellia_free(mbedtls_camellia_context * ctx)291 void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
292 {
293 if( ctx == NULL )
294 return;
295
296 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
297 }
298
299 /*
300 * Camellia key schedule (encryption)
301 */
mbedtls_camellia_setkey_enc(mbedtls_camellia_context * ctx,const unsigned char * key,unsigned int keybits)302 int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx,
303 const unsigned char *key,
304 unsigned int keybits )
305 {
306 int idx;
307 size_t i;
308 uint32_t *RK;
309 unsigned char t[64];
310 uint32_t SIGMA[6][2];
311 uint32_t KC[16];
312 uint32_t TK[20];
313
314 RK = ctx->rk;
315
316 memset( t, 0, 64 );
317 memset( RK, 0, sizeof(ctx->rk) );
318
319 switch( keybits )
320 {
321 case 128: ctx->nr = 3; idx = 0; break;
322 case 192:
323 case 256: ctx->nr = 4; idx = 1; break;
324 default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
325 }
326
327 for( i = 0; i < keybits / 8; ++i )
328 t[i] = key[i];
329
330 if( keybits == 192 ) {
331 for( i = 0; i < 8; i++ )
332 t[24 + i] = ~t[16 + i];
333 }
334
335 /*
336 * Prepare SIGMA values
337 */
338 for( i = 0; i < 6; i++ ) {
339 SIGMA[i][0] = MBEDTLS_GET_UINT32_BE( SIGMA_CHARS[i], 0 );
340 SIGMA[i][1] = MBEDTLS_GET_UINT32_BE( SIGMA_CHARS[i], 4 );
341 }
342
343 /*
344 * Key storage in KC
345 * Order: KL, KR, KA, KB
346 */
347 memset( KC, 0, sizeof(KC) );
348
349 /* Store KL, KR */
350 for( i = 0; i < 8; i++ )
351 KC[i] = MBEDTLS_GET_UINT32_BE( t, i * 4 );
352
353 /* Generate KA */
354 for( i = 0; i < 4; ++i )
355 KC[8 + i] = KC[i] ^ KC[4 + i];
356
357 camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
358 camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
359
360 for( i = 0; i < 4; ++i )
361 KC[8 + i] ^= KC[i];
362
363 camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
364 camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
365
366 if( keybits > 128 ) {
367 /* Generate KB */
368 for( i = 0; i < 4; ++i )
369 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
370
371 camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
372 camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
373 }
374
375 /*
376 * Generating subkeys
377 */
378
379 /* Manipulating KL */
380 SHIFT_AND_PLACE( idx, 0 );
381
382 /* Manipulating KR */
383 if( keybits > 128 ) {
384 SHIFT_AND_PLACE( idx, 1 );
385 }
386
387 /* Manipulating KA */
388 SHIFT_AND_PLACE( idx, 2 );
389
390 /* Manipulating KB */
391 if( keybits > 128 ) {
392 SHIFT_AND_PLACE( idx, 3 );
393 }
394
395 /* Do transpositions */
396 for( i = 0; i < 20; i++ ) {
397 if( transposes[idx][i] != -1 ) {
398 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
399 }
400 }
401
402 return( 0 );
403 }
404
405 /*
406 * Camellia key schedule (decryption)
407 */
mbedtls_camellia_setkey_dec(mbedtls_camellia_context * ctx,const unsigned char * key,unsigned int keybits)408 int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx,
409 const unsigned char *key,
410 unsigned int keybits )
411 {
412 int idx, ret;
413 size_t i;
414 mbedtls_camellia_context cty;
415 uint32_t *RK;
416 uint32_t *SK;
417
418 mbedtls_camellia_init( &cty );
419
420 /* Also checks keybits */
421 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
422 goto exit;
423
424 ctx->nr = cty.nr;
425 idx = ( ctx->nr == 4 );
426
427 RK = ctx->rk;
428 SK = cty.rk + 24 * 2 + 8 * idx * 2;
429
430 *RK++ = *SK++;
431 *RK++ = *SK++;
432 *RK++ = *SK++;
433 *RK++ = *SK++;
434
435 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
436 {
437 *RK++ = *SK++;
438 *RK++ = *SK++;
439 }
440
441 SK -= 2;
442
443 *RK++ = *SK++;
444 *RK++ = *SK++;
445 *RK++ = *SK++;
446 *RK++ = *SK++;
447
448 exit:
449 mbedtls_camellia_free( &cty );
450
451 return( ret );
452 }
453
454 /*
455 * Camellia-ECB block encryption/decryption
456 */
mbedtls_camellia_crypt_ecb(mbedtls_camellia_context * ctx,int mode,const unsigned char input[16],unsigned char output[16])457 int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
458 int mode,
459 const unsigned char input[16],
460 unsigned char output[16] )
461 {
462 int NR;
463 uint32_t *RK, X[4];
464 if( mode != MBEDTLS_CAMELLIA_ENCRYPT && mode != MBEDTLS_CAMELLIA_DECRYPT )
465 return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA;
466
467 ( (void) mode );
468
469 NR = ctx->nr;
470 RK = ctx->rk;
471
472 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 );
476
477 X[0] ^= *RK++;
478 X[1] ^= *RK++;
479 X[2] ^= *RK++;
480 X[3] ^= *RK++;
481
482 while( NR ) {
483 --NR;
484 camellia_feistel( X, RK, X + 2 );
485 RK += 2;
486 camellia_feistel( X + 2, RK, X );
487 RK += 2;
488 camellia_feistel( X, RK, X + 2 );
489 RK += 2;
490 camellia_feistel( X + 2, RK, X );
491 RK += 2;
492 camellia_feistel( X, RK, X + 2 );
493 RK += 2;
494 camellia_feistel( X + 2, RK, X );
495 RK += 2;
496
497 if( NR ) {
498 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 }
503 }
504
505 X[2] ^= *RK++;
506 X[3] ^= *RK++;
507 X[0] ^= *RK++;
508 X[1] ^= *RK++;
509
510 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 );
514
515 return( 0 );
516 }
517
518 #if defined(MBEDTLS_CIPHER_MODE_CBC)
519 /*
520 * Camellia-CBC buffer encryption/decryption
521 */
mbedtls_camellia_crypt_cbc(mbedtls_camellia_context * ctx,int mode,size_t length,unsigned char iv[16],const unsigned char * input,unsigned char * output)522 int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
523 int mode,
524 size_t length,
525 unsigned char iv[16],
526 const unsigned char *input,
527 unsigned char *output )
528 {
529 int i;
530 unsigned char temp[16];
531 if( mode != MBEDTLS_CAMELLIA_ENCRYPT && mode != MBEDTLS_CAMELLIA_DECRYPT )
532 return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA;
533
534 if( length % 16 )
535 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
536
537 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
538 {
539 while( length > 0 )
540 {
541 memcpy( temp, input, 16 );
542 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
543
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
561 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
562 memcpy( iv, output, 16 );
563
564 input += 16;
565 output += 16;
566 length -= 16;
567 }
568 }
569
570 return( 0 );
571 }
572 #endif /* MBEDTLS_CIPHER_MODE_CBC */
573
574 #if defined(MBEDTLS_CIPHER_MODE_CFB)
575 /*
576 * Camellia-CFB128 buffer encryption/decryption
577 */
mbedtls_camellia_crypt_cfb128(mbedtls_camellia_context * ctx,int mode,size_t length,size_t * iv_off,unsigned char iv[16],const unsigned char * input,unsigned char * output)578 int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
579 int mode,
580 size_t length,
581 size_t *iv_off,
582 unsigned char iv[16],
583 const unsigned char *input,
584 unsigned char *output )
585 {
586 int c;
587 size_t n;
588 if( mode != MBEDTLS_CAMELLIA_ENCRYPT && mode != MBEDTLS_CAMELLIA_DECRYPT )
589 return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA;
590
591 n = *iv_off;
592 if( n >= 16 )
593 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
594
595 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
596 {
597 while( length-- )
598 {
599 if( n == 0 )
600 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
601
602 c = *input++;
603 *output++ = (unsigned char)( c ^ iv[n] );
604 iv[n] = (unsigned char) c;
605
606 n = ( n + 1 ) & 0x0F;
607 }
608 }
609 else
610 {
611 while( length-- )
612 {
613 if( n == 0 )
614 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
615
616 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
617
618 n = ( n + 1 ) & 0x0F;
619 }
620 }
621
622 *iv_off = n;
623
624 return( 0 );
625 }
626 #endif /* MBEDTLS_CIPHER_MODE_CFB */
627
628 #if defined(MBEDTLS_CIPHER_MODE_CTR)
629 /*
630 * Camellia-CTR buffer encryption/decryption
631 */
mbedtls_camellia_crypt_ctr(mbedtls_camellia_context * ctx,size_t length,size_t * nc_off,unsigned char nonce_counter[16],unsigned char stream_block[16],const unsigned char * input,unsigned char * output)632 int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
633 size_t length,
634 size_t *nc_off,
635 unsigned char nonce_counter[16],
636 unsigned char stream_block[16],
637 const unsigned char *input,
638 unsigned char *output )
639 {
640 int c, i;
641 size_t n;
642
643 n = *nc_off;
644 if( n >= 16 )
645 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
646
647 while( length-- )
648 {
649 if( n == 0 ) {
650 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
651 stream_block );
652
653 for( i = 16; i > 0; i-- )
654 if( ++nonce_counter[i - 1] != 0 )
655 break;
656 }
657 c = *input++;
658 *output++ = (unsigned char)( c ^ stream_block[n] );
659
660 n = ( n + 1 ) & 0x0F;
661 }
662
663 *nc_off = n;
664
665 return( 0 );
666 }
667 #endif /* MBEDTLS_CIPHER_MODE_CTR */
668 #endif /* !MBEDTLS_CAMELLIA_ALT */
669
670 #if defined(MBEDTLS_SELF_TEST)
671
672 /*
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
678 * (For each bitlength: Key 0, Nr 39)
679 */
680 #define CAMELLIA_TESTS_ECB 2
681
682 static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
683 {
684 {
685 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
686 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
687 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
688 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 },
694 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
695 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 },
703 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
704 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 },
708 };
709
710 static 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 },
714 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
715 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
716 };
717
718 static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
719 {
720 {
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 }
738 };
739
740 #if defined(MBEDTLS_CIPHER_MODE_CBC)
741 #define CAMELLIA_TESTS_CBC 3
742
743 static const unsigned char camellia_test_cbc_key[3][32] =
744 {
745 { 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 }
756 };
757
758 static 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
764 static 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
775 static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
776 {
777 {
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 }
801 };
802 #endif /* MBEDTLS_CIPHER_MODE_CBC */
803
804 #if defined(MBEDTLS_CIPHER_MODE_CTR)
805 /*
806 * Camellia-CTR test vectors from:
807 *
808 * http://www.faqs.org/rfcs/rfc5528.html
809 */
810
811 static 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
821 static 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
831 static 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
848 static 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
863 static const int camellia_test_ctr_len[3] =
864 { 16, 32, 36 };
865 #endif /* MBEDTLS_CIPHER_MODE_CTR */
866
867 /*
868 * Checkup routine
869 */
mbedtls_camellia_self_test(int verbose)870 int mbedtls_camellia_self_test( int verbose )
871 {
872 int i, j, u, v;
873 unsigned char key[32];
874 unsigned char buf[64];
875 unsigned char src[16];
876 unsigned char dst[16];
877 #if defined(MBEDTLS_CIPHER_MODE_CBC)
878 unsigned char iv[16];
879 #endif
880 #if defined(MBEDTLS_CIPHER_MODE_CTR)
881 size_t offset, len;
882 unsigned char nonce_counter[16];
883 unsigned char stream_block[16];
884 #endif
885 int ret = 1;
886
887 mbedtls_camellia_context ctx;
888
889 mbedtls_camellia_init( &ctx );
890 memset( key, 0, 32 );
891
892 for( j = 0; j < 6; j++ ) {
893 u = j >> 1;
894 v = j & 1;
895
896 if( verbose != 0 )
897 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
898 (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
899
900 for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
901 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
902
903 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
904 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
905 memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
906 memcpy( dst, camellia_test_ecb_plain[i], 16 );
907 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
908 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
909 memcpy( src, camellia_test_ecb_plain[i], 16 );
910 memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
911 }
912
913 mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
914
915 if( memcmp( buf, dst, 16 ) != 0 )
916 {
917 if( verbose != 0 )
918 mbedtls_printf( "failed\n" );
919 goto exit;
920 }
921 }
922
923 if( verbose != 0 )
924 mbedtls_printf( "passed\n" );
925 }
926
927 if( verbose != 0 )
928 mbedtls_printf( "\n" );
929
930 #if defined(MBEDTLS_CIPHER_MODE_CBC)
931 /*
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 )
940 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
941 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
942
943 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 );
946
947 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
948 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
949 } else {
950 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
951 }
952
953 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
954
955 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 }
964
965 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" );
971 goto exit;
972 }
973 }
974
975 if( verbose != 0 )
976 mbedtls_printf( "passed\n" );
977 }
978 #endif /* MBEDTLS_CIPHER_MODE_CBC */
979
980 if( verbose != 0 )
981 mbedtls_printf( "\n" );
982
983 #if defined(MBEDTLS_CIPHER_MODE_CTR)
984 /*
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 )
993 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
994 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
995
996 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
997 memcpy( key, camellia_test_ctr_key[u], 16 );
998
999 offset = 0;
1000 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
1001
1002 if( v == MBEDTLS_CAMELLIA_DECRYPT )
1003 {
1004 len = camellia_test_ctr_len[u];
1005 memcpy( buf, camellia_test_ctr_ct[u], len );
1006
1007 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
1008 buf, buf );
1009
1010 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1011 {
1012 if( verbose != 0 )
1013 mbedtls_printf( "failed\n" );
1014 goto exit;
1015 }
1016 }
1017 else
1018 {
1019 len = camellia_test_ctr_len[u];
1020 memcpy( buf, camellia_test_ctr_pt[u], len );
1021
1022 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
1023 buf, buf );
1024
1025 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1026 {
1027 if( verbose != 0 )
1028 mbedtls_printf( "failed\n" );
1029 goto exit;
1030 }
1031 }
1032
1033 if( verbose != 0 )
1034 mbedtls_printf( "passed\n" );
1035 }
1036
1037 if( verbose != 0 )
1038 mbedtls_printf( "\n" );
1039 #endif /* MBEDTLS_CIPHER_MODE_CTR */
1040
1041 ret = 0;
1042
1043 exit:
1044 mbedtls_camellia_free( &ctx );
1045 return( ret );
1046 }
1047
1048 #endif /* MBEDTLS_SELF_TEST */
1049
1050 #endif /* MBEDTLS_CAMELLIA_C */
1051