3acf2671fd09631f398c73d0be6bdefa78adcd74
[fwknop.git] / lib / fko.h
1 /*
2  *****************************************************************************
3  *
4  * File:    fko.h
5  *
6  * Author:  Damien S. Stuart
7  *
8  * Purpose: Header for libfko.
9  *
10  * Copyright 2009-2010 Damien Stuart (dstuart@dstuart.org)
11  *
12  *  License (GNU Public License):
13  *
14  *  This program is free software; you can redistribute it and/or
15  *  modify it under the terms of the GNU General Public License
16  *  as published by the Free Software Foundation; either version 2
17  *  of the License, or (at your option) any later version.
18  *
19  *  This program is distributed in the hope that it will be useful,
20  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  *  GNU General Public License for more details.
23  *
24  *  You should have received a copy of the GNU General Public License
25  *  along with this program; if not, write to the Free Software
26  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
27  *  USA
28  *
29  *****************************************************************************
30 */
31 #ifndef FKO_H
32 #define FKO_H 1
33
34 #include <time.h>
35 #include "fko_limits.h"
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 #ifdef WIN32
42   #ifdef DLL_EXPORTS
43     #define DLL_API __declspec(dllexport)
44   #else
45         #ifdef DLL_IMPORTS
46                 #define DLL_API __declspec(dllimport)
47         #else
48                 #define DLL_API
49         #endif
50   #endif
51 #else
52   #define DLL_API
53 #endif
54
55 /* General params
56 */
57 #define FKO_PROTOCOL_VERSION "1.9.12" /* The fwknop protocol version */
58
59 /* Supported FKO Message types...
60 */
61 typedef enum {
62     FKO_COMMAND_MSG = 0,
63     FKO_ACCESS_MSG,
64     FKO_NAT_ACCESS_MSG,
65     FKO_CLIENT_TIMEOUT_ACCESS_MSG,
66     FKO_CLIENT_TIMEOUT_NAT_ACCESS_MSG,
67     FKO_LOCAL_NAT_ACCESS_MSG,
68     FKO_CLIENT_TIMEOUT_LOCAL_NAT_ACCESS_MSG,
69     FKO_LAST_MSG_TYPE /* Always leave this as the last one */
70 } fko_message_type_t;
71
72 /* Supported digest types...
73 */
74 typedef enum {
75     FKO_DIGEST_INVALID_DATA = -1,
76     FKO_DIGEST_UNKNOWN = 0,
77     FKO_DIGEST_MD5,
78     FKO_DIGEST_SHA1,
79     FKO_DIGEST_SHA256,
80     FKO_DIGEST_SHA384,
81     FKO_DIGEST_SHA512,
82     FKO_LAST_DIGEST_TYPE /* Always leave this as the last one */
83 } fko_digest_type_t;
84
85 /* Supported encryption types...
86 */
87 typedef enum {
88     FKO_ENCRYPTION_INVALID_DATA = -1,
89     FKO_ENCRYPTION_UNKNOWN = 0,
90     FKO_ENCRYPTION_RIJNDAEL,
91     FKO_ENCRYPTION_GPG,
92     FKO_LAST_ENCRYPTION_TYPE /* Always leave this as the last one */
93 } fko_encryption_type_t;
94
95 /* FKO ERROR_CODES
96  *
97  * Note: If you change this list in any way, please be sure to make the
98  *       appropriate corresponding change to the error message list in
99  *       fko_error.c.
100 */
101 typedef enum {
102     FKO_SUCCESS = 0,
103     FKO_ERROR_CTX_NOT_INITIALIZED,
104     FKO_ERROR_MEMORY_ALLOCATION,
105     FKO_ERROR_FILESYSTEM_OPERATION,
106     FKO_ERROR_INVALID_DATA,
107     FKO_ERROR_DATA_TOO_LARGE,
108     FKO_ERROR_USERNAME_UNKNOWN,
109     FKO_ERROR_INCOMPLETE_SPA_DATA,
110     FKO_ERROR_MISSING_ENCODED_DATA,
111     FKO_ERROR_INVALID_DIGEST_TYPE,
112     FKO_ERROR_INVALID_ALLOW_IP,
113     FKO_ERROR_INVALID_SPA_COMMAND_MSG,
114     FKO_ERROR_INVALID_SPA_ACCESS_MSG,
115     FKO_ERROR_INVALID_SPA_NAT_ACCESS_MSG,
116     FKO_ERROR_INVALID_ENCRYPTION_TYPE,
117     FKO_ERROR_WRONG_ENCRYPTION_TYPE,
118     FKO_ERROR_DECRYPTION_SIZE,
119     FKO_ERROR_DECRYPTION_FAILURE,
120     FKO_ERROR_DIGEST_VERIFICATION_FAILED,
121     FKO_ERROR_UNSUPPORTED_FEATURE,
122     FKO_ERROR_UNKNOWN,
123
124     /* Start GPGME-related errors */
125     GPGME_ERR_START,
126     FKO_ERROR_MISSING_GPG_KEY_DATA,
127     FKO_ERROR_GPGME_NO_OPENPGP,
128     FKO_ERROR_GPGME_CONTEXT,
129     FKO_ERROR_GPGME_PLAINTEXT_DATA_OBJ,
130     FKO_ERROR_GPGME_SET_PROTOCOL,
131     FKO_ERROR_GPGME_CIPHER_DATA_OBJ,
132     FKO_ERROR_GPGME_BAD_PASSPHRASE,
133     FKO_ERROR_GPGME_ENCRYPT_SIGN,
134     FKO_ERROR_GPGME_CONTEXT_SIGNER_KEY,
135     FKO_ERROR_GPGME_SIGNER_KEYLIST_START,
136     FKO_ERROR_GPGME_SIGNER_KEY_NOT_FOUND,
137     FKO_ERROR_GPGME_SIGNER_KEY_AMBIGUOUS,
138     FKO_ERROR_GPGME_ADD_SIGNER,
139     FKO_ERROR_GPGME_CONTEXT_RECIPIENT_KEY,
140     FKO_ERROR_GPGME_RECIPIENT_KEYLIST_START,
141     FKO_ERROR_GPGME_RECIPIENT_KEY_NOT_FOUND,
142     FKO_ERROR_GPGME_RECIPIENT_KEY_AMBIGUOUS,
143     FKO_ERROR_GPGME_DECRYPT_FAILED,
144     FKO_ERROR_GPGME_DECRYPT_UNSUPPORTED_ALGORITHM,
145     FKO_ERROR_GPGME_BAD_GPG_EXE,
146     FKO_ERROR_GPGME_BAD_HOME_DIR,
147     FKO_ERROR_GPGME_SET_HOME_DIR,
148     FKO_ERROR_GPGME_NO_SIGNATURE,
149     FKO_ERROR_GPGME_BAD_SIGNATURE,
150     FKO_ERROR_GPGME_SIGNATURE_VERIFY_DISABLED,
151
152     FKO_LAST_ERROR
153 } fko_error_codes_t;
154
155 /* Macro that returns true if the given error code is a gpg-related error.
156 */
157 #define IS_GPG_ERROR(x) (x > GPGME_ERR_START && x < FKO_LAST_ERROR)
158
159 /* General Defaults
160 */
161 #define FKO_DEFAULT_MSG_TYPE    FKO_ACCESS_MSG
162 #define FKO_DEFAULT_DIGEST      FKO_DIGEST_SHA256
163 #define FKO_DEFAULT_ENCRYPTION  FKO_ENCRYPTION_RIJNDAEL
164
165 /* Define the consistent prefixes or salt on some encryption schemes.
166 */
167 #define B64_RIJNDAEL_SALT "U2FsdGVkX1"
168 #define B64_RIJNDAEL_SALT_STR_LEN 10
169
170 #define B64_GPG_PREFIX "hQ"
171 #define B64_GPG_PREFIX_STR_LEN 2
172
173 /* The context holds the global state and config options, as
174  * well as some intermediate results during processing. This
175  * is an opaque pointer.
176 */
177 struct fko_context;
178 typedef struct fko_context *fko_ctx_t;
179
180 /* Some gpg-specifc data types and constants.
181 */
182 #if HAVE_LIBGPGME
183
184 enum {
185     FKO_GPG_NO_SIG_VERIFY_SIGS  = 0x01,
186     FKO_GPG_ALLOW_BAD_SIG       = 0x02,
187     FKO_GPG_NO_SIG_INFO         = 0x04,
188     FKO_GPG_ALLOW_EXPIRED_SIG   = 0x08,
189     FKO_GPG_ALLOW_REVOKED_SIG   = 0x10
190 };
191
192 #define FKO_GPG_GOOD_SIGSUM     3
193
194 #endif /* HAVE_LIBGPGME */
195
196 /* Function prototypes */
197
198 /* General api calls
199 */
200 DLL_API int fko_new(fko_ctx_t *ctx);
201 DLL_API int fko_new_with_data(fko_ctx_t *ctx, const char *enc_msg, const char *dec_key);
202 DLL_API void fko_destroy(fko_ctx_t ctx);
203 DLL_API int fko_spa_data_final(fko_ctx_t ctx, const char *enc_key);
204
205
206 /* Set context data functions
207 */
208 DLL_API int fko_set_rand_value(fko_ctx_t ctx, const char *val);
209 DLL_API int fko_set_username(fko_ctx_t ctx, const char *spoof_user);
210 DLL_API int fko_set_timestamp(fko_ctx_t ctx, const int offset);
211 DLL_API int fko_set_spa_message_type(fko_ctx_t ctx, const short msg_type);
212 DLL_API int fko_set_spa_message(fko_ctx_t ctx, const char *msg_string);
213 DLL_API int fko_set_spa_nat_access(fko_ctx_t ctx, const char *nat_access);
214 DLL_API int fko_set_spa_server_auth(fko_ctx_t ctx, const char *server_auth);
215 DLL_API int fko_set_spa_client_timeout(fko_ctx_t ctx, const int timeout);
216 DLL_API int fko_set_spa_digest_type(fko_ctx_t ctx, const short digest_type);
217 DLL_API int fko_set_spa_digest(fko_ctx_t ctx);
218 DLL_API int fko_set_raw_spa_digest_type(fko_ctx_t ctx, const short raw_digest_type);
219 DLL_API int fko_set_raw_spa_digest(fko_ctx_t ctx);
220 DLL_API int fko_set_spa_encryption_type(fko_ctx_t ctx, const short encrypt_type);
221 DLL_API int fko_set_spa_data(fko_ctx_t ctx, const char *enc_msg);
222
223 /* Data processing and misc utility functions
224 */
225 DLL_API const char* fko_errstr(const int err_code);
226 DLL_API int fko_encryption_type(const char *enc_data);
227
228 DLL_API int fko_encode_spa_data(fko_ctx_t ctx);
229 DLL_API int fko_decode_spa_data(fko_ctx_t ctx);
230 DLL_API int fko_encrypt_spa_data(fko_ctx_t ctx, const char *enc_key);
231 DLL_API int fko_decrypt_spa_data(fko_ctx_t ctx, const char *dec_key);
232
233 DLL_API int fko_get_encoded_data(fko_ctx_t ctx, char **enc_data);
234
235
236 /* Get context data functions
237 */
238 DLL_API int fko_get_rand_value(fko_ctx_t ctx, char **rand_val);
239 DLL_API int fko_get_username(fko_ctx_t ctx, char **username);
240 DLL_API int fko_get_timestamp(fko_ctx_t ctx, time_t *ts);
241 DLL_API int fko_get_spa_message_type(fko_ctx_t ctx, short *spa_msg);
242 DLL_API int fko_get_spa_message(fko_ctx_t ctx, char **spa_message);
243 DLL_API int fko_get_spa_nat_access(fko_ctx_t ctx, char **nat_access);
244 DLL_API int fko_get_spa_server_auth(fko_ctx_t ctx, char **server_auth);
245 DLL_API int fko_get_spa_client_timeout(fko_ctx_t ctx, int *client_timeout);
246 DLL_API int fko_get_spa_digest_type(fko_ctx_t ctx, short *spa_digest_type);
247 DLL_API int fko_get_raw_spa_digest_type(fko_ctx_t ctx, short *raw_spa_digest_type);
248 DLL_API int fko_get_spa_digest(fko_ctx_t ctx, char **spa_digest);
249 DLL_API int fko_get_raw_spa_digest(fko_ctx_t ctx, char **raw_spa_digest);
250 DLL_API int fko_get_spa_encryption_type(fko_ctx_t ctx, short *spa_enc_type);
251 DLL_API int fko_get_spa_data(fko_ctx_t ctx, char **spa_data);
252
253 DLL_API int fko_get_version(fko_ctx_t ctx, char **version);
254
255 /* GPG-related functions */
256 DLL_API int fko_set_gpg_exe(fko_ctx_t ctx, const char *gpg_exe);
257 DLL_API int fko_get_gpg_exe(fko_ctx_t ctx, char **gpg_exe);
258
259 DLL_API int fko_set_gpg_recipient(fko_ctx_t ctx, const char *recip);
260 DLL_API int fko_get_gpg_recipient(fko_ctx_t ctx, char **recip);
261 DLL_API int fko_set_gpg_signer(fko_ctx_t ctx, const char *signer);
262 DLL_API int fko_get_gpg_signer(fko_ctx_t ctx, char **signer);
263 DLL_API int fko_set_gpg_home_dir(fko_ctx_t ctx, const char *gpg_home_dir);
264 DLL_API int fko_get_gpg_home_dir(fko_ctx_t ctx, char **gpg_home_dir);
265
266 DLL_API const char* fko_gpg_errstr(fko_ctx_t ctx);
267
268 DLL_API int fko_set_gpg_signature_verify(fko_ctx_t ctx, const unsigned char val);
269 DLL_API int fko_get_gpg_signature_verify(fko_ctx_t ctx, unsigned char *val);
270 DLL_API int fko_set_gpg_ignore_verify_error(fko_ctx_t ctx, const unsigned char val);
271 DLL_API int fko_get_gpg_ignore_verify_error(fko_ctx_t ctx, unsigned char *val);
272
273 DLL_API int fko_get_gpg_signature_id(fko_ctx_t ctx, char **sig_id);
274 DLL_API int fko_get_gpg_signature_fpr(fko_ctx_t ctx, char **sig_fpr);
275 DLL_API int fko_get_gpg_signature_summary(fko_ctx_t ctx, int *sigsum);
276 DLL_API int fko_get_gpg_signature_status(fko_ctx_t ctx, int *sigstat);
277
278 DLL_API int fko_gpg_signature_id_match(fko_ctx_t ctx, const char *id, unsigned char *result);
279 DLL_API int fko_gpg_signature_fpr_match(fko_ctx_t ctx, const char *fpr, unsigned char *result);
280
281 #ifdef __cplusplus
282 }
283 #endif
284
285 #endif /* FKO_H */
286
287 /***EOF***/