Coverage Report

Created: 2025-12-10 06:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl/crypto/camellia/camellia.c
Line
Count
Source
1
/*
2
 * Copyright 2006-2022 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
10
/* ====================================================================
11
 * Copyright 2006 NTT (Nippon Telegraph and Telephone Corporation) .
12
 * ALL RIGHTS RESERVED.
13
 *
14
 * Intellectual Property information for Camellia:
15
 *     http://info.isl.ntt.co.jp/crypt/eng/info/chiteki.html
16
 *
17
 * News Release for Announcement of Camellia open source:
18
 *     http://www.ntt.co.jp/news/news06e/0604/060413a.html
19
 *
20
 * The Camellia Code included herein is developed by
21
 * NTT (Nippon Telegraph and Telephone Corporation), and is contributed
22
 * to the OpenSSL project.
23
 */
24
25
/*
26
 * Algorithm Specification
27
 * http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
28
 */
29
30
/*
31
 * This release balances code size and performance. In particular key
32
 * schedule setup is fully unrolled, because doing so *significantly*
33
 * reduces amount of instructions per setup round and code increase is
34
 * justifiable. In block functions on the other hand only inner loops
35
 * are unrolled, as full unroll gives only nominal performance boost,
36
 * while code size grows 4 or 7 times. Also, unlike previous versions
37
 * this one "encourages" compiler to keep intermediate variables in
38
 * registers, which should give better "all round" results, in other
39
 * words reasonable performance even with not so modern compilers.
40
 */
41
42
/*
43
 * Camellia low level APIs are deprecated for public use, but still ok for
44
 * internal use.
45
 */
