1 /*
2  *  Camellia implementation
3  *
4  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
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  *  This file is part of mbed TLS (https://tls.mbed.org)
20  */
21 /*
22  *  The Camellia block cipher was designed by NTT and Mitsubishi Electric
23  *  Corporation.
24  *
25  *  http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
26  */
27 
28 #if !defined(MBEDTLS_CONFIG_FILE)
29 #include "mbedtls/config.h"
30 #else
31 #include MBEDTLS_CONFIG_FILE
32 #endif
33 
34 #if defined(MBEDTLS_CAMELLIA_C)
35 
36 #include "mbedtls/camellia.h"
37 
38 #include <string.h>
39 
40 #if defined(MBEDTLS_SELF_TEST)
41 #if defined(MBEDTLS_PLATFORM_C)
42 #include "mbedtls/platform.h"
43 #else
44 #include <stdio.h>
45 #define mbedtls_printf printf
46 #endif /* MBEDTLS_PLATFORM_C */
47 #endif /* MBEDTLS_SELF_TEST */
48 
49 #if !defined(MBEDTLS_CAMELLIA_ALT)
50 
51 /* Implementation that should never be optimized out by the compiler */
mbedtls_zeroize(void * v,size_t n)52 static void mbedtls_zeroize( void *v, size_t n ) {
53     volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;
54 }
55 
56 /*
57  * 32-bit integer manipulation macros (big endian)
58  */
59 #ifndef GET_UINT32_BE
60 #define GET_UINT32_BE(n,b,i)                            \
61 {                                                       \
62     (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \
63         | ( (uint32_t) (b)[(i) + 1] << 16 )             \
64         | ( (uint32_t) (b)[(i) + 2] <<  8 )             \
65         | ( (uint32_t) (b)[(i) + 3]       );            \
66 }
67 #endif
68 
69 #ifndef PUT_UINT32_BE
70 #define PUT_UINT32_BE(n,b,i)                            \
71 {                                                       \
72     (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
73     (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
74     (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
75     (b)[(i) + 3] = (unsigned char) ( (n)       );       \
76 }
77 #endif
78 
79 static const unsigned char SIGMA_CHARS[6][8] =
80 {
81     { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
82     { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
83     { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
84     { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
85     { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
86     { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
87 };
88 
89 #if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
90 
91 static const unsigned char FSb[256] =
92 {
93     112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
94      35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
95     134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
96     166,225, 57,202,213, 71, 93, 61,217,  1, 90,214, 81, 86,108, 77,
97     139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
98     223, 76,203,194, 52,126,118,  5,109,183,169, 49,209, 23,  4,215,
99      20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
100     254, 68,207,178,195,181,122,145, 36,  8,232,168, 96,252,105, 80,
101     170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
102      16,196,  0, 72,163,247,117,219,138,  3,230,218,  9, 63,221,148,
103     135, 92,131,  2,205, 74,144, 51,115,103,246,243,157,127,191,226,
104      82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
105     233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
106     120,152,  6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
107     114,  7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
108      64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
109 };
110 
111 #define SBOX1(n) FSb[(n)]
112 #define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
113 #define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
114 #define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
115 
116 #else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
117 
118 static const unsigned char FSb[256] =
119 {
120  112, 130,  44, 236, 179,  39, 192, 229, 228, 133,  87,  53, 234,  12, 174,  65,
121   35, 239, 107, 147,  69,  25, 165,  33, 237,  14,  79,  78,  29, 101, 146, 189,
122  134, 184, 175, 143, 124, 235,  31, 206,  62,  48, 220,  95,  94, 197,  11,  26,
123  166, 225,  57, 202, 213,  71,  93,  61, 217,   1,  90, 214,  81,  86, 108,  77,
124  139,  13, 154, 102, 251, 204, 176,  45, 116,  18,  43,  32, 240, 177, 132, 153,
125  223,  76, 203, 194,  52, 126, 118,   5, 109, 183, 169,  49, 209,  23,   4, 215,
126   20,  88,  58,  97, 222,  27,  17,  28,  50,  15, 156,  22,  83,  24, 242,  34,
127  254,  68, 207, 178, 195, 181, 122, 145,  36,   8, 232, 168,  96, 252, 105,  80,
128  170, 208, 160, 125, 161, 137,  98, 151,  84,  91,  30, 149, 224, 255, 100, 210,
129   16, 196,   0,  72, 163, 247, 117, 219, 138,   3, 230, 218,   9,  63, 221, 148,
130  135,  92, 131,   2, 205,  74, 144,  51, 115, 103, 246, 243, 157, 127, 191, 226,
131   82, 155, 216,  38, 200,  55, 198,  59, 129, 150, 111,  75,  19, 190,  99,  46,
132  233, 121, 167, 140, 159, 110, 188, 142,  41, 245, 249, 182,  47, 253, 180,  89,
133  120, 152,   6, 106, 231,  70, 113, 186, 212,  37, 171,  66, 136, 162, 141, 250,
134  114,   7, 185,  85, 248, 238, 172,  10,  54,  73,  42, 104,  60,  56, 241, 164,
135  64,  40, 211, 123, 187, 201,  67, 193,  21, 227, 173, 244, 119, 199, 128, 158
136 };
137 
138 static const unsigned char FSb2[256] =
139 {
140  224,   5,  88, 217, 103,  78, 129, 203, 201,  11, 174, 106, 213,  24,  93, 130,
141   70, 223, 214,  39, 138,  50,  75,  66, 219,  28, 158, 156,  58, 202,  37, 123,
142   13, 113,  95,  31, 248, 215,  62, 157, 124,  96, 185, 190, 188, 139,  22,  52,
143   77, 195, 114, 149, 171, 142, 186, 122, 179,   2, 180, 173, 162, 172, 216, 154,
144   23,  26,  53, 204, 247, 153,  97,  90, 232,  36,  86,  64, 225,  99,   9,  51,
145  191, 152, 151, 133, 104, 252, 236,  10, 218, 111,  83,  98, 163,  46,   8, 175,
146   40, 176, 116, 194, 189,  54,  34,  56, 100,  30,  57,  44, 166,  48, 229,  68,
147  253, 136, 159, 101, 135, 107, 244,  35,  72,  16, 209,  81, 192, 249, 210, 160,
148   85, 161,  65, 250,  67,  19, 196,  47, 168, 182,  60,  43, 193, 255, 200, 165,
149   32, 137,   0, 144,  71, 239, 234, 183,  21,   6, 205, 181,  18, 126, 187,  41,
150   15, 184,   7,   4, 155, 148,  33, 102, 230, 206, 237, 231,  59, 254, 127, 197,
151  164,  55, 177,  76, 145, 110, 141, 118,   3,  45, 222, 150,  38, 125, 198,  92,
152  211, 242,  79,  25,  63, 220, 121,  29,  82, 235, 243, 109,  94, 251, 105, 178,
153  240,  49,  12, 212, 207, 140, 226, 117, 169,  74,  87, 132,  17,  69,  27, 245,
154  228,  14, 115, 170, 241, 221,  89,  20, 108, 146,  84, 208, 120, 112, 227,  73,
155  128,  80, 167, 246, 119, 147, 134, 131,  42, 199,  91, 233, 238, 143,   1,  61
156 };
157 
158 static const unsigned char FSb3[256] =
159 {
160   56,  65,  22, 118, 217, 147,  96, 242, 114, 194, 171, 154, 117,   6,  87, 160,
161  145, 247, 181, 201, 162, 140, 210, 144, 246,   7, 167,  39, 142, 178,  73, 222,
162   67,  92, 215, 199,  62, 245, 143, 103,  31,  24, 110, 175,  47, 226, 133,  13,
163   83, 240, 156, 101, 234, 163, 174, 158, 236, 128,  45, 107, 168,  43,  54, 166,
164  197, 134,  77,  51, 253, 102,  88, 150,  58,   9, 149,  16, 120, 216,  66, 204,
165  239,  38, 229,  97,  26,  63,  59, 130, 182, 219, 212, 152, 232, 139,   2, 235,
166   10,  44,  29, 176, 111, 141, 136,  14,  25, 135,  78,  11, 169,  12, 121,  17,
167  127,  34, 231,  89, 225, 218,  61, 200,  18,   4, 116,  84,  48, 126, 180,  40,
168   85, 104,  80, 190, 208, 196,  49, 203,  42, 173,  15, 202, 112, 255,  50, 105,
169    8,  98,   0,  36, 209, 251, 186, 237,  69, 129, 115, 109, 132, 159, 238,  74,
170  195,  46, 193,   1, 230,  37,  72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
171   41, 205, 108,  19, 100, 155,  99, 157, 192,  75, 183, 165, 137,  95, 177,  23,
172  244, 188, 211,  70, 207,  55,  94,  71, 148, 250, 252,  91, 151, 254,  90, 172,
173   60,  76,   3,  53, 243,  35, 184,  93, 106, 146, 213,  33,  68,  81, 198, 125,
174   57, 131, 220, 170, 124, 119,  86,   5,  27, 164,  21,  52,  30,  28, 248,  82,
175   32,  20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227,  64,  79
176 };
177 
178 static const unsigned char FSb4[256] =
179 {
180  112,  44, 179, 192, 228,  87, 234, 174,  35, 107,  69, 165, 237,  79,  29, 146,
181  134, 175, 124,  31,  62, 220,  94,  11, 166,  57, 213,  93, 217,  90,  81, 108,
182  139, 154, 251, 176, 116,  43, 240, 132, 223, 203,  52, 118, 109, 169, 209,   4,
183   20,  58, 222,  17,  50, 156,  83, 242, 254, 207, 195, 122,  36, 232,  96, 105,
184  170, 160, 161,  98,  84,  30, 224, 100,  16,   0, 163, 117, 138, 230,   9, 221,
185  135, 131, 205, 144, 115, 246, 157, 191,  82, 216, 200, 198, 129, 111,  19,  99,
186  233, 167, 159, 188,  41, 249,  47, 180, 120,   6, 231, 113, 212, 171, 136, 141,
187  114, 185, 248, 172,  54,  42,  60, 241,  64, 211, 187,  67,  21, 173, 119, 128,
188  130, 236,  39, 229, 133,  53,  12,  65, 239, 147,  25,  33,  14,  78, 101, 189,
189  184, 143, 235, 206,  48,  95, 197,  26, 225, 202,  71,  61,   1, 214,  86,  77,
190   13, 102, 204,  45,  18,  32, 177, 153,  76, 194, 126,   5, 183,  49,  23, 215,
191   88,  97,  27,  28,  15,  22,  24,  34,  68, 178, 181, 145,   8, 168, 252,  80,
192  208, 125, 137, 151,  91, 149, 255, 210, 196,  72, 247, 219,   3, 218,  63, 148,
193   92,   2,  74,  51, 103, 243, 127, 226, 155,  38,  55,  59, 150,  75, 190,  46,
194  121, 140, 110, 142, 245, 182, 253,  89, 152, 106,  70, 186,  37,  66, 162, 250,
195   7,  85, 238,  10,  73, 104,  56, 164,  40, 123, 201, 193, 227, 244, 199, 158
196 };
197 
198 #define SBOX1(n) FSb[(n)]
199 #define SBOX2(n) FSb2[(n)]
200 #define SBOX3(n) FSb3[(n)]
201 #define SBOX4(n) FSb4[(n)]
202 
203 #endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
204 
205 static const unsigned char shifts[2][4][4] =
206 {
207     {
208         { 1, 1, 1, 1 }, /* KL */
209         { 0, 0, 0, 0 }, /* KR */
210         { 1, 1, 1, 1 }, /* KA */
211         { 0, 0, 0, 0 }  /* KB */
212     },
213     {
214         { 1, 0, 1, 1 }, /* KL */
215         { 1, 1, 0, 1 }, /* KR */
216         { 1, 1, 1, 0 }, /* KA */
217         { 1, 1, 0, 1 }  /* KB */
218     }
219 };
220 
221 static const signed char indexes[2][4][20] =
222 {
223     {
224         {  0,  1,  2,  3,  8,  9, 10, 11, 38, 39,
225           36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
226         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
227           -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
228         {  4,  5,  6,  7, 12, 13, 14, 15, 16, 17,
229           18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
230         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
231           -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }  /* KB -> RK */
232     },
233     {
234         {  0,  1,  2,  3, 61, 62, 63, 60, -1, -1,
235           -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
236         { -1, -1, -1, -1,  8,  9, 10, 11, 16, 17,
237           18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
238         { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
239           56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
240         {  4,  5,  6,  7, 65, 66, 67, 64, 20, 21,
241           22, 23, -1, -1, -1, -1, 43, 40, 41, 42 }  /* KB -> RK */
242     }
243 };
244 
245 static const signed char transposes[2][20] =
246 {
247     {
248         21, 22, 23, 20,
249         -1, -1, -1, -1,
250         18, 19, 16, 17,
251         11,  8,  9, 10,
252         15, 12, 13, 14
253     },
254     {
255         25, 26, 27, 24,
256         29, 30, 31, 28,
257         18, 19, 16, 17,
258         -1, -1, -1, -1,
259         -1, -1, -1, -1
260     }
261 };
262 
263 /* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
264 #define ROTL(DEST, SRC, SHIFT)                                      \
265 {                                                                   \
266     (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT));   \
267     (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT));   \
268     (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT));   \
269     (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT));   \
270 }
271 
272 #define FL(XL, XR, KL, KR)                                          \
273 {                                                                   \
274     (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR);   \
275     (XL) = ((XR) | (KR)) ^ (XL);                                    \
276 }
277 
278 #define FLInv(YL, YR, KL, KR)                                       \
279 {                                                                   \
280     (YL) = ((YR) | (KR)) ^ (YL);                                    \
281     (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR);   \
282 }
283 
284 #define SHIFT_AND_PLACE(INDEX, OFFSET)                      \
285 {                                                           \
286     TK[0] = KC[(OFFSET) * 4 + 0];                           \
287     TK[1] = KC[(OFFSET) * 4 + 1];                           \
288     TK[2] = KC[(OFFSET) * 4 + 2];                           \
289     TK[3] = KC[(OFFSET) * 4 + 3];                           \
290                                                             \
291     for( i = 1; i <= 4; i++ )                               \
292         if( shifts[(INDEX)][(OFFSET)][i -1] )               \
293             ROTL(TK + i * 4, TK, ( 15 * i ) % 32);          \
294                                                             \
295     for( i = 0; i < 20; i++ )                               \
296         if( indexes[(INDEX)][(OFFSET)][i] != -1 ) {         \
297             RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ];    \
298         }                                                   \
299 }
300 
camellia_feistel(const uint32_t x[2],const uint32_t k[2],uint32_t z[2])301 static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
302                               uint32_t z[2])
303 {
304     uint32_t I0, I1;
305     I0 = x[0] ^ k[0];
306     I1 = x[1] ^ k[1];
307 
308     I0 = ((uint32_t) SBOX1((I0 >> 24) & 0xFF) << 24) |
309          ((uint32_t) SBOX2((I0 >> 16) & 0xFF) << 16) |
310          ((uint32_t) SBOX3((I0 >>  8) & 0xFF) <<  8) |
311          ((uint32_t) SBOX4((I0      ) & 0xFF)      );
312     I1 = ((uint32_t) SBOX2((I1 >> 24) & 0xFF) << 24) |
313          ((uint32_t) SBOX3((I1 >> 16) & 0xFF) << 16) |
314          ((uint32_t) SBOX4((I1 >>  8) & 0xFF) <<  8) |
315          ((uint32_t) SBOX1((I1      ) & 0xFF)      );
316 
317     I0 ^= (I1 << 8) | (I1 >> 24);
318     I1 ^= (I0 << 16) | (I0 >> 16);
319     I0 ^= (I1 >> 8) | (I1 << 24);
320     I1 ^= (I0 >> 8) | (I0 << 24);
321 
322     z[0] ^= I1;
323     z[1] ^= I0;
324 }
325 
mbedtls_camellia_init(mbedtls_camellia_context * ctx)326 void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
327 {
328     memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
329 }
330 
mbedtls_camellia_free(mbedtls_camellia_context * ctx)331 void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
332 {
333     if( ctx == NULL )
334         return;
335 
336     mbedtls_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
337 }
338 
339 /*
340  * Camellia key schedule (encryption)
341  */
mbedtls_camellia_setkey_enc(mbedtls_camellia_context * ctx,const unsigned char * key,unsigned int keybits)342 int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key,
343                          unsigned int keybits )
344 {
345     int idx;
346     size_t i;
347     uint32_t *RK;
348     unsigned char t[64];
349     uint32_t SIGMA[6][2];
350     uint32_t KC[16];
351     uint32_t TK[20];
352 
353     RK = ctx->rk;
354 
355     memset( t, 0, 64 );
356     memset( RK, 0, sizeof(ctx->rk) );
357 
358     switch( keybits )
359     {
360         case 128: ctx->nr = 3; idx = 0; break;
361         case 192:
362         case 256: ctx->nr = 4; idx = 1; break;
363         default : return( MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH );
364     }
365 
366     for( i = 0; i < keybits / 8; ++i )
367         t[i] = key[i];
368 
369     if( keybits == 192 ) {
370         for( i = 0; i < 8; i++ )
371             t[24 + i] = ~t[16 + i];
372     }
373 
374     /*
375      * Prepare SIGMA values
376      */
377     for( i = 0; i < 6; i++ ) {
378         GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 );
379         GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 );
380     }
381 
382     /*
383      * Key storage in KC
384      * Order: KL, KR, KA, KB
385      */
386     memset( KC, 0, sizeof(KC) );
387 
388     /* Store KL, KR */
389     for( i = 0; i < 8; i++ )
390         GET_UINT32_BE( KC[i], t, i * 4 );
391 
392     /* Generate KA */
393     for( i = 0; i < 4; ++i )
394         KC[8 + i] = KC[i] ^ KC[4 + i];
395 
396     camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
397     camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
398 
399     for( i = 0; i < 4; ++i )
400         KC[8 + i] ^= KC[i];
401 
402     camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
403     camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
404 
405     if( keybits > 128 ) {
406         /* Generate KB */
407         for( i = 0; i < 4; ++i )
408             KC[12 + i] = KC[4 + i] ^ KC[8 + i];
409 
410         camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
411         camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
412     }
413 
414     /*
415      * Generating subkeys
416      */
417 
418     /* Manipulating KL */
419     SHIFT_AND_PLACE( idx, 0 );
420 
421     /* Manipulating KR */
422     if( keybits > 128 ) {
423         SHIFT_AND_PLACE( idx, 1 );
424     }
425 
426     /* Manipulating KA */
427     SHIFT_AND_PLACE( idx, 2 );
428 
429     /* Manipulating KB */
430     if( keybits > 128 ) {
431         SHIFT_AND_PLACE( idx, 3 );
432     }
433 
434     /* Do transpositions */
435     for( i = 0; i < 20; i++ ) {
436         if( transposes[idx][i] != -1 ) {
437             RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
438         }
439     }
440 
441     return( 0 );
442 }
443 
444 /*
445  * Camellia key schedule (decryption)
446  */
mbedtls_camellia_setkey_dec(mbedtls_camellia_context * ctx,const unsigned char * key,unsigned int keybits)447 int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key,
448                          unsigned int keybits )
449 {
450     int idx, ret;
451     size_t i;
452     mbedtls_camellia_context cty;
453     uint32_t *RK;
454     uint32_t *SK;
455 
456     mbedtls_camellia_init( &cty );
457 
458     /* Also checks keybits */
459     if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
460         goto exit;
461 
462     ctx->nr = cty.nr;
463     idx = ( ctx->nr == 4 );
464 
465     RK = ctx->rk;
466     SK = cty.rk + 24 * 2 + 8 * idx * 2;
467 
468     *RK++ = *SK++;
469     *RK++ = *SK++;
470     *RK++ = *SK++;
471     *RK++ = *SK++;
472 
473     for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
474     {
475         *RK++ = *SK++;
476         *RK++ = *SK++;
477     }
478 
479     SK -= 2;
480 
481     *RK++ = *SK++;
482     *RK++ = *SK++;
483     *RK++ = *SK++;
484     *RK++ = *SK++;
485 
486 exit:
487     mbedtls_camellia_free( &cty );
488 
489     return( ret );
490 }
491 
492 /*
493  * Camellia-ECB block encryption/decryption
494  */
mbedtls_camellia_crypt_ecb(mbedtls_camellia_context * ctx,int mode,const unsigned char input[16],unsigned char output[16])495 int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
496                     int mode,
497                     const unsigned char input[16],
498                     unsigned char output[16] )
499 {
500     int NR;
501     uint32_t *RK, X[4];
502 
503     ( (void) mode );
504 
505     NR = ctx->nr;
506     RK = ctx->rk;
507 
508     GET_UINT32_BE( X[0], input,  0 );
509     GET_UINT32_BE( X[1], input,  4 );
510     GET_UINT32_BE( X[2], input,  8 );
511     GET_UINT32_BE( X[3], input, 12 );
512 
513     X[0] ^= *RK++;
514     X[1] ^= *RK++;
515     X[2] ^= *RK++;
516     X[3] ^= *RK++;
517 
518     while( NR ) {
519         --NR;
520         camellia_feistel( X, RK, X + 2 );
521         RK += 2;
522         camellia_feistel( X + 2, RK, X );
523         RK += 2;
524         camellia_feistel( X, RK, X + 2 );
525         RK += 2;
526         camellia_feistel( X + 2, RK, X );
527         RK += 2;
528         camellia_feistel( X, RK, X + 2 );
529         RK += 2;
530         camellia_feistel( X + 2, RK, X );
531         RK += 2;
532 
533         if( NR ) {
534             FL(X[0], X[1], RK[0], RK[1]);
535             RK += 2;
536             FLInv(X[2], X[3], RK[0], RK[1]);
537             RK += 2;
538         }
539     }
540 
541     X[2] ^= *RK++;
542     X[3] ^= *RK++;
543     X[0] ^= *RK++;
544     X[1] ^= *RK++;
545 
546     PUT_UINT32_BE( X[2], output,  0 );
547     PUT_UINT32_BE( X[3], output,  4 );
548     PUT_UINT32_BE( X[0], output,  8 );
549     PUT_UINT32_BE( X[1], output, 12 );
550 
551     return( 0 );
552 }
553 
554 #if defined(MBEDTLS_CIPHER_MODE_CBC)
555 /*
556  * Camellia-CBC buffer encryption/decryption
557  */
mbedtls_camellia_crypt_cbc(mbedtls_camellia_context * ctx,int mode,size_t length,unsigned char iv[16],const unsigned char * input,unsigned char * output)558 int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
559                     int mode,
560                     size_t length,
561                     unsigned char iv[16],
562                     const unsigned char *input,
563                     unsigned char *output )
564 {
565     int i;
566     unsigned char temp[16];
567 
568     if( length % 16 )
569         return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
570 
571     if( mode == MBEDTLS_CAMELLIA_DECRYPT )
572     {
573         while( length > 0 )
574         {
575             memcpy( temp, input, 16 );
576             mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
577 
578             for( i = 0; i < 16; i++ )
579                 output[i] = (unsigned char)( output[i] ^ iv[i] );
580 
581             memcpy( iv, temp, 16 );
582 
583             input  += 16;
584             output += 16;
585             length -= 16;
586         }
587     }
588     else
589     {
590         while( length > 0 )
591         {
592             for( i = 0; i < 16; i++ )
593                 output[i] = (unsigned char)( input[i] ^ iv[i] );
594 
595             mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
596             memcpy( iv, output, 16 );
597 
598             input  += 16;
599             output += 16;
600             length -= 16;
601         }
602     }
603 
604     return( 0 );
605 }
606 #endif /* MBEDTLS_CIPHER_MODE_CBC */
607 
608 #if defined(MBEDTLS_CIPHER_MODE_CFB)
609 /*
610  * Camellia-CFB128 buffer encryption/decryption
611  */
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)612 int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
613                        int mode,
614                        size_t length,
615                        size_t *iv_off,
616                        unsigned char iv[16],
617                        const unsigned char *input,
618                        unsigned char *output )
619 {
620     int c;
621     size_t n = *iv_off;
622 
623     if( mode == MBEDTLS_CAMELLIA_DECRYPT )
624     {
625         while( length-- )
626         {
627             if( n == 0 )
628                 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
629 
630             c = *input++;
631             *output++ = (unsigned char)( c ^ iv[n] );
632             iv[n] = (unsigned char) c;
633 
634             n = ( n + 1 ) & 0x0F;
635         }
636     }
637     else
638     {
639         while( length-- )
640         {
641             if( n == 0 )
642                 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
643 
644             iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
645 
646             n = ( n + 1 ) & 0x0F;
647         }
648     }
649 
650     *iv_off = n;
651 
652     return( 0 );
653 }
654 #endif /* MBEDTLS_CIPHER_MODE_CFB */
655 
656 #if defined(MBEDTLS_CIPHER_MODE_CTR)
657 /*
658  * Camellia-CTR buffer encryption/decryption
659  */
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)660 int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
661                        size_t length,
662                        size_t *nc_off,
663                        unsigned char nonce_counter[16],
664                        unsigned char stream_block[16],
665                        const unsigned char *input,
666                        unsigned char *output )
667 {
668     int c, i;
669     size_t n = *nc_off;
670 
671     while( length-- )
672     {
673         if( n == 0 ) {
674             mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
675                                 stream_block );
676 
677             for( i = 16; i > 0; i-- )
678                 if( ++nonce_counter[i - 1] != 0 )
679                     break;
680         }
681         c = *input++;
682         *output++ = (unsigned char)( c ^ stream_block[n] );
683 
684         n = ( n + 1 ) & 0x0F;
685     }
686 
687     *nc_off = n;
688 
689     return( 0 );
690 }
691 #endif /* MBEDTLS_CIPHER_MODE_CTR */
692 #endif /* !MBEDTLS_CAMELLIA_ALT */
693 
694 #if defined(MBEDTLS_SELF_TEST)
695 
696 /*
697  * Camellia test vectors from:
698  *
699  * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
700  *   http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
701  *   http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
702  *                      (For each bitlength: Key 0, Nr 39)
703  */
704 #define CAMELLIA_TESTS_ECB  2
705 
706 static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
707 {
708     {
709         { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
710           0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
711         { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
712           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
713     },
714     {
715         { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
716           0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
717           0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
718         { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
719           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
720           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
721     },
722     {
723         { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
724           0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
725           0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
726           0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
727         { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
728           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
729           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
730           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
731     },
732 };
733 
734 static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
735 {
736     { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
737       0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
738     { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
739       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
740 };
741 
742 static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
743 {
744     {
745         { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
746           0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
747         { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
748           0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
749     },
750     {
751         { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
752           0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
753         { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
754           0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
755     },
756     {
757         { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
758           0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
759         { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
760           0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
761     }
762 };
763 
764 #if defined(MBEDTLS_CIPHER_MODE_CBC)
765 #define CAMELLIA_TESTS_CBC  3
766 
767 static const unsigned char camellia_test_cbc_key[3][32] =
768 {
769         { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
770           0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
771     ,
772         { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
773           0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
774           0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
775     ,
776         { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
777           0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
778           0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
779           0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
780 };
781 
782 static const unsigned char camellia_test_cbc_iv[16] =
783 
784     { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
785       0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
786 ;
787 
788 static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
789 {
790     { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
791       0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
792     { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
793       0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
794     { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
795       0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
796 
797 };
798 
799 static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
800 {
801     {
802         { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
803           0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
804         { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
805           0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
806         { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
807           0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
808     },
809     {
810         { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
811           0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
812         { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
813           0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
814         { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
815           0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
816     },
817     {
818         { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
819           0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
820         { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
821           0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
822         { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
823           0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
824     }
825 };
826 #endif /* MBEDTLS_CIPHER_MODE_CBC */
827 
828 #if defined(MBEDTLS_CIPHER_MODE_CTR)
829 /*
830  * Camellia-CTR test vectors from:
831  *
832  * http://www.faqs.org/rfcs/rfc5528.html
833  */
834 
835 static const unsigned char camellia_test_ctr_key[3][16] =
836 {
837     { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
838       0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
839     { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
840       0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
841     { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
842       0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
843 };
844 
845 static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
846 {
847     { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
848       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
849     { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
850       0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
851     { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
852       0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
853 };
854 
855 static const unsigned char camellia_test_ctr_pt[3][48] =
856 {
857     { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
858       0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
859 
860     { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
861       0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
862       0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
863       0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
864 
865     { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
866       0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
867       0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
868       0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
869       0x20, 0x21, 0x22, 0x23 }
870 };
871 
872 static const unsigned char camellia_test_ctr_ct[3][48] =
873 {
874     { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
875       0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
876     { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
877       0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
878       0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
879       0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
880     { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
881       0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
882       0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
883       0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
884       0xDF, 0x50, 0x86, 0x96 }
885 };
886 
887 static const int camellia_test_ctr_len[3] =
888     { 16, 32, 36 };
889 #endif /* MBEDTLS_CIPHER_MODE_CTR */
890 
891 /*
892  * Checkup routine
893  */
mbedtls_camellia_self_test(int verbose)894 int mbedtls_camellia_self_test( int verbose )
895 {
896     int i, j, u, v;
897     unsigned char key[32];
898     unsigned char buf[64];
899     unsigned char src[16];
900     unsigned char dst[16];
901 #if defined(MBEDTLS_CIPHER_MODE_CBC)
902     unsigned char iv[16];
903 #endif
904 #if defined(MBEDTLS_CIPHER_MODE_CTR)
905     size_t offset, len;
906     unsigned char nonce_counter[16];
907     unsigned char stream_block[16];
908 #endif
909 
910     mbedtls_camellia_context ctx;
911 
912     memset( key, 0, 32 );
913 
914     for( j = 0; j < 6; j++ ) {
915         u = j >> 1;
916     v = j & 1;
917 
918     if( verbose != 0 )
919         mbedtls_printf( "  CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
920                          (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
921 
922     for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
923         memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
924 
925         if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
926             mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
927             memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
928             memcpy( dst, camellia_test_ecb_plain[i], 16 );
929         } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
930             mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
931             memcpy( src, camellia_test_ecb_plain[i], 16 );
932             memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
933         }
934 
935         mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
936 
937         if( memcmp( buf, dst, 16 ) != 0 )
938         {
939             if( verbose != 0 )
940                 mbedtls_printf( "failed\n" );
941 
942             return( 1 );
943         }
944     }
945 
946     if( verbose != 0 )
947         mbedtls_printf( "passed\n" );
948     }
949 
950     if( verbose != 0 )
951         mbedtls_printf( "\n" );
952 
953 #if defined(MBEDTLS_CIPHER_MODE_CBC)
954     /*
955      * CBC mode
956      */
957     for( j = 0; j < 6; j++ )
958     {
959         u = j >> 1;
960         v = j  & 1;
961 
962         if( verbose != 0 )
963             mbedtls_printf( "  CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
964                              ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
965 
966         memcpy( src, camellia_test_cbc_iv, 16 );
967         memcpy( dst, camellia_test_cbc_iv, 16 );
968         memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
969 
970         if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
971             mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
972         } else {
973             mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
974         }
975 
976         for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
977 
978             if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
979                 memcpy( iv , src, 16 );
980                 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
981                 memcpy( dst, camellia_test_cbc_plain[i], 16 );
982             } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
983                 memcpy( iv , dst, 16 );
984                 memcpy( src, camellia_test_cbc_plain[i], 16 );
985                 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
986             }
987 
988             mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
989 
990             if( memcmp( buf, dst, 16 ) != 0 )
991             {
992                 if( verbose != 0 )
993                     mbedtls_printf( "failed\n" );
994 
995                 return( 1 );
996             }
997         }
998 
999         if( verbose != 0 )
1000             mbedtls_printf( "passed\n" );
1001     }
1002 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1003 
1004     if( verbose != 0 )
1005         mbedtls_printf( "\n" );
1006 
1007 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1008     /*
1009      * CTR mode
1010      */
1011     for( i = 0; i < 6; i++ )
1012     {
1013         u = i >> 1;
1014         v = i  & 1;
1015 
1016         if( verbose != 0 )
1017             mbedtls_printf( "  CAMELLIA-CTR-128 (%s): ",
1018                              ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
1019 
1020         memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1021         memcpy( key, camellia_test_ctr_key[u], 16 );
1022 
1023         offset = 0;
1024         mbedtls_camellia_setkey_enc( &ctx, key, 128 );
1025 
1026         if( v == MBEDTLS_CAMELLIA_DECRYPT )
1027         {
1028             len = camellia_test_ctr_len[u];
1029             memcpy( buf, camellia_test_ctr_ct[u], len );
1030 
1031             mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
1032                                 buf, buf );
1033 
1034             if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1035             {
1036                 if( verbose != 0 )
1037                     mbedtls_printf( "failed\n" );
1038 
1039                 return( 1 );
1040             }
1041         }
1042         else
1043         {
1044             len = camellia_test_ctr_len[u];
1045             memcpy( buf, camellia_test_ctr_pt[u], len );
1046 
1047             mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
1048                                 buf, buf );
1049 
1050             if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1051             {
1052                 if( verbose != 0 )
1053                     mbedtls_printf( "failed\n" );
1054 
1055                 return( 1 );
1056             }
1057         }
1058 
1059         if( verbose != 0 )
1060             mbedtls_printf( "passed\n" );
1061     }
1062 
1063     if( verbose != 0 )
1064         mbedtls_printf( "\n" );
1065 #endif /* MBEDTLS_CIPHER_MODE_CTR */
1066 
1067     return( 0 );
1068 }
1069 
1070 #endif /* MBEDTLS_SELF_TEST */
1071 
1072 #endif /* MBEDTLS_CAMELLIA_C */
1073