@@ -321,6 +321,25 @@ def test_server_side(self):
321321 self .assertRaises (ValueError , ctx .wrap_socket , sock , True ,
322322 server_hostname = "some.hostname" )
323323
324+ def test_unknown_channel_binding (self ):
325+ # should raise ValueError for unknown type
326+ s = socket .socket (socket .AF_INET )
327+ ss = ssl .wrap_socket (s )
328+ with self .assertRaises (ValueError ):
329+ ss .get_channel_binding ("unknown-type" )
330+
331+ @unittest .skipUnless ("tls-unique" in ssl .CHANNEL_BINDING_TYPES ,
332+ "'tls-unique' channel binding not available" )
333+ def test_tls_unique_channel_binding (self ):
334+ # unconnected should return None for known type
335+ s = socket .socket (socket .AF_INET )
336+ ss = ssl .wrap_socket (s )
337+ self .assertIsNone (ss .get_channel_binding ("tls-unique" ))
338+ # the same for server-side
339+ s = socket .socket (socket .AF_INET )
340+ ss = ssl .wrap_socket (s , server_side = True , certfile = CERTFILE )
341+ self .assertIsNone (ss .get_channel_binding ("tls-unique" ))
342+
324343class ContextTests (unittest .TestCase ):
325344
326345 @skip_if_broken_ubuntu_ssl
@@ -826,6 +845,11 @@ def run(self):
826845 self .sslconn = None
827846 if support .verbose and self .server .connectionchatty :
828847 sys .stdout .write (" server: connection is now unencrypted...\n " )
848+ elif stripped == b'CB tls-unique' :
849+ if support .verbose and self .server .connectionchatty :
850+ sys .stdout .write (" server: read CB tls-unique from client, sending our CB data...\n " )
851+ data = self .sslconn .get_channel_binding ("tls-unique" )
852+ self .write (repr (data ).encode ("us-ascii" ) + b"\n " )
829853 else :
830854 if (support .verbose and
831855 self .server .connectionchatty ):
@@ -1625,6 +1649,73 @@ def serve():
16251649 t .join ()
16261650 server .close ()
16271651
1652+ @unittest .skipUnless ("tls-unique" in ssl .CHANNEL_BINDING_TYPES ,
1653+ "'tls-unique' channel binding not available" )
1654+ def test_tls_unique_channel_binding (self ):
1655+ """Test tls-unique channel binding."""
1656+ if support .verbose :
1657+ sys .stdout .write ("\n " )
1658+
1659+ server = ThreadedEchoServer (CERTFILE ,
1660+ certreqs = ssl .CERT_NONE ,
1661+ ssl_version = ssl .PROTOCOL_TLSv1 ,
1662+ cacerts = CERTFILE ,
1663+ chatty = True ,
1664+ connectionchatty = False )
1665+ flag = threading .Event ()
1666+ server .start (flag )
1667+ # wait for it to start
1668+ flag .wait ()
1669+ # try to connect
1670+ s = ssl .wrap_socket (socket .socket (),
1671+ server_side = False ,
1672+ certfile = CERTFILE ,
1673+ ca_certs = CERTFILE ,
1674+ cert_reqs = ssl .CERT_NONE ,
1675+ ssl_version = ssl .PROTOCOL_TLSv1 )
1676+ s .connect ((HOST , server .port ))
1677+ try :
1678+ # get the data
1679+ cb_data = s .get_channel_binding ("tls-unique" )
1680+ if support .verbose :
1681+ sys .stdout .write (" got channel binding data: {0!r}\n "
1682+ .format (cb_data ))
1683+
1684+ # check if it is sane
1685+ self .assertIsNotNone (cb_data )
1686+ self .assertEqual (len (cb_data ), 12 ) # True for TLSv1
1687+
1688+ # and compare with the peers version
1689+ s .write (b"CB tls-unique\n " )
1690+ peer_data_repr = s .read ().strip ()
1691+ self .assertEqual (peer_data_repr ,
1692+ repr (cb_data ).encode ("us-ascii" ))
1693+ s .close ()
1694+
1695+ # now, again
1696+ s = ssl .wrap_socket (socket .socket (),
1697+ server_side = False ,
1698+ certfile = CERTFILE ,
1699+ ca_certs = CERTFILE ,
1700+ cert_reqs = ssl .CERT_NONE ,
1701+ ssl_version = ssl .PROTOCOL_TLSv1 )
1702+ s .connect ((HOST , server .port ))
1703+ new_cb_data = s .get_channel_binding ("tls-unique" )
1704+ if support .verbose :
1705+ sys .stdout .write (" got another channel binding data: {0!r}\n "
1706+ .format (new_cb_data ))
1707+ # is it really unique
1708+ self .assertNotEqual (cb_data , new_cb_data )
1709+ self .assertIsNotNone (cb_data )
1710+ self .assertEqual (len (cb_data ), 12 ) # True for TLSv1
1711+ s .write (b"CB tls-unique\n " )
1712+ peer_data_repr = s .read ().strip ()
1713+ self .assertEqual (peer_data_repr ,
1714+ repr (new_cb_data ).encode ("us-ascii" ))
1715+ s .close ()
1716+ finally :
1717+ server .stop ()
1718+ server .join ()
16281719
16291720def test_main (verbose = False ):
16301721 if support .verbose :
0 commit comments