ses_prv.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef _KLONE_SESPRV_H_
00012 #define _KLONE_SESPRV_H_
00013
00014 #include "klone_conf.h"
00015 #ifdef SSL_OPENSSL
00016 #include <openssl/hmac.h>
00017 #include <openssl/evp.h>
00018 #include <openssl/rand.h>
00019 #endif
00020 #include <u/libu.h>
00021 #include <klone/session.h>
00022 #include <klone/request.h>
00023 #include <klone/response.h>
00024 #include <klone/vars.h>
00025 #include <klone/http.h>
00026 #include <klone/atom.h>
00027 #include <klone/md5.h>
00028 #ifdef SSL_CYASSL
00029 #include <config.h>
00030 #include <types.h>
00031 #include <ctc_hmac.h>
00032 #include <openssl/evp.h>
00033 #endif
00034
00035 #ifdef __cplusplus
00036 extern "C" {
00037 #endif
00038
00039 #define SESSION_KEY_VAR "KLONE_CIPHER_KEY"
00040
00041 typedef int (*session_load_t)(session_t*);
00042 typedef int (*session_save_t)(session_t*);
00043 typedef int (*session_remove_t)(session_t*);
00044 typedef int (*session_term_t)(session_t*);
00045
00046
00047 enum {
00048 SESSION_TYPE_UNKNOWN,
00049 SESSION_TYPE_FILE,
00050 SESSION_TYPE_MEMORY,
00051 SESSION_TYPE_CLIENT
00052 };
00053
00054 enum {
00055 SESSION_ID_LENGTH = MD5_DIGEST_LEN,
00056 SESSION_ID_BUFSZ = 1 + SESSION_ID_LENGTH
00057 };
00058
00059
00060 enum {
00061 HMAC_KEY_LEN = 64,
00062 #ifdef SSL_OPENSSL
00063 CIPHER_KEY_LEN = EVP_MAX_KEY_LENGTH,
00064 CIPHER_KEY_BUFSZ = 2* EVP_MAX_KEY_LENGTH,
00065 CIPHER_IV_LEN = EVP_MAX_IV_LENGTH
00066 #else
00067 CIPHER_KEY_LEN = 32, CIPHER_KEY_BUFSZ = 64, CIPHER_IV_LEN = 16
00068 #endif
00069 };
00070
00071 #ifdef SSL_CYASSL
00072 typedef Hmac HMAC_CTX;
00073 #endif
00074
00075
00076 typedef struct session_opt_s
00077 {
00078
00079 int type;
00080 int max_age;
00081 int encrypt;
00082 int compress;
00083 char name[128];
00084
00085
00086 char path[U_FILENAME_MAX];
00087 unsigned char session_key[CIPHER_KEY_BUFSZ];
00088 unsigned char session_iv[CIPHER_IV_LEN];
00089
00090
00091 atoms_t *atoms;
00092 size_t max_count;
00093 size_t mem_limit;
00094
00095 #ifdef SSL_ON
00096 char keyvar[128];
00097 const EVP_CIPHER *cipher;
00098 unsigned char cipher_key[CIPHER_KEY_BUFSZ];
00099 unsigned char cipher_iv[CIPHER_IV_LEN];
00100
00101 HMAC_CTX hmac_ctx;
00102 const EVP_MD *hash;
00103 char hmac_key[HMAC_KEY_LEN];
00104 #endif
00105 } session_opt_t;
00106
00107 struct session_s
00108 {
00109 vars_t *vars;
00110 request_t *rq;
00111 response_t *rs;
00112 char filename[U_FILENAME_MAX];
00113 char id[SESSION_ID_BUFSZ];
00114 int removed;
00115 int mtime;
00116 session_load_t load;
00117 session_save_t save;
00118 session_remove_t remove;
00119 session_term_t term;
00120 session_opt_t *so;
00121 };
00122
00123
00124 int session_create(session_opt_t*, request_t*, response_t*, session_t**);
00125
00126
00127 int session_client_create(session_opt_t*, request_t*, response_t*, session_t**);
00128 int session_file_create(session_opt_t*, request_t*, response_t*, session_t**);
00129 int session_mem_create(session_opt_t*, request_t*, response_t*, session_t**);
00130
00131
00132 int session_prv_init(session_t *, request_t *, response_t *);
00133 int session_prv_load_from_io(session_t *, io_t *);
00134 int session_prv_save_to_io(session_t*, io_t *);
00135 int session_prv_save_var(var_t *, void*);
00136 int session_prv_calc_maxsize(var_t *v, void *p);
00137 int session_prv_save_to_buf(session_t *ss, char **pbuf, size_t *psz);
00138 int session_prv_load_from_buf(session_t *ss, char *buf, size_t size);
00139 int session_prv_set_id(session_t *ss, const char *sid);
00140 int session_priv_set_id(session_t *ss, const char *sid);
00141
00142
00143 int session_module_init(u_config_t *config, session_opt_t **pso);
00144 int session_file_module_init(u_config_t *config, session_opt_t *pso);
00145 int session_mem_module_init(u_config_t *config, session_opt_t *pso);
00146 int session_client_module_init(u_config_t *config, session_opt_t *pso);
00147 int session_module_term(session_opt_t *so);
00148 int session_module_term(session_opt_t *so);
00149
00150 #ifdef __cplusplus
00151 }
00152 #endif
00153
00154 #endif