Skip to content
Snippets Groups Projects
serpent.h 2.14 KiB
Newer Older
  • Learn to ignore specific revisions
  • /* serpent.h
     *
     * The serpent block cipher.
     */
    
    /* nettle, low-level cryptographics library
     *
     * Copyright (C) 2001 Niels Möller
     *  
     * The nettle library is free software; you can redistribute it and/or modify
     * it under the terms of the GNU Lesser General Public License as published by
     * the Free Software Foundation; either version 2.1 of the License, or (at your
     * option) any later version.
     * 
    
    Niels Möller's avatar
    Niels Möller committed
     * The nettle library 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 Lesser General Public
     * License for more details.
     * 
     * You should have received a copy of the GNU Lesser General Public License
    
    Niels Möller's avatar
    Niels Möller committed
     * along with the nettle library; see the file COPYING.LIB.  If not, write to
    
     * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
     * MA 02111-1307, USA.
     */
    
    /* 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
    
    
    Niels Möller's avatar
    Niels Möller committed
    #include <inttypes.h>
    
    Niels Möller's avatar
    Niels Möller committed
    #define SERPENT_BLOCK_SIZE 16
    
    Niels Möller's avatar
    Niels Möller committed
    /* 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
    
    
    /* Allow keys of size 128 <= bits <= 256 */
    
    #define SERPENT_MIN_KEY_SIZE 16
    #define SERPENT_MAX_KEY_SIZE 32
    
    struct serpent_ctx
    {
      uint32_t keys[33][4];  /* key schedule */
    };
    
    void
    serpent_set_key(struct serpent_ctx *ctx,
                    unsigned length, const uint8_t *key);
    
    void
    
    Niels Möller's avatar
    Niels Möller committed
    serpent_encrypt(struct serpent_ctx *ctx,
    
                    unsigned length, uint8_t *dst,
                    const uint8_t *src);
    void
    
    Niels Möller's avatar
    Niels Möller committed
    serpent_decrypt(struct serpent_ctx *ctx,
    
                    unsigned length, uint8_t *dst,
                    const uint8_t *src);
    
    #endif /* NETTLE_SERPENT_H_INCLUDED */