Add support for Salsa20.
[libgcrypt.git] / src / gcrypt-module.h
1 /* gcrypt-module.h - GNU Cryptographic Library Interface
2    Copyright (C) 2003, 2007 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, see <http://www.gnu.org/licenses/>.
18  */
19
20 /*
21    This file contains the necessary declarations/definitions for
22    working with Libgcrypt modules.  Since 1.6 this is an internal
23    interface and will eventually be merged into another header or
24    entirely removed.
25  */
26
27 #ifndef GCRYPT_MODULE_H
28 #define GCRYPT_MODULE_H
29
30 #ifdef __cplusplus
31 extern "C" {
32 #if 0 /* keep Emacsens's auto-indent happy */
33 }
34 #endif
35 #endif
36
37 /* The interfaces using the module system reserve a certain range of
38    IDs for application use.  These IDs are not valid within Libgcrypt
39    but Libgcrypt makes sure never to allocate such a module ID.  */
40 #define GCRY_MODULE_ID_USER      1024
41 #define GCRY_MODULE_ID_USER_LAST 4095
42
43
44 /* This type represents a `module'.  */
45 typedef struct gcry_module *gcry_module_t;
46
47 /* Check that the library fulfills the version requirement.  */
48
49 /* Type for the cipher_setkey function.  */
50 typedef gcry_err_code_t (*gcry_cipher_setkey_t) (void *c,
51                                                  const unsigned char *key,
52                                                  unsigned keylen);
53
54 /* Type for the cipher_encrypt function.  */
55 typedef void (*gcry_cipher_encrypt_t) (void *c,
56                                        unsigned char *outbuf,
57                                        const unsigned char *inbuf);
58
59 /* Type for the cipher_decrypt function.  */
60 typedef void (*gcry_cipher_decrypt_t) (void *c,
61                                        unsigned char *outbuf,
62                                        const unsigned char *inbuf);
63
64 /* Type for the cipher_stencrypt function.  */
65 typedef void (*gcry_cipher_stencrypt_t) (void *c,
66                                          unsigned char *outbuf,
67                                          const unsigned char *inbuf,
68                                          unsigned int n);
69
70 /* Type for the cipher_stdecrypt function.  */
71 typedef void (*gcry_cipher_stdecrypt_t) (void *c,
72                                          unsigned char *outbuf,
73                                          const unsigned char *inbuf,
74                                          unsigned int n);
75
76 typedef struct gcry_cipher_oid_spec
77 {
78   const char *oid;
79   int mode;
80 } gcry_cipher_oid_spec_t;
81
82 /* Module specification structure for ciphers.  */
83 typedef struct gcry_cipher_spec
84 {
85   const char *name;
86   const char **aliases;
87   gcry_cipher_oid_spec_t *oids;
88   size_t blocksize;
89   size_t keylen;
90   size_t contextsize;
91   gcry_cipher_setkey_t setkey;
92   gcry_cipher_encrypt_t encrypt;
93   gcry_cipher_decrypt_t decrypt;
94   gcry_cipher_stencrypt_t stencrypt;
95   gcry_cipher_stdecrypt_t stdecrypt;
96 } gcry_cipher_spec_t;
97
98
99 /* ********************** */
100
101 /* Type for the pk_generate function.  */
102 typedef gcry_err_code_t (*gcry_pk_generate_t) (int algo,
103                                                unsigned int nbits,
104                                                unsigned long use_e,
105                                                gcry_mpi_t *skey,
106                                                gcry_mpi_t **retfactors);
107
108 /* Type for the pk_check_secret_key function.  */
109 typedef gcry_err_code_t (*gcry_pk_check_secret_key_t) (int algo,
110                                                        gcry_mpi_t *skey);
111
112 /* Type for the pk_encrypt function.  */
113 typedef gcry_err_code_t (*gcry_pk_encrypt_t) (int algo,
114                                               gcry_mpi_t *resarr,
115                                               gcry_mpi_t data,
116                                               gcry_mpi_t *pkey,
117                                               int flags);
118
119 /* Type for the pk_decrypt function.  */
120 typedef gcry_err_code_t (*gcry_pk_decrypt_t) (int algo,
121                                               gcry_mpi_t *result,
122                                               gcry_mpi_t *data,
123                                               gcry_mpi_t *skey,
124                                               int flags);
125
126 /* Type for the pk_sign function.  */
127 typedef gcry_err_code_t (*gcry_pk_sign_t) (int algo,
128                                            gcry_mpi_t *resarr,
129                                            gcry_mpi_t data,
130                                            gcry_mpi_t *skey,
131                                            int flags,
132                                            int hashalgo);
133
134 /* Type for the pk_verify function.  */
135 typedef gcry_err_code_t (*gcry_pk_verify_t) (int algo,
136                                              gcry_mpi_t hash,
137                                              gcry_mpi_t *data,
138                                              gcry_mpi_t *pkey,
139                                              int (*cmp) (void *, gcry_mpi_t),
140                                              void *opaquev);
141
142 /* Type for the pk_get_nbits function.  */
143 typedef unsigned (*gcry_pk_get_nbits_t) (int algo, gcry_mpi_t *pkey);
144
145 /* Module specification structure for message digests.  */
146 typedef struct gcry_pk_spec
147 {
148   const char *name;
149   const char **aliases;
150   const char *elements_pkey;
151   const char *elements_skey;
152   const char *elements_enc;
153   const char *elements_sig;
154   const char *elements_grip;
155   int use;
156   gcry_pk_generate_t generate;
157   gcry_pk_check_secret_key_t check_secret_key;
158   gcry_pk_encrypt_t encrypt;
159   gcry_pk_decrypt_t decrypt;
160   gcry_pk_sign_t sign;
161   gcry_pk_verify_t verify;
162   gcry_pk_get_nbits_t get_nbits;
163 } gcry_pk_spec_t;
164
165
166 /* ********************** */
167
168 /* Type for the md_init function.  */
169 typedef void (*gcry_md_init_t) (void *c);
170
171 /* Type for the md_write function.  */
172 typedef void (*gcry_md_write_t) (void *c, const void *buf, size_t nbytes);
173
174 /* Type for the md_final function.  */
175 typedef void (*gcry_md_final_t) (void *c);
176
177 /* Type for the md_read function.  */
178 typedef unsigned char *(*gcry_md_read_t) (void *c);
179
180 typedef struct gcry_md_oid_spec
181 {
182   const char *oidstring;
183 } gcry_md_oid_spec_t;
184
185 /* Module specification structure for message digests.  */
186 typedef struct gcry_md_spec
187 {
188   const char *name;
189   unsigned char *asnoid;
190   int asnlen;
191   gcry_md_oid_spec_t *oids;
192   int mdlen;
193   gcry_md_init_t init;
194   gcry_md_write_t write;
195   gcry_md_final_t final;
196   gcry_md_read_t read;
197   size_t contextsize; /* allocate this amount of context */
198 } gcry_md_spec_t;
199
200 #if 0 /* keep Emacsens's auto-indent happy */
201 {
202 #endif
203 #ifdef __cplusplus
204 }
205 #endif
206 #endif /*GCRYPT_MODULE_H*/