2003-04-16 Moritz Schulte <moritz@g10code.com>
authorMoritz Schulte <mo@g10code.com>
Wed, 16 Apr 2003 16:25:52 +0000 (16:25 +0000)
committerMoritz Schulte <mo@g10code.com>
Wed, 16 Apr 2003 16:25:52 +0000 (16:25 +0000)
* module.c (_gcry_module_use): New function.
* g10lib.h (_gcry_module_use): Declare function.

* libgcrypt-config.in: Support for --algorithms switch, which
prints the algorithms included in the built libgcrypt.

* global.c (gcry_set_progress_handler): Register progress
functions depending on the enabled algorithms.

2003-04-07  Moritz Schulte  <moritz@g10code.com>

* Makefile.am (libgcrypt_la_SOURCES): Added module.c

* module.c: New file.
(_gcry_module_add): New function.
(_gcry_module_drop): New function.
(_gcry_module_lookup): New function.
(_gcry_module_release): New function.

* g10lib.h (GcryModule): New types.
(FLAG_MODULE_DISABLED): New symbol.
Added declarations for _gcry_module_add, _gcry_module_release and
_gcry_module_lookup.

* gcrypt.h: New types: GcryPubkeySpec, GcryDigestSpec,
GcryCipherSpec.
Added declarations for: gcry_cipher_register,
gcry_cipher_unregister, gcry_digest_register,
gcry_digest_unregister, gcry_pubkey_register and
gcry_pubkey_unregister.

* cipher.h: Removed symbols: CIPHER_ALGO_NONE, CIPHER_ALGO_IDEA,
CIPHER_ALGO_3DES, CIPHER_ALGO_CAST5, CIPHER_ALGO_BLOWFISH,
CIPHER_ALGO_SAFER_SK128, CIPHER_ALGO_DES_SK, CIPHER_ALGO_TWOFISH,
CIPHER_ALGO_TWOFISH_OLD, CIPHER_ALGO_DUMMY, PUBKEY_USAGE_SIG,
PUBKEY_USAGE_ENC, DIGEST_ALGO_MD5, DIGEST_ALGO_SHA1,
DIGEST_ALGO_RMD160, DIGEST_ALGO_TIGER, PUBKEY_ALGO_RSA,
PUBKEY_ALGO_RSA_E, PUBKEY_ALGO_RSA_S, PUBKEY_ALGO_DSA,
PUBKEY_ALGO_ELGAMAL, PUBKEY_ALGO_ELGAMAL_E.

2003-04-02  Moritz Schulte  <moritz@g10code.com>

* benchmark.c (md_bench): Fix error message.

src/ChangeLog
src/Makefile.am
src/benchmark.c
src/cipher.h
src/g10lib.h
src/gcrypt.h
src/global.c
src/libgcrypt-config.in
src/module.c [new file with mode: 0644]

index 702bc5d..15aa326 100644 (file)
@@ -1,3 +1,53 @@
+2003-04-16  Moritz Schulte  <moritz@g10code.com>
+
+       * module.c (_gcry_module_use): New function.
+       * g10lib.h (_gcry_module_use): Declare function.
+
+       * libgcrypt-config.in: Support for --algorithms switch, which
+       prints the algorithms included in the built libgcrypt.
+
+       * global.c (gcry_set_progress_handler): Register progress
+       functions depending on the enabled algorithms.
+
+2003-04-07  Moritz Schulte  <moritz@g10code.com>
+
+       * Makefile.am (libgcrypt_la_SOURCES): Added module.c
+
+       * module.c: New file.
+       (_gcry_module_add): New function.
+       (_gcry_module_drop): New function.
+       (_gcry_module_lookup): New function.
+       (_gcry_module_release): New function.
+
+       * g10lib.h (GcryModule): New types.
+       (FLAG_MODULE_DISABLED): New symbol.
+       Added declarations for _gcry_module_add, _gcry_module_release and
+       _gcry_module_lookup.
+
+       * gcrypt.h: New types: GcryPubkeySpec, GcryDigestSpec,
+       GcryCipherSpec.
+       Added declarations for: gcry_cipher_register,
+       gcry_cipher_unregister, gcry_digest_register,
+       gcry_digest_unregister, gcry_pubkey_register and
+       gcry_pubkey_unregister.
+
+       * cipher.h: Removed symbols: CIPHER_ALGO_NONE, CIPHER_ALGO_IDEA,
+       CIPHER_ALGO_3DES, CIPHER_ALGO_CAST5, CIPHER_ALGO_BLOWFISH,
+       CIPHER_ALGO_SAFER_SK128, CIPHER_ALGO_DES_SK, CIPHER_ALGO_TWOFISH,
+       CIPHER_ALGO_TWOFISH_OLD, CIPHER_ALGO_DUMMY, PUBKEY_USAGE_SIG,
+       PUBKEY_USAGE_ENC, DIGEST_ALGO_MD5, DIGEST_ALGO_SHA1,
+       DIGEST_ALGO_RMD160, DIGEST_ALGO_TIGER, PUBKEY_ALGO_RSA,
+       PUBKEY_ALGO_RSA_E, PUBKEY_ALGO_RSA_S, PUBKEY_ALGO_DSA,
+       PUBKEY_ALGO_ELGAMAL, PUBKEY_ALGO_ELGAMAL_E.
+
+2003-04-02  Moritz Schulte  <moritz@g10code.com>
+
+       * benchmark.c (md_bench): Fix error message.
+
+2003-03-31  Moritz Schulte  <moritz@g10code.com>
+
+       * benchmark.c (cipher_bench): Added CTR mode.
+
 2003-03-30  Simon Josefsson  <jas@extundo.com>
 
        * gcrypt.h (enum gcry_control_cmds): Add GCRY_SET_CTR.
