blob: 306be61fe6b0e646ec7756c5b74a1418cacf9ca7 [file] [log] [blame]
Paul Bakker38119b12009-01-10 23:31:23 +00001/*
2 * Camellia implementation
3 *
Paul Bakker7dc4c442014-02-01 22:50:26 +01004 * Copyright (C) 2006-2014, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakker38119b12009-01-10 23:31:23 +000010 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25/*
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000026 * The Camellia block cipher was designed by NTT and Mitsubishi Electric
27 * Corporation.
Paul Bakker38119b12009-01-10 23:31:23 +000028 *
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000029 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
Paul Bakker38119b12009-01-10 23:31:23 +000030 */
31
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020032#if !defined(POLARSSL_CONFIG_FILE)
Paul Bakker38119b12009-01-10 23:31:23 +000033#include "polarssl/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020034#else
35#include POLARSSL_CONFIG_FILE
36#endif
Paul Bakker38119b12009-01-10 23:31:23 +000037
38#if defined(POLARSSL_CAMELLIA_C)
39
40#include "polarssl/camellia.h"
41
Paul Bakker7dc4c442014-02-01 22:50:26 +010042#if defined(POLARSSL_PLATFORM_C)
43#include "polarssl/platform.h"
44#else
45#define polarssl_printf printf
46#endif
47
Paul Bakker90995b52013-06-24 19:20:35 +020048#if !defined(POLARSSL_CAMELLIA_ALT)
49
Paul Bakker38119b12009-01-10 23:31:23 +000050/*
51 * 32-bit integer manipulation macros (big endian)
52 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000053#ifndef GET_UINT32_BE
54#define GET_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000055{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000056 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
57 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
58 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
59 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker38119b12009-01-10 23:31:23 +000060}
61#endif
62
Paul Bakker5c2364c2012-10-01 14:41:15 +000063#ifndef PUT_UINT32_BE
64#define PUT_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000065{ \
66 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
67 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
68 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
69 (b)[(i) + 3] = (unsigned char) ( (n) ); \
70}
71#endif
72
73static const unsigned char SIGMA_CHARS[6][8] =
74{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000075 { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
76 { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
77 { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
78 { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
79 { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
80 { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
Paul Bakker38119b12009-01-10 23:31:23 +000081};
82
Paul Bakker33008ee2011-11-18 12:58:25 +000083#if defined(POLARSSL_CAMELLIA_SMALL_MEMORY)
Paul Bakkerfa049db2009-01-12 22:12:03 +000084
85static const unsigned char FSb[256] =
Paul Bakker38119b12009-01-10 23:31:23 +000086{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000087 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
88 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
89 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
90 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
91 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
92 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
93 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
94 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
95 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
96 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
97 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
98 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
99 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
100 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
101 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
102 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
Paul Bakker38119b12009-01-10 23:31:23 +0000103};
104
105#define SBOX1(n) FSb[(n)]
106#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
107#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
Paul Bakkerfa049db2009-01-12 22:12:03 +0000108#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
109
Paul Bakker9af723c2014-05-01 13:03:14 +0200110#else /* POLARSSL_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000111
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000112static const unsigned char FSb[256] =
113{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200114 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65,
115 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189,
116 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26,
117 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77,
118 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153,
119 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215,
120 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
121 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80,
122 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210,
123 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148,
124 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226,
125 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46,
126 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89,
127 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
128 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164,
129 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000130};
131
132static const unsigned char FSb2[256] =
133{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200134 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
135 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
136 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
137 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
138 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
139 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
140 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
141 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
142 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
143 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
144 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
145 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
146 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
147 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
148 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
149 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000150};
151
152static const unsigned char FSb3[256] =
153{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200154 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
155 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
156 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
157 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
158 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
159 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
160 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
161 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
162 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
163 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
164 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
165 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
166 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
167 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
168 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
169 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000170};
171
172static const unsigned char FSb4[256] =
173{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200174 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
175 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
176 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
177 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
178 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
179 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
180 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
181 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
182 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
183 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
184 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
185 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
186 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
187 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
188 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
189 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000190};
191
192#define SBOX1(n) FSb[(n)]
193#define SBOX2(n) FSb2[(n)]
194#define SBOX3(n) FSb3[(n)]
195#define SBOX4(n) FSb4[(n)]
Paul Bakker38119b12009-01-10 23:31:23 +0000196
Paul Bakker9af723c2014-05-01 13:03:14 +0200197#endif /* POLARSSL_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000198
Paul Bakker38119b12009-01-10 23:31:23 +0000199static const unsigned char shifts[2][4][4] =
200{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000201 {
202 { 1, 1, 1, 1 }, /* KL */
203 { 0, 0, 0, 0 }, /* KR */
204 { 1, 1, 1, 1 }, /* KA */
205 { 0, 0, 0, 0 } /* KB */
206 },
207 {
208 { 1, 0, 1, 1 }, /* KL */
209 { 1, 1, 0, 1 }, /* KR */
210 { 1, 1, 1, 0 }, /* KA */
211 { 1, 1, 0, 1 } /* KB */
212 }
Paul Bakker38119b12009-01-10 23:31:23 +0000213};
214
Paul Bakker026c03b2009-03-28 17:53:03 +0000215static const signed char indexes[2][4][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000216{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000217 {
218 { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39,
219 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
220 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
221 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
222 { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17,
223 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
224 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
225 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */
226 },
227 {
228 { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1,
229 -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
230 { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17,
231 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
232 { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
233 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
234 { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21,
235 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */
236 }
Paul Bakker38119b12009-01-10 23:31:23 +0000237};
238
Paul Bakker026c03b2009-03-28 17:53:03 +0000239static const signed char transposes[2][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000240{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000241 {
242 21, 22, 23, 20,
243 -1, -1, -1, -1,
244 18, 19, 16, 17,
245 11, 8, 9, 10,
246 15, 12, 13, 14
247 },
248 {
249 25, 26, 27, 24,
250 29, 30, 31, 28,
251 18, 19, 16, 17,
252 -1, -1, -1, -1,
253 -1, -1, -1, -1
254 }
Paul Bakker38119b12009-01-10 23:31:23 +0000255};
256
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000257/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000258#define ROTL(DEST, SRC, SHIFT) \
259{ \
260 (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \
261 (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \
262 (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \
263 (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \
Paul Bakker38119b12009-01-10 23:31:23 +0000264}
265
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000266#define FL(XL, XR, KL, KR) \
267{ \
268 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
269 (XL) = ((XR) | (KR)) ^ (XL); \
Paul Bakker38119b12009-01-10 23:31:23 +0000270}
Paul Bakker9af723c2014-05-01 13:03:14 +0200271
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000272#define FLInv(YL, YR, KL, KR) \
273{ \
274 (YL) = ((YR) | (KR)) ^ (YL); \
275 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
Paul Bakker38119b12009-01-10 23:31:23 +0000276}
Paul Bakker9af723c2014-05-01 13:03:14 +0200277
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000278#define SHIFT_AND_PLACE(INDEX, OFFSET) \
279{ \
280 TK[0] = KC[(OFFSET) * 4 + 0]; \
281 TK[1] = KC[(OFFSET) * 4 + 1]; \
282 TK[2] = KC[(OFFSET) * 4 + 2]; \
283 TK[3] = KC[(OFFSET) * 4 + 3]; \
284 \
285 for ( i = 1; i <= 4; i++ ) \
286 if (shifts[(INDEX)][(OFFSET)][i -1]) \
287 ROTL(TK + i * 4, TK, (15 * i) % 32); \
288 \
289 for ( i = 0; i < 20; i++ ) \
290 if (indexes[(INDEX)][(OFFSET)][i] != -1) { \
291 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
292 } \
Paul Bakker38119b12009-01-10 23:31:23 +0000293}
294
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200295static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
296 uint32_t z[2])
Paul Bakker38119b12009-01-10 23:31:23 +0000297{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000298 uint32_t I0, I1;
299 I0 = x[0] ^ k[0];
300 I1 = x[1] ^ k[1];
Paul Bakker38119b12009-01-10 23:31:23 +0000301
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000302 I0 = (SBOX1((I0 >> 24) & 0xFF) << 24) |
303 (SBOX2((I0 >> 16) & 0xFF) << 16) |
304 (SBOX3((I0 >> 8) & 0xFF) << 8) |
305 (SBOX4((I0 ) & 0xFF) );
306 I1 = (SBOX2((I1 >> 24) & 0xFF) << 24) |
307 (SBOX3((I1 >> 16) & 0xFF) << 16) |
308 (SBOX4((I1 >> 8) & 0xFF) << 8) |
309 (SBOX1((I1 ) & 0xFF) );
Paul Bakker38119b12009-01-10 23:31:23 +0000310
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000311 I0 ^= (I1 << 8) | (I1 >> 24);
312 I1 ^= (I0 << 16) | (I0 >> 16);
313 I0 ^= (I1 >> 8) | (I1 << 24);
314 I1 ^= (I0 >> 8) | (I0 << 24);
Paul Bakker38119b12009-01-10 23:31:23 +0000315
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000316 z[0] ^= I1;
317 z[1] ^= I0;
Paul Bakker38119b12009-01-10 23:31:23 +0000318}
319
320/*
321 * Camellia key schedule (encryption)
322 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200323int camellia_setkey_enc( camellia_context *ctx, const unsigned char *key,
324 unsigned int keysize )
Paul Bakker38119b12009-01-10 23:31:23 +0000325{
Paul Bakker23986e52011-04-24 08:57:21 +0000326 int idx;
327 size_t i;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000328 uint32_t *RK;
Paul Bakker38119b12009-01-10 23:31:23 +0000329 unsigned char t[64];
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000330 uint32_t SIGMA[6][2];
331 uint32_t KC[16];
332 uint32_t TK[20];
Paul Bakker38119b12009-01-10 23:31:23 +0000333
334 RK = ctx->rk;
335
336 memset(t, 0, 64);
337 memset(RK, 0, sizeof(ctx->rk));
338
339 switch( keysize )
340 {
341 case 128: ctx->nr = 3; idx = 0; break;
342 case 192:
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000343 case 256: ctx->nr = 4; idx = 1; break;
Paul Bakker2b222c82009-07-27 21:03:45 +0000344 default : return( POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH );
Paul Bakker38119b12009-01-10 23:31:23 +0000345 }
346
347 for( i = 0; i < keysize / 8; ++i)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000348 t[i] = key[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000349
350 if (keysize == 192) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000351 for (i = 0; i < 8; i++)
352 t[24 + i] = ~t[16 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000353 }
354
Paul Bakker38119b12009-01-10 23:31:23 +0000355 /*
356 * Prepare SIGMA values
357 */
Paul Bakker38119b12009-01-10 23:31:23 +0000358 for (i = 0; i < 6; i++) {
Paul Bakker5c2364c2012-10-01 14:41:15 +0000359 GET_UINT32_BE(SIGMA[i][0], SIGMA_CHARS[i], 0);
360 GET_UINT32_BE(SIGMA[i][1], SIGMA_CHARS[i], 4);
Paul Bakker38119b12009-01-10 23:31:23 +0000361 }
362
363 /*
364 * Key storage in KC
365 * Order: KL, KR, KA, KB
366 */
Paul Bakker38119b12009-01-10 23:31:23 +0000367 memset(KC, 0, sizeof(KC));
368
369 /* Store KL, KR */
370 for (i = 0; i < 8; i++)
Paul Bakker5c2364c2012-10-01 14:41:15 +0000371 GET_UINT32_BE(KC[i], t, i * 4);
Paul Bakker38119b12009-01-10 23:31:23 +0000372
373 /* Generate KA */
374 for( i = 0; i < 4; ++i)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000375 KC[8 + i] = KC[i] ^ KC[4 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000376
377 camellia_feistel(KC + 8, SIGMA[0], KC + 10);
378 camellia_feistel(KC + 10, SIGMA[1], KC + 8);
379
380 for( i = 0; i < 4; ++i)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000381 KC[8 + i] ^= KC[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000382
383 camellia_feistel(KC + 8, SIGMA[2], KC + 10);
384 camellia_feistel(KC + 10, SIGMA[3], KC + 8);
385
386 if (keysize > 128) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000387 /* Generate KB */
388 for( i = 0; i < 4; ++i)
389 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000390
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000391 camellia_feistel(KC + 12, SIGMA[4], KC + 14);
392 camellia_feistel(KC + 14, SIGMA[5], KC + 12);
Paul Bakker38119b12009-01-10 23:31:23 +0000393 }
394
395 /*
396 * Generating subkeys
Paul Bakker9af723c2014-05-01 13:03:14 +0200397 */
Paul Bakker38119b12009-01-10 23:31:23 +0000398
399 /* Manipulating KL */
400 SHIFT_AND_PLACE(idx, 0);
401
402 /* Manipulating KR */
403 if (keysize > 128) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000404 SHIFT_AND_PLACE(idx, 1);
Paul Bakker38119b12009-01-10 23:31:23 +0000405 }
406
407 /* Manipulating KA */
408 SHIFT_AND_PLACE(idx, 2);
409
410 /* Manipulating KB */
411 if (keysize > 128) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000412 SHIFT_AND_PLACE(idx, 3);
Paul Bakker38119b12009-01-10 23:31:23 +0000413 }
414
415 /* Do transpositions */
416 for ( i = 0; i < 20; i++ ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000417 if (transposes[idx][i] != -1) {
418 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
419 }
Paul Bakker38119b12009-01-10 23:31:23 +0000420 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000421
422 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000423}
424
425/*
426 * Camellia key schedule (decryption)
427 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200428int camellia_setkey_dec( camellia_context *ctx, const unsigned char *key,
429 unsigned int keysize )
Paul Bakker38119b12009-01-10 23:31:23 +0000430{
Paul Bakker23986e52011-04-24 08:57:21 +0000431 int idx;
432 size_t i;
Paul Bakker38119b12009-01-10 23:31:23 +0000433 camellia_context cty;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000434 uint32_t *RK;
435 uint32_t *SK;
Paul Bakker2b222c82009-07-27 21:03:45 +0000436 int ret;
Paul Bakker38119b12009-01-10 23:31:23 +0000437
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200438 /* Also checks keysize */
439 if( ( ret = camellia_setkey_enc(&cty, key, keysize) ) )
Paul Bakker2b222c82009-07-27 21:03:45 +0000440 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000441
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200442 ctx->nr = cty.nr;
443 idx = ( ctx->nr == 4 );
444
445 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000446 SK = cty.rk + 24 * 2 + 8 * idx * 2;
447
448 *RK++ = *SK++;
449 *RK++ = *SK++;
450 *RK++ = *SK++;
451 *RK++ = *SK++;
452
453 for (i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4)
454 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000455 *RK++ = *SK++;
456 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000457 }
458
459 SK -= 2;
460
461 *RK++ = *SK++;
462 *RK++ = *SK++;
463 *RK++ = *SK++;
464 *RK++ = *SK++;
465
466 memset( &cty, 0, sizeof( camellia_context ) );
Paul Bakker2b222c82009-07-27 21:03:45 +0000467
468 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000469}
470
471/*
472 * Camellia-ECB block encryption/decryption
473 */
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000474int camellia_crypt_ecb( camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000475 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000476 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000477 unsigned char output[16] )
478{
Paul Bakker026c03b2009-03-28 17:53:03 +0000479 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000480 uint32_t *RK, X[4];
Paul Bakker38119b12009-01-10 23:31:23 +0000481
Paul Bakkerc2547b02009-07-20 20:40:52 +0000482 ( (void) mode );
483
Paul Bakker38119b12009-01-10 23:31:23 +0000484 NR = ctx->nr;
485 RK = ctx->rk;
486
Paul Bakker5c2364c2012-10-01 14:41:15 +0000487 GET_UINT32_BE( X[0], input, 0 );
488 GET_UINT32_BE( X[1], input, 4 );
489 GET_UINT32_BE( X[2], input, 8 );
490 GET_UINT32_BE( X[3], input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000491
492 X[0] ^= *RK++;
493 X[1] ^= *RK++;
494 X[2] ^= *RK++;
495 X[3] ^= *RK++;
496
497 while (NR) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000498 --NR;
499 camellia_feistel(X, RK, X + 2);
500 RK += 2;
501 camellia_feistel(X + 2, RK, X);
502 RK += 2;
503 camellia_feistel(X, RK, X + 2);
504 RK += 2;
505 camellia_feistel(X + 2, RK, X);
506 RK += 2;
507 camellia_feistel(X, RK, X + 2);
508 RK += 2;
509 camellia_feistel(X + 2, RK, X);
510 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000511
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000512 if (NR) {
513 FL(X[0], X[1], RK[0], RK[1]);
514 RK += 2;
515 FLInv(X[2], X[3], RK[0], RK[1]);
516 RK += 2;
517 }
Paul Bakker38119b12009-01-10 23:31:23 +0000518 }
519
520 X[2] ^= *RK++;
521 X[3] ^= *RK++;
522 X[0] ^= *RK++;
523 X[1] ^= *RK++;
524
Paul Bakker5c2364c2012-10-01 14:41:15 +0000525 PUT_UINT32_BE( X[2], output, 0 );
526 PUT_UINT32_BE( X[3], output, 4 );
527 PUT_UINT32_BE( X[0], output, 8 );
528 PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000529
530 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000531}
532
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200533#if defined(POLARSSL_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000534/*
535 * Camellia-CBC buffer encryption/decryption
536 */
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000537int camellia_crypt_cbc( camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000538 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000539 size_t length,
Paul Bakker38119b12009-01-10 23:31:23 +0000540 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000541 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000542 unsigned char *output )
543{
544 int i;
545 unsigned char temp[16];
546
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000547 if( length % 16 )
548 return( POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
549
Paul Bakker38119b12009-01-10 23:31:23 +0000550 if( mode == CAMELLIA_DECRYPT )
551 {
552 while( length > 0 )
553 {
554 memcpy( temp, input, 16 );
555 camellia_crypt_ecb( ctx, mode, input, output );
556
557 for( i = 0; i < 16; i++ )
558 output[i] = (unsigned char)( output[i] ^ iv[i] );
559
560 memcpy( iv, temp, 16 );
561
562 input += 16;
563 output += 16;
564 length -= 16;
565 }
566 }
567 else
568 {
569 while( length > 0 )
570 {
571 for( i = 0; i < 16; i++ )
572 output[i] = (unsigned char)( input[i] ^ iv[i] );
573
574 camellia_crypt_ecb( ctx, mode, output, output );
575 memcpy( iv, output, 16 );
576
577 input += 16;
578 output += 16;
579 length -= 16;
580 }
581 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000582
583 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000584}
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200585#endif /* POLARSSL_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000586
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000587#if defined(POLARSSL_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000588/*
589 * Camellia-CFB128 buffer encryption/decryption
590 */
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000591int camellia_crypt_cfb128( camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000592 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000593 size_t length,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000594 size_t *iv_off,
Paul Bakker38119b12009-01-10 23:31:23 +0000595 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000596 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000597 unsigned char *output )
598{
Paul Bakker1ef71df2011-06-09 14:14:58 +0000599 int c;
600 size_t n = *iv_off;
Paul Bakker38119b12009-01-10 23:31:23 +0000601
602 if( mode == CAMELLIA_DECRYPT )
603 {
604 while( length-- )
605 {
606 if( n == 0 )
607 camellia_crypt_ecb( ctx, CAMELLIA_ENCRYPT, iv, iv );
608
609 c = *input++;
610 *output++ = (unsigned char)( c ^ iv[n] );
611 iv[n] = (unsigned char) c;
612
613 n = (n + 1) & 0x0F;
614 }
615 }
616 else
617 {
618 while( length-- )
619 {
620 if( n == 0 )
621 camellia_crypt_ecb( ctx, CAMELLIA_ENCRYPT, iv, iv );
622
623 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
624
625 n = (n + 1) & 0x0F;
626 }
627 }
628
629 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000630
631 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000632}
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000633#endif /* POLARSSL_CIPHER_MODE_CFB */
634
635#if defined(POLARSSL_CIPHER_MODE_CTR)
636/*
637 * Camellia-CTR buffer encryption/decryption
638 */
639int camellia_crypt_ctr( camellia_context *ctx,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000640 size_t length,
641 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000642 unsigned char nonce_counter[16],
643 unsigned char stream_block[16],
644 const unsigned char *input,
645 unsigned char *output )
646{
Paul Bakker369e14b2012-04-18 14:16:09 +0000647 int c, i;
Paul Bakker1ef71df2011-06-09 14:14:58 +0000648 size_t n = *nc_off;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000649
650 while( length-- )
651 {
652 if( n == 0 ) {
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200653 camellia_crypt_ecb( ctx, CAMELLIA_ENCRYPT, nonce_counter,
654 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000655
Paul Bakker369e14b2012-04-18 14:16:09 +0000656 for( i = 16; i > 0; i-- )
657 if( ++nonce_counter[i - 1] != 0 )
658 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000659 }
660 c = *input++;
661 *output++ = (unsigned char)( c ^ stream_block[n] );
662
663 n = (n + 1) & 0x0F;
664 }
665
666 *nc_off = n;
667
668 return( 0 );
669}
670#endif /* POLARSSL_CIPHER_MODE_CTR */
Paul Bakker90995b52013-06-24 19:20:35 +0200671#endif /* !POLARSSL_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000672
673#if defined(POLARSSL_SELF_TEST)
674
675#include <stdio.h>
676
677/*
678 * Camellia test vectors from:
679 *
680 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
681 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
682 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000683 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000684 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000685#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000686
687static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
688{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000689 {
690 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
691 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200692 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000693 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
694 },
695 {
696 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
697 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
698 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200699 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000700 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
702 },
703 {
704 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
705 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
706 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
707 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200708 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
711 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
712 },
Paul Bakker38119b12009-01-10 23:31:23 +0000713};
714
715static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
716{
717 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
718 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200719 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000720 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
721};
722
723static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
724{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000725 {
726 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
727 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
728 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
729 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
730 },
731 {
732 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
733 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
734 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
735 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
736 },
737 {
738 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
739 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
740 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
741 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
742 }
Paul Bakker38119b12009-01-10 23:31:23 +0000743};
744
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200745#if defined(POLARSSL_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000746#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000747
748static const unsigned char camellia_test_cbc_key[3][32] =
749{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000750 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
751 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
752 ,
753 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
754 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
755 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
756 ,
757 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
758 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
759 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
760 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000761};
762
763static const unsigned char camellia_test_cbc_iv[16] =
764
765 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
766 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
767;
768
769static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
770{
771 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
772 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
773 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
774 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
775 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
776 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
777
778};
779
780static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
781{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000782 {
783 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
784 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
785 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
786 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
787 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
788 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
789 },
790 {
791 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
792 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
793 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
794 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
795 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
796 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
797 },
798 {
799 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
800 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
801 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
802 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
803 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
804 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
805 }
Paul Bakker38119b12009-01-10 23:31:23 +0000806};
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200807#endif /* POLARSSL_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000808
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000809#if defined(POLARSSL_CIPHER_MODE_CTR)
810/*
811 * Camellia-CTR test vectors from:
812 *
813 * http://www.faqs.org/rfcs/rfc5528.html
814 */
815
816static const unsigned char camellia_test_ctr_key[3][16] =
817{
818 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
819 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
820 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
821 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
822 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
823 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
824};
825
826static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
827{
828 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
829 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
830 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
831 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
832 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
833 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
834};
835
836static const unsigned char camellia_test_ctr_pt[3][48] =
837{
838 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
839 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
840
841 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
842 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
843 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
844 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
845
846 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
847 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
848 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
849 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
850 0x20, 0x21, 0x22, 0x23 }
851};
852
853static const unsigned char camellia_test_ctr_ct[3][48] =
854{
855 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
856 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
857 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
858 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
859 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
860 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
861 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
862 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
863 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
864 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
865 0xDF, 0x50, 0x86, 0x96 }
866};
867
868static const int camellia_test_ctr_len[3] =
869 { 16, 32, 36 };
870#endif /* POLARSSL_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000871
872/*
873 * Checkup routine
874 */
875int camellia_self_test( int verbose )
876{
Paul Bakker026c03b2009-03-28 17:53:03 +0000877 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000878 unsigned char key[32];
879 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000880 unsigned char src[16];
881 unsigned char dst[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200882#if defined(POLARSSL_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000883 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200884#endif
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000885#if defined(POLARSSL_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000886 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000887 unsigned char nonce_counter[16];
888 unsigned char stream_block[16];
889#endif
890
Paul Bakker38119b12009-01-10 23:31:23 +0000891 camellia_context ctx;
892
893 memset( key, 0, 32 );
894
895 for (j = 0; j < 6; j++) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000896 u = j >> 1;
897 v = j & 1;
Paul Bakker38119b12009-01-10 23:31:23 +0000898
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000899 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100900 polarssl_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
901 (v == CAMELLIA_DECRYPT) ? "dec" : "enc");
Paul Bakker38119b12009-01-10 23:31:23 +0000902
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000903 for (i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
904 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u);
Paul Bakker38119b12009-01-10 23:31:23 +0000905
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000906 if (v == CAMELLIA_DECRYPT) {
907 camellia_setkey_dec(&ctx, key, 128 + u * 64);
908 memcpy(src, camellia_test_ecb_cipher[u][i], 16);
909 memcpy(dst, camellia_test_ecb_plain[i], 16);
910 } else { /* CAMELLIA_ENCRYPT */
911 camellia_setkey_enc(&ctx, key, 128 + u * 64);
912 memcpy(src, camellia_test_ecb_plain[i], 16);
913 memcpy(dst, camellia_test_ecb_cipher[u][i], 16);
914 }
Paul Bakker38119b12009-01-10 23:31:23 +0000915
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000916 camellia_crypt_ecb(&ctx, v, src, buf);
Paul Bakker38119b12009-01-10 23:31:23 +0000917
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000918 if( memcmp( buf, dst, 16 ) != 0 )
919 {
920 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100921 polarssl_printf( "failed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000922
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000923 return( 1 );
924 }
925 }
Paul Bakker38119b12009-01-10 23:31:23 +0000926
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000927 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100928 polarssl_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000929 }
930
931 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100932 polarssl_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000933
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200934#if defined(POLARSSL_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000935 /*
936 * CBC mode
937 */
938 for( j = 0; j < 6; j++ )
939 {
940 u = j >> 1;
941 v = j & 1;
942
943 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100944 polarssl_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
945 ( v == CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +0000946
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000947 memcpy( src, camellia_test_cbc_iv, 16);
948 memcpy( dst, camellia_test_cbc_iv, 16);
949 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u);
Paul Bakker38119b12009-01-10 23:31:23 +0000950
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000951 if (v == CAMELLIA_DECRYPT) {
952 camellia_setkey_dec(&ctx, key, 128 + u * 64);
953 } else {
954 camellia_setkey_enc(&ctx, key, 128 + u * 64);
955 }
Paul Bakker38119b12009-01-10 23:31:23 +0000956
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000957 for (i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +0000958
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000959 if (v == CAMELLIA_DECRYPT) {
960 memcpy( iv , src, 16 );
961 memcpy(src, camellia_test_cbc_cipher[u][i], 16);
962 memcpy(dst, camellia_test_cbc_plain[i], 16);
963 } else { /* CAMELLIA_ENCRYPT */
964 memcpy( iv , dst, 16 );
965 memcpy(src, camellia_test_cbc_plain[i], 16);
966 memcpy(dst, camellia_test_cbc_cipher[u][i], 16);
967 }
Paul Bakker38119b12009-01-10 23:31:23 +0000968
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000969 camellia_crypt_cbc(&ctx, v, 16, iv, src, buf);
Paul Bakker38119b12009-01-10 23:31:23 +0000970
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000971 if( memcmp( buf, dst, 16 ) != 0 )
972 {
973 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100974 polarssl_printf( "failed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000975
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000976 return( 1 );
977 }
978 }
Paul Bakker38119b12009-01-10 23:31:23 +0000979
980 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100981 polarssl_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000982 }
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200983#endif /* POLARSSL_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000984
985 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100986 polarssl_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000987
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000988#if defined(POLARSSL_CIPHER_MODE_CTR)
989 /*
990 * CTR mode
991 */
992 for( i = 0; i < 6; i++ )
993 {
994 u = i >> 1;
995 v = i & 1;
996
997 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100998 polarssl_printf( " CAMELLIA-CTR-128 (%s): ",
999 ( v == CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001000
1001 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1002 memcpy( key, camellia_test_ctr_key[u], 16 );
1003
1004 offset = 0;
1005 camellia_setkey_enc( &ctx, key, 128 );
1006
1007 if( v == CAMELLIA_DECRYPT )
1008 {
1009 len = camellia_test_ctr_len[u];
1010 memcpy( buf, camellia_test_ctr_ct[u], len );
1011
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001012 camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
1013 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001014
1015 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1016 {
1017 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001018 polarssl_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001019
1020 return( 1 );
1021 }
1022 }
1023 else
1024 {
1025 len = camellia_test_ctr_len[u];
1026 memcpy( buf, camellia_test_ctr_pt[u], len );
1027
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001028 camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
1029 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001030
1031 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1032 {
1033 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001034 polarssl_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001035
1036 return( 1 );
1037 }
1038 }
1039
1040 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001041 polarssl_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001042 }
1043
1044 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001045 polarssl_printf( "\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001046#endif /* POLARSSL_CIPHER_MODE_CTR */
1047
Paul Bakker38119b12009-01-10 23:31:23 +00001048 return ( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +00001049}
1050
Paul Bakker9af723c2014-05-01 13:03:14 +02001051#endif /* POLARSSL_SELF_TEST */
Paul Bakker38119b12009-01-10 23:31:23 +00001052
Paul Bakker9af723c2014-05-01 13:03:14 +02001053#endif /* POLARSSL_CAMELLIA_C */