blob: 6f215b36acb702a0025842ed6279709e8e21f469 [file] [log] [blame]
diff --git a/third_party/tlslite/tlslite/constants.py b/third_party/tlslite/tlslite/constants.py
index f9c8676..84bb703 100644
--- a/third_party/tlslite/tlslite/constants.py
+++ b/third_party/tlslite/tlslite/constants.py
@@ -59,6 +59,7 @@ class ExtensionType: # RFC 6066 / 4366
tack = 0xF300
supports_npn = 13172
channel_id = 30032
+ token_binding = 30033
class HashAlgorithm:
none = 0
diff --git a/third_party/tlslite/tlslite/handshakesettings.py b/third_party/tlslite/tlslite/handshakesettings.py
index a7b6ab9..8f25f62 100644
--- a/third_party/tlslite/tlslite/handshakesettings.py
+++ b/third_party/tlslite/tlslite/handshakesettings.py
@@ -115,6 +115,13 @@ class HandshakeSettings(object):
@type enableExtendedMasterSecret: bool
@ivar enableExtendedMasterSecret: If true, the server supports the extended
master secret TLS extension and will negotiated it with supporting clients.
+
+ @type supportedTokenBindingParams: list
+ @ivar supportedTokenBindingParams: A list of token binding parameters that
+ the server supports when negotiating token binding. List values are integers
+ corresponding to the TokenBindingKeyParameters enum in the Token Binding
+ Negotiation spec (draft-ietf-tokbind-negotiation-00). Values are in server's
+ preference order, with most preferred params first.
Note that TACK support is not standardized by IETF and uses a temporary
TLS Extension number, so should NOT be used in production software.
@@ -134,6 +141,7 @@ class HandshakeSettings(object):
self.useExperimentalTackExtension = False
self.alertAfterHandshake = False
self.enableExtendedMasterSecret = True
+ self.supportedTokenBindingParams = []
# Validates the min/max fields, and certificateTypes
# Filters out unsupported cipherNames and cipherImplementations
@@ -152,6 +160,7 @@ class HandshakeSettings(object):
other.tlsIntoleranceType = self.tlsIntoleranceType
other.alertAfterHandshake = self.alertAfterHandshake
other.enableExtendedMasterSecret = self.enableExtendedMasterSecret
+ other.supportedTokenBindingParams = self.supportedTokenBindingParams
if not cipherfactory.tripleDESPresent:
other.cipherNames = [e for e in self.cipherNames if e != "3des"]
diff --git a/third_party/tlslite/tlslite/messages.py b/third_party/tlslite/tlslite/messages.py
index 9b553ce..ab2be57 100644
--- a/third_party/tlslite/tlslite/messages.py
+++ b/third_party/tlslite/tlslite/messages.py
@@ -115,6 +115,7 @@ class ClientHello(HandshakeMsg):
self.server_name = bytearray(0)
self.channel_id = False
self.extended_master_secret = False
+ self.tb_client_params = []
self.support_signed_cert_timestamps = False
self.status_request = False
@@ -188,6 +189,15 @@ class ClientHello(HandshakeMsg):
self.channel_id = True
elif extType == ExtensionType.extended_master_secret:
self.extended_master_secret = True
+ elif extType == ExtensionType.token_binding:
+ tokenBindingBytes = p.getFixBytes(extLength)
+ p2 = Parser(tokenBindingBytes)
+ ver_minor = p2.get(1)
+ ver_major = p2.get(1)
+ if (ver_major, ver_minor) >= (0, 3):
+ p2.startLengthCheck(1)
+ while not p2.atLengthCheck():
+ self.tb_client_params.append(p2.get(1))
elif extType == ExtensionType.signed_cert_timestamps:
if extLength:
raise SyntaxError()
@@ -271,6 +281,7 @@ class ServerHello(HandshakeMsg):
self.next_protos = None
self.channel_id = False
self.extended_master_secret = False
+ self.tb_params = None
self.signed_cert_timestamps = None
self.status_request = False
@@ -365,6 +376,17 @@ class ServerHello(HandshakeMsg):
if self.extended_master_secret:
w2.add(ExtensionType.extended_master_secret, 2)
w2.add(0, 2)
+ if self.tb_params:
+ w2.add(ExtensionType.token_binding, 2)
+ # length of extension
+ w2.add(4, 2)
+ # version
+ w2.add(0, 1)
+ w2.add(4, 1)
+ # length of params (defined as variable length <1..2^8-1>, but in
+ # this context the server can only send a single value.
+ w2.add(1, 1)
+ w2.add(self.tb_params, 1)
if self.signed_cert_timestamps:
w2.add(ExtensionType.signed_cert_timestamps, 2)
w2.addVarSeq(bytearray(self.signed_cert_timestamps), 1, 2)
diff --git a/third_party/tlslite/tlslite/tlsconnection.py b/third_party/tlslite/tlslite/tlsconnection.py
index 04161513..06404fe 100644
--- a/third_party/tlslite/tlslite/tlsconnection.py
+++ b/third_party/tlslite/tlslite/tlsconnection.py
@@ -1330,6 +1330,10 @@ class TLSConnection(TLSRecordLayer):
serverHello.extended_master_secret = \
clientHello.extended_master_secret and \
settings.enableExtendedMasterSecret
+ for param in clientHello.tb_client_params:
+ if param in settings.supportedTokenBindingParams:
+ serverHello.tb_params = param
+ break
if clientHello.support_signed_cert_timestamps:
serverHello.signed_cert_timestamps = signedCertTimestamps
if clientHello.status_request: