in tls-table.py [0:0]
def get_hex_values():
# Grab the list from the IANA
print('Retrieving IANA cipher List', file=sys.stderr)
try:
r = requests.get(IANA_URL)
soup = bs(r.text, 'html.parser')\
.select('table[id="table-tls-parameters-4"]')[0]\
.find_all('tbody')[0]
# Store all the ciphers away
cipher_hex_values = OrderedDict()
for row in soup.find_all('tr'):
columns = [ x.string for x in row.find_all('td') ]
# For now, we can ignore any IANA entries with '-' or '*' in them
if '-' not in columns[0] and '*' not in columns[0] and columns[1] != 'Unassigned' and columns[1] != 'Reserved':
cipher_hex_values[ columns[0] ] = {
'GnuTLS': '',
'IANA': columns[1],
'NSS': '',
'OpenSSL': ''
}
except:
print('Unable to retrieve or parse IANA cipher list', file=sys.stderr)
# Grab the list from NSS (Mozilla)
print('Retrieving NSS cipher list', file=sys.stderr)
try:
r = requests.get(NSS_URL)
for line in r.text.split('\n'):
# A typical line would look like: #define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F
if '#define TLS' in line and '0x' in line:
cipher = line.split()[1]
hex = line.split()[2].upper()
code_point = '0x' + hex[2:4] + ',0x' + hex[4:6]
if code_point in cipher_hex_values:
cipher_hex_values[code_point]['NSS'] = cipher
# 0x00,0x60-66 Reserved to avoid conflicts with widely deployed implementations
elif not code_point.startswith('0x00,0x6'):
print(' Warning: code point {code_point} ({cipher}) not in IANA registry'.format(
code_point=code_point, cipher=cipher
), file=sys.stderr)
except:
print('Unable to retrieve or parse NSS cipher list', file=sys.stderr)
# Grab the list from OpenSSL
print('Retrieving OpenSSL cipher list', file=sys.stderr)
try:
# OpenSSL splits up their code points and their text names for them
openssl_hex_values = {}
openssl_txt_values = {}
r = requests.get(OPENSSL_URL)
for line in r.text.split('\n'):
if line.startswith('# define TLS1_CK'):
cipher = line.split()[2].split('TLS1_CK_')[-1]
hex = line.split()[3]
code_point = '0x' + hex[6:8] + ',0x' + hex[8:10]
# e.g., ECDHE_RSA_WITH_AES_128_GCM_SHA256 -> 0x0C,0x2F
openssl_hex_values[cipher] = code_point
elif line.startswith('# define TLS1_3_CK'):
cipher = line.split()[2].split('TLS1_3_CK_')[-1]
hex = line.split()[3]
code_point = '0x' + hex[6:8] + ',0x' + hex[8:10]
# e.g., TLS1_3_CK_AES_128_GCM_SHA256 -> 0x13,0x01
openssl_hex_values[cipher] = code_point
elif line.startswith('# define TLS1_TXT'):
cipher = line.split()[2].split('TLS1_TXT_')[-1]
text = line.split()[3][1:-1]
# e.g., ECDHE_RSA_WITH_AES_128_GCM_SHA256 -> ECDHE-RSA-AES128-GCM-SHA256
openssl_txt_values[cipher] = text
elif line.startswith('# define TLS1_RFC'):
cipher = line.split()[2].split('TLS1_RFC_')[-1]
text = line.split()[3][1:-1]
# e.g., TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 -> TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
openssl_txt_values[cipher] = text
elif line.startswith('# define TLS1_3_RFC'):
cipher = line.split()[2].split('TLS1_3_RFC_')[-1]
text = line.split()[3][1:-1]
# e.g., TLS1_3_RFC_AES_128_GCM_SHA256 -> TLS_AES_128_GCM_SHA256
openssl_txt_values[cipher] = text
for key, value in openssl_hex_values.items():
if value in cipher_hex_values:
cipher_hex_values[value]['OpenSSL'] = openssl_txt_values[key]
else:
print(' Warning: code point {code_point} ({cipher}) not in IANA registry'.format(
code_point=value, cipher=key
), file=sys.stderr)
except:
print('Unable to retrieve or parse OpenSSL cipher list', file=sys.stderr)
# Grab the list from GnuTLS
print('Retrieving GnuTLS cipher list', file=sys.stderr)
try:
r = requests.get(GNUTLS_URL)
# Some lines look like: #define GNUTLS_DH_ANON_3DES_EDE_CBC_SHA1 { 0x00, 0x1B }
# Other look like: #define GNUTLS_ECDHE_ECDSA_CAMELLIA_128_CBC_SHA256 { 0xC0,0x72 }
for line in r.text.split('\n'):
if line.startswith('#define GNUTLS_') and '{' in line:
cipher = line.split()[1][3:]
code_point = line.split('{')[-1].replace(' ', '').replace('}', '').upper().replace('X', 'x')
if code_point in cipher_hex_values:
cipher_hex_values[code_point]['GnuTLS'] = cipher
# 0x00,0x60-66 Reserved to avoid conflicts with widely deployed implementations
elif not code_point.startswith('0x00,0x6'):
print(' Warning: code point {code_point} ({cipher}) not in IANA registry'.format(
code_point=code_point, cipher=cipher
), file=sys.stderr)
except:
print('Unable to retrieve or parse GnuTLS cipher list', file=sys.stderr)
print('\n', file=sys.stderr)
return cipher_hex_values