diff options
author | Erlang/OTP <[email protected]> | 2017-11-22 15:56:10 +0100 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2017-11-22 15:56:10 +0100 |
commit | 73a18c9fb79d05fea62d3e0128698d559bcfe3d5 (patch) | |
tree | f2e23dbba03277a49347f9f7f44e567b8a3f37fe /lib/ssl/src/ssl_connection.erl | |
parent | 70213bdf6cfa2e61c7e9013c4c217a1857b9df2e (diff) | |
parent | 2c139dca10767353cc4836cb10157d05bea20a5c (diff) | |
download | otp-73a18c9fb79d05fea62d3e0128698d559bcfe3d5.tar.gz otp-73a18c9fb79d05fea62d3e0128698d559bcfe3d5.tar.bz2 otp-73a18c9fb79d05fea62d3e0128698d559bcfe3d5.zip |
Merge branch 'ingela/maint-18/ssl/Bleichenbacher/OTP-14748' into maint-18
* ingela/maint-18/ssl/Bleichenbacher/OTP-14748:
ssl: Prepare for release
ssl: Countermeasurements for Bleichenbacher attack
Diffstat (limited to 'lib/ssl/src/ssl_connection.erl')
-rw-r--r-- | lib/ssl/src/ssl_connection.erl | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/ssl/src/ssl_connection.erl b/lib/ssl/src/ssl_connection.erl index 0f0072ba34..4be59501e4 100644 --- a/lib/ssl/src/ssl_connection.erl +++ b/lib/ssl/src/ssl_connection.erl @@ -1157,8 +1157,25 @@ server_certify_and_key_exchange(State0, Connection) -> request_client_cert(State2, Connection). certify_client_key_exchange(#encrypted_premaster_secret{premaster_secret= EncPMS}, - #state{private_key = Key} = State, Connection) -> - PremasterSecret = ssl_handshake:premaster_secret(EncPMS, Key), + #state{private_key = Key, client_hello_version = {Major, Minor} = Version} = State, Connection) -> + + %% Countermeasure for Bleichenbacher attack always provide some kind of premaster secret + %% and fail handshake later.RFC 5246 section 7.4.7.1. + PremasterSecret = + try ssl_handshake:premaster_secret(EncPMS, Key) of + Secret when erlang:byte_size(Secret) == ?NUM_OF_PREMASTERSECRET_BYTES -> + case Secret of + <<?BYTE(Major), ?BYTE(Minor), _/binary>> -> %% Correct + Secret; + <<?BYTE(_), ?BYTE(_), Rest/binary>> -> %% Version mismatch + <<?BYTE(Major), ?BYTE(Minor), Rest/binary>> + end; + _ -> %% erlang:byte_size(Secret) =/= ?NUM_OF_PREMASTERSECRET_BYTES + make_premaster_secret(Version, rsa) + catch + #alert{description = ?DECRYPT_ERROR} -> + make_premaster_secret(Version, rsa) + end, calculate_master_secret(PremasterSecret, State, Connection, certify, cipher); certify_client_key_exchange(#client_diffie_hellman_public{dh_public = ClientPublicDhKey}, |