46
#include "internal/deprecated.h"
47
48
#include <openssl/camellia.h>
49
#include "cmll_local.h"
50
#include <string.h>
51
#include <stdlib.h>
52
53
0
#define RightRotate(x, s) (((x) >> (s)) + ((x) << (32 - s)))
54
0
#define LeftRotate(x, s) (((x) << (s)) + ((x) >> (32 - s)))
55
56
0
#define GETU32(p) (((u32)(p)[0] << 24) ^ ((u32)(p)[1] << 16) ^ ((u32)(p)[2] << 8) ^ ((u32)(p)[3]))
57
0
#define PUTU32(p, v) ((p)[0] = (u8)((v) >> 24), (p)[1] = (u8)((v) >> 16), (p)[2] = (u8)((v) >> 8), (p)[3] = (u8)(v))
58
59
/* S-box data */
60
0
#define SBOX1_1110 Camellia_SBOX[0]
61
0
#define SBOX4_4404 Camellia_SBOX[1]
62
0
#define SBOX2_0222 Camellia_SBOX[2]
63
0
#define SBOX3_3033 Camellia_SBOX[3]
64
static const u32 Camellia_SBOX[][256] = {
65
    { 0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00, 0xb3b3b300, 0x27272700,
66
        0xc0c0c000, 0xe5e5e500, 0xe4e4e400, 0x85858500, 0x57575700, 0x35353500,
67
        0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100, 0x23232300, 0xefefef00,
68
        0x6b6b6b00, 0x93939300, 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100,
69
        0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00, 0x1d1d1d00, 0x65656500,
70
        0x92929200, 0xbdbdbd00, 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,
71
        0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00, 0x3e3e3e00, 0x30303000,
72
        0xdcdcdc00, 0x5f5f5f00, 0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00,
73
        0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00, 0xd5d5d500, 0x47474700,
74
        0x5d5d5d00, 0x3d3d3d00, 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600,
75
        0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00, 0x8b8b8b00, 0x0d0d0d00,
76
        0x9a9a9a00, 0x66666600, 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,
77
        0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000, 0xf0f0f000, 0xb1b1b100,
78
        0x84848400, 0x99999900, 0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200,
79
        0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500, 0x6d6d6d00, 0xb7b7b700,
80
        0xa9a9a900, 0x31313100, 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700,
81
        0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100, 0xdedede00, 0x1b1b1b00,
82
        0x11111100, 0x1c1c1c00, 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,
83
        0x53535300, 0x18181800, 0xf2f2f200, 0x22222200, 0xfefefe00, 0x44444400,
84
        0xcfcfcf00, 0xb2b2b200, 0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100,
85
        0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800, 0x60606000, 0xfcfcfc00,
86
        0x69696900, 0x50505000, 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00,
87
        0xa1a1a100, 0x89898900, 0x62626200, 0x97979700, 0x54545400, 0x5b5b5b00,
88
        0x1e1e1e00, 0x95959500, 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,
89
        0x10101000, 0xc4c4c400, 0x00000000, 0x48484800, 0xa3a3a300, 0xf7f7f700,
90
        0x75757500, 0xdbdbdb00, 0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00,
91
        0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400, 0x87878700, 0x5c5c5c00,
92
        0x83838300, 0x02020200, 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300,
93
        0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300, 0x9d9d9d00, 0x7f7f7f00,
94
        0xbfbfbf00, 0xe2e2e200, 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,
95
        0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00, 0x81818100, 0x96969600,
96
        0x6f6f6f00, 0x4b4b4b00, 0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00,
97
        0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00, 0x9f9f9f00, 0x6e6e6e00,
98
        0xbcbcbc00, 0x8e8e8e00, 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600,
99
        0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900, 0x78787800, 0x98989800,
100
        0x06060600, 0x6a6a6a00, 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,
101
        0xd4d4d400, 0x25252500, 0xababab00, 0x42424200, 0x88888800, 0xa2a2a200,
102
        0x8d8d8d00, 0xfafafa00, 0x72727200, 0x07070700, 0xb9b9b900, 0x55555500,
103
        0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00, 0x36363600, 0x49494900,
104
        0x2a2a2a00, 0x68686800, 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400,
105
        0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00, 0xbbbbbb00, 0xc9c9c900,
106
        0x43434300, 0xc1c1c100, 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,
107
        0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00 },
108
    { 0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0, 0xe4e400e4, 0x57570057,
109
        0xeaea00ea, 0xaeae00ae, 0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5,
110
        0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092, 0x86860086, 0xafaf00af,
111
        0x7c7c007c, 0x1f1f001f, 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b,
112
        0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d, 0xd9d900d9, 0x5a5a005a,
113
        0x51510051, 0x6c6c006c, 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,
114
        0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084, 0xdfdf00df, 0xcbcb00cb,
115
        0x34340034, 0x76760076, 0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004,
116
        0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011, 0x32320032, 0x9c9c009c,
117
        0x53530053, 0xf2f200f2, 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a,
118
        0x24240024, 0xe8e800e8, 0x60600060, 0x69690069, 0xaaaa00aa, 0xa0a000a0,
119
        0xa1a100a1, 0x62620062, 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,
120
        0x10100010, 0x00000000, 0xa3a300a3, 0x75750075, 0x8a8a008a, 0xe6e600e6,
121
        0x09090009, 0xdddd00dd, 0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090,
122
        0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf, 0x52520052, 0xd8d800d8,
123
        0xc8c800c8, 0xc6c600c6, 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063,
124
        0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc, 0x29290029, 0xf9f900f9,
125
        0x2f2f002f, 0xb4b400b4, 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,
126
        0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d, 0x72720072, 0xb9b900b9,
127
        0xf8f800f8, 0xacac00ac, 0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1,
128
        0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043, 0x15150015, 0xadad00ad,
129
        0x77770077, 0x80800080, 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5,
130
        0x85850085, 0x35350035, 0x0c0c000c, 0x41410041, 0xefef00ef, 0x93930093,
131
        0x19190019, 0x21210021, 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,
132
        0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce, 0x30300030, 0x5f5f005f,
133
        0xc5c500c5, 0x1a1a001a, 0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d,
134
        0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d, 0x0d0d000d, 0x66660066,
135
        0xcccc00cc, 0x2d2d002d, 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099,
136
        0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005, 0xb7b700b7, 0x31310031,
137
        0x17170017, 0xd7d700d7, 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,
138
        0x0f0f000f, 0x16160016, 0x18180018, 0x22220022, 0x44440044, 0xb2b200b2,
139
        0xb5b500b5, 0x91910091, 0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050,
140
        0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097, 0x5b5b005b, 0x95950095,
141
        0xffff00ff, 0xd2d200d2, 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db,
142
        0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094, 0x5c5c005c, 0x02020002,
143
        0x4a4a004a, 0x33330033, 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,
144
        0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b, 0x96960096, 0x4b4b004b,
145
        0xbebe00be, 0x2e2e002e, 0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e,
146
        0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059, 0x98980098, 0x6a6a006a,
147
        0x46460046, 0xbaba00ba, 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa,
148
        0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a, 0x49490049, 0x68680068,
149
        0x38380038, 0xa4a400a4, 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,
150
        0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e },
151
    { 0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9, 0x00676767, 0x004e4e4e,
152
        0x00818181, 0x00cbcbcb, 0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a,
153
        0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282, 0x00464646, 0x00dfdfdf,
154
        0x00d6d6d6, 0x00272727, 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242,
155
        0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c, 0x003a3a3a, 0x00cacaca,
156
        0x00252525, 0x007b7b7b, 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,
157
        0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d, 0x007c7c7c, 0x00606060,
158
        0x00b9b9b9, 0x00bebebe, 0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434,
159
        0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595, 0x00ababab, 0x008e8e8e,
160
        0x00bababa, 0x007a7a7a, 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad,
161
        0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a, 0x00171717, 0x001a1a1a,
162
        0x00353535, 0x00cccccc, 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,
163
        0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040, 0x00e1e1e1, 0x00636363,
164
        0x00090909, 0x00333333, 0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585,
165
        0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a, 0x00dadada, 0x006f6f6f,
166
        0x00535353, 0x00626262, 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf,
167
        0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2, 0x00bdbdbd, 0x00363636,
168
        0x00222222, 0x00383838, 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,
169
        0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444, 0x00fdfdfd, 0x00888888,
170
        0x009f9f9f, 0x00656565, 0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323,
171
        0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151, 0x00c0c0c0, 0x00f9f9f9,
172
        0x00d2d2d2, 0x00a0a0a0, 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa,
173
        0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f, 0x00a8a8a8, 0x00b6b6b6,
174
        0x003c3c3c, 0x002b2b2b, 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,
175
        0x00202020, 0x00898989, 0x00000000, 0x00909090, 0x00474747, 0x00efefef,
176
        0x00eaeaea, 0x00b7b7b7, 0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5,
177
        0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929, 0x000f0f0f, 0x00b8b8b8,
178
        0x00070707, 0x00040404, 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666,
179
        0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7, 0x003b3b3b, 0x00fefefe,
180
        0x007f7f7f, 0x00c5c5c5, 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,
181
        0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676, 0x00030303, 0x002d2d2d,
182
        0x00dedede, 0x00969696, 0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c,
183
        0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919, 0x003f3f3f, 0x00dcdcdc,
184
        0x00797979, 0x001d1d1d, 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d,
185
        0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2, 0x00f0f0f0, 0x00313131,
186
        0x000c0c0c, 0x00d4d4d4, 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,
187
        0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484, 0x00111111, 0x00454545,
188
        0x001b1b1b, 0x00f5f5f5, 0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa,
189
        0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414, 0x006c6c6c, 0x00929292,
190
        0x00545454, 0x00d0d0d0, 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949,
191
        0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6, 0x00777777, 0x00939393,
192
        0x00868686, 0x00838383, 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,
193
        0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d },
194
    { 0x38003838, 0x41004141, 0x16001616, 0x76007676, 0xd900d9d9, 0x93009393,
195
        0x60006060, 0xf200f2f2, 0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a,
196
        0x75007575, 0x06000606, 0x57005757, 0xa000a0a0, 0x91009191, 0xf700f7f7,
197
        0xb500b5b5, 0xc900c9c9, 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090,
198
        0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727, 0x8e008e8e, 0xb200b2b2,
199
        0x49004949, 0xde00dede, 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,
200
        0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767, 0x1f001f1f, 0x18001818,
201
        0x6e006e6e, 0xaf00afaf, 0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d,
202
        0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565, 0xea00eaea, 0xa300a3a3,
203
        0xae00aeae, 0x9e009e9e, 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b,
204
        0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6, 0xc500c5c5, 0x86008686,
205
        0x4d004d4d, 0x33003333, 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,
206
        0x3a003a3a, 0x09000909, 0x95009595, 0x10001010, 0x78007878, 0xd800d8d8,
207
        0x42004242, 0xcc00cccc, 0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161,
208
        0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282, 0xb600b6b6, 0xdb00dbdb,
209
        0xd400d4d4, 0x98009898, 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb,
210
        0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0, 0x6f006f6f, 0x8d008d8d,
211
        0x88008888, 0x0e000e0e, 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,
212
        0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111, 0x7f007f7f, 0x22002222,
213
        0xe700e7e7, 0x59005959, 0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8,
214
        0x12001212, 0x04000404, 0x74007474, 0x54005454, 0x30003030, 0x7e007e7e,
215
        0xb400b4b4, 0x28002828, 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe,
216
        0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb, 0x2a002a2a, 0xad00adad,
217
        0x0f000f0f, 0xca00caca, 0x70007070, 0xff00ffff, 0x32003232, 0x69006969,
218
        0x08000808, 0x62006262, 0x00000000, 0x24002424, 0xd100d1d1, 0xfb00fbfb,
219
        0xba00baba, 0xed00eded, 0x45004545, 0x81008181, 0x73007373, 0x6d006d6d,
220
        0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a, 0xc300c3c3, 0x2e002e2e,
221
        0xc100c1c1, 0x01000101, 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999,
222
        0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9, 0xce00cece, 0xbf00bfbf,
223
        0xdf00dfdf, 0x71007171, 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,
224
        0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d, 0xc000c0c0, 0x4b004b4b,
225
        0xb700b7b7, 0xa500a5a5, 0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717,
226
        0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646, 0xcf00cfcf, 0x37003737,
227
        0x5e005e5e, 0x47004747, 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b,
228
        0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac, 0x3c003c3c, 0x4c004c4c,
229
        0x03000303, 0x35003535, 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,
230
        0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121, 0x44004444, 0x51005151,
231
        0xc600c6c6, 0x7d007d7d, 0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa,
232
        0x7c007c7c, 0x77007777, 0x56005656, 0x05000505, 0x1b001b1b, 0xa400a4a4,
233
        0x15001515, 0x34003434, 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252,
234
        0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd, 0xdd00dddd, 0xe400e4e4,
235
        0xa100a1a1, 0xe000e0e0, 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,
236
        0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f }
237
};
238
239
/* Key generation constants */
240
static const u32 SIGMA[] = {
241
    0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2, 0xc6ef372f, 0xe94f82be,
242
    0x54ff53a5, 0xf1d36f1c, 0x10e527fa, 0xde682d1d, 0xb05688c2, 0xb3e6c1fd
243
};
244
245
/* The phi algorithm given in C.2.7 of the Camellia spec document. */
246
/*
247
 * This version does not attempt to minimize amount of temporary
248
 * variables, but instead explicitly exposes algorithm's parallelism.
249
 * It is therefore most appropriate for platforms with not less than
250
 * ~16 registers. For platforms with less registers [well, x86 to be
251
 * specific] assembler version should be/is provided anyway...
252
 */
