2 * Camellia implementation
4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
5 * SPDX-License-Identifier: GPL-2.0
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 * This file is part of mbed TLS (https://tls.mbed.org)
24 * The Camellia block cipher was designed by NTT and Mitsubishi Electric
27 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
30 #if !defined(MBEDTLS_CONFIG_FILE)
31 #include "mbedtls/config.h"
33 #include MBEDTLS_CONFIG_FILE
36 #if defined(MBEDTLS_CAMELLIA_C)
38 #include "mbedtls/camellia.h"
39 #include "mbedtls/platform_util.h"
43 #if defined(MBEDTLS_SELF_TEST)
44 #if defined(MBEDTLS_PLATFORM_C)
45 #include "mbedtls/platform.h"
48 #define mbedtls_printf printf
49 #endif /* MBEDTLS_PLATFORM_C */
50 #endif /* MBEDTLS_SELF_TEST */
52 #if !defined(MBEDTLS_CAMELLIA_ALT)
55 * 32-bit integer manipulation macros (big endian)
58 #define GET_UINT32_BE(n,b,i) \
60 (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] ); \
68 #define PUT_UINT32_BE(n,b,i) \
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) ); \
77 static const unsigned char SIGMA_CHARS
[6][8] =
79 { 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 }
87 #if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
89 static const unsigned char FSb
[256] =
91 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
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)
112 #define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
114 #else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
116 static const unsigned char FSb
[256] =
118 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
136 static const unsigned char FSb2
[256] =
138 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
156 static const unsigned char FSb3
[256] =
158 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
176 static const unsigned char FSb4
[256] =
178 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
196 #define SBOX1(n) FSb[(n)]
197 #define SBOX2(n) FSb2[(n)]
198 #define SBOX3(n) FSb3[(n)]
199 #define SBOX4(n) FSb4[(n)]
201 #endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
203 static const unsigned char shifts
[2][4][4] =
206 { 1, 1, 1, 1 }, /* KL */
207 { 0, 0, 0, 0 }, /* KR */
208 { 1, 1, 1, 1 }, /* KA */
209 { 0, 0, 0, 0 } /* KB */
212 { 1, 0, 1, 1 }, /* KL */
213 { 1, 1, 0, 1 }, /* KR */
214 { 1, 1, 1, 0 }, /* KA */
215 { 1, 1, 0, 1 } /* KB */
219 static const signed char indexes
[2][4][20] =
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 */
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 */
243 static const signed char transposes
[2][20] =
261 /* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
262 #define ROTL(DEST, SRC, SHIFT) \
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)); \
270 #define FL(XL, XR, KL, KR) \
272 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
273 (XL) = ((XR) | (KR)) ^ (XL); \
276 #define FLInv(YL, YR, KL, KR) \
278 (YL) = ((YR) | (KR)) ^ (YL); \
279 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
282 #define SHIFT_AND_PLACE(INDEX, OFFSET) \
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]; \
289 for( i = 1; i <= 4; i++ ) \
290 if( shifts[(INDEX)][(OFFSET)][i -1] ) \
291 ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
293 for( i = 0; i < 20; i++ ) \
294 if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
295 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
299 static void camellia_feistel( const uint32_t x
[2], const uint32_t k
[2],
306 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) );
315 I0
^= (I1
<< 8) | (I1
>> 24);
316 I1
^= (I0
<< 16) | (I0
>> 16);
317 I0
^= (I1
>> 8) | (I1
<< 24);
318 I1
^= (I0
>> 8) | (I0
<< 24);
324 void mbedtls_camellia_init( mbedtls_camellia_context
*ctx
)
326 memset( ctx
, 0, sizeof( mbedtls_camellia_context
) );
329 void mbedtls_camellia_free( mbedtls_camellia_context
*ctx
)
334 mbedtls_platform_zeroize( ctx
, sizeof( mbedtls_camellia_context
) );
338 * Camellia key schedule (encryption)
340 int mbedtls_camellia_setkey_enc( mbedtls_camellia_context
*ctx
, const unsigned char *key
,
341 unsigned int keybits
)
347 uint32_t SIGMA
[6][2];
354 memset( RK
, 0, sizeof(ctx
->rk
) );
358 case 128: ctx
->nr
= 3; idx
= 0; break;
360 case 256: ctx
->nr
= 4; idx
= 1; break;
361 default : return( MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH
);
364 for( i
= 0; i
< keybits
/ 8; ++i
)
367 if( keybits
== 192 ) {
368 for( i
= 0; i
< 8; i
++ )
369 t
[24 + i
] = ~t
[16 + i
];
373 * Prepare SIGMA values
375 for( i
= 0; i
< 6; i
++ ) {
376 GET_UINT32_BE( SIGMA
[i
][0], SIGMA_CHARS
[i
], 0 );
377 GET_UINT32_BE( SIGMA
[i
][1], SIGMA_CHARS
[i
], 4 );
382 * Order: KL, KR, KA, KB
384 memset( KC
, 0, sizeof(KC
) );
387 for( i
= 0; i
< 8; i
++ )
388 GET_UINT32_BE( KC
[i
], t
, i
* 4 );
391 for( i
= 0; i
< 4; ++i
)
392 KC
[8 + i
] = KC
[i
] ^ KC
[4 + i
];
394 camellia_feistel( KC
+ 8, SIGMA
[0], KC
+ 10 );
395 camellia_feistel( KC
+ 10, SIGMA
[1], KC
+ 8 );
397 for( i
= 0; i
< 4; ++i
)
400 camellia_feistel( KC
+ 8, SIGMA
[2], KC
+ 10 );
401 camellia_feistel( KC
+ 10, SIGMA
[3], KC
+ 8 );
403 if( keybits
> 128 ) {
405 for( i
= 0; i
< 4; ++i
)
406 KC
[12 + i
] = KC
[4 + i
] ^ KC
[8 + i
];
408 camellia_feistel( KC
+ 12, SIGMA
[4], KC
+ 14 );
409 camellia_feistel( KC
+ 14, SIGMA
[5], KC
+ 12 );
416 /* Manipulating KL */
417 SHIFT_AND_PLACE( idx
, 0 );
419 /* Manipulating KR */
420 if( keybits
> 128 ) {
421 SHIFT_AND_PLACE( idx
, 1 );
424 /* Manipulating KA */
425 SHIFT_AND_PLACE( idx
, 2 );
427 /* Manipulating KB */
428 if( keybits
> 128 ) {
429 SHIFT_AND_PLACE( idx
, 3 );
432 /* Do transpositions */
433 for( i
= 0; i
< 20; i
++ ) {
434 if( transposes
[idx
][i
] != -1 ) {
435 RK
[32 + 12 * idx
+ i
] = RK
[transposes
[idx
][i
]];
443 * Camellia key schedule (decryption)
445 int mbedtls_camellia_setkey_dec( mbedtls_camellia_context
*ctx
, const unsigned char *key
,
446 unsigned int keybits
)
450 mbedtls_camellia_context cty
;
454 mbedtls_camellia_init( &cty
);
456 /* Also checks keybits */
457 if( ( ret
= mbedtls_camellia_setkey_enc( &cty
, key
, keybits
) ) != 0 )
461 idx
= ( ctx
->nr
== 4 );
464 SK
= cty
.rk
+ 24 * 2 + 8 * idx
* 2;
471 for( i
= 22 + 8 * idx
, SK
-= 6; i
> 0; i
--, SK
-= 4 )
485 mbedtls_camellia_free( &cty
);
491 * Camellia-ECB block encryption/decryption
493 int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context
*ctx
,
495 const unsigned char input
[16],
496 unsigned char output
[16] )
506 GET_UINT32_BE( X
[0], input
, 0 );
507 GET_UINT32_BE( X
[1], input
, 4 );
508 GET_UINT32_BE( X
[2], input
, 8 );
509 GET_UINT32_BE( X
[3], input
, 12 );
518 camellia_feistel( X
, RK
, X
+ 2 );
520 camellia_feistel( X
+ 2, RK
, X
);
522 camellia_feistel( X
, RK
, X
+ 2 );
524 camellia_feistel( X
+ 2, RK
, X
);
526 camellia_feistel( X
, RK
, X
+ 2 );
528 camellia_feistel( X
+ 2, RK
, X
);
532 FL(X
[0], X
[1], RK
[0], RK
[1]);
534 FLInv(X
[2], X
[3], RK
[0], RK
[1]);
544 PUT_UINT32_BE( X
[2], output
, 0 );
545 PUT_UINT32_BE( X
[3], output
, 4 );
546 PUT_UINT32_BE( X
[0], output
, 8 );
547 PUT_UINT32_BE( X
[1], output
, 12 );
552 #if defined(MBEDTLS_CIPHER_MODE_CBC)
554 * Camellia-CBC buffer encryption/decryption
556 int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context
*ctx
,
559 unsigned char iv
[16],
560 const unsigned char *input
,
561 unsigned char *output
)
564 unsigned char temp
[16];
567 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH
);
569 if( mode
== MBEDTLS_CAMELLIA_DECRYPT
)
573 memcpy( temp
, input
, 16 );
574 mbedtls_camellia_crypt_ecb( ctx
, mode
, input
, output
);
576 for( i
= 0; i
< 16; i
++ )
577 output
[i
] = (unsigned char)( output
[i
] ^ iv
[i
] );
579 memcpy( iv
, temp
, 16 );
590 for( i
= 0; i
< 16; i
++ )
591 output
[i
] = (unsigned char)( input
[i
] ^ iv
[i
] );
593 mbedtls_camellia_crypt_ecb( ctx
, mode
, output
, output
);
594 memcpy( iv
, output
, 16 );
604 #endif /* MBEDTLS_CIPHER_MODE_CBC */
606 #if defined(MBEDTLS_CIPHER_MODE_CFB)
608 * Camellia-CFB128 buffer encryption/decryption
610 int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context
*ctx
,
614 unsigned char iv
[16],
615 const unsigned char *input
,
616 unsigned char *output
)
621 if( mode
== MBEDTLS_CAMELLIA_DECRYPT
)
626 mbedtls_camellia_crypt_ecb( ctx
, MBEDTLS_CAMELLIA_ENCRYPT
, iv
, iv
);
629 *output
++ = (unsigned char)( c
^ iv
[n
] );
630 iv
[n
] = (unsigned char) c
;
632 n
= ( n
+ 1 ) & 0x0F;
640 mbedtls_camellia_crypt_ecb( ctx
, MBEDTLS_CAMELLIA_ENCRYPT
, iv
, iv
);
642 iv
[n
] = *output
++ = (unsigned char)( iv
[n
] ^ *input
++ );
644 n
= ( n
+ 1 ) & 0x0F;
652 #endif /* MBEDTLS_CIPHER_MODE_CFB */
654 #if defined(MBEDTLS_CIPHER_MODE_CTR)
656 * Camellia-CTR buffer encryption/decryption
658 int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context
*ctx
,
661 unsigned char nonce_counter
[16],
662 unsigned char stream_block
[16],
663 const unsigned char *input
,
664 unsigned char *output
)
672 mbedtls_camellia_crypt_ecb( ctx
, MBEDTLS_CAMELLIA_ENCRYPT
, nonce_counter
,
675 for( i
= 16; i
> 0; i
-- )
676 if( ++nonce_counter
[i
- 1] != 0 )
680 *output
++ = (unsigned char)( c
^ stream_block
[n
] );
682 n
= ( n
+ 1 ) & 0x0F;
689 #endif /* MBEDTLS_CIPHER_MODE_CTR */
690 #endif /* !MBEDTLS_CAMELLIA_ALT */
692 #if defined(MBEDTLS_SELF_TEST)
695 * Camellia test vectors from:
697 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
698 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
699 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
700 * (For each bitlength: Key 0, Nr 39)
702 #define CAMELLIA_TESTS_ECB 2
704 static const unsigned char camellia_test_ecb_key
[3][CAMELLIA_TESTS_ECB
][32] =
707 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
708 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
709 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
713 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
714 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
715 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
716 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
717 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
718 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
721 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
722 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
723 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
724 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
725 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
727 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
728 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
732 static const unsigned char camellia_test_ecb_plain
[CAMELLIA_TESTS_ECB
][16] =
734 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
735 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
736 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
737 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
740 static const unsigned char camellia_test_ecb_cipher
[3][CAMELLIA_TESTS_ECB
][16] =
743 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
744 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
745 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
746 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
749 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
750 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
751 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
752 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
755 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
756 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
757 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
758 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
762 #if defined(MBEDTLS_CIPHER_MODE_CBC)
763 #define CAMELLIA_TESTS_CBC 3
765 static const unsigned char camellia_test_cbc_key
[3][32] =
767 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
768 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
770 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
771 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
772 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
774 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
775 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
776 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
777 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
780 static const unsigned char camellia_test_cbc_iv
[16] =
782 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
783 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
786 static const unsigned char camellia_test_cbc_plain
[CAMELLIA_TESTS_CBC
][16] =
788 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
789 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
790 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
791 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
792 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
793 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
797 static const unsigned char camellia_test_cbc_cipher
[3][CAMELLIA_TESTS_CBC
][16] =
800 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
801 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
802 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
803 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
804 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
805 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
808 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
809 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
810 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
811 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
812 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
813 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
816 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
817 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
818 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
819 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
820 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
821 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
824 #endif /* MBEDTLS_CIPHER_MODE_CBC */
826 #if defined(MBEDTLS_CIPHER_MODE_CTR)
828 * Camellia-CTR test vectors from:
830 * http://www.faqs.org/rfcs/rfc5528.html
833 static const unsigned char camellia_test_ctr_key
[3][16] =
835 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
836 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
837 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
838 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
839 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
840 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
843 static const unsigned char camellia_test_ctr_nonce_counter
[3][16] =
845 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
846 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
847 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
848 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
849 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
850 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
853 static const unsigned char camellia_test_ctr_pt
[3][48] =
855 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
856 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
858 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
859 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
860 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
861 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
863 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
864 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
865 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
866 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
867 0x20, 0x21, 0x22, 0x23 }
870 static const unsigned char camellia_test_ctr_ct
[3][48] =
872 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
873 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
874 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
875 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
876 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
877 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
878 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
879 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
880 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
881 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
882 0xDF, 0x50, 0x86, 0x96 }
885 static const int camellia_test_ctr_len
[3] =
887 #endif /* MBEDTLS_CIPHER_MODE_CTR */
892 int mbedtls_camellia_self_test( int verbose
)
895 unsigned char key
[32];
896 unsigned char buf
[64];
897 unsigned char src
[16];
898 unsigned char dst
[16];
899 #if defined(MBEDTLS_CIPHER_MODE_CBC)
900 unsigned char iv
[16];
902 #if defined(MBEDTLS_CIPHER_MODE_CTR)
904 unsigned char nonce_counter
[16];
905 unsigned char stream_block
[16];
908 mbedtls_camellia_context ctx
;
910 memset( key
, 0, 32 );
912 for( j
= 0; j
< 6; j
++ ) {
917 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u
* 64,
918 (v
== MBEDTLS_CAMELLIA_DECRYPT
) ? "dec" : "enc");
920 for( i
= 0; i
< CAMELLIA_TESTS_ECB
; i
++ ) {
921 memcpy( key
, camellia_test_ecb_key
[u
][i
], 16 + 8 * u
);
923 if( v
== MBEDTLS_CAMELLIA_DECRYPT
) {
924 mbedtls_camellia_setkey_dec( &ctx
, key
, 128 + u
* 64 );
925 memcpy( src
, camellia_test_ecb_cipher
[u
][i
], 16 );
926 memcpy( dst
, camellia_test_ecb_plain
[i
], 16 );
927 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
928 mbedtls_camellia_setkey_enc( &ctx
, key
, 128 + u
* 64 );
929 memcpy( src
, camellia_test_ecb_plain
[i
], 16 );
930 memcpy( dst
, camellia_test_ecb_cipher
[u
][i
], 16 );
933 mbedtls_camellia_crypt_ecb( &ctx
, v
, src
, buf
);
935 if( memcmp( buf
, dst
, 16 ) != 0 )
938 mbedtls_printf( "failed\n" );
945 mbedtls_printf( "passed\n" );
949 mbedtls_printf( "\n" );
951 #if defined(MBEDTLS_CIPHER_MODE_CBC)
955 for( j
= 0; j
< 6; j
++ )
961 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u
* 64,
962 ( v
== MBEDTLS_CAMELLIA_DECRYPT
) ? "dec" : "enc" );
964 memcpy( src
, camellia_test_cbc_iv
, 16 );
965 memcpy( dst
, camellia_test_cbc_iv
, 16 );
966 memcpy( key
, camellia_test_cbc_key
[u
], 16 + 8 * u
);
968 if( v
== MBEDTLS_CAMELLIA_DECRYPT
) {
969 mbedtls_camellia_setkey_dec( &ctx
, key
, 128 + u
* 64 );
971 mbedtls_camellia_setkey_enc( &ctx
, key
, 128 + u
* 64 );
974 for( i
= 0; i
< CAMELLIA_TESTS_CBC
; i
++ ) {
976 if( v
== MBEDTLS_CAMELLIA_DECRYPT
) {
977 memcpy( iv
, src
, 16 );
978 memcpy( src
, camellia_test_cbc_cipher
[u
][i
], 16 );
979 memcpy( dst
, camellia_test_cbc_plain
[i
], 16 );
980 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
981 memcpy( iv
, dst
, 16 );
982 memcpy( src
, camellia_test_cbc_plain
[i
], 16 );
983 memcpy( dst
, camellia_test_cbc_cipher
[u
][i
], 16 );
986 mbedtls_camellia_crypt_cbc( &ctx
, v
, 16, iv
, src
, buf
);
988 if( memcmp( buf
, dst
, 16 ) != 0 )
991 mbedtls_printf( "failed\n" );
998 mbedtls_printf( "passed\n" );
1000 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1003 mbedtls_printf( "\n" );
1005 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1009 for( i
= 0; i
< 6; i
++ )
1015 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
1016 ( v
== MBEDTLS_CAMELLIA_DECRYPT
) ? "dec" : "enc" );
1018 memcpy( nonce_counter
, camellia_test_ctr_nonce_counter
[u
], 16 );
1019 memcpy( key
, camellia_test_ctr_key
[u
], 16 );
1022 mbedtls_camellia_setkey_enc( &ctx
, key
, 128 );
1024 if( v
== MBEDTLS_CAMELLIA_DECRYPT
)
1026 len
= camellia_test_ctr_len
[u
];
1027 memcpy( buf
, camellia_test_ctr_ct
[u
], len
);
1029 mbedtls_camellia_crypt_ctr( &ctx
, len
, &offset
, nonce_counter
, stream_block
,
1032 if( memcmp( buf
, camellia_test_ctr_pt
[u
], len
) != 0 )
1035 mbedtls_printf( "failed\n" );
1042 len
= camellia_test_ctr_len
[u
];
1043 memcpy( buf
, camellia_test_ctr_pt
[u
], len
);
1045 mbedtls_camellia_crypt_ctr( &ctx
, len
, &offset
, nonce_counter
, stream_block
,
1048 if( memcmp( buf
, camellia_test_ctr_ct
[u
], len
) != 0 )
1051 mbedtls_printf( "failed\n" );
1058 mbedtls_printf( "passed\n" );
1062 mbedtls_printf( "\n" );
1063 #endif /* MBEDTLS_CIPHER_MODE_CTR */
1068 #endif /* MBEDTLS_SELF_TEST */
1070 #endif /* MBEDTLS_CAMELLIA_C */