index 908cd11..27654f9 100644 (file)
@@ -77,6 +77,7 @@ libgcrypt_la_SOURCES =         g10lib.h \
                         secmem.h \
                         mpi.h \
                         missing-string.c \
+                        module.c \
                         ${ath_components}
 
 libgcrypt_la_DEPENDENCIES = ../cipher/libcipher.la ../mpi/libmpi.la \
index f597914..61de307 100644 (file)
@@ -100,7 +100,7 @@ md_bench ( const char *algoname )
 
   if (!algo)
     {
-      fprintf (stderr, PGM ": invalid hash algorithm `%s'/n", algoname);
+      fprintf (stderr, PGM ": invalid hash algorithm `%s'\n", algoname);
       exit (1);
     }
   
index 4c00b8f..305dcec 100644 (file)
@@ -1,5 +1,5 @@
 /* cipher.h
- *     Copyright (C) 1998, 2002 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 2002, 2003 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
 
 #include "../cipher/random.h"
 
-
-#define CIPHER_ALGO_NONE        0
-#define CIPHER_ALGO_IDEA        1
-#define CIPHER_ALGO_3DES        2
-#define CIPHER_ALGO_CAST5       3
-#define CIPHER_ALGO_BLOWFISH    4  /* blowfish 128 bit key */
-#define CIPHER_ALGO_SAFER_SK128  5
-#define CIPHER_ALGO_DES_SK      6
-#define CIPHER_ALGO_TWOFISH    10  /* twofish 256 bit */
-#define CIPHER_ALGO_SKIPJACK   101  /* experimental: skipjack */
-#define CIPHER_ALGO_TWOFISH_OLD 102 /* experimental: twofish 128 bit */
-#define CIPHER_ALGO_DUMMY      110  /* no encryption at all */
-
-#define PUBKEY_ALGO_RSA        1
-#define PUBKEY_ALGO_RSA_E      2     /* RSA encrypt only */
-#define PUBKEY_ALGO_RSA_S      3     /* RSA sign only */
-#define PUBKEY_ALGO_ELGAMAL_E 16     /* encrypt only ElGamal (but not for v3)*/
-#define PUBKEY_ALGO_DSA       17
-#define PUBKEY_ALGO_ELGAMAL   20     /* sign and encrypt elgamal */
-
 #define PUBKEY_FLAG_NO_BLINDING 0x00000001
 
-#if 0
-#define PUBKEY_USAGE_SIG     1     /* key is good for signatures */
-#define PUBKEY_USAGE_ENC     2     /* key is good for encryption */
-#endif
-
-#define DIGEST_ALGO_MD5       1
-#define DIGEST_ALGO_SHA1      2
-#define DIGEST_ALGO_RMD160    3
-#define DIGEST_ALGO_TIGER     6
-
-#define is_RSA(a)     ((a)==PUBKEY_ALGO_RSA || (a)==PUBKEY_ALGO_RSA_E \
-                      || (a)==PUBKEY_ALGO_RSA_S )
-#define is_ELGAMAL(a) ((a)==PUBKEY_ALGO_ELGAMAL || (a)==PUBKEY_ALGO_ELGAMAL_E)
+#define is_RSA(a)     ((a)==GCRY_PK_RSA || (a)==GCRY_PK_RSA_E \
+                      || (a)==GCRY_PK_RSA_S )
+#define is_ELGAMAL(a) ((a)==GCRY_PK_ELG || (a)==GCRY_PK_ELG_E)
 
 
 /*-- rmd160.c --*/
