- add sources.
[platform/framework/web/crosswalk.git] / src / third_party / tlslite / patches / channel_id.patch
1 diff --git a/third_party/tlslite/tlslite/TLSConnection.py b/third_party/tlslite/tlslite/TLSConnection.py
2 index f8811a9..e882e2c 100644
3 --- a/third_party/tlslite/tlslite/TLSConnection.py
4 +++ b/third_party/tlslite/tlslite/TLSConnection.py
5 @@ -611,6 +611,8 @@ class TLSConnection(TLSRecordLayer):
6                                     settings.cipherImplementations)
7  
8              #Exchange ChangeCipherSpec and Finished messages
9 +            for result in self._getChangeCipherSpec():
10 +                yield result
11              for result in self._getFinished():
12                  yield result
13              for result in self._sendFinished():
14 @@ -920,6 +922,8 @@ class TLSConnection(TLSRecordLayer):
15              #Exchange ChangeCipherSpec and Finished messages
16              for result in self._sendFinished():
17                  yield result
18 +            for result in self._getChangeCipherSpec():
19 +                yield result
20              for result in self._getFinished():
21                  yield result
22  
23 @@ -1089,6 +1093,7 @@ class TLSConnection(TLSRecordLayer):
24          clientCertChain = None
25          serverCertChain = None #We may set certChain to this later
26          postFinishedError = None
27 +        doingChannelID = False
28  
29          #Tentatively set version to most-desirable version, so if an error
30          #occurs parsing the ClientHello, this is what we'll use for the
31 @@ -1208,6 +1213,8 @@ class TLSConnection(TLSRecordLayer):
32                  serverHello.create(self.version, serverRandom,
33                                     session.sessionID, session.cipherSuite,
34                                     certificateType)
35 +                serverHello.channel_id = clientHello.channel_id
36 +                doingChannelID = clientHello.channel_id
37                  for result in self._sendMsg(serverHello):
38                      yield result
39  
40 @@ -1221,6 +1228,11 @@ class TLSConnection(TLSRecordLayer):
41                  #Exchange ChangeCipherSpec and Finished messages
42                  for result in self._sendFinished():
43                      yield result
44 +                for result in self._getChangeCipherSpec():
45 +                    yield result
46 +                if doingChannelID:
47 +                    for result in self._getEncryptedExtensions():
48 +                        yield result
49                  for result in self._getFinished():
50                      yield result
51  
52 @@ -1399,8 +1411,12 @@ class TLSConnection(TLSRecordLayer):
53              #Send ServerHello, Certificate[, CertificateRequest],
54              #ServerHelloDone
55              msgs = []
56 -            msgs.append(ServerHello().create(self.version, serverRandom,
57 -                        sessionID, cipherSuite, certificateType))
58 +            serverHello = ServerHello().create(
59 +                    self.version, serverRandom,
60 +                    sessionID, cipherSuite, certificateType)
61 +            serverHello.channel_id = clientHello.channel_id
62 +            doingChannelID = clientHello.channel_id
63 +            msgs.append(serverHello)
64              msgs.append(Certificate(certificateType).create(serverCertChain))
65              if reqCert and reqCAs:
66                  msgs.append(CertificateRequest().create([], reqCAs))
67 @@ -1528,6 +1544,11 @@ class TLSConnection(TLSRecordLayer):
68                                 settings.cipherImplementations)
69  
70          #Exchange ChangeCipherSpec and Finished messages
71 +        for result in self._getChangeCipherSpec():
72 +            yield result
73 +        if doingChannelID:
74 +            for result in self._getEncryptedExtensions():
75 +                yield result
76          for result in self._getFinished():
77              yield result
78  
79 diff --git a/third_party/tlslite/tlslite/TLSRecordLayer.py b/third_party/tlslite/tlslite/TLSRecordLayer.py
80 index 1bbd09d..933b95a 100644
81 --- a/third_party/tlslite/tlslite/TLSRecordLayer.py
82 +++ b/third_party/tlslite/tlslite/TLSRecordLayer.py
83 @@ -714,6 +714,8 @@ class TLSRecordLayer:
84                                              self.version).parse(p)
85                  elif subType == HandshakeType.finished:
86                      yield Finished(self.version).parse(p)
87 +                elif subType == HandshakeType.encrypted_extensions:
88 +                    yield EncryptedExtensions().parse(p)
89                  else:
90                      raise AssertionError()
91  
92 @@ -1067,7 +1069,7 @@ class TLSRecordLayer:
93          for result in self._sendMsg(finished):
94              yield result
95  
96 -    def _getFinished(self):
97 +    def _getChangeCipherSpec(self):
98          #Get and check ChangeCipherSpec
99          for result in self._getMsg(ContentType.change_cipher_spec):
100              if result in (0,1):
101 @@ -1082,6 +1084,15 @@ class TLSRecordLayer:
102          #Switch to pending read state
103          self._changeReadState()
104  
105 +    def _getEncryptedExtensions(self):
106 +        for result in self._getMsg(ContentType.handshake,
107 +                                   HandshakeType.encrypted_extensions):
108 +            if result in (0,1):
109 +                yield result
110 +        encrypted_extensions = result
111 +        self.channel_id = encrypted_extensions.channel_id_key
112 +
113 +    def _getFinished(self):
114          #Calculate verification data
115          verifyData = self._calcFinished(False)
116  
117 diff --git a/third_party/tlslite/tlslite/constants.py b/third_party/tlslite/tlslite/constants.py
118 index 04302c0..e357dd0 100644
119 --- a/third_party/tlslite/tlslite/constants.py
120 +++ b/third_party/tlslite/tlslite/constants.py
121 @@ -22,6 +22,7 @@ class HandshakeType:
122      certificate_verify = 15
123      client_key_exchange = 16
124      finished = 20
125 +    encrypted_extensions = 203
126  
127  class ContentType:
128      change_cipher_spec = 20
129 @@ -30,6 +31,9 @@ class ContentType:
130      application_data = 23
131      all = (20,21,22,23)
132  
133 +class ExtensionType:
134 +    channel_id = 30031
135 +
136  class AlertLevel:
137      warning = 1
138      fatal = 2
139 diff --git a/third_party/tlslite/tlslite/messages.py b/third_party/tlslite/tlslite/messages.py
140 index dc6ed32..fa4d817 100644
141 --- a/third_party/tlslite/tlslite/messages.py
142 +++ b/third_party/tlslite/tlslite/messages.py
143 @@ -130,6 +130,7 @@ class ClientHello(HandshakeMsg):
144          self.certificate_types = [CertificateType.x509]
145          self.compression_methods = []   # a list of 8-bit values
146          self.srp_username = None        # a string
147 +        self.channel_id = False
148  
149      def create(self, version, random, session_id, cipher_suites,
150                 certificate_types=None, srp_username=None):
151 @@ -174,6 +175,8 @@ class ClientHello(HandshakeMsg):
152                          self.srp_username = bytesToString(p.getVarBytes(1))
153                      elif extType == 7:
154                          self.certificate_types = p.getVarList(1, 1)
155 +                    elif extType == ExtensionType.channel_id:
156 +                        self.channel_id = True
157                      else:
158                          p.getFixBytes(extLength)
159                      soFar += 4 + extLength
160 @@ -220,6 +223,7 @@ class ServerHello(HandshakeMsg):
161          self.cipher_suite = 0
162          self.certificate_type = CertificateType.x509
163          self.compression_method = 0
164 +        self.channel_id = False
165  
166      def create(self, version, random, session_id, cipher_suite,
167                 certificate_type):
168 @@ -266,6 +270,9 @@ class ServerHello(HandshakeMsg):
169                  CertificateType.x509:
170              extLength += 5
171  
172 +        if self.channel_id:
173 +            extLength += 4
174 +
175          if extLength != 0:
176              w.add(extLength, 2)
177  
178 @@ -275,6 +282,10 @@ class ServerHello(HandshakeMsg):
179              w.add(1, 2)
180              w.add(self.certificate_type, 1)
181  
182 +        if self.channel_id:
183 +            w.add(ExtensionType.channel_id, 2)
184 +            w.add(0, 2)
185 +
186          return HandshakeMsg.postWrite(self, w, trial)
187  
188  class Certificate(HandshakeMsg):
189 @@ -567,6 +578,28 @@ class Finished(HandshakeMsg):
190          w.addFixSeq(self.verify_data, 1)
191          return HandshakeMsg.postWrite(self, w, trial)
192  
193 +class EncryptedExtensions(HandshakeMsg):
194 +    def __init__(self):
195 +        self.channel_id_key = None
196 +        self.channel_id_proof = None
197 +
198 +    def parse(self, p):
199 +        p.startLengthCheck(3)
200 +        soFar = 0
201 +        while soFar != p.lengthCheck:
202 +            extType = p.get(2)
203 +            extLength = p.get(2)
204 +            if extType == ExtensionType.channel_id:
205 +                if extLength != 32*4:
206 +                    raise SyntaxError()
207 +                self.channel_id_key = p.getFixBytes(64)
208 +                self.channel_id_proof = p.getFixBytes(64)
209 +            else:
210 +                p.getFixBytes(extLength)
211 +            soFar += 4 + extLength
212 +        p.stopLengthCheck()
213 +        return self
214 +
215  class ApplicationData(Msg):
216      def __init__(self):
217          self.contentType = ContentType.application_data