00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 #ifndef __P_SSLUTILS_H__
00023 #define __P_SSLUTILS_H__
00024 
00025 #include "ink_config.h"
00026 #include "Diags.h"
00027 
00028 #define OPENSSL_THREAD_DEFINES
00029 #include <openssl/opensslconf.h>
00030 #include <openssl/ssl.h>
00031 
00032 #if !defined(OPENSSL_THREADS)
00033 #error Traffic Server requires a OpenSSL library that support threads
00034 #endif
00035 
00036 struct SSLConfigParams;
00037 struct SSLCertLookup;
00038 class SSLNetVConnection;
00039 struct RecRawStatBlock;
00040 
00041 enum SSL_Stats
00042 {
00043   ssl_origin_server_expired_cert_stat,
00044   ssl_user_agent_expired_cert_stat,
00045   ssl_origin_server_revoked_cert_stat,
00046   ssl_user_agent_revoked_cert_stat,
00047   ssl_origin_server_unknown_cert_stat,
00048   ssl_user_agent_unknown_cert_stat,
00049   ssl_origin_server_cert_verify_failed_stat,
00050   ssl_user_agent_cert_verify_failed_stat,
00051   ssl_origin_server_bad_cert_stat,
00052   ssl_user_agent_bad_cert_stat,
00053   ssl_origin_server_decryption_failed_stat,
00054   ssl_user_agent_decryption_failed_stat,
00055   ssl_origin_server_wrong_version_stat,
00056   ssl_user_agent_wrong_version_stat,
00057   ssl_origin_server_other_errors_stat,
00058   ssl_user_agent_other_errors_stat,
00059   ssl_origin_server_unknown_ca_stat,
00060   ssl_user_agent_unknown_ca_stat,
00061   ssl_user_agent_sessions_stat,
00062   ssl_user_agent_session_hit_stat,
00063   ssl_user_agent_session_miss_stat,
00064   ssl_user_agent_session_timeout_stat,
00065   ssl_total_handshake_time_stat,
00066   ssl_total_success_handshake_count_stat,
00067   ssl_total_tickets_created_stat,
00068   ssl_total_tickets_verified_stat,
00069   ssl_total_tickets_not_found_stat,
00070   ssl_total_tickets_renewed_stat,
00071 
00072   
00073   ssl_error_want_write,
00074   ssl_error_want_read,
00075   ssl_error_want_x509_lookup,
00076   ssl_error_syscall,
00077   ssl_error_read_eos,
00078   ssl_error_zero_return,
00079   ssl_error_ssl,
00080   ssl_sni_name_set_failure,
00081 
00082   ssl_cipher_stats_start = 100,
00083   ssl_cipher_stats_end = 300,
00084 
00085   Ssl_Stat_Count
00086 };
00087 
00088 extern RecRawStatBlock *ssl_rsb;
00089 
00090 
00091 #define SSL_INCREMENT_DYN_STAT(x) RecIncrRawStat(ssl_rsb, NULL, (int) x, 1)
00092 #define SSL_DECREMENT_DYN_STAT(x) RecIncrRawStat(ssl_rsb, NULL, (int) x, -1)
00093 #define SSL_SET_COUNT_DYN_STAT(x,count) RecSetRawStatCount(ssl_rsb, x, count)
00094 #define SSL_INCREMENT_DYN_STAT_EX(x, y) RecIncrRawStat(ssl_rsb, NULL, (int) x, y)
00095 #define SSL_CLEAR_DYN_STAT(x) \
00096   do { \
00097     RecSetRawStatSum(ssl_rsb, (x), 0); \
00098     RecSetRawStatCount(ssl_rsb, (x), 0); \
00099   } while (0);
00100 
00101 
00102 SSL_CTX * SSLDefaultServerContext();
00103 
00104 
00105 SSL_CTX * SSLInitClientContext(const SSLConfigParams * param);
00106 
00107 
00108 void SSLInitializeLibrary();
00109 
00110 
00111 void SSLInitializeStatistics();
00112 
00113 
00114 void SSLReleaseContext(SSL_CTX* ctx);
00115 
00116 
00117 #define SSLError(fmt, ...) SSLDiagnostic(DiagsMakeLocation(), false, NULL, fmt, ##__VA_ARGS__)
00118 #define SSLErrorVC(vc,fmt, ...) SSLDiagnostic(DiagsMakeLocation(), false, vc, fmt, ##__VA_ARGS__)
00119 
00120 #define SSLDebug(fmt, ...) SSLDiagnostic(DiagsMakeLocation(), true, NULL, fmt, ##__VA_ARGS__)
00121 #define SSLDebugVC(vc,fmt, ...) SSLDiagnostic(DiagsMakeLocation(), true, vc, fmt, ##__VA_ARGS__)
00122 
00123 void SSLDiagnostic(const SrcLoc& loc, bool debug, SSLNetVConnection * vc, const char * fmt, ...) TS_PRINTFLIKE(4, 5);
00124 
00125 
00126 const char * SSLErrorName(int ssl_error);
00127 
00128 
00129 void SSLDebugBufferPrint(const char * tag, const char * buffer, unsigned buflen, const char * message);
00130 
00131 
00132 bool SSLParseCertificateConfiguration(const SSLConfigParams * params, SSLCertLookup * lookup);
00133 
00134 #endif