blob: 7fb8dc76e23a1fb0de8cc5f5f3af217f76d7c643 [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é-Gonnard2cf5a7c2015-04-08 12:49:31 +0200331 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 Beckerb4b7fb72018-12-12 18:02:06 +0000356 CAMELLIA_VALIDATE_RET( ctx != NULL );
357 CAMELLIA_VALIDATE_RET( key != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000358
359 RK = ctx->rk;
360
Paul Bakker66d5d072014-06-17 16:39:18 +0200361 memset( t, 0, 64 );
362 memset( RK, 0, sizeof(ctx->rk) );
Paul Bakker38119b12009-01-10 23:31:23 +0000363
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200364 switch( keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000365 {
366 case 128: ctx->nr = 3; idx = 0; break;
367 case 192:
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000368 case 256: ctx->nr = 4; idx = 1; break;
Hanno Becker4c029d02018-12-17 13:20:05 +0000369 default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000370 }
371
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200372 for( i = 0; i < keybits / 8; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000373 t[i] = key[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000374
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200375 if( keybits == 192 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200376 for( i = 0; i < 8; i++ )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000377 t[24 + i] = ~t[16 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000378 }
379
Paul Bakker38119b12009-01-10 23:31:23 +0000380 /*
381 * Prepare SIGMA values
382 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200383 for( i = 0; i < 6; i++ ) {
384 GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 );
385 GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000386 }
387
388 /*
389 * Key storage in KC
390 * Order: KL, KR, KA, KB
391 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200392 memset( KC, 0, sizeof(KC) );
Paul Bakker38119b12009-01-10 23:31:23 +0000393
394 /* Store KL, KR */
Paul Bakker66d5d072014-06-17 16:39:18 +0200395 for( i = 0; i < 8; i++ )
396 GET_UINT32_BE( KC[i], t, i * 4 );
Paul Bakker38119b12009-01-10 23:31:23 +0000397
398 /* Generate KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200399 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000400 KC[8 + i] = KC[i] ^ KC[4 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000401
Paul Bakker66d5d072014-06-17 16:39:18 +0200402 camellia_feistel( KC + 8, SIGMA[0], KC + 10 );
403 camellia_feistel( KC + 10, SIGMA[1], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000404
Paul Bakker66d5d072014-06-17 16:39:18 +0200405 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000406 KC[8 + i] ^= KC[i];
Paul Bakker38119b12009-01-10 23:31:23 +0000407
Paul Bakker66d5d072014-06-17 16:39:18 +0200408 camellia_feistel( KC + 8, SIGMA[2], KC + 10 );
409 camellia_feistel( KC + 10, SIGMA[3], KC + 8 );
Paul Bakker38119b12009-01-10 23:31:23 +0000410
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200411 if( keybits > 128 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000412 /* Generate KB */
Paul Bakker66d5d072014-06-17 16:39:18 +0200413 for( i = 0; i < 4; ++i )
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000414 KC[12 + i] = KC[4 + i] ^ KC[8 + i];
Paul Bakker38119b12009-01-10 23:31:23 +0000415
Paul Bakker66d5d072014-06-17 16:39:18 +0200416 camellia_feistel( KC + 12, SIGMA[4], KC + 14 );
417 camellia_feistel( KC + 14, SIGMA[5], KC + 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000418 }
419
420 /*
421 * Generating subkeys
Paul Bakker9af723c2014-05-01 13:03:14 +0200422 */
Paul Bakker38119b12009-01-10 23:31:23 +0000423
424 /* Manipulating KL */
Paul Bakker66d5d072014-06-17 16:39:18 +0200425 SHIFT_AND_PLACE( idx, 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000426
427 /* Manipulating KR */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200428 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200429 SHIFT_AND_PLACE( idx, 1 );
Paul Bakker38119b12009-01-10 23:31:23 +0000430 }
431
432 /* Manipulating KA */
Paul Bakker66d5d072014-06-17 16:39:18 +0200433 SHIFT_AND_PLACE( idx, 2 );
Paul Bakker38119b12009-01-10 23:31:23 +0000434
435 /* Manipulating KB */
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200436 if( keybits > 128 ) {
Paul Bakker66d5d072014-06-17 16:39:18 +0200437 SHIFT_AND_PLACE( idx, 3 );
Paul Bakker38119b12009-01-10 23:31:23 +0000438 }
439
440 /* Do transpositions */
Paul Bakker66d5d072014-06-17 16:39:18 +0200441 for( i = 0; i < 20; i++ ) {
442 if( transposes[idx][i] != -1 ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000443 RK[32 + 12 * idx + i] = RK[transposes[idx][i]];
444 }
Paul Bakker38119b12009-01-10 23:31:23 +0000445 }
Paul Bakker2b222c82009-07-27 21:03:45 +0000446
447 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000448}
449
450/*
451 * Camellia key schedule (decryption)
452 */
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000453int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx,
454 const unsigned char *key,
455 unsigned int keybits )
Paul Bakker38119b12009-01-10 23:31:23 +0000456{
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200457 int idx, ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000458 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200459 mbedtls_camellia_context cty;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000460 uint32_t *RK;
461 uint32_t *SK;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000462 CAMELLIA_VALIDATE_RET( ctx != NULL );
463 CAMELLIA_VALIDATE_RET( key != NULL );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200464
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200465 mbedtls_camellia_init( &cty );
Paul Bakker38119b12009-01-10 23:31:23 +0000466
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200467 /* Also checks keybits */
468 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200469 goto exit;
Paul Bakker38119b12009-01-10 23:31:23 +0000470
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200471 ctx->nr = cty.nr;
472 idx = ( ctx->nr == 4 );
473
474 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000475 SK = cty.rk + 24 * 2 + 8 * idx * 2;
476
477 *RK++ = *SK++;
478 *RK++ = *SK++;
479 *RK++ = *SK++;
480 *RK++ = *SK++;
481
Paul Bakker66d5d072014-06-17 16:39:18 +0200482 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
Paul Bakker38119b12009-01-10 23:31:23 +0000483 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000484 *RK++ = *SK++;
485 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000486 }
487
488 SK -= 2;
489
490 *RK++ = *SK++;
491 *RK++ = *SK++;
492 *RK++ = *SK++;
493 *RK++ = *SK++;
494
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200495exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200496 mbedtls_camellia_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000497
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200498 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000499}
500
501/*
502 * Camellia-ECB block encryption/decryption
503 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200504int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000505 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000506 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000507 unsigned char output[16] )
508{
Paul Bakker026c03b2009-03-28 17:53:03 +0000509 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000510 uint32_t *RK, X[4];
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000511 CAMELLIA_VALIDATE_RET( ctx != NULL );
512 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
513 mode == MBEDTLS_CAMELLIA_DECRYPT );
514 CAMELLIA_VALIDATE_RET( input != NULL );
515 CAMELLIA_VALIDATE_RET( output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000516
Paul Bakkerc2547b02009-07-20 20:40:52 +0000517 ( (void) mode );
518
Paul Bakker38119b12009-01-10 23:31:23 +0000519 NR = ctx->nr;
520 RK = ctx->rk;
521
Paul Bakker5c2364c2012-10-01 14:41:15 +0000522 GET_UINT32_BE( X[0], input, 0 );
523 GET_UINT32_BE( X[1], input, 4 );
524 GET_UINT32_BE( X[2], input, 8 );
525 GET_UINT32_BE( X[3], input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000526
527 X[0] ^= *RK++;
528 X[1] ^= *RK++;
529 X[2] ^= *RK++;
530 X[3] ^= *RK++;
531
Paul Bakker66d5d072014-06-17 16:39:18 +0200532 while( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000533 --NR;
Paul Bakker66d5d072014-06-17 16:39:18 +0200534 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000535 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200536 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000537 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200538 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000539 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200540 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000541 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200542 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000543 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200544 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000545 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000546
Paul Bakker66d5d072014-06-17 16:39:18 +0200547 if( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000548 FL(X[0], X[1], RK[0], RK[1]);
549 RK += 2;
550 FLInv(X[2], X[3], RK[0], RK[1]);
551 RK += 2;
552 }
Paul Bakker38119b12009-01-10 23:31:23 +0000553 }
554
555 X[2] ^= *RK++;
556 X[3] ^= *RK++;
557 X[0] ^= *RK++;
558 X[1] ^= *RK++;
559
Paul Bakker5c2364c2012-10-01 14:41:15 +0000560 PUT_UINT32_BE( X[2], output, 0 );
561 PUT_UINT32_BE( X[3], output, 4 );
562 PUT_UINT32_BE( X[0], output, 8 );
563 PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000564
565 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000566}
567
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000569/*
570 * Camellia-CBC buffer encryption/decryption
571 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200572int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000573 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000574 size_t length,
Paul Bakker38119b12009-01-10 23:31:23 +0000575 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000576 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000577 unsigned char *output )
578{
579 int i;
580 unsigned char temp[16];
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000581 CAMELLIA_VALIDATE_RET( ctx != NULL );
582 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
583 mode == MBEDTLS_CAMELLIA_DECRYPT );
584 CAMELLIA_VALIDATE_RET( iv != NULL );
585 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
586 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000587
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000588 if( length % 16 )
Hanno Becker938f9e92018-12-18 09:40:25 +0000589 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000590
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200591 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000592 {
593 while( length > 0 )
594 {
595 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200596 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000597
598 for( i = 0; i < 16; i++ )
599 output[i] = (unsigned char)( output[i] ^ iv[i] );
600
601 memcpy( iv, temp, 16 );
602
603 input += 16;
604 output += 16;
605 length -= 16;
606 }
607 }
608 else
609 {
610 while( length > 0 )
611 {
612 for( i = 0; i < 16; i++ )
613 output[i] = (unsigned char)( input[i] ^ iv[i] );
614
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200615 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000616 memcpy( iv, output, 16 );
617
618 input += 16;
619 output += 16;
620 length -= 16;
621 }
622 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000623
624 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000625}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200626#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000629/*
630 * Camellia-CFB128 buffer encryption/decryption
631 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200632int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000633 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000634 size_t length,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000635 size_t *iv_off,
Paul Bakker38119b12009-01-10 23:31:23 +0000636 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000637 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000638 unsigned char *output )
639{
Paul Bakker1ef71df2011-06-09 14:14:58 +0000640 int c;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000641 size_t n;
642 CAMELLIA_VALIDATE_RET( ctx != NULL );
643 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
644 mode == MBEDTLS_CAMELLIA_DECRYPT );
645 CAMELLIA_VALIDATE_RET( iv != NULL );
646 CAMELLIA_VALIDATE_RET( iv_off != NULL );
647 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
648 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
649
650 n = *iv_off;
651 if( n >= 16 )
652 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000653
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200654 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000655 {
656 while( length-- )
657 {
658 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200659 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000660
661 c = *input++;
662 *output++ = (unsigned char)( c ^ iv[n] );
663 iv[n] = (unsigned char) c;
664
Paul Bakker66d5d072014-06-17 16:39:18 +0200665 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000666 }
667 }
668 else
669 {
670 while( length-- )
671 {
672 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200673 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000674
675 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
676
Paul Bakker66d5d072014-06-17 16:39:18 +0200677 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000678 }
679 }
680
681 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000682
683 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000684}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200685#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000686
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200687#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000688/*
689 * Camellia-CTR buffer encryption/decryption
690 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200691int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000692 size_t length,
693 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000694 unsigned char nonce_counter[16],
695 unsigned char stream_block[16],
696 const unsigned char *input,
697 unsigned char *output )
698{
Paul Bakker369e14b2012-04-18 14:16:09 +0000699 int c, i;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000700 size_t n;
701 CAMELLIA_VALIDATE_RET( ctx != NULL );
702 CAMELLIA_VALIDATE_RET( nonce_counter != NULL );
703 CAMELLIA_VALIDATE_RET( stream_block != NULL );
704 CAMELLIA_VALIDATE_RET( nc_off != NULL );
705 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
706 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
707
708 n = *nc_off;
709 if( n >= 16 )
710 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000711
712 while( length-- )
713 {
714 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200716 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000717
Paul Bakker369e14b2012-04-18 14:16:09 +0000718 for( i = 16; i > 0; i-- )
719 if( ++nonce_counter[i - 1] != 0 )
720 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000721 }
722 c = *input++;
723 *output++ = (unsigned char)( c ^ stream_block[n] );
724
Paul Bakker66d5d072014-06-17 16:39:18 +0200725 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000726 }
727
728 *nc_off = n;
729
730 return( 0 );
731}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200732#endif /* MBEDTLS_CIPHER_MODE_CTR */
733#endif /* !MBEDTLS_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000734
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200735#if defined(MBEDTLS_SELF_TEST)
Paul Bakker38119b12009-01-10 23:31:23 +0000736
Paul Bakker38119b12009-01-10 23:31:23 +0000737/*
738 * Camellia test vectors from:
739 *
740 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
741 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
742 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000743 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000744 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000745#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000746
747static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
748{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000749 {
750 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
751 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200752 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000753 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
754 },
755 {
756 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
757 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
758 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200759 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000760 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
762 },
763 {
764 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
765 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
766 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
767 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200768 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
770 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
771 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
772 },
Paul Bakker38119b12009-01-10 23:31:23 +0000773};
774
775static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
776{
777 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
778 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200779 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
781};
782
783static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
784{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000785 {
786 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
787 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
788 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
789 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
790 },
791 {
792 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
793 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
794 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
795 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
796 },
797 {
798 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
799 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
800 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
801 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
802 }
Paul Bakker38119b12009-01-10 23:31:23 +0000803};
804
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200805#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000806#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000807
808static const unsigned char camellia_test_cbc_key[3][32] =
809{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000810 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
811 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
812 ,
813 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
814 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
815 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
816 ,
817 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
818 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
819 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
820 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000821};
822
823static const unsigned char camellia_test_cbc_iv[16] =
824
825 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
826 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
827;
828
829static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
830{
831 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
832 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
833 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
834 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
835 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
836 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
837
838};
839
840static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
841{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000842 {
843 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
844 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
845 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
846 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
847 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
848 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
849 },
850 {
851 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
852 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
853 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
854 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
855 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
856 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
857 },
858 {
859 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
860 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
861 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
862 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
863 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
864 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
865 }
Paul Bakker38119b12009-01-10 23:31:23 +0000866};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200867#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000868
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200869#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000870/*
871 * Camellia-CTR test vectors from:
872 *
873 * http://www.faqs.org/rfcs/rfc5528.html
874 */
875
876static const unsigned char camellia_test_ctr_key[3][16] =
877{
878 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
879 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
880 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
881 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
882 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
883 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
884};
885
886static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
887{
888 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
889 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
890 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
891 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
892 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
893 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
894};
895
896static const unsigned char camellia_test_ctr_pt[3][48] =
897{
898 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
899 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
900
901 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
902 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
903 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
904 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
905
906 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
907 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
908 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
909 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
910 0x20, 0x21, 0x22, 0x23 }
911};
912
913static const unsigned char camellia_test_ctr_ct[3][48] =
914{
915 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
916 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
917 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
918 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
919 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
920 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
921 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
922 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
923 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
924 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
925 0xDF, 0x50, 0x86, 0x96 }
926};
927
928static const int camellia_test_ctr_len[3] =
929 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200930#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000931
932/*
933 * Checkup routine
934 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200935int mbedtls_camellia_self_test( int verbose )
Paul Bakker38119b12009-01-10 23:31:23 +0000936{
Paul Bakker026c03b2009-03-28 17:53:03 +0000937 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000938 unsigned char key[32];
939 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000940 unsigned char src[16];
941 unsigned char dst[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200942#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000943 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200944#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200945#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000946 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000947 unsigned char nonce_counter[16];
948 unsigned char stream_block[16];
949#endif
950
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200951 mbedtls_camellia_context ctx;
Paul Bakker38119b12009-01-10 23:31:23 +0000952
953 memset( key, 0, 32 );
954
Paul Bakker66d5d072014-06-17 16:39:18 +0200955 for( j = 0; j < 6; j++ ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000956 u = j >> 1;
957 v = j & 1;
Paul Bakker38119b12009-01-10 23:31:23 +0000958
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000959 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200960 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
961 (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
Paul Bakker38119b12009-01-10 23:31:23 +0000962
Paul Bakker66d5d072014-06-17 16:39:18 +0200963 for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
964 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000965
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200966 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
967 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200968 memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
969 memcpy( dst, camellia_test_ecb_plain[i], 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200970 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
971 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200972 memcpy( src, camellia_test_ecb_plain[i], 16 );
973 memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000974 }
Paul Bakker38119b12009-01-10 23:31:23 +0000975
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200976 mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
Paul Bakker38119b12009-01-10 23:31:23 +0000977
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000978 if( memcmp( buf, dst, 16 ) != 0 )
979 {
980 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200981 mbedtls_printf( "failed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000982
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000983 return( 1 );
984 }
985 }
Paul Bakker38119b12009-01-10 23:31:23 +0000986
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000987 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200988 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000989 }
990
991 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200992 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000993
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000995 /*
996 * CBC mode
997 */
998 for( j = 0; j < 6; j++ )
999 {
1000 u = j >> 1;
1001 v = j & 1;
1002
1003 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001004 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
1005 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +00001006
Janos Follath98e28a72016-05-31 14:03:54 +01001007 memcpy( src, camellia_test_cbc_iv, 16 );
1008 memcpy( dst, camellia_test_cbc_iv, 16 );
1009 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +00001010
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001011 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Janos Follath98e28a72016-05-31 14:03:54 +01001012 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
1013 } else {
1014 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001015 }
Paul Bakker38119b12009-01-10 23:31:23 +00001016
Janos Follath98e28a72016-05-31 14:03:54 +01001017 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +00001018
Janos Follath98e28a72016-05-31 14:03:54 +01001019 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
1020 memcpy( iv , src, 16 );
1021 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
1022 memcpy( dst, camellia_test_cbc_plain[i], 16 );
1023 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
1024 memcpy( iv , dst, 16 );
1025 memcpy( src, camellia_test_cbc_plain[i], 16 );
1026 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
1027 }
Paul Bakker38119b12009-01-10 23:31:23 +00001028
Janos Follath98e28a72016-05-31 14:03:54 +01001029 mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
1030
1031 if( memcmp( buf, dst, 16 ) != 0 )
1032 {
1033 if( verbose != 0 )
1034 mbedtls_printf( "failed\n" );
1035
1036 return( 1 );
1037 }
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001038 }
Paul Bakker38119b12009-01-10 23:31:23 +00001039
1040 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001042 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001043#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +00001044
1045 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001046 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001047
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001048#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001049 /*
1050 * CTR mode
1051 */
1052 for( i = 0; i < 6; i++ )
1053 {
1054 u = i >> 1;
1055 v = i & 1;
1056
1057 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001058 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
1059 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001060
1061 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1062 memcpy( key, camellia_test_ctr_key[u], 16 );
1063
1064 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001065 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001066
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001067 if( v == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001068 {
1069 len = camellia_test_ctr_len[u];
1070 memcpy( buf, camellia_test_ctr_ct[u], len );
1071
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001072 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001073 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001074
1075 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1076 {
1077 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001078 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001079
1080 return( 1 );
1081 }
1082 }
1083 else
1084 {
1085 len = camellia_test_ctr_len[u];
1086 memcpy( buf, camellia_test_ctr_pt[u], len );
1087
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001088 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001089 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001090
1091 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1092 {
1093 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001094 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001095
1096 return( 1 );
1097 }
1098 }
1099
1100 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001101 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001102 }
1103
1104 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001105 mbedtls_printf( "\n" );
1106#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001107
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001108 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +00001109}
1110
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001111#endif /* MBEDTLS_SELF_TEST */
Paul Bakker38119b12009-01-10 23:31:23 +00001112
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001113#endif /* MBEDTLS_CAMELLIA_C */