summaryrefslogtreecommitdiff
path: root/lgl/gc.h
diff options
context:
space:
mode:
Diffstat (limited to 'lgl/gc.h')
-rw-r--r--lgl/gc.h317
1 files changed, 0 insertions, 317 deletions
diff --git a/lgl/gc.h b/lgl/gc.h
deleted file mode 100644
index 2b87101219..0000000000
--- a/lgl/gc.h
+++ /dev/null
@@ -1,317 +0,0 @@
-/* gc.h --- Header file for implementation agnostic crypto wrapper API.
- * Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008 Simon Josefsson
- *
- * This file 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, or (at your
- * option) any later version.
- *
- * This file 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 a copy of the GNU Lesser General Public License
- * along with this file; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- *
- */
-
-#ifndef GC_H
-# define GC_H
-
-/* Get size_t. */
-# include <stddef.h>
-
-enum Gc_rc
-{
- GC_OK = 0,
- GC_MALLOC_ERROR,
- GC_INIT_ERROR,
- GC_RANDOM_ERROR,
- GC_INVALID_CIPHER,
- GC_INVALID_HASH,
- GC_PKCS5_INVALID_ITERATION_COUNT,
- GC_PKCS5_INVALID_DERIVED_KEY_LENGTH,
- GC_PKCS5_DERIVED_KEY_TOO_LONG
-};
-typedef enum Gc_rc Gc_rc;
-
-/* Hash types. */
-enum Gc_hash
-{
- GC_MD4,
- GC_MD5,
- GC_SHA1,
- GC_MD2,
- GC_RMD160,
- GC_SHA256,
- GC_SHA384,
- GC_SHA512,
- GC_SHA224
-};
-typedef enum Gc_hash Gc_hash;
-
-enum Gc_hash_mode
-{
- GC_HMAC = 1
-};
-typedef enum Gc_hash_mode Gc_hash_mode;
-
-typedef void *gc_hash_handle;
-
-#define GC_MD2_DIGEST_SIZE 16
-#define GC_MD4_DIGEST_SIZE 16
-#define GC_MD5_DIGEST_SIZE 16
-#define GC_RMD160_DIGEST_SIZE 20
-#define GC_SHA1_DIGEST_SIZE 20
-#define GC_SHA256_DIGEST_SIZE 32
-#define GC_SHA384_DIGEST_SIZE 48
-#define GC_SHA512_DIGEST_SIZE 64
-#define GC_SHA224_DIGEST_SIZE 24
-
-/* Cipher types. */
-enum Gc_cipher
-{
- GC_AES128,
- GC_AES192,
- GC_AES256,
- GC_3DES,
- GC_DES,
- GC_ARCFOUR128,
- GC_ARCFOUR40,
- GC_ARCTWO40,
- GC_CAMELLIA128,
- GC_CAMELLIA256
-};
-typedef enum Gc_cipher Gc_cipher;
-
-enum Gc_cipher_mode
-{
- GC_ECB,
- GC_CBC,
- GC_STREAM
-};
-typedef enum Gc_cipher_mode Gc_cipher_mode;
-
-typedef void *gc_cipher_handle;
-
-/* Call before respectively after any other functions. */
-extern Gc_rc gc_init (void);
-extern void gc_done (void);
-
-/* Memory allocation (avoid). */
-typedef void *(*gc_malloc_t) (size_t n);
-typedef int (*gc_secure_check_t) (const void *);
-typedef void *(*gc_realloc_t) (void *p, size_t n);
-typedef void (*gc_free_t) (void *);
-extern void gc_set_allocators (gc_malloc_t func_malloc,
- gc_malloc_t secure_malloc,
- gc_secure_check_t secure_check,
- gc_realloc_t func_realloc,
- gc_free_t func_free);
-
-/* Randomness. */
-extern Gc_rc gc_nonce (char *data, size_t datalen);
-extern Gc_rc gc_pseudo_random (char *data, size_t datalen);
-extern Gc_rc gc_random (char *data, size_t datalen);
-
-/* Ciphers. */
-extern Gc_rc gc_cipher_open (Gc_cipher cipher, Gc_cipher_mode mode,
- gc_cipher_handle *outhandle);
-extern Gc_rc gc_cipher_setkey (gc_cipher_handle handle,
- size_t keylen, const char *key);
-extern Gc_rc gc_cipher_setiv (gc_cipher_handle handle,
- size_t ivlen, const char *iv);
-extern Gc_rc gc_cipher_encrypt_inline (gc_cipher_handle handle,
- size_t len, char *data);
-extern Gc_rc gc_cipher_decrypt_inline (gc_cipher_handle handle,
- size_t len, char *data);
-extern Gc_rc gc_cipher_close (gc_cipher_handle handle);
-
-/* Hashes. */
-
-extern Gc_rc gc_hash_open (Gc_hash hash, Gc_hash_mode mode,
- gc_hash_handle *outhandle);
-extern Gc_rc gc_hash_clone (gc_hash_handle handle, gc_hash_handle *outhandle);
-extern size_t gc_hash_digest_length (Gc_hash hash);
-extern void gc_hash_hmac_setkey (gc_hash_handle handle,
- size_t len, const char *key);
-extern void gc_hash_write (gc_hash_handle handle,
- size_t len, const char *data);
-extern const char *gc_hash_read (gc_hash_handle handle);
-extern void gc_hash_close (gc_hash_handle handle);
-
-/* Compute a hash value over buffer IN of INLEN bytes size using the
- algorithm HASH, placing the result in the pre-allocated buffer OUT.
- The required size of OUT depends on HASH, and is generally
- GC_<HASH>_DIGEST_SIZE. For example, for GC_MD5 the output buffer
- must be 16 bytes. The return value is 0 (GC_OK) on success, or
- another Gc_rc error code. */
-extern Gc_rc
-gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *out);
-
-/* One-call interface. */
-extern Gc_rc gc_md2 (const void *in, size_t inlen, void *resbuf);
-extern Gc_rc gc_md4 (const void *in, size_t inlen, void *resbuf);
-extern Gc_rc gc_md5 (const void *in, size_t inlen, void *resbuf);
-extern Gc_rc gc_sha1 (const void *in, size_t inlen, void *resbuf);
-extern Gc_rc gc_hmac_md5 (const void *key, size_t keylen,
- const void *in, size_t inlen, char *resbuf);
-extern Gc_rc gc_hmac_sha1 (const void *key, size_t keylen,
- const void *in, size_t inlen, char *resbuf);
-
-/* Derive cryptographic keys from a password P of length PLEN, with
- salt S of length SLEN, placing the result in pre-allocated buffer
- DK of length DKLEN. An iteration count is specified in C, where a
- larger value means this function take more time (typical iteration
- counts are 1000-20000). This function "stretches" the key to be
- exactly dkLen bytes long. GC_OK is returned on success, otherwise
- an Gc_rc error code is returned. */
-extern Gc_rc
-gc_pbkdf2_sha1 (const char *P, size_t Plen,
- const char *S, size_t Slen,
- unsigned int c, char *DK, size_t dkLen);
-
-/*
- TODO:
-
- From: Simon Josefsson <jas@extundo.com>
- Subject: Re: generic crypto
- Newsgroups: gmane.comp.lib.gnulib.bugs
- Cc: bug-gnulib@gnu.org
- Date: Fri, 07 Oct 2005 12:50:57 +0200
- Mail-Copies-To: nobody
-
- Paul Eggert <eggert@CS.UCLA.EDU> writes:
-
- > Simon Josefsson <jas@extundo.com> writes:
- >
- >> * Perhaps the /dev/?random reading should be separated into a separate
- >> module? It might be useful outside of the gc layer too.
- >
- > Absolutely. I've been meaning to do that for months (for a "shuffle"
- > program I want to add to coreutils), but hadn't gotten around to it.
- > It would have to be generalized a bit. I'd like to have the file
- > descriptor cached, for example.
-
- I'll write a separate module for that part.
-
- I think we should even add a good PRNG that is re-seeded from
- /dev/?random frequently. GnuTLS can need a lot of random data on a
- big server, more than /dev/random can supply. And /dev/urandom might
- not be strong enough. Further, the security of /dev/?random can also
- be questionable.
-
- >> I'm also not sure about the names of those functions, they suggest
- >> a more higher-level API than what is really offered (i.e., the
- >> names "nonce" and "pseudo_random" and "random" imply certain
- >> cryptographic properties).
- >
- > Could you expand a bit more on that? What is the relationship between
- > nonce/pseudorandom/random and the /dev/ values you are using?
-
- There is none, that is the problem.
-
- Applications generally need different kind of "random" numbers.
- Sometimes they just need some random data and doesn't care whether it
- is possible for an attacker to compute the string (aka a "nonce").
- Sometimes they need data that is very difficult to compute (i.e.,
- computing it require inverting SHA1 or similar). Sometimes they need
- data that is not possible to compute, i.e., it wants real entropy
- collected over time on the system. Collecting the last kind of random
- data is very expensive, so it must not be used too often. The second
- kind of random data ("pseudo random") is typically generated by
- seeding a good PRNG with a couple of hundred bytes of real entropy
- from the "real random" data pool. The "nonce" is usually computed
- using the PRNG as well, because PRNGs are usually fast.
-
- Pseudo-random data is typically used for session keys. Strong random
- data is often used to generate long-term keys (e.g., private RSA
- keys).
-
- Of course, there are many subtleties. There are several different
- kind of nonce:s. Sometimes a nonce is just an ever-increasing
- integer, starting from 0. Sometimes it is assumed to be unlikely to
- be the same as previous nonces, but without a requirement that the
- nonce is possible to guess. MD5(system clock) would thus suffice, if
- it isn't called too often. You can guess what the next value will be,
- but it will always be different.
-
- The problem is that /dev/?random doesn't offer any kind of semantic
- guarantees. But applications need an API that make that promise.
-
- I think we should do this in several steps:
-
- 1) Write a module that can read from /dev/?random.
-
- 2) Add a module for a known-good PRNG suitable for random number
- generation, that can be continuously re-seeded.
-
- 3) Add a high-level module that provide various different randomness
- functions. One for nonces, perhaps even different kind of nonces,
- one for pseudo random data, and one for strong random data. It is
- not clear whether we can hope to achieve the last one in a portable
- way.
-
- Further, it would be useful to allow users to provide their own
- entropy source as a file, used to seed the PRNG or initialize the
- strong randomness pool. This is used on embedded platforms that
- doesn't have enough interrupts to hope to generate good random data.
-
- > For example, why not use OpenBSD's /dev/arandom?
-
- I don't trust ARC4. For example, recent cryptographic efforts
- indicate that you must throw away the first 512 bytes generated from
- the PRNG for it to be secure. I don't know whether OpenBSD do this.
- Further, I recall some eprint paper on RC4 security that didn't
- inspire confidence.
-
- While I trust the random devices in OpenBSD more than
- Solaris/AIX/HPUX/etc, I think that since we need something better on
- Solaris/AIX/HPUX we'd might as well use it on OpenBSD or even Linux
- too.
-
- > Here is one thought. The user could specify a desired quality level
- > range, and the implementation then would supply random data that is at
- > least as good as the lower bound of the range. I.e., ihe
- > implementation refuses to produce any random data if it can't generate
- > data that is at least as good as the lower end of the range. The
- > upper bound of the range is advice from the user not to be any more
- > expensive than that, but the implementation can ignore the advice if
- > it doesn't have anything cheaper.
-
- I'm not sure this is a good idea. Users can't really be expected to
- understand this. Further, applications need many different kind of
- random data. Selecting the randomness level for each by the user will
- be too complicated.
-
- I think it is better if the application decide, from its cryptographic
- requirement, what entropy quality it require, and call the proper API.
- Meeting the implied semantic properties should be the job for gnulib.
-
- >> Perhaps gc_dev_random and gc_dev_urandom?
- >
- > To some extent. I'd rather insulate the user from the details of
- > where the random numbers come from. On the other hand we need to
- > provide a way for applications to specify a file that contains
- > random bits, so that people can override the defaults.
-
- Agreed.
-
- This may require some thinking before it is finalized. Is it ok to
- install the GC module as-is meanwhile? Then I can continue to add the
- stuff that GnuTLS need, and then come back to re-working the
- randomness module. That way, we have two different projects that use
- the code. GnuTLS includes the same randomness code that was in GNU
- SASL and that is in the current gc module. I feel much more
- comfortable working in small steps at a time, rather then working on
- this for a long time in gnulib and only later integrate the stuff in
- GnuTLS.
-
- Thanks,
- Simon
- */
-
-#endif /* GC_H */