X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=ssl%2Fssl_locl.h;h=9a52bab254ab04696dfde2bff38970f3f748cf10;hp=91f3b254c72c8fb49c7be0763eaf04bcfad958f4;hb=a2a0158959e597188c10fbfeaf61888b2df2e587;hpb=8a41eb70cc6d3272cb9c4a52a02a8b603b310189 diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h index 91f3b254c7..9a52bab254 100644 --- a/ssl/ssl_locl.h +++ b/ssl/ssl_locl.h @@ -63,7 +63,7 @@ #include #include -#include +#include "openssl/e_os.h" #include #include @@ -155,6 +155,19 @@ #define DEC32(a) ((a)=((a)-1)&0xffffffffL) #define MAX_MAC_SIZE 20 /* up from 16 for SSLv3 */ +/* + * Define the Bitmasks for SSL_CIPHER.algorithms. + * This bits are used packed as dense as possible. If new methods/ciphers + * etc will be added, the bits a likely to change, so this information + * is for internal library use only, even though SSL_CIPHER.algorithms + * can be publicly accessed. + * Use the according functions for cipher management instead. + * + * The bit mask handling in the selection and sorting scheme in + * ssl_create_cipher_list() has only limited capabilities, reflecting + * that the different entities within are mutually exclusive: + * ONLY ONE BIT PER MASK CAN BE SET AT A TIME. + */ #define SSL_MKEY_MASK 0x0000001FL #define SSL_kRSA 0x00000001L /* RSA key exchange */ #define SSL_kDHr 0x00000002L /* DH cert RSA CA cert */ @@ -191,36 +204,75 @@ #define SSL_SHA1 0x00040000L #define SSL_SHA (SSL_SHA1) -#define SSL_EXP_MASK 0x00300000L -#define SSL_EXP40 0x00100000L -#define SSL_NOT_EXP 0x00200000L -#define SSL_EXP56 0x00300000L -#define SSL_IS_EXPORT(a) ((a)&SSL_EXP40) -#define SSL_IS_EXPORT56(a) (((a)&SSL_EXP_MASK) == SSL_EXP56) -#define SSL_IS_EXPORT40(a) (((a)&SSL_EXP_MASK) == SSL_EXP40) -#define SSL_C_IS_EXPORT(c) SSL_IS_EXPORT((c)->algorithms) -#define SSL_C_IS_EXPORT56(c) SSL_IS_EXPORT56((c)->algorithms) -#define SSL_C_IS_EXPORT40(c) SSL_IS_EXPORT40((c)->algorithms) -#define SSL_EXPORT_KEYLENGTH(a) (SSL_IS_EXPORT40(a) ? 5 : \ +#define SSL_SSL_MASK 0x00180000L +#define SSL_SSLV2 0x00080000L +#define SSL_SSLV3 0x00100000L +#define SSL_TLSV1 SSL_SSLV3 /* for now */ + +/* we have used 001fffff - 11 bits left to go */ + +/* + * Export and cipher strength information. For each cipher we have to decide + * whether it is exportable or not. This information is likely to change + * over time, since the export control rules are no static technical issue. + * + * Independent of the export flag the cipher strength is sorted into classes. + * SSL_EXP40 was denoting the 40bit US export limit of past times, which now + * is at 56bit (SSL_EXP56). If the exportable cipher class is going to change + * again (eg. to 64bit) the use of "SSL_EXP*" becomes blurred even more, + * since SSL_EXP64 could be similar to SSL_LOW. + * For this reason SSL_MICRO and SSL_MINI macros are included to widen the + * namespace of SSL_LOW-SSL_HIGH to lower values. As development of speed + * and ciphers goes, another extension to SSL_SUPER and/or SSL_ULTRA would + * be possible. + */ +#define SSL_EXP_MASK 0x00000003L +#define SSL_NOT_EXP 0x00000001L +#define SSL_EXPORT 0x00000002L + +#define SSL_STRONG_MASK 0x0000007cL +#define SSL_EXP40 0x00000004L +#define SSL_MICRO (SSL_EXP40) +#define SSL_EXP56 0x00000008L +#define SSL_MINI (SSL_EXP56) +#define SSL_LOW 0x00000010L +#define SSL_MEDIUM 0x00000020L +#define SSL_HIGH 0x00000040L + +/* we have used 0000007f - 25 bits left to go */ + +/* + * Macros to check the export status and cipher strength for export ciphers. + * Even though the macros for EXPORT and EXPORT40/56 have similar names, + * their meaning is different: + * *_EXPORT macros check the 'exportable' status. + * *_EXPORT40/56 macros are used to check whether a certain cipher strength + * is given. + * Since the SSL_IS_EXPORT* and SSL_EXPORT* macros depend on the correct + * algorithm structure element to be passed (algorithms, algo_strength) and no + * typechecking can be done as they are all of type unsigned long, their + * direct usage is discouraged. + * Use the SSL_C_* macros instead. + */ +#define SSL_IS_EXPORT(a) ((a)&SSL_EXPORT) +#define SSL_IS_EXPORT56(a) ((a)&SSL_EXP56) +#define SSL_IS_EXPORT40(a) ((a)&SSL_EXP40) +#define SSL_C_IS_EXPORT(c) SSL_IS_EXPORT((c)->algo_strength) +#define SSL_C_IS_EXPORT56(c) SSL_IS_EXPORT56((c)->algo_strength) +#define SSL_C_IS_EXPORT40(c) SSL_IS_EXPORT40((c)->algo_strength) + +#define SSL_EXPORT_KEYLENGTH(a,s) (SSL_IS_EXPORT40(s) ? 5 : \ ((a)&SSL_ENC_MASK) == SSL_DES ? 8 : 7) #define SSL_EXPORT_PKEYLENGTH(a) (SSL_IS_EXPORT40(a) ? 512 : 1024) -#define SSL_C_EXPORT_KEYLENGTH(c) SSL_EXPORT_KEYLENGTH((c)->algorithms) -#define SSL_C_EXPORT_PKEYLENGTH(c) SSL_EXPORT_PKEYLENGTH((c)->algorithms) - -#define SSL_SSL_MASK 0x00c00000L -#define SSL_SSLV2 0x00400000L -#define SSL_SSLV3 0x00800000L -#define SSL_TLSV1 SSL_SSLV3 /* for now */ +#define SSL_C_EXPORT_KEYLENGTH(c) SSL_EXPORT_KEYLENGTH((c)->algorithms, \ + (c)->algo_strength) +#define SSL_C_EXPORT_PKEYLENGTH(c) SSL_EXPORT_PKEYLENGTH((c)->algo_strength) -#define SSL_STRONG_MASK 0x07000000L -#define SSL_LOW 0x01000000L -#define SSL_MEDIUM 0x02000000L -#define SSL_HIGH 0x04000000L -/* we have used 0fffffff - 4 bits left to go */ #define SSL_ALL 0xffffffffL #define SSL_ALL_CIPHERS (SSL_MKEY_MASK|SSL_AUTH_MASK|SSL_ENC_MASK|\ - SSL_MAC_MASK|SSL_EXP_MASK) + SSL_MAC_MASK) +#define SSL_ALL_STRENGTHS (SSL_EXP_MASK|SSL_STRONG_MASK) /* Mostly for SSLv3 */ #define SSL_PKEY_RSA_ENC 0 @@ -252,13 +304,11 @@ typedef struct cert_pkey_st typedef struct cert_st { - int cert_type; - /* Current active set */ CERT_PKEY *key; /* ALWAYS points to an element of the pkeys array - * Probably it would make more sense to store - * an index, not a pointer. */ - + * Probably it would make more sense to store + * an index, not a pointer. */ + /* The following masks are for the key and auth * algorithms that are supported by the certs below */ int valid; @@ -266,28 +316,41 @@ typedef struct cert_st unsigned long export_mask; #ifndef NO_RSA RSA *rsa_tmp; - RSA *(*rsa_tmp_cb)(SSL *ssl,int export,int keysize); + RSA *(*rsa_tmp_cb)(SSL *ssl,int is_export,int keysize); #endif #ifndef NO_DH DH *dh_tmp; - DH *(*dh_tmp_cb)(SSL *ssl,int export,int keysize); + DH *(*dh_tmp_cb)(SSL *ssl,int is_export,int keysize); #endif CERT_PKEY pkeys[SSL_PKEY_NUM]; - STACK_OF(X509) *cert_chain; /* XXX should only exist in sess_cert_st */ - - int references; /*> 1 only if SSL_copy_session_id is used */ + int references; /* >1 only if SSL_copy_session_id is used */ } CERT; -#if 0 /* XXX not yet */ typedef struct sess_cert_st -{ - /* anything that we want to keep per session */ -} SESS_CERT; + { + STACK_OF(X509) *cert_chain; /* as received from peer (not for SSL2) */ + + /* The 'peer_...' members are used only by clients. */ + int peer_cert_type; + + CERT_PKEY *peer_key; /* points to an element of peer_pkeys (never NULL!) */ + CERT_PKEY peer_pkeys[SSL_PKEY_NUM]; + /* Obviously we don't have the private keys of these, + * so maybe we shouldn't even use the CERT_PKEY type here. */ + +#ifndef NO_RSA + RSA *peer_rsa_tmp; /* not used for SSL 2 */ +#endif +#ifndef NO_DH + DH *peer_dh_tmp; /* not used for SSL 2 */ #endif + int references; /* actually always 1 at the moment */ + } SESS_CERT; + /*#define MAC_DEBUG */ @@ -308,35 +371,40 @@ typedef struct sess_cert_st /* This is for the SSLv3/TLSv1.0 differences in crypto/hash stuff * It is a bit of a mess of functions, but hell, think of it as - * an opaque strucute :-) */ + * an opaque structure :-) */ typedef struct ssl3_enc_method { - int (*enc)(); - int (*mac)(); - int (*setup_key_block)(); - int (*generate_master_secret)(); - int (*change_cipher_state)(); - int (*final_finish_mac)(); + int (*enc)(SSL *, int); + int (*mac)(SSL *, unsigned char *, int); + int (*setup_key_block)(SSL *); + int (*generate_master_secret)(SSL *, unsigned char *, unsigned char *, int); + int (*change_cipher_state)(SSL *, int); + int (*final_finish_mac)(SSL *, EVP_MD_CTX *, EVP_MD_CTX *, const char *, int, unsigned char *); int finish_mac_length; - int (*cert_verify_mac)(); - unsigned char client_finished[20]; - int client_finished_len; - unsigned char server_finished[20]; - int server_finished_len; - int (*alert_value)(); + int (*cert_verify_mac)(SSL *, EVP_MD_CTX *, unsigned char *); + const char *client_finished_label; + int client_finished_label_len; + const char *server_finished_label; + int server_finished_label_len; + int (*alert_value)(int); } SSL3_ENC_METHOD; /* Used for holding the relevant compression methods loaded into SSL_CTX */ typedef struct ssl3_comp_st { - int comp_id; /* The identifer byte for this compression type */ + int comp_id; /* The identifier byte for this compression type */ char *name; /* Text name used for the compression type */ COMP_METHOD *method; /* The method :-) */ } SSL3_COMP; -extern SSL3_ENC_METHOD ssl3_undef_enc_method; -extern SSL_CIPHER ssl2_ciphers[]; -extern SSL_CIPHER ssl3_ciphers[]; +OPENSSL_EXTERN SSL3_ENC_METHOD ssl3_undef_enc_method; +OPENSSL_EXTERN SSL_CIPHER ssl2_ciphers[]; +OPENSSL_EXTERN SSL_CIPHER ssl3_ciphers[]; + +#ifdef VMS +#undef SSL_COMP_get_compression_methods +#define SSL_COMP_get_compression_methods SSL_COMP_get_compress_methods +#endif SSL_METHOD *ssl_bad_method(int ver); @@ -348,13 +416,11 @@ void ssl_clear_cipher_ctx(SSL *s); int ssl_clear_bad_session(SSL *s); CERT *ssl_cert_new(void); CERT *ssl_cert_dup(CERT *cert); -#if 1 int ssl_cert_inst(CERT **o); -#else -int ssl_cert_instantiate(CERT **o, CERT *d); -#endif void ssl_cert_free(CERT *c); -int ssl_set_cert_type(CERT *c, int type); +SESS_CERT *ssl_sess_cert_new(void); +void ssl_sess_cert_free(SESS_CERT *sc); +int ssl_set_peer_cert_type(SESS_CERT *c, int type); int ssl_get_new_session(SSL *s, int session); int ssl_get_prev_session(SSL *s, unsigned char *session,int len); int ssl_cipher_id_cmp(SSL_CIPHER *a,SSL_CIPHER *b); @@ -362,10 +428,10 @@ int ssl_cipher_ptr_id_cmp(SSL_CIPHER **ap,SSL_CIPHER **bp); STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num, STACK_OF(SSL_CIPHER) **skp); int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p); -STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(SSL_METHOD *meth, +STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *meth, STACK_OF(SSL_CIPHER) **pref, STACK_OF(SSL_CIPHER) **sorted, - char *str); + const char *rule_str); void ssl_update_cache(SSL *s, int mode); int ssl_cipher_get_evp(SSL_SESSION *s,const EVP_CIPHER **enc,const EVP_MD **md, SSL_COMP **comp); @@ -402,6 +468,8 @@ int ssl2_shutdown(SSL *s); void ssl2_clear(SSL *s); long ssl2_ctrl(SSL *s,int cmd, long larg, char *parg); long ssl2_ctx_ctrl(SSL_CTX *s,int cmd, long larg, char *parg); +long ssl2_callback_ctrl(SSL *s,int cmd, void (*fp)()); +long ssl2_ctx_callback_ctrl(SSL_CTX *s,int cmd, void (*fp)()); int ssl2_pending(SSL *s); SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p); @@ -419,17 +487,16 @@ int ssl3_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p, int len); int ssl3_get_req_cert_type(SSL *s,unsigned char *p); long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok); -int ssl3_send_finished(SSL *s, int a, int b, unsigned char *sender,int slen); +int ssl3_send_finished(SSL *s, int a, int b, const char *sender,int slen); int ssl3_num_ciphers(void); SSL_CIPHER *ssl3_get_cipher(unsigned int u); int ssl3_renegotiate(SSL *ssl); int ssl3_renegotiate_check(SSL *ssl); int ssl3_dispatch_alert(SSL *s); int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len); -int ssl3_part_read(SSL *s, int i); int ssl3_write_bytes(SSL *s, int type, const void *buf, int len); -int ssl3_final_finish_mac(SSL *s, EVP_MD_CTX *ctx1,EVP_MD_CTX *ctx2, - unsigned char *sender, int slen,unsigned char *p); +int ssl3_final_finish_mac(SSL *s, EVP_MD_CTX *ctx1, EVP_MD_CTX *ctx2, + const char *sender, int slen,unsigned char *p); int ssl3_cert_verify_mac(SSL *s, EVP_MD_CTX *in, unsigned char *p); void ssl3_finish_mac(SSL *s, const unsigned char *buf, int len); int ssl3_enc(SSL *s, int send_data); @@ -449,6 +516,8 @@ int ssl3_shutdown(SSL *s); void ssl3_clear(SSL *s); long ssl3_ctrl(SSL *s,int cmd, long larg, char *parg); long ssl3_ctx_ctrl(SSL_CTX *s,int cmd, long larg, char *parg); +long ssl3_callback_ctrl(SSL *s,int cmd, void (*fp)()); +long ssl3_ctx_callback_ctrl(SSL_CTX *s,int cmd, void (*fp)()); int ssl3_pending(SSL *s); int ssl23_accept(SSL *s); @@ -460,6 +529,7 @@ int tls1_new(SSL *s); void tls1_free(SSL *s); void tls1_clear(SSL *s); long tls1_ctrl(SSL *s,int cmd, long larg, char *parg); +long tls1_callback_ctrl(SSL *s,int cmd, void (*fp)()); SSL_METHOD *tlsv1_base_method(void ); int ssl_init_wbio_buffer(SSL *s, int push); @@ -469,7 +539,7 @@ int tls1_change_cipher_state(SSL *s, int which); int tls1_setup_key_block(SSL *s); int tls1_enc(SSL *s, int snd); int tls1_final_finish_mac(SSL *s, EVP_MD_CTX *in1_ctx, EVP_MD_CTX *in2_ctx, - unsigned char *str, int slen, unsigned char *p); + const char *str, int slen, unsigned char *p); int tls1_cert_verify_mac(SSL *s, EVP_MD_CTX *in, unsigned char *p); int tls1_mac(SSL *ssl, unsigned char *md, int snd); int tls1_generate_master_secret(SSL *s, unsigned char *out,