@@ -82,7 +52,33 @@ void _gcry_register_primegen_progress (void (*cb)(void *,const char *,
                                                 int,int,int),
                                        void *cb_data );
 
-
+/* Declarations for the cipher specifications.  */
+extern GcryCipherSpec cipher_spec_blowfish;
+extern GcryCipherSpec cipher_spec_des;
+extern GcryCipherSpec cipher_spec_tripledes;
+extern GcryCipherSpec cipher_spec_arcfour;
+extern GcryCipherSpec cipher_spec_cast5;
+extern GcryCipherSpec cipher_spec_aes;
+extern GcryCipherSpec cipher_spec_aes192;
+extern GcryCipherSpec cipher_spec_aes256;
+extern GcryCipherSpec cipher_spec_twofish;
+extern GcryCipherSpec cipher_spec_twofish128;
+
+/* Declarations for the digest specifications.  */
+extern GcryDigestSpec digest_spec_crc32;
+extern GcryDigestSpec digest_spec_crc32_rfc1510;
+extern GcryDigestSpec digest_spec_crc24_rfc2440;
+extern GcryDigestSpec digest_spec_md4;
+extern GcryDigestSpec digest_spec_md5;
+extern GcryDigestSpec digest_spec_rmd160;
+extern GcryDigestSpec digest_spec_sha1;
+extern GcryDigestSpec digest_spec_sha256;
+extern GcryDigestSpec digest_spec_tiger;
+
+/* Declarations for the pubkey cipher specifications.  */
+extern GcryPubkeySpec pubkey_spec_rsa;
+extern GcryPubkeySpec pubkey_spec_elg;
+extern GcryPubkeySpec pubkey_spec_dsa;
 
 #endif /*G10_CIPHER_H*/
 
index b8252ca..09d9e92 100644 (file)
@@ -203,4 +203,35 @@ void _gcry_burn_stack (int bytes);
                       || (*(a) >= 'A' && *(a) <= 'F')  \
                       || (*(a) >= 'a' && *(a) <= 'f'))
 
+/* Management for ciphers/digests/pubkey-ciphers.  */
+
+/* Structure for each registered `module'.  */
+struct gcry_module
+{
+  struct gcry_module *next;     /* List pointers.      */
+  struct gcry_module **prevp;
+  void *spec;                  /* The acctual specs.  */
+  int flags;                   /* Associated flags.   */
+  int counter;                 /* Use counter.        */
+};
+
+/* Flags for the `flags' member of GcryModule.  */
+#define FLAG_MODULE_DISABLED 1 << 0
+
+int _gcry_module_add (GcryModule **entries, void *spec,
+                     GcryModule **module);
+
+typedef int (*GcryModuleLookup) (void *spec, void *data);
+
+/* Internal function.  Lookup a module specification.  */
+GcryModule *_gcry_module_lookup (GcryModule *entries, void *data,
+                                GcryModuleLookup func);
+
+/* Public function.  Release a module.  In case the use-counter
+   reaches zero, destroy the module.  */
+void _gcry_module_release (GcryModule *entry);
+
+/* Public function.  Add a reference to a module.  */
+void _gcry_module_use (GcryModule *module);
+
 #endif /* G10LIB_H */
index f75fac9..c53e4b1 100644 (file)
@@ -503,6 +503,9 @@ struct gcry_cipher_handle;
 typedef struct gcry_cipher_handle *GCRY_CIPHER_HD;
 typedef struct gcry_cipher_handle *GcryCipherHd;
 
+/* Forward declaration.  */
+typedef struct gcry_module GcryModule;
+
 /* All symmetric encryption algorithms are identified by their IDs.
    More IDs may be registered at runtime. */
 enum gcry_cipher_algos
