diff -aurb tlslite-0.3.8/tlslite/X509.py chromium/tlslite/X509.py --- tlslite-0.3.8/tlslite/X509.py Fri Mar 19 18:43:19 2004 +++ chromium/tlslite/X509.py Wed Feb 29 11:53:54 2012 @@ -91,6 +91,7 @@ #Create a public key instance self.publicKey = _createPublicRSAKey(n, e) + return self def getFingerprint(self): """Get the hex-encoded fingerprint of this certificate. diff -aurb tlslite-0.3.8/tlslite/X509CertChain.py chromium/tlslite/X509CertChain.py --- tlslite-0.3.8/tlslite/X509CertChain.py Fri Mar 19 18:49:58 2004 +++ chromium/tlslite/X509CertChain.py Wed Feb 29 11:53:42 2012 @@ -1,6 +1,7 @@ """Class representing an X.509 certificate chain.""" from utils import cryptomath +from X509 import X509 class X509CertChain: """This class represents a chain of X.509 certificates. @@ -23,6 +24,66 @@ self.x509List = x509List else: self.x509List = [] + + def parseChain(self, s): + """Parse a PEM-encoded X.509 certificate file chain file. + + @type s: str + @param s: A PEM-encoded (eg: Base64) X.509 certificate file, with every + certificate wrapped within "-----BEGIN CERTIFICATE-----" and + "-----END CERTIFICATE-----" tags). Extraneous data outside such tags, + such as human readable representations, will be ignored. + """ + + class PEMIterator(object): + """Simple iterator over PEM-encoded certificates within a string. + + @type data: string + @ivar data: A string containing PEM-encoded (Base64) certificates, + with every certificate wrapped within "-----BEGIN CERTIFICATE-----" + and "-----END CERTIFICATE-----" tags). Extraneous data outside such + tags, such as human readable representations, will be ignored. + + @type index: integer + @ivar index: The current offset within data to begin iterating from. + """ + + _CERTIFICATE_HEADER = "----BEGIN CERTIFICATE-----" + """The PEM encoding block header for X.509 certificates.""" + + _CERTIFICATE_FOOTER = "----END CERTIFICATE-----" + """The PEM encoding block footer for X.509 certificates.""" + + def __init__(self, s): + self.data = s + self.index = 0 + + def __iter__(self): + return self + + def next(self): + """Iterates and returns the next L{tlslite.X509.X509} + certificate in data. + + @rtype tlslite.X509.X509 + """ + + self.index = self.data.find(self._CERTIFICATE_HEADER, + self.index) + if self.index == -1: + raise StopIteration + end = self.data.find(self._CERTIFICATE_FOOTER, self.index) + if end == -1: + raise StopIteration + + certStr = self.data[self.index+len(self._CERTIFICATE_HEADER) : + end] + self.index = end + len(self._CERTIFICATE_FOOTER) + bytes = cryptomath.base64ToBytes(certStr) + return X509().parseBinary(bytes) + + self.x509List = list(PEMIterator(s)) + return self def getNumCerts(self): """Get the number of certificates in this chain.