chiark / gitweb /
ec-bin (ec_binproj): Make curve setup faster.
[catacomb] / rc2.h
1 /* -*-c-*-
2  *
3  * $Id: rc2.h,v 1.2 2004/04/08 01:36:15 mdw Exp $
4  *
5  * The RC2 block cipher
6  *
7  * (c) 2000 Straylight/Edgeware
8  */
9
10 /*----- Licensing notice --------------------------------------------------* 
11  *
12  * This file is part of Catacomb.
13  *
14  * Catacomb is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU Library General Public License as
16  * published by the Free Software Foundation; either version 2 of the
17  * License, or (at your option) any later version.
18  * 
19  * Catacomb is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU Library General Public License for more details.
23  * 
24  * You should have received a copy of the GNU Library General Public
25  * License along with Catacomb; if not, write to the Free
26  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
27  * MA 02111-1307, USA.
28  */
29
30 /*----- Notes on the RC2 block cipher -------------------------------------*
31  *
32  * RC2 was designed by Ron Rivest, and for a long time was a trade secret of
33  * RSA Data Security Inc.  Like RC4, it leaked out, and has now been
34  * described in RFC2268.  The RC2 key schedule is known to have some
35  * weaknesses, although I'm not aware of any major results against the cipher
36  * itself.  I'm also not aware of any legal problems with using the RC2
37  * cipher.
38  *
39  * The oddest feature in the cipher is the key schedule.  It expands the
40  * initial key material to 128 bytes, and then `brain-damages' it, according
41  * to a supplied `effective key-bits' parameter, before expanding the
42  * remaining key material back into the buffer.
43  *
44  * The key schedule allows second preimages to be computed trivially.
45  */
46
47 #ifndef CATACOMB_RC2_H
48 #define CATACOMB_RC2_H
49
50 #ifdef __cplusplus
51   extern "C" {
52 #endif
53
54 /*----- Header files ------------------------------------------------------*/
55
56 #include <stddef.h>
57
58 #include <mLib/bits.h>
59
60 /*----- Magical numbers ---------------------------------------------------*/
61
62 #define RC2_BLKSZ 8
63 #define RC2_KEYSZ 16
64 #define RC2_CLASS (N, L, 64)
65
66 extern const octet rc2_keysz[];
67
68 /*----- Data structures ---------------------------------------------------*/
69
70 typedef struct rc2_ctx {
71   uint16 k[64];
72 } rc2_ctx;
73
74 /*----- Functions provided ------------------------------------------------*/
75
76 /* --- @rc2_braindamage@ --- *
77  *
78  * Arguments:   @rc2_ctx *k@ = pointer to context to initialize
79  *              @const void *buf@ = pointer to key material
80  *              @size_t sz@ = size of key material in bytes
81  *              @unsigned eb@ = desired effective key size, in bits
82  *
83  * Returns:     ---
84  *
85  * Use:         Initializes an RC2 expanded key, and braindamages it to the
86  *              requested effective key size.  This is here for compatibility
87  *              reasons.  You should be using @rc2_init@ in normal code,
88  *              which doesn't actually apply braindamage.
89  */
90
91 extern void rc2_braindamage(rc2_ctx */*k*/, const void */*buf*/,
92                             size_t /*sz*/, unsigned /*eb*/);
93
94 /* --- @rc2_init@ --- *
95  *
96  * Arguments:   @rc2_ctx *k@ = pointer to context to initialize
97  *              @const void *buf@ = pointer to key material
98  *              @size_t sz@ = size of key material in bytes
99  *
100  * Returns:     ---
101  *
102  * Use:         Initializes an RC2 expanded key.  The effective key size is
103  *              set to be equal to the real key size, in bits.
104  */
105
106 extern void rc2_init(rc2_ctx */*k*/, const void */*buf*/, size_t /*sz*/);
107
108 /* --- @rc2_eblk@, @rc2_dblk@ --- *
109  *
110  * Arguments:   @const rc2_ctx *k@ = pointer to RC2 context
111  *              @const uint32 s[2]@ = pointer to source block
112  *              @const uint32 d[2]@ = pointer to destination block
113  *
114  * Returns:     ---
115  *
116  * Use:         Low-level block encryption and decryption.
117  */
118
119 extern void rc2_eblk(const rc2_ctx */*k*/,
120                      const uint32 */*s*/, uint32 */*dst*/);
121 extern void rc2_dblk(const rc2_ctx */*k*/,
122                      const uint32 */*s*/, uint32 */*dst*/);
123
124 /*----- That's all, folks -------------------------------------------------*/
125
126 #ifdef __cplusplus
127   }
128 #endif
129
130 #endif