Add MD2 and hash fixes.
[gnulib.git] / lib / gc.h
1 /* gc.h --- Header file for implementation agnostic crypto wrapper API.
2  * Copyright (C) 2002, 2003, 2004, 2005  Simon Josefsson
3  *
4  * This file is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published
6  * by the Free Software Foundation; either version 2, or (at your
7  * option) any later version.
8  *
9  * This file is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this file; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  *
19  */
20
21 #ifndef GC_H
22 # define GC_H
23
24 /* Get size_t. */
25 # include <stddef.h>
26
27 enum Gc_rc
28 {
29   GC_OK = 0,
30   GC_MALLOC_ERROR,
31   GC_INIT_ERROR,
32   GC_RANDOM_ERROR,
33   GC_INVALID_CIPHER,
34   GC_INVALID_HASH,
35   GC_PKCS5_INVALID_ITERATION_COUNT,
36   GC_PKCS5_INVALID_DERIVED_KEY_LENGTH,
37   GC_PKCS5_DERIVED_KEY_TOO_LONG
38 };
39 typedef enum Gc_rc Gc_rc;
40
41 /* Hash types. */
42 enum Gc_hash
43 {
44   GC_MD4,
45   GC_MD5,
46   GC_SHA1,
47   GC_MD2,
48   GC_RMD160
49 };
50 typedef enum Gc_hash Gc_hash;
51
52 enum Gc_hash_mode
53 {
54   GC_HMAC = 1
55 };
56 typedef enum Gc_hash_mode Gc_hash_mode;
57
58 typedef void *gc_hash_handle;
59
60 #define GC_MD2_DIGEST_SIZE 16
61 #define GC_MD4_DIGEST_SIZE 16
62 #define GC_MD5_DIGEST_SIZE 16
63 #define GC_RMD160_DIGEST_SIZE 20
64 #define GC_SHA1_DIGEST_SIZE 20
65
66 /* Cipher types. */
67 enum Gc_cipher
68 {
69   GC_AES128,
70   GC_AES192,
71   GC_AES256,
72   GC_3DES,
73   GC_DES,
74   GC_ARCFOUR128,
75   GC_ARCFOUR40,
76   GC_ARCTWO40
77 };
78 typedef enum Gc_cipher Gc_cipher;
79
80 enum Gc_cipher_mode
81 {
82   GC_ECB,
83   GC_CBC,
84   GC_STREAM
85 };
86 typedef enum Gc_cipher_mode Gc_cipher_mode;
87
88 typedef void *gc_cipher_handle;
89
90 /* Call before respectively after any other functions. */
91 extern Gc_rc gc_init (void);
92 extern void gc_done (void);
93
94 /* Memory allocation (avoid). */
95 typedef void *(*gc_malloc_t) (size_t n);
96 typedef int (*gc_secure_check_t) (const void *);
97 typedef void *(*gc_realloc_t) (void *p, size_t n);
98 typedef void (*gc_free_t) (void *);
99 extern void gc_set_allocators (gc_malloc_t func_malloc,
100                                gc_malloc_t secure_malloc,
101                                gc_secure_check_t secure_check,
102                                gc_realloc_t func_realloc,
103                                gc_free_t func_free);
104
105 /* Randomness. */
106 extern Gc_rc gc_nonce (char *data, size_t datalen);
107 extern Gc_rc gc_pseudo_random (char *data, size_t datalen);
108 extern Gc_rc gc_random (char *data, size_t datalen);
109
110 /* Ciphers. */
111 extern Gc_rc gc_cipher_open (Gc_cipher cipher, Gc_cipher_mode mode,
112                              gc_cipher_handle *outhandle);
113 extern Gc_rc gc_cipher_setkey (gc_cipher_handle handle,
114                                size_t keylen, const char *key);
115 extern Gc_rc gc_cipher_setiv (gc_cipher_handle handle,
116                               size_t ivlen, const char *iv);
117 extern Gc_rc gc_cipher_encrypt_inline (gc_cipher_handle handle,
118                                        size_t len, char *data);
119 extern Gc_rc gc_cipher_decrypt_inline (gc_cipher_handle handle,
120                                        size_t len, char *data);
121 extern Gc_rc gc_cipher_close (gc_cipher_handle handle);
122
123 /* Hashes. */
124
125 extern Gc_rc gc_hash_open (Gc_hash hash, Gc_hash_mode mode,
126                            gc_hash_handle *outhandle);
127 extern Gc_rc gc_hash_clone (gc_hash_handle handle, gc_hash_handle *outhandle);
128 extern size_t gc_hash_digest_length (Gc_hash hash);
129 extern void gc_hash_hmac_setkey (gc_hash_handle handle,
130                                  size_t len, const char *key);
131 extern void gc_hash_write (gc_hash_handle handle,
132                            size_t len, const char *data);
133 extern const char *gc_hash_read (gc_hash_handle handle);
134 extern void gc_hash_close (gc_hash_handle handle);
135
136 /* Compute a hash value over buffer IN of INLEN bytes size using the
137    algorithm HASH, placing the result in the pre-allocated buffer OUT.
138    The required size of OUT depends on HASH, and is generally
139    GC_<HASH>_DIGEST_SIZE.  For example, for GC_MD5 the output buffer
140    must be 16 bytes.  The return value is 0 (GC_OK) on success, or
141    another Gc_rc error code. */
142 extern Gc_rc
143 gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *out);
144
145 /* One-call interface. */
146 extern Gc_rc gc_md2 (const void *in, size_t inlen, void *resbuf);
147 extern Gc_rc gc_md4 (const void *in, size_t inlen, void *resbuf);
148 extern Gc_rc gc_md5 (const void *in, size_t inlen, void *resbuf);
149 extern Gc_rc gc_sha1 (const void *in, size_t inlen, void *resbuf);
150 extern Gc_rc gc_hmac_md5 (const void *key, size_t keylen,
151                           const void *in, size_t inlen, char *resbuf);
152 extern Gc_rc gc_hmac_sha1 (const void *key, size_t keylen,
153                            const void *in, size_t inlen, char *resbuf);
154
155 /* Derive cryptographic keys from a password P of length PLEN, with
156    salt S of length SLEN, placing the result in pre-allocated buffer
157    DK of length DKLEN.  An iteration count is specified in C, where a
158    larger value means this function take more time (typical iteration
159    counts are 1000-20000).  This function "stretches" the key to be
160    exactly dkLen bytes long.  GC_OK is returned on success, otherwise
161    an Gc_rc error code is returned.  */
162 extern Gc_rc
163 gc_pbkdf2_sha1 (const char *P, size_t Plen,
164                 const char *S, size_t Slen,
165                 unsigned int c, char *DK, size_t dkLen);
166
167 /*
168   TODO:
169
170   From: Simon Josefsson <jas@extundo.com>
171   Subject: Re: generic crypto
172   Newsgroups: gmane.comp.lib.gnulib.bugs
173   Cc: bug-gnulib@gnu.org
174   Date: Fri, 07 Oct 2005 12:50:57 +0200
175   Mail-Copies-To: nobody
176
177   Paul Eggert <eggert@CS.UCLA.EDU> writes:
178
179   > Simon Josefsson <jas@extundo.com> writes:
180   >
181   >> * Perhaps the /dev/?random reading should be separated into a separate
182   >>   module?  It might be useful outside of the gc layer too.
183   >
184   > Absolutely.  I've been meaning to do that for months (for a "shuffle"
185   > program I want to add to coreutils), but hadn't gotten around to it.
186   > It would have to be generalized a bit.  I'd like to have the file
187   > descriptor cached, for example.
188
189   I'll write a separate module for that part.
190
191   I think we should even add a good PRNG that is re-seeded from
192   /dev/?random frequently.  GnuTLS can need a lot of random data on a
193   big server, more than /dev/random can supply.  And /dev/urandom might
194   not be strong enough.  Further, the security of /dev/?random can also
195   be questionable.
196
197   >>   I'm also not sure about the names of those functions, they suggest
198   >>   a more higher-level API than what is really offered (i.e., the
199   >>   names "nonce" and "pseudo_random" and "random" imply certain
200   >>   cryptographic properties).
201   >
202   > Could you expand a bit more on that?  What is the relationship between
203   > nonce/pseudorandom/random and the /dev/ values you are using?
204
205   There is none, that is the problem.
206
207   Applications generally need different kind of "random" numbers.
208   Sometimes they just need some random data and doesn't care whether it
209   is possible for an attacker to compute the string (aka a "nonce").
210   Sometimes they need data that is very difficult to compute (i.e.,
211   computing it require inverting SHA1 or similar).  Sometimes they need
212   data that is not possible to compute, i.e., it wants real entropy
213   collected over time on the system.  Collecting the last kind of random
214   data is very expensive, so it must not be used too often.  The second
215   kind of random data ("pseudo random") is typically generated by
216   seeding a good PRNG with a couple of hundred bytes of real entropy
217   from the "real random" data pool.  The "nonce" is usually computed
218   using the PRNG as well, because PRNGs are usually fast.
219
220   Pseudo-random data is typically used for session keys.  Strong random
221   data is often used to generate long-term keys (e.g., private RSA
222   keys).
223
224   Of course, there are many subtleties.  There are several different
225   kind of nonce:s.  Sometimes a nonce is just an ever-increasing
226   integer, starting from 0.  Sometimes it is assumed to be unlikely to
227   be the same as previous nonces, but without a requirement that the
228   nonce is possible to guess.  MD5(system clock) would thus suffice, if
229   it isn't called too often.  You can guess what the next value will be,
230   but it will always be different.
231
232   The problem is that /dev/?random doesn't offer any kind of semantic
233   guarantees.  But applications need an API that make that promise.
234
235   I think we should do this in several steps:
236
237   1) Write a module that can read from /dev/?random.
238
239   2) Add a module for a known-good PRNG suitable for random number
240   generation, that can be continuously re-seeded.
241
242   3) Add a high-level module that provide various different randomness
243   functions.  One for nonces, perhaps even different kind of nonces,
244   one for pseudo random data, and one for strong random data.  It is
245   not clear whether we can hope to achieve the last one in a portable
246   way.
247
248   Further, it would be useful to allow users to provide their own
249   entropy source as a file, used to seed the PRNG or initialize the
250   strong randomness pool.  This is used on embedded platforms that
251   doesn't have enough interrupts to hope to generate good random data.
252
253   > For example, why not use OpenBSD's /dev/arandom?
254
255   I don't trust ARC4.  For example, recent cryptographic efforts
256   indicate that you must throw away the first 512 bytes generated from
257   the PRNG for it to be secure.  I don't know whether OpenBSD do this.
258   Further, I recall some eprint paper on RC4 security that didn't
259   inspire confidence.
260
261   While I trust the random devices in OpenBSD more than
262   Solaris/AIX/HPUX/etc, I think that since we need something better on
263   Solaris/AIX/HPUX we'd might as well use it on OpenBSD or even Linux
264   too.
265
266   > Here is one thought.  The user could specify a desired quality level
267   > range, and the implementation then would supply random data that is at
268   > least as good as the lower bound of the range.  I.e., ihe
269   > implementation refuses to produce any random data if it can't generate
270   > data that is at least as good as the lower end of the range.  The
271   > upper bound of the range is advice from the user not to be any more
272   > expensive than that, but the implementation can ignore the advice if
273   > it doesn't have anything cheaper.
274
275   I'm not sure this is a good idea.  Users can't really be expected to
276   understand this.  Further, applications need many different kind of
277   random data.  Selecting the randomness level for each by the user will
278   be too complicated.
279
280   I think it is better if the application decide, from its cryptographic
281   requirement, what entropy quality it require, and call the proper API.
282   Meeting the implied semantic properties should be the job for gnulib.
283
284   >> Perhaps gc_dev_random and gc_dev_urandom?
285   >
286   > To some extent.  I'd rather insulate the user from the details of
287   > where the random numbers come from.  On the other hand we need to
288   > provide a way for applications to specify a file that contains
289   > random bits, so that people can override the defaults.
290
291   Agreed.
292
293   This may require some thinking before it is finalized.  Is it ok to
294   install the GC module as-is meanwhile?  Then I can continue to add the
295   stuff that GnuTLS need, and then come back to re-working the
296   randomness module.  That way, we have two different projects that use
297   the code.  GnuTLS includes the same randomness code that was in GNU
298   SASL and that is in the current gc module.  I feel much more
299   comfortable working in small steps at a time, rather then working on
300   this for a long time in gnulib and only later integrate the stuff in
301   GnuTLS.
302
303   Thanks,
304   Simon
305  */
306
307 #endif /* GC_H */