Coverage Report

Created: 2025-07-18 07:25

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