cipher.h

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