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