serpent.h 2.94 KB
Newer Older
1 2
/* serpent.h

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
   The serpent block cipher.

   Copyright (C) 2001 Niels Möller

   This file is part of GNU Nettle.

   GNU Nettle is free software: you can redistribute it and/or
   modify it under the terms of either:

     * the GNU Lesser General Public License as published by the Free
       Software Foundation; either version 3 of the License, or (at your
       option) any later version.

   or

     * the GNU General Public License as published by the Free
       Software Foundation; either version 2 of the License, or (at your
       option) any later version.

   or both in parallel, as here.

   GNU Nettle is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received copies of the GNU General Public License and
   the GNU Lesser General Public License along with this program.  If
   not, see http://www.gnu.org/licenses/.
*/
33 34 35 36 37 38 39 40 41

/* Serpent is a 128-bit block cipher that accepts a key size of 256
 * bits, designed by Ross Anderson, Eli Biham, and Lars Knudsen. See
 * http://www.cl.cam.ac.uk/~rja14/serpent.html for details.
 */

#ifndef NETTLE_SERPENT_H_INCLUDED
#define NETTLE_SERPENT_H_INCLUDED

42
#include "nettle-types.h"
43

Niels Möller's avatar
Niels Möller committed
44 45 46 47
#ifdef __cplusplus
extern "C" {
#endif

48 49
/* Name mangling */
#define serpent_set_key nettle_serpent_set_key
50 51 52
#define serpent128_set_key nettle_serpent128_set_key
#define serpent192_set_key nettle_serpent192_set_key
#define serpent256_set_key nettle_serpent256_set_key
53 54 55
#define serpent_encrypt nettle_serpent_encrypt
#define serpent_decrypt nettle_serpent_decrypt

Niels Möller's avatar
Niels Möller committed
56
#define SERPENT_BLOCK_SIZE 16
57

Niels Möller's avatar
Niels Möller committed
58 59 60 61 62 63
/* Other key lengths are possible, but the design of Serpent makes
 * smaller key lengths quite pointless; they cheated with the AES
 * requirements, using a 256-bit key length exclusively and just
 * padding it out if the desired key length was less, so there really
 * is no advantage to using key lengths less than 256 bits. */
#define SERPENT_KEY_SIZE 32
64 65 66 67 68 69

/* Allow keys of size 128 <= bits <= 256 */

#define SERPENT_MIN_KEY_SIZE 16
#define SERPENT_MAX_KEY_SIZE 32

70 71 72 73
#define SERPENT128_KEY_SIZE 16
#define SERPENT192_KEY_SIZE 24
#define SERPENT256_KEY_SIZE 32

74 75 76 77 78 79 80
struct serpent_ctx
{
  uint32_t keys[33][4];  /* key schedule */
};

void
serpent_set_key(struct serpent_ctx *ctx,
81
                size_t length, const uint8_t *key);
82 83 84 85 86 87
void
serpent128_set_key(struct serpent_ctx *ctx, const uint8_t *key);
void
serpent192_set_key(struct serpent_ctx *ctx, const uint8_t *key);
void
serpent256_set_key(struct serpent_ctx *ctx, const uint8_t *key);
88 89

void
90
serpent_encrypt(const struct serpent_ctx *ctx,
91
                size_t length, uint8_t *dst,
92 93
                const uint8_t *src);
void
94
serpent_decrypt(const struct serpent_ctx *ctx,
95
                size_t length, uint8_t *dst,
96 97
                const uint8_t *src);

Niels Möller's avatar
Niels Möller committed
98 99 100 101
#ifdef __cplusplus
}
#endif

102
#endif /* NETTLE_SERPENT_H_INCLUDED */