/* gcrypt-int.h - Internal version of gcrypt.h
 * Copyright (C) 2013 g10 Code GmbH
 *
 * 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, see <http://www.gnu.org/licenses/>.
 */

#ifndef GCRY_GCRYPT_INT_H
#define GCRY_GCRYPT_INT_H

#ifdef _GCRYPT_H
#error  gcrypt.h already included
#endif

#include "gcrypt.h"
#include "types.h"

/* These error codes are used but not defined in the required
   libgpg-error 1.11.  Define them here. */
#if GPG_ERROR_VERSION_NUMBER < 0x010c00  /* 1.12 */
# define GPG_ERR_NO_CRYPT_CTX	    191
# define GPG_ERR_WRONG_CRYPT_CTX    192
# define GPG_ERR_BAD_CRYPT_CTX	    193
# define GPG_ERR_CRYPT_CTX_CONFLICT 194
# define GPG_ERR_BROKEN_PUBKEY      195
# define GPG_ERR_BROKEN_SECKEY      196
#endif

#if GPG_ERROR_VERSION_NUMBER < 0x010d00  /* 1.13 */
# define GPG_ERR_MAC_ALGO           197
#endif


/* Context used with elliptic curve functions.  */
struct mpi_ec_ctx_s;
typedef struct mpi_ec_ctx_s *mpi_ec_t;



/* Underscore prefixed internal versions of the public functions.
   They return gpg_err_code and not gpg_error_t.  Some macros also
   need an underscore prefixed internal version.

   Note that the memory allocation functions and macros (xmalloc etc.)
   are not defined here but in g10lib.h because this file here is
   included by some test programs which define theie own xmalloc
   macros.  */

gpg_err_code_t _gcry_cipher_open (gcry_cipher_hd_t *handle,
                                  int algo, int mode, unsigned int flags);
void _gcry_cipher_close (gcry_cipher_hd_t h);
gpg_err_code_t _gcry_cipher_ctl (gcry_cipher_hd_t h, int cmd, void *buffer,
                             size_t buflen);
gpg_err_code_t _gcry_cipher_info (gcry_cipher_hd_t h, int what, void *buffer,
                                  size_t *nbytes);
gpg_err_code_t _gcry_cipher_algo_info (int algo, int what, void *buffer,
                                       size_t *nbytes);
const char *_gcry_cipher_algo_name (int algorithm) _GCRY_GCC_ATTR_PURE;
int _gcry_cipher_map_name (const char *name) _GCRY_GCC_ATTR_PURE;
int _gcry_cipher_mode_from_oid (const char *string) _GCRY_GCC_ATTR_PURE;
gpg_err_code_t _gcry_cipher_encrypt (gcry_cipher_hd_t h,
                                     void *out, size_t outsize,
                                     const void *in, size_t inlen);
gpg_err_code_t _gcry_cipher_decrypt (gcry_cipher_hd_t h,
                                     void *out, size_t outsize,
                                     const void *in, size_t inlen);
gcry_err_code_t _gcry_cipher_setkey (gcry_cipher_hd_t hd,
                                     const void *key, size_t keylen);
gcry_err_code_t _gcry_cipher_setiv (gcry_cipher_hd_t hd,
                                    const void *iv, size_t ivlen);
gpg_err_code_t _gcry_cipher_authenticate (gcry_cipher_hd_t hd, const void *abuf,
                                          size_t abuflen);
gpg_err_code_t _gcry_cipher_gettag (gcry_cipher_hd_t hd, void *outtag,
                                    size_t taglen);
gpg_err_code_t _gcry_cipher_checktag (gcry_cipher_hd_t hd, const void *intag,
                                      size_t taglen);
gpg_err_code_t _gcry_cipher_setctr (gcry_cipher_hd_t hd,
                                    const void *ctr, size_t ctrlen);
size_t _gcry_cipher_get_algo_keylen (int algo);
size_t _gcry_cipher_get_algo_blklen (int algo);

#define _gcry_cipher_reset(h)  _gcry_cipher_ctl ((h), GCRYCTL_RESET, NULL, 0)




gpg_err_code_t _gcry_pk_encrypt (gcry_sexp_t *result,
                                 gcry_sexp_t data, gcry_sexp_t pkey);
gpg_err_code_t _gcry_pk_decrypt (gcry_sexp_t *result,
                                 gcry_sexp_t data, gcry_sexp_t skey);
