diff options
| author | Andreas Schultz <[email protected]> | 2012-09-20 11:29:02 +0200 | 
|---|---|---|
| committer | Ingela Anderton Andin <[email protected]> | 2013-01-17 14:48:43 +0100 | 
| commit | e825090fd18face13a2d89f2676d810f96b2c69c (patch) | |
| tree | f20ad923aa759609aa59d649cc7a9a5dd0641b81 | |
| parent | 5456bca05c06426bb8d45de77159734a264620e1 (diff) | |
| download | otp-e825090fd18face13a2d89f2676d810f96b2c69c.tar.gz otp-e825090fd18face13a2d89f2676d810f96b2c69c.tar.bz2 otp-e825090fd18face13a2d89f2676d810f96b2c69c.zip | |
SSL: unify the different implementations signature check implementations
ssl_handshake and ssl_connection where doing essentially the same when
checking a public key signature. This unify both into a single function
| -rw-r--r-- | lib/ssl/src/ssl_connection.erl | 15 | ||||
| -rw-r--r-- | lib/ssl/src/ssl_handshake.erl | 56 | 
2 files changed, 28 insertions, 43 deletions
| diff --git a/lib/ssl/src/ssl_connection.erl b/lib/ssl/src/ssl_connection.erl index cde13069b5..9a2cc0c91e 100644 --- a/lib/ssl/src/ssl_connection.erl +++ b/lib/ssl/src/ssl_connection.erl @@ -1665,26 +1665,13 @@ handle_server_key(  						   ?UINT16(YLen),  						   ServerPublicDhKey/binary>>), -    case verify_dh_params(Version, Signed, Hash, HashAlgo, PubKeyInfo) of +    case ssl_handshake:verify_signature(Version, Hash, HashSign, Signature, PubKeyInfo) of  	true ->  	    dh_master_secret(P, G, ServerPublicDhKey, undefined, State);  	false ->  	    ?ALERT_REC(?FATAL, ?DECRYPT_ERROR)      end. -verify_dh_params({3, Minor}, Signed, Hashes, HashAlgo, {?rsaEncryption, PubKey, _PubKeyParams}) -  when Minor >= 3 -> -    public_key:verify({digest, Hashes}, HashAlgo, Signed, PubKey); -verify_dh_params(_Version, Signed, Hashes, _HashAlgo, {?rsaEncryption, PubKey, _PubKeyParams}) -> -    case public_key:decrypt_public(Signed, PubKey,  -				   [{rsa_pad, rsa_pkcs1_padding}]) of -	Hashes -> -	    true; -	_ -> -	    false -    end; -verify_dh_params(_Version, Signed, Hash, HashAlgo, {?'id-dsa', PublicKey, PublicKeyParams}) -> -    public_key:verify({digest, Hash}, HashAlgo, Signed, {PublicKey, PublicKeyParams}).  dh_master_secret(Prime, Base, PublicDhKey, undefined, State) ->      PMpint = mpint_binary(Prime), diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl index db21dac942..c0618d687d 100644 --- a/lib/ssl/src/ssl_handshake.erl +++ b/lib/ssl/src/ssl_handshake.erl @@ -32,7 +32,7 @@  -export([master_secret/4, client_hello/8, server_hello/5, hello/4,  	 hello_request/0, certify/7, certificate/4, -	 client_certificate_verify/6, certificate_verify/6, +	 client_certificate_verify/6, certificate_verify/6, verify_signature/5,  	 certificate_request/3, key_exchange/3, server_key_exchange_hash/2,  	 finished/5, verify_connection/6, get_tls_handshake/3,  	 decode_client_key/3, server_hello_done/0, @@ -320,25 +320,36 @@ client_certificate_verify(OwnCert, MasterSecret, Version,  %%  %% Description: Checks that the certificate_verify message is valid.  %%-------------------------------------------------------------------- -certificate_verify(Signature, {?'rsaEncryption', PublicKey, _}, Version, -		   {HashAlgo, _SignAlgo}, MasterSecret, {_, Handshake}) -> -    Hashes = calc_certificate_verify(Version, HashAlgo, MasterSecret, Handshake), -    case certificate_verify_rsa(Hashes, HashAlgo, Signature, PublicKey, Version) of +certificate_verify(Signature, PublicKeyInfo, Version, +		   HashSign = {HashAlgo, _}, MasterSecret, {_, Handshake}) -> +    Hash = calc_certificate_verify(Version, HashAlgo, MasterSecret, Handshake), +    case verify_signature(Version, Hash, HashSign, Signature, PublicKeyInfo) of  	true ->  	    valid;  	_ -> -	    ?ALERT_REC(?FATAL, ?BAD_CERTIFICATE) -    end; -certificate_verify(Signature, {?'id-dsa', PublicKey, PublicKeyParams}, Version, -		   {HashAlgo, _SignAlgo}, MasterSecret, {_, Handshake}) -> -    Hashes = calc_certificate_verify(Version, HashAlgo, MasterSecret, Handshake), -    case public_key:verify({digest, Hashes}, sha, Signature, {PublicKey, PublicKeyParams}) of -	true -> -	    valid; -	false ->      	    ?ALERT_REC(?FATAL, ?BAD_CERTIFICATE)      end. +%%-------------------------------------------------------------------- +-spec verify_signature(tls_version(), binary(), {term(), term()}, binary(), +				   public_key_info()) -> true | false. +%% +%% Description: Checks that a public_key signature is valid. +%%-------------------------------------------------------------------- +verify_signature(_Version, _Hash, {_HashAlgo, anon}, _Signature, _) -> +    true; +verify_signature({3, Minor}, Hash, {HashAlgo, rsa}, Signature, {?rsaEncryption, PubKey, _PubKeyParams}) +  when Minor >= 3 -> +    public_key:verify({digest, Hash}, HashAlgo, Signature, PubKey); +verify_signature(_Version, Hash, _HashAlgo, Signature, {?rsaEncryption, PubKey, _PubKeyParams}) -> +    case public_key:decrypt_public(Signature, PubKey, +				   [{rsa_pad, rsa_pkcs1_padding}]) of +	Hash -> true; +	_    -> false +    end; +verify_signature(_Version, Hash, {HashAlgo, dsa}, Signature, {?'id-dsa', PublicKey, PublicKeyParams}) -> +    public_key:verify({digest, Hash}, HashAlgo, Signature, {PublicKey, PublicKeyParams}). +  %%--------------------------------------------------------------------  -spec certificate_request(#connection_states{}, db_handle(), certdb_ref()) -> @@ -1328,8 +1339,8 @@ certificate_authorities_from_db(CertDbHandle, CertDbRef) ->  digitally_signed({3, Minor}, Hash, HashAlgo, Key) when Minor >= 3 ->      public_key:sign({digest, Hash}, HashAlgo, Key); -digitally_signed(_Version, Hash, _HashAlgo, #'DSAPrivateKey'{} = Key) -> -    public_key:sign({digest, Hash}, sha, Key); +digitally_signed(_Version, Hash, HashAlgo, #'DSAPrivateKey'{} = Key) -> +    public_key:sign({digest, Hash}, HashAlgo, Key);  digitally_signed(_Version, Hash, _HashAlgo, #'RSAPrivateKey'{} = Key) ->      public_key:encrypt_private(Hash, Key,  			       [{rsa_pad, rsa_pkcs1_padding}]). @@ -1378,19 +1389,6 @@ apply_user_fun(Fun, OtpCert, ExtensionOrError, UserState0, SslState) ->  	    {unknown, {SslState, UserState}}      end. -certificate_verify_rsa(Hashes, sha, Signature, PublicKey, {Major, Minor}) -  when Major == 3, Minor >= 3 -> -    public_key:verify({digest, Hashes}, sha, Signature, PublicKey); -certificate_verify_rsa(Hashes, HashAlgo, Signature, PublicKey, {Major, Minor}) -  when Major == 3, Minor >= 3 -> -    public_key:verify({digest, Hashes}, HashAlgo, Signature, PublicKey); -certificate_verify_rsa(Hashes, _HashAlgo, Signature, PublicKey, _Version) -> -    case public_key:decrypt_public(Signature, PublicKey, -				   [{rsa_pad, rsa_pkcs1_padding}]) of -	Hashes -> true; -	_      -> false -    end. -  -define(TLSEXT_SIGALG_RSA(MD), {MD, rsa}).  -define(TLSEXT_SIGALG_DSA(MD), {MD, dsa}). | 