253
#define Camellia_Feistel(_s0, _s1, _s2, _s3, _key) \
254
0
    do {                                           \
255
0
        register u32 _t0, _t1, _t2, _t3;           \
256
0
                                                   \
257
0
        _t0 = _s0 ^ (_key)[0];                     \
258
0
        _t3 = SBOX4_4404[_t0 & 0xff];              \
259
0
        _t1 = _s1 ^ (_key)[1];                     \
260
0
        _t3 ^= SBOX3_3033[(_t0 >> 8) & 0xff];      \
261
0
        _t2 = SBOX1_1110[_t1 & 0xff];              \
262
0
        _t3 ^= SBOX2_0222[(_t0 >> 16) & 0xff];     \
263
0
        _t2 ^= SBOX4_4404[(_t1 >> 8) & 0xff];      \
264
0
        _t3 ^= SBOX1_1110[(_t0 >> 24)];            \
265
0
        _t2 ^= _t3;                                \
266
0
        _t3 = RightRotate(_t3, 8);                 \
267
0
        _t2 ^= SBOX3_3033[(_t1 >> 16) & 0xff];     \
268
0
        _s3 ^= _t3;                                \
269
0
        _t2 ^= SBOX2_0222[(_t1 >> 24)];            \
270
0
        _s2 ^= _t2;                                \
271
0
        _s3 ^= _t2;                                \
272
0
    } while (0)
