1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*  GMime
3  *  Copyright (C) 2000-2009 Jeffrey Stedfast
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser General Public License
7  *  as published by the Free Software Foundation; either version 2.1
8  *  of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free
17  *  Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
18  *  02110-1301, USA.
19  */
20 
21 
22 #ifndef __GMIME_CIPHER_CONTEXT_H__
23 #define __GMIME_CIPHER_CONTEXT_H__
24 
25 #include <glib.h>
26 #include <glib-object.h>
27 
28 #include <time.h>
29 
30 #include <gmime/gmime-stream.h>
31 #include <gmime/gmime-session.h>
32 
33 G_BEGIN_DECLS
34 
35 #define GMIME_TYPE_CIPHER_CONTEXT            (g_mime_cipher_context_get_type ())
36 #define GMIME_CIPHER_CONTEXT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_CIPHER_CONTEXT, GMimeCipherContext))
37 #define GMIME_CIPHER_CONTEXT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_CIPHER_CONTEXT, GMimeCipherContextClass))
38 #define GMIME_IS_CIPHER_CONTEXT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_CIPHER_CONTEXT))
39 #define GMIME_IS_CIPHER_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_CIPHER_CONTEXT))
40 #define GMIME_CIPHER_CONTEXT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_CIPHER_CONTEXT, GMimeCipherContextClass))
41 
42 typedef struct _GMimeCipherContext GMimeCipherContext;
43 typedef struct _GMimeCipherContextClass GMimeCipherContextClass;
44 
45 typedef struct _GMimeSigner GMimeSigner;
46 typedef struct _GMimeSignatureValidity GMimeSignatureValidity;
47 
48 
49 /**
50  * GMimeCipherHash:
51  * @GMIME_CIPHER_HASH_DEFAULT: The default hash algorithm.
52  * @GMIME_CIPHER_HASH_MD2: The MD2 hash algorithm.
53  * @GMIME_CIPHER_HASH_MD5: The MD5 hash algorithm.
54  * @GMIME_CIPHER_HASH_SHA1: The SHA-1 hash algorithm.
55  * @GMIME_CIPHER_HASH_RIPEMD160: The RIPEMD-160 hash algorithm.
56  * @GMIME_CIPHER_HASH_TIGER192: The TIGER-192 hash algorithm.
57  * @GMIME_CIPHER_HASH_HAVAL5160: The HAVAL-5160 hash algorithm.
58  *
59  * A hash algorithm.
60  **/
61 typedef enum {
62 	GMIME_CIPHER_HASH_DEFAULT,
63 	GMIME_CIPHER_HASH_MD2,
64 	GMIME_CIPHER_HASH_MD5,
65 	GMIME_CIPHER_HASH_SHA1,
66 	GMIME_CIPHER_HASH_RIPEMD160,
67 	GMIME_CIPHER_HASH_TIGER192,
68 	GMIME_CIPHER_HASH_HAVAL5160
69 } GMimeCipherHash;
70 
71 struct _GMimeCipherContext {
72 	GObject parent_object;
73 
74 	GMimeSession *session;
75 
76 	/* these must be set by the subclass */
77 	const char *sign_protocol;
78 	const char *encrypt_protocol;
79 	const char *key_protocol;
80 };
81 
82 struct _GMimeCipherContextClass {
83 	GObjectClass parent_class;
84 
85 	GMimeCipherHash          (* hash_id)     (GMimeCipherContext *ctx, const char *hash);
86 
87 	const char *             (* hash_name)   (GMimeCipherContext *ctx, GMimeCipherHash hash);
88 
89 	int                      (* sign)        (GMimeCipherContext *ctx, const char *userid,
90 						  GMimeCipherHash hash, GMimeStream *istream,
91 						  GMimeStream *ostream, GError **err);
92 
93 	GMimeSignatureValidity * (* verify)      (GMimeCipherContext *ctx, GMimeCipherHash hash,
94 						  GMimeStream *istream, GMimeStream *sigstream,
95 						  GError **err);
96 
97 	int                      (* encrypt)     (GMimeCipherContext *ctx, gboolean sign,
98 						  const char *userid, GPtrArray *recipients,
99 						  GMimeStream *istream, GMimeStream *ostream,
100 						  GError **err);
101 
102 	int                      (* decrypt)     (GMimeCipherContext *ctx, GMimeStream *istream,
103 						  GMimeStream *ostream, GError **err);
104 
105 	int                      (* import_keys) (GMimeCipherContext *ctx, GMimeStream *istream,
106 						  GError **err);
107 
108 	int                      (* export_keys) (GMimeCipherContext *ctx, GPtrArray *keys,
109 						  GMimeStream *ostream, GError **err);
110 };
111 
112 
113 GType g_mime_cipher_context_get_type (void);
114 
115 
116 /* hash routines */
117 GMimeCipherHash      g_mime_cipher_hash_id (GMimeCipherContext *ctx, const char *hash);
118 
119 const char *         g_mime_cipher_hash_name (GMimeCipherContext *ctx, GMimeCipherHash hash);
120 
121 /* cipher routines */
122 int                  g_mime_cipher_sign (GMimeCipherContext *ctx, const char *userid,
123 					 GMimeCipherHash hash, GMimeStream *istream,
124 					 GMimeStream *ostream, GError **err);
125 
126 GMimeSignatureValidity *g_mime_cipher_verify (GMimeCipherContext *ctx, GMimeCipherHash hash,
127 					      GMimeStream *istream, GMimeStream *sigstream,
128 					      GError **err);
129 
130 int                  g_mime_cipher_encrypt (GMimeCipherContext *ctx, gboolean sign,
131 					    const char *userid, GPtrArray *recipients,
132 					    GMimeStream *istream, GMimeStream *ostream,
133 					    GError **err);
134 
135 int                  g_mime_cipher_decrypt (GMimeCipherContext *ctx, GMimeStream *istream,
136 					    GMimeStream *ostream, GError **err);
137 
138 /* key/certificate routines */
139 int                  g_mime_cipher_import_keys (GMimeCipherContext *ctx, GMimeStream *istream,
140 						GError **err);
141 
142 int                  g_mime_cipher_export_keys (GMimeCipherContext *ctx, GPtrArray *keys,
143 						GMimeStream *ostream, GError **err);
144 
145 
146 
147 /* signature status structures and functions */
148 
149 /**
150  * GMimeSignerTrust:
151  * @GMIME_SIGNER_TRUST_NONE: No trust assigned.
152  * @GMIME_SIGNER_TRUST_NEVER: Never trust this signer.
153  * @GMIME_SIGNER_TRUST_UNDEFINED: Undefined trust for this signer.
154  * @GMIME_SIGNER_TRUST_MARGINAL: Trust this signer maginally.
155  * @GMIME_SIGNER_TRUST_FULLY: Trust this signer fully.
156  * @GMIME_SIGNER_TRUST_ULTIMATE: Trust this signer ultimately.
157  *
158  * The trust value of a signer.
159  **/
160 typedef enum {
161 	GMIME_SIGNER_TRUST_NONE,
162 	GMIME_SIGNER_TRUST_NEVER,
163 	GMIME_SIGNER_TRUST_UNDEFINED,
164 	GMIME_SIGNER_TRUST_MARGINAL,
165 	GMIME_SIGNER_TRUST_FULLY,
166 	GMIME_SIGNER_TRUST_ULTIMATE
167 } GMimeSignerTrust;
168 
169 
170 /**
171  * GMimeSignerStatus:
172  * @GMIME_SIGNER_STATUS_NONE: No status.
173  * @GMIME_SIGNER_STATUS_GOOD: Good signature.
174  * @GMIME_SIGNER_STATUS_BAD: Bad signature.
175  * @GMIME_SIGNER_STATUS_ERROR: An error occurred.
176  *
177  * A value representing the signature status for a particular
178  * #GMimeSigner.
179  **/
180 typedef enum {
181 	GMIME_SIGNER_STATUS_NONE,
182 	GMIME_SIGNER_STATUS_GOOD,
183 	GMIME_SIGNER_STATUS_BAD,
184 	GMIME_SIGNER_STATUS_ERROR
185 } GMimeSignerStatus;
186 
187 
188 /**
189  * GMimeSignerError:
190  * @GMIME_SIGNER_ERROR_NONE: No error.
191  * @GMIME_SIGNER_ERROR_EXPSIG: Expired signature.
192  * @GMIME_SIGNER_ERROR_NO_PUBKEY: No public key found.
193  * @GMIME_SIGNER_ERROR_EXPKEYSIG: Expired signature key.
194  * @GMIME_SIGNER_ERROR_REVKEYSIG: Revoked signature key.
195  *
196  * Possible errors that a #GMimeSigner could have.
197  **/
198 typedef enum {
199 	GMIME_SIGNER_ERROR_NONE,
200 	GMIME_SIGNER_ERROR_EXPSIG     = (1 << 0),  /* expire signature */
201 	GMIME_SIGNER_ERROR_NO_PUBKEY  = (1 << 1),  /* no public key */
202 	GMIME_SIGNER_ERROR_EXPKEYSIG  = (1 << 2),  /* expired key */
203 	GMIME_SIGNER_ERROR_REVKEYSIG  = (1 << 3)   /* revoked key */
204 } GMimeSignerError;
205 
206 
207 /**
208  * GMimeSigner:
209  * @next: Pointer to the next #GMimeSigner.
210  * @status: A #GMimeSignerStatus.
211  * @errors: A bitfield of #GMimeSignerError values.
212  * @trust: A #GMimeSignerTrust.
213  * @unused: Unused expansion bits for future use; ignore this.
214  * @sig_created: The creation date of the signature.
215  * @sig_expire: The expiration date of the signature.
216  * @fingerprint: A hex string representing the signer's fingerprint.
217  * @keyid: The signer's key id.
218  * @name: The name of the person or entity.
219  *
220  * A structure containing useful information about a signer.
221  **/
222 struct _GMimeSigner {
223 	GMimeSigner *next;
224 	unsigned int status:2;    /* GMimeSignerStatus */
225 	unsigned int errors:4;    /* bitfield of GMimeSignerError's */
226 	unsigned int trust:3;     /* GMimeSignerTrust */
227 	unsigned int unused:23;   /* unused expansion bits */
228 	time_t sig_created;
229 	time_t sig_expire;
230 	char *fingerprint;
231 	char *keyid;
232 	char *name;
233 };
234 
235 
236 GMimeSigner *g_mime_signer_new (void);
237 void         g_mime_signer_free (GMimeSigner *signer);
238 
239 
240 /**
241  * GMimeSignatureStatus:
242  * @GMIME_SIGNATURE_STATUS_NONE: No status.
243  * @GMIME_SIGNATURE_STATUS_GOOD: Good signature.
244  * @GMIME_SIGNATURE_STATUS_BAD: Bad signature.
245  * @GMIME_SIGNATURE_STATUS_UNKNOWN: Unknown signature status.
246  *
247  * The status of a message signature.
248  **/
249 typedef enum {
250 	GMIME_SIGNATURE_STATUS_NONE,
251 	GMIME_SIGNATURE_STATUS_GOOD,
252 	GMIME_SIGNATURE_STATUS_BAD,
253 	GMIME_SIGNATURE_STATUS_UNKNOWN
254 } GMimeSignatureStatus;
255 
256 
257 /**
258  * GMimeSignatureValidity:
259  * @status: The overall signature status.
260  * @signers: A list of #GMimeSigner structures.
261  * @details: A string containing more user-readable details.
262  *
263  * A structure containing information about the signature validity of
264  * a signed stream.
265  **/
266 struct _GMimeSignatureValidity {
267 	GMimeSignatureStatus status;
268 	GMimeSigner *signers;
269 	char *details;
270 };
271 
272 
273 GMimeSignatureValidity *g_mime_signature_validity_new (void);
274 void                    g_mime_signature_validity_free (GMimeSignatureValidity *validity);
275 
276 GMimeSignatureStatus    g_mime_signature_validity_get_status (GMimeSignatureValidity *validity);
277 void                    g_mime_signature_validity_set_status (GMimeSignatureValidity *validity, GMimeSignatureStatus status);
278 
279 const char             *g_mime_signature_validity_get_details (GMimeSignatureValidity *validity);
280 void                    g_mime_signature_validity_set_details (GMimeSignatureValidity *validity, const char *details);
281 
282 const GMimeSigner      *g_mime_signature_validity_get_signers (GMimeSignatureValidity *validity);
283 void                    g_mime_signature_validity_add_signer  (GMimeSignatureValidity *validity, GMimeSigner *signer);
284 
285 
286 #ifndef GMIME_DISABLE_DEPRECATED
287 
288 /* for backward compatability */
289 typedef struct _GMimeSignatureValidity GMimeCipherValidity;
290 
291 GMimeCipherValidity *g_mime_cipher_validity_new (void);
292 
293 void                 g_mime_cipher_validity_init (GMimeCipherValidity *validity);
294 
295 gboolean             g_mime_cipher_validity_get_valid (GMimeCipherValidity *validity);
296 
297 void                 g_mime_cipher_validity_set_valid (GMimeCipherValidity *validity, gboolean valid);
298 
299 const char          *g_mime_cipher_validity_get_description (GMimeCipherValidity *validity);
300 
301 void                 g_mime_cipher_validity_set_description (GMimeCipherValidity *validity,
302 							     const char *description);
303 
304 void                 g_mime_cipher_validity_clear (GMimeCipherValidity *validity);
305 
306 void                 g_mime_cipher_validity_free (GMimeCipherValidity *validity);
307 
308 #endif /* GMIME_DISABLE_DEPRECATED */
309 
310 G_END_DECLS
311 
312 #endif /* __GMIME_CIPHER_CONTEXT_H__ */
313