gpg_err_code_t _gcry_pk_sign (gcry_sexp_t *result,
                              gcry_sexp_t data, gcry_sexp_t skey);
gpg_err_code_t _gcry_pk_verify (gcry_sexp_t sigval,
                                gcry_sexp_t data, gcry_sexp_t pkey);
gpg_err_code_t _gcry_pk_testkey (gcry_sexp_t key);
gpg_err_code_t _gcry_pk_genkey (gcry_sexp_t *r_key, gcry_sexp_t s_parms);
gpg_err_code_t _gcry_pk_ctl (int cmd, void *buffer, size_t buflen);
gpg_err_code_t _gcry_pk_algo_info (int algo, int what,
                                   void *buffer, size_t *nbytes);
const char *_gcry_pk_algo_name (int algorithm) _GCRY_GCC_ATTR_PURE;
int _gcry_pk_map_name (const char* name) _GCRY_GCC_ATTR_PURE;
unsigned int _gcry_pk_get_nbits (gcry_sexp_t key) _GCRY_GCC_ATTR_PURE;
unsigned char *_gcry_pk_get_keygrip (gcry_sexp_t key, unsigned char *array);
const char *_gcry_pk_get_curve (gcry_sexp_t key, int iterator,
                                unsigned int *r_nbits);
gcry_sexp_t _gcry_pk_get_param (int algo, const char *name);
gpg_err_code_t _gcry_pubkey_get_sexp (gcry_sexp_t *r_sexp,
                                      int mode, gcry_ctx_t ctx);


gpg_err_code_t _gcry_md_open (gcry_md_hd_t *h, int algo, unsigned int flags);
void _gcry_md_close (gcry_md_hd_t hd);
gpg_err_code_t _gcry_md_enable (gcry_md_hd_t hd, int algo);
gpg_err_code_t _gcry_md_copy (gcry_md_hd_t *bhd, gcry_md_hd_t ahd);
void _gcry_md_reset (gcry_md_hd_t hd);
gpg_err_code_t _gcry_md_ctl (gcry_md_hd_t hd, int cmd,
                          void *buffer, size_t buflen);
void _gcry_md_write (gcry_md_hd_t hd, const void *buffer, size_t length);
unsigned char *_gcry_md_read (gcry_md_hd_t hd, int algo);
void _gcry_md_hash_buffer (int algo, void *digest,
                           const void *buffer, size_t length);
gpg_err_code_t _gcry_md_hash_buffers (int algo, unsigned int flags,
                                      void *digest,
                                      const gcry_buffer_t *iov, int iovcnt);
int _gcry_md_get_algo (gcry_md_hd_t hd);
unsigned int _gcry_md_get_algo_dlen (int algo);
int _gcry_md_is_enabled (gcry_md_hd_t a, int algo);
int _gcry_md_is_secure (gcry_md_hd_t a);
gpg_err_code_t _gcry_md_info (gcry_md_hd_t h, int what, void *buffer,
                          size_t *nbytes);
gpg_err_code_t _gcry_md_algo_info (int algo, int what, void *buffer,
                                size_t *nbytes);
const char *_gcry_md_algo_name (int algo) _GCRY_GCC_ATTR_PURE;
int _gcry_md_map_name (const char* name) _GCRY_GCC_ATTR_PURE;
gpg_err_code_t _gcry_md_setkey (gcry_md_hd_t hd,
                                const void *key, size_t keylen);
void _gcry_md_debug (gcry_md_hd_t hd, const char *suffix);

#define _gcry_md_test_algo(a) \
            _gcry_md_algo_info ((a), GCRYCTL_TEST_ALGO, NULL, NULL)

#define _gcry_md_final(a) \
            _gcry_md_ctl ((a), GCRYCTL_FINALIZE, NULL, 0)

#define _gcry_md_putc(h,c)  \
            do {                                          \
                gcry_md_hd_t h__ = (h);                   \
                if( (h__)->bufpos == (h__)->bufsize )     \
                    _gcry_md_write( (h__), NULL, 0 );     \
                (h__)->buf[(h__)->bufpos++] = (c) & 0xff; \
            } while(0)



gpg_err_code_t _gcry_mac_open (gcry_mac_hd_t *handle, int algo,
                            unsigned int flags, gcry_ctx_t ctx);
void _gcry_mac_close (gcry_mac_hd_t h);
gpg_err_code_t _gcry_mac_ctl (gcry_mac_hd_t h, int cmd, void *buffer,
                           size_t buflen);
