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