prototypes fixed
[libgcrypt.git] / src / gcrypt.h
1 /* gcrypt.h -  GNU digital encryption library interface
2  * Copyright (C) 1998,1999,2000,2001,2002 Free Software Foundation, Inc.
3  *
4  * This file is part of Libgcrypt.
5  *
6  * Libgcrypt is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Libgcrypt is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #ifndef _GCRYPT_H
22 #define _GCRYPT_H
23
24 #include <stdarg.h>
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29
30 /*
31  * The version of this header should match the one of the library
32  * It should not be used by a program because gcry_check_version()
33  * should reurn the same version.  The purpose of this macro is to
34  * let autoconf (using the AM_PATH_GCRYPT macro) check that this
35  * header matches the installed library.
36  * Note: Do not edit the next line as configure may fix the string here.
37  */
38 #define GCRYPT_VERSION "1.1.7"
39
40
41 #ifdef _GCRYPT_IN_LIBGCRYPT
42 # ifndef GCRYPT_NO_MPI_MACROS
43 #   define GCRYPT_NO_MPI_MACROS 1
44 # endif
45 #endif
46
47 struct gcry_mpi;
48 typedef struct gcry_mpi *GCRY_MPI;
49 typedef struct gcry_mpi *GcryMPI;
50
51 /*******************************************
52  *                                         *
53  *  error handling etc.                    *
54  *                                         *
55  *******************************************/
56
57 /* FIXME: We should use the same values as they were used in GnuPG 1.0.
58  *        gpg --status-fd may print some of these values */
59 enum {
60     GCRYERR_SUCCESS = 0,    /* "no error" */
61     GCRYERR_GENERAL = 1,    /* catch all the other errors code */
62
63     GCRYERR_INV_PK_ALGO = 4, /* invalid public key algorithm */
64     GCRYERR_INV_MD_ALGO = 5, /* invalid message digest algorithm */
65     GCRYERR_BAD_PUBLIC_KEY = 6, /* Bad public key */
66     GCRYERR_BAD_SECRET_KEY = 7, /* Bad secret key */
67     GCRYERR_BAD_SIGNATURE = 8,  /* Bad signature */
68
69     GCRYERR_INV_CIPHER_ALGO = 12, /* invalid cipher algorithm */
70     GCRYERR_BAD_MPI = 30,
71     GCRYERR_WRONG_PK_ALGO = 41, /* wrong public key algorithm */
72     GCRYERR_WEAK_KEY = 43,  /* weak encryption key */
73     GCRYERR_INV_KEYLEN = 44,  /* invalid length of a key*/
74     GCRYERR_INV_ARG = 45,    /* invalid argument */
75     GCRYERR_SELFTEST = 50,      /* selftest failed */
76
77     /* error codes not used in GnuPG 1.0 */
78     GCRYERR_INV_OP = 61,     /* invalid operation code or ctl command */
79     GCRYERR_NO_MEM = 62,     /* out of core */
80     GCRYERR_INTERNAL = 63,   /* internal error */
81     GCRYERR_EOF = 64,        /* (-1) is remapped to this value */
82     GCRYERR_INV_OBJ = 65,    /* an object is not valid */
83     GCRYERR_TOO_SHORT = 66,  /* provided buffer too short */
84     GCRYERR_TOO_LARGE = 67,  /* object is too large */
85     GCRYERR_NO_OBJ = 68,     /* Missing item in an object */
86     GCRYERR_NOT_IMPL = 69,   /* Not implemented */
87     GCRYERR_CONFLICT = 70,
88     GCRYERR_INV_CIPHER_MODE = 71,
89
90     /* error codes pertaining to S-expressions */
91     GCRYERR_SEXP_INV_LEN_SPEC    = 201,
92     GCRYERR_SEXP_STRING_TOO_LONG = 202,
93     GCRYERR_SEXP_UNMATCHED_PAREN = 203, 
94     GCRYERR_SEXP_NOT_CANONICAL   = 204, 
95     GCRYERR_SEXP_BAD_CHARACTER   = 205, 
96     GCRYERR_SEXP_BAD_QUOTATION   = 206,/* or invalid hex or octal value */
97     GCRYERR_SEXP_ZERO_PREFIX     = 207,/* first character of a length is 0 */
98     GCRYERR_SEXP_NESTED_DH       = 208,/* nested display hints */
99     GCRYERR_SEXP_UNMATCHED_DH    = 209,/* unmatched display hint */
100     GCRYERR_SEXP_UNEXPECTED_PUNC = 210,/* unexpected reserved punctuation */
101     GCRYERR_SEXP_BAD_HEX_CHAR    = 211,
102     GCRYERR_SEXP_ODD_HEX_NUMBERS = 212,
103     GCRYERR_SEXP_BAD_OCT_CHAR    = 213
104
105 };
106
107 const char *gcry_check_version( const char *req_version );
108
109 int gcry_errno(void);
110 const char *gcry_strerror( int ec );
111
112 enum gcry_ctl_cmds {
113     GCRYCTL_SET_KEY  = 1,
114     GCRYCTL_SET_IV   = 2,
115     GCRYCTL_CFB_SYNC = 3,
116     GCRYCTL_RESET    = 4,   /* e.g. for MDs */
117     GCRYCTL_FINALIZE = 5,
118     GCRYCTL_GET_KEYLEN = 6,
119     GCRYCTL_GET_BLKLEN = 7,
120     GCRYCTL_TEST_ALGO = 8,
121     GCRYCTL_IS_SECURE = 9,
122     GCRYCTL_GET_ASNOID = 10,
123     GCRYCTL_ENABLE_ALGO = 11,
124     GCRYCTL_DISABLE_ALGO = 12,
125     GCRYCTL_DUMP_RANDOM_STATS = 13,
126     GCRYCTL_DUMP_SECMEM_STATS = 14,
127     GCRYCTL_GET_ALGO_NPKEY    = 15,
128     GCRYCTL_GET_ALGO_NSKEY    = 16,
129     GCRYCTL_GET_ALGO_NSIGN    = 17,
130     GCRYCTL_GET_ALGO_NENCR    = 18,
131     GCRYCTL_SET_VERBOSITY     = 19,
132     GCRYCTL_SET_DEBUG_FLAGS   = 20,
133     GCRYCTL_CLEAR_DEBUG_FLAGS = 21,
134     GCRYCTL_USE_SECURE_RNDPOOL= 22,
135     GCRYCTL_DUMP_MEMORY_STATS = 23,
136     GCRYCTL_INIT_SECMEM       = 24,
137     GCRYCTL_TERM_SECMEM       = 25,
138     GCRYCTL_DISABLE_SECMEM_WARN = 27,
139     GCRYCTL_SUSPEND_SECMEM_WARN = 28,
140     GCRYCTL_RESUME_SECMEM_WARN  = 29,
141     GCRYCTL_DROP_PRIVS          = 30,
142     GCRYCTL_ENABLE_M_GUARD      = 31,
143     GCRYCTL_START_DUMP          = 32,
144     GCRYCTL_STOP_DUMP           = 33,
145     GCRYCTL_GET_ALGO_USAGE      = 34,
146     GCRYCTL_IS_ALGO_ENABLED     = 35,
147     GCRYCTL_DISABLE_INTERNAL_LOCKING = 36,
148     GCRYCTL_DISABLE_SECMEM      = 37,
149     GCRYCTL_INITIALIZATION_FINISHED = 38,
150     GCRYCTL_INITIALIZATION_FINISHED_P = 39,
151     GCRYCTL_ANY_INITIALIZATION_P = 40
152 };
153
154 int gcry_control( enum gcry_ctl_cmds, ... );
155
156 enum gcry_random_level {
157     GCRY_WEAK_RANDOM = 0,
158     GCRY_STRONG_RANDOM = 1,
159     GCRY_VERY_STRONG_RANDOM = 2
160 };
161
162
163 struct gcry_sexp;
164 typedef struct gcry_sexp *GCRY_SEXP;
165 typedef struct gcry_sexp *GcrySexp;  /* this type looks more pretty */
166
167 enum gcry_sexp_format {
168     GCRYSEXP_FMT_DEFAULT   = 0,
169     GCRYSEXP_FMT_CANON     = 1,
170     GCRYSEXP_FMT_BASE64    = 2,
171     GCRYSEXP_FMT_ADVANCED  = 3
172 };
173
174 int gcry_sexp_new (GCRY_SEXP *retsexp, const void *buffer, size_t length,
175                    int autodetect);
176 int gcry_sexp_create (GCRY_SEXP *retsexp, void *buffer, size_t length,
177                        int autodetect, void (*freefnc)(void*) );
178 int gcry_sexp_sscan (GCRY_SEXP *retsexp, size_t *erroff,
179                      const char *buffer, size_t length );
180 int gcry_sexp_build (GCRY_SEXP *retsexp, size_t *erroff,
181                      const char *format, ... );
182 void gcry_sexp_release (GCRY_SEXP sexp);
183
184 size_t gcry_sexp_canon_len (const unsigned char *buffer, size_t length, 
185                             size_t *erroff, int *errcode);
186
187 size_t    gcry_sexp_sprint (GCRY_SEXP sexp, int mode, char *buffer,
188                             size_t maxlength );
189
190 void      gcry_sexp_dump( const GCRY_SEXP a );
191 GCRY_SEXP gcry_sexp_cons( const GCRY_SEXP a, const GCRY_SEXP b );
192 GCRY_SEXP gcry_sexp_alist( const GCRY_SEXP *array );
193 GCRY_SEXP gcry_sexp_vlist( const GCRY_SEXP a, ... );
194 GCRY_SEXP gcry_sexp_append( const GCRY_SEXP a, const GCRY_SEXP n );
195 GCRY_SEXP gcry_sexp_prepend( const GCRY_SEXP a, const GCRY_SEXP n );
196 GCRY_SEXP gcry_sexp_find_token( GCRY_SEXP list,
197                                   const char *tok, size_t toklen );
198 int         gcry_sexp_length( const GCRY_SEXP list );
199 GCRY_SEXP   gcry_sexp_nth( const GCRY_SEXP list, int number );
200 GCRY_SEXP   gcry_sexp_car( const GCRY_SEXP list );
201 GCRY_SEXP   gcry_sexp_cdr( const GCRY_SEXP list );
202 GCRY_SEXP   gcry_sexp_cadr( const GCRY_SEXP list );
203 const char *gcry_sexp_nth_data( const GCRY_SEXP list, int number,
204                                                       size_t *datalen );
205 GCRY_MPI    gcry_sexp_nth_mpi( GCRY_SEXP list, int number, int mpifmt );
206
207
208
209 /*******************************************
210  *                                         *
211  *  multi precision integer functions      *
212  *                                         *
213  *******************************************/
214
215 enum gcry_mpi_format {
216     GCRYMPI_FMT_NONE= 0,
217     GCRYMPI_FMT_STD = 1,    /* twos complement stored without length */
218     GCRYMPI_FMT_PGP = 2,    /* As used by OpenPGP (only defined as unsigned)*/
219     GCRYMPI_FMT_SSH = 3,    /* As used by SSH (same as 1 but with length)*/
220     GCRYMPI_FMT_HEX = 4,    /* hex format */
221     GCRYMPI_FMT_USG = 5     /* like STD but this is an unsigned one */
222 };
223
224
225 enum gcry_mpi_flag {
226     GCRYMPI_FLAG_SECURE = 1,
227     GCRYMPI_FLAG_OPAQUE = 2
228 };
229
230
231
232 GCRY_MPI gcry_mpi_new( unsigned int nbits );
233 GCRY_MPI gcry_mpi_snew( unsigned int nbits );
234 void     gcry_mpi_release( GCRY_MPI a );
235 GCRY_MPI gcry_mpi_copy( const GCRY_MPI a );
236 GCRY_MPI gcry_mpi_set( GCRY_MPI w, const GCRY_MPI u );
237 GCRY_MPI gcry_mpi_set_ui( GCRY_MPI w, unsigned long u );
238 int      gcry_mpi_cmp( const GCRY_MPI u, const GCRY_MPI v );
239 int      gcry_mpi_cmp_ui( const GCRY_MPI u, unsigned long v );
240 void     gcry_mpi_randomize( GCRY_MPI w,
241                              unsigned int nbits, enum gcry_random_level level);
242 int      gcry_mpi_scan( GCRY_MPI *ret_mpi, enum gcry_mpi_format format,
243                                        const char *buffer, size_t *nbytes );
244 int      gcry_mpi_print( enum gcry_mpi_format format,
245                          char *buffer, size_t *nbytes, const GCRY_MPI a );
246 int      gcry_mpi_aprint( enum gcry_mpi_format format,
247                           void **buffer, size_t *nbytes, const GCRY_MPI a );
248
249
250 void     gcry_mpi_add(GCRY_MPI w, GCRY_MPI u, GCRY_MPI v);
251 void     gcry_mpi_add_ui(GCRY_MPI w, GCRY_MPI u, unsigned long v );
252 void     gcry_mpi_addm(GCRY_MPI w, GCRY_MPI u, GCRY_MPI v, GCRY_MPI m);
253 void     gcry_mpi_sub( GCRY_MPI w, GCRY_MPI u, GCRY_MPI v);
254 void     gcry_mpi_sub_ui(GCRY_MPI w, GCRY_MPI u, unsigned long v );
255 void     gcry_mpi_subm( GCRY_MPI w, GCRY_MPI u, GCRY_MPI v, GCRY_MPI m);
256 void     gcry_mpi_mul_ui(GCRY_MPI w, GCRY_MPI u, unsigned long v );
257 void     gcry_mpi_mul_2exp( GCRY_MPI w, GCRY_MPI u, unsigned long cnt);
258 void     gcry_mpi_mul( GCRY_MPI w, GCRY_MPI u, GCRY_MPI v);
259 void     gcry_mpi_mulm( GCRY_MPI w, GCRY_MPI u, GCRY_MPI v, GCRY_MPI m);
260
261 void     gcry_mpi_powm( GCRY_MPI w,
262                         const GCRY_MPI b, const GCRY_MPI e, const GCRY_MPI m );
263 int      gcry_mpi_gcd( GCRY_MPI g, GCRY_MPI a, GCRY_MPI b );
264
265 unsigned int gcry_mpi_get_nbits( GCRY_MPI a );
266
267 /* Please note that keygrip is still experimental and should not be
268    used without contacting the author */
269 unsigned char *gcry_pk_get_keygrip (GCRY_SEXP key, unsigned char *array);
270
271 int      gcry_mpi_test_bit( GCRY_MPI a, unsigned int n );
272 void     gcry_mpi_set_bit( GCRY_MPI a, unsigned int n );
273 void     gcry_mpi_clear_bit( GCRY_MPI a, unsigned int n );
274 void     gcry_mpi_set_highbit( GCRY_MPI a, unsigned int n );
275 void     gcry_mpi_clear_highbit( GCRY_MPI a, unsigned int n );
276 void     gcry_mpi_rshift( GCRY_MPI x, GCRY_MPI a, unsigned int n );
277
278 GCRY_MPI gcry_mpi_set_opaque( GCRY_MPI a, void *p, unsigned int nbits );
279 void *   gcry_mpi_get_opaque( GCRY_MPI a, unsigned int *nbits );
280 void     gcry_mpi_set_flag( GCRY_MPI a, enum gcry_mpi_flag flag );
281 void     gcry_mpi_clear_flag( GCRY_MPI a, enum gcry_mpi_flag flag );
282 int      gcry_mpi_get_flag( GCRY_MPI a, enum gcry_mpi_flag flag );
283
284
285 #ifndef GCRYPT_NO_MPI_MACROS
286 #define mpi_new(n)          gcry_mpi_new( (n) )
287 #define mpi_secure_new( n ) gcry_mpi_snew( (n) )
288 #define mpi_release( a )    do { gcry_mpi_release( (a) ); \
289                                  (a) = NULL; } while(0)
290 #define mpi_copy( a )       gcry_mpi_copy( (a) )
291 #define mpi_set( w, u)      gcry_mpi_set( (w), (u) )
292 #define mpi_set_ui( w, u)   gcry_mpi_set_ui( (w), (u) )
293 #define mpi_cmp( u, v )     gcry_mpi_cmp( (u), (v) )
294 #define mpi_cmp_ui( u, v )  gcry_mpi_cmp_ui( (u), (v) )
295
296 #define mpi_add_ui(w,u,v)   gcry_mpi_add_ui((w),(u),(v))
297 #define mpi_add(w,u,v)      gcry_mpi_add ((w),(u),(v))
298 #define mpi_addm(w,u,v,m)   gcry_mpi_addm ((w),(u),(v),(m))
299 #define mpi_sub_ui(w,u,v)   gcry_mpi_sub_ui ((w),(u),(v))
300 #define mpi_sub(w,u,v)      gcry_mpi_sub ((w),(u),(v))
301 #define mpi_subm(w,u,v,m)   gcry_mpi_subm ((w),(u),(v),(m))
302 #define mpi_mul_ui(w,u,v)   gcry_mpi_mul_ui ((w),(u),(v))
303 #define mpi_mul_2exp(w,u,v) gcry_mpi_mul_2exp ((w),(u),(v))
304 #define mpi_mul(w,u,v)      gcry_mpi_mul ((w),(u),(v))
305 #define mpi_mulm(w,u,v,m)   gcry_mpi_mulm ((w),(u),(v),(m))
306 #define mpi_powm(w,b,e,m)   gcry_mpi_powm( (w), (b), (e), (m) )
307 #define mpi_gcd(g,a,b)      gcry_mpi_gcd( (g), (a), (b) )
308
309 #define mpi_get_nbits(a)       gcry_mpi_get_nbits ((a))
310 #define mpi_test_bit(a,b)      gcry_mpi_test_bit ((a),(b))
311 #define mpi_set_bit(a,b)       gcry_mpi_set_bit ((a),(b))
312 #define mpi_set_highbit(a,b)   gcry_mpi_set_highbit ((a),(b))
313 #define mpi_clear_bit(a,b)     gcry_mpi_clear_bit ((a),(b))
314 #define mpi_clear_highbit(a,b) gcry_mpi_clear_highbit ((a),(b))
315 #define mpi_rshift(a,b,c)      gcry_mpi_rshift ((a),(b),(c))
316
317 #define mpi_set_opaque(a,b,c) gcry_mpi_set_opaque( (a), (b), (c) )
318 #define mpi_get_opaque(a,b)   gcry_mpi_get_opaque( (a), (b) )
319 #endif /* GCRYPT_NO_MPI_MACROS */
320
321 /********************************************
322  *******  symmetric cipher functions  *******
323  ********************************************/
324
325 struct gcry_cipher_handle;
326 typedef struct gcry_cipher_handle *GCRY_CIPHER_HD;
327 typedef struct gcry_cipher_handle *GcryCipherHd;
328
329 enum gcry_cipher_algos {
330     GCRY_CIPHER_NONE        = 0,
331     GCRY_CIPHER_IDEA        = 1,
332     GCRY_CIPHER_3DES        = 2,
333     GCRY_CIPHER_CAST5       = 3,
334     GCRY_CIPHER_BLOWFISH    = 4,
335     GCRY_CIPHER_SAFER_SK128 = 5,
336     GCRY_CIPHER_DES_SK      = 6,
337     GCRY_CIPHER_AES         = 7,
338     GCRY_CIPHER_AES192      = 8,
339     GCRY_CIPHER_AES256      = 9,
340     GCRY_CIPHER_TWOFISH     = 10,
341     /* other cipher numbers are above 300 for OpenPGP reasons. */
342     GCRY_CIPHER_ARCFOUR     = 301
343 };
344
345 #define GCRY_CIPHER_AES128      GCRY_CIPHER_AES    
346 #define GCRY_CIPHER_RIJNDAEL    GCRY_CIPHER_AES    
347 #define GCRY_CIPHER_RIJNDAEL128 GCRY_CIPHER_AES128 
348 #define GCRY_CIPHER_RIJNDAEL192 GCRY_CIPHER_AES192 
349 #define GCRY_CIPHER_RIJNDAEL256 GCRY_CIPHER_AES256 
350
351 enum gcry_cipher_modes {
352     GCRY_CIPHER_MODE_NONE   = 0,
353     GCRY_CIPHER_MODE_ECB    = 1,
354     GCRY_CIPHER_MODE_CFB    = 2,
355     GCRY_CIPHER_MODE_CBC    = 3,
356     GCRY_CIPHER_MODE_STREAM = 4, /* native stream mode of some the algorithms */
357     GCRY_CIPHER_MODE_OFB    = 5
358 };
359
360 enum gcry_cipher_flags {
361     GCRY_CIPHER_SECURE      = 1,  /* allocate in secure memory */
362     GCRY_CIPHER_ENABLE_SYNC = 2   /* enable CFB sync mode */
363 };
364
365
366 GCRY_CIPHER_HD gcry_cipher_open( int algo, int mode, unsigned int flags);
367 void gcry_cipher_close( GCRY_CIPHER_HD h );
368 int  gcry_cipher_ctl( GCRY_CIPHER_HD h, int cmd, void *buffer, size_t buflen);
369 int gcry_cipher_info( GCRY_CIPHER_HD h, int what, void *buffer, size_t *nbytes);
370 int gcry_cipher_algo_info( int algo, int what, void *buffer, size_t *nbytes);
371 const char *gcry_cipher_algo_name( int algo );
372 int gcry_cipher_map_name( const char* name );
373 int gcry_cipher_mode_from_oid (const char *string);
374
375 int gcry_cipher_encrypt( GCRY_CIPHER_HD h, unsigned char *out, size_t outsize,
376                                       const unsigned char *in, size_t inlen );
377 int gcry_cipher_decrypt( GCRY_CIPHER_HD h, unsigned char *out, size_t outsize,
378                                       const unsigned char *in, size_t inlen );
379
380
381 /* some handy macros */
382 /* We have to cast a way a const char* here - this catch-all ctl function
383  * was probably not the best choice */
384 #define gcry_cipher_setkey(h,k,l)  gcry_cipher_ctl( (h), GCRYCTL_SET_KEY, \
385                                                          (char*)(k), (l) )
386 #define gcry_cipher_setiv(h,k,l)  gcry_cipher_ctl( (h), GCRYCTL_SET_IV, \
387                                                          (char*)(k), (l) )
388 #define gcry_cipher_sync(h)  gcry_cipher_ctl( (h), GCRYCTL_CFB_SYNC, \
389                                                                    NULL, 0 )
390
391 #define gcry_cipher_get_algo_keylen(a) \
392             gcry_cipher_algo_info( (a), GCRYCTL_GET_KEYLEN, NULL, NULL )
393 #define gcry_cipher_get_algo_blklen(a) \
394             gcry_cipher_algo_info( (a), GCRYCTL_GET_BLKLEN, NULL, NULL )
395 #define gcry_cipher_test_algo(a) \
396             gcry_cipher_algo_info( (a), GCRYCTL_TEST_ALGO, NULL, NULL )
397
398
399 /*********************************************
400  *******  asymmetric cipher functions  *******
401  *********************************************/
402
403 enum gcry_pk_algos {
404     GCRY_PK_RSA = 1,
405     GCRY_PK_RSA_E = 2,      /* deprecated */
406     GCRY_PK_RSA_S = 3,      /* deprecated */
407     GCRY_PK_ELG_E = 16,     /* use only for OpenPGP */
408     GCRY_PK_DSA   = 17,
409     GCRY_PK_ELG   = 20
410 };
411
412 /* Flags describing usage capabilites/request of a PK algorithm */
413 #define GCRY_PK_USAGE_SIGN 1
414 #define GCRY_PK_USAGE_ENCR 2
415
416 int gcry_pk_encrypt( GCRY_SEXP *result, GCRY_SEXP data, GCRY_SEXP pkey );
417 int gcry_pk_decrypt( GCRY_SEXP *result, GCRY_SEXP data, GCRY_SEXP skey );
418 int gcry_pk_sign(    GCRY_SEXP *result, GCRY_SEXP data, GCRY_SEXP skey );
419 int gcry_pk_verify(  GCRY_SEXP sigval, GCRY_SEXP data, GCRY_SEXP pkey );
420 int gcry_pk_testkey( GCRY_SEXP key );
421 int gcry_pk_genkey(  GCRY_SEXP *r_key, GCRY_SEXP s_parms );
422
423 int gcry_pk_ctl( int cmd, void *buffer, size_t buflen);
424 int gcry_pk_algo_info( int algo, int what, void *buffer, size_t *nbytes);
425 const char *gcry_pk_algo_name( int algo );
426 int gcry_pk_map_name( const char* name );
427 unsigned int gcry_pk_get_nbits( GCRY_SEXP key );
428
429
430 #define gcry_pk_test_algo(a) \
431             gcry_pk_algo_info( (a), GCRYCTL_TEST_ALGO, NULL, NULL )
432
433 /*********************************************
434  *******  cryptograhic hash functions  *******
435  *********************************************/
436
437 enum gcry_md_algos {
438     GCRY_MD_NONE    = 0,
439     GCRY_MD_MD5     = 1,
440     GCRY_MD_SHA1    = 2,
441     GCRY_MD_RMD160  = 3,
442     GCRY_MD_TIGER   = 6
443 };
444
445 enum gcry_md_flags {
446     GCRY_MD_FLAG_SECURE = 1,
447     GCRY_MD_FLAG_HMAC   = 2
448 };
449
450
451 struct gcry_md_context;
452 struct gcry_md_handle {
453     struct gcry_md_context *ctx;
454     int  bufpos;
455     int  bufsize;
456     unsigned char buf[1];
457 };
458 typedef struct gcry_md_handle *GCRY_MD_HD;
459 typedef struct gcry_md_handle *GcryMDHd;
460
461
462 GCRY_MD_HD gcry_md_open( int algo, unsigned flags );
463 void gcry_md_close( GCRY_MD_HD hd );
464 int gcry_md_enable( GCRY_MD_HD hd, int algo );
465 GCRY_MD_HD gcry_md_copy( GCRY_MD_HD hd );
466 void gcry_md_reset( GCRY_MD_HD hd );
467 int gcry_md_ctl( GCRY_MD_HD hd, int cmd, unsigned char *buffer, size_t buflen);
468 void gcry_md_write( GCRY_MD_HD hd, const unsigned char *buffer, size_t length);
469 unsigned char *gcry_md_read( GCRY_MD_HD hd, int algo );
470 void gcry_md_hash_buffer( int algo, char *digest,
471                           const char *buffer, size_t length);
472 int gcry_md_get_algo( GCRY_MD_HD hd );
473 unsigned int gcry_md_get_algo_dlen( int algo );
474 /*??int gcry_md_get( GCRY_MD_HD hd, int algo, unsigned char *buffer, int buflen );*/
475 int gcry_md_info( GCRY_MD_HD h, int what, void *buffer, size_t *nbytes);
476 int gcry_md_algo_info( int algo, int what, void *buffer, size_t *nbytes);
477 const char *gcry_md_algo_name( int algo );
478 int gcry_md_map_name( const char* name );
479 int gcry_md_setkey( GCRY_MD_HD hd, const char *key, size_t keylen );
480
481 #define gcry_md_putc(h,c)  \
482             do {                                        \
483                 if( (h)->bufpos == (h)->bufsize )       \
484                     gcry_md_write( (h), NULL, 0 );      \
485                 (h)->buf[(h)->bufpos++] = (c) & 0xff;   \
486             } while(0)
487
488 #define gcry_md_final(a) \
489             gcry_md_ctl( (a), GCRYCTL_FINALIZE, NULL, 0 )
490
491 #define gcry_md_is_secure(a) \
492             gcry_md_info( (a), GCRYCTL_IS_SECURE, NULL, NULL )
493
494 #define gcry_md_test_algo(a) \
495             gcry_md_algo_info( (a), GCRYCTL_TEST_ALGO, NULL, NULL )
496
497 #define gcry_md_start_debug(a,b) \
498             gcry_md_ctl( (a), GCRYCTL_START_DUMP, (b), 0 )
499 #define gcry_md_stop_debug(a,b) \
500             gcry_md_ctl( (a), GCRYCTL_STOP_DUMP, (b), 0 )
501
502
503 /*********************************************
504  *******  random generating functions  *******
505  *********************************************/
506 void gcry_randomize (unsigned char *buffer, size_t length,
507                      enum gcry_random_level level);
508 void *gcry_random_bytes (size_t nbytes, enum gcry_random_level level);
509 void *gcry_random_bytes_secure (size_t nbytes, enum gcry_random_level level);
510
511 /*****************************************
512  *******  miscellaneous stuff   **********
513  *****************************************/
514
515 enum gcry_log_levels {
516     GCRY_LOG_CONT   = 0,    /* continue the last log line */
517     GCRY_LOG_INFO   = 10,
518     GCRY_LOG_WARN   = 20,
519     GCRY_LOG_ERROR  = 30,
520     GCRY_LOG_FATAL  = 40,
521     GCRY_LOG_BUG    = 50,
522     GCRY_LOG_DEBUG  = 100
523 };
524
525
526 /* 
527    Provide custom functions for special tasks of libgcrypt.
528  */
529 void gcry_set_allocation_handler( void *(*new_alloc_func)(size_t n),
530                                   void *(*new_alloc_secure_func)(size_t n),
531                                   int (*new_is_secure_func)(const void*),
532                                   void *(*new_realloc_func)(void *p, size_t n),
533                                   void (*new_free_func)(void*) );
534 void gcry_set_outofcore_handler( int (*h)( void*, size_t, unsigned int ),
535                                                                 void *opaque );
536 void gcry_set_fatalerror_handler( void (*fnc)(void*,int, const char*),
537                                                                 void *opaque );
538 void gcry_set_gettext_handler( const char *(*f)(const char*) );
539 void gcry_set_log_handler( void (*f)(void*,int, const char*, va_list ),
540                                                              void *opaque );
541
542 void gcry_set_progress_handler (void (*cb)(void *,const char*,int, int, int),
543                                 void *cb_data);
544
545
546 /*
547    Access to the memory function of libgcrypt.  Especially the
548    gcry_free() should be used for memory allocated by gcry_ functions. 
549  */
550 void *gcry_malloc( size_t n );
551 void *gcry_calloc( size_t n, size_t m );
552 void *gcry_malloc_secure( size_t n );
553 void *gcry_calloc_secure( size_t n, size_t m );
554 void *gcry_realloc( void *a, size_t n );
555 char *gcry_strdup( const char *string );
556 void *gcry_xmalloc( size_t n );
557 void *gcry_xcalloc( size_t n, size_t m );
558 void *gcry_xmalloc_secure( size_t n );
559 void *gcry_xcalloc_secure( size_t n, size_t m );
560 void *gcry_xrealloc( void *a, size_t n );
561 char *gcry_xstrdup( const char * a);
562 void  gcry_free( void *a );
563 int   gcry_is_secure( const void *a );
564
565
566 #ifndef GCRYPT_NO_MPI_MACROS
567 # ifndef DID_MPI_TYPEDEF
568     typedef struct gcry_mpi *MPI;
569 #   define DID_MPI_TYPEDEF
570 # endif
571 #endif /* GCRYPT_NO_MPI_MACROS */
572
573 #ifdef __cplusplus
574 }
575 #endif
576 #endif /* _GCRYPT_H */