Fixed version number
[libgcrypt.git] / src / gcrypt.h
index 0f86ef1..b691102 100644 (file)
@@ -31,7 +31,7 @@
 
 #ifdef __cplusplus
 extern "C" {
-#if 0 /* keep Emacsens's auto-indent happy */
+#if 0 /* keep Emacsens' auto-indent happy */
 }
 #endif
 #endif
@@ -42,7 +42,7 @@ extern "C" {
    autoconf (using the AM_PATH_GCRYPT macro) check that this header
    matches the installed library.  Note: Do not edit the next line as
    configure may fix the string here.  */
-#define GCRYPT_VERSION "1.1.42-cvs"
+#define GCRYPT_VERSION "1.1.44"
 
 /* Internal: We can't use the convenience macros for the multi
    precision integer functions when building this library. */
@@ -53,7 +53,7 @@ extern "C" {
 #endif
 
 /* We want to use gcc attributes when possible.  Warning: Don't use
-   these macros in your progranms: As indicated by the leading
+   these macros in your programs: As indicated by the leading
    underscore they are subject to change without notice. */
 #ifdef __GNUC__
 
@@ -91,7 +91,7 @@ typedef gpg_error_t gcry_error_t;
 typedef gpg_err_code_t gcry_err_code_t;
 typedef gpg_err_source_t gcry_err_source_t;
 
-static __inline__ gcry_error_t
+static GPG_ERR_INLINE gcry_error_t
 gcry_err_make (gcry_err_source_t source, gcry_err_code_t code)
 {
   return gpg_err_make (source, code);
@@ -103,20 +103,20 @@ gcry_err_make (gcry_err_source_t source, gcry_err_code_t code)
 #define GCRY_ERR_SOURCE_DEFAULT  GPG_ERR_SOURCE_USER_1
 #endif
 
-static __inline__ gcry_error_t
+static GPG_ERR_INLINE gcry_error_t
 gcry_error (gcry_err_code_t code)
 {
   return gcry_err_make (GCRY_ERR_SOURCE_DEFAULT, code);
 }
 
-static __inline__ gcry_err_code_t
+static GPG_ERR_INLINE gcry_err_code_t
 gcry_err_code (gcry_error_t err)
 {
   return gpg_err_code (err);
 }
 
 
-static __inline__ gcry_err_source_t
+static GPG_ERR_INLINE gcry_err_source_t
 gcry_err_source (gcry_error_t err)
 {
   return gpg_err_source (err);
@@ -130,6 +130,22 @@ const char * gcry_strerror (gcry_error_t err);
    source in the error value ERR.  */
 const char *gcry_strsource (gcry_error_t err);
 
+/* Retrieve the error code for the system error ERR.  This returns
+   GPG_ERR_UNKNOWN_ERRNO if the system error is not mapped (report
+   this).  */
+gcry_err_code_t gcry_err_code_from_errno (int err);
+
+/* Retrieve the system error for the error code CODE.  This returns 0
+   if CODE is not a system error code.  */
+int gcry_err_code_to_errno (gcry_err_code_t code);
+
+/* Return an error value with the error source SOURCE and the system
+   error ERR.  */
+gcry_error_t gcry_err_make_from_errno (gcry_err_source_t source, int err);
+
+/* Return an error value with the system error ERR.  */
+gcry_err_code_t gcry_error_from_errno (int err);
+
 /* The data object used to hold a multi precision integer.  */
 struct gcry_mpi;
 typedef struct gcry_mpi *gcry_mpi_t;
@@ -139,9 +155,6 @@ typedef struct gcry_mpi *GcryMPI _GCRY_GCC_ATTR_DEPRECATED;
 
 \f
 
-/* This type represents a `module'.  */
-typedef struct gcry_module *gcry_module_t;
-
 /* Check that the library fulfills the version requirement.  */
 const char *gcry_check_version (const char *req_version);
 
@@ -193,13 +206,13 @@ enum gcry_ctl_cmds
     GCRYCTL_SET_CBC_MAC = 42,
     GCRYCTL_SET_CTR = 43,
     GCRYCTL_ENABLE_QUICK_RANDOM = 44,
+    GCRYCTL_SET_RANDOM_SEED_FILE = 45,
+    GCRYCTL_UPDATE_RANDOM_SEED_FILE = 46
   };
 
 /* Perform various operations defined by CMD. */
 gcry_error_t gcry_control (enum gcry_ctl_cmds CMD, ...);
 
-const char *gcry_strerror (gcry_error_t ec);
-
 \f
 /* S-expression management. */ 
 
@@ -382,7 +395,7 @@ int gcry_mpi_cmp_ui (const gcry_mpi_t u, unsigned long v);
    RET_MPI.  If NSCANNED is not NULL, it will receive the number of
    bytes actually scanned after a successful operation. */
 gcry_error_t gcry_mpi_scan (gcry_mpi_t *ret_mpi, enum gcry_mpi_format format,
-                            const char *buffer, size_t buflen, 
+                            const unsigned char *buffer, size_t buflen, 
                             size_t *nscanned);
 
 /* Convert the big integer A into the external representation
@@ -391,7 +404,8 @@ gcry_error_t gcry_mpi_scan (gcry_mpi_t *ret_mpi, enum gcry_mpi_format format,
    receives the actual length of the external representation unless it
    has been passed as NULL. */
 gcry_error_t gcry_mpi_print (enum gcry_mpi_format format,
-                             char *buffer, size_t buflen, size_t *nwritten,
+                             unsigned char *buffer, size_t buflen,
+                             size_t *nwritten,
                              const gcry_mpi_t a);
 
 /* Convert the big integer A int the external representation described
@@ -399,7 +413,7 @@ gcry_error_t gcry_mpi_print (enum gcry_mpi_format format,
    will be put into BUFFER.  NWRITTEN receives the actual lengths of the
    external representation. */
 gcry_error_t gcry_mpi_aprint (enum gcry_mpi_format format,
-                              void **buffer, size_t *nwritten,
+                              unsigned char **buffer, size_t *nwritten,
                               const gcry_mpi_t a);
 
 /* Dump the value of A in a format suitable for debugging to
@@ -714,66 +728,6 @@ size_t gcry_cipher_get_algo_blklen (int algo);
    *LIST_LENGTH, *LIST_LENGTH is updated to the correct number.  */
 gcry_error_t gcry_cipher_list (int *list, int *list_length);
 
-/* Type for the cipher_setkey function.  */
-typedef gcry_err_code_t (*gcry_cipher_setkey_t) (void *c,
-                                               const unsigned char *key,
-                                               unsigned keylen);
-
-/* Type for the cipher_encrypt function.  */
-typedef void (*gcry_cipher_encrypt_t) (void *c,
-                                      unsigned char *outbuf,
-                                      const unsigned char *inbuf);
-
-/* Type for the cipher_decrypt function.  */
-typedef void (*gcry_cipher_decrypt_t) (void *c,
-                                      unsigned char *outbuf,
-                                      const unsigned char *inbuf);
-
-/* Type for the cipher_stencrypt function.  */
-typedef void (*gcry_cipher_stencrypt_t) (void *c,
-                                        unsigned char *outbuf,
-                                        const unsigned char *inbuf,
-                                        unsigned int n);
-
-/* Type for the cipher_stdecrypt function.  */
-typedef void (*gcry_cipher_stdecrypt_t) (void *c,
-                                        unsigned char *outbuf,
-                                        const unsigned char *inbuf,
-                                        unsigned int n);
-
-typedef struct gcry_cipher_oid_spec
-{
-  const char *oid;
-  int mode;
-} gcry_cipher_oid_spec_t;
-
-/* Module specification structure for ciphers.  */
-typedef struct gcry_cipher_spec
-{
-  const char *name;
-  const char **aliases;
-  gcry_cipher_oid_spec_t *oids;
-  size_t blocksize;
-  size_t keylen;
-  size_t contextsize;
-  gcry_cipher_setkey_t setkey;
-  gcry_cipher_encrypt_t encrypt;
-  gcry_cipher_decrypt_t decrypt;
-  gcry_cipher_stencrypt_t stencrypt;
-  gcry_cipher_stdecrypt_t stdecrypt;
-} gcry_cipher_spec_t;
-
-/* Register a new cipher module whose specification can be found in
-   CIPHER.  On success, a new algorithm ID is stored in ALGORITHM_ID
-   and a pointer representhing this module is stored in MODULE.  */
-gcry_error_t gcry_cipher_register (gcry_cipher_spec_t *cipher,
-                                 unsigned int *algorithm_id,
-                                 gcry_module_t *module);
-
-/* Unregister the cipher identified by MODULE, which must have been
-   registered with gcry_cipher_register.  */
-void gcry_cipher_unregister (gcry_module_t module);
-
 \f
 /************************************
  *                                  *
@@ -811,7 +765,7 @@ gcry_error_t gcry_pk_sign (gcry_sexp_t *result, gcry_sexp_t data, gcry_sexp_t sk
 /* Check the signature SIGVAL on DATA using the public key PKEY. */
 gcry_error_t gcry_pk_verify (gcry_sexp_t sigval, gcry_sexp_t data, gcry_sexp_t pkey);
 
-/* Check that KEY (either private or public) is sane. */
+/* Check that private KEY is sane. */
 gcry_error_t gcry_pk_testkey (gcry_sexp_t key);
 
 /* Generate a new key pair according to the parameters given in
@@ -854,79 +808,6 @@ unsigned char *gcry_pk_get_keygrip (gcry_sexp_t key, unsigned char *array);
    *LIST_LENGTH, *LIST_LENGTH is updated to the correct number.  */
 gcry_error_t gcry_pk_list (int *list, int *list_length);
 
-/* Type for the pk_generate function.  */
-typedef gcry_err_code_t (*gcry_pk_generate_t) (int algo,
-                                             unsigned int nbits,
-                                             unsigned long use_e,
-                                             gcry_mpi_t *skey,
-                                             gcry_mpi_t **retfactors);
-
-/* Type for the pk_check_secret_key function.  */
-typedef gcry_err_code_t (*gcry_pk_check_secret_key_t) (int algo,
-                                                     gcry_mpi_t *skey);
-
-/* Type for the pk_encrypt function.  */
-typedef gcry_err_code_t (*gcry_pk_encrypt_t) (int algo,
-                                            gcry_mpi_t *resarr,
-                                            gcry_mpi_t data,
-                                            gcry_mpi_t *pkey,
-                                            int flags);
-
-/* Type for the pk_decrypt function.  */
-typedef gcry_err_code_t (*gcry_pk_decrypt_t) (int algo,
-                                            gcry_mpi_t *result,
-                                            gcry_mpi_t *data,
-                                            gcry_mpi_t *skey,
-                                            int flags);
-
-/* Type for the pk_sign function.  */
-typedef gcry_err_code_t (*gcry_pk_sign_t) (int algo,
-                                         gcry_mpi_t *resarr,
-                                         gcry_mpi_t data,
-                                         gcry_mpi_t *skey);
-
-/* Type for the pk_verify function.  */
-typedef gcry_err_code_t (*gcry_pk_verify_t) (int algo,
-                                           gcry_mpi_t hash,
-                                           gcry_mpi_t *data,
-                                           gcry_mpi_t *pkey,
-                                           int (*cmp) (void *, gcry_mpi_t),
-                                           void *opaquev);
-
-/* Type for the pk_get_nbits function.  */
-typedef unsigned (*gcry_pk_get_nbits_t) (int algo, gcry_mpi_t *pkey);
-
-/* Module specification structure for message digests.  */
-typedef struct gcry_pk_spec
-{
-  const char *name;
-  char **aliases;
-  const char *elements_pkey;
-  const char *elements_skey;
-  const char *elements_enc;
-  const char *elements_sig;
-  const char *elements_grip;
-  int use;
-  gcry_pk_generate_t generate;
-  gcry_pk_check_secret_key_t check_secret_key;
-  gcry_pk_encrypt_t encrypt;
-  gcry_pk_decrypt_t decrypt;
-  gcry_pk_sign_t sign;
-  gcry_pk_verify_t verify;
-  gcry_pk_get_nbits_t get_nbits;
-} gcry_pk_spec_t;
-
-/* Register a new pubkey module whose specification can be found in
-   PUBKEY.  On success, a new algorithm ID is stored in ALGORITHM_ID
-   and a pointer representhing this module is stored in MODULE.  */
-gcry_error_t gcry_pk_register (gcry_pk_spec_t *pubkey,
-                             unsigned int *algorithm_id,
-                             gcry_module_t *module);
-
-/* Unregister the pubkey identified by ID, which must have been
-   registered with gcry_pk_register.  */
-void gcry_pk_unregister (gcry_module_t module);
-
 /* Alternative interface for asymetric cryptography.  */
 
 /* The algorithm IDs. */
@@ -935,6 +816,7 @@ typedef enum gcry_ac_id
     GCRY_AC_RSA = 1,
     GCRY_AC_DSA = 17,
     GCRY_AC_ELG = 20,
+    GCRY_AC_ELG_E = 16,
   }
 gcry_ac_id_t;
 
@@ -997,9 +879,9 @@ unsigned int gcry_ac_data_length (gcry_ac_data_t data);
 gcry_error_t gcry_ac_data_get_name (gcry_ac_data_t data, const char *name,
                                   gcry_mpi_t *mpi);
 
-/* Return the MPI value with index INDEX contained in the data set
+/* Return the MPI value with index IDX contained in the data set
    DATA.  */
-gcry_error_t gcry_ac_data_get_index (gcry_ac_data_t data, unsigned int index,
+gcry_error_t gcry_ac_data_get_index (gcry_ac_data_t data, unsigned int idx,
                                    const char **name, gcry_mpi_t *mpi);
 
 /* Destroy any values contained in the data set DATA.  */
@@ -1120,12 +1002,14 @@ enum gcry_md_algos
     GCRY_MD_CRC24_RFC2440      = 304
   };
 
-/* Flags used with the open function. */
-
-/* Allocate all buffers in "secure" memory.  */
-#define GCRY_MD_FLAG_SECURE 1 << 0
-/* Make an HMAC out of this algorithm.  */
-#define GCRY_MD_FLAG_HMAC   1 << 1
+/* Flags used with the open function.  */
+enum gcry_md_flags
+  {
+    GCRY_MD_FLAG_SECURE = 1,  /* Allocate all buffers in "secure"
+                                memory.  */
+    GCRY_MD_FLAG_HMAC  = 2   /* Make an HMAC out of this
+                                algorithm.  */
+  };
 
 /* Forward declaration.  */
 struct gcry_md_context;
@@ -1268,50 +1152,6 @@ gcry_error_t gcry_md_setkey (gcry_md_hd_t hd, const void *key, size_t keylen);
    number.  */
 gcry_error_t gcry_md_list (int *list, int *list_length);
 
-/* Type for the md_init function.  */
-typedef void (*gcry_md_init_t) (void *c);
-
-/* Type for the md_write function.  */
-typedef void (*gcry_md_write_t) (void *c, unsigned char *buf, size_t nbytes);
-
-/* Type for the md_final function.  */
-typedef void (*gcry_md_final_t) (void *c);
-
-/* Type for the md_read function.  */
-typedef unsigned char *(*gcry_md_read_t) (void *c);
-
-typedef struct gcry_md_oid_spec
-{
-  const char *oidstring;
-} gcry_md_oid_spec_t;
-
-/* Module specification structure for message digests.  */
-typedef struct gcry_md_spec
-{
-  const char *name;
-  unsigned char *asnoid;
-  int asnlen;
-  gcry_md_oid_spec_t *oids;
-  int mdlen;
-  gcry_md_init_t init;
-  gcry_md_write_t write;
-  gcry_md_final_t final;
-  gcry_md_read_t read;
-  size_t contextsize; /* allocate this amount of context */
-} gcry_md_spec_t;
-
-/* Register a new digest module whose specification can be found in
-   DIGEST.  On success, a new algorithm ID is stored in ALGORITHM_ID
-   and a pointer representhing this module is stored in MODULE.  */
-gcry_error_t gcry_md_register (gcry_md_spec_t *digest,
-                             unsigned int *algorithm_id,
-                             gcry_module_t *module);
-
-/* Unregister the digest identified by ID, which must have been
-   registered with gcry_digest_register.  */
-void gcry_md_unregister (gcry_module_t module);
-
-
 \f
 /************************************
  *                                  *
@@ -1323,13 +1163,13 @@ void gcry_md_unregister (gcry_module_t module);
    to use WEAK for random number which don't need to be
    cryptographically strong, STRONG for session keys and VERY_STRONG
    for key material. */
-enum gcry_random_level
+typedef enum gcry_random_level
   {
     GCRY_WEAK_RANDOM = 0,
     GCRY_STRONG_RANDOM = 1,
     GCRY_VERY_STRONG_RANDOM = 2
-  };
-
+  }
+gcry_random_level_t;
 
 /* Fill BUFFER with LENGTH bytes of random, using random numbers of
    quality LEVEL. */
@@ -1359,6 +1199,51 @@ void *gcry_random_bytes_secure (size_t nbytes, enum gcry_random_level level)
 void gcry_mpi_randomize (gcry_mpi_t w,
                          unsigned int nbits, enum gcry_random_level level);
 
+/* Prime interface.  */
+
+typedef int (*gcry_prime_check_func_t) (void *arg, int mode,
+                                       gcry_mpi_t candidate);
+
+/* Flags for gcry_prime_generate():  */
+
+/* Allocate prime numbers and factors in secure memory.  */
+#define GCRY_PRIME_FLAG_SECRET         (1 << 0)
+
+/* Make sure that at least one prime factor is of size
+   `FACTOR_BITS'.  */
+#define GCRY_PRIME_FLAG_SPECIAL_FACTOR (1 << 1)
+
+/* Generate a new prime number of PRIME_BITS bits and store it in
+   PRIME.  If FACTOR_BITS is non-zero, one of the prime factors of
+   (prime - 1) / 2 must be FACTOR_BITS bits long.  If FACTORS is
+   non-zero, allocate a new, NULL-terminated array holding the prime
+   factors and store it in FACTORS.  FLAGS might be used to influence
+   the prime number generation process.  */
+gcry_error_t gcry_prime_generate (gcry_mpi_t *prime,
+                                 unsigned int prime_bits,
+                                 unsigned int factor_bits,
+                                 gcry_mpi_t **factors,
+                                 gcry_prime_check_func_t cb_func,
+                                 void *cb_arg,
+                                 gcry_random_level_t random_level,
+                                 unsigned int flags);
+
+/* Find a generator for PRIME where the factorization of (prime-1) is
+   in the NULL terminated array FACTORS. Return the generator as a
+   newly allocated MPI in R_G.  If START_G is not NULL, use this as
+   teh start for the search. */
+gcry_error_t gcry_prime_group_generator (gcry_mpi_t *r_g,
+                                         gcry_mpi_t prime, gcry_mpi_t *factors,
+                                         gcry_mpi_t start_g);
+
+
+/* Convenience function to release the FACTORS array. */
+void gcry_prime_release_factors (gcry_mpi_t *factors);
+
+
+/* Check wether the number X is prime.  */
+gcry_error_t gcry_prime_check (gcry_mpi_t x, unsigned int flags);
+
 
 \f
 /************************************
@@ -1449,7 +1334,10 @@ 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;
 
-#if 0 /* keep Emacsens's auto-indent happy */
+/* Include support for Libgcrypt modules.  */
+#include <gcrypt-module.h>
+
+#if 0 /* keep Emacsens' auto-indent happy */
 {
 #endif
 #ifdef __cplusplus