blob: 58ae1a86e1f5c5811beff80b1f8d1f575f3485f9 [file] [log] [blame]
Paul Bakker38119b12009-01-10 23:31:23 +00001/*
2 * Camellia implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
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 Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker38119b12009-01-10 23:31:23 +000020 */
21/*
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000022 * The Camellia block cipher was designed by NTT and Mitsubishi Electric
23 * Corporation.
Paul Bakker38119b12009-01-10 23:31:23 +000024 *
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000025 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf
Paul Bakker38119b12009-01-10 23:31:23 +000026 */
27
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020031#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020032#endif
Paul Bakker38119b12009-01-10 23:31:23 +000033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020034#if defined(MBEDTLS_CAMELLIA_C)
Paul Bakker38119b12009-01-10 23:31:23 +000035
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000036#include "mbedtls/camellia.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050037#include "mbedtls/platform_util.h"
Paul Bakker38119b12009-01-10 23:31:23 +000038
Rich Evans00ab4702015-02-06 13:43:58 +000039#include <string.h>
Manuel Pégourié-Gonnard394608e2015-02-17 16:01:07 +010040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_SELF_TEST)
42#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000043#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010044#else
Rich Evans00ab4702015-02-06 13:43:58 +000045#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046#define mbedtls_printf printf
47#endif /* MBEDTLS_PLATFORM_C */
48#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#if !defined(MBEDTLS_CAMELLIA_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020051
Hanno Beckerb4b7fb72018-12-12 18:02:06 +000052/* Parameter validation macros */
53#define CAMELLIA_VALIDATE_RET( cond ) \
54 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA )
55#define CAMELLIA_VALIDATE( cond ) \
56 MBEDTLS_INTERNAL_VALIDATE( cond )
57
Paul Bakker38119b12009-01-10 23:31:23 +000058/*
59 * 32-bit integer manipulation macros (big endian)
60 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000061#ifndef GET_UINT32_BE
62#define GET_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000063{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000064 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
65 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
66 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
67 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker38119b12009-01-10 23:31:23 +000068}
69#endif
70
Paul Bakker5c2364c2012-10-01 14:41:15 +000071#ifndef PUT_UINT32_BE
72#define PUT_UINT32_BE(n,b,i) \
Paul Bakker38119b12009-01-10 23:31:23 +000073{ \
74 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
75 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
76 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
77 (b)[(i) + 3] = (unsigned char) ( (n) ); \
78}
79#endif
80
81static const unsigned char SIGMA_CHARS[6][8] =
82{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000083 { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },
84 { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },
85 { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },
86 { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },
87 { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },
88 { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }
Paul Bakker38119b12009-01-10 23:31:23 +000089};
90
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020091#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)
Paul Bakkerfa049db2009-01-12 22:12:03 +000092
93static const unsigned char FSb[256] =
Paul Bakker38119b12009-01-10 23:31:23 +000094{
Paul Bakkerc81f6c32009-05-03 13:09:15 +000095 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
96 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
97 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
98 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
99 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
100 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
101 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
102 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
103 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
104 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
105 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
106 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
107 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
108 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
109 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
110 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158
Paul Bakker38119b12009-01-10 23:31:23 +0000111};
112
113#define SBOX1(n) FSb[(n)]
114#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)
115#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)
Paul Bakkerfa049db2009-01-12 22:12:03 +0000116#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]
117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200118#else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000119
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000120static const unsigned char FSb[256] =
121{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200122 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65,
123 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189,
124 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26,
125 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77,
126 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153,
127 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215,
128 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
129 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80,
130 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210,
131 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148,
132 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226,
133 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46,
134 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89,
135 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
136 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164,
137 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000138};
139
140static const unsigned char FSb2[256] =
141{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200142 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130,
143 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123,
144 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52,
145 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154,
146 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51,
147 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175,
148 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68,
149 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160,
150 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165,
151 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41,
152 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197,
153 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92,
154 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178,
155 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245,
156 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73,
157 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000158};
159
160static const unsigned char FSb3[256] =
161{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200162 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160,
163 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222,
164 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13,
165 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166,
166 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204,
167 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235,
168 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17,
169 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40,
170 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105,
171 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74,
172 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113,
173 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23,
174 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172,
175 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125,
176 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82,
177 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000178};
179
180static const unsigned char FSb4[256] =
181{
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200182 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146,
183 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108,
184 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4,
185 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105,
186 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221,
187 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99,
188 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141,
189 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128,
190 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189,
191 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77,
192 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215,
193 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80,
194 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148,
195 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46,
196 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250,
197 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000198};
199
200#define SBOX1(n) FSb[(n)]
201#define SBOX2(n) FSb2[(n)]
202#define SBOX3(n) FSb3[(n)]
203#define SBOX4(n) FSb4[(n)]
Paul Bakker38119b12009-01-10 23:31:23 +0000204
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200205#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */
Paul Bakkerfa049db2009-01-12 22:12:03 +0000206
Paul Bakker38119b12009-01-10 23:31:23 +0000207static const unsigned char shifts[2][4][4] =
208{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000209 {
210 { 1, 1, 1, 1 }, /* KL */
211 { 0, 0, 0, 0 }, /* KR */
212 { 1, 1, 1, 1 }, /* KA */
213 { 0, 0, 0, 0 } /* KB */
214 },
215 {
216 { 1, 0, 1, 1 }, /* KL */
217 { 1, 1, 0, 1 }, /* KR */
218 { 1, 1, 1, 0 }, /* KA */
219 { 1, 1, 0, 1 } /* KB */
220 }
Paul Bakker38119b12009-01-10 23:31:23 +0000221};
222
Paul Bakker026c03b2009-03-28 17:53:03 +0000223static const signed char indexes[2][4][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000224{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000225 {
226 { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39,
227 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */
228 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
229 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */
230 { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17,
231 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */
232 { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
233 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */
234 },
235 {
236 { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1,
237 -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */
238 { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17,
239 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */
240 { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,
241 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */
242 { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21,
243 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */
244 }
Paul Bakker38119b12009-01-10 23:31:23 +0000245};
246
Paul Bakker026c03b2009-03-28 17:53:03 +0000247static const signed char transposes[2][20] =
Paul Bakker38119b12009-01-10 23:31:23 +0000248{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000249 {
250 21, 22, 23, 20,
251 -1, -1, -1, -1,
252 18, 19, 16, 17,
253 11, 8, 9, 10,
254 15, 12, 13, 14
255 },
256 {
257 25, 26, 27, 24,
258 29, 30, 31, 28,
259 18, 19, 16, 17,
260 -1, -1, -1, -1,
261 -1, -1, -1, -1
262 }
Paul Bakker38119b12009-01-10 23:31:23 +0000263};
264
Paul Bakkerc32c6b52009-01-11 21:36:43 +0000265/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000266#define ROTL(DEST, SRC, SHIFT) \
267{ \
268 (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \
269 (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \
270 (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \
271 (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \
Paul Bakker38119b12009-01-10 23:31:23 +0000272}
273
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000274#define FL(XL, XR, KL, KR) \
275{ \
276 (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \
277 (XL) = ((XR) | (KR)) ^ (XL); \
Paul Bakker38119b12009-01-10 23:31:23 +0000278}
Paul Bakker9af723c2014-05-01 13:03:14 +0200279
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000280#define FLInv(YL, YR, KL, KR) \
281{ \
282 (YL) = ((YR) | (KR)) ^ (YL); \
283 (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \
Paul Bakker38119b12009-01-10 23:31:23 +0000284}
Paul Bakker9af723c2014-05-01 13:03:14 +0200285
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000286#define SHIFT_AND_PLACE(INDEX, OFFSET) \
287{ \
288 TK[0] = KC[(OFFSET) * 4 + 0]; \
289 TK[1] = KC[(OFFSET) * 4 + 1]; \
290 TK[2] = KC[(OFFSET) * 4 + 2]; \
291 TK[3] = KC[(OFFSET) * 4 + 3]; \
292 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200293 for( i = 1; i <= 4; i++ ) \
294 if( shifts[(INDEX)][(OFFSET)][i -1] ) \
295 ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000296 \
Paul Bakker66d5d072014-06-17 16:39:18 +0200297 for( i = 0; i < 20; i++ ) \
298 if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \
299 RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \
300 } \
Paul Bakker38119b12009-01-10 23:31:23 +0000301}
302
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200303static void camellia_feistel( const uint32_t x[2], const uint32_t k[2],
304 uint32_t z[2])
Paul Bakker38119b12009-01-10 23:31:23 +0000305{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000306 uint32_t I0, I1;
307 I0 = x[0] ^ k[0];
308 I1 = x[1] ^ k[1];
Paul Bakker38119b12009-01-10 23:31:23 +0000309
Manuel Pégourié-Gonnardb31b61b2014-11-10 13:05:43 +0100310 I0 = ((uint32_t) SBOX1((I0 >> 24) & 0xFF) << 24) |
311 ((uint32_t) SBOX2((I0 >> 16) & 0xFF) << 16) |
312 ((uint32_t) SBOX3((I0 >> 8) & 0xFF) << 8) |
313 ((uint32_t) SBOX4((I0 ) & 0xFF) );
314 I1 = ((uint32_t) SBOX2((I1 >> 24) & 0xFF) << 24) |
315 ((uint32_t) SBOX3((I1 >> 16) & 0xFF) << 16) |
316 ((uint32_t) SBOX4((I1 >> 8) & 0xFF) << 8) |
317 ((uint32_t) SBOX1((I1 ) & 0xFF) );
Paul Bakker38119b12009-01-10 23:31:23 +0000318
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000319 I0 ^= (I1 << 8) | (I1 >> 24);
320 I1 ^= (I0 << 16) | (I0 >> 16);
321 I0 ^= (I1 >> 8) | (I1 << 24);
322 I1 ^= (I0 >> 8) | (I0 << 24);
Paul Bakker38119b12009-01-10 23:31:23 +0000323
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000324 z[0] ^= I1;
325 z[1] ^= I0;
Paul Bakker38119b12009-01-10 23:31:23 +0000326}
327
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200328void mbedtls_camellia_init( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200329{
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000330 CAMELLIA_VALIDATE( ctx != NULL );
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200331 mbedtls_platform_memset( ctx, 0, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200332}
333
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200334void mbedtls_camellia_free( mbedtls_camellia_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200335{
336 if( ctx == NULL )
337 return;
338
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500339 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200340}
341
Paul Bakker38119b12009-01-10 23:31:23 +0000342/*
343 * Camellia key schedule (encryption)
344 */
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000345int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx,
346 const unsigned char *key,
347 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000348{
Paul Bakker23986e52011-04-24 08:57:21 +0000349 int idx;
350 size_t i;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000351 uint32_t *RK;
Paul Bakker38119b12009-01-10 23:31:23 +0000352 unsigned char t[64];
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000353 uint32_t SIGMA[6][2];
354 uint32_t KC[16];
355 uint32_t TK[20];
Hanno Becker70ded362018-12-19 13:42:05 +0000356
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000357 CAMELLIA_VALIDATE_RET( ctx != NULL );
358 CAMELLIA_VALIDATE_RET( key != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000359
360 RK = ctx->rk;
361
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200362 mbedtls_platform_memset( t, 0, 64 );
363 mbedtls_platform_memset( RK, 0, sizeof(ctx->rk) );
Paul Bakker38119b12009-01-10 23:31:23 +0000364
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200365 switch( keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000366 {
367 case 128: ctx->nr = 3; idx = 0; break;
368 case 192:
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000369 case 256: ctx->nr = 4; idx = 1; break;
Hanno Becker4c029d02018-12-17 13:20:05 +0000370 default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000371 }
372
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200373 for( i = 0; i < keybits / 8; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000374 t[i] = key[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000375
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200376 if( keybits == 192 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200377 for( i = 0; i < 8; i++ )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000378 t[24 + i] = ~t[16 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000379 }
380
Paul Bakker38119b12009-01-10 23:31:23 +0000381 /*
382 * Prepare SIGMA values
383 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200384 for( i = 0; i < 6; i++ ) {
385 GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 );
386 GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000387 }
388
389 /*
390 * Key storage in KC
391 * Order: KL, KR, KA, KB
392 */
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200393 mbedtls_platform_memset( KC, 0, sizeof(KC) );
Paul Bakker38119b12009-01-10 23:31:23 +0000394
395 /* Store KL, KR */
Paul Bakker66d5d072014-06-17 16:39:18 +0200396 for( i = 0; i < 8; i++ )
397 GET_UINT32_BE( KC[i], t, i * 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000398
399 /* Generate KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200400 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000401 KC[8 + i] = KC[i] ^ KC[4 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000402
Paul Bakker66d5d072014-06-17 16:39:18 +0200403 camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
404 camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000405
Paul Bakker66d5d072014-06-17 16:39:18 +0200406 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000407 KC[8 + i] ^= KC[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000408
Paul Bakker66d5d072014-06-17 16:39:18 +0200409 camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
410 camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000411
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200412 if( keybits > 128 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000413 /* Generate KB */
Paul Bakker66d5d072014-06-17 16:39:18 +0200414 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000415 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000416
Paul Bakker66d5d072014-06-17 16:39:18 +0200417 camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
418 camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000419 }
420
421 /*
422 * Generating subkeys
Paul Bakker9af723c2014-05-01 13:03:14 +0200423 */
Paul Bakker38119b12009-01-10 23:31:23 +0000424
425 /* Manipulating KL */
Paul Bakker66d5d072014-06-17 16:39:18 +0200426 SHIFT_AND_PLACE( idx, 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000427
428 /* Manipulating KR */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200429 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200430 SHIFT_AND_PLACE( idx, 1 );
Paul Bakker38119b12009-01-10 23:31:23 +0000431 }
432
433 /* Manipulating KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200434 SHIFT_AND_PLACE( idx, 2 );
Paul Bakker38119b12009-01-10 23:31:23 +0000435
436 /* Manipulating KB */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200437 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200438 SHIFT_AND_PLACE( idx, 3 );
Paul Bakker38119b12009-01-10 23:31:23 +0000439 }
440
441 /* Do transpositions */
Paul Bakker66d5d072014-06-17 16:39:18 +0200442 for( i = 0; i < 20; i++ ) {
443 if( transposes[idx][i] != -1 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000444 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
445 }
Paul Bakker38119b12009-01-10 23:31:23 +0000446 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000447
448 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000449}
450
451/*
452 * Camellia key schedule (decryption)
453 */
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000454int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx,
455 const unsigned char *key,
456 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000457{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200458 int idx, ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000459 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200460 mbedtls_camellia_context cty;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000461 uint32_t *RK;
462 uint32_t *SK;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000463 CAMELLIA_VALIDATE_RET( ctx != NULL );
464 CAMELLIA_VALIDATE_RET( key != NULL );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200465
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200466 mbedtls_camellia_init( &cty );
Paul Bakker38119b12009-01-10 23:31:23 +0000467
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200468 /* Also checks keybits */
469 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200470 goto exit;
Paul Bakker38119b12009-01-10 23:31:23 +0000471
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200472 ctx->nr = cty.nr;
473 idx = ( ctx->nr == 4 );
474
475 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000476 SK = cty.rk + 24 * 2 + 8 * idx * 2;
477
478 *RK++ = *SK++;
479 *RK++ = *SK++;
480 *RK++ = *SK++;
481 *RK++ = *SK++;
482
Paul Bakker66d5d072014-06-17 16:39:18 +0200483 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
Paul Bakker38119b12009-01-10 23:31:23 +0000484 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000485 *RK++ = *SK++;
486 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000487 }
488
489 SK -= 2;
490
491 *RK++ = *SK++;
492 *RK++ = *SK++;
493 *RK++ = *SK++;
494 *RK++ = *SK++;
495
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200496exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200497 mbedtls_camellia_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000498
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200499 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000500}
501
502/*
503 * Camellia-ECB block encryption/decryption
504 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200505int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000506 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000507 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000508 unsigned char output[16] )
509{
Paul Bakker026c03b2009-03-28 17:53:03 +0000510 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000511 uint32_t *RK, X[4];
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000512 CAMELLIA_VALIDATE_RET( ctx != NULL );
513 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
514 mode == MBEDTLS_CAMELLIA_DECRYPT );
515 CAMELLIA_VALIDATE_RET( input != NULL );
516 CAMELLIA_VALIDATE_RET( output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000517
Paul Bakkerc2547b02009-07-20 20:40:52 +0000518 ( (void) mode );
519
Paul Bakker38119b12009-01-10 23:31:23 +0000520 NR = ctx->nr;
521 RK = ctx->rk;
522
Paul Bakker5c2364c2012-10-01 14:41:15 +0000523 GET_UINT32_BE( X[0], input, 0 );
524 GET_UINT32_BE( X[1], input, 4 );
525 GET_UINT32_BE( X[2], input, 8 );
526 GET_UINT32_BE( X[3], input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000527
528 X[0] ^= *RK++;
529 X[1] ^= *RK++;
530 X[2] ^= *RK++;
531 X[3] ^= *RK++;
532
Paul Bakker66d5d072014-06-17 16:39:18 +0200533 while( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000534 --NR;
Paul Bakker66d5d072014-06-17 16:39:18 +0200535 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000536 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200537 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000538 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200539 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000540 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200541 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000542 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200543 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000544 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200545 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000546 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000547
Paul Bakker66d5d072014-06-17 16:39:18 +0200548 if( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000549 FL(X[0], X[1], RK[0], RK[1]);
550 RK += 2;
551 FLInv(X[2], X[3], RK[0], RK[1]);
552 RK += 2;
553 }
Paul Bakker38119b12009-01-10 23:31:23 +0000554 }
555
556 X[2] ^= *RK++;
557 X[3] ^= *RK++;
558 X[0] ^= *RK++;
559 X[1] ^= *RK++;
560
Paul Bakker5c2364c2012-10-01 14:41:15 +0000561 PUT_UINT32_BE( X[2], output, 0 );
562 PUT_UINT32_BE( X[3], output, 4 );
563 PUT_UINT32_BE( X[0], output, 8 );
564 PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000565
566 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000567}
568
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200569#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000570/*
571 * Camellia-CBC buffer encryption/decryption
572 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200573int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
Hanno Becker70ded362018-12-19 13:42:05 +0000574 int mode,
575 size_t length,
576 unsigned char iv[16],
577 const unsigned char *input,
578 unsigned char *output )
Paul Bakker38119b12009-01-10 23:31:23 +0000579{
580 int i;
581 unsigned char temp[16];
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000582 CAMELLIA_VALIDATE_RET( ctx != NULL );
583 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
584 mode == MBEDTLS_CAMELLIA_DECRYPT );
585 CAMELLIA_VALIDATE_RET( iv != NULL );
586 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
587 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000588
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000589 if( length % 16 )
Hanno Becker938f9e92018-12-18 09:40:25 +0000590 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000591
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200592 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000593 {
594 while( length > 0 )
595 {
Teppo Järvelin91d79382019-10-02 09:09:31 +0300596 mbedtls_platform_memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200597 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000598
599 for( i = 0; i < 16; i++ )
600 output[i] = (unsigned char)( output[i] ^ iv[i] );
601
Teppo Järvelin91d79382019-10-02 09:09:31 +0300602 mbedtls_platform_memcpy( iv, temp, 16 );
Paul Bakker38119b12009-01-10 23:31:23 +0000603
604 input += 16;
605 output += 16;
606 length -= 16;
607 }
608 }
609 else
610 {
611 while( length > 0 )
612 {
613 for( i = 0; i < 16; i++ )
614 output[i] = (unsigned char)( input[i] ^ iv[i] );
615
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200616 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
Teppo Järvelin91d79382019-10-02 09:09:31 +0300617 mbedtls_platform_memcpy( iv, output, 16 );
Paul Bakker38119b12009-01-10 23:31:23 +0000618
619 input += 16;
620 output += 16;
621 length -= 16;
622 }
623 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000624
625 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000626}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200627#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000628
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200629#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000630/*
631 * Camellia-CFB128 buffer encryption/decryption
632 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200633int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000634 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000635 size_t length,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000636 size_t *iv_off,
Paul Bakker38119b12009-01-10 23:31:23 +0000637 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000638 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000639 unsigned char *output )
640{
Paul Bakker1ef71df2011-06-09 14:14:58 +0000641 int c;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000642 size_t n;
643 CAMELLIA_VALIDATE_RET( ctx != NULL );
644 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
645 mode == MBEDTLS_CAMELLIA_DECRYPT );
646 CAMELLIA_VALIDATE_RET( iv != NULL );
647 CAMELLIA_VALIDATE_RET( iv_off != NULL );
648 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
649 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
650
651 n = *iv_off;
652 if( n >= 16 )
653 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000654
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200655 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000656 {
657 while( length-- )
658 {
659 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000661
662 c = *input++;
663 *output++ = (unsigned char)( c ^ iv[n] );
664 iv[n] = (unsigned char) c;
665
Paul Bakker66d5d072014-06-17 16:39:18 +0200666 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000667 }
668 }
669 else
670 {
671 while( length-- )
672 {
673 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200674 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000675
676 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
677
Paul Bakker66d5d072014-06-17 16:39:18 +0200678 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000679 }
680 }
681
682 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000683
684 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000685}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200686#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000687
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200688#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000689/*
690 * Camellia-CTR buffer encryption/decryption
691 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200692int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000693 size_t length,
694 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000695 unsigned char nonce_counter[16],
696 unsigned char stream_block[16],
697 const unsigned char *input,
698 unsigned char *output )
699{
Paul Bakker369e14b2012-04-18 14:16:09 +0000700 int c, i;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000701 size_t n;
702 CAMELLIA_VALIDATE_RET( ctx != NULL );
703 CAMELLIA_VALIDATE_RET( nonce_counter != NULL );
704 CAMELLIA_VALIDATE_RET( stream_block != NULL );
705 CAMELLIA_VALIDATE_RET( nc_off != NULL );
706 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
707 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
708
709 n = *nc_off;
710 if( n >= 16 )
711 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000712
713 while( length-- )
714 {
715 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200716 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200717 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000718
Paul Bakker369e14b2012-04-18 14:16:09 +0000719 for( i = 16; i > 0; i-- )
720 if( ++nonce_counter[i - 1] != 0 )
721 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000722 }
723 c = *input++;
724 *output++ = (unsigned char)( c ^ stream_block[n] );
725
Paul Bakker66d5d072014-06-17 16:39:18 +0200726 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000727 }
728
729 *nc_off = n;
730
731 return( 0 );
732}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200733#endif /* MBEDTLS_CIPHER_MODE_CTR */
734#endif /* !MBEDTLS_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000735
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200736#if defined(MBEDTLS_SELF_TEST)
Paul Bakker38119b12009-01-10 23:31:23 +0000737
Paul Bakker38119b12009-01-10 23:31:23 +0000738/*
739 * Camellia test vectors from:
740 *
741 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
742 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
743 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000744 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000745 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000746#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000747
748static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
749{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000750 {
751 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
752 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200753 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000754 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
755 },
756 {
757 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
758 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
759 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200760 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
762 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
763 },
764 {
765 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
766 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
767 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
768 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200769 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000770 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
771 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
772 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
773 },
Paul Bakker38119b12009-01-10 23:31:23 +0000774};
775
776static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
777{
778 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
779 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200780 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000781 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
782};
783
784static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
785{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000786 {
787 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
788 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
789 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
790 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
791 },
792 {
793 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
794 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
795 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
796 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
797 },
798 {
799 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
800 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
801 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
802 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
803 }
Paul Bakker38119b12009-01-10 23:31:23 +0000804};
805
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200806#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000807#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000808
809static const unsigned char camellia_test_cbc_key[3][32] =
810{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000811 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
812 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
813 ,
814 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
815 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
816 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
817 ,
818 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
819 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
820 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
821 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000822};
823
824static const unsigned char camellia_test_cbc_iv[16] =
825
826 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
827 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
828;
829
830static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
831{
832 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
833 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
834 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
835 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
836 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
837 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
838
839};
840
841static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
842{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000843 {
844 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
845 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
846 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
847 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
848 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
849 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
850 },
851 {
852 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
853 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
854 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
855 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
856 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
857 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
858 },
859 {
860 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
861 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
862 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
863 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
864 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
865 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
866 }
Paul Bakker38119b12009-01-10 23:31:23 +0000867};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200868#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000869
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200870#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000871/*
872 * Camellia-CTR test vectors from:
873 *
874 * http://www.faqs.org/rfcs/rfc5528.html
875 */
876
877static const unsigned char camellia_test_ctr_key[3][16] =
878{
879 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
880 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
881 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
882 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
883 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
884 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
885};
886
887static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
888{
889 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
890 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
891 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
892 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
893 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
894 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
895};
896
897static const unsigned char camellia_test_ctr_pt[3][48] =
898{
899 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
900 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
901
902 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
903 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
904 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
905 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
906
907 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
908 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
909 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
910 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
911 0x20, 0x21, 0x22, 0x23 }
912};
913
914static const unsigned char camellia_test_ctr_ct[3][48] =
915{
916 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
917 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
918 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
919 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
920 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
921 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
922 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
923 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
924 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
925 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
926 0xDF, 0x50, 0x86, 0x96 }
927};
928
929static const int camellia_test_ctr_len[3] =
930 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000932
933/*
934 * Checkup routine
935 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200936int mbedtls_camellia_self_test( int verbose )
Paul Bakker38119b12009-01-10 23:31:23 +0000937{
Paul Bakker026c03b2009-03-28 17:53:03 +0000938 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000939 unsigned char key[32];
940 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000941 unsigned char src[16];
942 unsigned char dst[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200943#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000944 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200945#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200946#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000947 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000948 unsigned char nonce_counter[16];
949 unsigned char stream_block[16];
950#endif
951
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200952 mbedtls_camellia_context ctx;
Paul Bakker38119b12009-01-10 23:31:23 +0000953
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200954 mbedtls_platform_memset( key, 0, 32 );
Paul Bakker38119b12009-01-10 23:31:23 +0000955
Paul Bakker66d5d072014-06-17 16:39:18 +0200956 for( j = 0; j < 6; j++ ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000957 u = j >> 1;
958 v = j & 1;
Paul Bakker38119b12009-01-10 23:31:23 +0000959
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000960 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200961 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
962 (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
Paul Bakker38119b12009-01-10 23:31:23 +0000963
Paul Bakker66d5d072014-06-17 16:39:18 +0200964 for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
Teppo Järvelinb5c46712019-10-04 13:35:55 +0300965 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000966
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200967 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
968 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
Teppo Järvelinb5c46712019-10-04 13:35:55 +0300969 memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
970 memcpy( dst, camellia_test_ecb_plain[i], 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200971 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
972 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Teppo Järvelinb5c46712019-10-04 13:35:55 +0300973 memcpy( src, camellia_test_ecb_plain[i], 16 );
974 memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000975 }
Paul Bakker38119b12009-01-10 23:31:23 +0000976
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200977 mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
Paul Bakker38119b12009-01-10 23:31:23 +0000978
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000979 if( memcmp( buf, dst, 16 ) != 0 )
980 {
981 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200982 mbedtls_printf( "failed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000983
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000984 return( 1 );
985 }
986 }
Paul Bakker38119b12009-01-10 23:31:23 +0000987
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000988 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 }
991
992 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000994
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200995#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000996 /*
997 * CBC mode
998 */
999 for( j = 0; j < 6; j++ )
1000 {
1001 u = j >> 1;
1002 v = j & 1;
1003
1004 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001005 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
1006 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +00001007
Teppo Järvelinb5c46712019-10-04 13:35:55 +03001008 memcpy( src, camellia_test_cbc_iv, 16 );
1009 memcpy( dst, camellia_test_cbc_iv, 16 );
1010 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +00001011
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001012 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Janos Follath98e28a72016-05-31 14:03:54 +01001013 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
1014 } else {
1015 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001016 }
Paul Bakker38119b12009-01-10 23:31:23 +00001017
Janos Follath98e28a72016-05-31 14:03:54 +01001018 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +00001019
Janos Follath98e28a72016-05-31 14:03:54 +01001020 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Teppo Järvelinb5c46712019-10-04 13:35:55 +03001021 memcpy( iv , src, 16 );
1022 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
1023 memcpy( dst, camellia_test_cbc_plain[i], 16 );
Janos Follath98e28a72016-05-31 14:03:54 +01001024 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
Teppo Järvelinb5c46712019-10-04 13:35:55 +03001025 memcpy( iv , dst, 16 );
1026 memcpy( src, camellia_test_cbc_plain[i], 16 );
1027 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
Janos Follath98e28a72016-05-31 14:03:54 +01001028 }
Paul Bakker38119b12009-01-10 23:31:23 +00001029
Janos Follath98e28a72016-05-31 14:03:54 +01001030 mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
1031
1032 if( memcmp( buf, dst, 16 ) != 0 )
1033 {
1034 if( verbose != 0 )
1035 mbedtls_printf( "failed\n" );
1036
1037 return( 1 );
1038 }
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001039 }
Paul Bakker38119b12009-01-10 23:31:23 +00001040
1041 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001042 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001043 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001044#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +00001045
1046 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001047 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001048
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001049#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001050 /*
1051 * CTR mode
1052 */
1053 for( i = 0; i < 6; i++ )
1054 {
1055 u = i >> 1;
1056 v = i & 1;
1057
1058 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001059 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
1060 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001061
Teppo Järvelinb5c46712019-10-04 13:35:55 +03001062 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1063 memcpy( key, camellia_test_ctr_key[u], 16 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001064
1065 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001066 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001067
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001068 if( v == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001069 {
1070 len = camellia_test_ctr_len[u];
Teppo Järvelinb5c46712019-10-04 13:35:55 +03001071 memcpy( buf, camellia_test_ctr_ct[u], len );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001072
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001073 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001074 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001075
1076 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1077 {
1078 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001079 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001080
1081 return( 1 );
1082 }
1083 }
1084 else
1085 {
1086 len = camellia_test_ctr_len[u];
Teppo Järvelinb5c46712019-10-04 13:35:55 +03001087 memcpy( buf, camellia_test_ctr_pt[u], len );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001089 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001090 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001091
1092 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1093 {
1094 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001095 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001096
1097 return( 1 );
1098 }
1099 }
1100
1101 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001102 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001103 }
1104
1105 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106 mbedtls_printf( "\n" );
1107#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001108
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001109 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +00001110}
1111
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001112#endif /* MBEDTLS_SELF_TEST */
Paul Bakker38119b12009-01-10 23:31:23 +00001113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001114#endif /* MBEDTLS_CAMELLIA_C */