/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
* This library is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
* Authors: Jeffrey Stedfast
*/
#if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION)
#error "Only can be included directly."
#endif
#ifndef CAMEL_CIPHER_CONTEXT_H
#define CAMEL_CIPHER_CONTEXT_H
#include
#include
/* Standard GObject macros */
#define CAMEL_TYPE_CIPHER_CONTEXT \
(camel_cipher_context_get_type ())
#define CAMEL_CIPHER_CONTEXT(obj) \
(G_TYPE_CHECK_INSTANCE_CAST \
((obj), CAMEL_TYPE_CIPHER_CONTEXT, CamelCipherContext))
#define CAMEL_CIPHER_CONTEXT_CLASS(cls) \
(G_TYPE_CHECK_CLASS_CAST \
((cls), CAMEL_TYPE_CIPHER_CONTEXT, CamelCipherContextClass))
#define CAMEL_IS_CIPHER_CONTEXT(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE \
((obj), CAMEL_TYPE_CIPHER_CONTEXT))
#define CAMEL_IS_CIPHER_CONTEXT_CLASS(cls) \
(G_TYPE_CHECK_CLASS_TYPE \
((cls), CAMEL_TYPE_CIPHER_CONTEXT))
#define CAMEL_CIPHER_CONTEXT_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS \
((obj), CAMEL_TYPE_CIPHER_CONTEXT, CamelCipherContextClass))
G_BEGIN_DECLS
typedef struct _CamelCipherValidity CamelCipherValidity;
typedef struct _CamelCipherCertInfo CamelCipherCertInfo;
typedef struct _CamelCipherContext CamelCipherContext;
typedef struct _CamelCipherContextClass CamelCipherContextClass;
typedef struct _CamelCipherContextPrivate CamelCipherContextPrivate;
typedef enum {
CAMEL_CIPHER_HASH_DEFAULT,
CAMEL_CIPHER_HASH_MD2,
CAMEL_CIPHER_HASH_MD5,
CAMEL_CIPHER_HASH_SHA1,
CAMEL_CIPHER_HASH_SHA256,
CAMEL_CIPHER_HASH_SHA384,
CAMEL_CIPHER_HASH_SHA512,
CAMEL_CIPHER_HASH_RIPEMD160,
CAMEL_CIPHER_HASH_TIGER192,
CAMEL_CIPHER_HASH_HAVAL5160
} CamelCipherHash;
typedef enum _camel_cipher_validity_sign_t {
CAMEL_CIPHER_VALIDITY_SIGN_NONE,
CAMEL_CIPHER_VALIDITY_SIGN_GOOD,
CAMEL_CIPHER_VALIDITY_SIGN_BAD,
CAMEL_CIPHER_VALIDITY_SIGN_UNKNOWN,
CAMEL_CIPHER_VALIDITY_SIGN_NEED_PUBLIC_KEY
} camel_cipher_validity_sign_t;
typedef enum _camel_cipher_validity_encrypt_t {
CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE,
CAMEL_CIPHER_VALIDITY_ENCRYPT_WEAK,
CAMEL_CIPHER_VALIDITY_ENCRYPT_ENCRYPTED, /* encrypted, unknown strenght */
CAMEL_CIPHER_VALIDITY_ENCRYPT_STRONG
} camel_cipher_validity_encrypt_t;
typedef enum _camel_cipher_validity_mode_t {
CAMEL_CIPHER_VALIDITY_SIGN,
CAMEL_CIPHER_VALIDITY_ENCRYPT
} camel_cipher_validity_mode_t;
struct _CamelCipherCertInfo {
gchar *name; /* common name */
gchar *email;
gpointer cert_data; /* custom certificate data; can be NULL */
void (*cert_data_free) (gpointer cert_data); /* called to free cert_data; can be NULL only if cert_data is NULL */
gpointer (*cert_data_clone) (gpointer cert_data); /* called to clone cert_data; can be NULL only if cert_data is NULL */
};
struct _CamelCipherValidity {
GQueue children;
struct {
enum _camel_cipher_validity_sign_t status;
gchar *description;
GQueue signers; /* CamelCipherCertInfo's */
} sign;
struct {
enum _camel_cipher_validity_encrypt_t status;
gchar *description;
GQueue encrypters; /* CamelCipherCertInfo's */
} encrypt;
};
struct _CamelCipherContext {
GObject parent;
CamelCipherContextPrivate *priv;
};
struct _CamelCipherContextClass {
GObjectClass parent_class;
/* these MUST be set by implementors */
const gchar *sign_protocol;
const gchar *encrypt_protocol;
const gchar *key_protocol;
/* Non-Blocking Methods */
CamelCipherHash (*id_to_hash) (CamelCipherContext *context,
const gchar *id);
const gchar * (*hash_to_id) (CamelCipherContext *context,
CamelCipherHash hash);
/* Synchronous I/O Methods */
gboolean (*sign_sync) (CamelCipherContext *context,
const gchar *userid,
CamelCipherHash hash,
CamelMimePart *ipart,
CamelMimePart *opart,
GCancellable *cancellable,
GError **error);
CamelCipherValidity *
(*verify_sync) (CamelCipherContext *context,
CamelMimePart *ipart,
GCancellable *cancellable,
GError **error);
gboolean (*encrypt_sync) (CamelCipherContext *context,
const gchar *userid,
GPtrArray *recipients,
CamelMimePart *ipart,
CamelMimePart *opart,
GCancellable *cancellable,
GError **error);
CamelCipherValidity *
(*decrypt_sync) (CamelCipherContext *context,
CamelMimePart *ipart,
CamelMimePart *opart,
GCancellable *cancellable,
GError **error);
/* Reserved slots. */
gpointer reserved[8];
};
GType camel_cipher_context_get_type (void);
CamelCipherContext *
camel_cipher_context_new (CamelSession *session);
CamelSession * camel_cipher_context_get_session
(CamelCipherContext *context);
/* cipher context util routines */
CamelCipherHash camel_cipher_context_id_to_hash (CamelCipherContext *context,
const gchar *id);
const gchar * camel_cipher_context_hash_to_id (CamelCipherContext *context,
CamelCipherHash hash);
/* FIXME:
* There are some inconsistencies here, the api's should probably handle CamelMimePart's as input/outputs,
* Something that might generate a multipart/signed should do it as part of that processing, internally
* to the cipher, etc etc. */
/* cipher routines */
gboolean camel_cipher_context_sign_sync (CamelCipherContext *context,
const gchar *userid,
CamelCipherHash hash,
CamelMimePart *ipart,
CamelMimePart *opart,
GCancellable *cancellable,
GError **error);
void camel_cipher_context_sign (CamelCipherContext *context,
const gchar *userid,
CamelCipherHash hash,
CamelMimePart *ipart,
CamelMimePart *opart,
gint io_priority,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean camel_cipher_context_sign_finish
(CamelCipherContext *context,
GAsyncResult *result,
GError **error);
CamelCipherValidity *
camel_cipher_context_verify_sync
(CamelCipherContext *context,
CamelMimePart *ipart,
GCancellable *cancellable,
GError **error);
void camel_cipher_context_verify (CamelCipherContext *context,
CamelMimePart *ipart,
gint io_priority,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
CamelCipherValidity *
camel_cipher_context_verify_finish
(CamelCipherContext *context,
GAsyncResult *result,
GError **error);
gboolean camel_cipher_context_encrypt_sync
(CamelCipherContext *context,
const gchar *userid,
GPtrArray *recipients,
CamelMimePart *ipart,
CamelMimePart *opart,
GCancellable *cancellable,
GError **error);
void camel_cipher_context_encrypt (CamelCipherContext *context,
const gchar *userid,
GPtrArray *recipients,
CamelMimePart *ipart,
CamelMimePart *opart,
gint io_priority,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean camel_cipher_context_encrypt_finish
(CamelCipherContext *context,
GAsyncResult *result,
GError **error);
CamelCipherValidity *
camel_cipher_context_decrypt_sync
(CamelCipherContext *context,
CamelMimePart *ipart,
CamelMimePart *opart,
GCancellable *cancellable,
GError **error);
void camel_cipher_context_decrypt (CamelCipherContext *context,
CamelMimePart *ipart,
CamelMimePart *opart,
gint io_priority,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
CamelCipherValidity *
camel_cipher_context_decrypt_finish
(CamelCipherContext *context,
GAsyncResult *result,
GError **error);
/* CamelCipherValidity utility functions */
CamelCipherValidity *
camel_cipher_validity_new (void);
void camel_cipher_validity_init (CamelCipherValidity *validity);
gboolean camel_cipher_validity_get_valid (CamelCipherValidity *validity);
void camel_cipher_validity_set_valid (CamelCipherValidity *validity,
gboolean valid);
gchar * camel_cipher_validity_get_description
(CamelCipherValidity *validity);
void camel_cipher_validity_set_description
(CamelCipherValidity *validity,
const gchar *description);
void camel_cipher_validity_clear (CamelCipherValidity *validity);
CamelCipherValidity *
camel_cipher_validity_clone (CamelCipherValidity *vin);
void camel_cipher_validity_add_certinfo
(CamelCipherValidity *vin,
camel_cipher_validity_mode_t mode,
const gchar *name,
const gchar *email);
void camel_cipher_validity_add_certinfo_ex (
CamelCipherValidity *vin,
camel_cipher_validity_mode_t mode,
const gchar *name,
const gchar *email,
gpointer cert_data,
void (*cert_data_free) (gpointer cert_data),
gpointer (*cert_data_clone) (gpointer cert_data));
void camel_cipher_validity_envelope (CamelCipherValidity *parent,
CamelCipherValidity *valid);
void camel_cipher_validity_free (CamelCipherValidity *validity);
/* utility functions */
gint camel_cipher_canonical_to_stream
(CamelMimePart *part,
guint32 flags,
CamelStream *ostream,
GCancellable *cancellable,
GError **error);
G_END_DECLS
#endif /* CAMEL_CIPHER_CONTEXT_H */