273
274
/*
275
 * Note that n has to be less than 32. Rotations for larger amount
276
 * of bits are achieved by "rotating" order of s-elements and
277
 * adjusting n accordingly, e.g. RotLeft128(s1,s2,s3,s0,n-32).
278
 */
279
#define RotLeft128(_s0, _s1, _s2, _s3, _n)      \
280
0
    do {                                        \
281
0
        u32 _t0 = _s0 >> (32 - _n);             \
282
0
        _s0 = (_s0 << _n) | (_s1 >> (32 - _n)); \
283
0
        _s1 = (_s1 << _n) | (_s2 >> (32 - _n)); \
284
0
        _s2 = (_s2 << _n) | (_s3 >> (32 - _n)); \
285
0
        _s3 = (_s3 << _n) | _t0;                \
286
0
    } while (0)
287
288
int Camellia_Ekeygen(int keyBitLength, const u8 *rawKey, KEY_TABLE_TYPE k)
289
0
{
290
0
    register u32 s0, s1, s2, s3;
291
292
0
    k[0] = s0 = GETU32(rawKey);
293
0
    k[1] = s1 = GETU32(rawKey + 4);
294
0
    k[2] = s2 = GETU32(rawKey + 8);
295
0
    k[3] = s3 = GETU32(rawKey + 12);
296
297
0
    if (keyBitLength != 128) {
298
0
        k[8] = s0 = GETU32(rawKey + 16);
299
0
        k[9] = s1 = GETU32(rawKey + 20);
300
0
        if (keyBitLength == 192) {
301
0
            k[10] = s2 = ~s0;
302
0
            k[11] = s3 = ~s1;
303
0
        } else {
304
0
            k[10] = s2 = GETU32(rawKey + 24);
305
0
            k[11] = s3 = GETU32(rawKey + 28);
306
0
        }
307
0
        s0 ^= k[0], s1 ^= k[1], s2 ^= k[2], s3 ^= k[3];
308
0
    }
309
310
    /* Use the Feistel routine to scramble the key material */
311
0
    Camellia_Feistel(s0, s1, s2, s3, SIGMA + 0);
312
0
    Camellia_Feistel(s2, s3, s0, s1, SIGMA + 2);
313
314
0
    s0 ^= k[0], s1 ^= k[1], s2 ^= k[2], s3 ^= k[3];
315
0
    Camellia_Feistel(s0, s1, s2, s3, SIGMA + 4);
316
0
    Camellia_Feistel(s2, s3, s0, s1, SIGMA + 6);
317
318
    /* Fill the keyTable. Requires many block rotations. */
319
0
    if (keyBitLength == 128) {
320
0
        k[4] = s0, k[5] = s1, k[6] = s2, k[7] = s3;
321
0
        RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 15 */
322
0
        k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3;
323
0
        RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 30 */
324
0
        k[16] = s0, k[17] = s1, k[18] = s2, k[19] = s3;
325
0
        RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 45 */
326
0
        k[24] = s0, k[25] = s1;
327
0
        RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 60 */
328
0
        k[28] = s0, k[29] = s1, k[30] = s2, k[31] = s3;
329
0
        RotLeft128(s1, s2, s3, s0, 2); /* KA <<< 94 */
330
0
        k[40] = s1, k[41] = s2, k[42] = s3, k[43] = s0;
331
0
        RotLeft128(s1, s2, s3, s0, 17); /* KA <<<111 */
332
0
        k[48] = s1, k[49] = s2, k[50] = s3, k[51] = s0;
333
334
0
        s0 = k[0], s1 = k[1], s2 = k[2], s3 = k[3];
335
0
        RotLeft128(s0, s1, s2, s3, 15); /* KL <<< 15 */
336
0
        k[8] = s0, k[9] = s1, k[10] = s2, k[11] = s3;
337
0
        RotLeft128(s0, s1, s2, s3, 30); /* KL <<< 45 */
338
0
        k[20] = s0, k[21] = s1, k[22] = s2, k[23] = s3;
339
0
        RotLeft128(s0, s1, s2, s3, 15); /* KL <<< 60 */
340
0
        k[26] = s2, k[27] = s3;
341
0
        RotLeft128(s0, s1, s2, s3, 17); /* KL <<< 77 */
342
0
        k[32] = s0, k[33] = s1, k[34] = s2, k[35] = s3;
343
0
        RotLeft128(s0, s1, s2, s3, 17); /* KL <<< 94 */
344
0
        k[36] = s0, k[37] = s1, k[38] = s2, k[39] = s3;
345
0
        RotLeft128(s0, s1, s2, s3, 17); /* KL <<<111 */
346
0
        k[44] = s0, k[45] = s1, k[46] = s2, k[47] = s3;
347
348
0
        return 3; /* grand rounds */
349
0
    } else {
350
0
        k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3;
351
0
        s0 ^= k[8], s1 ^= k[9], s2 ^= k[10], s3 ^= k[11];
352
0
        Camellia_Feistel(s0, s1, s2, s3, (SIGMA + 8));
353
0
        Camellia_Feistel(s2, s3, s0, s1, (SIGMA + 10));
354
355
0
        k[4] = s0, k[5] = s1, k[6] = s2, k[7] = s3;
356
0
        RotLeft128(s0, s1, s2, s3, 30); /* KB <<< 30 */
357
0
        k[20] = s0, k[21] = s1, k[22] = s2, k[23] = s3;
358
0
        RotLeft128(s0, s1, s2, s3, 30); /* KB <<< 60 */
359
0
        k[40] = s0, k[41] = s1, k[42] = s2, k[43] = s3;
360
0
        RotLeft128(s1, s2, s3, s0, 19); /* KB <<<111 */
361
0
        k[64] = s1, k[65] = s2, k[66] = s3, k[67] = s0;
362
363
0
        s0 = k[8], s1 = k[9], s2 = k[10], s3 = k[11];
364
0
        RotLeft128(s0, s1, s2, s3, 15); /* KR <<< 15 */
365
0
        k[8] = s0, k[9] = s1, k[10] = s2, k[11] = s3;
366
0
        RotLeft128(s0, s1, s2, s3, 15); /* KR <<< 30 */
367
0
        k[16] = s0, k[17] = s1, k[18] = s2, k[19] = s3;
368
0
        RotLeft128(s0, s1, s2, s3, 30); /* KR <<< 60 */
369
0
        k[36] = s0, k[37] = s1, k[38] = s2, k[39] = s3;
370
0
        RotLeft128(s1, s2, s3, s0, 2); /* KR <<< 94 */
371
0
        k[52] = s1, k[53] = s2, k[54] = s3, k[55] = s0;
372
373
0
        s0 = k[12], s1 = k[13], s2 = k[14], s3 = k[15];
374
0
        RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 15 */
375
0
        k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3;
376
0
        RotLeft128(s0, s1, s2, s3, 30); /* KA <<< 45 */
377
0
        k[28] = s0, k[29] = s1, k[30] = s2, k[31] = s3;
378
        /* KA <<< 77 */
379
0
        k[48] = s1, k[49] = s2, k[50] = s3, k[51] = s0;
380
0
        RotLeft128(s1, s2, s3, s0, 17); /* KA <<< 94 */
381
0
        k[56] = s1, k[57] = s2, k[58] = s3, k[59] = s0;
382
383
0
        s0 = k[0], s1 = k[1], s2 = k[2], s3 = k[3];
384
0
        RotLeft128(s1, s2, s3, s0, 13); /* KL <<< 45 */
385
0
        k[24] = s1, k[25] = s2, k[26] = s3, k[27] = s0;
386
0
        RotLeft128(s1, s2, s3, s0, 15); /* KL <<< 60 */
387
0
        k[32] = s1, k[33] = s2, k[34] = s3, k[35] = s0;
388
0
        RotLeft128(s1, s2, s3, s0, 17); /* KL <<< 77 */
389
0
        k[44] = s1, k[45] = s2, k[46] = s3, k[47] = s0;
390
0
        RotLeft128(s2, s3, s0, s1, 2); /* KL <<<111 */
391
0
        k[60] = s2, k[61] = s3, k[62] = s0, k[63] = s1;
392
393
0
        return 4; /* grand rounds */
394
0
    }
395
    /*
396
     * It is possible to perform certain precalculations, which
397
     * would spare few cycles in block procedure. It's not done,
398
     * because it upsets the performance balance between key
399
     * setup and block procedures, negatively affecting overall
400
     * throughput in applications operating on short messages
401
     * and volatile keys.
402
     */
403
0
}
404
405
void Camellia_EncryptBlock_Rounds(int grandRounds, const u8 plaintext[],
406
    const KEY_TABLE_TYPE keyTable,
407
    u8 ciphertext[])
