twofish.h 2.65 KB
Newer Older
1 2
/* twofish.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 twofish block cipher.

   Copyright (C) 2001, 2014 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 42

/*
 * Twofish is a 128-bit block cipher that accepts a variable-length
 * key up to 256 bits, designed by Bruce Schneier and others.  See
 * http://www.counterpane.com/twofish.html for details.
 */

#ifndef NETTLE_TWOFISH_H_INCLUDED
#define NETTLE_TWOFISH_H_INCLUDED

43
#include "nettle-types.h"
44

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

49 50
/* Name mangling */
#define twofish_set_key nettle_twofish_set_key
51 52 53
#define twofish128_set_key nettle_twofish128_set_key
#define twofish192_set_key nettle_twofish192_set_key
#define twofish256_set_key nettle_twofish256_set_key
54 55 56
#define twofish_encrypt nettle_twofish_encrypt
#define twofish_decrypt nettle_twofish_decrypt

57 58 59 60 61 62 63 64
#define TWOFISH_BLOCK_SIZE 16

/* Variable key size between 128 and 256 bits. But the only valid
 * values are 16 (128 bits), 24 (192 bits) and 32 (256 bits). */
#define TWOFISH_MIN_KEY_SIZE 16
#define TWOFISH_MAX_KEY_SIZE 32

#define TWOFISH_KEY_SIZE 32
65 66 67
#define TWOFISH128_KEY_SIZE 16
#define TWOFISH192_KEY_SIZE 24
#define TWOFISH256_KEY_SIZE 32
68 69 70 71

struct twofish_ctx
{
  uint32_t keys[40];
Niels Möller's avatar
Niels Möller committed
72
  uint32_t s_box[4][256];
73 74 75 76
};

void
twofish_set_key(struct twofish_ctx *ctx,
77
		size_t length, const uint8_t *key);
78 79 80 81 82 83
void
twofish128_set_key(struct twofish_ctx *context, const uint8_t *key);
void
twofish192_set_key(struct twofish_ctx *context, const uint8_t *key);
void
twofish256_set_key(struct twofish_ctx *context, const uint8_t *key);
84 85

void
86
twofish_encrypt(const struct twofish_ctx *ctx,
87
		size_t length, uint8_t *dst,
88 89
		const uint8_t *src);
void
90
twofish_decrypt(const struct twofish_ctx *ctx,
91
		size_t length, uint8_t *dst,
92 93
		const uint8_t *src);

Niels Möller's avatar
Niels Möller committed
94 95 96 97
#ifdef __cplusplus
}
#endif

98
#endif /* NETTLE_TWOFISH_H_INCLUDED */