Author: dmeyer
Date: Wed Mar  5 11:48:45 2008
New Revision: 3158

Log:
Better key management

Modified:
   trunk/base/src/net/tls.py

Modified: trunk/base/src/net/tls.py
==============================================================================
--- trunk/base/src/net/tls.py   (original)
+++ trunk/base/src/net/tls.py   Wed Mar  5 11:48:45 2008
@@ -31,8 +31,8 @@
 # python imports
 import logging
 
-# import some classes to the namespace of this module
-from tlslite.api import X509, X509CertChain, parsePEMKey, Session
+# import tlslite API to the namespace of this module
+from tlslite.api import *
 
 # import tlslite.api to overwrite TLSConnection
 import tlslite.api
@@ -71,7 +71,6 @@
         except StopIteration:
             pass
 
-    @kaa.coroutine()
     def handshakeClientCert(self, certChain=None, privateKey=None, 
session=None,
                             settings=None, checker=None):
         """
@@ -80,9 +79,8 @@
         handshake = tlslite.api.TLSConnection.handshakeClientCert(
             self, certChain=certChain, privateKey=privateKey, session=session,
             settings=settings, checker=checker, async=True)
-        yield self._iterate_handshake(handshake)
+        return self._iterate_handshake(handshake)
 
-    @kaa.coroutine()
     def handshakeServer(self, sharedKeyDB=None, verifierDB=None, 
certChain=None,
                         privateKey=None, reqCert=None, sessionCache=None,
                         settings=None, checker=None):
@@ -92,7 +90,7 @@
         handshake = tlslite.api.TLSConnection.handshakeServerAsync(
             self, sharedKeyDB, verifierDB, certChain, privateKey, reqCert,
             sessionCache, settings, checker)
-        yield self._iterate_handshake(handshake)
+        return self._iterate_handshake(handshake)
 
     def fileno(self):
         """
@@ -103,7 +101,7 @@
 
 
 
-class TlsSocket(kaa.Socket):
+class TLSSocket(kaa.Socket):
     """
     Special version of kaa.Socket with TLS support.
     """
@@ -117,12 +115,12 @@
         Accept a new connection and return a new Socket object.
         """
         sock, addr = self._socket.accept()
-        client_socket = TlsSocket()
+        client_socket = TLSSocket()
         client_socket.wrap(sock, addr)
         self.signals['new-client'].emit(client_socket)
 
     def _update_read_monitor(self, signal = None, change = None):
-        # This function is broken in TlsSocket for two reasons:
+        # This function is broken in TLSSocket for two reasons:
         # 1. auto-reconnect while doing a tls handshake is wrong
         # 2. Passing self._socket to register does not work,
         #    self._socket.fileno() is needed. Always using fileno()
@@ -134,7 +132,7 @@
         Wraps an existing low-level socket object.  addr specifies the address
         corresponding to the socket.
         """
-        super(TlsSocket, self).wrap(sock, addr)
+        super(TLSSocket, self).wrap(sock, addr)
         # since _update_read_monitor is deactivated we need to always register
         # the rmon to the notifier.
         if not self._rmon.active():
@@ -144,11 +142,11 @@
         if self._handshake:
             # do not send data while doing a handshake
             return self._write_buffer.append(data)
-        return super(TlsSocket, self).write(data)
+        return super(TLSSocket, self).write(data)
         
     def _handle_read(self):
         try:
-            return super(TlsSocket, self)._handle_read()
+            return super(TLSSocket, self)._handle_read()
         except TLSAbruptCloseError, e:
             log.error('TLSAbruptCloseError')
             self._read_signal.emit(None)
@@ -156,19 +154,22 @@
             return self.close(immediate=True, expected=False)
 
     @kaa.coroutine()
-    def starttls_client(self, session=None):
+    def starttls_client(self, session=None, key=None, **kwargs):
         """
         Start a certificate-based handshake in the role of a TLS client.
         Note: this function DOES NOT check the server key based on the
         key chain yet.
         """
         try:
+            if key:
+                kwargs['privateKey'] = key.key
+                kwargs['certChain'] = key.chain 
             self._handshake = True
             if session is None:
                 session = Session()
             c = TLSConnection(self._socket)
             self._rmon.unregister()
-            yield c.handshakeClientCert(session=session)
+            yield c.handshakeClientCert(session=session, **kwargs)
             self._socket = c
             self.signals['tls'].emit()
             self._rmon.register(self._socket.fileno(), kaa.IO_READ)
@@ -176,7 +177,7 @@
             self._handshake = False
 
     @kaa.coroutine()
-    def starttls_server(self, key, cert_chain, client_cert=None):
+    def starttls_server(self, key, **kwargs):
         """
         Start a certificate-based handshake in the role of a TLS server.
         Note: this function DOES NOT check the client key if requested.
@@ -185,25 +186,24 @@
             self._handshake = True
             c = TLSConnection(self._socket)
             self._rmon.unregister()
-            yield c.handshakeServer(
-                privateKey=key, certChain=cert_chain, reqCert=client_cert)
+            yield c.handshakeServer(privateKey=key.key, certChain=key.chain, 
**kwargs)
             self._socket = c
             self.signals['tls'].emit()
             self._rmon.register(self._socket.fileno(), kaa.IO_READ)
         finally:
             self._handshake = False
 
-def loadkey(filename, private=False):
-    """
-    Load a key in PEM format from file.
-    """
-    return parsePEMKey(open(filename).read(), private=private)
-
 
-def loadcert(filename):
+class TLSKey(object):
     """
-    Load a X509 certificate and create a chain.
+    Class to hold the public (and private) key together with the certification 
chain.
+    This class can be used with TLSSocket as key.
     """
-    x509 = X509()
-    x509.parse(open(filename).read())
-    return X509CertChain([x509])
+    def __init__(self, filename, private, *certs):
+        self.key = parsePEMKey(open(filename).read(), private=private)
+        chain = []
+        for cert in (filename, ) + certs:
+            x509 = X509()
+            x509.parse(open(cert).read())
+            chain.append(x509)
+        self.chain = X509CertChain(chain)

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to