Loading CHANGES +8 −1 Original line number Original line Diff line number Diff line Loading @@ -2,7 +2,7 @@ OpenSSL CHANGES OpenSSL CHANGES _______________ _______________ Changes between 0.9.7g and 0.9.8 [xx XXX xxxx] Changes between 0.9.7h and 0.9.8 [xx XXX xxxx] *) Add new functionality to the bn blinding code: *) Add new functionality to the bn blinding code: - automatic re-creation of the BN_BLINDING parameters after - automatic re-creation of the BN_BLINDING parameters after Loading Loading @@ -794,6 +794,13 @@ Changes between 0.9.7g and 0.9.7h [XX xxx XXXX] Changes between 0.9.7g and 0.9.7h [XX xxx XXXX] *) Change the client implementation for SSLv23_method() and SSLv23_client_method() so that is uses the SSL 3.0/TLS 1.0 Client Hello message format if the SSL_OP_NO_SSLv2 option is set. (Previously, the SSL 2.0 backwards compatible Client Hello message format would be used even with SSL_OP_NO_SSLv2.) [Bodo Moeller] *) Add support for smime-type MIME parameter in S/MIME messages which some *) Add support for smime-type MIME parameter in S/MIME messages which some clients need. clients need. [Steve Henson] [Steve Henson] Loading ssl/d1_clnt.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -597,7 +597,7 @@ int dtls1_client_hello(SSL *s) p += s->d1->cookie_len; p += s->d1->cookie_len; /* Ciphers supported */ /* Ciphers supported */ i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2])); i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),0); if (i == 0) if (i == 0) { { SSLerr(SSL_F_DTLS1_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); SSLerr(SSL_F_DTLS1_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); Loading ssl/s23_clnt.c +164 −57 Original line number Original line Diff line number Diff line Loading @@ -220,9 +220,28 @@ static int ssl23_client_hello(SSL *s) { { unsigned char *buf; unsigned char *buf; unsigned char *p,*d; unsigned char *p,*d; int i,ch_len; int i,j,ch_len; unsigned long Time,l; int ssl2_compat; int version = 0, version_major, version_minor; SSL_COMP *comp; int ret; int ret; ssl2_compat = (s->options & SSL_OP_NO_SSLv2) ? 0 : 1; if (!(s->options & SSL_OP_NO_TLSv1)) { version = TLS1_VERSION; } else if (!(s->options & SSL_OP_NO_SSLv3)) { version = SSL3_VERSION; } else if (!(s->options & SSL_OP_NO_SSLv2)) { version = SSL2_VERSION; } buf=(unsigned char *)s->init_buf->data; buf=(unsigned char *)s->init_buf->data; if (s->state == SSL23_ST_CW_CLNT_HELLO_A) if (s->state == SSL23_ST_CW_CLNT_HELLO_A) { { Loading @@ -235,31 +254,25 @@ static int ssl23_client_hello(SSL *s) #endif #endif p=s->s3->client_random; p=s->s3->client_random; if (RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE) <= 0) Time=time(NULL); /* Time */ l2n(Time,p); if (RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-4) <= 0) return -1; return -1; /* Do the message type and length last */ if (version == TLS1_VERSION) d= &(buf[2]); p=d+9; *(d++)=SSL2_MT_CLIENT_HELLO; if (!(s->options & SSL_OP_NO_TLSv1)) { { *(d++)=TLS1_VERSION_MAJOR; version_major = TLS1_VERSION_MAJOR; *(d++)=TLS1_VERSION_MINOR; version_minor = TLS1_VERSION_MINOR; s->client_version=TLS1_VERSION; } } else if (!(s->options & SSL_OP_NO_SSLv3)) else if (version == SSL3_VERSION) { { *(d++)=SSL3_VERSION_MAJOR; version_major = SSL3_VERSION_MAJOR; *(d++)=SSL3_VERSION_MINOR; version_minor = SSL3_VERSION_MINOR; s->client_version=SSL3_VERSION; } } else if (!(s->options & SSL_OP_NO_SSLv2)) else if (version == SSL2_VERSION) { { *(d++)=SSL2_VERSION_MAJOR; version_major = SSL2_VERSION_MAJOR; *(d++)=SSL2_VERSION_MINOR; version_minor = SSL2_VERSION_MINOR; s->client_version=SSL2_VERSION; } } else else { { Loading @@ -267,19 +280,32 @@ static int ssl23_client_hello(SSL *s) return(-1); return(-1); } } s->client_version = version; if (ssl2_compat) { /* create SSL 2.0 compatible Client Hello */ /* two byte record header will be written last */ d = &(buf[2]); p = d + 9; /* leave space for message type, version, individual length fields */ *(d++) = SSL2_MT_CLIENT_HELLO; *(d++) = version_major; *(d++) = version_minor; /* Ciphers supported */ /* Ciphers supported */ i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),p); i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),p,0); if (i == 0) if (i == 0) { { /* no ciphers */ /* no ciphers */ SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); return(-1); return -1; } } s2n(i,d); s2n(i,d); p+=i; p+=i; /* put in the session-id, zero since there is no /* put in the session-id length (zero since there is no reuse) */ * reuse. */ #if 0 #if 0 s->session->session_id_length=0; s->session->session_id_length=0; #endif #endif Loading Loading @@ -307,19 +333,100 @@ static int ssl23_client_hello(SSL *s) buf[0]=((i>>8)&0xff)|0x80; buf[0]=((i>>8)&0xff)|0x80; buf[1]=(i&0xff); buf[1]=(i&0xff); s->state=SSL23_ST_CW_CLNT_HELLO_B; /* number of bytes to write */ /* number of bytes to write */ s->init_num=i+2; s->init_num=i+2; s->init_off=0; s->init_off=0; ssl3_finish_mac(s,&(buf[2]),i); ssl3_finish_mac(s,&(buf[2]),i); } } else { /* create Client Hello in SSL 3.0/TLS 1.0 format */ /* do the record header (5 bytes) and handshake message header (4 bytes) last */ d = p = &(buf[9]); *(p++) = version_major; *(p++) = version_minor; /* Random stuff */ memcpy(p, s->s3->client_random, SSL3_RANDOM_SIZE); p += SSL3_RANDOM_SIZE; /* Session ID (zero since there is no reuse) */ *(p++) = 0; /* Ciphers supported (using SSL 3.0/TLS 1.0 format) */ i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),ssl3_put_cipher_by_char); if (i == 0) { SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); return -1; } s2n(i,p); p+=i; /* COMPRESSION */ if (s->ctx->comp_methods == NULL) j=0; else j=sk_SSL_COMP_num(s->ctx->comp_methods); *(p++)=1+j; for (i=0; i<j; i++) { comp=sk_SSL_COMP_value(s->ctx->comp_methods,i); *(p++)=comp->id; } *(p++)=0; /* Add the NULL method */ l = p-d; *p = 42; /* fill in 4-byte handshake header */ d=&(buf[5]); *(d++)=SSL3_MT_CLIENT_HELLO; l2n3(l,d); l += 4; if (l > SSL3_RT_MAX_PLAIN_LENGTH) { SSLerr(SSL_F_SSL23_CLIENT_HELLO,ERR_R_INTERNAL_ERROR); return -1; } /* fill in 5-byte record header */ d=buf; *(d++) = SSL3_RT_HANDSHAKE; *(d++) = version_major; *(d++) = version_minor; /* arguably we should send the *lowest* suported version here * (indicating, e.g., TLS 1.0 in "SSL 3.0 format") */ s2n((int)l,d); /* number of bytes to write */ s->init_num=p-buf; s->init_off=0; ssl3_finish_mac(s,&(buf[5]), s->init_num - 5); } s->state=SSL23_ST_CW_CLNT_HELLO_B; s->init_off=0; } /* SSL3_ST_CW_CLNT_HELLO_B */ /* SSL3_ST_CW_CLNT_HELLO_B */ ret = ssl23_write_bytes(s); ret = ssl23_write_bytes(s); if (ret >= 2) if (s->msg_callback) if ((ret >= 2) && s->msg_callback) s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data+2, ret-2, s, s->msg_callback_arg); /* CLIENT-HELLO */ { /* Client Hello has been sent; tell msg_callback */ if (ssl2_compat) s->msg_callback(1, version, 0, s->init_buf->data+2, ret-2, s, s->msg_callback_arg); else s->msg_callback(1, version, SSL3_RT_HANDSHAKE, s->init_buf->data+5, ret-5, s, s->msg_callback_arg); } return ret; return ret; } } Loading ssl/s2_clnt.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -584,7 +584,7 @@ static int client_hello(SSL *s) s2n(SSL2_VERSION,p); /* version */ s2n(SSL2_VERSION,p); /* version */ n=j=0; n=j=0; n=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),d); n=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),d,0); d+=n; d+=n; if (n == 0) if (n == 0) Loading ssl/s2_srvr.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -797,7 +797,7 @@ static int server_hello(SSL *s) /* lets send out the ciphers we like in the /* lets send out the ciphers we like in the * prefered order */ * prefered order */ sk= s->session->ciphers; sk= s->session->ciphers; n=ssl_cipher_list_to_bytes(s,s->session->ciphers,d); n=ssl_cipher_list_to_bytes(s,s->session->ciphers,d,0); d+=n; d+=n; s2n(n,p); /* add cipher length */ s2n(n,p); /* add cipher length */ } } Loading Loading
CHANGES +8 −1 Original line number Original line Diff line number Diff line Loading @@ -2,7 +2,7 @@ OpenSSL CHANGES OpenSSL CHANGES _______________ _______________ Changes between 0.9.7g and 0.9.8 [xx XXX xxxx] Changes between 0.9.7h and 0.9.8 [xx XXX xxxx] *) Add new functionality to the bn blinding code: *) Add new functionality to the bn blinding code: - automatic re-creation of the BN_BLINDING parameters after - automatic re-creation of the BN_BLINDING parameters after Loading Loading @@ -794,6 +794,13 @@ Changes between 0.9.7g and 0.9.7h [XX xxx XXXX] Changes between 0.9.7g and 0.9.7h [XX xxx XXXX] *) Change the client implementation for SSLv23_method() and SSLv23_client_method() so that is uses the SSL 3.0/TLS 1.0 Client Hello message format if the SSL_OP_NO_SSLv2 option is set. (Previously, the SSL 2.0 backwards compatible Client Hello message format would be used even with SSL_OP_NO_SSLv2.) [Bodo Moeller] *) Add support for smime-type MIME parameter in S/MIME messages which some *) Add support for smime-type MIME parameter in S/MIME messages which some clients need. clients need. [Steve Henson] [Steve Henson] Loading
ssl/d1_clnt.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -597,7 +597,7 @@ int dtls1_client_hello(SSL *s) p += s->d1->cookie_len; p += s->d1->cookie_len; /* Ciphers supported */ /* Ciphers supported */ i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2])); i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),0); if (i == 0) if (i == 0) { { SSLerr(SSL_F_DTLS1_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); SSLerr(SSL_F_DTLS1_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); Loading
ssl/s23_clnt.c +164 −57 Original line number Original line Diff line number Diff line Loading @@ -220,9 +220,28 @@ static int ssl23_client_hello(SSL *s) { { unsigned char *buf; unsigned char *buf; unsigned char *p,*d; unsigned char *p,*d; int i,ch_len; int i,j,ch_len; unsigned long Time,l; int ssl2_compat; int version = 0, version_major, version_minor; SSL_COMP *comp; int ret; int ret; ssl2_compat = (s->options & SSL_OP_NO_SSLv2) ? 0 : 1; if (!(s->options & SSL_OP_NO_TLSv1)) { version = TLS1_VERSION; } else if (!(s->options & SSL_OP_NO_SSLv3)) { version = SSL3_VERSION; } else if (!(s->options & SSL_OP_NO_SSLv2)) { version = SSL2_VERSION; } buf=(unsigned char *)s->init_buf->data; buf=(unsigned char *)s->init_buf->data; if (s->state == SSL23_ST_CW_CLNT_HELLO_A) if (s->state == SSL23_ST_CW_CLNT_HELLO_A) { { Loading @@ -235,31 +254,25 @@ static int ssl23_client_hello(SSL *s) #endif #endif p=s->s3->client_random; p=s->s3->client_random; if (RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE) <= 0) Time=time(NULL); /* Time */ l2n(Time,p); if (RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-4) <= 0) return -1; return -1; /* Do the message type and length last */ if (version == TLS1_VERSION) d= &(buf[2]); p=d+9; *(d++)=SSL2_MT_CLIENT_HELLO; if (!(s->options & SSL_OP_NO_TLSv1)) { { *(d++)=TLS1_VERSION_MAJOR; version_major = TLS1_VERSION_MAJOR; *(d++)=TLS1_VERSION_MINOR; version_minor = TLS1_VERSION_MINOR; s->client_version=TLS1_VERSION; } } else if (!(s->options & SSL_OP_NO_SSLv3)) else if (version == SSL3_VERSION) { { *(d++)=SSL3_VERSION_MAJOR; version_major = SSL3_VERSION_MAJOR; *(d++)=SSL3_VERSION_MINOR; version_minor = SSL3_VERSION_MINOR; s->client_version=SSL3_VERSION; } } else if (!(s->options & SSL_OP_NO_SSLv2)) else if (version == SSL2_VERSION) { { *(d++)=SSL2_VERSION_MAJOR; version_major = SSL2_VERSION_MAJOR; *(d++)=SSL2_VERSION_MINOR; version_minor = SSL2_VERSION_MINOR; s->client_version=SSL2_VERSION; } } else else { { Loading @@ -267,19 +280,32 @@ static int ssl23_client_hello(SSL *s) return(-1); return(-1); } } s->client_version = version; if (ssl2_compat) { /* create SSL 2.0 compatible Client Hello */ /* two byte record header will be written last */ d = &(buf[2]); p = d + 9; /* leave space for message type, version, individual length fields */ *(d++) = SSL2_MT_CLIENT_HELLO; *(d++) = version_major; *(d++) = version_minor; /* Ciphers supported */ /* Ciphers supported */ i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),p); i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),p,0); if (i == 0) if (i == 0) { { /* no ciphers */ /* no ciphers */ SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); return(-1); return -1; } } s2n(i,d); s2n(i,d); p+=i; p+=i; /* put in the session-id, zero since there is no /* put in the session-id length (zero since there is no reuse) */ * reuse. */ #if 0 #if 0 s->session->session_id_length=0; s->session->session_id_length=0; #endif #endif Loading Loading @@ -307,19 +333,100 @@ static int ssl23_client_hello(SSL *s) buf[0]=((i>>8)&0xff)|0x80; buf[0]=((i>>8)&0xff)|0x80; buf[1]=(i&0xff); buf[1]=(i&0xff); s->state=SSL23_ST_CW_CLNT_HELLO_B; /* number of bytes to write */ /* number of bytes to write */ s->init_num=i+2; s->init_num=i+2; s->init_off=0; s->init_off=0; ssl3_finish_mac(s,&(buf[2]),i); ssl3_finish_mac(s,&(buf[2]),i); } } else { /* create Client Hello in SSL 3.0/TLS 1.0 format */ /* do the record header (5 bytes) and handshake message header (4 bytes) last */ d = p = &(buf[9]); *(p++) = version_major; *(p++) = version_minor; /* Random stuff */ memcpy(p, s->s3->client_random, SSL3_RANDOM_SIZE); p += SSL3_RANDOM_SIZE; /* Session ID (zero since there is no reuse) */ *(p++) = 0; /* Ciphers supported (using SSL 3.0/TLS 1.0 format) */ i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),ssl3_put_cipher_by_char); if (i == 0) { SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); return -1; } s2n(i,p); p+=i; /* COMPRESSION */ if (s->ctx->comp_methods == NULL) j=0; else j=sk_SSL_COMP_num(s->ctx->comp_methods); *(p++)=1+j; for (i=0; i<j; i++) { comp=sk_SSL_COMP_value(s->ctx->comp_methods,i); *(p++)=comp->id; } *(p++)=0; /* Add the NULL method */ l = p-d; *p = 42; /* fill in 4-byte handshake header */ d=&(buf[5]); *(d++)=SSL3_MT_CLIENT_HELLO; l2n3(l,d); l += 4; if (l > SSL3_RT_MAX_PLAIN_LENGTH) { SSLerr(SSL_F_SSL23_CLIENT_HELLO,ERR_R_INTERNAL_ERROR); return -1; } /* fill in 5-byte record header */ d=buf; *(d++) = SSL3_RT_HANDSHAKE; *(d++) = version_major; *(d++) = version_minor; /* arguably we should send the *lowest* suported version here * (indicating, e.g., TLS 1.0 in "SSL 3.0 format") */ s2n((int)l,d); /* number of bytes to write */ s->init_num=p-buf; s->init_off=0; ssl3_finish_mac(s,&(buf[5]), s->init_num - 5); } s->state=SSL23_ST_CW_CLNT_HELLO_B; s->init_off=0; } /* SSL3_ST_CW_CLNT_HELLO_B */ /* SSL3_ST_CW_CLNT_HELLO_B */ ret = ssl23_write_bytes(s); ret = ssl23_write_bytes(s); if (ret >= 2) if (s->msg_callback) if ((ret >= 2) && s->msg_callback) s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data+2, ret-2, s, s->msg_callback_arg); /* CLIENT-HELLO */ { /* Client Hello has been sent; tell msg_callback */ if (ssl2_compat) s->msg_callback(1, version, 0, s->init_buf->data+2, ret-2, s, s->msg_callback_arg); else s->msg_callback(1, version, SSL3_RT_HANDSHAKE, s->init_buf->data+5, ret-5, s, s->msg_callback_arg); } return ret; return ret; } } Loading
ssl/s2_clnt.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -584,7 +584,7 @@ static int client_hello(SSL *s) s2n(SSL2_VERSION,p); /* version */ s2n(SSL2_VERSION,p); /* version */ n=j=0; n=j=0; n=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),d); n=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),d,0); d+=n; d+=n; if (n == 0) if (n == 0) Loading
ssl/s2_srvr.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -797,7 +797,7 @@ static int server_hello(SSL *s) /* lets send out the ciphers we like in the /* lets send out the ciphers we like in the * prefered order */ * prefered order */ sk= s->session->ciphers; sk= s->session->ciphers; n=ssl_cipher_list_to_bytes(s,s->session->ciphers,d); n=ssl_cipher_list_to_bytes(s,s->session->ciphers,d,0); d+=n; d+=n; s2n(n,p); /* add cipher length */ s2n(n,p); /* add cipher length */ } } Loading