diff options
author | markus <> | 2009-11-10 09:09:40 +0000 |
---|---|---|
committer | markus <> | 2009-11-10 09:09:40 +0000 |
commit | fe6c9378da6c3c76e86e1fa03619eda8e4da9408 (patch) | |
tree | 1ee3d60cfc9aa5a4238a876f10fd267d699c4e14 | |
parent | 11d78159f32f020cba13d2025ccc5caa8b71aaae (diff) | |
download | openbsd-fe6c9378da6c3c76e86e1fa03619eda8e4da9408.tar.gz openbsd-fe6c9378da6c3c76e86e1fa03619eda8e4da9408.tar.bz2 openbsd-fe6c9378da6c3c76e86e1fa03619eda8e4da9408.zip |
pull Ben Lauries blind prefix injection fix for CVE-2009-3555 from
openssl 0.9.8l; crank minor version; ok djm@ deraadt@; initially from jsg@
-rw-r--r-- | src/lib/libssl/s3_lib.c | 3 | ||||
-rw-r--r-- | src/lib/libssl/s3_pkt.c | 4 | ||||
-rw-r--r-- | src/lib/libssl/s3_srvr.c | 8 | ||||
-rw-r--r-- | src/lib/libssl/shlib_version | 2 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/s3_lib.c | 3 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/s3_pkt.c | 4 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/s3_srvr.c | 8 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/ssl3.h | 9 | ||||
-rw-r--r-- | src/lib/libssl/ssl/shlib_version | 2 | ||||
-rw-r--r-- | src/lib/libssl/ssl3.h | 9 |
10 files changed, 40 insertions, 12 deletions
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index 8916a0b1b3..5aa7bb21da 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c | |||
@@ -2592,6 +2592,9 @@ int ssl3_renegotiate(SSL *s) | |||
2592 | if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) | 2592 | if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) |
2593 | return(0); | 2593 | return(0); |
2594 | 2594 | ||
2595 | if (!(s->s3->flags & SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) | ||
2596 | return(0); | ||
2597 | |||
2595 | s->s3->renegotiate=1; | 2598 | s->s3->renegotiate=1; |
2596 | return(1); | 2599 | return(1); |
2597 | } | 2600 | } |
diff --git a/src/lib/libssl/s3_pkt.c b/src/lib/libssl/s3_pkt.c index 9476dcddf6..b98b84044f 100644 --- a/src/lib/libssl/s3_pkt.c +++ b/src/lib/libssl/s3_pkt.c | |||
@@ -985,6 +985,7 @@ start: | |||
985 | 985 | ||
986 | if (SSL_is_init_finished(s) && | 986 | if (SSL_is_init_finished(s) && |
987 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) && | 987 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) && |
988 | (s->s3->flags & SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION) && | ||
988 | !s->s3->renegotiate) | 989 | !s->s3->renegotiate) |
989 | { | 990 | { |
990 | ssl3_renegotiate(s); | 991 | ssl3_renegotiate(s); |
@@ -1117,7 +1118,8 @@ start: | |||
1117 | if ((s->s3->handshake_fragment_len >= 4) && !s->in_handshake) | 1118 | if ((s->s3->handshake_fragment_len >= 4) && !s->in_handshake) |
1118 | { | 1119 | { |
1119 | if (((s->state&SSL_ST_MASK) == SSL_ST_OK) && | 1120 | if (((s->state&SSL_ST_MASK) == SSL_ST_OK) && |
1120 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)) | 1121 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) && |
1122 | (s->s3->flags & SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) | ||
1121 | { | 1123 | { |
1122 | #if 0 /* worked only because C operator preferences are not as expected (and | 1124 | #if 0 /* worked only because C operator preferences are not as expected (and |
1123 | * because this is not really needed for clients except for detecting | 1125 | * because this is not really needed for clients except for detecting |
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c index 80b45eb86f..79f3706c31 100644 --- a/src/lib/libssl/s3_srvr.c +++ b/src/lib/libssl/s3_srvr.c | |||
@@ -718,6 +718,14 @@ int ssl3_get_client_hello(SSL *s) | |||
718 | #endif | 718 | #endif |
719 | STACK_OF(SSL_CIPHER) *ciphers=NULL; | 719 | STACK_OF(SSL_CIPHER) *ciphers=NULL; |
720 | 720 | ||
721 | if (s->new_session | ||
722 | && !(s->s3->flags&SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) | ||
723 | { | ||
724 | al=SSL_AD_HANDSHAKE_FAILURE; | ||
725 | SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); | ||
726 | goto f_err; | ||
727 | } | ||
728 | |||
721 | /* We do this so that we will respond with our native type. | 729 | /* We do this so that we will respond with our native type. |
722 | * If we are TLSv1 and we get SSLv3, we will respond with TLSv1, | 730 | * If we are TLSv1 and we get SSLv3, we will respond with TLSv1, |
723 | * This down switching should be handled by a different method. | 731 | * This down switching should be handled by a different method. |
diff --git a/src/lib/libssl/shlib_version b/src/lib/libssl/shlib_version index 7791322042..b9229d3517 100644 --- a/src/lib/libssl/shlib_version +++ b/src/lib/libssl/shlib_version | |||
@@ -1,2 +1,2 @@ | |||
1 | major=15 | 1 | major=15 |
2 | minor=0 | 2 | minor=1 |
diff --git a/src/lib/libssl/src/ssl/s3_lib.c b/src/lib/libssl/src/ssl/s3_lib.c index 8916a0b1b3..5aa7bb21da 100644 --- a/src/lib/libssl/src/ssl/s3_lib.c +++ b/src/lib/libssl/src/ssl/s3_lib.c | |||
@@ -2592,6 +2592,9 @@ int ssl3_renegotiate(SSL *s) | |||
2592 | if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) | 2592 | if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) |
2593 | return(0); | 2593 | return(0); |
2594 | 2594 | ||
2595 | if (!(s->s3->flags & SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) | ||
2596 | return(0); | ||
2597 | |||
2595 | s->s3->renegotiate=1; | 2598 | s->s3->renegotiate=1; |
2596 | return(1); | 2599 | return(1); |
2597 | } | 2600 | } |
diff --git a/src/lib/libssl/src/ssl/s3_pkt.c b/src/lib/libssl/src/ssl/s3_pkt.c index 9476dcddf6..b98b84044f 100644 --- a/src/lib/libssl/src/ssl/s3_pkt.c +++ b/src/lib/libssl/src/ssl/s3_pkt.c | |||
@@ -985,6 +985,7 @@ start: | |||
985 | 985 | ||
986 | if (SSL_is_init_finished(s) && | 986 | if (SSL_is_init_finished(s) && |
987 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) && | 987 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) && |
988 | (s->s3->flags & SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION) && | ||
988 | !s->s3->renegotiate) | 989 | !s->s3->renegotiate) |
989 | { | 990 | { |
990 | ssl3_renegotiate(s); | 991 | ssl3_renegotiate(s); |
@@ -1117,7 +1118,8 @@ start: | |||
1117 | if ((s->s3->handshake_fragment_len >= 4) && !s->in_handshake) | 1118 | if ((s->s3->handshake_fragment_len >= 4) && !s->in_handshake) |
1118 | { | 1119 | { |
1119 | if (((s->state&SSL_ST_MASK) == SSL_ST_OK) && | 1120 | if (((s->state&SSL_ST_MASK) == SSL_ST_OK) && |
1120 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)) | 1121 | !(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) && |
1122 | (s->s3->flags & SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) | ||
1121 | { | 1123 | { |
1122 | #if 0 /* worked only because C operator preferences are not as expected (and | 1124 | #if 0 /* worked only because C operator preferences are not as expected (and |
1123 | * because this is not really needed for clients except for detecting | 1125 | * because this is not really needed for clients except for detecting |
diff --git a/src/lib/libssl/src/ssl/s3_srvr.c b/src/lib/libssl/src/ssl/s3_srvr.c index 80b45eb86f..79f3706c31 100644 --- a/src/lib/libssl/src/ssl/s3_srvr.c +++ b/src/lib/libssl/src/ssl/s3_srvr.c | |||
@@ -718,6 +718,14 @@ int ssl3_get_client_hello(SSL *s) | |||
718 | #endif | 718 | #endif |
719 | STACK_OF(SSL_CIPHER) *ciphers=NULL; | 719 | STACK_OF(SSL_CIPHER) *ciphers=NULL; |
720 | 720 | ||
721 | if (s->new_session | ||
722 | && !(s->s3->flags&SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) | ||
723 | { | ||
724 | al=SSL_AD_HANDSHAKE_FAILURE; | ||
725 | SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); | ||
726 | goto f_err; | ||
727 | } | ||
728 | |||
721 | /* We do this so that we will respond with our native type. | 729 | /* We do this so that we will respond with our native type. |
722 | * If we are TLSv1 and we get SSLv3, we will respond with TLSv1, | 730 | * If we are TLSv1 and we get SSLv3, we will respond with TLSv1, |
723 | * This down switching should be handled by a different method. | 731 | * This down switching should be handled by a different method. |
diff --git a/src/lib/libssl/src/ssl/ssl3.h b/src/lib/libssl/src/ssl/ssl3.h index 4b1e2e9834..a1a19cbfcb 100644 --- a/src/lib/libssl/src/ssl/ssl3.h +++ b/src/lib/libssl/src/ssl/ssl3.h | |||
@@ -326,10 +326,11 @@ typedef struct ssl3_buffer_st | |||
326 | #define SSL3_CT_NUMBER 7 | 326 | #define SSL3_CT_NUMBER 7 |
327 | 327 | ||
328 | 328 | ||
329 | #define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 | 329 | #define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 |
330 | #define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 | 330 | #define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 |
331 | #define SSL3_FLAGS_POP_BUFFER 0x0004 | 331 | #define SSL3_FLAGS_POP_BUFFER 0x0004 |
332 | #define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 | 332 | #define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 |
333 | #define SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x0010 | ||
333 | 334 | ||
334 | typedef struct ssl3_state_st | 335 | typedef struct ssl3_state_st |
335 | { | 336 | { |
diff --git a/src/lib/libssl/ssl/shlib_version b/src/lib/libssl/ssl/shlib_version index 7791322042..b9229d3517 100644 --- a/src/lib/libssl/ssl/shlib_version +++ b/src/lib/libssl/ssl/shlib_version | |||
@@ -1,2 +1,2 @@ | |||
1 | major=15 | 1 | major=15 |
2 | minor=0 | 2 | minor=1 |
diff --git a/src/lib/libssl/ssl3.h b/src/lib/libssl/ssl3.h index 4b1e2e9834..a1a19cbfcb 100644 --- a/src/lib/libssl/ssl3.h +++ b/src/lib/libssl/ssl3.h | |||
@@ -326,10 +326,11 @@ typedef struct ssl3_buffer_st | |||
326 | #define SSL3_CT_NUMBER 7 | 326 | #define SSL3_CT_NUMBER 7 |
327 | 327 | ||
328 | 328 | ||
329 | #define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 | 329 | #define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 |
330 | #define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 | 330 | #define SSL3_FLAGS_DELAY_CLIENT_FINISHED 0x0002 |
331 | #define SSL3_FLAGS_POP_BUFFER 0x0004 | 331 | #define SSL3_FLAGS_POP_BUFFER 0x0004 |
332 | #define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 | 332 | #define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 |
333 | #define SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x0010 | ||
333 | 334 | ||
334 | typedef struct ssl3_state_st | 335 | typedef struct ssl3_state_st |
335 | { | 336 | { |