1 /* camellia-set-encrypt-key.c
3 * Key setup for the camellia block cipher.
6 * Copyright (C) 2006,2007
7 * NTT (Nippon Telegraph and Telephone Corporation).
9 * Copyright (C) 2010 Niels Möller
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 * Algorithm Specification
28 * http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
31 /* Based on camellia.c ver 1.2.0, see
32 http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/camellia-LGPL-1.2.0.tar.gz.
41 #include "camellia-internal.h"
47 #define SIGMA1 0xA09E667F3BCC908BULL
48 #define SIGMA2 0xB67AE8584CAA73B2ULL
49 #define SIGMA3 0xC6EF372FE94F82BEULL
50 #define SIGMA4 0x54FF53A5F1D36F1CULL
51 #define SIGMA5 0x10E527FADE682D1DULL
52 #define SIGMA6 0xB05688C2B3E6C1FDULL
54 #define CAMELLIA_SP1110(INDEX) (_nettle_camellia_table.sp1110[(int)(INDEX)])
55 #define CAMELLIA_SP0222(INDEX) (_nettle_camellia_table.sp0222[(int)(INDEX)])
56 #define CAMELLIA_SP3033(INDEX) (_nettle_camellia_table.sp3033[(int)(INDEX)])
57 #define CAMELLIA_SP4404(INDEX) (_nettle_camellia_table.sp4404[(int)(INDEX)])
59 #define CAMELLIA_F(x, k, y) do { \
60 uint32_t __yl, __yr; \
61 uint64_t __i = (x) ^ (k); \
63 = CAMELLIA_SP1110( __i & 0xff) \
64 ^ CAMELLIA_SP0222((__i >> 24) & 0xff) \
65 ^ CAMELLIA_SP3033((__i >> 16) & 0xff) \
66 ^ CAMELLIA_SP4404((__i >> 8) & 0xff); \
68 = CAMELLIA_SP1110( __i >> 56) \
69 ^ CAMELLIA_SP0222((__i >> 48) & 0xff) \
70 ^ CAMELLIA_SP3033((__i >> 40) & 0xff) \
71 ^ CAMELLIA_SP4404((__i >> 32) & 0xff); \
73 __yr = ROTL32(24, __yr); \
75 (y) = ((uint64_t) __yl << 32) | __yr; \
78 #if ! HAVE_NATIVE_64_BIT
79 #define CAMELLIA_F_HALF_INV(x) do { \
83 __w = ROTL32(8, __w); \
84 (x) = ((uint64_t) __w << 32) | (__t ^ __w); \
89 camellia_set_encrypt_key(struct camellia_ctx
*ctx
,
90 unsigned length
, const uint8_t *key
)
100 k0
= READ_UINT64(key
);
101 k1
= READ_UINT64(key
+ 8);
107 * generate KL dependent subkeys
109 subkey
[0] = k0
; subkey
[1] = k1
;
111 subkey
[4] = k0
; subkey
[5] = k1
;
113 subkey
[10] = k0
; subkey
[11] = k1
;
117 subkey
[16] = k0
; subkey
[17] = k1
;
119 subkey
[18] = k0
; subkey
[19] = k1
;
121 subkey
[22] = k0
; subkey
[23] = k1
;
123 /* generate KA. D1 is k0, d2 is k1. */
124 /* FIXME: Make notation match the spec better. */
125 /* For the 128-bit case, KR = 0, the construction of KA reduces to:
132 D2 = D2 ^ F(D1, Sigma3);
133 D1 = D1 ^ F(D2, Sigma4);
134 KA = (D1 << 64) | D2;
136 k0
= subkey
[0]; w
= subkey
[1];
137 CAMELLIA_F(k0
, SIGMA1
, k1
);
139 CAMELLIA_F(w
, SIGMA2
, k0
);
140 CAMELLIA_F(k0
, SIGMA3
, w
);
142 CAMELLIA_F(k1
, SIGMA4
, w
);
145 /* generate KA dependent subkeys */
146 subkey
[2] = k0
; subkey
[3] = k1
;
148 subkey
[6] = k0
; subkey
[7] = k1
;
150 subkey
[8] = k0
; subkey
[9] = k1
;
154 subkey
[14] = k0
; subkey
[15] = k1
;
156 subkey
[20] = k0
; subkey
[21] = k1
;
158 subkey
[24] = k0
; subkey
[25] = k1
;
165 k2
= READ_UINT64(key
+ 16);
171 assert (length
== 32);
172 k3
= READ_UINT64(key
+ 24);
174 /* generate KL dependent subkeys */
175 subkey
[0] = k0
; subkey
[1] = k1
;
177 subkey
[12] = k0
; subkey
[13] = k1
;
179 subkey
[16] = k0
; subkey
[17] = k1
;
181 subkey
[22] = k0
; subkey
[23] = k1
;
183 subkey
[30] = k0
; subkey
[31] = k1
;
185 /* generate KR dependent subkeys */
187 subkey
[4] = k2
; subkey
[5] = k3
;
189 subkey
[8] = k2
; subkey
[9] = k3
;
191 subkey
[18] = k2
; subkey
[19] = k3
;
193 subkey
[26] = k2
; subkey
[27] = k3
;
197 /* The construction of KA is done as
200 D2 = (KL ^ KR) & MASK64
203 D1 = F(D2, SIGMA2) ^ (KR >> 64)
204 D2 = F(D1, SIGMA3) ^ W ^ (KR & MASK64)
205 D1 = D1 ^ F(W, SIGMA2)
206 D2 = D2 ^ F(D1, SIGMA3)
207 D1 = D1 ^ F(D2, SIGMA4)
213 CAMELLIA_F(k0
, SIGMA1
, w
);
216 CAMELLIA_F(k1
, SIGMA2
, k0
);
219 CAMELLIA_F(k0
, SIGMA3
, k1
);
222 CAMELLIA_F(k1
, SIGMA4
, w
);
227 CAMELLIA_F(k2
, SIGMA5
, w
);
229 CAMELLIA_F(k3
, SIGMA6
, w
);
232 /* generate KA dependent subkeys */
234 subkey
[6] = k0
; subkey
[7] = k1
;
236 subkey
[14] = k0
; subkey
[15] = k1
;
238 subkey
[24] = k0
; subkey
[25] = k1
;
240 subkey
[28] = k0
; subkey
[29] = k1
;
242 /* generate KB dependent subkeys */
243 subkey
[2] = k2
; subkey
[3] = k3
;
245 subkey
[10] = k2
; subkey
[11] = k3
;
247 subkey
[20] = k2
; subkey
[21] = k3
;
249 subkey
[32] = k2
; subkey
[33] = k3
;
252 /* At this point, the subkey array contains the subkeys as described
253 in the spec, 26 for short keys and 34 for large keys. */
255 /* absorb kw2 to other subkeys */
261 for (i
= 8; i
< ctx
->nkeys
; i
+= 8)
263 /* FIXME: gcc for x86_32 is smart enough to fetch the 32 low bits
264 and xor the result into the 32 high bits, but it still generates
265 worse code than for explicit 32-bit operations. */
266 kw2
^= (kw2
& ~subkey
[i
+1]) << 32;
267 dw
= (kw2
& subkey
[i
+1]) >> 32; kw2
^= ROTL32(1, dw
);
275 /* absorb kw4 to other subkeys */
276 kw4
= subkey
[ctx
->nkeys
+ 1];
278 for (i
= ctx
->nkeys
- 8; i
> 0; i
-= 8)
283 kw4
^= (kw4
& ~subkey
[i
]) << 32;
284 dw
= (kw4
& subkey
[i
]) >> 32; kw4
^= ROTL32(1, dw
);
292 /* key XOR is end of F-function */
293 ctx
->keys
[0] = subkey
[0] ^ subkey
[2];
294 ctx
->keys
[1] = subkey
[3];
296 ctx
->keys
[2] = subkey
[2] ^ subkey
[4];
297 ctx
->keys
[3] = subkey
[3] ^ subkey
[5];
298 ctx
->keys
[4] = subkey
[4] ^ subkey
[6];
299 ctx
->keys
[5] = subkey
[5] ^ subkey
[7];
301 for (i
= 8; i
< ctx
->nkeys
; i
+= 8)
303 tl
= (subkey
[i
+2] >> 32) ^ (subkey
[i
+2] & ~subkey
[i
]);
304 dw
= tl
& (subkey
[i
] >> 32);
305 tr
= subkey
[i
+2] ^ ROTL32(1, dw
);
306 ctx
->keys
[i
-2] = subkey
[i
-2] ^ ( ((uint64_t) tl
<< 32) | tr
);
308 ctx
->keys
[i
-1] = subkey
[i
];
309 ctx
->keys
[i
] = subkey
[i
+1];
311 tl
= (subkey
[i
-1] >> 32) ^ (subkey
[i
-1] & ~subkey
[i
+1]);
312 dw
= tl
& (subkey
[i
+1] >> 32);
313 tr
= subkey
[i
-1] ^ ROTL32(1, dw
);
314 ctx
->keys
[i
+1] = subkey
[i
+3] ^ ( ((uint64_t) tl
<< 32) | tr
);
316 ctx
->keys
[i
+2] = subkey
[i
+2] ^ subkey
[i
+4];
317 ctx
->keys
[i
+3] = subkey
[i
+3] ^ subkey
[i
+5];
318 ctx
->keys
[i
+4] = subkey
[i
+4] ^ subkey
[i
+6];
319 ctx
->keys
[i
+5] = subkey
[i
+5] ^ subkey
[i
+7];
321 ctx
->keys
[i
-2] = subkey
[i
-2];
322 ctx
->keys
[i
-1] = subkey
[i
] ^ subkey
[i
-1];
324 #if !HAVE_NATIVE_64_BIT
325 for (i
= 0; i
< ctx
->nkeys
; i
+= 8)
327 /* apply the inverse of the last half of F-function */
328 CAMELLIA_F_HALF_INV(ctx
->keys
[i
+1]);
329 CAMELLIA_F_HALF_INV(ctx
->keys
[i
+2]);
330 CAMELLIA_F_HALF_INV(ctx
->keys
[i
+3]);
331 CAMELLIA_F_HALF_INV(ctx
->keys
[i
+4]);
332 CAMELLIA_F_HALF_INV(ctx
->keys
[i
+5]);
333 CAMELLIA_F_HALF_INV(ctx
->keys
[i
+6]);