mirror of
				https://github.com/drwetter/testssl.sh.git
				synced 2025-10-31 13:55:25 +01:00 
			
		
		
		
	Merge pull request #2620 from Odinmylord/fix_curves
fix curves findings in TLS1.2 and prior versions
This commit is contained in:
		
							
								
								
									
										65
									
								
								testssl.sh
									
									
									
									
									
								
							
							
						
						
									
										65
									
								
								testssl.sh
									
									
									
									
									
								
							| @@ -10926,6 +10926,40 @@ run_fs() { | |||||||
|                          [[ $i -eq $high ]] && break |                          [[ $i -eq $high ]] && break | ||||||
|                          supported_curve[i]=true |                          supported_curve[i]=true | ||||||
|                     done |                     done | ||||||
|  |                     # Versions of TLS prior to 1.3 close the connection if the client does not support the curve | ||||||
|  |                     # used in the certificate. The easiest solution is to move the curves to the end of the list. | ||||||
|  |                     # instead of removing them from the ClientHello. This is only needed if there is no RSA certificate. | ||||||
|  |                     if (! "$HAS_TLS13" || [[ "$proto" == "-no_tls1_3" ]]) && [[ ! "$ecdhe_cipher_list" == *RSA* ]]; then | ||||||
|  |                          while true; do | ||||||
|  |                               curves_to_test="" | ||||||
|  |                               for (( i=low; i < high; i++ )); do | ||||||
|  |                                    "${ossl_supported[i]}" && ! "${supported_curve[i]}" && curves_to_test+=":${curves_ossl[i]}" | ||||||
|  |                               done | ||||||
|  |                               [[ -z "$curves_to_test" ]] && break | ||||||
|  |                               for (( i=low; i < high; i++ )); do | ||||||
|  |                                    "${supported_curve[i]}" && curves_to_test+=":${curves_ossl[i]}" | ||||||
|  |                               done | ||||||
|  |                               $OPENSSL s_client $(s_client_options "$proto -cipher "\'${ecdhe_cipher_list:1}\'" -ciphersuites "\'${tls13_cipher_list:1}\'" -curves "${curves_to_test:1}" $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI") &>$TMPFILE </dev/null | ||||||
|  |                               sclient_connect_successful $? $TMPFILE || break | ||||||
|  |                               temp=$(awk -F': ' '/^Server Temp Key/ { print $2 }' "$TMPFILE") | ||||||
|  |                               curve_found="${temp%%,*}" | ||||||
|  |                               if [[ "$curve_found" == ECDH ]]; then | ||||||
|  |                                    curve_found="${temp#*, }" | ||||||
|  |                                    curve_found="${curve_found%%,*}" | ||||||
|  |                                    if "$HAS_TLS13" && [[ ! "$proto" == "-no_tls1_3" ]] && [[ "$curve_found" == brainpoolP[235][581][642]r1 ]]; then | ||||||
|  |                                         [[ "$(get_protocol "$TMPFILE")" == TLSv1.3 ]] && curve_found+="tls13" | ||||||
|  |                                    fi | ||||||
|  |                               fi | ||||||
|  |                               for (( i=low; i < high; i++ )); do | ||||||
|  |                                    if ! "${supported_curve[i]}"; then | ||||||
|  |                                         [[ "${curves_ossl_output[i]}" == "$curve_found" ]] && break | ||||||
|  |                                         [[ "${curves_ossl[i]}" == "$curve_found" ]] && break | ||||||
|  |                                    fi | ||||||
|  |                               done | ||||||
|  |                               [[ $i -eq $high ]] && break | ||||||
|  |                               supported_curve[i]=true | ||||||
|  |                          done | ||||||
|  |                     fi | ||||||
|                done |                done | ||||||
|           done |           done | ||||||
|      fi |      fi | ||||||
| @@ -10962,6 +10996,37 @@ run_fs() { | |||||||
|                     [[ $i -eq $nr_curves ]] && break |                     [[ $i -eq $nr_curves ]] && break | ||||||
|                     supported_curve[i]=true |                     supported_curve[i]=true | ||||||
|                done |                done | ||||||
|  |                # Versions of TLS prior to 1.3 close the connection if the client does not support the curve | ||||||
|  |                # used in the certificate. The easiest solution is to move the curves to the end of the list. | ||||||
|  |                # instead of removing them from the ClientHello. This is only needed if there is no RSA certificate. | ||||||
|  |                if ([[ "$proto" == 03 ]] && [[ ! "$ecdhe_cipher_list" == *RSA* ]]); then | ||||||
|  |                     while true; do | ||||||
|  |                          curves_to_test="" | ||||||
|  |                          for (( i=0; i < nr_curves; i++ )); do | ||||||
|  |                               ! "${supported_curve[i]}" && curves_to_test+=", ${curves_hex[i]}" | ||||||
|  |                          done | ||||||
|  |                          [[ -z "$curves_to_test" ]] && break | ||||||
|  |                          for (( i=0; i < nr_curves; i++ )); do | ||||||
|  |                               "${supported_curve[i]}" && curves_to_test+=", ${curves_hex[i]}" | ||||||
|  |                          done | ||||||
|  |                          len1=$(printf "%02x" "$((2*${#curves_to_test}/7))") | ||||||
|  |                          len2=$(printf "%02x" "$((2*${#curves_to_test}/7+2))") | ||||||
|  |                          tls_sockets "$proto" "${ecdhe_cipher_list_hex:2}, 00,ff" "ephemeralkey" "00, 0a, 00, $len2, 00, $len1, ${curves_to_test:2}" | ||||||
|  |                          sclient_success=$? | ||||||
|  |                          [[ $sclient_success -ne 0 ]] && [[ $sclient_success -ne 2 ]] && break | ||||||
|  |                          temp=$(awk -F': ' '/^Server Temp Key/ { print $2 }' "$TEMPDIR/$NODEIP.parse_tls_serverhello.txt") | ||||||
|  |                          curve_found="${temp%%,*}" | ||||||
|  |                          if [[ "$curve_found" == "ECDH" ]]; then | ||||||
|  |                               curve_found="${temp#*, }" | ||||||
|  |                               curve_found="${curve_found%%,*}" | ||||||
|  |                          fi | ||||||
|  |                          for (( i=0; i < nr_curves; i++ )); do | ||||||
|  |                               ! "${supported_curve[i]}" && [[ "${curves_ossl_output[i]}" == "$curve_found" ]] && break | ||||||
|  |                          done | ||||||
|  |                          [[ $i -eq $nr_curves ]] && break | ||||||
|  |                          supported_curve[i]=true | ||||||
|  |                     done | ||||||
|  |                fi | ||||||
|           done |           done | ||||||
|      fi |      fi | ||||||
|      if "$ecdhe_offered"; then |      if "$ecdhe_offered"; then | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 David Cooper
					David Cooper