cipher.h

Go to the documentation of this file.
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 /* __cplusplus */
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 /* __cplusplus */
00449 
00450 #endif /* PURPLE_CIPHER_H */