blob: c29e6c1101163d852561967d24db451488b9b713 [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
Paul Bakker38119b12009-01-10 23:31:23 +000046static const unsigned char SIGMA_CHARS[6][8] =
47{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000048 { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
49 { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
50 { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
51 { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
52 { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
53 { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
Paul Bakker38119b12009-01-10 23:31:23 +000054};
55
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020056#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
Paul Bakkerfa049db2009-01-12 22:12:03 +000057
58static const unsigned char FSb[256] =
Paul Bakker38119b12009-01-10 23:31:23 +000059{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000060 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
61 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
62 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
63 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
64 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
65 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
66 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
67 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
68 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
69 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
70 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
71 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
72 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
73 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
74 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
75 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
Paul Bakker38119b12009-01-10 23:31:23 +000076};
77
78#define SBOX1(n) FSb[(n)]
79#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
80#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
Paul Bakkerfa049db2009-01-12 22:12:03 +000081#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
82
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020083#else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +000084
Paul Bakkerc32c6b52009-01-11 21:36:43 +000085static const unsigned char FSb[256] =
86{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +020087 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 Bakkerc32c6b52009-01-11 21:36:43 +0000103};
104
105static const unsigned char FSb2[256] =
106{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200107 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
108 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
109 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
110 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
111 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
112 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
113 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
114 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
115 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
116 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
117 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
118 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
119 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
120 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
121 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
122 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000123};
124
125static const unsigned char FSb3[256] =
126{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200127 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
128 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
129 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
130 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
131 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
132 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
133 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
134 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
135 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
136 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
137 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
138 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
139 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
140 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
141 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
142 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000143};
144
145static const unsigned char FSb4[256] =
146{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200147 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
148 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
149 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
150 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
151 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
152 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
153 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
154 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
155 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
156 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
157 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
158 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
159 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
160 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
161 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
162 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000163};
164
165#define SBOX1(n) FSb[(n)]
166#define SBOX2(n) FSb2[(n)]
167#define SBOX3(n) FSb3[(n)]
168#define SBOX4(n) FSb4[(n)]
Paul Bakker38119b12009-01-10 23:31:23 +0000169
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200170#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000171
Paul Bakker38119b12009-01-10 23:31:23 +0000172static const unsigned char shifts[2][4][4] =
173{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000174 {
175 { 1, 1, 1, 1 }, /* KL */
176 { 0, 0, 0, 0 }, /* KR */
177 { 1, 1, 1, 1 }, /* KA */
178 { 0, 0, 0, 0 } /* KB */
179 },
180 {
181 { 1, 0, 1, 1 }, /* KL */
182 { 1, 1, 0, 1 }, /* KR */
183 { 1, 1, 1, 0 }, /* KA */
184 { 1, 1, 0, 1 } /* KB */
185 }
Paul Bakker38119b12009-01-10 23:31:23 +0000186};
187
Paul Bakker026c03b2009-03-28 17:53:03 +0000188static const signed char indexes[2][4][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000189{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000190 {
191 { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39,
192 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
193 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
194 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
195 { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17,
196 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
197 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
198 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */
199 },
200 {
201 { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1,
202 -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
203 { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17,
204 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
205 { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
206 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
207 { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21,
208 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */
209 }
Paul Bakker38119b12009-01-10 23:31:23 +0000210};
211
Paul Bakker026c03b2009-03-28 17:53:03 +0000212static const signed char transposes[2][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000213{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000214 {
215 21, 22, 23, 20,
216 -1, -1, -1, -1,
217 18, 19, 16, 17,
218 11, 8, 9, 10,
219 15, 12, 13, 14
220 },
221 {
222 25, 26, 27, 24,
223 29, 30, 31, 28,
224 18, 19, 16, 17,
225 -1, -1, -1, -1,
226 -1, -1, -1, -1
227 }
Paul Bakker38119b12009-01-10 23:31:23 +0000228};
229
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000230/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000231#define ROTL(DEST, SRC, SHIFT) \
232{ \
233 (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \
234 (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \
235 (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \
236 (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \
Paul Bakker38119b12009-01-10 23:31:23 +0000237}
238
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000239#define FL(XL, XR, KL, KR) \
240{ \
241 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
242 (XL) = ((XR) | (KR)) ^ (XL); \
Paul Bakker38119b12009-01-10 23:31:23 +0000243}
Paul Bakker9af723c2014-05-01 13:03:14 +0200244
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000245#define FLInv(YL, YR, KL, KR) \
246{ \
247 (YL) = ((YR) | (KR)) ^ (YL); \
248 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
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 SHIFT_AND_PLACE(INDEX, OFFSET) \
252{ \
253 TK[0] = KC[(OFFSET) * 4 + 0]; \
254 TK[1] = KC[(OFFSET) * 4 + 1]; \
255 TK[2] = KC[(OFFSET) * 4 + 2]; \
256 TK[3] = KC[(OFFSET) * 4 + 3]; \
257 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200258 for( i = 1; i <= 4; i++ ) \
259 if( shifts[(INDEX)][(OFFSET)][i -1] ) \
260 ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000261 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200262 for( i = 0; i < 20; i++ ) \
263 if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
264 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
265 } \
Paul Bakker38119b12009-01-10 23:31:23 +0000266}
267
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200268static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
269 uint32_t z[2])
Paul Bakker38119b12009-01-10 23:31:23 +0000270{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000271 uint32_t I0, I1;
272 I0 = x[0] ^ k[0];
273 I1 = x[1] ^ k[1];
Paul Bakker38119b12009-01-10 23:31:23 +0000274
Joe Subbianicd84d762021-07-08 14:59:52 +0100275 I0 = ((uint32_t) SBOX1( MBEDTLS_BYTE_3( I0 )) << 24) |
276 ((uint32_t) SBOX2( MBEDTLS_BYTE_2( I0 )) << 16) |
277 ((uint32_t) SBOX3( MBEDTLS_BYTE_1( I0 )) << 8) |
278 ((uint32_t) SBOX4( MBEDTLS_BYTE_0( I0 )) );
279 I1 = ((uint32_t) SBOX2( MBEDTLS_BYTE_3( I1 )) << 24) |
280 ((uint32_t) SBOX3( MBEDTLS_BYTE_2( I1 )) << 16) |
281 ((uint32_t) SBOX4( MBEDTLS_BYTE_1( I1 )) << 8) |
282 ((uint32_t) SBOX1( MBEDTLS_BYTE_0( I1 )) );
Paul Bakker38119b12009-01-10 23:31:23 +0000283
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000284 I0 ^= (I1 << 8) | (I1 >> 24);
285 I1 ^= (I0 << 16) | (I0 >> 16);
286 I0 ^= (I1 >> 8) | (I1 << 24);
287 I1 ^= (I0 >> 8) | (I0 << 24);
Paul Bakker38119b12009-01-10 23:31:23 +0000288
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000289 z[0] ^= I1;
290 z[1] ^= I0;
Paul Bakker38119b12009-01-10 23:31:23 +0000291}
292
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200293void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200294{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200295 memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200296}
297
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200298void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200299{
300 if( ctx == NULL )
301 return;
302
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500303 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200304}
305
Paul Bakker38119b12009-01-10 23:31:23 +0000306/*
307 * Camellia key schedule (encryption)
308 */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500309int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx,
310 const unsigned char *key,
311 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000312{
Paul Bakker23986e52011-04-24 08:57:21 +0000313 int idx;
314 size_t i;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000315 uint32_t *RK;
Paul Bakker38119b12009-01-10 23:31:23 +0000316 unsigned char t[64];
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000317 uint32_t SIGMA[6][2];
318 uint32_t KC[16];
319 uint32_t TK[20];
Paul Bakker38119b12009-01-10 23:31:23 +0000320
321 RK = ctx->rk;
322
Paul Bakker66d5d072014-06-17 16:39:18 +0200323 memset( t, 0, 64 );
324 memset( RK, 0, sizeof(ctx->rk) );
Paul Bakker38119b12009-01-10 23:31:23 +0000325
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200326 switch( keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000327 {
328 case 128: ctx->nr = 3; idx = 0; break;
329 case 192:
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000330 case 256: ctx->nr = 4; idx = 1; break;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500331 default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000332 }
333
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200334 for( i = 0; i < keybits / 8; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000335 t[i] = key[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000336
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200337 if( keybits == 192 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200338 for( i = 0; i < 8; i++ )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000339 t[24 + i] = ~t[16 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000340 }
341
Paul Bakker38119b12009-01-10 23:31:23 +0000342 /*
343 * Prepare SIGMA values
344 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200345 for( i = 0; i < 6; i++ ) {
Joe Subbiani6a506312021-07-07 16:56:29 +0100346 SIGMA[i][0] = MBEDTLS_GET_UINT32_BE( SIGMA_CHARS[i], 0 );
347 SIGMA[i][1] = MBEDTLS_GET_UINT32_BE( SIGMA_CHARS[i], 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000348 }
349
350 /*
351 * Key storage in KC
352 * Order: KL, KR, KA, KB
353 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200354 memset( KC, 0, sizeof(KC) );
Paul Bakker38119b12009-01-10 23:31:23 +0000355
356 /* Store KL, KR */
Paul Bakker66d5d072014-06-17 16:39:18 +0200357 for( i = 0; i < 8; i++ )
Joe Subbiani6a506312021-07-07 16:56:29 +0100358 KC[i] = MBEDTLS_GET_UINT32_BE( t, i * 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000359
360 /* Generate KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200361 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000362 KC[8 + i] = KC[i] ^ KC[4 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000363
Paul Bakker66d5d072014-06-17 16:39:18 +0200364 camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
365 camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000366
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];
Paul Bakker38119b12009-01-10 23:31:23 +0000369
Paul Bakker66d5d072014-06-17 16:39:18 +0200370 camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
371 camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000372
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200373 if( keybits > 128 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000374 /* Generate KB */
Paul Bakker66d5d072014-06-17 16:39:18 +0200375 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000376 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000377
Paul Bakker66d5d072014-06-17 16:39:18 +0200378 camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
379 camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000380 }
381
382 /*
383 * Generating subkeys
Paul Bakker9af723c2014-05-01 13:03:14 +0200384 */
Paul Bakker38119b12009-01-10 23:31:23 +0000385
386 /* Manipulating KL */
Paul Bakker66d5d072014-06-17 16:39:18 +0200387 SHIFT_AND_PLACE( idx, 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000388
389 /* Manipulating KR */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200390 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200391 SHIFT_AND_PLACE( idx, 1 );
Paul Bakker38119b12009-01-10 23:31:23 +0000392 }
393
394 /* Manipulating KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200395 SHIFT_AND_PLACE( idx, 2 );
Paul Bakker38119b12009-01-10 23:31:23 +0000396
397 /* Manipulating KB */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200398 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200399 SHIFT_AND_PLACE( idx, 3 );
Paul Bakker38119b12009-01-10 23:31:23 +0000400 }
401
402 /* Do transpositions */
Paul Bakker66d5d072014-06-17 16:39:18 +0200403 for( i = 0; i < 20; i++ ) {
404 if( transposes[idx][i] != -1 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000405 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
406 }
Paul Bakker38119b12009-01-10 23:31:23 +0000407 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000408
409 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000410}
411
412/*
413 * Camellia key schedule (decryption)
414 */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500415int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx,
416 const unsigned char *key,
417 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000418{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200419 int idx, ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000420 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200421 mbedtls_camellia_context cty;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000422 uint32_t *RK;
423 uint32_t *SK;
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200424
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200425 mbedtls_camellia_init( &cty );
Paul Bakker38119b12009-01-10 23:31:23 +0000426
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200427 /* Also checks keybits */
428 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200429 goto exit;
Paul Bakker38119b12009-01-10 23:31:23 +0000430
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200431 ctx->nr = cty.nr;
432 idx = ( ctx->nr == 4 );
433
434 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000435 SK = cty.rk + 24 * 2 + 8 * idx * 2;
436
437 *RK++ = *SK++;
438 *RK++ = *SK++;
439 *RK++ = *SK++;
440 *RK++ = *SK++;
441
Paul Bakker66d5d072014-06-17 16:39:18 +0200442 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
Paul Bakker38119b12009-01-10 23:31:23 +0000443 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000444 *RK++ = *SK++;
445 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000446 }
447
448 SK -= 2;
449
450 *RK++ = *SK++;
451 *RK++ = *SK++;
452 *RK++ = *SK++;
453 *RK++ = *SK++;
454
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200455exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200456 mbedtls_camellia_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000457
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200458 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000459}
460
461/*
462 * Camellia-ECB block encryption/decryption
463 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200464int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000465 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000466 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000467 unsigned char output[16] )
468{
Paul Bakker026c03b2009-03-28 17:53:03 +0000469 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000470 uint32_t *RK, X[4];
Tuvshinzaya Erdenekhuu1fd7f982022-08-05 15:31:57 +0100471 if( mode != MBEDTLS_CAMELLIA_ENCRYPT && mode != MBEDTLS_CAMELLIA_DECRYPT )
472 return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA;
Paul Bakker38119b12009-01-10 23:31:23 +0000473
Paul Bakkerc2547b02009-07-20 20:40:52 +0000474 ( (void) mode );
475
Paul Bakker38119b12009-01-10 23:31:23 +0000476 NR = ctx->nr;
477 RK = ctx->rk;
478
Joe Subbiani6a506312021-07-07 16:56:29 +0100479 X[0] = MBEDTLS_GET_UINT32_BE( input, 0 );
480 X[1] = MBEDTLS_GET_UINT32_BE( input, 4 );
481 X[2] = MBEDTLS_GET_UINT32_BE( input, 8 );
482 X[3] = MBEDTLS_GET_UINT32_BE( input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000483
484 X[0] ^= *RK++;
485 X[1] ^= *RK++;
486 X[2] ^= *RK++;
487 X[3] ^= *RK++;
488
Paul Bakker66d5d072014-06-17 16:39:18 +0200489 while( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000490 --NR;
Paul Bakker66d5d072014-06-17 16:39:18 +0200491 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000492 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200493 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000494 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200495 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000496 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200497 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000498 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200499 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000500 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200501 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000502 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000503
Paul Bakker66d5d072014-06-17 16:39:18 +0200504 if( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000505 FL(X[0], X[1], RK[0], RK[1]);
506 RK += 2;
507 FLInv(X[2], X[3], RK[0], RK[1]);
508 RK += 2;
509 }
Paul Bakker38119b12009-01-10 23:31:23 +0000510 }
511
512 X[2] ^= *RK++;
513 X[3] ^= *RK++;
514 X[0] ^= *RK++;
515 X[1] ^= *RK++;
516
Joe Subbiani5ecac212021-06-24 13:00:03 +0100517 MBEDTLS_PUT_UINT32_BE( X[2], output, 0 );
518 MBEDTLS_PUT_UINT32_BE( X[3], output, 4 );
519 MBEDTLS_PUT_UINT32_BE( X[0], output, 8 );
520 MBEDTLS_PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000521
522 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000523}
524
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200525#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000526/*
527 * Camellia-CBC buffer encryption/decryption
528 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200529int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500530 int mode,
531 size_t length,
532 unsigned char iv[16],
533 const unsigned char *input,
534 unsigned char *output )
Paul Bakker38119b12009-01-10 23:31:23 +0000535{
536 int i;
537 unsigned char temp[16];
Tuvshinzaya Erdenekhuu1fd7f982022-08-05 15:31:57 +0100538 if( mode != MBEDTLS_CAMELLIA_ENCRYPT && mode != MBEDTLS_CAMELLIA_DECRYPT )
539 return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA;
Paul Bakker38119b12009-01-10 23:31:23 +0000540
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000541 if( length % 16 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200542 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000543
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200544 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000545 {
546 while( length > 0 )
547 {
548 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200549 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000550
551 for( i = 0; i < 16; i++ )
552 output[i] = (unsigned char)( output[i] ^ iv[i] );
553
554 memcpy( iv, temp, 16 );
555
556 input += 16;
557 output += 16;
558 length -= 16;
559 }
560 }
561 else
562 {
563 while( length > 0 )
564 {
565 for( i = 0; i < 16; i++ )
566 output[i] = (unsigned char)( input[i] ^ iv[i] );
567
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000569 memcpy( iv, output, 16 );
570
571 input += 16;
572 output += 16;
573 length -= 16;
574 }
575 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000576
577 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000578}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200579#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000580
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200581#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000582/*
583 * Camellia-CFB128 buffer encryption/decryption
584 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200585int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000586 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000587 size_t length,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000588 size_t *iv_off,
Paul Bakker38119b12009-01-10 23:31:23 +0000589 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000590 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000591 unsigned char *output )
592{
Paul Bakker1ef71df2011-06-09 14:14:58 +0000593 int c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500594 size_t n;
Tuvshinzaya Erdenekhuu1fd7f982022-08-05 15:31:57 +0100595 if( mode != MBEDTLS_CAMELLIA_ENCRYPT && mode != MBEDTLS_CAMELLIA_DECRYPT )
596 return MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500597
598 n = *iv_off;
599 if( n >= 16 )
600 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000601
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200602 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000603 {
604 while( length-- )
605 {
606 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200607 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000608
609 c = *input++;
610 *output++ = (unsigned char)( c ^ iv[n] );
611 iv[n] = (unsigned char) c;
612
Paul Bakker66d5d072014-06-17 16:39:18 +0200613 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000614 }
615 }
616 else
617 {
618 while( length-- )
619 {
620 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200621 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000622
623 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
624
Paul Bakker66d5d072014-06-17 16:39:18 +0200625 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000626 }
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}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200633#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000634
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200635#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000636/*
637 * Camellia-CTR buffer encryption/decryption
638 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200639int mbedtls_camellia_crypt_ctr( mbedtls_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;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500648 size_t n;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500649
650 n = *nc_off;
651 if( n >= 16 )
652 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000653
654 while( length-- )
655 {
656 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200657 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200658 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000659
Paul Bakker369e14b2012-04-18 14:16:09 +0000660 for( i = 16; i > 0; i-- )
661 if( ++nonce_counter[i - 1] != 0 )
662 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000663 }
664 c = *input++;
665 *output++ = (unsigned char)( c ^ stream_block[n] );
666
Paul Bakker66d5d072014-06-17 16:39:18 +0200667 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000668 }
669
670 *nc_off = n;
671
672 return( 0 );
673}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200674#endif /* MBEDTLS_CIPHER_MODE_CTR */
675#endif /* !MBEDTLS_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000676
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200677#if defined(MBEDTLS_SELF_TEST)
Paul Bakker38119b12009-01-10 23:31:23 +0000678
Paul Bakker38119b12009-01-10 23:31:23 +0000679/*
680 * Camellia test vectors from:
681 *
682 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
683 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
684 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000685 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000686 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000687#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000688
689static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
690{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000691 {
692 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
693 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200694 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000695 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
696 },
697 {
698 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
699 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
700 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200701 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
703 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
704 },
705 {
706 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
707 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
708 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
709 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200710 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000711 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
712 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
714 },
Paul Bakker38119b12009-01-10 23:31:23 +0000715};
716
717static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
718{
719 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
720 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200721 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000722 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
723};
724
725static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
726{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000727 {
728 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
729 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
730 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
731 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
732 },
733 {
734 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
735 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
736 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
737 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
738 },
739 {
740 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
741 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
742 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
743 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
744 }
Paul Bakker38119b12009-01-10 23:31:23 +0000745};
746
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200747#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000748#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000749
750static const unsigned char camellia_test_cbc_key[3][32] =
751{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000752 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
753 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
754 ,
755 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
756 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
757 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
758 ,
759 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
760 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
761 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
762 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000763};
764
765static const unsigned char camellia_test_cbc_iv[16] =
766
767 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
768 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
769;
770
771static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
772{
773 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
774 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
775 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
776 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
777 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
778 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
779
780};
781
782static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
783{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000784 {
785 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
786 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
787 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
788 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
789 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
790 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
791 },
792 {
793 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
794 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
795 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
796 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
797 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
798 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
799 },
800 {
801 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
802 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
803 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
804 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
805 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
806 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
807 }
Paul Bakker38119b12009-01-10 23:31:23 +0000808};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200809#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000810
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200811#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000812/*
813 * Camellia-CTR test vectors from:
814 *
815 * http://www.faqs.org/rfcs/rfc5528.html
816 */
817
818static const unsigned char camellia_test_ctr_key[3][16] =
819{
820 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
821 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
822 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
823 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
824 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
825 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
826};
827
828static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
829{
830 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
831 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
832 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
833 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
834 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
835 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
836};
837
838static const unsigned char camellia_test_ctr_pt[3][48] =
839{
840 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
841 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
842
843 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
844 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
845 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
846 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
847
848 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
849 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
850 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
851 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
852 0x20, 0x21, 0x22, 0x23 }
853};
854
855static const unsigned char camellia_test_ctr_ct[3][48] =
856{
857 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
858 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
859 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
860 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
861 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
862 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
863 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
864 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
865 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
866 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
867 0xDF, 0x50, 0x86, 0x96 }
868};
869
870static const int camellia_test_ctr_len[3] =
871 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200872#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000873
874/*
875 * Checkup routine
876 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200877int mbedtls_camellia_self_test( int verbose )
Paul Bakker38119b12009-01-10 23:31:23 +0000878{
Paul Bakker026c03b2009-03-28 17:53:03 +0000879 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000880 unsigned char key[32];
881 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000882 unsigned char src[16];
883 unsigned char dst[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200884#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000885 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200886#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200887#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000888 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000889 unsigned char nonce_counter[16];
890 unsigned char stream_block[16];
891#endif
Gilles Peskinec537aa82021-05-25 09:17:46 +0200892 int ret = 1;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000893
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200894 mbedtls_camellia_context ctx;
Paul Bakker38119b12009-01-10 23:31:23 +0000895
Gilles Peskinec537aa82021-05-25 09:17:46 +0200896 mbedtls_camellia_init( &ctx );
Paul Bakker38119b12009-01-10 23:31:23 +0000897 memset( key, 0, 32 );
898
Paul Bakker66d5d072014-06-17 16:39:18 +0200899 for( j = 0; j < 6; j++ ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000900 u = j >> 1;
901 v = j & 1;
Paul Bakker38119b12009-01-10 23:31:23 +0000902
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000903 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200904 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
905 (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
Paul Bakker38119b12009-01-10 23:31:23 +0000906
Paul Bakker66d5d072014-06-17 16:39:18 +0200907 for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
908 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000909
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200910 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
911 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200912 memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
913 memcpy( dst, camellia_test_ecb_plain[i], 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200914 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
915 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200916 memcpy( src, camellia_test_ecb_plain[i], 16 );
917 memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000918 }
Paul Bakker38119b12009-01-10 23:31:23 +0000919
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920 mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
Paul Bakker38119b12009-01-10 23:31:23 +0000921
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000922 if( memcmp( buf, dst, 16 ) != 0 )
923 {
924 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200925 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +0200926 goto exit;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000927 }
928 }
Paul Bakker38119b12009-01-10 23:31:23 +0000929
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000930 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000932 }
933
934 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200935 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000936
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200937#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000938 /*
939 * CBC mode
940 */
941 for( j = 0; j < 6; j++ )
942 {
943 u = j >> 1;
944 v = j & 1;
945
946 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200947 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
948 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +0000949
Janos Follath98e28a72016-05-31 14:03:54 +0100950 memcpy( src, camellia_test_cbc_iv, 16 );
951 memcpy( dst, camellia_test_cbc_iv, 16 );
952 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000953
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200954 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Janos Follath98e28a72016-05-31 14:03:54 +0100955 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
956 } else {
957 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000958 }
Paul Bakker38119b12009-01-10 23:31:23 +0000959
Janos Follath98e28a72016-05-31 14:03:54 +0100960 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +0000961
Janos Follath98e28a72016-05-31 14:03:54 +0100962 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
963 memcpy( iv , src, 16 );
964 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
965 memcpy( dst, camellia_test_cbc_plain[i], 16 );
966 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
967 memcpy( iv , dst, 16 );
968 memcpy( src, camellia_test_cbc_plain[i], 16 );
969 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
970 }
Paul Bakker38119b12009-01-10 23:31:23 +0000971
Janos Follath98e28a72016-05-31 14:03:54 +0100972 mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
973
974 if( memcmp( buf, dst, 16 ) != 0 )
975 {
976 if( verbose != 0 )
977 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +0200978 goto exit;
Janos Follath98e28a72016-05-31 14:03:54 +0100979 }
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000980 }
Paul Bakker38119b12009-01-10 23:31:23 +0000981
982 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200983 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000984 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200985#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000986
987 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200988 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000989
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200990#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000991 /*
992 * CTR mode
993 */
994 for( i = 0; i < 6; i++ )
995 {
996 u = i >> 1;
997 v = i & 1;
998
999 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001000 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
1001 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001002
1003 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1004 memcpy( key, camellia_test_ctr_key[u], 16 );
1005
1006 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001007 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001008
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001009 if( v == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001010 {
1011 len = camellia_test_ctr_len[u];
1012 memcpy( buf, camellia_test_ctr_ct[u], len );
1013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001014 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001015 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001016
1017 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1018 {
1019 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001020 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +02001021 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001022 }
1023 }
1024 else
1025 {
1026 len = camellia_test_ctr_len[u];
1027 memcpy( buf, camellia_test_ctr_pt[u], len );
1028
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001029 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001030 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001031
1032 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1033 {
1034 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001035 mbedtls_printf( "failed\n" );
Gilles Peskinec537aa82021-05-25 09:17:46 +02001036 goto exit;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001037 }
1038 }
1039
1040 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001042 }
1043
1044 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001045 mbedtls_printf( "\n" );
1046#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001047
Gilles Peskinec537aa82021-05-25 09:17:46 +02001048 ret = 0;
1049
1050exit:
1051 mbedtls_camellia_free( &ctx );
1052 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +00001053}
1054
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001055#endif /* MBEDTLS_SELF_TEST */
Paul Bakker38119b12009-01-10 23:31:23 +00001056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001057#endif /* MBEDTLS_CAMELLIA_C */