gpg_err_code_t _gcry_mac_algo_info (int algo, int what, void *buffer,
                                 size_t *nbytes);
gpg_err_code_t _gcry_mac_setkey (gcry_mac_hd_t hd, const void *key,
                              size_t keylen);
gpg_err_code_t _gcry_mac_setiv (gcry_mac_hd_t hd, const void *iv,
                             size_t ivlen);
gpg_err_code_t _gcry_mac_write (gcry_mac_hd_t hd, const void *buffer,
                             size_t length);
gpg_err_code_t _gcry_mac_read (gcry_mac_hd_t hd, void *buffer, size_t *buflen);
gpg_err_code_t _gcry_mac_verify (gcry_mac_hd_t hd, const void *buffer,
                                 size_t buflen);
unsigned int _gcry_mac_get_algo_maclen (int algo);
unsigned int _gcry_mac_get_algo_keylen (int algo);
const char *_gcry_mac_algo_name (int algorithm) _GCRY_GCC_ATTR_PURE;
int _gcry_mac_map_name (const char *name) _GCRY_GCC_ATTR_PURE;

#define _gcry_mac_reset(h)  _gcry_mac_ctl ((h), GCRYCTL_RESET, NULL, 0)


gpg_err_code_t _gcry_kdf_derive (const void *passphrase, size_t passphraselen,
                                 int algo, int subalgo,
                                 const void *salt, size_t saltlen,
                                 unsigned long iterations,
                                 size_t keysize, void *keybuffer);


gpg_err_code_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);
gpg_err_code_t _gcry_prime_group_generator (gcry_mpi_t *r_g,
                                            gcry_mpi_t prime,
                                            gcry_mpi_t *factors,
                                            gcry_mpi_t start_g);
void _gcry_prime_release_factors (gcry_mpi_t *factors);
gpg_err_code_t _gcry_prime_check (gcry_mpi_t x, unsigned int flags);


void _gcry_randomize (void *buffer, size_t length,
                      enum gcry_random_level level);
gpg_err_code_t _gcry_random_add_bytes (const void *buffer, size_t length,
                                    int quality);
void *_gcry_random_bytes (size_t nbytes, enum gcry_random_level level)
                         _GCRY_GCC_ATTR_MALLOC;
void *_gcry_random_bytes_secure (size_t nbytes, enum gcry_random_level level)
                                _GCRY_GCC_ATTR_MALLOC;
void _gcry_mpi_randomize (gcry_mpi_t w,
                         unsigned int nbits, enum gcry_random_level level);
void _gcry_create_nonce (void *buffer, size_t length);


void _gcry_ctx_release (gcry_ctx_t ctx);


const char *_gcry_check_version (const char *req_version);

void _gcry_set_allocation_handler (gcry_handler_alloc_t func_alloc,
                                  gcry_handler_alloc_t func_alloc_secure,
                                  gcry_handler_secure_check_t func_secure_check,
                                  gcry_handler_realloc_t func_realloc,
                                  gcry_handler_free_t func_free);
void _gcry_set_outofcore_handler (gcry_handler_no_mem_t h, void *opaque);
void _gcry_set_fatalerror_handler (gcry_handler_error_t fnc, void *opaque);
void _gcry_set_log_handler (gcry_handler_log_t f, void *opaque);
void _gcry_set_gettext_handler (const char *(*f)(const char*));
void _gcry_set_progress_handler (gcry_handler_progress_t cb, void *cb_data);


/* Return a pointer to a string containing a description of the error
   code in the error value ERR.  */
static inline const char *
_gcry_strerror (gcry_error_t err)
{
  return gpg_strerror (err);
}

/* Return a pointer to a string containing a description of the error
   source in the error value ERR.  */
