3 * The serpent block cipher.
5 * For more details on this algorithm, see the Serpent website at
6 * http://www.cl.cam.ac.uk/~rja14/serpent.html
9 /* nettle, low-level cryptographics library
11 * Copyright (C) 2011 Niels Möller
12 * Copyright (C) 2010, 2011 Simon Josefsson
13 * Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
15 * The nettle library is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU Lesser General Public License as published by
17 * the Free Software Foundation; either version 2.1 of the License, or (at your
18 * option) any later version.
20 * The nettle library is distributed in the hope that it will be useful, but
21 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
22 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
23 * License for more details.
25 * You should have received a copy of the GNU Lesser General Public License
26 * along with the nettle library; see the file COPYING.LIB. If not, write to
27 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
31 /* This file is derived from cipher/serpent.c in Libgcrypt v1.4.6.
32 The adaption to Nettle was made by Simon Josefsson on 2010-12-07
33 with final touches on 2011-05-30. Changes include replacing
34 libgcrypt with nettle in the license template, renaming
35 serpent_context to serpent_ctx, renaming u32 to uint32_t, removing
36 libgcrypt stubs and selftests, modifying entry function prototypes,
37 using FOR_BLOCKS to iterate through data in encrypt/decrypt, using
38 LE_READ_UINT32 and LE_WRITE_UINT32 to access data in
39 encrypt/decrypt, and running indent on the code. */
41 #ifndef NETTLE_SERPENT_INTERNAL_H_INCLUDED
42 #define NETTLE_SERPENT_INTERNAL_H_INCLUDED
44 #define KEYXOR(x0,x1,x2,x3, subkey) \
46 (x0) ^= (subkey)[0]; \
47 (x1) ^= (subkey)[1]; \
48 (x2) ^= (subkey)[2]; \
49 (x3) ^= (subkey)[3]; \
52 #if HAVE_NATIVE_64_BIT
53 /* Operate independently on both halves of a 64-bit word. */
54 #define DROTL32(n,x) \
55 (((x) << (n) & ~((((uint64_t) 1 << (n))-1) << 32)) \
56 |(((x) >> (32-(n))) & ~((((uint64_t) 1 << (32-(n)))-1) << (n))))
58 #define KEYXOR64(x0,x1,x2,x3, subkey) \
61 _sk = (subkey)[0]; _sk |= _sk << 32; (x0) ^= _sk; \
62 _sk = (subkey)[1]; _sk |= _sk << 32; (x1) ^= _sk; \
63 _sk = (subkey)[2]; _sk |= _sk << 32; (x2) ^= _sk; \
64 _sk = (subkey)[3]; _sk |= _sk << 32; (x3) ^= _sk; \
67 #define DRSHIFT32(n,x) \
68 ( ((x) << (n)) & ~((((uint64_t) 1 << (n)) - 1) << 32))
69 #endif /* HAVE_NATIVE_64_BIT */
71 #endif /* NETTLE_SERPENT_INTERNAL_H_INCLUDED */