00001
00025 #ifndef PURPLE_CIPHER_H
00026 #define PURPLE_CIPHER_H
00027
00028 #include <glib.h>
00029
00030 #define PURPLE_CIPHER(obj) ((PurpleCipher *)(obj))
00031 #define PURPLE_CIPHER_OPS(obj) ((PurpleCipherOps *)(obj))
00032 #define PURPLE_CIPHER_CONTEXT(obj) ((PurpleCipherContext *)(obj))
00034 typedef struct _PurpleCipher PurpleCipher;
00035 typedef struct _PurpleCipherOps PurpleCipherOps;
00036 typedef struct _PurpleCipherContext PurpleCipherContext;
00042 typedef enum _PurpleCipherCaps {
00043 PURPLE_CIPHER_CAPS_SET_OPT = 1 << 1,
00044 PURPLE_CIPHER_CAPS_GET_OPT = 1 << 2,
00045 PURPLE_CIPHER_CAPS_INIT = 1 << 3,
00046 PURPLE_CIPHER_CAPS_RESET = 1 << 4,
00047 PURPLE_CIPHER_CAPS_UNINIT = 1 << 5,
00048 PURPLE_CIPHER_CAPS_SET_IV = 1 << 6,
00049 PURPLE_CIPHER_CAPS_APPEND = 1 << 7,
00050 PURPLE_CIPHER_CAPS_DIGEST = 1 << 8,
00051 PURPLE_CIPHER_CAPS_ENCRYPT = 1 << 9,
00052 PURPLE_CIPHER_CAPS_DECRYPT = 1 << 10,
00053 PURPLE_CIPHER_CAPS_SET_SALT = 1 << 11,
00054 PURPLE_CIPHER_CAPS_GET_SALT_SIZE = 1 << 12,
00055 PURPLE_CIPHER_CAPS_SET_KEY = 1 << 13,
00056 PURPLE_CIPHER_CAPS_GET_KEY_SIZE = 1 << 14,
00057 PURPLE_CIPHER_CAPS_UNKNOWN = 1 << 16
00058 } PurpleCipherCaps;
00059
00063 struct _PurpleCipherOps {
00065 void (*set_option)(PurpleCipherContext *context, const gchar *name, void *value);
00066
00068 void *(*get_option)(PurpleCipherContext *context, const gchar *name);
00069
00071 void (*init)(PurpleCipherContext *context, void *extra);
00072
00074 void (*reset)(PurpleCipherContext *context, void *extra);
00075
00077 void (*uninit)(PurpleCipherContext *context);
00078
00080 void (*set_iv)(PurpleCipherContext *context, guchar *iv, size_t len);
00081
00083 void (*append)(PurpleCipherContext *context, const guchar *data, size_t len);
00084
00086 gboolean (*digest)(PurpleCipherContext *context, size_t in_len, guchar digest[], size_t *out_len);
00087
00089 int (*encrypt)(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
00090
00092 int (*decrypt)(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
00093
00095 void (*set_salt)(PurpleCipherContext *context, guchar *salt);
00096
00098 size_t (*get_salt_size)(PurpleCipherContext *context);
00099
00101 void (*set_key)(PurpleCipherContext *context, const guchar *key);
00102
00104 size_t (*get_key_size)(PurpleCipherContext *context);
00105
00106 void (*_purple_reserved1)(void);
00107 void (*_purple_reserved2)(void);
00108 void (*_purple_reserved3)(void);
00109 void (*_purple_reserved4)(void);
00110 };
00111
00112 #ifdef __cplusplus
00113 extern "C" {
00114 #endif
00115
00116
00118
00128 const gchar *purple_cipher_get_name(PurpleCipher *cipher);
00129
00137 guint purple_cipher_get_capabilities(PurpleCipher *cipher);
00138
00151 gboolean purple_cipher_digest_region(const gchar *name, const guchar *data, size_t data_len, size_t in_len, guchar digest[], size_t *out_len);
00152
00154
00156
00166 PurpleCipher *purple_ciphers_find_cipher(const gchar *name);
00167
00176 PurpleCipher *purple_ciphers_register_cipher(const gchar *name, PurpleCipherOps *ops);
00177
00185 gboolean purple_ciphers_unregister_cipher(PurpleCipher *cipher);
00186
00193 GList *purple_ciphers_get_ciphers(void);
00194
00196
00198
00206 gpointer purple_ciphers_get_handle(void);
00207
00211 void purple_ciphers_init(void);
00212
00216 void purple_ciphers_uninit(void);
00217
00219
00221
00231 void purple_cipher_context_set_option(PurpleCipherContext *context, const gchar *name, gpointer value);
00232
00240 gpointer purple_cipher_context_get_option(PurpleCipherContext *context, const gchar *name);
00241
00250 PurpleCipherContext *purple_cipher_context_new(PurpleCipher *cipher, void *extra);
00251
00260 PurpleCipherContext *purple_cipher_context_new_by_name(const gchar *name, void *extra);
00261
00269 void purple_cipher_context_reset(PurpleCipherContext *context, gpointer extra);
00270
00276 void purple_cipher_context_destroy(PurpleCipherContext *context);
00277
00286 void purple_cipher_context_set_iv(PurpleCipherContext *context, guchar *iv, size_t len);
00287
00295 void purple_cipher_context_append(PurpleCipherContext *context, const guchar *data, size_t len);
00296
00305 gboolean purple_cipher_context_digest(PurpleCipherContext *context, size_t in_len, guchar digest[], size_t *out_len);
00306
00315 gboolean purple_cipher_context_digest_to_str(PurpleCipherContext *context, size_t in_len, gchar digest_s[], size_t *out_len);
00316
00328 gint purple_cipher_context_encrypt(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
00329
00341 gint purple_cipher_context_decrypt(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
00342
00349 void purple_cipher_context_set_salt(PurpleCipherContext *context, guchar *salt);
00350
00358 size_t purple_cipher_context_get_salt_size(PurpleCipherContext *context);
00359
00366 void purple_cipher_context_set_key(PurpleCipherContext *context, const guchar *key);
00367
00375 size_t purple_cipher_context_get_key_size(PurpleCipherContext *context);
00376
00383 void purple_cipher_context_set_data(PurpleCipherContext *context, gpointer data);
00384
00392 gpointer purple_cipher_context_get_data(PurpleCipherContext *context);
00393
00395
00397
00414 gchar *purple_cipher_http_digest_calculate_session_key(
00415 const gchar *algorithm, const gchar *username,
00416 const gchar *realm, const gchar *password,
00417 const gchar *nonce, const gchar *client_nonce);
00418
00435 gchar *purple_cipher_http_digest_calculate_response(
00436 const gchar *algorithm, const gchar *method,
00437 const gchar *digest_uri, const gchar *qop,
00438 const gchar *entity, const gchar *nonce,
00439 const gchar *nonce_count, const gchar *client_nonce,
00440 const gchar *session_key);
00441
00444 #ifdef __cplusplus
00445 }
00446 #endif
00447
00448 #endif