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