408
0
{
409
0
    register u32 s0, s1, s2, s3;
410
0
    const u32 *k = keyTable, *kend = keyTable + grandRounds * 16;
411
412
0
    s0 = GETU32(plaintext) ^ k[0];
413
0
    s1 = GETU32(plaintext + 4) ^ k[1];
414
0
    s2 = GETU32(plaintext + 8) ^ k[2];
415
0
    s3 = GETU32(plaintext + 12) ^ k[3];
416
0
    k += 4;
417
418
0
    while (1) {
419
        /* Camellia makes 6 Feistel rounds */
420
0
        Camellia_Feistel(s0, s1, s2, s3, k + 0);
421
0
        Camellia_Feistel(s2, s3, s0, s1, k + 2);
422
0
        Camellia_Feistel(s0, s1, s2, s3, k + 4);
423
0
        Camellia_Feistel(s2, s3, s0, s1, k + 6);
424
0
        Camellia_Feistel(s0, s1, s2, s3, k + 8);
425
0
        Camellia_Feistel(s2, s3, s0, s1, k + 10);
426
0
        k += 12;
427
428
0
        if (k == kend)
429
0
            break;
430
431
        /*
432
         * This is the same function as the diffusion function D of the
433
         * accompanying documentation. See section 3.2 for properties of the
434
         * FLlayer function.
435
         */
436
0
        s1 ^= LeftRotate(s0 & k[0], 1);
437
0
        s2 ^= s3 | k[3];
438
0
        s0 ^= s1 | k[1];
439
0
        s3 ^= LeftRotate(s2 & k[2], 1);
440
0
        k += 4;
441
0
    }
442
443
0
    s2 ^= k[0], s3 ^= k[1], s0 ^= k[2], s1 ^= k[3];
444
445
0
    PUTU32(ciphertext, s2);
446
0
    PUTU32(ciphertext + 4, s3);
447
0
    PUTU32(ciphertext + 8, s0);
448
0
    PUTU32(ciphertext + 12, s1);
449
0
}
450
451
void Camellia_EncryptBlock(int keyBitLength, const u8 plaintext[],
452
    const KEY_TABLE_TYPE keyTable, u8 ciphertext[])