@@ -983,7 +986,6 @@ void  gcry_free (void *a);
 /* Return true if A is allocated in "secure" memory. */
 int gcry_is_secure (const void *a) _GCRY_GCC_ATTR_PURE;
 
-
 #ifndef GCRYPT_NO_MPI_MACROS
 # ifndef DID_MPI_TYPEDEF
     typedef struct gcry_mpi *MPI;
@@ -991,6 +993,85 @@ int gcry_is_secure (const void *a) _GCRY_GCC_ATTR_PURE;
 # endif
 #endif /* GCRYPT_NO_MPI_MACROS */
 
+typedef struct gcry_pubkey_spec
+{
+  const char *name;
+  int id;
+  int npkey;
+  int nskey;
+  int nenc;
+  int nsig;
+  int use;
+  int (*generate) (int algo, unsigned int nbits, unsigned long use_e,
+                  GcryMPI *skey, GcryMPI **retfactors);
+  int (*check_secret_key) (int algo, GcryMPI *skey);
+  int (*encrypt) (int algo, GcryMPI *resarr, GcryMPI data, GcryMPI *pkey, int flags);
+  int (*decrypt) (int algo, GcryMPI *result, GcryMPI *data, GcryMPI *skey, int flags);
+  int (*sign) (int algo, GcryMPI *resarr, GcryMPI data, GcryMPI *skey);
+  int (*verify) (int algo, GcryMPI hash, GcryMPI *data, GcryMPI *pkey,
+                int (*cmp)(void *, GcryMPI), void *opaquev);
+  unsigned (*get_nbits) (int algo, GcryMPI *pkey);
+} GcryPubkeySpec;
+
+typedef struct gcry_digest_spec
+{
+  const char *name;
+  int id;
+  unsigned char *asnoid;
+  int asnlen;
+  int mdlen;
+  void (*init) (void *c);
+  void (*write) (void *c, unsigned char *buf, size_t nbytes);
+  void (*final) (void *c);
+  unsigned char *(*read) (void *c);
+  size_t contextsize; /* allocate this amount of context */
+} GcryDigestSpec;
+
+typedef struct gcry_cipher_spec
+{
+  const char *name;
+  int id;
+  size_t blocksize;
+  size_t keylen;
+  size_t contextsize;
+  int  (*setkey) (void *c, const unsigned char *key, unsigned keylen);
+  void (*encrypt) (void *c, unsigned char *outbuf, const unsigned char *inbuf);
+  void (*decrypt) (void *c, unsigned char *outbuf, const unsigned char *inbuf);
+  void (*stencrypt) (void *c, unsigned char *outbuf, const unsigned char *inbuf,
+                    unsigned int n);
+  void (*stdecrypt) (void *c, unsigned char *outbuf, const unsigned char *inbuf,
+                    unsigned int n);
+} GcryCipherSpec;
+
+
+/* Public function.  Register a provided CIPHER.  Returns zero on
+   success, in which case the chosen cipher ID has been stored in
+   CIPHER, or an error code.  */
+int gcry_cipher_register (GcryCipherSpec *cipher, GcryModule **module);
+
+/* Public function.  Unregister the cipher identified by ID, which must have been
+   registered with gcry_cipher_register.  */
+void gcry_cipher_unregister (GcryModule *module);
+
+/* Public function.  Register a provided CIPHER.  Returns zero on
+   success, in which case the chosen cipher ID has been stored in
+   CIPHER, or an error code.  */
+int gcry_digest_register (GcryDigestSpec *digest, GcryModule **module);
+
+/* Public function.  Unregister the digest identified by ID, which must have been
+   registered with gcry_digest_register.  */
+void gcry_digest_unregister (GcryModule *module);
+
+/* Public function.  Register a provided PUBKEY.  Returns zero on
+   success, in which case the chosen pubkey ID has been stored in
+   PUBKEY, or an error code.  */
+int gcry_pubkey_register (GcryPubkeySpec *pubkey, GcryModule **module);
+
+/* Public function.  Unregister the pubkey identified by ID, which must have been
+   registered with gcry_pubkey_register.  */
+void gcry_pubkey_unregister (GcryModule *module);
+
+
 #ifdef __cplusplus
 }
 #endif
