blob: 75059749d381a5618552d0406ff0057773a9f988 [file] [log] [blame]
Paul Bakker38119b12009-01-10 23:31:23 +00001/*
2 * Camellia implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker38119b12009-01-10 23:31:23 +000018 */
19/*
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000020 * The Camellia block cipher was designed by NTT and Mitsubishi Electric
21 * Corporation.
Paul Bakker38119b12009-01-10 23:31:23 +000022 *
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000023 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
Paul Bakker38119b12009-01-10 23:31:23 +000024 */
25
Gilles Peskinedb09ef62020-06-03 01:43:33 +020026#include "common.h"
Paul Bakker38119b12009-01-10 23:31:23 +000027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if defined(MBEDTLS_CAMELLIA_C)
Paul Bakker38119b12009-01-10 23:31:23 +000029
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000030#include "mbedtls/camellia.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050031#include "mbedtls/platform_util.h"
Paul Bakker38119b12009-01-10 23:31:23 +000032
Rich Evans00ab4702015-02-06 13:43:58 +000033#include <string.h>
Manuel Pégourié-Gonnard394608e2015-02-17 16:01:07 +010034
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020035#if defined(MBEDTLS_SELF_TEST)
36#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000037#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010038#else
Rich Evans00ab4702015-02-06 13:43:58 +000039#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020040#define mbedtls_printf printf
41#endif /* MBEDTLS_PLATFORM_C */
42#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010043
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#if !defined(MBEDTLS_CAMELLIA_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020045
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050046/* Parameter validation macros */
47#define CAMELLIA_VALIDATE_RET( cond ) \
48 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA )
49#define CAMELLIA_VALIDATE( cond ) \
50 MBEDTLS_INTERNAL_VALIDATE( cond )
51
Paul Bakker38119b12009-01-10 23:31:23 +000052static const unsigned char SIGMA_CHARS[6][8] =
53{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000054 { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
55 { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
56 { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
57 { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
58 { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
59 { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
Paul Bakker38119b12009-01-10 23:31:23 +000060};
61
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020062#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
Paul Bakkerfa049db2009-01-12 22:12:03 +000063
64static const unsigned char FSb[256] =
Paul Bakker38119b12009-01-10 23:31:23 +000065{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000066 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
67 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
68 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
69 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
70 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
71 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
72 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
73 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
74 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
75 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
76 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
77 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
78 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
79 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
80 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
81 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
Paul Bakker38119b12009-01-10 23:31:23 +000082};
83
84#define SBOX1(n) FSb[(n)]
85#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
86#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
Paul Bakkerfa049db2009-01-12 22:12:03 +000087#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
88
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089#else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +000090
Paul Bakkerc32c6b52009-01-11 21:36:43 +000091static const unsigned char FSb[256] =
92{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +020093 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65,
94 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189,
95 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26,
96 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77,
97 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153,
98 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215,
99 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
100 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80,
101 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210,
102 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148,
103 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226,
104 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46,
105 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89,
106 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
107 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164,
108 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000109};
110
111static const unsigned char FSb2[256] =
112{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200113 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
114 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
115 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
116 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
117 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
118 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
119 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
120 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
121 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
122 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
123 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
124 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
125 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
126 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
127 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
128 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000129};
130
131static const unsigned char FSb3[256] =
132{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200133 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
134 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
135 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
136 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
137 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
138 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
139 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
140 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
141 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
142 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
143 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
144 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
145 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
146 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
147 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
148 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000149};
150
151static const unsigned char FSb4[256] =
152{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200153 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
154 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
155 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
156 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
157 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
158 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
159 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
160 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
161 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
162 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
163 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
164 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
165 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
166 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
167 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
168 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000169};
170
171#define SBOX1(n) FSb[(n)]
172#define SBOX2(n) FSb2[(n)]
173#define SBOX3(n) FSb3[(n)]
174#define SBOX4(n) FSb4[(n)]
Paul Bakker38119b12009-01-10 23:31:23 +0000175
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200176#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000177
Paul Bakker38119b12009-01-10 23:31:23 +0000178static const unsigned char shifts[2][4][4] =
179{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000180 {
181 { 1, 1, 1, 1 }, /* KL */
182 { 0, 0, 0, 0 }, /* KR */
183 { 1, 1, 1, 1 }, /* KA */
184 { 0, 0, 0, 0 } /* KB */
185 },
186 {
187 { 1, 0, 1, 1 }, /* KL */
188 { 1, 1, 0, 1 }, /* KR */
189 { 1, 1, 1, 0 }, /* KA */
190 { 1, 1, 0, 1 } /* KB */
191 }
Paul Bakker38119b12009-01-10 23:31:23 +0000192};
193
Paul Bakker026c03b2009-03-28 17:53:03 +0000194static const signed char indexes[2][4][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000195{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000196 {
197 { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39,
198 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
199 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
200 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
201 { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17,
202 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
203 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
204 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */
205 },
206 {
207 { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1,
208 -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
209 { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17,
210 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
211 { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
212 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
213 { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21,
214 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */
215 }
Paul Bakker38119b12009-01-10 23:31:23 +0000216};
217
Paul Bakker026c03b2009-03-28 17:53:03 +0000218static const signed char transposes[2][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000219{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000220 {
221 21, 22, 23, 20,
222 -1, -1, -1, -1,
223 18, 19, 16, 17,
224 11, 8, 9, 10,
225 15, 12, 13, 14
226 },
227 {
228 25, 26, 27, 24,
229 29, 30, 31, 28,
230 18, 19, 16, 17,
231 -1, -1, -1, -1,
232 -1, -1, -1, -1
233 }
Paul Bakker38119b12009-01-10 23:31:23 +0000234};
235
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000236/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000237#define ROTL(DEST, SRC, SHIFT) \
238{ \
239 (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \
240 (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \
241 (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \
242 (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \
Paul Bakker38119b12009-01-10 23:31:23 +0000243}
244
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000245#define FL(XL, XR, KL, KR) \
246{ \
247 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
248 (XL) = ((XR) | (KR)) ^ (XL); \
Paul Bakker38119b12009-01-10 23:31:23 +0000249}
Paul Bakker9af723c2014-05-01 13:03:14 +0200250
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000251#define FLInv(YL, YR, KL, KR) \
252{ \
253 (YL) = ((YR) | (KR)) ^ (YL); \
254 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
Paul Bakker38119b12009-01-10 23:31:23 +0000255}
Paul Bakker9af723c2014-05-01 13:03:14 +0200256
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000257#define SHIFT_AND_PLACE(INDEX, OFFSET) \
258{ \
259 TK[0] = KC[(OFFSET) * 4 + 0]; \
260 TK[1] = KC[(OFFSET) * 4 + 1]; \
261 TK[2] = KC[(OFFSET) * 4 + 2]; \
262 TK[3] = KC[(OFFSET) * 4 + 3]; \
263 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200264 for( i = 1; i <= 4; i++ ) \
265 if( shifts[(INDEX)][(OFFSET)][i -1] ) \
266 ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000267 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200268 for( i = 0; i < 20; i++ ) \
269 if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
270 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
271 } \
Paul Bakker38119b12009-01-10 23:31:23 +0000272}
273
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200274static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
275 uint32_t z[2])
Paul Bakker38119b12009-01-10 23:31:23 +0000276{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000277 uint32_t I0, I1;
278 I0 = x[0] ^ k[0];
279 I1 = x[1] ^ k[1];
Paul Bakker38119b12009-01-10 23:31:23 +0000280
Joe Subbianicd84d762021-07-08 14:59:52 +0100281 I0 = ((uint32_t) SBOX1( MBEDTLS_BYTE_3( I0 )) << 24) |
282 ((uint32_t) SBOX2( MBEDTLS_BYTE_2( I0 )) << 16) |
283 ((uint32_t) SBOX3( MBEDTLS_BYTE_1( I0 )) << 8) |
284 ((uint32_t) SBOX4( MBEDTLS_BYTE_0( I0 )) );
285 I1 = ((uint32_t) SBOX2( MBEDTLS_BYTE_3( I1 )) << 24) |
286 ((uint32_t) SBOX3( MBEDTLS_BYTE_2( I1 )) << 16) |
287 ((uint32_t) SBOX4( MBEDTLS_BYTE_1( I1 )) << 8) |
288 ((uint32_t) SBOX1( MBEDTLS_BYTE_0( I1 )) );
Paul Bakker38119b12009-01-10 23:31:23 +0000289
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000290 I0 ^= (I1 << 8) | (I1 >> 24);
291 I1 ^= (I0 << 16) | (I0 >> 16);
292 I0 ^= (I1 >> 8) | (I1 << 24);
293 I1 ^= (I0 >> 8) | (I0 << 24);
Paul Bakker38119b12009-01-10 23:31:23 +0000294
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000295 z[0] ^= I1;
296 z[1] ^= I0;
Paul Bakker38119b12009-01-10 23:31:23 +0000297}
298
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200299void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200300{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200301 memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200302}
303
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200304void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200305{
306 if( ctx == NULL )
307 return;
308
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500309 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200310}
311
Paul Bakker38119b12009-01-10 23:31:23 +0000312/*
313 * Camellia key schedule (encryption)
314 */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500315int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx,
316 const unsigned char *key,
317 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000318{
Paul Bakker23986e52011-04-24 08:57:21 +0000319 int idx;
320 size_t i;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000321 uint32_t *RK;
Paul Bakker38119b12009-01-10 23:31:23 +0000322 unsigned char t[64];
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000323 uint32_t SIGMA[6][2];
324 uint32_t KC[16];
325 uint32_t TK[20];
Paul Bakker38119b12009-01-10 23:31:23 +0000326
327 RK = ctx->rk;
328
Paul Bakker66d5d072014-06-17 16:39:18 +0200329 memset( t, 0, 64 );
330 memset( RK, 0, sizeof(ctx->rk) );
Paul Bakker38119b12009-01-10 23:31:23 +0000331
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200332 switch( keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000333 {
334 case 128: ctx->nr = 3; idx = 0; break;
335 case 192:
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000336 case 256: ctx->nr = 4; idx = 1; break;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500337 default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000338 }
339
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200340 for( i = 0; i < keybits / 8; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000341 t[i] = key[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000342
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200343 if( keybits == 192 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200344 for( i = 0; i < 8; i++ )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000345 t[24 + i] = ~t[16 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000346 }
347
Paul Bakker38119b12009-01-10 23:31:23 +0000348 /*
349 * Prepare SIGMA values
350 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200351 for( i = 0; i < 6; i++ ) {
Joe Subbiani6a506312021-07-07 16:56:29 +0100352 SIGMA[i][0] = MBEDTLS_GET_UINT32_BE( SIGMA_CHARS[i], 0 );
353 SIGMA[i][1] = MBEDTLS_GET_UINT32_BE( SIGMA_CHARS[i], 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000354 }
355
356 /*
357 * Key storage in KC
358 * Order: KL, KR, KA, KB
359 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200360 memset( KC, 0, sizeof(KC) );
Paul Bakker38119b12009-01-10 23:31:23 +0000361
362 /* Store KL, KR */
Paul Bakker66d5d072014-06-17 16:39:18 +0200363 for( i = 0; i < 8; i++ )
Joe Subbiani6a506312021-07-07 16:56:29 +0100364 KC[i] = MBEDTLS_GET_UINT32_BE( t, i * 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000365
366 /* Generate KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200367 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000368 KC[8 + i] = KC[i] ^ KC[4 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000369
Paul Bakker66d5d072014-06-17 16:39:18 +0200370 camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
371 camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000372
Paul Bakker66d5d072014-06-17 16:39:18 +0200373 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000374 KC[8 + i] ^= KC[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000375
Paul Bakker66d5d072014-06-17 16:39:18 +0200376 camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
377 camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000378
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200379 if( keybits > 128 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000380 /* Generate KB */
Paul Bakker66d5d072014-06-17 16:39:18 +0200381 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000382 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000383
Paul Bakker66d5d072014-06-17 16:39:18 +0200384 camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
385 camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000386 }
387
388 /*
389 * Generating subkeys
Paul Bakker9af723c2014-05-01 13:03:14 +0200390 */
Paul Bakker38119b12009-01-10 23:31:23 +0000391
392 /* Manipulating KL */
Paul Bakker66d5d072014-06-17 16:39:18 +0200393 SHIFT_AND_PLACE( idx, 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000394
395 /* Manipulating KR */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200396 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200397 SHIFT_AND_PLACE( idx, 1 );
Paul Bakker38119b12009-01-10 23:31:23 +0000398 }
399
400 /* Manipulating KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200401 SHIFT_AND_PLACE( idx, 2 );
Paul Bakker38119b12009-01-10 23:31:23 +0000402
403 /* Manipulating KB */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200404 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200405 SHIFT_AND_PLACE( idx, 3 );
Paul Bakker38119b12009-01-10 23:31:23 +0000406 }
407
408 /* Do transpositions */
Paul Bakker66d5d072014-06-17 16:39:18 +0200409 for( i = 0; i < 20; i++ ) {
410 if( transposes[idx][i] != -1 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000411 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
412 }
Paul Bakker38119b12009-01-10 23:31:23 +0000413 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000414
415 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000416}
417
418/*
419 * Camellia key schedule (decryption)
420 */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500421int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx,
422 const unsigned char *key,
423 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000424{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200425 int idx, ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000426 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427 mbedtls_camellia_context cty;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000428 uint32_t *RK;
429 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200430
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 mbedtls_camellia_init( &cty );
Paul Bakker38119b12009-01-10 23:31:23 +0000432
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200433 /* Also checks keybits */
434 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200435 goto exit;
Paul Bakker38119b12009-01-10 23:31:23 +0000436
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200437 ctx->nr = cty.nr;
438 idx = ( ctx->nr == 4 );
439
440 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000441 SK = cty.rk + 24 * 2 + 8 * idx * 2;
442
443 *RK++ = *SK++;
444 *RK++ = *SK++;
445 *RK++ = *SK++;
446 *RK++ = *SK++;
447
Paul Bakker66d5d072014-06-17 16:39:18 +0200448 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
Paul Bakker38119b12009-01-10 23:31:23 +0000449 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000450 *RK++ = *SK++;
451 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000452 }
453
454 SK -= 2;
455
456 *RK++ = *SK++;
457 *RK++ = *SK++;
458 *RK++ = *SK++;
459 *RK++ = *SK++;
460
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200461exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200462 mbedtls_camellia_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000463
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200464 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000465}
466
467/*
468 * Camellia-ECB block encryption/decryption
469 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200470int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000471 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000472 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000473 unsigned char output[16] )
474{
Paul Bakker026c03b2009-03-28 17:53:03 +0000475 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000476 uint32_t *RK, X[4];
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500477 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
478 mode == MBEDTLS_CAMELLIA_DECRYPT );
Paul Bakker38119b12009-01-10 23:31:23 +0000479
Paul Bakkerc2547b02009-07-20 20:40:52 +0000480 ( (void) mode );
481
Paul Bakker38119b12009-01-10 23:31:23 +0000482 NR = ctx->nr;
483 RK = ctx->rk;
484
Joe Subbiani6a506312021-07-07 16:56:29 +0100485 X[0] = MBEDTLS_GET_UINT32_BE( input, 0 );
486 X[1] = MBEDTLS_GET_UINT32_BE( input, 4 );
487 X[2] = MBEDTLS_GET_UINT32_BE( input, 8 );
488 X[3] = MBEDTLS_GET_UINT32_BE( input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000489
490 X[0] ^= *RK++;
491 X[1] ^= *RK++;
492 X[2] ^= *RK++;
493 X[3] ^= *RK++;
494
Paul Bakker66d5d072014-06-17 16:39:18 +0200495 while( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000496 --NR;
Paul Bakker66d5d072014-06-17 16:39:18 +0200497 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000498 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200499 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000500 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200501 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000502 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200503 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000504 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200505 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000506 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200507 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000508 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000509
Paul Bakker66d5d072014-06-17 16:39:18 +0200510 if( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000511 FL(X[0], X[1], RK[0], RK[1]);
512 RK += 2;
513 FLInv(X[2], X[3], RK[0], RK[1]);
514 RK += 2;
515 }
Paul Bakker38119b12009-01-10 23:31:23 +0000516 }
517
518 X[2] ^= *RK++;
519 X[3] ^= *RK++;
520 X[0] ^= *RK++;
521 X[1] ^= *RK++;
522
Joe Subbiani5ecac212021-06-24 13:00:03 +0100523 MBEDTLS_PUT_UINT32_BE( X[2], output, 0 );
524 MBEDTLS_PUT_UINT32_BE( X[3], output, 4 );
525 MBEDTLS_PUT_UINT32_BE( X[0], output, 8 );
526 MBEDTLS_PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000527
528 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000529}
530
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200531#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000532/*
533 * Camellia-CBC buffer encryption/decryption
534 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200535int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500536 int mode,
537 size_t length,
538 unsigned char iv[16],
539 const unsigned char *input,
540 unsigned char *output )
Paul Bakker38119b12009-01-10 23:31:23 +0000541{
542 int i;
543 unsigned char temp[16];
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500544 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
545 mode == MBEDTLS_CAMELLIA_DECRYPT );
Paul Bakker38119b12009-01-10 23:31:23 +0000546
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000547 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200548 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000549
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200550 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000551 {
552 while( length > 0 )
553 {
554 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200555 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000556
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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000575 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é-Gonnard2cf5a7c2015-04-08 12:49:31 +0200585#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000586
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000588/*
589 * Camellia-CFB128 buffer encryption/decryption
590 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200591int mbedtls_camellia_crypt_cfb128( mbedtls_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;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500600 size_t n;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500601 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
602 mode == MBEDTLS_CAMELLIA_DECRYPT );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500603
604 n = *iv_off;
605 if( n >= 16 )
606 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000607
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200608 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000609 {
610 while( length-- )
611 {
612 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200613 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000614
615 c = *input++;
616 *output++ = (unsigned char)( c ^ iv[n] );
617 iv[n] = (unsigned char) c;
618
Paul Bakker66d5d072014-06-17 16:39:18 +0200619 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000620 }
621 }
622 else
623 {
624 while( length-- )
625 {
626 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200627 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000628
629 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
630
Paul Bakker66d5d072014-06-17 16:39:18 +0200631 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000632 }
633 }
634
635 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000636
637 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000638}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200639#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000640
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200641#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000642/*
643 * Camellia-CTR buffer encryption/decryption
644 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200645int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000646 size_t length,
647 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000648 unsigned char nonce_counter[16],
649 unsigned char stream_block[16],
650 const unsigned char *input,
651 unsigned char *output )
652{
Paul Bakker369e14b2012-04-18 14:16:09 +0000653 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500654 size_t n;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500655
656 n = *nc_off;
657 if( n >= 16 )
658 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000659
660 while( length-- )
661 {
662 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200663 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200664 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000665
Paul Bakker369e14b2012-04-18 14:16:09 +0000666 for( i = 16; i > 0; i-- )
667 if( ++nonce_counter[i - 1] != 0 )
668 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000669 }
670 c = *input++;
671 *output++ = (unsigned char)( c ^ stream_block[n] );
672
Paul Bakker66d5d072014-06-17 16:39:18 +0200673 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000674 }
675
676 *nc_off = n;
677
678 return( 0 );
679}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200680#endif /* MBEDTLS_CIPHER_MODE_CTR */
681#endif /* !MBEDTLS_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000682
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200683#if defined(MBEDTLS_SELF_TEST)
Paul Bakker38119b12009-01-10 23:31:23 +0000684
Paul Bakker38119b12009-01-10 23:31:23 +0000685/*
686 * Camellia test vectors from:
687 *
688 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
689 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
690 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000691 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000692 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000693#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000694
695static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
696{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000697 {
698 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
699 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200700 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000701 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 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200707 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000708 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
710 },
711 {
712 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
713 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
714 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
715 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200716 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000717 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
718 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
719 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
720 },
Paul Bakker38119b12009-01-10 23:31:23 +0000721};
722
723static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
724{
725 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
726 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200727 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000728 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
729};
730
731static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
732{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000733 {
734 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
735 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
736 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
737 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
738 },
739 {
740 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
741 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
742 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
743 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
744 },
745 {
746 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
747 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
748 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
749 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
750 }
Paul Bakker38119b12009-01-10 23:31:23 +0000751};
752
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200753#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000754#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000755
756static const unsigned char camellia_test_cbc_key[3][32] =
757{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000758 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
759 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
760 ,
761 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
762 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
763 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
764 ,
765 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
766 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
767 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
768 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000769};
770
771static const unsigned char camellia_test_cbc_iv[16] =
772
773 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
774 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
775;
776
777static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
778{
779 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
780 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
781 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
782 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
783 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
784 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
785
786};
787
788static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
789{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000790 {
791 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
792 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
793 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
794 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
795 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
796 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
797 },
798 {
799 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
800 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
801 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
802 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
803 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
804 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
805 },
806 {
807 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
808 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
809 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
810 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
811 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
812 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
813 }
Paul Bakker38119b12009-01-10 23:31:23 +0000814};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200815#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000816
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200817#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000818/*
819 * Camellia-CTR test vectors from:
820 *
821 * http://www.faqs.org/rfcs/rfc5528.html
822 */
823
824static const unsigned char camellia_test_ctr_key[3][16] =
825{
826 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
827 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
828 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
829 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
830 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
831 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
832};
833
834static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
835{
836 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
838 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
839 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
840 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
841 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
842};
843
844static const unsigned char camellia_test_ctr_pt[3][48] =
845{
846 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
847 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
848
849 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
850 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
851 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
852 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
853
854 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
855 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
856 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
857 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
858 0x20, 0x21, 0x22, 0x23 }
859};
860
861static const unsigned char camellia_test_ctr_ct[3][48] =
862{
863 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
864 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
865 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
866 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
867 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
868 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
869 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
870 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
871 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
872 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
873 0xDF, 0x50, 0x86, 0x96 }
874};
875
876static const int camellia_test_ctr_len[3] =
877 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200878#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000879
880/*
881 * Checkup routine
882 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200883int mbedtls_camellia_self_test( int verbose )
Paul Bakker38119b12009-01-10 23:31:23 +0000884{
Paul Bakker026c03b2009-03-28 17:53:03 +0000885 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000886 unsigned char key[32];
887 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000888 unsigned char src[16];
889 unsigned char dst[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200890#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000891 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200892#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200893#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000894 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000895 unsigned char nonce_counter[16];
896 unsigned char stream_block[16];
897#endif
Gilles Peskinec537aa82021-05-25 09:17:46 +0200898 int ret = 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000899
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200900 mbedtls_camellia_context ctx;
Paul Bakker38119b12009-01-10 23:31:23 +0000901
Gilles Peskinec537aa82021-05-25 09:17:46 +0200902 mbedtls_camellia_init( &ctx );
Paul Bakker38119b12009-01-10 23:31:23 +0000903 memset( key, 0, 32 );
904
Paul Bakker66d5d072014-06-17 16:39:18 +0200905 for( j = 0; j < 6; j++ ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000906 u = j >> 1;
907 v = j & 1;
Paul Bakker38119b12009-01-10 23:31:23 +0000908
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000909 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200910 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
911 (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
Paul Bakker38119b12009-01-10 23:31:23 +0000912
Paul Bakker66d5d072014-06-17 16:39:18 +0200913 for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
914 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000915
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200916 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
917 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200918 memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
919 memcpy( dst, camellia_test_ecb_plain[i], 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
921 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200922 memcpy( src, camellia_test_ecb_plain[i], 16 );
923 memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000924 }
Paul Bakker38119b12009-01-10 23:31:23 +0000925
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200926 mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
Paul Bakker38119b12009-01-10 23:31:23 +0000927
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000928 if( memcmp( buf, dst, 16 ) != 0 )
929 {
930 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +0200932 goto exit;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000933 }
934 }
Paul Bakker38119b12009-01-10 23:31:23 +0000935
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000936 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200937 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000938 }
939
940 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200941 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000942
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200943#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000944 /*
945 * CBC mode
946 */
947 for( j = 0; j < 6; j++ )
948 {
949 u = j >> 1;
950 v = j & 1;
951
952 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
954 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +0000955
Janos Follath98e28a72016-05-31 14:03:54 +0100956 memcpy( src, camellia_test_cbc_iv, 16 );
957 memcpy( dst, camellia_test_cbc_iv, 16 );
958 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000959
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200960 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Janos Follath98e28a72016-05-31 14:03:54 +0100961 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
962 } else {
963 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000964 }
Paul Bakker38119b12009-01-10 23:31:23 +0000965
Janos Follath98e28a72016-05-31 14:03:54 +0100966 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +0000967
Janos Follath98e28a72016-05-31 14:03:54 +0100968 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
969 memcpy( iv , src, 16 );
970 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
971 memcpy( dst, camellia_test_cbc_plain[i], 16 );
972 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
973 memcpy( iv , dst, 16 );
974 memcpy( src, camellia_test_cbc_plain[i], 16 );
975 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
976 }
Paul Bakker38119b12009-01-10 23:31:23 +0000977
Janos Follath98e28a72016-05-31 14:03:54 +0100978 mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
979
980 if( memcmp( buf, dst, 16 ) != 0 )
981 {
982 if( verbose != 0 )
983 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +0200984 goto exit;
Janos Follath98e28a72016-05-31 14:03:54 +0100985 }
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000986 }
Paul Bakker38119b12009-01-10 23:31:23 +0000987
988 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000990 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200991#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000992
993 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000995
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200996#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000997 /*
998 * CTR mode
999 */
1000 for( i = 0; i < 6; i++ )
1001 {
1002 u = i >> 1;
1003 v = i & 1;
1004
1005 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001006 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
1007 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001008
1009 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1010 memcpy( key, camellia_test_ctr_key[u], 16 );
1011
1012 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001013 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001014
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001015 if( v == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001016 {
1017 len = camellia_test_ctr_len[u];
1018 memcpy( buf, camellia_test_ctr_ct[u], len );
1019
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001020 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001021 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001022
1023 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1024 {
1025 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001026 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +02001027 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001028 }
1029 }
1030 else
1031 {
1032 len = camellia_test_ctr_len[u];
1033 memcpy( buf, camellia_test_ctr_pt[u], len );
1034
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001035 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001036 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001037
1038 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1039 {
1040 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +02001042 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001043 }
1044 }
1045
1046 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001047 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001048 }
1049
1050 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001051 mbedtls_printf( "\n" );
1052#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001053
Gilles Peskinec537aa82021-05-25 09:17:46 +02001054 ret = 0;
1055
1056exit:
1057 mbedtls_camellia_free( &ctx );
1058 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +00001059}
1060
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001061#endif /* MBEDTLS_SELF_TEST */
Paul Bakker38119b12009-01-10 23:31:23 +00001062
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001063#endif /* MBEDTLS_CAMELLIA_C */