453
0
{
454
0
    Camellia_EncryptBlock_Rounds(keyBitLength == 128 ? 3 : 4,
455
0
        plaintext, keyTable, ciphertext);
456
0
}
457
458
void Camellia_DecryptBlock_Rounds(int grandRounds, const u8 ciphertext[],
459
    const KEY_TABLE_TYPE keyTable,
460
    u8 plaintext[])
461
0
{
462
0
    u32 s0, s1, s2, s3;
463
0
    const u32 *k = keyTable + grandRounds * 16, *kend = keyTable + 4;
464
465
0
    s0 = GETU32(ciphertext) ^ k[0];
466
0
    s1 = GETU32(ciphertext + 4) ^ k[1];
467
0
    s2 = GETU32(ciphertext + 8) ^ k[2];
468
0
    s3 = GETU32(ciphertext + 12) ^ k[3];
469
470
0
    while (1) {
471
        /* Camellia makes 6 Feistel rounds */
472
0
        k -= 12;
473
0
        Camellia_Feistel(s0, s1, s2, s3, k + 10);
474
0
        Camellia_Feistel(s2, s3, s0, s1, k + 8);
475
0
        Camellia_Feistel(s0, s1, s2, s3, k + 6);
476
0
        Camellia_Feistel(s2, s3, s0, s1, k + 4);
477
0
        Camellia_Feistel(s0, s1, s2, s3, k + 2);
478
0
        Camellia_Feistel(s2, s3, s0, s1, k + 0);
479
480
0
        if (k == kend)
481
0
            break;
482
483
        /*
484
         * This is the same function as the diffusion function D of the
485
         * accompanying documentation. See section 3.2 for properties of the
486
         * FLlayer function.
487
         */
488
0
        k -= 4;
489
0
        s1 ^= LeftRotate(s0 & k[2], 1);
490
0
        s2 ^= s3 | k[1];
491
0
        s0 ^= s1 | k[3];
492
0
        s3 ^= LeftRotate(s2 & k[0], 1);
493
0
    }
494
495
0
    k -= 4;
496
0
    s2 ^= k[0], s3 ^= k[1], s0 ^= k[2], s1 ^= k[3];
497
498
0
    PUTU32(plaintext, s2);
499
0
    PUTU32(plaintext + 4, s3);
500
0
    PUTU32(plaintext + 8, s0);
501
0
    PUTU32(plaintext + 12, s1);
502
0
}
503
504
void Camellia_DecryptBlock(int keyBitLength, const u8 ciphertext[],
505
    const KEY_TABLE_TYPE keyTable, u8 plaintext[])
506
0
{
507
0
    Camellia_DecryptBlock_Rounds(keyBitLength == 128 ? 3 : 4,
508
0
        ciphertext, keyTable, plaintext);
509
0
}