blob: 9ac394f9fa2ec5137d497e90ad0e81d120f74f06 [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 );
358 CAMELLIA_VALIDATE_RET( keybits == 128 || keybits == 192 || keybits == 256 );
Paul Bakker38119b12009-01-10 23:31:23 +0000359
360 RK = ctx->rk;
361
Paul Bakker66d5d072014-06-17 16:39:18 +0200362 memset( t, 0, 64 );
363 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 */
Paul Bakker66d5d072014-06-17 16:39:18 +0200393 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 );
465 CAMELLIA_VALIDATE_RET( keybits == 128 || keybits == 192 || keybits == 256 );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200467 mbedtls_camellia_init( &cty );
Paul Bakker38119b12009-01-10 23:31:23 +0000468
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200469 /* Also checks keybits */
470 if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200471 goto exit;
Paul Bakker38119b12009-01-10 23:31:23 +0000472
Manuel Pégourié-Gonnard3ac6a2b2014-05-28 22:04:25 +0200473 ctx->nr = cty.nr;
474 idx = ( ctx->nr == 4 );
475
476 RK = ctx->rk;
Paul Bakker38119b12009-01-10 23:31:23 +0000477 SK = cty.rk + 24 * 2 + 8 * idx * 2;
478
479 *RK++ = *SK++;
480 *RK++ = *SK++;
481 *RK++ = *SK++;
482 *RK++ = *SK++;
483
Paul Bakker66d5d072014-06-17 16:39:18 +0200484 for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )
Paul Bakker38119b12009-01-10 23:31:23 +0000485 {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000486 *RK++ = *SK++;
487 *RK++ = *SK++;
Paul Bakker38119b12009-01-10 23:31:23 +0000488 }
489
490 SK -= 2;
491
492 *RK++ = *SK++;
493 *RK++ = *SK++;
494 *RK++ = *SK++;
495 *RK++ = *SK++;
496
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200497exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200498 mbedtls_camellia_free( &cty );
Paul Bakker2b222c82009-07-27 21:03:45 +0000499
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200500 return( ret );
Paul Bakker38119b12009-01-10 23:31:23 +0000501}
502
503/*
504 * Camellia-ECB block encryption/decryption
505 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200506int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000507 int mode,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000508 const unsigned char input[16],
Paul Bakker38119b12009-01-10 23:31:23 +0000509 unsigned char output[16] )
510{
Paul Bakker026c03b2009-03-28 17:53:03 +0000511 int NR;
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000512 uint32_t *RK, X[4];
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000513 CAMELLIA_VALIDATE_RET( ctx != NULL );
514 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
515 mode == MBEDTLS_CAMELLIA_DECRYPT );
516 CAMELLIA_VALIDATE_RET( input != NULL );
517 CAMELLIA_VALIDATE_RET( output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000518
Paul Bakkerc2547b02009-07-20 20:40:52 +0000519 ( (void) mode );
520
Paul Bakker38119b12009-01-10 23:31:23 +0000521 NR = ctx->nr;
522 RK = ctx->rk;
523
Paul Bakker5c2364c2012-10-01 14:41:15 +0000524 GET_UINT32_BE( X[0], input, 0 );
525 GET_UINT32_BE( X[1], input, 4 );
526 GET_UINT32_BE( X[2], input, 8 );
527 GET_UINT32_BE( X[3], input, 12 );
Paul Bakker38119b12009-01-10 23:31:23 +0000528
529 X[0] ^= *RK++;
530 X[1] ^= *RK++;
531 X[2] ^= *RK++;
532 X[3] ^= *RK++;
533
Paul Bakker66d5d072014-06-17 16:39:18 +0200534 while( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000535 --NR;
Paul Bakker66d5d072014-06-17 16:39:18 +0200536 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000537 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200538 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000539 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200540 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000541 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200542 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000543 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200544 camellia_feistel( X, RK, X + 2 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000545 RK += 2;
Paul Bakker66d5d072014-06-17 16:39:18 +0200546 camellia_feistel( X + 2, RK, X );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000547 RK += 2;
Paul Bakker38119b12009-01-10 23:31:23 +0000548
Paul Bakker66d5d072014-06-17 16:39:18 +0200549 if( NR ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000550 FL(X[0], X[1], RK[0], RK[1]);
551 RK += 2;
552 FLInv(X[2], X[3], RK[0], RK[1]);
553 RK += 2;
554 }
Paul Bakker38119b12009-01-10 23:31:23 +0000555 }
556
557 X[2] ^= *RK++;
558 X[3] ^= *RK++;
559 X[0] ^= *RK++;
560 X[1] ^= *RK++;
561
Paul Bakker5c2364c2012-10-01 14:41:15 +0000562 PUT_UINT32_BE( X[2], output, 0 );
563 PUT_UINT32_BE( X[3], output, 4 );
564 PUT_UINT32_BE( X[0], output, 8 );
565 PUT_UINT32_BE( X[1], output, 12 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000566
567 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000568}
569
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000571/*
572 * Camellia-CBC buffer encryption/decryption
573 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000575 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000576 size_t length,
Paul Bakker38119b12009-01-10 23:31:23 +0000577 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000578 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000579 unsigned char *output )
580{
581 int i;
582 unsigned char temp[16];
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000583 CAMELLIA_VALIDATE_RET( ctx != NULL );
584 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
585 mode == MBEDTLS_CAMELLIA_DECRYPT );
586 CAMELLIA_VALIDATE_RET( iv != NULL );
587 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
588 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
Paul Bakker38119b12009-01-10 23:31:23 +0000589
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000590 if( length % 16 )
Hanno Becker938f9e92018-12-18 09:40:25 +0000591 return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000592
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200593 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000594 {
595 while( length > 0 )
596 {
597 memcpy( temp, input, 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200598 mbedtls_camellia_crypt_ecb( ctx, mode, input, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000599
600 for( i = 0; i < 16; i++ )
601 output[i] = (unsigned char)( output[i] ^ iv[i] );
602
603 memcpy( iv, temp, 16 );
604
605 input += 16;
606 output += 16;
607 length -= 16;
608 }
609 }
610 else
611 {
612 while( length > 0 )
613 {
614 for( i = 0; i < 16; i++ )
615 output[i] = (unsigned char)( input[i] ^ iv[i] );
616
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200617 mbedtls_camellia_crypt_ecb( ctx, mode, output, output );
Paul Bakker38119b12009-01-10 23:31:23 +0000618 memcpy( iv, output, 16 );
619
620 input += 16;
621 output += 16;
622 length -= 16;
623 }
624 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000625
626 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000627}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000629
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200630#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker38119b12009-01-10 23:31:23 +0000631/*
632 * Camellia-CFB128 buffer encryption/decryption
633 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200634int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,
Paul Bakker38119b12009-01-10 23:31:23 +0000635 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000636 size_t length,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000637 size_t *iv_off,
Paul Bakker38119b12009-01-10 23:31:23 +0000638 unsigned char iv[16],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000639 const unsigned char *input,
Paul Bakker38119b12009-01-10 23:31:23 +0000640 unsigned char *output )
641{
Paul Bakker1ef71df2011-06-09 14:14:58 +0000642 int c;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000643 size_t n;
644 CAMELLIA_VALIDATE_RET( ctx != NULL );
645 CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT ||
646 mode == MBEDTLS_CAMELLIA_DECRYPT );
647 CAMELLIA_VALIDATE_RET( iv != NULL );
648 CAMELLIA_VALIDATE_RET( iv_off != NULL );
649 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
650 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
651
652 n = *iv_off;
653 if( n >= 16 )
654 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakker38119b12009-01-10 23:31:23 +0000655
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200656 if( mode == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakker38119b12009-01-10 23:31:23 +0000657 {
658 while( length-- )
659 {
660 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000662
663 c = *input++;
664 *output++ = (unsigned char)( c ^ iv[n] );
665 iv[n] = (unsigned char) c;
666
Paul Bakker66d5d072014-06-17 16:39:18 +0200667 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000668 }
669 }
670 else
671 {
672 while( length-- )
673 {
674 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200675 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );
Paul Bakker38119b12009-01-10 23:31:23 +0000676
677 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
678
Paul Bakker66d5d072014-06-17 16:39:18 +0200679 n = ( n + 1 ) & 0x0F;
Paul Bakker38119b12009-01-10 23:31:23 +0000680 }
681 }
682
683 *iv_off = n;
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000684
685 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +0000686}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200687#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000688
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200689#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000690/*
691 * Camellia-CTR buffer encryption/decryption
692 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200693int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,
Paul Bakker1ef71df2011-06-09 14:14:58 +0000694 size_t length,
695 size_t *nc_off,
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000696 unsigned char nonce_counter[16],
697 unsigned char stream_block[16],
698 const unsigned char *input,
699 unsigned char *output )
700{
Paul Bakker369e14b2012-04-18 14:16:09 +0000701 int c, i;
Hanno Beckerb4b7fb72018-12-12 18:02:06 +0000702 size_t n;
703 CAMELLIA_VALIDATE_RET( ctx != NULL );
704 CAMELLIA_VALIDATE_RET( nonce_counter != NULL );
705 CAMELLIA_VALIDATE_RET( stream_block != NULL );
706 CAMELLIA_VALIDATE_RET( nc_off != NULL );
707 CAMELLIA_VALIDATE_RET( length == 0 || input != NULL );
708 CAMELLIA_VALIDATE_RET( length == 0 || output != NULL );
709
710 n = *nc_off;
711 if( n >= 16 )
712 return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000713
714 while( length-- )
715 {
716 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200717 mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200718 stream_block );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000719
Paul Bakker369e14b2012-04-18 14:16:09 +0000720 for( i = 16; i > 0; i-- )
721 if( ++nonce_counter[i - 1] != 0 )
722 break;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000723 }
724 c = *input++;
725 *output++ = (unsigned char)( c ^ stream_block[n] );
726
Paul Bakker66d5d072014-06-17 16:39:18 +0200727 n = ( n + 1 ) & 0x0F;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000728 }
729
730 *nc_off = n;
731
732 return( 0 );
733}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200734#endif /* MBEDTLS_CIPHER_MODE_CTR */
735#endif /* !MBEDTLS_CAMELLIA_ALT */
Paul Bakker38119b12009-01-10 23:31:23 +0000736
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200737#if defined(MBEDTLS_SELF_TEST)
Paul Bakker38119b12009-01-10 23:31:23 +0000738
Paul Bakker38119b12009-01-10 23:31:23 +0000739/*
740 * Camellia test vectors from:
741 *
742 * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:
743 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt
744 * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000745 * (For each bitlength: Key 0, Nr 39)
Paul Bakker38119b12009-01-10 23:31:23 +0000746 */
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000747#define CAMELLIA_TESTS_ECB 2
Paul Bakker38119b12009-01-10 23:31:23 +0000748
749static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =
750{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000751 {
752 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
753 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200754 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000755 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
756 },
757 {
758 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
759 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
760 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200761 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000762 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
763 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
764 },
765 {
766 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
767 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
768 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
769 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
Paul Bakker9af723c2014-05-01 13:03:14 +0200770 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000771 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
772 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
773 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
774 },
Paul Bakker38119b12009-01-10 23:31:23 +0000775};
776
777static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =
778{
779 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
780 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
Paul Bakker9af723c2014-05-01 13:03:14 +0200781 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Paul Bakker38119b12009-01-10 23:31:23 +0000782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
783};
784
785static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =
786{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000787 {
788 { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,
789 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },
790 { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,
791 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }
792 },
793 {
794 { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,
795 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },
796 { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,
797 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }
798 },
799 {
800 { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,
801 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },
802 { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,
803 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }
804 }
Paul Bakker38119b12009-01-10 23:31:23 +0000805};
806
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200807#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000808#define CAMELLIA_TESTS_CBC 3
Paul Bakker38119b12009-01-10 23:31:23 +0000809
810static const unsigned char camellia_test_cbc_key[3][32] =
811{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000812 { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
813 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
814 ,
815 { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
816 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
817 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }
818 ,
819 { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
820 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
821 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
822 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }
Paul Bakker38119b12009-01-10 23:31:23 +0000823};
824
825static const unsigned char camellia_test_cbc_iv[16] =
826
827 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
828 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }
829;
830
831static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =
832{
833 { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
834 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },
835 { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
836 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },
837 { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
838 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }
839
840};
841
842static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =
843{
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000844 {
845 { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,
846 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },
847 { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,
848 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },
849 { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,
850 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }
851 },
852 {
853 { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,
854 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },
855 { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,
856 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },
857 { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,
858 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }
859 },
860 {
861 { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,
862 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },
863 { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,
864 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },
865 { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,
866 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }
867 }
Paul Bakker38119b12009-01-10 23:31:23 +0000868};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200869#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +0000870
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200871#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000872/*
873 * Camellia-CTR test vectors from:
874 *
875 * http://www.faqs.org/rfcs/rfc5528.html
876 */
877
878static const unsigned char camellia_test_ctr_key[3][16] =
879{
880 { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,
881 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },
882 { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,
883 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },
884 { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,
885 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }
886};
887
888static const unsigned char camellia_test_ctr_nonce_counter[3][16] =
889{
890 { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
891 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
892 { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
893 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },
894 { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,
895 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }
896};
897
898static const unsigned char camellia_test_ctr_pt[3][48] =
899{
900 { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
901 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },
902
903 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
904 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
905 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
906 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },
907
908 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
909 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
910 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
911 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
912 0x20, 0x21, 0x22, 0x23 }
913};
914
915static const unsigned char camellia_test_ctr_ct[3][48] =
916{
917 { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,
918 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },
919 { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,
920 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,
921 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,
922 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },
923 { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,
924 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,
925 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,
926 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,
927 0xDF, 0x50, 0x86, 0x96 }
928};
929
930static const int camellia_test_ctr_len[3] =
931 { 16, 32, 36 };
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200932#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker38119b12009-01-10 23:31:23 +0000933
934/*
935 * Checkup routine
936 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200937int mbedtls_camellia_self_test( int verbose )
Paul Bakker38119b12009-01-10 23:31:23 +0000938{
Paul Bakker026c03b2009-03-28 17:53:03 +0000939 int i, j, u, v;
Paul Bakker38119b12009-01-10 23:31:23 +0000940 unsigned char key[32];
941 unsigned char buf[64];
Paul Bakker38119b12009-01-10 23:31:23 +0000942 unsigned char src[16];
943 unsigned char dst[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200944#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000945 unsigned char iv[16];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200946#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200947#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker1ef71df2011-06-09 14:14:58 +0000948 size_t offset, len;
Paul Bakkerb6ecaf52011-04-19 14:29:23 +0000949 unsigned char nonce_counter[16];
950 unsigned char stream_block[16];
951#endif
952
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953 mbedtls_camellia_context ctx;
Paul Bakker38119b12009-01-10 23:31:23 +0000954
955 memset( key, 0, 32 );
956
Paul Bakker66d5d072014-06-17 16:39:18 +0200957 for( j = 0; j < 6; j++ ) {
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000958 u = j >> 1;
959 v = j & 1;
Paul Bakker38119b12009-01-10 23:31:23 +0000960
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000961 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200962 mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64,
963 (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc");
Paul Bakker38119b12009-01-10 23:31:23 +0000964
Paul Bakker66d5d072014-06-17 16:39:18 +0200965 for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {
966 memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +0000967
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200968 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
969 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200970 memcpy( src, camellia_test_ecb_cipher[u][i], 16 );
971 memcpy( dst, camellia_test_ecb_plain[i], 16 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200972 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
973 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakker66d5d072014-06-17 16:39:18 +0200974 memcpy( src, camellia_test_ecb_plain[i], 16 );
975 memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000976 }
Paul Bakker38119b12009-01-10 23:31:23 +0000977
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200978 mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );
Paul Bakker38119b12009-01-10 23:31:23 +0000979
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000980 if( memcmp( buf, dst, 16 ) != 0 )
981 {
982 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200983 mbedtls_printf( "failed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000984
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000985 return( 1 );
986 }
987 }
Paul Bakker38119b12009-01-10 23:31:23 +0000988
Paul Bakkerc81f6c32009-05-03 13:09:15 +0000989 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200990 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000991 }
992
993 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200994 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +0000995
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200996#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker38119b12009-01-10 23:31:23 +0000997 /*
998 * CBC mode
999 */
1000 for( j = 0; j < 6; j++ )
1001 {
1002 u = j >> 1;
1003 v = j & 1;
1004
1005 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001006 mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64,
1007 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakker38119b12009-01-10 23:31:23 +00001008
Janos Follath98e28a72016-05-31 14:03:54 +01001009 memcpy( src, camellia_test_cbc_iv, 16 );
1010 memcpy( dst, camellia_test_cbc_iv, 16 );
1011 memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );
Paul Bakker38119b12009-01-10 23:31:23 +00001012
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001013 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
Janos Follath98e28a72016-05-31 14:03:54 +01001014 mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );
1015 } else {
1016 mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001017 }
Paul Bakker38119b12009-01-10 23:31:23 +00001018
Janos Follath98e28a72016-05-31 14:03:54 +01001019 for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {
Paul Bakker38119b12009-01-10 23:31:23 +00001020
Janos Follath98e28a72016-05-31 14:03:54 +01001021 if( v == MBEDTLS_CAMELLIA_DECRYPT ) {
1022 memcpy( iv , src, 16 );
1023 memcpy( src, camellia_test_cbc_cipher[u][i], 16 );
1024 memcpy( dst, camellia_test_cbc_plain[i], 16 );
1025 } else { /* MBEDTLS_CAMELLIA_ENCRYPT */
1026 memcpy( iv , dst, 16 );
1027 memcpy( src, camellia_test_cbc_plain[i], 16 );
1028 memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );
1029 }
Paul Bakker38119b12009-01-10 23:31:23 +00001030
Janos Follath98e28a72016-05-31 14:03:54 +01001031 mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );
1032
1033 if( memcmp( buf, dst, 16 ) != 0 )
1034 {
1035 if( verbose != 0 )
1036 mbedtls_printf( "failed\n" );
1037
1038 return( 1 );
1039 }
Paul Bakkerc81f6c32009-05-03 13:09:15 +00001040 }
Paul Bakker38119b12009-01-10 23:31:23 +00001041
1042 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001043 mbedtls_printf( "passed\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001044 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001045#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker38119b12009-01-10 23:31:23 +00001046
1047 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001048 mbedtls_printf( "\n" );
Paul Bakker38119b12009-01-10 23:31:23 +00001049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001050#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001051 /*
1052 * CTR mode
1053 */
1054 for( i = 0; i < 6; i++ )
1055 {
1056 u = i >> 1;
1057 v = i & 1;
1058
1059 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001060 mbedtls_printf( " CAMELLIA-CTR-128 (%s): ",
1061 ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001062
1063 memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );
1064 memcpy( key, camellia_test_ctr_key[u], 16 );
1065
1066 offset = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001067 mbedtls_camellia_setkey_enc( &ctx, key, 128 );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001068
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001069 if( v == MBEDTLS_CAMELLIA_DECRYPT )
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001070 {
1071 len = camellia_test_ctr_len[u];
1072 memcpy( buf, camellia_test_ctr_ct[u], len );
1073
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001074 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001075 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001076
1077 if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )
1078 {
1079 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001080 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001081
1082 return( 1 );
1083 }
1084 }
1085 else
1086 {
1087 len = camellia_test_ctr_len[u];
1088 memcpy( buf, camellia_test_ctr_pt[u], len );
1089
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001090 mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001091 buf, buf );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001092
1093 if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )
1094 {
1095 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001096 mbedtls_printf( "failed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001097
1098 return( 1 );
1099 }
1100 }
1101
1102 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001103 mbedtls_printf( "passed\n" );
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001104 }
1105
1106 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001107 mbedtls_printf( "\n" );
1108#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkerb6ecaf52011-04-19 14:29:23 +00001109
Paul Bakkerd8bb8262014-06-17 14:06:49 +02001110 return( 0 );
Paul Bakker38119b12009-01-10 23:31:23 +00001111}
1112
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001113#endif /* MBEDTLS_SELF_TEST */
Paul Bakker38119b12009-01-10 23:31:23 +00001114
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001115#endif /* MBEDTLS_CAMELLIA_C */