See ChangeLog: Wed Feb 10 17:15:39 CET 1999 Werner Koch
[libgcrypt.git] / src / gcrypt.h
1 /* gcrypt.h -  GNU digital encryption library interface
2  *      Copyright (C) 1998 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG 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 General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * 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 #ifdef __cplusplus
24 extern "C" {
25 #endif
26
27
28 /*******************************************
29  *                                         *
30  *  error handling etc.                    *
31  *                                         *
32  *******************************************/
33
34 enum {
35     GCRYERR_SUCCESS = 0,    /* "no error" */
36     GCRYERR_GENERAL = 1     /* catch all the other errors code */
37     GCRYERR_INV_OP = 2,     /* invalid operation code or ctl command */
38     GCRYERR_NOMEM = 3,      /* out of core */
39     GCRYERR_INV_ALGO = 4,   /* invalid algorithm */
40     GCRYERR_INV_ARG = 5,    /* invalid argument */
41     GCRYERR_INTERNAL = 6,   /* internal error */
42     GCRYERR_TOO_SHORT = 7,  /* provided buffer too short */
43     GCRYERR_EOF = 8,        /* (-1) is remapped to this value */
44 };
45
46
47 int gcry_errno(void);
48 const char *gcry_strerror( int ec );
49
50 enum gcry_ctl_cmds {
51     GCRYCTL_SET_KEY  = 1,
52     GCRYCTL_SET_IV   = 2,
53     GCRYCTL_CFB_SYNC = 3,
54 };
55
56 int gcry_control( enum gcry_ctl_cmds, ... );
57
58
59 /*******************************************
60  *                                         *
61  *  multi precision integer functions      *
62  *                                         *
63  *******************************************/
64
65 enum gcry_mpi_opcode {
66     GCRYMPI_NOOP = 0,
67     GCRYMPI_NEW  = 1,       /* use gcry_mpi_new() */
68     GCRYMPI_SNEW = 2,       /* use gcry_mpi_new() */
69     GCRYMPI_RELEASE = 3,
70     GCRYMPI_RESIZE = 4,
71     GCRYMPI_COPY = 5,       /* use gcry_mpi_new() */
72     GCRYMPI_SWAP = 6,
73     GCRYMPI_SET  = 7,
74     GCRYMPI_SET_UI = 8,
75     GCRYMPI_CMP    = 9,
76     GCRYMPI_CMP_UI = 10
77 };
78
79 struct gcry_mpi;
80
81 int gcry_mpi_api( enum gcry_mpi_opcode opcode, int n_args, ... );
82 struct gcry_mpi *gcry_mpi_new( enum gcry_mpi_opcode opcode,
83                                unsigned int size,
84                                struct gcry_mpi *val
85                               );
86
87 #ifndef GCRYPT_NO_MPI_MACROS
88 #define mpi_new( nbits )  gcry_mpi_new( GCRYMPI_NEW, (nbits), NULL )
89 #define mpi_secure_new( nbits )  gcry_mpi_new( GCRYMPI_SNEW, (nbits), NULL )
90 #define mpi_release( a )     do {   gcry_mpi_api( GCRYMPI_RELEASE, 1, (a) );
91                                     (a) = NULL; } while(0)
92 #define mpi_resize( a, n )  gcry_mpi_api( GCRYMPI_RESIZE, 2, (a), (n) )
93 #define mpi_copy( a )       gcry_mpi_new( GCRYMPI_COPY, 0, (a) )
94 #define mpi_swap( a, b )    gcyr_mpi_api( GCRYMPI_SWAP, 2, (a), (b) )
95 /* void mpi_set( MPI w, MPI u ); */
96 #define mpi_set( w, u)      gcry_mpi_api( GCRYMPI_SET, 2, (w), (u) )
97 /* void mpi_set_ui( MPI w, unsigned long u ); */
98 #define mpi_set_ui( w, u)   gcry_mpi_api( GCRYMPI_SET_UI, 2, (w), (u) )
99 /* int  mpi_cmp( MPI u, MPI v ); */
100 #define mpi_cmp( u, v )     gcry_mpi_api( GCRYMPI_CMP, 2, (u), (v) )
101 /* int  mpi_cmp_ui( MPI u, unsigned long v ); */
102 #define mpi_cmp_ui( u, v )  gcry_mpi_api( GCRYMPI_CMP_UI, 2, (u), (v) )
103
104
105 void g10m_add(MPI w, MPI u, MPI v);
106 void g10m_add_ui(MPI w, MPI u, unsigned long v );
107 void g10m_sub( MPI w, MPI u, MPI v);
108 void g10m_sub_ui(MPI w, MPI u, unsigned long v );
109
110 void g10m_mul_ui(MPI w, MPI u, unsigned long v );
111 void g10m_mul_2exp( MPI w, MPI u, unsigned long cnt);
112 void g10m_mul( MPI w, MPI u, MPI v);
113 void g10m_mulm( MPI w, MPI u, MPI v, MPI m);
114
115 void g10m_fdiv_q( MPI quot, MPI dividend, MPI divisor );
116
117 void g10m_powm( MPI res, MPI base, MPI exp, MPI mod);
118
119 int  g10m_gcd( MPI g, MPI a, MPI b );
120 int  g10m_invm( MPI x, MPI u, MPI v );
121
122 unsigned g10m_get_nbits( MPI a );
123 unsigned g10m_get_size( MPI a );
124
125 void g10m_set_buffer( MPI a, const char *buffer, unsigned nbytes, int sign );
126
127
128 #endif /* GCRYPT_NO_MPI_MACROS */
129
130 /********************************************
131  *******  symmetric cipher functions  *******
132  ********************************************/
133
134 struct gcry_cipher_context;
135 typedef struct gcry_cipher_context *GCRY_CIPHER_HD;
136
137 enum gcry_cipher_algos {
138     GCRY_CIPHER_NONE        = 0,
139     GCRY_CIPHER_IDEA        = 1,
140     GCRY_CIPHER_3DES        = 2,
141     GCRY_CIPHER_CAST5       = 3,
142     GCRY_CIPHER_BLOWFISH    = 4,
143     GCRY_CIPHER_SAFER_SK128 = 5,
144     GCRY_CIPHER_DES_SK      = 6
145 };
146
147 enum gcry_cipher_modes {
148     GCRY_CIPHER_MODE_NONE   = 0,
149     GCRY_CIPHER_MODE_ECB    = 1,
150     GCRY_CIPHER_MODE_CFB    = 2,
151 };
152
153 enum gcry_cipher_flags {
154     GCRY_CIPHER_SECURE      = 1,  /* allocate in secure memory */
155     GCRY_CIPHER_ENABLE_SYNC = 2,  /* enable CFB sync mode */
156 };
157
158
159 #if 0 /* not yet done */
160 int gcry_string_to_cipher_algo( const char *string );
161 const char * gcry_cipher_algo_to_string( int algo );
162 int gcry_check_cipher_algo( int algo );
163 unsigned gcry_cipher_get_keylen( int algo );
164 unsigned gcry_cipher_get_blocksize( int algo );
165 #endif
166
167 GCRY_CIPHER_HD gcry_cipher_open( algo, int mode, int secure );
168 void gcry_cipher_close( GCRY_CIPHER_HD h );
169 int  gcry_cipher_ctl( GCRY_CIPHER_HD h, int cmd, byte *buffer, size_t buflen);
170
171 int gcry_cipher_encrypt( GCRY_CIPHER_HD h, byte *out, size_t outsize,
172                                             byte *in, size_t inlen );
173 int gcry_cipher_decrypt( GCRY_CIPHER_HD h, byte *out, size_t outsize,
174                                             byte *in, size_t inlen );
175
176
177 /* some handy macros */
178 #define gcry_cipher_setkey(h,k,l)  gcry_cipher_ctl( (h), GCRYCTL_SET_KEY, \
179                                                                   (k), (l) )
180 #define gcry_cipher_setiv(h,k,l)  gcry_cipher_ctl( (h), GCRYCTL_SET_IV, \
181                                                                   (k), (l) )
182 #define gcry_cipher_sync(h)  gcry_cipher_ctl( (h), GCRYCTL_CFB_SYNC, \
183                                                                    NULL, 0 )
184
185
186 /*********************************************
187  *******  asymmetric cipher functions  *******
188  *********************************************/
189
190
191
192
193 /*********************************************
194  *******  cryptograhic hash functions  *******
195  *********************************************/
196
197
198 /*****************************************
199  *******  miscellaneous functions  *******
200  *****************************************/
201
202 #if 0
203 const char *g10m_revision_string(int mode);
204 const char *g10c_revision_string(int mode);
205 const char *g10u_revision_string(int mode);
206
207 MPI   g10c_generate_secret_prime( unsigned nbits );
208 char *g10c_get_random_bits( unsigned nbits, int level, int secure );
209
210
211 void *g10_malloc( size_t n );
212 void *g10_calloc( size_t n );
213 void *g10_malloc_secure( size_t n );
214 void *g10_calloc_secure( size_t n );
215 void *g10_realloc( void *a, size_t n );
216 void  g10_free( void *p );
217 char *g10_strdup( const char * a);
218
219 void g10_log_bug( const char *fmt, ... );
220 void g10_log_bug0( const char *, int );
221 void g10_log_fatal( const char *fmt, ... );
222 void g10_log_error( const char *fmt, ... );
223 void g10_log_info( const char *fmt, ... );
224 void g10_log_debug( const char *fmt, ... );
225 void g10_log_hexdump( const char *text, char *buf, size_t len );
226 void g10_log_mpidump( const char *text, MPI a );
227 #endif
228
229 /***************************
230  *******  constants  *******
231  **************************/
232 #if 0
233 #define CIPHER_ALGO_NONE         0
234 #define CIPHER_ALGO_IDEA         1
235 #define CIPHER_ALGO_3DES         2
236 #define CIPHER_ALGO_CAST5        3
237 #define CIPHER_ALGO_BLOWFISH     4  /* blowfish 128 bit key */
238 #define CIPHER_ALGO_SAFER_SK128  5
239 #define CIPHER_ALGO_DES_SK       6
240 #define CIPHER_ALGO_BLOWFISH160 42  /* blowfish 160 bit key (not in OpenPGP)*/
241 #define CIPHER_ALGO_DUMMY      110  /* no encryption at all */
242
243 #define PUBKEY_ALGO_RSA        1
244 #define PUBKEY_ALGO_RSA_E      2     /* RSA encrypt only */
245 #define PUBKEY_ALGO_RSA_S      3     /* RSA sign only */
246 #define PUBKEY_ALGO_ELGAMAL_E 16     /* encrypt only ElGamal (but not vor v3)*/
247 #define PUBKEY_ALGO_DSA       17
248 #define PUBKEY_ALGO_ELGAMAL   20     /* sign and encrypt elgamal */
249
250 #define DIGEST_ALGO_MD5       1
251 #define DIGEST_ALGO_SHA1      2
252 #define DIGEST_ALGO_RMD160    3
253 #define DIGEST_ALGO_TIGER     6
254
255 #define is_RSA(a)     ((a)==PUBKEY_ALGO_RSA || (a)==PUBKEY_ALGO_RSA_E \
256                        || (a)==PUBKEY_ALGO_RSA_S )
257 #define is_ELGAMAL(a) ((a)==PUBKEY_ALGO_ELGAMAL || (a)==PUBKEY_ALGO_ELGAMAL_E)
258
259 #define G10ERR_GENERAL         1
260 #define G10ERR_PUBKEY_ALGO     4
261 #define G10ERR_DIGEST_ALGO     5
262 #define G10ERR_BAD_PUBKEY      6
263 #define G10ERR_BAD_SECKEY      7
264 #define G10ERR_BAD_SIGN        8
265 #define G10ERR_CIPHER_ALGO    12
266 #define G10ERR_WRONG_SECKEY   18
267 #define G10ERR_UNSUPPORTED    19
268 #define G10ERR_NI_PUBKEY      27
269 #define G10ERR_NI_CIPHER      28
270 #define G10ERR_BAD_MPI        30
271 #define G10ERR_WR_PUBKEY_ALGO 41
272 #endif
273
274 /***********************************************
275  *                                             *
276  *   Some very handy macros                    *
277  *                                             *
278  ***********************************************/
279 #ifndef GCRYPT_NO_MPI_MACROS
280
281 typedef struct gcry_mpi *MPI;
282
283
284 #endif /* GCRYPT_NO_MPI_MACROS */
285
286 #ifdef __cplusplus
287 }
288 #endif
289 #endif /* _GCRYPT_H */