static inline const char *
_gcry_strsource (gcry_error_t err)
{
  return gpg_strsource (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).  */
static inline gcry_err_code_t
_gcry_err_code_from_errno (int err)
{
  return gpg_err_code_from_errno (err);
}

/* Retrieve the system error for the error code CODE.  This returns 0
   if CODE is not a system error code.  */
static inline int
_gcry_err_code_to_errno (gcry_err_code_t code)
{
  return gpg_err_code_from_errno (code);
}

/* Return an error value with the error source SOURCE and the system
   error ERR.  */
static inline gcry_err_code_t
_gcry_err_make_from_errno (gpg_err_source_t source, int err)
{
  return gpg_err_make_from_errno (source, err);
}


/* Return an error value with the system error ERR.  */
static inline gcry_err_code_t
_gcry_error_from_errno (int err)
{
  return gpg_error (gpg_err_code_from_errno (err));
}



gpg_err_code_t _gcry_sexp_new (gcry_sexp_t *retsexp,
                               const void *buffer, size_t length,
                               int autodetect);
gpg_err_code_t _gcry_sexp_create (gcry_sexp_t *retsexp,
                                  void *buffer, size_t length,
                                  int autodetect, void (*freefnc) (void *));
gpg_err_code_t _gcry_sexp_sscan (gcry_sexp_t *retsexp, size_t *erroff,
                              const char *buffer, size_t length);
gpg_err_code_t _gcry_sexp_build (gcry_sexp_t *retsexp, size_t *erroff,
                                 const char *format, ...);
gpg_err_code_t _gcry_sexp_build_array (gcry_sexp_t *retsexp, size_t *erroff,
                                       const char *format, void **arg_list);
void _gcry_sexp_release (gcry_sexp_t sexp);
size_t _gcry_sexp_canon_len (const unsigned char *buffer, size_t length,
                            size_t *erroff, gcry_err_code_t *errcode);
size_t _gcry_sexp_sprint (gcry_sexp_t sexp, int mode, void *buffer,
                          size_t maxlength);
void _gcry_sexp_dump (const gcry_sexp_t a);
gcry_sexp_t _gcry_sexp_cons (const gcry_sexp_t a, const gcry_sexp_t b);
gcry_sexp_t _gcry_sexp_alist (const gcry_sexp_t *array);
gcry_sexp_t _gcry_sexp_vlist (const gcry_sexp_t a, ...);
gcry_sexp_t _gcry_sexp_append (const gcry_sexp_t a, const gcry_sexp_t n);
gcry_sexp_t _gcry_sexp_prepend (const gcry_sexp_t a, const gcry_sexp_t n);
gcry_sexp_t _gcry_sexp_find_token (gcry_sexp_t list,
                                   const char *tok, size_t toklen);
int _gcry_sexp_length (const gcry_sexp_t list);
gcry_sexp_t _gcry_sexp_nth (const gcry_sexp_t list, int number);
gcry_sexp_t _gcry_sexp_car (const gcry_sexp_t list);
gcry_sexp_t _gcry_sexp_cdr (const gcry_sexp_t list);
gcry_sexp_t _gcry_sexp_cadr (const gcry_sexp_t list);
const char *_gcry_sexp_nth_data (const gcry_sexp_t list, int number,
                                 size_t *datalen);
void *_gcry_sexp_nth_buffer (const gcry_sexp_t list, int number,
                             size_t *rlength);
char *_gcry_sexp_nth_string (gcry_sexp_t list, int number);
gcry_mpi_t _gcry_sexp_nth_mpi (gcry_sexp_t list, int number, int mpifmt);
gpg_err_code_t _gcry_sexp_extract_param (gcry_sexp_t sexp,
                                         const char *path,
                                         const char *list,
                                         ...) _GCRY_GCC_ATTR_SENTINEL(0);

#define sexp_new(a, b, c, d)         _gcry_sexp_new ((a), (b), (c), (d))
#define sexp_create(a, b, c, d, e)   _gcry_sexp_create ((a), (b), (c), (d), (e))
#define sexp_sscan(a, b, c, d)       _gcry_sexp_sscan ((a), (b), (c), (d))
#define sexp_build                   _gcry_sexp_build
#define sexp_build_array(a, b, c, d) _gcry_sexp_build_array ((a), (b), (c), (d))
#define sexp_release(a)              _gcry_sexp_release ((a))
#define sexp_canon_len(a, b, c, d)   _gcry_sexp_canon_len ((a), (b), (c), (d))
#define sexp_sprint(a, b, c, d)      _gcry_sexp_sprint ((a), (b), (c), (d))
#define sexp_dump(a)                 _gcry_sexp_dump ((a))
#define sexp_cons(a, b)              _gcry_sexp_cons ((a), (b))
#define sexp_alist(a)                _gcry_sexp_alist ((a))
#define sexp_vlist                   _gcry_sexp_vlist
#define sexp_append(a, b)            _gcry_sexp_append ((a), (b))
#define sexp_prepend(a, b)           _gcry_sexp_prepend ((a), (b))
#define sexp_find_token(a, b, c)     _gcry_sexp_find_token ((a), (b), (c))
#define sexp_length(a)               _gcry_sexp_length ((a))
#define sexp_nth(a, b)               _gcry_sexp_nth ((a), (b))
#define sexp_car(a)                  _gcry_sexp_car ((a))
#define sexp_cdr(a)                  _gcry_sexp_cdr ((a))
#define sexp_cadr(a)                 _gcry_sexp_cadr ((a))
#define sexp_nth_data(a, b, c)       _gcry_sexp_nth_data ((a), (b), (c))
#define sexp_nth_buffer(a, b, c)     _gcry_sexp_nth_buffer ((a), (b), (c))
#define sexp_nth_string(a, b)        _gcry_sexp_nth_string ((a), (b))
#define sexp_nth_mpi(a, b, c)        _gcry_sexp_nth_mpi ((a), (b), (c))
#define sexp_extract_param           _gcry_sexp_extract_param



gcry_mpi_t _gcry_mpi_new (unsigned int nbits);
gcry_mpi_t _gcry_mpi_snew (unsigned int nbits);
void _gcry_mpi_release (gcry_mpi_t a);
gcry_mpi_t _gcry_mpi_copy (const gcry_mpi_t a);
void _gcry_mpi_snatch (gcry_mpi_t w, gcry_mpi_t u);
gcry_mpi_t _gcry_mpi_set (gcry_mpi_t w, const gcry_mpi_t u);
gcry_mpi_t _gcry_mpi_set_ui (gcry_mpi_t w, unsigned long u);
gcry_err_code_t _gcry_mpi_get_ui (gcry_mpi_t w, ulong *u);
void _gcry_mpi_swap (gcry_mpi_t a, gcry_mpi_t b);
int _gcry_mpi_is_neg (gcry_mpi_t a);
void _gcry_mpi_neg (gcry_mpi_t w, gcry_mpi_t u);
void _gcry_mpi_abs (gcry_mpi_t w);
int _gcry_mpi_cmp (const gcry_mpi_t u, const gcry_mpi_t v);
int _gcry_mpi_cmp_ui (const gcry_mpi_t u, unsigned long v);
gpg_err_code_t _gcry_mpi_scan (gcry_mpi_t *ret_mpi, enum gcry_mpi_format format,
                              const void *buffer, size_t buflen,
                              size_t *nscanned);
gpg_err_code_t _gcry_mpi_print (enum gcry_mpi_format format,
                               unsigned char *buffer, size_t buflen,
                               size_t *nwritten,
                               const gcry_mpi_t a);
gpg_err_code_t _gcry_mpi_aprint (enum gcry_mpi_format format,
                                unsigned char **buffer, size_t *nwritten,
                                const gcry_mpi_t a);
void _gcry_mpi_dump (const gcry_mpi_t a);
void _gcry_mpi_add (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v);
void _gcry_mpi_add_ui (gcry_mpi_t w, gcry_mpi_t u, unsigned long v);
void _gcry_mpi_addm (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m);
void _gcry_mpi_sub (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v);
void _gcry_mpi_sub_ui (gcry_mpi_t w, gcry_mpi_t u, unsigned long v );
void _gcry_mpi_subm (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m);
void _gcry_mpi_mul (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v);
void _gcry_mpi_mul_ui (gcry_mpi_t w, gcry_mpi_t u, unsigned long v );
void _gcry_mpi_mulm (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m);
void _gcry_mpi_mul_2exp (gcry_mpi_t w, gcry_mpi_t u, unsigned long cnt);
void _gcry_mpi_div (gcry_mpi_t q, gcry_mpi_t r,
                   gcry_mpi_t dividend, gcry_mpi_t divisor, int round);
void _gcry_mpi_mod (gcry_mpi_t r, gcry_mpi_t dividend, gcry_mpi_t divisor);
void _gcry_mpi_powm (gcry_mpi_t w,
                    const gcry_mpi_t b, const gcry_mpi_t e,
                    const gcry_mpi_t m);
int _gcry_mpi_gcd (gcry_mpi_t g, gcry_mpi_t a, gcry_mpi_t b);
int _gcry_mpi_invm (gcry_mpi_t x, gcry_mpi_t a, gcry_mpi_t m);
gcry_mpi_point_t _gcry_mpi_point_new (unsigned int nbits);
void _gcry_mpi_point_release (gcry_mpi_point_t point);
void _gcry_mpi_point_get (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t z,
                         gcry_mpi_point_t point);
void _gcry_mpi_point_snatch_get (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t z,
                                gcry_mpi_point_t point);
gcry_mpi_point_t _gcry_mpi_point_set (gcry_mpi_point_t point,
                                     gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t z);
gcry_mpi_point_t _gcry_mpi_point_snatch_set (gcry_mpi_point_t point,
                                            gcry_mpi_t x, gcry_mpi_t y,
                                            gcry_mpi_t z);
gpg_error_t _gcry_mpi_ec_new (gcry_ctx_t *r_ctx,
                             gcry_sexp_t keyparam, const char *curvename);
gcry_mpi_t _gcry_mpi_ec_get_mpi (const char *name, gcry_ctx_t ctx, int copy);
gcry_mpi_point_t _gcry_mpi_ec_get_point (const char *name,
                                        gcry_ctx_t ctx, int copy);
gpg_error_t _gcry_mpi_ec_set_mpi (const char *name, gcry_mpi_t newvalue,
                                 gcry_ctx_t ctx);
gpg_error_t _gcry_mpi_ec_set_point (const char *name, gcry_mpi_point_t newvalue,
                                   gcry_ctx_t ctx);
int _gcry_mpi_ec_get_affine (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_point_t point,
                             mpi_ec_t ctx);
void _gcry_mpi_ec_dup (gcry_mpi_point_t w, gcry_mpi_point_t u, gcry_ctx_t ctx);
void _gcry_mpi_ec_add (gcry_mpi_point_t w,
                       gcry_mpi_point_t u, gcry_mpi_point_t v, mpi_ec_t ctx);
void _gcry_mpi_ec_mul (gcry_mpi_point_t w, gcry_mpi_t n, gcry_mpi_point_t u,
                       mpi_ec_t ctx);
int _gcry_mpi_ec_curve_point (gcry_mpi_point_t w, mpi_ec_t ctx);
unsigned int _gcry_mpi_get_nbits (gcry_mpi_t a);
int _gcry_mpi_test_bit (gcry_mpi_t a, unsigned int n);
void _gcry_mpi_set_bit (gcry_mpi_t a, unsigned int n);
void _gcry_mpi_clear_bit (gcry_mpi_t a, unsigned int n);
void _gcry_mpi_set_highbit (gcry_mpi_t a, unsigned int n);
void _gcry_mpi_clear_highbit (gcry_mpi_t a, unsigned int n);
void _gcry_mpi_rshift (gcry_mpi_t x, gcry_mpi_t a, unsigned int n);
void _gcry_mpi_lshift (gcry_mpi_t x, gcry_mpi_t a, unsigned int n);
gcry_mpi_t _gcry_mpi_set_opaque (gcry_mpi_t a, void *p, unsigned int nbits);
gcry_mpi_t _gcry_mpi_set_opaque_copy (gcry_mpi_t a,
                                     const void *p, unsigned int nbits);
void *_gcry_mpi_get_opaque (gcry_mpi_t a, unsigned int *nbits);
void _gcry_mpi_set_flag (gcry_mpi_t a, enum gcry_mpi_flag flag);
void _gcry_mpi_clear_flag (gcry_mpi_t a, enum gcry_mpi_flag flag);
int _gcry_mpi_get_flag (gcry_mpi_t a, enum gcry_mpi_flag flag);


/* Private function - do not use.  */
/* gcry_mpi_t _gcry_mpi_get_const (int no); */

/* We need our internal versions of the macros.  */
#ifndef GCRYPT_NO_MPI_MACROS
# error GCRYPT_NO_MPI_MACROS is not defined
#endif

#define mpi_new(n)             _gcry_mpi_new ((n))
#define mpi_secure_new( n )    _gcry_mpi_snew ((n))
#define mpi_snew(n)            _gcry_mpi_snew ((n))

#define mpi_release(a)        \
  do                          \
    {                         \
      _gcry_mpi_release ((a));\
      (a) = NULL;             \
    }                         \
  while (0)

#define mpi_snatch( w, u)      _gcry_mpi_snatch( (w), (u) )
#define mpi_set( w, u)         _gcry_mpi_set( (w), (u) )
#define mpi_set_ui( w, u)      _gcry_mpi_set_ui( (w), (u) )
#define mpi_get_ui(a,b)        _gcry_mpi_get_ui( (a), (b) )
#define mpi_swap(a,b)          _gcry_mpi_swap ((a),(b))
#define mpi_abs( w )           _gcry_mpi_abs( (w) )
#define mpi_neg( w, u)         _gcry_mpi_neg( (w), (u) )
#define mpi_cmp( u, v )        _gcry_mpi_cmp( (u), (v) )
#define mpi_cmp_ui( u, v )     _gcry_mpi_cmp_ui( (u), (v) )
#define mpi_is_neg( a )        _gcry_mpi_is_neg ((a))

#define mpi_add_ui(w,u,v)      _gcry_mpi_add_ui((w),(u),(v))
#define mpi_add(w,u,v)         _gcry_mpi_add ((w),(u),(v))
#define mpi_addm(w,u,v,m)      _gcry_mpi_addm ((w),(u),(v),(m))
#define mpi_sub_ui(w,u,v)      _gcry_mpi_sub_ui ((w),(u),(v))
#define mpi_sub(w,u,v)         _gcry_mpi_sub ((w),(u),(v))
#define mpi_subm(w,u,v,m)      _gcry_mpi_subm ((w),(u),(v),(m))
#define mpi_mul_ui(w,u,v)      _gcry_mpi_mul_ui ((w),(u),(v))
#define mpi_mul_2exp(w,u,v)    _gcry_mpi_mul_2exp ((w),(u),(v))
#define mpi_mul(w,u,v)         _gcry_mpi_mul ((w),(u),(v))
#define mpi_mulm(w,u,v,m)      _gcry_mpi_mulm ((w),(u),(v),(m))
#define mpi_powm(w,b,e,m)      _gcry_mpi_powm ( (w), (b), (e), (m) )
#define mpi_tdiv(q,r,a,m)      _gcry_mpi_div ( (q), (r), (a), (m), 0)
#define mpi_fdiv(q,r,a,m)      _gcry_mpi_div ( (q), (r), (a), (m), -1)
#define mpi_mod(r,a,m)         _gcry_mpi_mod ((r), (a), (m))
#define mpi_gcd(g,a,b)         _gcry_mpi_gcd ( (g), (a), (b) )
#define mpi_invm(g,a,b)        _gcry_mpi_invm ( (g), (a), (b) )

#define mpi_point_new(n)       _gcry_mpi_point_new((n))

#define mpi_point_release(p)                     \
  do                                             \
    {                                            \
      _gcry_mpi_point_release ((p));             \
      (p) = NULL;                                \
    }                                            \
  while (0)

#define mpi_point_get(x,y,z,p)        _gcry_mpi_point_get((x),(y),(z),(p))
#define mpi_point_snatch_get(x,y,z,p) _gcry_mpi_point_snatch_get((x),(y), \
                                                                 (z),(p))
