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