blob: c9df94a33dc2463fd1d92458ca0185914291e89f [file] [log] [blame] [raw]
Paul Bakker38119b12009-01-10 23:31:23 +00001/*
2 * Camellia implementation
3 *
Manuel Pégourié-Gonnarda658a402015-01-23 09:45:19 +00004 * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +00006 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakkerb96f1542010-07-18 20:36:00 +00007 *
Paul Bakker38119b12009-01-10 23:31:23 +00008 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22/*
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000023 * The Camellia block cipher was designed by NTT and Mitsubishi Electric
24 * Corporation.
Paul Bakker38119b12009-01-10 23:31:23 +000025 *
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000026 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
Paul Bakker38119b12009-01-10 23:31:23 +000027 */
28
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020029#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000030#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020031#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020032#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020033#endif
Paul Bakker38119b12009-01-10 23:31:23 +000034
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020035#if defined(MBEDTLS_CAMELLIA_C)
Paul Bakker38119b12009-01-10 23:31:23 +000036
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000037#include "mbedtls/camellia.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010038
Rich Evans00ab4702015-02-06 13:43:58 +000039#include <string.h>
Manuel Pégourié-Gonnard394608e2015-02-17 16:01:07 +010040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_SELF_TEST)
42#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000043#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010044#else
Rich Evans00ab4702015-02-06 13:43:58 +000045#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046#define mbedtls_printf printf
47#endif /* MBEDTLS_PLATFORM_C */
48#endif /* MBEDTLS_SELF_TEST */
Paul Bakker90995b52013-06-24 19:20:35 +020049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#if !defined(MBEDTLS_CAMELLIA_ALT)
Paul Bakker38119b12009-01-10 23:31:23 +000051
Paul Bakker34617722014-06-13 17:20:13 +020052/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020054 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
55}
56
Paul Bakker38119b12009-01-10 23:31:23 +000057/*
58 * 32-bit integer manipulation macros (big endian)
59 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000060#ifndef GET_UINT32_BE
61#define GET_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000062{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000063 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
64 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
65 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
66 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker38119b12009-01-10 23:31:23 +000067}
68#endif
69
Paul Bakker5c2364c2012-10-01 14:41:15 +000070#ifndef PUT_UINT32_BE
71#define PUT_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000072{ \
73 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
74 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
75 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
76 (b)[(i) + 3] = (unsigned char) ( (n) ); \
77}
78#endif
79
80static const unsigned char SIGMA_CHARS[6][8] =
81{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000082 { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
83 { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
84 { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
85 { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
86 { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
87 { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
Paul Bakker38119b12009-01-10 23:31:23 +000088};
89
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020090#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
Paul Bakkerfa049db2009-01-12 22:12:03 +000091
92static const unsigned char FSb[256] =
Paul Bakker38119b12009-01-10 23:31:23 +000093{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000094 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
95 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
96 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
97 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
98 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
99 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
100 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
101 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
102 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
103 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
104 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
105 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
106 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
107 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
108 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
109 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
Paul Bakker38119b12009-01-10 23:31:23 +0000110};
111
112#define SBOX1(n) FSb[(n)]
113#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
114#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
Paul Bakkerfa049db2009-01-12 22:12:03 +0000115#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
116
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200117#else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000118
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000119static const unsigned char FSb[256] =
120{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200121 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65,
122 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189,
123 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26,
124 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77,
125 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153,
126 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215,
127 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
128 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80,
129 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210,
130 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148,
131 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226,
132 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46,
133 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89,
134 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
135 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164,
136 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000137};
138
139static const unsigned char FSb2[256] =
140{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200141 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
142 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
143 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
144 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
145 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
146 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
147 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
148 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
149 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
150 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
151 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
152 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
153 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
154 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
155 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
156 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000157};
158
159static const unsigned char FSb3[256] =
160{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200161 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
162 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
163 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
164 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
165 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
166 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
167 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
168 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
169 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
170 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
171 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
172 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
173 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
174 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
175 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
176 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000177};
178
179static const unsigned char FSb4[256] =
180{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200181 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
182 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
183 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
184 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
185 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
186 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
187 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
188 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
189 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
190 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
191 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
192 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
193 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
194 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
195 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
196 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000197};
198
199#define SBOX1(n) FSb[(n)]
200#define SBOX2(n) FSb2[(n)]
201#define SBOX3(n) FSb3[(n)]
202#define SBOX4(n) FSb4[(n)]
Paul Bakkerfa049db2009-01-12 22:12:03 +0000203
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200204#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakker38119b12009-01-10 23:31:23 +0000205
206static const unsigned char shifts[2][4][4] =
207{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000208 {
209 { 1, 1, 1, 1 }, /* KL */
210 { 0, 0, 0, 0 }, /* KR */
211 { 1, 1, 1, 1 }, /* KA */
212 { 0, 0, 0, 0 } /* KB */
213 },
214 {
215 { 1, 0, 1, 1 }, /* KL */
216 { 1, 1, 0, 1 }, /* KR */
217 { 1, 1, 1, 0 }, /* KA */
218 { 1, 1, 0, 1 } /* KB */
219 }
Paul Bakker38119b12009-01-10 23:31:23 +0000220};
221
Paul Bakker026c03b2009-03-28 17:53:03 +0000222static const signed char indexes[2][4][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000223{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000224 {
225 { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39,
226 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
227 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
228 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
229 { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17,
230 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
231 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
232 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */
233 },
234 {
235 { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1,
236 -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
237 { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17,
238 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
239 { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
240 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
241 { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21,
242 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */
243 }
Paul Bakker38119b12009-01-10 23:31:23 +0000244};
245
Paul Bakker026c03b2009-03-28 17:53:03 +0000246static const signed char transposes[2][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000247{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000248 {
249 21, 22, 23, 20,
250 -1, -1, -1, -1,
251 18, 19, 16, 17,
252 11, 8, 9, 10,
253 15, 12, 13, 14
254 },
255 {
256 25, 26, 27, 24,
257 29, 30, 31, 28,
258 18, 19, 16, 17,
259 -1, -1, -1, -1,
260 -1, -1, -1, -1
261 }
Paul Bakker38119b12009-01-10 23:31:23 +0000262};
263
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000264/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000265#define ROTL(DEST, SRC, SHIFT) \
266{ \
267 (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \
268 (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \
269 (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \
270 (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \
Paul Bakker38119b12009-01-10 23:31:23 +0000271}
272
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000273#define FL(XL, XR, KL, KR) \
274{ \
275 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
276 (XL) = ((XR) | (KR)) ^ (XL); \
Paul Bakker38119b12009-01-10 23:31:23 +0000277}
Paul Bakker9af723c2014-05-01 13:03:14 +0200278
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000279#define FLInv(YL, YR, KL, KR) \
280{ \
281 (YL) = ((YR) | (KR)) ^ (YL); \
282 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
Paul Bakker38119b12009-01-10 23:31:23 +0000283}
Paul Bakker9af723c2014-05-01 13:03:14 +0200284
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000285#define SHIFT_AND_PLACE(INDEX, OFFSET) \
286{ \
287 TK[0] = KC[(OFFSET) * 4 + 0]; \
288 TK[1] = KC[(OFFSET) * 4 + 1]; \
289 TK[2] = KC[(OFFSET) * 4 + 2]; \
290 TK[3] = KC[(OFFSET) * 4 + 3]; \
291 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200292 for( i = 1; i <= 4; i++ ) \
293 if( shifts[(INDEX)][(OFFSET)][i -1] ) \
294 ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000295 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200296 for( i = 0; i < 20; i++ ) \
297 if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
298 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
299 } \
Paul Bakker38119b12009-01-10 23:31:23 +0000300}
301
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200302static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
303 uint32_t z[2])
Paul Bakker38119b12009-01-10 23:31:23 +0000304{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000305 uint32_t I0, I1;
306 I0 = x[0] ^ k[0];
307 I1 = x[1] ^ k[1];
Paul Bakker38119b12009-01-10 23:31:23 +0000308
Manuel Pégourié-Gonnardb31b61b2014-11-10 13:05:43 +0100309 I0 = ((uint32_t) SBOX1((I0 >> 24) & 0xFF) << 24) |
310 ((uint32_t) SBOX2((I0 >> 16) & 0xFF) << 16) |
311 ((uint32_t) SBOX3((I0 >> 8) & 0xFF) << 8) |
312 ((uint32_t) SBOX4((I0 ) & 0xFF) );
313 I1 = ((uint32_t) SBOX2((I1 >> 24) & 0xFF) << 24) |
314 ((uint32_t) SBOX3((I1 >> 16) & 0xFF) << 16) |
315 ((uint32_t) SBOX4((I1 >> 8) & 0xFF) << 8) |
316 ((uint32_t) SBOX1((I1 ) & 0xFF) );
Paul Bakker38119b12009-01-10 23:31:23 +0000317
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000318 I0 ^= (I1 << 8) | (I1 >> 24);
319 I1 ^= (I0 << 16) | (I0 >> 16);
320 I0 ^= (I1 >> 8) | (I1 << 24);
321 I1 ^= (I0 >> 8) | (I0 << 24);
Paul Bakker38119b12009-01-10 23:31:23 +0000322
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000323 z[0] ^= I1;
324 z[1] ^= I0;
Paul Bakker38119b12009-01-10 23:31:23 +0000325}
326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200328{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329 memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200330}
331
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200332void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200333{
334 if( ctx == NULL )
335 return;
336
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200337 mbedtls_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200338}
339
Paul Bakker38119b12009-01-10 23:31:23 +0000340/*
341 * Camellia key schedule (encryption)
342 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200344 unsigned int keysize )
Paul Bakker38119b12009-01-10 23:31:23 +0000345{
Paul Bakker23986e52011-04-24 08:57:21 +0000346 int idx;
347 size_t i;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000348 uint32_t *RK;
Paul Bakker38119b12009-01-10 23:31:23 +0000349 unsigned char t[64];
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000350 uint32_t SIGMA[6][2];
351 uint32_t KC[16];
352 uint32_t TK[20];
Paul Bakker38119b12009-01-10 23:31:23 +0000353
354 RK = ctx->rk;
355
Paul Bakker66d5d072014-06-17 16:39:18 +0200356 memset( t, 0, 64 );
357 memset( RK, 0, sizeof(ctx->rk) );
Paul Bakker38119b12009-01-10 23:31:23 +0000358
359 switch( keysize )
360 {
361 case 128: ctx->nr = 3; idx = 0; break;
362 case 192:
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000363 case 256: ctx->nr = 4; idx = 1; break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200364 default : return( MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH );
Paul Bakker38119b12009-01-10 23:31:23 +0000365 }
366
Paul Bakker66d5d072014-06-17 16:39:18 +0200367 for( i = 0; i < keysize / 8; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000368 t[i] = key[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000369
Paul Bakker66d5d072014-06-17 16:39:18 +0200370 if( keysize == 192 ) {
371 for( i = 0; i < 8; i++ )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000372 t[24 + i] = ~t[16 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000373 }
Paul Bakker38119b12009-01-10 23:31:23 +0000374
375 /*
376 * Prepare SIGMA values
377 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200378 for( i = 0; i < 6; i++ ) {
379 GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 );
380 GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000381 }
382
383 /*
384 * Key storage in KC
385 * Order: KL, KR, KA, KB
386 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200387 memset( KC, 0, sizeof(KC) );
Paul Bakker38119b12009-01-10 23:31:23 +0000388
389 /* Store KL, KR */
Paul Bakker66d5d072014-06-17 16:39:18 +0200390 for( i = 0; i < 8; i++ )
391 GET_UINT32_BE( KC[i], t, i * 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000392
393 /* Generate KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200394 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000395 KC[8 + i] = KC[i] ^ KC[4 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000396
Paul Bakker66d5d072014-06-17 16:39:18 +0200397 camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
398 camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000399
Paul Bakker66d5d072014-06-17 16:39:18 +0200400 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000401 KC[8 + i] ^= KC[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000402
Paul Bakker66d5d072014-06-17 16:39:18 +0200403 camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
404 camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000405
Paul Bakker66d5d072014-06-17 16:39:18 +0200406 if( keysize > 128 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000407 /* Generate KB */
Paul Bakker66d5d072014-06-17 16:39:18 +0200408 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000409 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000410
Paul Bakker66d5d072014-06-17 16:39:18 +0200411 camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
412 camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000413 }
414
415 /*
416 * Generating subkeys
Paul Bakker9af723c2014-05-01 13:03:14 +0200417 */
Paul Bakker38119b12009-01-10 23:31:23 +0000418
419 /* Manipulating KL */
Paul Bakker66d5d072014-06-17 16:39:18 +0200420 SHIFT_AND_PLACE( idx, 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000421
422 /* Manipulating KR */
Paul Bakker66d5d072014-06-17 16:39:18 +0200423 if( keysize > 128 ) {
424 SHIFT_AND_PLACE( idx, 1 );
Paul Bakker38119b12009-01-10 23:31:23 +0000425 }
426
427 /* Manipulating KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200428 SHIFT_AND_PLACE( idx, 2 );
Paul Bakker38119b12009-01-10 23:31:23 +0000429
430 /* Manipulating KB */
Paul Bakker66d5d072014-06-17 16:39:18 +0200431 if( keysize > 128 ) {
432 SHIFT_AND_PLACE( idx, 3 );
Paul Bakker38119b12009-01-10 23:31:23 +0000433 }
434
435 /* Do transpositions */
Paul Bakker66d5d072014-06-17 16:39:18 +0200436 for( i = 0; i < 20; i++ ) {
437 if( transposes[idx][i] != -1 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000438 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
439 }
Paul Bakker38119b12009-01-10 23:31:23 +0000440 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000441
442 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000443}
444
445/*
446 * Camellia key schedule (decryption)
447 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200448int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200449 unsigned int keysize )
Paul Bakker38119b12009-01-10 23:31:23 +0000450{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200451 int idx, ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000452 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200453 mbedtls_camellia_context cty;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000454 uint32_t *RK;
455 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200456
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200457 mbedtls_camellia_init( &cty );
Paul Bakker38119b12009-01-10 23:31:23 +0000458
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200459 /* Also checks keysize */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200460 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keysize ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200461 goto exit;
Paul Bakker38119b12009-01-10 23:31:23 +0000462
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200463 ctx->nr = cty.nr;
464 idx = ( ctx->nr == 4 );
465
466 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000467 SK = cty.rk + 24 * 2 + 8 * idx * 2;
468
469 *RK++ = *SK++;
470 *RK++ = *SK++;
471 *RK++ = *SK++;
472 *RK++ = *SK++;
473
Paul Bakker66d5d072014-06-17 16:39:18 +0200474 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
Paul Bakker38119b12009-01-10 23:31:23 +0000475 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000476 *RK++ = *SK++;
477 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000478 }
479
480 SK -= 2;
481
482 *RK++ = *SK++;
483 *RK++ = *SK++;
484 *RK++ = *SK++;
485 *RK++ = *SK++;
486
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200487exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200488 mbedtls_camellia_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000489
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200490 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000491}
492
493/*
494 * Camellia-ECB block encryption/decryption
495 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200496int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000497 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000498 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000499 unsigned char output[16] )
500{
Paul Bakker026c03b2009-03-28 17:53:03 +0000501 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000502 uint32_t *RK, X[4];
Paul Bakker38119b12009-01-10 23:31:23 +0000503
Paul Bakkerc2547b02009-07-20 20:40:52 +0000504 ( (void) mode );
505
Paul Bakker38119b12009-01-10 23:31:23 +0000506 NR = ctx->nr;
507 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000508
Paul Bakker5c2364c2012-10-01 14:41:15 +0000509 GET_UINT32_BE( X[0], input, 0 );
510 GET_UINT32_BE( X[1], input, 4 );
511 GET_UINT32_BE( X[2], input, 8 );
512 GET_UINT32_BE( X[3], input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000513
514 X[0] ^= *RK++;
515 X[1] ^= *RK++;
516 X[2] ^= *RK++;
517 X[3] ^= *RK++;
518
Paul Bakker66d5d072014-06-17 16:39:18 +0200519 while( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000520 --NR;
Paul Bakker66d5d072014-06-17 16:39:18 +0200521 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000522 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200523 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000524 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200525 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000526 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200527 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000528 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200529 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000530 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200531 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000532 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000533
Paul Bakker66d5d072014-06-17 16:39:18 +0200534 if( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000535 FL(X[0], X[1], RK[0], RK[1]);
536 RK += 2;
537 FLInv(X[2], X[3], RK[0], RK[1]);
538 RK += 2;
539 }
Paul Bakker38119b12009-01-10 23:31:23 +0000540 }
541
542 X[2] ^= *RK++;
543 X[3] ^= *RK++;
544 X[0] ^= *RK++;
545 X[1] ^= *RK++;
546
Paul Bakker5c2364c2012-10-01 14:41:15 +0000547 PUT_UINT32_BE( X[2], output, 0 );
548 PUT_UINT32_BE( X[3], output, 4 );
549 PUT_UINT32_BE( X[0], output, 8 );
550 PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000551
552 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000553}
554
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200555#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000556/*
557 * Camellia-CBC buffer encryption/decryption
558 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200559int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000560 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000561 size_t length,
Paul Bakker38119b12009-01-10 23:31:23 +0000562 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000563 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000564 unsigned char *output )
565{
566 int i;
567 unsigned char temp[16];
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000568
569 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
Paul Bakker38119b12009-01-10 23:31:23 +0000571
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200572 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000573 {
574 while( length > 0 )
575 {
576 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200577 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000578
579 for( i = 0; i < 16; i++ )
580 output[i] = (unsigned char)( output[i] ^ iv[i] );
581
582 memcpy( iv, temp, 16 );
583
584 input += 16;
585 output += 16;
586 length -= 16;
587 }
588 }
589 else
590 {
591 while( length > 0 )
592 {
593 for( i = 0; i < 16; i++ )
594 output[i] = (unsigned char)( input[i] ^ iv[i] );
595
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200596 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000597 memcpy( iv, output, 16 );
598
599 input += 16;
600 output += 16;
601 length -= 16;
602 }
603 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000604
605 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000606}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200607#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000608
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200609#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000610/*
611 * Camellia-CFB128 buffer encryption/decryption
612 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200613int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000614 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000615 size_t length,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000616 size_t *iv_off,
Paul Bakker38119b12009-01-10 23:31:23 +0000617 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000618 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000619 unsigned char *output )
620{
Paul Bakker1ef71df2011-06-09 14:14:58 +0000621 int c;
622 size_t n = *iv_off;
Paul Bakker38119b12009-01-10 23:31:23 +0000623
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200624 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000625 {
626 while( length-- )
627 {
628 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200629 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000630
631 c = *input++;
632 *output++ = (unsigned char)( c ^ iv[n] );
633 iv[n] = (unsigned char) c;
634
Paul Bakker66d5d072014-06-17 16:39:18 +0200635 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000636 }
637 }
638 else
639 {
640 while( length-- )
641 {
642 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200643 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000644
645 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
646
Paul Bakker66d5d072014-06-17 16:39:18 +0200647 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000648 }
649 }
650
651 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000652
653 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000654}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200655#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000656
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200657#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000658/*
659 * Camellia-CTR buffer encryption/decryption
660 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000662 size_t length,
663 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000664 unsigned char nonce_counter[16],
665 unsigned char stream_block[16],
666 const unsigned char *input,
667 unsigned char *output )
668{
Paul Bakker369e14b2012-04-18 14:16:09 +0000669 int c, i;
Paul Bakker1ef71df2011-06-09 14:14:58 +0000670 size_t n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000671
672 while( length-- )
673 {
674 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200675 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200676 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000677
Paul Bakker369e14b2012-04-18 14:16:09 +0000678 for( i = 16; i > 0; i-- )
679 if( ++nonce_counter[i - 1] != 0 )
680 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000681 }
682 c = *input++;
683 *output++ = (unsigned char)( c ^ stream_block[n] );
684
Paul Bakker66d5d072014-06-17 16:39:18 +0200685 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000686 }
687
688 *nc_off = n;
689
690 return( 0 );
691}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200692#endif /* MBEDTLS_CIPHER_MODE_CTR */
693#endif /* !MBEDTLS_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000694
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200695#if defined(MBEDTLS_SELF_TEST)
Paul Bakker38119b12009-01-10 23:31:23 +0000696
697/*
698 * Camellia test vectors from:
699 *
700 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
701 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
702 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000703 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000704 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000705#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000706
707static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
708{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000709 {
710 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
711 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200712 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
714 },
715 {
716 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
717 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
718 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200719 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000720 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
721 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
722 },
723 {
724 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
725 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
726 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
727 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200728 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000729 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
730 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
731 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
732 },
Paul Bakker38119b12009-01-10 23:31:23 +0000733};
734
735static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
736{
737 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
738 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200739 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000740 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
741};
742
743static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
744{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000745 {
746 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
747 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
748 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
749 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
750 },
751 {
752 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
753 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
754 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
755 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
756 },
757 {
758 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
759 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
760 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
761 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
762 }
Paul Bakker38119b12009-01-10 23:31:23 +0000763};
764
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200765#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000766#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000767
768static const unsigned char camellia_test_cbc_key[3][32] =
769{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000770 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
771 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
772 ,
773 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
774 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
775 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
776 ,
777 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
778 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
779 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
780 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000781};
782
783static const unsigned char camellia_test_cbc_iv[16] =
784
785 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
786 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
787;
788
789static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
790{
791 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
792 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
793 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
794 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
795 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
796 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
797
798};
799
800static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
801{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000802 {
803 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
804 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
805 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
806 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
807 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
808 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
809 },
810 {
811 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
812 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
813 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
814 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
815 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
816 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
817 },
818 {
819 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
820 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
821 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
822 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
823 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
824 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
825 }
Paul Bakker38119b12009-01-10 23:31:23 +0000826};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200827#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000828
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200829#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000830/*
831 * Camellia-CTR test vectors from:
832 *
833 * http://www.faqs.org/rfcs/rfc5528.html
834 */
835
836static const unsigned char camellia_test_ctr_key[3][16] =
837{
838 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
839 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
840 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
841 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
842 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
843 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
844};
845
846static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
847{
848 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
850 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
851 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
852 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
853 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
854};
855
856static const unsigned char camellia_test_ctr_pt[3][48] =
857{
858 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
859 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
860
861 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
862 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
863 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
864 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
865
866 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
867 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
868 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
869 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
870 0x20, 0x21, 0x22, 0x23 }
871};
872
873static const unsigned char camellia_test_ctr_ct[3][48] =
874{
875 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
876 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
877 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
878 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
879 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
880 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
881 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
882 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
883 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
884 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
885 0xDF, 0x50, 0x86, 0x96 }
886};
887
888static const int camellia_test_ctr_len[3] =
889 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200890#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000891
892/*
893 * Checkup routine
894 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200895int mbedtls_camellia_self_test( int verbose )
Paul Bakker38119b12009-01-10 23:31:23 +0000896{
Paul Bakker026c03b2009-03-28 17:53:03 +0000897 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000898 unsigned char key[32];
899 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000900 unsigned char src[16];
901 unsigned char dst[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200902#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000903 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200904#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200905#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000906 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000907 unsigned char nonce_counter[16];
908 unsigned char stream_block[16];
909#endif
910
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200911 mbedtls_camellia_context ctx;
Paul Bakker38119b12009-01-10 23:31:23 +0000912
913 memset( key, 0, 32 );
914
Paul Bakker66d5d072014-06-17 16:39:18 +0200915 for( j = 0; j < 6; j++ ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000916 u = j >> 1;
917 v = j & 1;
Paul Bakker38119b12009-01-10 23:31:23 +0000918
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000919 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
921 (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
Paul Bakker38119b12009-01-10 23:31:23 +0000922
Paul Bakker66d5d072014-06-17 16:39:18 +0200923 for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
924 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000925
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200926 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
927 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200928 memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
929 memcpy( dst, camellia_test_ecb_plain[i], 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200930 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
931 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200932 memcpy( src, camellia_test_ecb_plain[i], 16 );
933 memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000934 }
Paul Bakker38119b12009-01-10 23:31:23 +0000935
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200936 mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
Paul Bakker38119b12009-01-10 23:31:23 +0000937
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000938 if( memcmp( buf, dst, 16 ) != 0 )
939 {
940 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200941 mbedtls_printf( "failed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000942
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000943 return( 1 );
944 }
945 }
Paul Bakker38119b12009-01-10 23:31:23 +0000946
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000947 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200948 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000949 }
950
951 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200952 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000953
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200954#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000955 /*
956 * CBC mode
957 */
958 for( j = 0; j < 6; j++ )
959 {
960 u = j >> 1;
961 v = j & 1;
962
963 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200964 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
965 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +0000966
Paul Bakker66d5d072014-06-17 16:39:18 +0200967 memcpy( src, camellia_test_cbc_iv, 16 );
968 memcpy( dst, camellia_test_cbc_iv, 16 );
969 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000970
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200971 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
972 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000973 } else {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200974 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000975 }
Paul Bakker38119b12009-01-10 23:31:23 +0000976
Paul Bakker66d5d072014-06-17 16:39:18 +0200977 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +0000978
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200979 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000980 memcpy( iv , src, 16 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200981 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
982 memcpy( dst, camellia_test_cbc_plain[i], 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200983 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000984 memcpy( iv , dst, 16 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200985 memcpy( src, camellia_test_cbc_plain[i], 16 );
986 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000987 }
Paul Bakker38119b12009-01-10 23:31:23 +0000988
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989 mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
Paul Bakker38119b12009-01-10 23:31:23 +0000990
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000991 if( memcmp( buf, dst, 16 ) != 0 )
992 {
993 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994 mbedtls_printf( "failed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000995
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000996 return( 1 );
997 }
998 }
Paul Bakker38119b12009-01-10 23:31:23 +0000999
1000 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001001 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001002 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001003#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +00001004
1005 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001006 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001007
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001008#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001009 /*
1010 * CTR mode
1011 */
1012 for( i = 0; i < 6; i++ )
1013 {
1014 u = i >> 1;
1015 v = i & 1;
1016
1017 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001018 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
1019 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001020
1021 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1022 memcpy( key, camellia_test_ctr_key[u], 16 );
1023
1024 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001025 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001026
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001027 if( v == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001028 {
1029 len = camellia_test_ctr_len[u];
1030 memcpy( buf, camellia_test_ctr_ct[u], len );
1031
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001033 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001034
1035 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1036 {
1037 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001038 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001039
1040 return( 1 );
1041 }
1042 }
1043 else
1044 {
1045 len = camellia_test_ctr_len[u];
1046 memcpy( buf, camellia_test_ctr_pt[u], len );
1047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001048 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001049 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001050
1051 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1052 {
1053 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001054 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001055
1056 return( 1 );
1057 }
1058 }
1059
1060 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001061 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001062 }
1063
1064 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001065 mbedtls_printf( "\n" );
1066#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001067
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001068 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +00001069}
1070
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001071#endif /* MBEDTLS_SELF_TEST */
Paul Bakker38119b12009-01-10 23:31:23 +00001072
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001073#endif /* MBEDTLS_CAMELLIA_C */