#define mpi_point_set(p,x,y,z)        _gcry_mpi_point_set((p),(x),(y),(z))
#define mpi_point_snatch_set(p,x,y,z) _gcry_mpi_point_snatch_set((p),(x), \
                                                                 (y),(z))

#define mpi_get_nbits(a)       _gcry_mpi_get_nbits ((a))
#define mpi_test_bit(a,b)      _gcry_mpi_test_bit ((a),(b))
#define mpi_set_bit(a,b)       _gcry_mpi_set_bit ((a),(b))
#define mpi_set_highbit(a,b)   _gcry_mpi_set_highbit ((a),(b))
#define mpi_clear_bit(a,b)     _gcry_mpi_clear_bit ((a),(b))
#define mpi_clear_highbit(a,b) _gcry_mpi_clear_highbit ((a),(b))
#define mpi_rshift(a,b,c)      _gcry_mpi_rshift ((a),(b),(c))
#define mpi_lshift(a,b,c)      _gcry_mpi_lshift ((a),(b),(c))

#define mpi_set_opaque(a,b,c)  _gcry_mpi_set_opaque ((a), (b), (c))
#define mpi_get_opaque(a,b)    _gcry_mpi_get_opaque ((a), (b))
#define mpi_set_flag(a,f)      _gcry_mpi_set_flag ((a), (f))
#define mpi_set_flag(a,f)      _gcry_mpi_set_flag ((a), (f))
#define mpi_clear_flag(a,f)    _gcry_mpi_clear_flag ((a), (f))
#define mpi_get_flag(a,f)      _gcry_mpi_get_flag ((a), (f))


#endif /*GCRY_GCRYPT_INT_H*/
