summaryrefslogtreecommitdiffstats
path: root/third_party/tlslite/patches/parse_chain.patch
blob: 3a547332a3f9d2c52630669acf1bc180762a9ca1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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.