Index: third_party/tlslite/patches/tls-srp-rfc5054.patch |
diff --git a/third_party/tlslite/patches/tls-srp-rfc5054.patch b/third_party/tlslite/patches/tls-srp-rfc5054.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..760188c563994d9a5de518163388c3053af930c5 |
--- /dev/null |
+++ b/third_party/tlslite/patches/tls-srp-rfc5054.patch |
@@ -0,0 +1,193 @@ |
+Only in chromium: patches |
+diff --git tlslite-0.3.8/scripts/tls.py chromium/tlslite/scripts/tls.py |
+index fa2c663..e7a473d 100644 |
+--- tlslite-0.3.8/scripts/tls.py |
++++ chromium/tlslite/scripts/tls.py |
+@@ -91,7 +91,7 @@ def clientTest(address, dir): |
+ badFault = True |
+ connection.sock.close() |
+ |
+- print "Test 5 - good SRP: unknown_srp_username idiom" |
++ print "Test 5 - good SRP: unknown_psk_identity idiom" |
+ def srpCallback(): |
+ return ("test", "password") |
+ connection = connect() |
+@@ -465,7 +465,7 @@ def serverTest(address, dir): |
+ pass |
+ connection.sock.close() |
+ |
+- print "Test 5 - good SRP: unknown_srp_username idiom" |
++ print "Test 5 - good SRP: unknown_psk_identity idiom" |
+ connection = connect() |
+ connection.handshakeServer(verifierDB=verifierDB) |
+ connection.close() |
+@@ -893,7 +893,7 @@ try: |
+ raise |
+ sys.exit() |
+ except TLSRemoteAlert, a: |
+- if a.description == AlertDescription.unknown_srp_username: |
++ if a.description == AlertDescription.unknown_psk_identity: |
+ if cmd == "clientsrp": |
+ print "Unknown username" |
+ else: |
+@@ -1027,7 +1027,7 @@ try: |
+ connection.write(s) |
+ s = "" |
+ except TLSLocalAlert, a: |
+- if a.description == AlertDescription.unknown_srp_username: |
++ if a.description == AlertDescription.unknown_psk_identity: |
+ print "Unknown SRP username" |
+ elif a.description == AlertDescription.bad_record_mac: |
+ if cmd == "serversrp" or cmd == "serversrpcert": |
+diff --git tlslite-0.3.8/tlslite/TLSConnection.py chromium/tlslite//TLSConnection.py |
+index 7e38a23..1616c7c 100644 |
+--- tlslite-0.3.8/tlslite/TLSConnection.py |
++++ chromium/tlslite//TLSConnection.py |
+@@ -514,7 +514,7 @@ class TLSConnection(TLSRecordLayer): |
+ for result in self._sendMsg(clientHello): |
+ yield result |
+ |
+- #Get ServerHello (or missing_srp_username) |
++ #Get ServerHello (or unknown_psk_identity) |
+ for result in self._getMsg((ContentType.handshake, |
+ ContentType.alert), |
+ HandshakeType.server_hello): |
+@@ -529,20 +529,17 @@ class TLSConnection(TLSRecordLayer): |
+ elif isinstance(msg, Alert): |
+ alert = msg |
+ |
+- #If it's not a missing_srp_username, re-raise |
+- if alert.description != AlertDescription.missing_srp_username: |
++ #If it's not a unknown_psk_identity, re-raise |
++ if alert.description != AlertDescription.unknown_psk_identity: |
+ self._shutdown(False) |
+ raise TLSRemoteAlert(alert) |
+ |
+- #If we're not in SRP callback mode, we won't have offered SRP |
+- #without a username, so we shouldn't get this alert |
+- if not srpCallback: |
+- for result in self._sendError(\ |
+- AlertDescription.unexpected_message): |
+- yield result |
+- srpParams = srpCallback() |
+- #If the callback returns None, cancel the handshake |
+- if srpParams == None: |
++ #Our SRP credentials were wrong, so try getting new ones. |
++ if srpCallback: |
++ srpParams = srpCallback() |
++ |
++ #If we can't get different credentials, cancel the handshake |
++ if srpParams == None or not srpCallback: |
+ for result in self._sendError(AlertDescription.user_canceled): |
+ yield result |
+ |
+@@ -1259,7 +1256,7 @@ class TLSConnection(TLSRecordLayer): |
+ |
+ #Ask the client to re-send ClientHello with one |
+ for result in self._sendMsg(Alert().create(\ |
+- AlertDescription.missing_srp_username, |
++ AlertDescription.unknown_psk_identity, |
+ AlertLevel.warning)): |
+ yield result |
+ |
+@@ -1323,7 +1320,7 @@ class TLSConnection(TLSRecordLayer): |
+ entry = verifierDB[self.allegedSrpUsername] |
+ except KeyError: |
+ for result in self._sendError(\ |
+- AlertDescription.unknown_srp_username): |
++ AlertDescription.unknown_psk_identity): |
+ yield result |
+ (N, g, s, v) = entry |
+ |
+diff --git tlslite-0.3.8/tlslite/constants.py chromium/tlslite//constants.py |
+index 04302c0..7ed7634 100644 |
+--- tlslite-0.3.8/tlslite/constants.py |
++++ chromium/tlslite//constants.py |
+@@ -30,6 +30,9 @@ class ContentType: |
+ application_data = 23 |
+ all = (20,21,22,23) |
+ |
++class ClientHelloExtension: |
++ srp = 12 |
++ |
+ class AlertLevel: |
+ warning = 1 |
+ fatal = 2 |
+@@ -88,18 +91,19 @@ class AlertDescription: |
+ internal_error = 80 |
+ user_canceled = 90 |
+ no_renegotiation = 100 |
+- unknown_srp_username = 120 |
+- missing_srp_username = 121 |
+- untrusted_srp_parameters = 122 |
++ unknown_psk_identity = 115 |
++ untrusted_srp_parameters = 122 # TODO(sqs): probably outdated wrt RFC 5054 |
+ |
+ class CipherSuite: |
+- TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA = 0x0050 |
+- TLS_SRP_SHA_WITH_AES_128_CBC_SHA = 0x0053 |
+- TLS_SRP_SHA_WITH_AES_256_CBC_SHA = 0x0056 |
++ TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA = 0xC01A |
++ TLS_SRP_SHA_WITH_AES_128_CBC_SHA = 0xC01D |
++ TLS_SRP_SHA_WITH_AES_256_CBC_SHA = 0xC020 |
++ |
++ TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA = 0xC01B |
++ TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA = 0xC01E |
++ TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA = 0xC021 |
+ |
+- TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA = 0x0051 |
+- TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA = 0x0054 |
+- TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA = 0x0057 |
++ # TODO(sqs): No SRP DSS cipher suites |
+ |
+ TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0x000A |
+ TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F |
+@@ -202,8 +206,9 @@ class Fault: |
+ genericFaults = range(300,303) |
+ |
+ faultAlerts = {\ |
+- badUsername: (AlertDescription.unknown_srp_username, \ |
+- AlertDescription.bad_record_mac),\ |
++ badUsername: (AlertDescription.unknown_psk_identity, \ |
++ AlertDescription.bad_record_mac, \ |
++ AlertDescription.user_canceled),\ |
+ badPassword: (AlertDescription.bad_record_mac,),\ |
+ badA: (AlertDescription.illegal_parameter,),\ |
+ badIdentifier: (AlertDescription.handshake_failure,),\ |
+diff --git tlslite-0.3.8/tlslite/errors.py chromium/tlslite//errors.py |
+index c7f7ba8..c9a480e 100644 |
+--- tlslite-0.3.8/tlslite/errors.py |
++++ chromium/tlslite//errors.py |
+@@ -50,8 +50,8 @@ class TLSAlert(TLSError): |
+ AlertDescription.internal_error: "internal_error",\ |
+ AlertDescription.user_canceled: "user_canceled",\ |
+ AlertDescription.no_renegotiation: "no_renegotiation",\ |
+- AlertDescription.unknown_srp_username: "unknown_srp_username",\ |
+- AlertDescription.missing_srp_username: "missing_srp_username"} |
++ AlertDescription.unknown_psk_identity: "unknown_psk_identity", |
++ } |
+ |
+ class TLSLocalAlert(TLSAlert): |
+ """A TLS alert has been signalled by the local implementation. |
+diff --git tlslite-0.3.8/tlslite/messages.py chromium/tlslite//messages.py |
+index dc6ed32..1058ad0 100644 |
+--- tlslite-0.3.8/tlslite/messages.py |
++++ chromium/tlslite//messages.py |
+@@ -170,7 +170,7 @@ class ClientHello(HandshakeMsg): |
+ while soFar != totalExtLength: |
+ extType = p.get(2) |
+ extLength = p.get(2) |
+- if extType == 6: |
++ if extType == ClientHelloExtension.srp: |
+ self.srp_username = bytesToString(p.getVarBytes(1)) |
+ elif extType == 7: |
+ self.certificate_types = p.getVarList(1, 1) |
+@@ -204,7 +204,7 @@ class ClientHello(HandshakeMsg): |
+ w.add(len(self.certificate_types)+1, 2) |
+ w.addVarSeq(self.certificate_types, 1, 1) |
+ if self.srp_username: |
+- w.add(6, 2) |
++ w.add(ClientHelloExtension.srp, 2) |
+ w.add(len(self.srp_username)+1, 2) |
+ w.addVarSeq(stringToBytes(self.srp_username), 1, 1) |
+ |