index 5d42e48..71ffc66 100644 (file)
@@ -612,8 +612,12 @@ void
 gcry_set_progress_handler (void (*cb)(void *,const char*,int, int, int),
                            void *cb_data)
 {
+#if USE_DSA
   _gcry_register_pk_dsa_progress (cb, cb_data);
+#endif
+#if USE_ELGAMAL
   _gcry_register_pk_elg_progress (cb, cb_data);
+#endif
   _gcry_register_primegen_progress (cb, cb_data);
   _gcry_register_random_progress (cb, cb_data);
 }
index 031488c..5e1acba 100644 (file)
 PGM=libgcrypt-config
 libs="@LIBGCRYPT_CONFIG_LIBS@"
 cflags="@LIBGCRYPT_CONFIG_CFLAGS@"
+ciphers="@LIBGCRYPT_CIPHERS@"
+pubkey_ciphers="@LIBGCRYPT_PUBKEY_CIPHERS@"
+digests="@LIBGCRYPT_DIGESTS@"
+
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 includes=""
@@ -20,6 +24,7 @@ exec_prefix_set=no
 echo_libs=no
 echo_cflags=no
 echo_prefix=no
+echo_algorithms=no
 echo_exec_prefix=no
 
 
@@ -33,6 +38,7 @@ Options:
        [--version]
        [--libs]
        [--cflags]
+       [--algorithms]
 EOF
        exit $1
 }
@@ -74,6 +80,9 @@ while test $# -gt 0; do
     --libs)
       echo_libs=yes
       ;;
+    --algorithms)
+      echo_algorithms=yes
+      ;;
     *)
       usage 1 1>&2
       ;;
@@ -112,3 +121,9 @@ if test "$echo_libs" = "yes"; then
     fi
     echo $libdirs $libs
 fi
+
+if test "$echo_algorithms" = "yes"; then
+    echo "Symmetric cipher algorithms: $ciphers"
+    echo "Public-key cipher algorithms: $pubkey_ciphers"
+    echo "Message digest algorithms: $digests"
+fi
diff --git a/src/module.c b/src/module.c
new file mode 100644 (file)
index 0000000..9095f09
--- /dev/null
@@ -0,0 +1,104 @@
+/* module.c - Module management for libgcrypt.
+ * Copyright (C) 2003 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt 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.
+ *
+ * Libgcrypt 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 along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <assert.h>
+#include <config.h>
+#include "g10lib.h"
+
+/* Public function.  Add a module specification to the list ENTRIES.
+   The new module has it's use-counter set to one.  */
+int
+_gcry_module_add (GcryModule **entries, void *spec,
+                 GcryModule **module)
+{
+  GcryModule *entry;
+  int err = 0;
+
+  entry = gcry_malloc (sizeof (GcryModule));
+  if (! entry)
+    err = GCRYERR_NO_MEM;
+  else
+    {
+      /* Fill new module entry.  */
+      entry->flags = 0;
+      entry->counter = 1;
+      entry->spec = spec;
+
+      /* Link it into the list.  */
+      entry->next = *entries;
+      entry->prevp = entries;
+      if (*entries)
+       (*entries)->prevp = &entry->next;
+      *entries = entry;
+
+      /* And give it to the caller.  */
+      if (module)
+       *module = entry;
+    }
+  return err;
+}
+
+/* Internal function.  Unlink CIPHER_ENTRY from the list of registered
+   ciphers and destroy it.  */
+static void
+_gcry_module_drop (GcryModule *entry)
+{
+  *entry->prevp = entry->next;
+  if (entry->next)
+    entry->next->prevp = entry->prevp;
+
+  gcry_free (entry);
+}
+
+/* Public function.  Lookup a module specification.  After a
+   successfull lookup, the module has it's resource counter
+   incremented.  FUNC is a function provided by the caller, which is
+   responsible for identifying the wanted module.  */
+GcryModule *
+_gcry_module_lookup (GcryModule *entries, void *data,
+                    GcryModuleLookup func)
+{
+  GcryModule *entry;
+
+  for (entry = entries; entry; entry = entry->next)
+    if ((*func) (entry->spec, data))
+      {
+       entry->counter++;
+       break;
+      }
+
+  return entry;
+}
+
+/* Public function.  Release a module.  In case the use-counter
+   reaches zero, destroy the module.  */
+void
+_gcry_module_release (GcryModule *module)
+{
+  if (! --module->counter)
+    _gcry_module_drop (module);
+}
+
+/* Public function.  Add a reference to a module.  */
+void
+_gcry_module_use (GcryModule *module)
+{
+  ++module->counter;
+}