00001
00027 #ifndef PURPLE_CIPHER_H
00028 #define PURPLE_CIPHER_H
00029
00030 #include <glib.h>
00031
00032 #define PURPLE_CIPHER(obj) ((PurpleCipher *)(obj))
00033 #define PURPLE_CIPHER_OPS(obj) ((PurpleCipherOps *)(obj))
00034 #define PURPLE_CIPHER_CONTEXT(obj) ((PurpleCipherContext *)(obj))
00036 typedef struct _PurpleCipher PurpleCipher;
00037 typedef struct _PurpleCipherOps PurpleCipherOps;
00038 typedef struct _PurpleCipherContext PurpleCipherContext;
00044 typedef enum _PurpleCipherCaps {
00045 PURPLE_CIPHER_CAPS_SET_OPT = 1 << 1,
00046 PURPLE_CIPHER_CAPS_GET_OPT = 1 << 2,
00047 PURPLE_CIPHER_CAPS_INIT = 1 << 3,
00048 PURPLE_CIPHER_CAPS_RESET = 1 << 4,
00049 PURPLE_CIPHER_CAPS_UNINIT = 1 << 5,
00050 PURPLE_CIPHER_CAPS_SET_IV = 1 << 6,
00051 PURPLE_CIPHER_CAPS_APPEND = 1 << 7,
00052 PURPLE_CIPHER_CAPS_DIGEST = 1 << 8,
00053 PURPLE_CIPHER_CAPS_ENCRYPT = 1 << 9,
00054 PURPLE_CIPHER_CAPS_DECRYPT = 1 << 10,
00055 PURPLE_CIPHER_CAPS_SET_SALT = 1 << 11,
00056 PURPLE_CIPHER_CAPS_GET_SALT_SIZE = 1 << 12,
00057 PURPLE_CIPHER_CAPS_SET_KEY = 1 << 13,
00058 PURPLE_CIPHER_CAPS_GET_KEY_SIZE = 1 << 14,
00059 PURPLE_CIPHER_CAPS_UNKNOWN = 1 << 16
00060 } PurpleCipherCaps;
00061
00065 struct _PurpleCipherOps {
00067 void (*set_option)(PurpleCipherContext *context, const gchar *name, void *value);
00068
00070 void *(*get_option)(PurpleCipherContext *context, const gchar *name);
00071
00073 void (*init)(PurpleCipherContext *context, void *extra);
00074
00076 void (*reset)(PurpleCipherContext *context, void *extra);
00077
00079 void (*uninit)(PurpleCipherContext *context);
00080
00082 void (*set_iv)(PurpleCipherContext *context, guchar *iv, size_t len);
00083
00085 void (*append)(PurpleCipherContext *context, const guchar *data, size_t len);
00086
00088 gboolean (*digest)(PurpleCipherContext *context, size_t in_len, guchar digest[], size_t *out_len);
00089
00091 int (*encrypt)(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
00092
00094 int (*decrypt)(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
00095
00097 void (*set_salt)(PurpleCipherContext *context, guchar *salt);
00098
00100 size_t (*get_salt_size)(PurpleCipherContext *context);
00101
00103 void (*set_key)(PurpleCipherContext *context, const guchar *key);
00104
00106 size_t (*get_key_size)(PurpleCipherContext *context);
00107
00108 void (*_purple_reserved1)(void);
00109 void (*_purple_reserved2)(void);
00110 void (*_purple_reserved3)(void);
00111 void (*_purple_reserved4)(void);
00112 };
00113
00114 #ifdef __cplusplus
00115 extern "C" {
00116 #endif
00117
00118
00120
00130 const gchar *purple_cipher_get_name(PurpleCipher *cipher);
00131
00139 guint purple_cipher_get_capabilities(PurpleCipher *cipher);
00140
00153 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);
00154
00156
00158
00168 PurpleCipher *purple_ciphers_find_cipher(const gchar *name);
00169
00178 PurpleCipher *purple_ciphers_register_cipher(const gchar *name, PurpleCipherOps *ops);
00179
00187 gboolean purple_ciphers_unregister_cipher(PurpleCipher *cipher);
00188
00195 GList *purple_ciphers_get_ciphers(void);
00196
00198
00200
00208 gpointer purple_ciphers_get_handle(void);
00209
00213 void purple_ciphers_init(void);
00214
00218 void purple_ciphers_uninit(void);
00219
00221
00223
00233 void purple_cipher_context_set_option(PurpleCipherContext *context, const gchar *name, gpointer value);
00234
00242 gpointer purple_cipher_context_get_option(PurpleCipherContext *context, const gchar *name);
00243
00252 PurpleCipherContext *purple_cipher_context_new(PurpleCipher *cipher, void *extra);
00253
00262 PurpleCipherContext *purple_cipher_context_new_by_name(const gchar *name, void *extra);
00263
00271 void purple_cipher_context_reset(PurpleCipherContext *context, gpointer extra);
00272
00278 void purple_cipher_context_destroy(PurpleCipherContext *context);
00279
00288 void purple_cipher_context_set_iv(PurpleCipherContext *context, guchar *iv, size_t len);
00289
00297 void purple_cipher_context_append(PurpleCipherContext *context, const guchar *data, size_t len);
00298
00307 gboolean purple_cipher_context_digest(PurpleCipherContext *context, size_t in_len, guchar digest[], size_t *out_len);
00308
00317 gboolean purple_cipher_context_digest_to_str(PurpleCipherContext *context, size_t in_len, gchar digest_s[], size_t *out_len);
00318
00330 gint purple_cipher_context_encrypt(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
00331
00343 gint purple_cipher_context_decrypt(PurpleCipherContext *context, const guchar data[], size_t len, guchar output[], size_t *outlen);
00344
00351 void purple_cipher_context_set_salt(PurpleCipherContext *context, guchar *salt);
00352
00360 size_t purple_cipher_context_get_salt_size(PurpleCipherContext *context);
00361
00368 void purple_cipher_context_set_key(PurpleCipherContext *context, const guchar *key);
00369
00377 size_t purple_cipher_context_get_key_size(PurpleCipherContext *context);
00378
00385 void purple_cipher_context_set_data(PurpleCipherContext *context, gpointer data);
00386
00394 gpointer purple_cipher_context_get_data(PurpleCipherContext *context);
00395
00397
00399
00416 gchar *purple_cipher_http_digest_calculate_session_key(
00417 const gchar *algorithm, const gchar *username,
00418 const gchar *realm, const gchar *password,
00419 const gchar *nonce, const gchar *client_nonce);
00420
00437 gchar *purple_cipher_http_digest_calculate_response(
00438 const gchar *algorithm, const gchar *method,
00439 const gchar *digest_uri, const gchar *qop,
00440 const gchar *entity, const gchar *nonce,
00441 const gchar *nonce_count, const gchar *client_nonce,
00442 const gchar *session_key);
00443
00446 #ifdef __cplusplus
00447 }
00448 #endif
00449
00450 #endif